Initial TTCN-3 test suite for osmo-remsim

This adds shared infrastructure and initial test suites for
osmo-remsim-{server,client,bankd}.

Change-Id: I00034d3a991f0f881cfd8ff0bfc4557113daf830
diff --git a/remsim/RemsimClient_Tests.ttcn b/remsim/RemsimClient_Tests.ttcn
new file mode 100644
index 0000000..d5520ab
--- /dev/null
+++ b/remsim/RemsimClient_Tests.ttcn
@@ -0,0 +1,118 @@
+module RemsimClient_Tests {
+
+/* Integration Tests for osmo-remsim-client
+ * (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * This test suite tests osmo-remsim-client by attaching to the external interfaces.
+ */
+
+import from Osmocom_Types all;
+import from IPA_Emulation all;
+
+import from RSPRO all;
+import from RSPRO_Types all;
+import from RSPRO_Server all;
+import from REMSIM_Tests all;
+
+type component client_test_CT extends rspro_server_CT {
+	var ComponentIdentity g_srv_comp_id, g_bankd_comp_id;
+};
+
+private function f_init() runs on client_test_CT {
+	g_srv_comp_id := valueof(ts_CompId(remsimServer, "ttcn-server"));
+	g_bankd_comp_id := valueof(ts_CompId(remsimBankd, "ttcn-bankd"));
+
+	f_rspro_srv_init(0, mp_server_ip, mp_server_port, g_srv_comp_id);
+	f_rspro_srv_init(1, mp_bankd_ip, mp_bankd_port, g_bankd_comp_id, exp_connect := false);
+}
+
+
+/* ConnectClientReq from client to remsim-server */
+testcase TC_srv_connectClient() runs on client_test_CT {
+	f_init();
+	as_connectClientReq();
+	setverdict(pass);
+	f_sleep(1.0);
+}
+
+/* ConnectClientReq from client to remsim-server */
+testcase TC_srv_connectClient_reject() runs on client_test_CT {
+	f_init();
+	as_connectClientReq(res := illegalClientId);
+	/* expect disconnect by client */
+	RSPRO_SRV[0].receive(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_DOWN));
+	setverdict(pass);
+	f_sleep(1.0);
+}
+
+/* ConnectClientReq from client to remsim-server */
+testcase TC_srv_connectClient_configClientBank() runs on client_test_CT {
+	var BankSlot bslot := { 1, 0 };
+	f_init();
+	as_connectClientReq();
+	f_rspro_config_client_bank(bslot, ts_IpPort(ts_IPv4(mp_bankd_ip), mp_bankd_port));
+	f_rspro_srv_exp_connect(1);
+	as_connectClientReq(i := 1);
+	setverdict(pass);
+	f_sleep(1.0);
+}
+
+/* Test if client re-connects to server after connection is lost */
+testcase TC_srv_reconnect() runs on client_test_CT {
+	var BankSlot bslot := { 1, 0 };
+	f_init();
+	as_connectClientReq();
+
+	/* disconnect the client from server and expect re-establish + re-connect */
+	f_rspro_srv_fini(0);
+	f_rspro_srv_init(0, mp_server_ip, mp_server_port, g_srv_comp_id, exp_connect := true);
+	as_connectClientReq(i := 0);
+
+	setverdict(pass);
+	f_sleep(1.0);
+}
+
+/* Test if client re-connects to bank after connection is lost */
+testcase TC_bank_reconnect() runs on client_test_CT {
+	var BankSlot bslot := { 1, 0 };
+	f_init();
+	as_connectClientReq();
+	f_rspro_config_client_bank(bslot, ts_IpPort(ts_IPv4(mp_bankd_ip), mp_bankd_port));
+	f_rspro_srv_exp_connect(1);
+	as_connectClientReq(i := 1);
+
+	/* disconnect the client from bankd and expect re-establish + re-connect */
+	f_rspro_srv_fini(1);
+	f_rspro_srv_init(1, mp_bankd_ip, mp_bankd_port, g_bankd_comp_id, exp_connect := true);
+	as_connectClientReq(i := 1);
+
+	setverdict(pass);
+	f_sleep(1.0);
+}
+
+/* TODO:
+   * send a configClientBankIpReq and change the bank of an active client
+   * send a configClientBankSlotReq and chagne the bank slot of an active client
+   * test keepalive mechanism: do we get IPA PING?
+   * test keepalive mechanism: do we see disconnect+reconnect if we don't respond to IPA PING?
+   * test actual APDU transfers
+   * test messages in invalid state, e.g. APDUs before we're connected to a bank
+   * test messages on server connection which are only permitted on bankd connection
+ */
+
+control {
+	execute( TC_srv_connectClient() );
+	execute( TC_srv_connectClient_reject() );
+	execute( TC_srv_connectClient_configClientBank() );
+	execute( TC_srv_reconnect() );
+	execute( TC_bank_reconnect() );
+}
+
+
+}