stp: Introduce STP_Tests*.ttcn for testing OsmoSTP

In the past, we were automatically running [large parts of] the nplab
M3UA and SUA test suites, but those implement only a fraction of the
functionality.  Particularly, they don't cover the non-standard IPA
behavior, and they don't cover RKM (routing key management).

Let's introduce an initial set of STP tests with this patch.  We try
to not duplicate nplab here, and implement bits not covered there.

Change-Id: I628a87385cac0dfe708a0d74a5088fbd5a4790cd
diff --git a/stp/STP_Tests_IPA.ttcn b/stp/STP_Tests_IPA.ttcn
new file mode 100644
index 0000000..0a36921
--- /dev/null
+++ b/stp/STP_Tests_IPA.ttcn
@@ -0,0 +1,142 @@
+module STP_Tests_IPA {
+
+/* Osmocom STP test suite in in TTCN-3
+ * (C) 2019 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
+ */
+
+friend module STP_Tests;
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from IPL4asp_Types all;
+
+import from TELNETasp_PortType all;
+import from Osmocom_VTY_Functions all;
+
+import from SCCP_Types all;
+import from SCCP_Templates all;
+import from SCCPasp_Types all;
+import from SCCP_Emulation all;
+
+import from IPA_Emulation all;
+
+import from M3UA_Emulation all;
+import from M3UA_CodecPort all;
+import from MTP3asp_Types all;
+import from MTP3asp_PortType all;
+
+import from STP_Tests_Common all;
+
+private const integer NR_IPA := 1;
+
+modulepar {
+	integer mp_stp_ipa_port := 5000;
+	integer mp_local_ipa_port := 20000;
+}
+
+type component IPA_CT extends Test_CT {
+	/* for IPA we use the IPA_Emulation and not directly IPA_CodecPort to avoid
+	 * having to re-invent IPA CCM handling here */
+	port MTP3asp_PT IPA[NR_IPA];
+	var IPA_Emulation_CT vc_IPA[NR_IPA];
+}
+
+friend function f_IPA_send(integer idx, octetstring data) runs on IPA_CT {
+	var MTP3_Field_sio sio := { ni := '00'B, prio := '00'B, si := '0011'B };
+	IPA[idx].send(t_ASP_MTP3_TRANSFERreq(sio, 0, 0, 0, data));
+}
+
+friend function f_IPA_exp(integer idx, template (present) octetstring data) runs on IPA_CT {
+	var M3UA_RecvFrom rx;
+	alt {
+	[] IPA[idx].receive(t_ASP_MTP3_TRANSFERind(?, ?, ?, ?, data)) {
+		setverdict(pass);
+		}
+	[] IPA[idx].receive {
+		setverdict(fail, "Received unexpected data on IPA port while waiting for ", data);
+		mtc.stop;
+		}
+	}
+}
+
+friend function f_init_ipa() runs on IPA_CT {
+	var integer i;
+
+	f_init_common();
+
+	for (i := 0; i < NR_IPA; i:=i+1) {
+		vc_IPA[i] := IPA_Emulation_CT.create("IPA" & int2str(i));
+		map(vc_IPA[i]:IPA_PORT, system:IPA_CODEC_PT);
+		connect(self:IPA[i], vc_IPA[i]:MTP3_SP_PORT);
+		vc_IPA[i].start(IPA_Emulation.main_client(mp_stp_ip, mp_stp_ipa_port, mp_local_ip,
+				mp_local_ipa_port+i));
+	}
+}
+
+
+
+/* "accept-asp-connections pre-configured" and client from unknown source */
+testcase TC_unknown_client_nodynamic() runs on IPA_CT {
+	f_init_common();
+	f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
+		      "accept-asp-connections pre-configured");
+	f_init_ipa();
+	f_sleep(1.0);
+	if (IPA[0].checkstate("Connected")) {
+		setverdict(fail, "Expected IPA port to be disconnected");
+	} else {
+		setverdict(pass);
+	}
+	/* switch back to default */
+	f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
+		      "accept-asp-connections dynamic-permitted");
+}
+
+/* "accept-asp-connections pre-configured" and client from known source */
+testcase TC_known_client_nodynamic() runs on IPA_CT {
+	f_init_common();
+	f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
+		      "accept-asp-connections pre-configured");
+	f_vty_config2(VTY, {"cs7 instance 0"}, "asp ipa-mahlzeit0 20000 5000 ipa");
+	f_vty_config2(VTY, {"cs7 instance 0", "as mahlzeit ipa"}, "asp ipa-mahlzeit0");
+	f_init_ipa();
+	f_sleep(1.0);
+	if (not IPA[0].checkstate("Connected")) {
+		setverdict(fail, "Expected IPA port to be connected");
+	} else {
+		setverdict(pass);
+	}
+	/* switch back to default */
+	f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
+		      "accept-asp-connections dynamic-permitted");
+	f_vty_config2(VTY, {"cs7 instance 0"}, "no asp ipa-mahlzeit0");
+}
+
+
+/* "accept-asp-connections dynamic-permitted" and client from unknown source */
+testcase TC_unknown_client_dynamic() runs on IPA_CT {
+	f_init_common();
+	f_init_ipa();
+	f_sleep(1.0);
+	if (not IPA[0].checkstate("Connected")) {
+		setverdict(fail, "Expected IPA port to be connected");
+	} else {
+		setverdict(pass);
+	}
+}
+
+
+control {
+	execute( TC_unknown_client_nodynamic() );
+	execute( TC_known_client_nodynamic() );
+	execute( TC_unknown_client_dynamic() );
+}
+
+
+}