aboutsummaryrefslogtreecommitdiffstats
path: root/remsim/RemsimServer_Tests.ttcn
diff options
context:
space:
mode:
Diffstat (limited to 'remsim/RemsimServer_Tests.ttcn')
-rw-r--r--remsim/RemsimServer_Tests.ttcn211
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() );