| %% |
| %% Licensed to the Apache Software Foundation (ASF) under one |
| %% or more contributor license agreements. See the NOTICE file |
| %% distributed with this work for additional information |
| %% regarding copyright ownership. The ASF licenses this file |
| %% to you under the Apache License, Version 2.0 (the |
| %% "License"); you may not use this file except in compliance |
| %% with the License. You may obtain a copy of the License at |
| %% |
| %% http://www.apache.org/licenses/LICENSE-2.0 |
| %% |
| %% Unless required by applicable law or agreed to in writing, |
| %% software distributed under the License is distributed on an |
| %% "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| %% KIND, either express or implied. See the License for the |
| %% specific language governing permissions and limitations |
| %% under the License. |
| %% |
| |
| -module(test_thrift_socket_transport). |
| -include_lib("eunit/include/eunit.hrl"). |
| |
| |
| new(Socket) -> thrift_socket_transport:new(Socket). |
| new(Socket, Opts) -> thrift_socket_transport:new(Socket, Opts). |
| |
| new_test_() -> |
| [ |
| {"new socket", ?_assertMatch( |
| {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, 60000, []}}}, |
| new(a_fake_socket) |
| )}, |
| {"new socket with no options", ?_assertMatch( |
| {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, 60000, []}}}, |
| new(a_fake_socket, []) |
| )}, |
| {"new socket with integer timeout", ?_assertMatch( |
| {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, 5000, []}}}, |
| new(a_fake_socket, [{recv_timeout, 5000}]) |
| )}, |
| {"new socket with infinity timeout", ?_assertMatch( |
| {ok, {_, thrift_socket_transport, {t_socket, a_fake_socket, infinity, []}}}, |
| new(a_fake_socket, [{recv_timeout, infinity}]) |
| )} |
| ]. |
| |
| |
| read(Socket, Bytes) -> thrift_socket_transport:read(Socket, Bytes). |
| |
| read_test_() -> |
| {setup, |
| fun() -> |
| meck:new(gen_tcp, [unstick, passthrough]), |
| meck:expect(gen_tcp, recv, fun(Bin, 0, _) -> {ok, Bin} end) |
| end, |
| fun(_) -> meck:unload(gen_tcp) end, |
| [ |
| {"read zero bytes from empty socket", ?_assertMatch( |
| {_, {ok, <<>>}}, |
| read({t_socket, <<>>, 60000, []}, 0) |
| )}, |
| {"read 1 byte from empty socket", ?_assertMatch( |
| {_, {ok, <<>>}}, |
| read({t_socket, <<>>, 60000, []}, 1) |
| )}, |
| {"read zero bytes from nonempty socket", ?_assertMatch( |
| {{t_socket, _, _, _}, {ok, <<>>}}, |
| read({t_socket, <<"hallo world">>, 60000, []}, 0) |
| )}, |
| {"read 1 byte from nonempty socket", ?_assertMatch( |
| {{t_socket, _, _, <<"allo world">>}, {ok, <<"h">>}}, |
| read({t_socket, <<"hallo world">>, 60000, []}, 1) |
| )}, |
| {"read a zillion bytes from nonempty socket", ?_assertMatch( |
| {{t_socket, _, _, <<>>}, {ok, <<"hallo world">>}}, |
| read({t_socket, <<"hallo world">>, 60000, []}, 65536) |
| )}, |
| {"read 1 byte from previously buffered socket", ?_assertMatch( |
| {{t_socket, _, _, <<"allo">>}, {ok, <<"h">>}}, |
| read({t_socket, <<" world">>, 60000, <<"hallo">>}, 1) |
| )}, |
| {"read 6 byte from previously buffered socket", ?_assertMatch( |
| {{t_socket, _, _, <<"world">>}, {ok, <<"hallo ">>}}, |
| read({t_socket, <<" world">>, 60000, <<"hallo">>}, 6) |
| )}, |
| {"read a zillion bytes from previously buffered socket", ?_assertMatch( |
| {{t_socket, _, _, <<>>}, {ok, <<"hallo world">>}}, |
| read({t_socket, <<" world">>, 60000, <<"hallo">>}, 65536) |
| )} |
| ] |
| }. |
| |
| |
| read_exact(Socket, Bytes) -> thrift_socket_transport:read_exact(Socket, Bytes). |
| |
| read_exact_test_() -> |
| {setup, |
| fun() -> |
| meck:new(gen_tcp, [unstick, passthrough]), |
| meck:expect(gen_tcp, recv, fun(Bin, N, _) -> |
| case N of |
| 0 -> {ok, Bin}; |
| 1 -> {ok, <<"h">>}; |
| N when N > 2 -> {error, timeout} |
| end |
| end), |
| meck:expect(gen_tcp, close, fun(_) -> ok end) |
| end, |
| fun(_) -> meck:unload(gen_tcp) end, |
| [ |
| {"read_exact zero bytes from empty socket", ?_assertMatch( |
| {_, {ok, <<>>}}, |
| read_exact({t_socket, <<>>, 60000, []}, 0) |
| )}, |
| {"read_exact zero bytes from nonempty socket", ?_assertMatch( |
| {{t_socket, _, _, _}, {ok, <<>>}}, |
| read_exact({t_socket, <<"hallo world">>, 60000, []}, 0) |
| )}, |
| {"read_exact 1 byte from nonempty socket", ?_assertMatch( |
| {{t_socket, _, _, []}, {ok, <<"h">>}}, |
| read_exact({t_socket, <<"hallo world">>, 60000, []}, 1) |
| )}, |
| {"read_exact a zillion bytes from nonempty socket", ?_assertMatch( |
| {{t_socket, _, _, []}, {error, timeout}}, |
| read_exact({t_socket, <<"hallo world">>, 60000, []}, 65536) |
| )}, |
| {"read_exact 1 byte from previously buffered socket", ?_assertMatch( |
| {{t_socket, _, _, <<"allo">>}, {ok, <<"h">>}}, |
| read_exact({t_socket, <<" world">>, 60000, <<"hallo">>}, 1) |
| )}, |
| {"read_exact 6 byte from previously buffered socket", ?_assertMatch( |
| {{t_socket, _, _, []}, {ok, <<"more h">>}}, |
| read_exact({t_socket, <<"hallo">>, 60000, <<"more ">>}, 6) |
| )}, |
| {"read_exact a zillion bytes from previously buffered socket", ?_assertMatch( |
| {{t_socket, _, _, <<"hallo">>}, {error, timeout}}, |
| read_exact({t_socket, <<" world">>, 60000, <<"hallo">>}, 65536) |
| )} |
| ] |
| }. |
| |
| |
| write(Socket, Data) -> thrift_socket_transport:write(Socket, Data). |
| |
| write_test_() -> |
| {setup, |
| fun() -> |
| meck:new(gen_tcp, [unstick, passthrough]), |
| meck:expect(gen_tcp, send, fun(_, _) -> ok end) |
| end, |
| fun(_) -> meck:unload(gen_tcp) end, |
| [ |
| {"write empty list to socket", ?_assertMatch( |
| {{t_socket, a_fake_socket, 60000, []}, ok}, |
| write({t_socket, a_fake_socket, 60000, []}, []) |
| )}, |
| {"write empty binary to socket", ?_assertMatch( |
| {{t_socket, a_fake_socket, 60000, []}, ok}, |
| write({t_socket, a_fake_socket, 60000, []}, <<>>) |
| )}, |
| {"write a list to socket", ?_assertMatch( |
| {{t_socket, a_fake_socket, 60000, []}, ok}, |
| write({t_socket, a_fake_socket, 60000, []}, "hallo world") |
| )}, |
| {"write a binary to socket", ?_assertMatch( |
| {{t_socket, a_fake_socket, 60000, []}, ok}, |
| write({t_socket, a_fake_socket, 60000, []}, <<"hallo world">>) |
| )} |
| ] |
| }. |
| |
| |
| flush(Transport) -> thrift_socket_transport:flush(Transport). |
| |
| flush_test_() -> |
| [ |
| {"flush socket", ?_assertMatch( |
| {{t_socket, a_fake_socket, 60000, []}, ok}, |
| flush({t_socket, a_fake_socket, 60000, []}) |
| )} |
| ]. |
| |
| |
| close(Transport) -> thrift_socket_transport:close(Transport). |
| |
| close_test_() -> |
| {setup, |
| fun() -> |
| meck:new(gen_tcp, [unstick, passthrough]), |
| meck:expect(gen_tcp, close, fun(_) -> ok end) |
| end, |
| fun(_) -> meck:unload(gen_tcp) end, |
| [ |
| {"close membuffer", ?_assertMatch( |
| {{t_socket, a_fake_socket, 60000, []}, ok}, |
| close({t_socket, a_fake_socket, 60000, []}) |
| )} |
| ] |
| }. |