123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- -module(mock_tcp).
- -export([send/2, recv/2, recv/3]).
- -export([create/1, close/1]).
- -spec create([{recv, binary()} | {send, binary()}]) -> pid().
- create(ExpectedEvents) ->
- spawn_link(fun () -> loop(ExpectedEvents) end).
- recv(Pid, NumBytes) ->
- Pid ! {recv, NumBytes, self()},
- receive
- {ok, Data} -> {ok, Data};
- error -> error({unexpected_recv, NumBytes})
- after 100 ->
- error(noreply)
- end.
- recv(Pid, NumBytes, _Timeout) ->
- recv(Pid, NumBytes).
- send(Pid, Data) ->
- Pid ! {send, iolist_to_binary(Data), self()},
- receive
- ok -> ok;
- error -> error({unexpected_send, Data})
- after 100 ->
- error(noreply)
- end.
- close(Pid) ->
- Pid ! {done, self()},
- receive
- ok -> ok;
- {remains, Remains} -> error({unexpected_close, Remains})
- after 100 ->
- error(noreply)
- end.
- loop(AllEvents = [{Func, Data} | Events]) ->
- receive
- {recv, NumBytes, FromPid} when Func == recv, NumBytes == size(Data) ->
- FromPid ! {ok, Data},
- loop(Events);
- {recv, NumBytes, FromPid} when Func == recv, NumBytes < size(Data) ->
- <<Data1:NumBytes/binary, Rest/binary>> = Data,
- FromPid ! {ok, Data1},
- loop([{recv, Rest} | Events]);
- {send, Bytes, FromPid} when Func == send, Bytes == Data ->
- FromPid ! ok,
- loop(Events);
- {send, Bytes, FromPid} when Func == send, size(Bytes) < size(Data) ->
- Size = size(Bytes),
- case Data of
- <<Bytes:Size/binary, Rest/binary>> ->
- FromPid ! ok,
- loop([{send, Rest} | Events]);
- _ ->
- FromPid ! error
- end;
- {_, _, FromPid} ->
- FromPid ! error;
- {done, FromPid} ->
- FromPid ! {remains, AllEvents}
- end;
- loop([]) ->
- receive
- {done, FromPid} -> FromPid ! ok;
- {_, _, FromPid} -> FromPid ! error
- end.
- -ifdef(TEST).
- -include_lib("eunit/include/eunit.hrl").
- bad_recv_test() ->
- Pid = create([{recv, <<"foobar">>}]),
- ?assertError(_, recv(Pid, 10)).
- success_test() ->
- Pid = create([{recv, <<"foobar">>}, {send, <<"baz">>}]),
-
- ?assertEqual({ok, <<"foo">>}, recv(Pid, 3)),
- ?assertEqual({ok, <<"bar">>}, recv(Pid, 3)),
- ?assertEqual(ok, send(Pid, <<"baz">>)),
- ?assertEqual(ok, close(Pid)),
-
- ?assertError(noreply, recv(Pid, 3)).
- -endif.
|