1
0
mirror of https://github.com/ubf/ubf.git synced 2026-04-21 20:25:57 +00:00
Files
ubf/src/Unit-EUnit-Files/stateless_plugin_test.erl
Joseph Wayne Norton 9fa55df4eb fix http links
2009-09-18 23:26:43 +09:00

433 lines
16 KiB
Erlang

-module(stateless_plugin_test).
-compile(export_all).
-include("eunit.hrl").
-include("ubf.hrl").
do_eunit() ->
case eunit:test({timeout,120,?MODULE}) of
ok -> ok;
_ -> erlang:halt(1)
end.
-define(APPLICATION, stateless_plugin).
%%%----------------------------------------------------------------------
%%% TESTS
%%%----------------------------------------------------------------------
all_tests_test_() ->
all_tests_(fun () -> test_setup(?APPLICATION) end,
fun (X) -> test_teardown(X) end
).
%%%----------------------------------------------------------------------
%%% API
%%%----------------------------------------------------------------------
all_tests_(Setup,Teardown) ->
{setup,
Setup,
Teardown,
(all_actual_tests_("localhost",3000,ubf,true))(not_used)
++ (all_actual_tests_("localhost",3001,ebf,true))(not_used)
++ (all_actual_tests_("localhost",3002,jsf,true))(not_used)
++ (all_actual_tests_(none,none,etf,true))(not_used)
}.
all_actual_tests_(Host,Port,Proto,Stateless) ->
fun (_) ->
[?_test(test_001(Host,Port,Proto))
, ?_test(test_002(Host,Port,Proto))
, ?_test(test_003(Host,Port,Proto,Stateless))
, ?_test(test_004(Host,Port,Proto,Stateless))
, ?_test(test_005(Host,Port,Proto,Stateless))
, ?_test(test_006(Host,Port,Proto,Stateless))
, ?_test(test_007(Host,Port,Proto,Stateless))
, ?_test(test_008(Host,Port,Proto,Stateless))
, ?_test(test_009(Host,Port,Proto,Stateless))
, ?_test(test_010(Host,Port,Proto,Stateless))
, ?_test(test_011(Host,Port,Proto,Stateless))
, ?_test(test_012(Host,Port,Proto,Stateless))
, ?_test(test_013(Host,Port,Proto,Stateless))
, ?_test(test_015(Host,Port,Proto,Stateless))
, ?_test(test_016(Host,Port,Proto,Stateless))
, ?_test(test_017(Host,Port,Proto,Stateless))
]
end.
%%%----------------------------------------------------------------------
%%% Internal
%%%----------------------------------------------------------------------
test_setup(App) ->
%% user_default:dbgoff(),
%% user_default:dbgon(?MODULE),
%% user_default:dbgadd(contract_manager),
%% user_default:dbgadd(ubf_client),
%% user_default:dbgadd(ubf_driver),
%% user_default:dbgadd(ubf_plugin_handler),
%% user_default:dbgadd(ubf_plugin_metaserverful),
%% user_default:dbgadd(ubf_plugin_metaserverless),
%% user_default:dbgadd(ubf_server),
%% user_default:dbgadd(proc_socket_server),
application:start(sasl),
application:stop(App),
ok = application:start(App),
App.
test_teardown(App) ->
application:stop(App),
ok.
%% connect -> close
test_001(_Host,_Port,etf) ->
ok;
test_001(Host,Port,Proto) ->
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Sock} = gen_tcp:connect(Host,Port,[]),
assert_process(Proto, 1, 1, 1, 0, 0),
ok = gen_tcp:close(Sock),
assert_process(Proto, 0, 0, 0, 0, 0).
%% connect -> shutdown(X) -> close
test_002(_Host,_Port,etf) ->
ok;
test_002(Host,Port,Proto) ->
test_002(Host,Port,Proto,read),
test_002(Host,Port,Proto,write),
test_002(Host,Port,Proto,read_write).
test_002(Host,Port,Proto,How) ->
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Sock} = gen_tcp:connect(Host,Port,[]),
assert_process(Proto, 1, 1, 1, 0, 0),
ok = gen_tcp:shutdown(Sock, How),
assert_process(Proto, 0, 0, 0, 0, 0),
ok = gen_tcp:close(Sock),
assert_process(Proto, 0, 0, 0, 0, 0).
%% connect -> close
test_003(Host,Port,Proto,Stateless) ->
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Pid1,?S("test_meta_server")} = test_connect(Host,Port,Proto,Stateless),
assert_process(Proto, 1, 1, 1, 1, 1),
ubf_client:stop(Pid1),
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Pid2,?S("test_meta_server")} = test_connect(Host,Port,Proto,Stateless),
ubf_client:stop(Pid1),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,{ok,ok},none} = ubf_client:rpc(Pid2,{startSession,?S("test"),[]}),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid2,keepalive),
ubf_client:stop(Pid2),
assert_process(Proto, 0, 0, 0, 0, 0).
%% connect -> client breaks -> close
test_004(Host,Port,Proto,Stateless) ->
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Pid,?S("test_meta_server")} = test_connect(Host,Port,Proto,Stateless),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,{ok,ok},none} = ubf_client:rpc(Pid,{startSession,?S("test"),[]}),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid,keepalive),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,{clientBrokeContract,client_breaks_req01_with_this_request,[]},none}
= ubf_client:rpc(Pid,client_breaks_req01_with_this_request),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid,keepalive),
assert_process(Proto, 1, 1, 1, 1, 1),
ubf_client:stop(Pid),
assert_process(Proto, 0, 0, 0, 0, 0).
%% connect -> client timeout -> close
test_005(Host,Port,Proto,Stateless) ->
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Pid,?S("test_meta_server")} = test_connect(Host,Port,Proto,Stateless),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,{ok,ok},none} = ubf_client:rpc(Pid,{startSession,?S("test"),[]}),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid,keepalive),
assert_process(Proto, 1, 1, 1, 1, 1),
timeout = ubf_client:rpc(Pid,{client_timeout_req03,1000},500),
assert_process(Proto, 0, 0, 0, 0, 0),
ubf_client:stop(Pid),
assert_process(Proto, 0, 0, 0, 0, 0).
%% connect -> server breaks -> close
test_006(Host,Port,Proto,Stateless) ->
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Pid,?S("test_meta_server")} = test_connect(Host,Port,Proto,Stateless),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,{ok,ok},none} = ubf_client:rpc(Pid,{startSession,?S("test"),[]}),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid,keepalive),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,{serverBrokeContract,{server_breaks_req01,server_breaks_res01_with_this_response},_},none}
= ubf_client:rpc(Pid,server_breaks_req01),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid,keepalive),
assert_process(Proto, 1, 1, 1, 1, 1),
ubf_client:stop(Pid),
assert_process(Proto, 0, 0, 0, 0, 0).
%% connect -> server timeout -> close
test_007(Host,Port,Proto,Stateless) ->
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Pid,?S("test_meta_server")} = test_connect(Host,Port,Proto,Stateless),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,{ok,ok},none} = ubf_client:rpc(Pid,{startSession,?S("test"),[]}),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid,keepalive),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,server_timeout_res03,none} = ubf_client:rpc(Pid,{server_timeout_req03,500}),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid,keepalive),
assert_process(Proto, 1, 1, 1, 1, 1),
ubf_client:stop(Pid),
assert_process(Proto, 0, 0, 0, 0, 0).
%% connect -> server crash -> close
test_008(Host,Port,Proto,Stateless) ->
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Pid,?S("test_meta_server")} = test_connect(Host,Port,Proto,Stateless),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,{ok,ok},none} = ubf_client:rpc(Pid,{startSession,?S("test"),[]}),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid,keepalive),
assert_process(Proto, 1, 1, 1, 1, 1),
{error,stop} = ubf_client:rpc(Pid,server_crash_req05,50000),
assert_process(Proto, 0, 0, 0, 0, 0),
ubf_client:stop(Pid),
assert_process(Proto, 0, 0, 0, 0, 0).
%% connect -> client driver is exit(kill) -> close
test_009(_Host,_Port,etf,_Stateless) ->
ok;
test_009(Host,Port,Proto,Stateless) ->
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Pid,?S("test_meta_server")} = test_connect(Host,Port,Proto,Stateless),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,{ok,ok},none} = ubf_client:rpc(Pid,{startSession,?S("test"),[]}),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid,keepalive),
assert_process(Proto, 1, 1, 1, 1, 1),
spawn(fun() -> timer:sleep(500), exit_process(Proto,client_driver,kill) end),
{error,killed} = ubf_client:rpc(Pid,{server_timeout_req03,5000}),
assert_process(Proto, 0, 0, 0, 0, 0),
case catch {reply,ok,none} = ubf_client:rpc(Pid,keepalive) of
{'EXIT', _} ->
ok
end,
assert_process(Proto, 0, 0, 0, 0, 0),
ubf_client:stop(Pid),
assert_process(Proto, 0, 0, 0, 0, 0).
%% connect -> client driver is exit(socket_closed) -> close
test_010(_Host,_Port,etf,_Stateless) ->
ok;
test_010(Host,Port,Proto,Stateless) ->
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Pid,?S("test_meta_server")} = test_connect(Host,Port,Proto,Stateless),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,{ok,ok},none} = ubf_client:rpc(Pid,{startSession,?S("test"),[]}),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid,keepalive),
assert_process(Proto, 1, 1, 1, 1, 1),
spawn(fun() -> timer:sleep(500), exit_process(Proto,client_driver,socket_closed) end),
{error,socket_closed} = ubf_client:rpc(Pid,{server_timeout_req03,5000}),
assert_process(Proto, 0, 0, 0, 0, 0),
case catch {reply,ok,none} = ubf_client:rpc(Pid,keepalive) of
{'EXIT', _} ->
ok
end,
assert_process(Proto, 0, 0, 0, 0, 0),
ubf_client:stop(Pid),
assert_process(Proto, 0, 0, 0, 0, 0).
%% connect -> client driver socket is shutdown(read) -> close
test_011(_Host,_Port,etf,_Stateless) ->
ok;
test_011(Host,Port,Proto,Stateless) ->
test_shutdown_socket(Host,Port,Proto,Stateless,client_driver,read).
%% connect -> client driver socket is shutdown(write) -> close
test_012(_Host,_Port,etf,_Stateless) ->
ok;
test_012(Host,Port,Proto,Stateless) ->
test_shutdown_socket(Host,Port,Proto,Stateless,client_driver,write).
%% connect -> client driver socket is shutdown(read_write) -> close
test_013(_Host,_Port,etf,_Stateless) ->
ok;
test_013(Host,Port,Proto,Stateless) ->
test_shutdown_socket(Host,Port,Proto,Stateless,client_driver,read_write).
%% connect -> client driver socket is closed() -> close
%% @note: disable because behavior is unexpected
test_014(_Host,_Port,etf,_Stateless) ->
ok;
test_014(Host,Port,Proto,Stateless) ->
test_shutdown_socket(Host,Port,Proto,Stateless,client_driver,close).
%% connect -> server driver socket is shutdown(read) -> close
test_015(_Host,_Port,etf,_Stateless) ->
ok;
test_015(Host,Port,Proto,Stateless) ->
test_shutdown_socket(Host,Port,Proto,Stateless,driver,read).
%% connect -> server driver socket is shutdown(write) -> close
test_016(_Host,_Port,etf,_Stateless) ->
ok;
test_016(Host,Port,Proto,Stateless) ->
test_shutdown_socket(Host,Port,Proto,Stateless,driver,write).
%% connect -> server driver socket is shutdown(read_write) -> close
test_017(_Host,_Port,etf,_Stateless) ->
ok;
test_017(Host,Port,Proto,Stateless) ->
test_shutdown_socket(Host,Port,Proto,Stateless,driver,read_write).
%% connect -> server driver socket is closed() -> close
%% @note: disable because behavior is unexpected
test_018(_Host,_Port,etf,_Stateless) ->
ok;
test_018(Host,Port,Proto,Stateless) ->
test_shutdown_socket(Host,Port,Proto,Stateless,driver,close).
%%%----------------------------------------------------------------------
%%% Helpers
%%%----------------------------------------------------------------------
test_connect(_Host,_Port,etf,Stateless) ->
Plugins = if Stateless -> [stateless_plugin]; true -> [stateful_plugin] end,
Server = test_ubf,
Options = [{serverhello, "test_meta_server"},{proto,etf},{statelessrpc,Stateless}],
ubf_client:connect(Plugins,Server,Options,infinity);
test_connect(Host,Port,Proto,Stateless) ->
Options = [{proto,Proto},{statelessrpc,Stateless}],
ubf_client:connect(Host,Port,Options,infinity).
%% connect -> driver socket is shutdown or closed -> close
test_shutdown_socket(Host,Port,Proto,Stateless,Who,Reason) ->
assert_process(Proto, 0, 0, 0, 0, 0),
{ok,Pid,?S("test_meta_server")} = test_connect(Host,Port,Proto,Stateless),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,{ok,ok},none} = ubf_client:rpc(Pid,{startSession,?S("test"),[]}),
assert_process(Proto, 1, 1, 1, 1, 1),
{reply,ok,none} = ubf_client:rpc(Pid,keepalive),
assert_process(Proto, 1, 1, 1, 1, 1),
spawn_link(fun() -> timer:sleep(500), shutdown_socket(Proto,Who,Reason) end),
{error,stop} = ubf_client:rpc(Pid,{server_timeout_req03,5000}),
assert_process(Proto, 0, 0, 0, 0, 0),
case catch {reply,ok,none} = ubf_client:rpc(Pid,keepalive) of
{'EXIT', _} ->
ok
end,
assert_process(Proto, 0, 0, 0, 0, 0),
ubf_client:stop(Pid),
assert_process(Proto, 0, 0, 0, 0, 0).
assert_process(ubf, Driver, Contract, Plugin, Client, ClientDriver) ->
assert_process(ubf_driver, Driver),
assert_process(contract_manager, Contract),
assert_process(ubf_plugin_handler, Plugin),
assert_process(ubf_client, Client),
assert_process(ubf_client_driver, ClientDriver);
assert_process(ebf, Driver, Contract, Plugin, Client, ClientDriver) ->
assert_process(ebf_driver, Driver),
assert_process(contract_manager, Contract),
assert_process(ubf_plugin_handler, Plugin),
assert_process(ubf_client, Client),
assert_process(ebf_client_driver, ClientDriver);
assert_process(jsf, Driver, Contract, Plugin, Client, ClientDriver) ->
assert_process(jsf_driver, Driver),
assert_process(contract_manager, Contract),
assert_process(ubf_plugin_handler, Plugin),
assert_process(ubf_client, Client),
assert_process(jsf_client_driver, ClientDriver);
assert_process(etf, _, Contract, Plugin, Client, _) ->
assert_process(contract_manager, Contract),
assert_process(ubf_plugin_handler, Plugin),
assert_process(ubf_client, Client).
assert_process(M, CheckNum) ->
erlang:yield(),
timer:sleep(50),
erlang:yield(),
ActualNum = check_process(M),
%%?debugVal({CheckNum,ActualNum,M}),
?assert(CheckNum =:= ActualNum).
check_process(M) ->
length(proc_utils:debug(M)).
exit_process(Proto, Process) ->
exit_process(Proto, Process, kill).
exit_process(ubf, driver, Reason) ->
do_exit_process(ubf_driver, Reason);
exit_process(ebf, driver, Reason) ->
do_exit_process(ebf_driver, Reason);
exit_process(jsf, driver, Reason) ->
do_exit_process(jsf_driver, Reason);
exit_process(ubf, client_driver, Reason) ->
do_exit_process(ubf_client_driver, Reason);
exit_process(ebf, client_driver, Reason) ->
do_exit_process(ebf_client_driver, Reason);
exit_process(jsf, client_driver, Reason) ->
do_exit_process(jsf_client_driver, Reason).
shutdown_socket(Proto, Process) ->
shutdown_socket(Proto, Process, read_write).
shutdown_socket(ubf, driver, Reason) ->
do_shutdown_socket(ubf_driver, Reason);
shutdown_socket(ebf, driver, Reason) ->
do_shutdown_socket(ebf_driver, Reason);
shutdown_socket(jsf, driver, Reason) ->
do_shutdown_socket(jsf_driver, Reason);
shutdown_socket(ubf, client_driver, Reason) ->
do_shutdown_socket(ubf_client_driver, Reason);
shutdown_socket(ebf, client_driver, Reason) ->
do_shutdown_socket(ebf_client_driver, Reason);
shutdown_socket(jsf, client_driver, Reason) ->
do_shutdown_socket(jsf_client_driver, Reason).
do_exit_process(M) ->
do_exit_process(M,kill).
do_exit_process(M,Reason) ->
[ erlang:exit(P,Reason) || {P,_} <- proc_utils:debug(M) ].
do_shutdown_socket(M) ->
do_shutdown_socket(M,read_write).
do_shutdown_socket(M,Reason) ->
[ begin
case erlang:process_info(P) of
undefined ->
noop;
Info ->
case proplists:get_value(dictionary, Info) of
undefined ->
noop;
Dict ->
UBFSocket = proplists:get_value('$ubfsocket', Dict),
if Reason == close ->
ok = gen_tcp:close(UBFSocket);
true ->
ok = gen_tcp:shutdown(UBFSocket, Reason)
end
end
end
end
|| {P,_} <- proc_utils:debug(M) ].