lynxis lazus has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/42154?usp=email )
Change subject: remsim: server: add a client timeout test ......................................................................
remsim: server: add a client timeout test
1. Connect to the server 2. Don't answer to IPA PINGs 3. Server closes the connection 4. Client reconnects 5. Older server versions will crash
Change-Id: Iec52d3ce229c2ab84ab0ff9d8dbbff59b7f3fbd9 --- M remsim/REMSIM_Tests.ttcn M remsim/RemsimServer_Tests.ttcn 2 files changed, 69 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/54/42154/1
diff --git a/remsim/REMSIM_Tests.ttcn b/remsim/REMSIM_Tests.ttcn index b97dea1..92c932c 100644 --- a/remsim/REMSIM_Tests.ttcn +++ b/remsim/REMSIM_Tests.ttcn @@ -14,6 +14,7 @@ import from RSPRO all; import from RSPRO_Types all; import from IPA_Types all; +import from IPA_CodecPort all; import from IPA_Emulation all;
@@ -43,6 +44,8 @@ type component rspro_client_CT { var RSPRO_Client rspro[NUM_CLIENT]; port IPA_RSPRO_PT RSPRO[NUM_CLIENT]; + port IPA_CFG_PT IPACFG[NUM_CLIENT]; + port IPA_SP_PT IPAPORT[NUM_CLIENT]; };
private altstep as_ignore_id_ack(integer i := 0) runs on rspro_client_CT { @@ -68,6 +71,8 @@
map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT); connect(clnt.vc_IPA:IPA_RSPRO_PORT, self:RSPRO[i]); + connect(clnt.vc_IPA:CFG_PORT, self:IPACFG[i]); + connect(clnt.vc_IPA:IPA_SP_PORT, self:IPAPORT[i]);
clnt.vc_IPA.start(IPA_Emulation.main_client(dst_host, dst_port, "", 10000+i, clnt.ccm_pars));
@@ -96,6 +101,8 @@ runs on rspro_client_CT { clnt.vc_IPA.stop; disconnect(clnt.vc_IPA:IPA_RSPRO_PORT, self:RSPRO[i]); + disconnect(clnt.vc_IPA:CFG_PORT, self:IPACFG[i]); + disconnect(clnt.vc_IPA:IPA_SP_PORT, self:IPAPORT[i]); unmap(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT); }
diff --git a/remsim/RemsimServer_Tests.ttcn b/remsim/RemsimServer_Tests.ttcn index 23ea8cb..2901d48 100644 --- a/remsim/RemsimServer_Tests.ttcn +++ b/remsim/RemsimServer_Tests.ttcn @@ -22,6 +22,7 @@
import from Misc_Helpers all; import from IPA_Emulation all; +import from IPA_Types all;
import from HTTPmsg_Types all; import from HTTPmsg_PortType all; @@ -177,6 +178,66 @@ setverdict(pass); }
+/* A client connects and stops answering to IPA PING/PONGs. + Do a re-connect. Older version of the server will crash. */ +testcase TC_connect_client_timeout_reconnect() runs on test_CT { + var ComponentIdentity rspro_id := valueof(ts_CompId(remsimClient, "foobar")); + var JsRoot js; + timer T := 80.0; + + f_init(); + g_T_guard.start(180.0); + f_rsres_init(); + f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0); + rspro[0].rspro_client_slot := valueof(ts_ClientSlot(13,1)); + + js := f_rsres_get("/api/backend/v1/clients"); + if (not match(js.clients, JsClients:{})) { + setverdict(fail, "Initial state not empty"); + mtc.stop; + } + f_rspro_connect_client(0); + js := f_rsres_get("/api/backend/v1/clients"); + if (not match(js.clients[0], tr_JsClient(CONNECTED_CLIENT, rspro[0].rspro_id))) { + setverdict(fail, "Non-matching JSON response"); + mtc.stop; + } + + /* stop answering IPA Ping */ + var IpaCcmMsgtype ipa_ping_msg := IPAC_MSGT_PING; + var octetstring ipa_ping_data := int2oct(enum2int(ipa_ping_msg), 1); + + f_ipa_cfg_chg_ccm_enabled(IPACFG[0], false); + T.start; + alt { + [] IPAPORT[0].receive(t_ASP_IPA_UD(IPAC_PROTO_CCM, ipa_ping_data)) { + log("Received PING. Not answering it."); + repeat; + } + [] RSPRO[0].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_DOWN)) {} + [] T.timeout { + setverdict(fail, "Timed out. Server did not closed the connection."); + mtc.stop; + } + } + + + /* connect a second time for same Client ID */ + f_rspro_init(rspro[1], mp_server_ip, mp_server_port, rspro_id, 1); + rspro[1].rspro_client_slot := valueof(ts_ClientSlot(13,1)); + f_rspro_connect_client(1); + + /* expect the first connection still to be active */ + js := f_rsres_get("/api/backend/v1/clients"); + if (not match(js.clients[0], tr_JsClient(CONNECTED_CLIENT, rspro[1].rspro_id))) { + setverdict(fail, "Non-matching JSON response"); + mtc.stop; + } + + setverdict(pass); +} + + testcase TC_connect_bank() runs on test_CT { var ComponentIdentity rspro_id := valueof(ts_CompId(remsimBankd, "foobar")); var JsRoot js; @@ -597,6 +658,7 @@ execute( TC_connect_and_nothing() ); execute( TC_connect_client() ); execute( TC_connect_client_duplicate() ); + execute( TC_connect_client_timeout_reconnect() ); execute( TC_connect_bank() ); execute( TC_connect_bank_duplicate() ); execute( TC_slotmap_add() );