From a1cc5adde3b289282dd5bfc7592a044d988c75a9 Mon Sep 17 00:00:00 2001 From: Peter Andersson Date: Wed, 29 May 2013 11:36:29 +0200 Subject: Add test suite OTP-10126 --- lib/common_test/test/Makefile | 1 + lib/common_test/test/ct_gen_conn_SUITE.erl | 135 +++++++++++++++++++++ .../test/ct_gen_conn_SUITE_data/conn_SUITE.erl | 72 +++++------ 3 files changed, 172 insertions(+), 36 deletions(-) create mode 100644 lib/common_test/test/ct_gen_conn_SUITE.erl (limited to 'lib/common_test') diff --git a/lib/common_test/test/Makefile b/lib/common_test/test/Makefile index 31ab28c41d..9d2edcd653 100644 --- a/lib/common_test/test/Makefile +++ b/lib/common_test/test/Makefile @@ -30,6 +30,7 @@ MODULES= \ ct_userconfig_callback \ telnet_server \ ct_smoke_test_SUITE \ + ct_gen_conn_SUITE \ ct_priv_dir_SUITE \ ct_event_handler_SUITE \ ct_config_info_SUITE \ diff --git a/lib/common_test/test/ct_gen_conn_SUITE.erl b/lib/common_test/test/ct_gen_conn_SUITE.erl new file mode 100644 index 0000000000..2a2183854e --- /dev/null +++ b/lib/common_test/test/ct_gen_conn_SUITE.erl @@ -0,0 +1,135 @@ +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2010-2012. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% + +%%%------------------------------------------------------------------- +%%% File: ct_gen_conn_SUITE +%%% +%%% Description: +%%% Test that the generic connection handling in CT works as expected. +%%% +%%% The suite used for the test is located in the data directory. +%%%------------------------------------------------------------------- +-module(ct_gen_conn_SUITE). + +-compile(export_all). + +-include_lib("common_test/include/ct.hrl"). +-include_lib("common_test/include/ct_event.hrl"). + +-define(eh, ct_test_support_eh). + +%%-------------------------------------------------------------------- +%% TEST SERVER CALLBACK FUNCTIONS +%%-------------------------------------------------------------------- + +%%-------------------------------------------------------------------- +%% Description: Since Common Test starts another Test Server +%% instance, the tests need to be performed on a separate node (or +%% there will be clashes with logging processes etc). +%%-------------------------------------------------------------------- +init_per_suite(Config) -> + ct_test_support:init_per_suite(Config). + +end_per_suite(Config) -> + ct_test_support:end_per_suite(Config). + +init_per_testcase(TestCase, Config) -> + ct_test_support:init_per_testcase(TestCase, Config). + +end_per_testcase(TestCase, Config) -> + ct_test_support:end_per_testcase(TestCase, Config). + +suite() -> [{ct_hooks,[ts_install_cth]}]. + +all() -> + [handles_to_multi_conn_pids, handles_to_single_conn_pids, + names_to_multi_conn_pids, names_to_single_conn_pids]. + +%%-------------------------------------------------------------------- +%% TEST CASES +%%-------------------------------------------------------------------- +handles_to_multi_conn_pids(Config) -> + run_test(handles_to_multi_conn_pids, Config). + +handles_to_single_conn_pids(Config) -> + run_test(handles_to_single_conn_pids, Config). + +names_to_multi_conn_pids(Config) -> + run_test(names_to_multi_conn_pids, Config). + +names_to_single_conn_pids(Config) -> + run_test(names_to_single_conn_pids, Config). + +%%%----------------------------------------------------------------- +%%% HELP FUNCTIONS +%%%----------------------------------------------------------------- +run_test(TestCase, Config) -> + DataDir = ?config(data_dir, Config), + {Opts,ERPid} = setup_env([{dir,DataDir}, + {suite,conn_SUITE}, + {testcase,TestCase}, + {config,filename:join(DataDir,"conn.conf")}], + Config), + ok = ct_test_support:run(Opts, Config), + TestEvents = ct_test_support:get_events(ERPid, Config), + ct_test_support:log_events(TestCase, + reformat_events(TestEvents, ?eh), + ?config(priv_dir, Config), + Opts), + ExpEvents = events_to_check(TestCase), + ok = ct_test_support:verify_events(ExpEvents, TestEvents, Config). + +setup_env(Test, Config) -> + Opts0 = ct_test_support:get_opts(Config), + Level = ?config(trace_level, Config), + EvHArgs = [{cbm,ct_test_support},{trace_level,Level}], + Opts = Opts0 ++ [{event_handler,{?eh,EvHArgs}} | Test], + ERPid = ct_test_support:start_event_receiver(Config), + {Opts,ERPid}. + +reformat_events(Events, EH) -> + ct_test_support:reformat(Events, EH). + +%%%----------------------------------------------------------------- +%%% TEST EVENTS +%%%----------------------------------------------------------------- +events_to_check(Test) -> + %% 2 tests (ct:run_test + script_start) is default + events_to_check(Test, 2). + +events_to_check(_, 0) -> + []; +events_to_check(Test, N) -> + test_events(Test) ++ events_to_check(Test, N-1). + +test_events(Name) -> + [ + {?eh,start_logging,{'DEF','RUNDIR'}}, + {?eh,test_start,{'DEF',{'START_TIME','LOGDIR'}}}, + {?eh,start_info,{1,1,1}}, + {?eh,tc_start,{conn_SUITE,init_per_suite}}, + {?eh,tc_done,{conn_SUITE,init_per_suite,ok}}, + {?eh,tc_start,{conn_SUITE,Name}}, + {?eh,tc_done,{conn_SUITE,Name,ok}}, + {?eh,test_stats,{1,0,{0,0}}}, + {?eh,tc_start,{conn_SUITE,end_per_suite}}, + {?eh,tc_done,{conn_SUITE,end_per_suite,ok}}, + {?eh,test_done,{'DEF','STOP_TIME'}}, + {?eh,stop_logging,[]} + ]. diff --git a/lib/common_test/test/ct_gen_conn_SUITE_data/conn_SUITE.erl b/lib/common_test/test/ct_gen_conn_SUITE_data/conn_SUITE.erl index c0707160cf..6877e0c2d2 100644 --- a/lib/common_test/test/ct_gen_conn_SUITE_data/conn_SUITE.erl +++ b/lib/common_test/test/ct_gen_conn_SUITE_data/conn_SUITE.erl @@ -18,8 +18,9 @@ %% %%%------------------------------------------------------------------- -%%% File : -%%% Description : +%%% File : conn_SUITE +%%% Description : Check that the generic connection handling in CT +%%% works as expected. %%%------------------------------------------------------------------- -module(conn_SUITE). @@ -32,7 +33,6 @@ %% COMMON TEST CALLBACK FUNCTIONS %%-------------------------------------------------------------------- - suite() -> [{timetrap,{seconds,5}}]. @@ -59,7 +59,7 @@ all() -> handles_to_multi_conn_pids() -> [{require,multi_conn_pid}]. -handles_to_multi_conn_pids(Config) -> +handles_to_multi_conn_pids(_Config) -> application:set_env(ct_test, reconnect, true), Handle1 = proto:open(multi_conn_pid), @@ -97,7 +97,7 @@ handles_to_multi_conn_pids(Config) -> handles_to_single_conn_pids() -> [{require,single_conn_pid}]. -handles_to_single_conn_pids(Config) -> +handles_to_single_conn_pids(_Config) -> application:set_env(ct_test, reconnect, true), Handle1 = proto:open(single_conn_pid), @@ -110,9 +110,9 @@ handles_to_single_conn_pids(Config) -> ConnPid = ct_gen_conn:get_conn_pid(Handle3), {true,true} = {is_process_alive(Handle3),is_process_alive(ConnPid)}, - Conns = [{undefined,Handle3,_,_}, + Conns = [{undefined,Handle1,_,_}, {undefined,Handle2,_,_}, - {undefined,Handle1,_,_}] = ct_util:get_connections(ConnPid), + {undefined,Handle3,_,_}] = lists:sort(ct_util:get_connections(ConnPid)), ct:pal("CONNS = ~n~p", [Conns]), ok = proto:close(Handle1), @@ -138,43 +138,43 @@ handles_to_single_conn_pids(Config) -> ok. names_to_multi_conn_pids() -> - [{require,conn1,multi_conn_pid}, - {require,conn2,multi_conn_pid}, - {require,conn3,multi_conn_pid}]. + [{require,mconn1,multi_conn_pid}, + {require,mconn2,multi_conn_pid}, + {require,mconn3,multi_conn_pid}]. -names_to_multi_conn_pids(Config) -> +names_to_multi_conn_pids(_Config) -> application:set_env(ct_test, reconnect, true), - Handle1 = proto:open(conn1), + Handle1 = proto:open(mconn1), ConnPid1 = ct_gen_conn:get_conn_pid(Handle1), {true,true} = {is_process_alive(Handle1),is_process_alive(ConnPid1)}, - Handle2 = proto:open(conn2), + Handle2 = proto:open(mconn2), ConnPid2 = ct_gen_conn:get_conn_pid(Handle2), {true,true} = {is_process_alive(Handle2),is_process_alive(ConnPid2)}, - Handle3 = proto:open(conn3), + Handle3 = proto:open(mconn3), ConnPid3 = ct_gen_conn:get_conn_pid(Handle3), {true,true} = {is_process_alive(Handle3),is_process_alive(ConnPid3)}, - Handle1 = proto:open(conn1), + Handle1 = proto:open(mconn1), - ok = proto:close(conn1), + ok = proto:close(mconn1), timer:sleep(100), {false,false} = {is_process_alive(Handle1),is_process_alive(ConnPid1)}, ok = proto:kill_conn_proc(Handle2), timer:sleep(100), - Handle2 = proto:open(conn2), % should've been reconnected already + Handle2 = proto:open(mconn2), % should've been reconnected already {true,false} = {is_process_alive(Handle2),is_process_alive(ConnPid2)}, ConnPid2x = ct_gen_conn:get_conn_pid(Handle2), true = is_process_alive(ConnPid2x), - ok = proto:close(conn2), + ok = proto:close(mconn2), timer:sleep(100), {false,false} = {is_process_alive(Handle2),is_process_alive(ConnPid2x)}, - Handle2y = proto:open(conn2), + Handle2y = proto:open(mconn2), ConnPid2y = ct_gen_conn:get_conn_pid(Handle2y), {true,true} = {is_process_alive(Handle2y),is_process_alive(ConnPid2y)}, - ok = proto:close(conn2), + ok = proto:close(mconn2), timer:sleep(100), {false,false} = {is_process_alive(Handle2y),is_process_alive(ConnPid2y)}, @@ -186,47 +186,47 @@ names_to_multi_conn_pids(Config) -> ok. names_to_single_conn_pids() -> - [{require,conn1,single_conn_pid}, - {require,conn2,single_conn_pid}, - {require,conn3,single_conn_pid}]. + [{require,sconn1,single_conn_pid}, + {require,sconn2,single_conn_pid}, + {require,sconn3,single_conn_pid}]. -names_to_single_conn_pids(Config) -> +names_to_single_conn_pids(_Config) -> application:set_env(ct_test, reconnect, true), - Handle1 = proto:open(conn1), + Handle1 = proto:open(sconn1), ConnPid = ct_gen_conn:get_conn_pid(Handle1), {true,true} = {is_process_alive(Handle1),is_process_alive(ConnPid)}, - Handle2 = proto:open(conn2), + Handle2 = proto:open(sconn2), ConnPid = ct_gen_conn:get_conn_pid(Handle2), {true,true} = {is_process_alive(Handle2),is_process_alive(ConnPid)}, - Handle3 = proto:open(conn3), + Handle3 = proto:open(sconn3), ConnPid = ct_gen_conn:get_conn_pid(Handle3), {true,true} = {is_process_alive(Handle3),is_process_alive(ConnPid)}, - Handle1 = proto:open(conn1), + Handle1 = proto:open(sconn1), - Conns = [{conn1,Handle1,_,_}, - {conn2,Handle2,_,_}, - {conn3,Handle3,_,_}] = lists:sort(ct_util:get_connections(ConnPid)), + Conns = [{sconn1,Handle1,_,_}, + {sconn2,Handle2,_,_}, + {sconn3,Handle3,_,_}] = lists:sort(ct_util:get_connections(ConnPid)), ct:pal("CONNS on ~p = ~n~p", [ConnPid,Conns]), - ok = proto:close(conn1), + ok = proto:close(sconn1), timer:sleep(100), {false,true} = {is_process_alive(Handle1),is_process_alive(ConnPid)}, ok = proto:kill_conn_proc(Handle2), timer:sleep(100), {true,false} = {is_process_alive(Handle2),is_process_alive(ConnPid)}, - Handle2 = proto:open(conn2), % should've been reconnected already + Handle2 = proto:open(sconn2), % should've been reconnected already NewConnPid = ct_gen_conn:get_conn_pid(Handle2), true = is_process_alive(NewConnPid), - Conns1 = [{conn2,Handle2,_,_}, - {conn3,Handle3,_,_}] = + Conns1 = [{sconn2,Handle2,_,_}, + {sconn3,Handle3,_,_}] = lists:sort(ct_util:get_connections(NewConnPid)), ct:pal("CONNS on ~p = ~n~p", [NewConnPid,Conns1]), - ok = proto:close(conn2), + ok = proto:close(sconn2), timer:sleep(100), {false,true} = {is_process_alive(Handle2),is_process_alive(NewConnPid)}, -- cgit v1.2.3