diff options
Diffstat (limited to 'remsim/RemsimServer_Tests.ttcn')
-rw-r--r-- | remsim/RemsimServer_Tests.ttcn | 211 |
1 files changed, 127 insertions, 84 deletions
diff --git a/remsim/RemsimServer_Tests.ttcn b/remsim/RemsimServer_Tests.ttcn index 1ca5ce95..23ea8cb2 100644 --- a/remsim/RemsimServer_Tests.ttcn +++ b/remsim/RemsimServer_Tests.ttcn @@ -20,94 +20,14 @@ import from RSRES all; import from RSPRO_Types all; import from REMSIM_Tests all; +import from Misc_Helpers all; import from IPA_Emulation all; import from HTTPmsg_Types all; import from HTTPmsg_PortType all; +import from HTTP_Adapter all; import from JSON_Types all; -type component http_CT { - port HTTPmsg_PT HTTP; - var charstring g_http_host; - var integer g_http_port; -}; - -function f_http_init(charstring host, integer http_port) runs on http_CT { - map(self:HTTP, system:HTTP); - g_http_host := host; - g_http_port := http_port; -} - -template (value) Connect ts_HTTP_Connect(template (value) charstring hostname, - template (value) integer http_port := 80, - template (value) boolean use_ssl := false) := { - hostname := hostname, - portnumber := http_port, - use_ssl := use_ssl -} -template (value) Close ts_HTTP_Close := { client_id := omit }; - -template (value) HeaderLines ts_HTTP_Header(charstring body) := { - { header_name := "Content-Type", header_value := "application/json" }, - { header_name := "Content-Length", header_value := int2str(lengthof(body)) } -} - -template (value) HTTPMessage ts_HTTP_Req(charstring url, - charstring method := "GET", - charstring body := "", - integer v_maj := 1, integer v_min := 1) := { - request := { - client_id := omit, - method := method, - uri := url, - version_major := v_maj, - version_minor := v_min, - header := ts_HTTP_Header(body), - body := body - } -} - -template HTTPMessage tr_HTTP_Resp(template integer sts := ?) := { - response := { - client_id := ?, - version_major := ?, - version_minor := ?, - statuscode := sts, - statustext := ?, - header := ?, - body := ? - } -}; - -template HTTPMessage tr_HTTP_Resp2xx := tr_HTTP_Resp((200..299)); - -/* run a HTTP request and return the response */ -function f_http_transact(charstring url, charstring method := "GET", - charstring body := "", template HTTPMessage exp := tr_HTTP_Resp2xx) -runs on http_CT return HTTPMessage { - var HTTPMessage resp; - timer T := 2.0; - - HTTP.send(ts_HTTP_Connect(g_http_host, g_http_port)); - //HTTP.receive(Connect_result:?); - HTTP.send(ts_HTTP_Req(url, method, body)); - T.start; - alt { - [] HTTP.receive(exp) -> value resp { - setverdict(pass); - } - [] HTTP.receive(tr_HTTP_Resp) -> value resp { - setverdict(fail, "Unexpected HTTP response ", resp); - } - [] T.timeout { - setverdict(fail, "Timeout waiting for HTTP response"); - self.stop; - } - } - HTTP.send(ts_HTTP_Close); - return resp; -} - /* run a HTTP GET on specified URL expecting json in RSRES format as response */ function f_rsres_get(charstring url, template integer exp_sts := 200) runs on http_CT return JsRoot { @@ -148,18 +68,39 @@ runs on http_CT return HTTPResponse { function f_rsres_init() runs on http_CT { - f_http_init(mp_server_ip, mp_rsres_port); + var HTTP_Adapter_Params http_adapter_pars; + http_adapter_pars := { + http_host := mp_server_ip, + http_port := mp_rsres_port, + use_ssl := false + }; + f_http_init(http_adapter_pars); f_rsres_post_reset(); } type component test_CT extends rspro_client_CT, http_CT { + timer g_T_guard := 60.0; }; +private altstep as_Tguard() runs on test_CT { + [] g_T_guard.timeout { + setverdict(fail, "Timeout of T_guard"); + Misc_Helpers.f_shutdown(__BFILE__, __LINE__); + } +} + +private function f_init() runs on test_CT { + /* Start the guard timer */ + g_T_guard.start; + activate(as_Tguard()); +} -testcase TC_connect_and_nothing() runs on rspro_client_CT { + +testcase TC_connect_and_nothing() runs on test_CT { var ComponentIdentity rspro_id := valueof(ts_CompId(remsimClient, "foobar")); timer T := 20.0; + f_init(); f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0); T.start; /* expect that we're disconnected if we never send a ConnectClientReq */ @@ -178,6 +119,7 @@ testcase TC_connect_client() runs on test_CT { var ComponentIdentity rspro_id := valueof(ts_CompId(remsimClient, "foobar")); var JsRoot js; + f_init(); 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(3,4)); @@ -197,10 +139,74 @@ testcase TC_connect_client() runs on test_CT { setverdict(pass); } +/* duplicate connection from Same Client/Slot ID */ +testcase TC_connect_client_duplicate() runs on test_CT { + var ComponentIdentity rspro_id := valueof(ts_CompId(remsimClient, "foobar")); + var JsRoot js; + + f_init(); + 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; + } + + /* 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, identityInUse); + f_rspro_exp_disconnect(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[0].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; + f_init(); + f_rsres_init(); + f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0); + rspro[0].rspro_bank_id := 1; + rspro[0].rspro_bank_nslots := 8; + + js := f_rsres_get("/api/backend/v1/banks"); + if (not match(js.banks, JsBanks:{})) { + setverdict(fail, "Initial state not empty"); + mtc.stop; + } + f_rspro_connect_client(0); + js := f_rsres_get("/api/backend/v1/banks"); + if (not match(js.banks[0], tr_JsBank(CONNECTED_BANKD, rspro[0].rspro_id, rspro[0].rspro_bank_id, + rspro[0].rspro_bank_nslots))) { + setverdict(fail, "Non-matching JSON response"); + mtc.stop; + } + setverdict(pass); +} + +testcase TC_connect_bank_duplicate() runs on test_CT { + var ComponentIdentity rspro_id := valueof(ts_CompId(remsimBankd, "foobar")); + var JsRoot js; + + f_init(); f_rsres_init(); f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0); rspro[0].rspro_bank_id := 1; @@ -218,9 +224,28 @@ testcase TC_connect_bank() runs on test_CT { setverdict(fail, "Non-matching JSON response"); mtc.stop; } + + /* connect a second time for same Bank ID */ + f_rspro_init(rspro[1], mp_server_ip, mp_server_port, rspro_id, 1); + rspro[1].rspro_bank_id := 1; + rspro[1].rspro_bank_nslots := 23; + f_rspro_connect_client(1, identityInUse); + + /* expect only the first bank to survive */ + js := f_rsres_get("/api/backend/v1/banks"); + if (not match(js.banks[0], tr_JsBank(CONNECTED_BANKD, rspro[0].rspro_id, rspro[0].rspro_bank_id, + rspro[0].rspro_bank_nslots))) { + setverdict(fail, "Non-matching JSON response"); + mtc.stop; + } + + /* wait for T2/rejected timer to expire in server */ + f_sleep(2.0); + setverdict(pass); } + function f_ensure_slotmaps(template JsSlotmaps maps) runs on http_CT { var JsRoot js; @@ -251,6 +276,7 @@ runs on http_CT { /* test adding a single slotmap */ testcase TC_slotmap_add() runs on test_CT { + f_init(); f_rsres_init(); var JsSlotmap sm := valueof(ts_JsSlotmap(ts_BankSlot(1,2), ts_ClientSlot(3,4))); @@ -262,6 +288,7 @@ testcase TC_slotmap_add() runs on test_CT { /* test adding a single slotmap with out-of-range values */ testcase TC_slotmap_add_out_of_range() runs on test_CT { + f_init(); f_rsres_init(); var HTTPMessage http_resp; @@ -287,6 +314,8 @@ testcase TC_slotmap_add_out_of_range() runs on test_CT { /* test adding a slotmap and then connecting a client + bankd */ testcase TC_slotmap_add_conn_cl_b() runs on test_CT { + f_init(); + /* Simulate one client */ var ComponentIdentity rspro_id := valueof(ts_CompId(remsimClient, testcasename())); f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0); @@ -330,6 +359,8 @@ testcase TC_slotmap_add_conn_cl_b() runs on test_CT { /* test connecting a client and later adding a slotmap for it */ testcase TC_conn_cl_b_slotmap_add() runs on test_CT { + f_init(); + /* Simulate one client */ var ComponentIdentity rspro_id := valueof(ts_CompId(remsimClient, testcasename())); f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0); @@ -373,6 +404,7 @@ testcase TC_conn_cl_b_slotmap_add() runs on test_CT { /* simple delete of a 'NEW' slotmap */ testcase TC_slotmap_del_new() runs on test_CT { + f_init(); f_rsres_init(); var JsSlotmap sm := valueof(ts_JsSlotmap(ts_BankSlot(1,2), ts_ClientSlot(3,4))); @@ -384,6 +416,7 @@ testcase TC_slotmap_del_new() runs on test_CT { /* simple delete of a non-existant slotmap */ testcase TC_slotmap_del_nonexistant() runs on test_CT { + f_init(); f_rsres_init(); var JsSlotmap sm := valueof(ts_JsSlotmap(ts_BankSlot(11,12), ts_ClientSlot(13,14))); @@ -395,6 +428,8 @@ testcase TC_slotmap_del_nonexistant() runs on test_CT { /* simple delete of a 'UNACKNOWLEDGED' slotmap */ testcase TC_slotmap_del_unack() runs on test_CT { var ComponentIdentity rspro_id := valueof(ts_CompId(remsimBankd, testcasename())); + + f_init(); f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0); rspro[0].rspro_bank_id := 1; rspro[0].rspro_bank_nslots := 8; @@ -428,6 +463,8 @@ testcase TC_slotmap_del_unack() runs on test_CT { /* simple delete of a 'ACTIVE' slotmap from server + bankd */ testcase TC_slotmap_del_active() runs on test_CT { var ComponentIdentity rspro_id := valueof(ts_CompId(remsimBankd, testcasename())); + + f_init(); f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0); rspro[0].rspro_bank_id := 1; rspro[0].rspro_bank_nslots := 8; @@ -467,6 +504,8 @@ testcase TC_slotmap_del_active() runs on test_CT { /* simple delete of a 'ACTIVE' slotmap from client */ testcase TC_slotmap_del_active_client() runs on test_CT { var ComponentIdentity rspro_id := valueof(ts_CompId(remsimBankd, testcasename())); + + f_init(); f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0); rspro[0].rspro_bank_id := 1; rspro[0].rspro_bank_nslots := 8; @@ -519,6 +558,8 @@ testcase TC_slotmap_del_active_client() runs on test_CT { /* Add a slotmap to a currently active bank */ testcase TC_slotmap_add_active_bank() runs on test_CT { var ComponentIdentity rspro_id := valueof(ts_CompId(remsimBankd, testcasename())); + + f_init(); f_rspro_init(rspro[0], mp_server_ip, mp_server_port, rspro_id, 0); rspro[0].rspro_bank_id := 1; rspro[0].rspro_bank_nslots := 8; @@ -555,7 +596,9 @@ testcase TC_slotmap_add_active_bank() runs on test_CT { control { execute( TC_connect_and_nothing() ); execute( TC_connect_client() ); + execute( TC_connect_client_duplicate() ); execute( TC_connect_bank() ); + execute( TC_connect_bank_duplicate() ); execute( TC_slotmap_add() ); execute( TC_slotmap_add_conn_cl_b() ); execute( TC_slotmap_add_out_of_range() ); |