diff options
author | Lukas Larsson <[email protected]> | 2011-11-27 17:22:05 +0100 |
---|---|---|
committer | Lukas Larsson <[email protected]> | 2011-12-02 10:39:34 +0100 |
commit | 836410f5c9e092be4b77b26b3fc9f7abde0c89de (patch) | |
tree | 5f7a42db276f5bffebf1c7baedbea3ade3d73a82 /lib/kernel/test/gen_tcp_api_SUITE.erl | |
parent | a5b3d81936ab85edb8713f29baf85307ae0b25b8 (diff) | |
download | otp-836410f5c9e092be4b77b26b3fc9f7abde0c89de.tar.gz otp-836410f5c9e092be4b77b26b3fc9f7abde0c89de.tar.bz2 otp-836410f5c9e092be4b77b26b3fc9f7abde0c89de.zip |
Move sendfile api to file module
Since sendfile could in theory be used to send to any type
of file descriptor in *nix, it is a better fit to have it
in file.
Diffstat (limited to 'lib/kernel/test/gen_tcp_api_SUITE.erl')
-rw-r--r-- | lib/kernel/test/gen_tcp_api_SUITE.erl | 286 |
1 files changed, 5 insertions, 281 deletions
diff --git a/lib/kernel/test/gen_tcp_api_SUITE.erl b/lib/kernel/test/gen_tcp_api_SUITE.erl index d66caad2d8..a7af00c12a 100644 --- a/lib/kernel/test/gen_tcp_api_SUITE.erl +++ b/lib/kernel/test/gen_tcp_api_SUITE.erl @@ -24,7 +24,6 @@ -include_lib("common_test/include/ct.hrl"). -include_lib("kernel/include/inet.hrl"). --include_lib("kernel/include/file.hrl"). -export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1, init_per_group/2,end_per_group/2, @@ -33,42 +32,21 @@ t_connect_bad/1, t_recv_timeout/1, t_recv_eof/1, t_shutdown_write/1, t_shutdown_both/1, t_shutdown_error/1, - t_fdopen/1, t_implicit_inet6/1, - t_sendfile_small/1, t_sendfile_big/1, - t_sendfile_hdtl/1, t_sendfile_partial/1, - t_sendfile_offset/1, t_sendfile_sendafter/1, - t_sendfile_recvafter/1, t_sendfile_sendduring/1, - t_sendfile_recvduring/1]). - --export([sendfile_server/2]). + t_fdopen/1, t_implicit_inet6/1]). suite() -> [{ct_hooks,[ts_install_cth]}]. all() -> [{group, t_accept}, {group, t_connect}, {group, t_recv}, t_shutdown_write, t_shutdown_both, t_shutdown_error, - t_fdopen, t_implicit_inet6,{group,t_sendfile}]. + t_fdopen, t_implicit_inet6]. groups() -> [{t_accept, [], [t_accept_timeout]}, {t_connect, [], [t_connect_timeout, t_connect_bad]}, - {t_recv, [], [t_recv_timeout, t_recv_eof]}, - {t_sendfile, [], [{group, sendfile_all()}]}]. - -sendfile_all() -> - [ - t_sendfile_small - ,t_sendfile_big -% ,t_sendfile_hdtl - ,t_sendfile_partial - ,t_sendfile_offset - ,t_sendfile_sendafter - ,t_sendfile_recvafter - ,t_sendfile_sendduring - ,t_sendfile_recvduring - ]. -% [t_sendfile_big]. -% [t_sendfile_small]. + {t_recv, [], [t_recv_timeout, t_recv_eof]}]. + + init_per_suite(Config) -> Config. @@ -76,31 +54,12 @@ init_per_suite(Config) -> end_per_suite(_Config) -> ok. -init_per_group(t_sendfile, Config) -> - Priv = ?config(priv_dir, Config), - SFilename = filename:join(Priv, "sendfile_small.html"), - {ok, DS} = file:open(SFilename,[write,raw]), - file:write(DS,"yo baby yo"), - file:sync(DS), - file:close(DS), - BFilename = filename:join(Priv, "sendfile_big.html"), - {ok, DB} = file:open(BFilename,[write,raw]), - [file:write(DB,[<<0:(10*8*1024*1024)>>]) || _I <- lists:seq(1,51)], - file:sync(DB), - file:close(DB), - [{small_file, SFilename}, - {file_opts,[raw,binary]}, - {big_file, BFilename}|Config]; init_per_group(_GroupName, Config) -> Config. -end_per_group(t_sendfile, Config) -> - file:delete(proplists:get_value(big_file, Config)); end_per_group(_,_Config) -> ok. - - init_per_testcase(_Func, Config) -> Dog = test_server:timetrap(test_server:seconds(60)), [{watchdog, Dog}|Config]. @@ -278,241 +237,6 @@ implicit_inet6(S, Addr) -> ?line ok = gen_tcp:close(S2), ?line ok = gen_tcp:close(S1). -t_sendfile_small(Config) when is_list(Config) -> - Filename = proplists:get_value(small_file, Config), - - Send = fun(Sock) -> - {Size, Data} = sendfile_file_info(Filename), - {ok, Size} = gen_tcp:sendfile(Filename, Sock), - Data - end, - - ok = sendfile_send(Send). - -t_sendfile_big(Config) when is_list(Config) -> - Filename = proplists:get_value(big_file, Config), - - Send = fun(Sock) -> - {ok, #file_info{size = Size}} = - file:read_file_info(Filename), - {ok, Size} = gen_tcp:sendfile(Filename, Sock), - Size - end, - - ok = sendfile_send("localhost", Send, 0). - -t_sendfile_partial(Config) -> - Filename = proplists:get_value(small_file, Config), - FileOpts = proplists:get_value(file_opts, Config, []), - - SendSingle = fun(Sock) -> - {_Size, <<Data:5/binary,_/binary>>} = - sendfile_file_info(Filename), - {ok,D} = file:open(Filename,[read|FileOpts]), - {ok,5} = gen_tcp:sendfile(D,Sock,0,5,[]), - file:close(D), - Data - end, - ok = sendfile_send(SendSingle), - - {_Size, <<FData:5/binary,SData:3/binary,_/binary>>} = - sendfile_file_info(Filename), - {ok,D} = file:open(Filename,[read|FileOpts]), - {ok, <<FData/binary>>} = file:read(D,5), - FSend = fun(Sock) -> - {ok,5} = gen_tcp:sendfile(D,Sock,0,5,[]), - FData - end, - - ok = sendfile_send(FSend), - - SSend = fun(Sock) -> - {ok,3} = gen_tcp:sendfile(D,Sock,5,3,[]), - SData - end, - - ok = sendfile_send(SSend), - - {ok, <<SData/binary>>} = file:read(D,3), - - file:close(D). - -t_sendfile_offset(Config) -> - Filename = proplists:get_value(small_file, Config), - FileOpts = proplists:get_value(file_opts, Config, []), - - Send = fun(Sock) -> - {_Size, <<_:5/binary,Data:3/binary,_/binary>> = AllData} = - sendfile_file_info(Filename), - {ok,D} = file:open(Filename,[read|FileOpts]), - {ok,3} = gen_tcp:sendfile(D,Sock,5,3,[]), - {ok, AllData} = file:read(D,100), - file:close(D), - Data - end, - ok = sendfile_send(Send). - - -t_sendfile_hdtl(Config) -> - Filename = proplists:get_value(small_file, Config), - FileOpts = proplists:get_value(file_opts, Config, []), - - Send = fun(Sock, Headers, Trailers, HdtlSize) -> - {Size, Data} = sendfile_file_info(Filename), - {ok,D} = file:open(Filename,[read|FileOpts]), - AllSize = Size+HdtlSize, - {ok, AllSize} = gen_tcp:sendfile( - D, Sock,0,0, - [{headers,Headers}, - {trailers,Trailers}]), - file:close(D), - Data - end, - - SendHdTl = fun(Sock) -> - Headers = [<<"header1">>,<<0:(1024*8)>>,"header2"], - Trailers = [<<"trailer1">>,"trailer2"], - D = Send(Sock,Headers,Trailers, - iolist_size([Headers,Trailers])), - iolist_to_binary([Headers,D,Trailers]) - end, - ok = sendfile_send(SendHdTl), - - SendHd = fun(Sock) -> - Headers = [<<"header1">>,"header2"], - D = Send(Sock,Headers,undefined, - iolist_size([Headers])), - iolist_to_binary([Headers,D]) - end, - ok = sendfile_send(SendHd), - - SendTl = fun(Sock) -> - Trailers = [<<"trailer1">>,"trailer2"], - D = Send(Sock,undefined,Trailers, - iolist_size([Trailers])), - iolist_to_binary([D,Trailers]) - end, - ok = sendfile_send(SendTl). - -t_sendfile_sendafter(Config) -> - Filename = proplists:get_value(small_file, Config), - - Send = fun(Sock) -> - {Size, Data} = sendfile_file_info(Filename), - {ok, Size} = gen_tcp:sendfile(Filename, Sock), - ok = gen_tcp:send(Sock, <<2>>), - <<Data/binary,2>> - end, - - ok = sendfile_send(Send). - -t_sendfile_recvafter(Config) -> - Filename = proplists:get_value(small_file, Config), - - Send = fun(Sock) -> - {Size, Data} = sendfile_file_info(Filename), - {ok, Size} = gen_tcp:sendfile(Filename, Sock), - ok = gen_tcp:send(Sock, <<1>>), - {ok,<<1>>} = gen_tcp:recv(Sock, 1), - <<Data/binary,1>> - end, - - ok = sendfile_send(Send). - -t_sendfile_sendduring(Config) -> - Filename = proplists:get_value(big_file, Config), - - Send = fun(Sock) -> - {ok, #file_info{size = Size}} = - file:read_file_info(Filename), - spawn_link(fun() -> - timer:sleep(10), - ok = gen_tcp:send(Sock, <<2>>) - end), - {ok, Size} = gen_tcp:sendfile(Filename, Sock), - Size+1 - end, - - ok = sendfile_send("localhost", Send, 0). - -t_sendfile_recvduring(Config) -> - Filename = proplists:get_value(big_file, Config), - - Send = fun(Sock) -> - {ok, #file_info{size = Size}} = - file:read_file_info(Filename), - spawn_link(fun() -> - timer:sleep(10), - ok = gen_tcp:send(Sock, <<1>>), - {ok,<<1>>} = gen_tcp:recv(Sock, 1) - end), - {ok, Size} = gen_tcp:sendfile(Filename, Sock), - timer:sleep(1000), - Size+1 - end, - - ok = sendfile_send("localhost", Send, 0). - -%% TODO: consolidate tests and reduce code -sendfile_send(Send) -> - sendfile_send("localhost",Send). -sendfile_send(Host, Send) -> - sendfile_send(Host, Send, []). -sendfile_send(Host, Send, Orig) -> - spawn_link(?MODULE, sendfile_server, [self(), Orig]), - receive - {server, Port} -> - {ok, Sock} = gen_tcp:connect(Host, Port, - [binary,{packet,0}, - {active,false}]), - Data = Send(Sock), - ok = gen_tcp:close(Sock), - receive - {ok, Bin} -> - Data = Bin, - ok - end - end. - -sendfile_server(ClientPid, Orig) -> - {ok, LSock} = gen_tcp:listen(0, [binary, {packet, 0}, - {active, true}, - {reuseaddr, true}]), - {ok, Port} = inet:port(LSock), - ClientPid ! {server, Port}, - {ok, Sock} = gen_tcp:accept(LSock), - {ok, Bin} = sendfile_do_recv(Sock, Orig), - ClientPid ! {ok, Bin}, - gen_tcp:send(Sock, <<1>>). - --define(SENDFILE_TIMEOUT, 10000). -%% f(),{ok, S} = gen_tcp:connect("localhost",7890,[binary]),gen_tcp:sendfile("/ldisk/lukas/otp/sendfiletest.dat",S). -sendfile_do_recv(Sock, Bs) -> - receive - {tcp, Sock, B} -> - case binary:match(B,<<1>>) of - nomatch when is_list(Bs) -> - sendfile_do_recv(Sock, [B|Bs]); - nomatch when is_integer(Bs) -> - sendfile_do_recv(Sock, byte_size(B) + Bs); - _ when is_list(Bs) -> - {ok, iolist_to_binary(lists:reverse([B|Bs]))}; - _ when is_integer(Bs) -> - {ok, byte_size(B) + Bs} - end; - {tcp_closed, Sock} when is_list(Bs) -> - {ok, iolist_to_binary(lists:reverse(Bs))}; - {tcp_closed, Sock} when is_integer(Bs) -> - {ok, Bs} - after ?SENDFILE_TIMEOUT -> - timeout - end. - -sendfile_file_info(File) -> - {ok, #file_info{size = Size}} = file:read_file_info(File), - {ok, Data} = file:read_file(File), - {Size, Data}. - %%% Utilities |