bscnat: Refactor BSC_MS side code to allow different actions per test
Each test can now plug in different actions to be done by the emulated
BSC_MS, by passing a function to f_init(). Old hardcoded behaviour (main())
is renamed and used in already existing tests.
Change-Id: Ic82ca333267535c5859e6439deacbf3b1d1fe391
diff --git a/bsc-nat/BSC_MS_Simulation.ttcn b/bsc-nat/BSC_MS_Simulation.ttcn
index d4e37a4..5feaf0e 100644
--- a/bsc-nat/BSC_MS_Simulation.ttcn
+++ b/bsc-nat/BSC_MS_Simulation.ttcn
@@ -31,9 +31,7 @@
/* test port to SCCP emulation */
port SCCPasp_PT SCCP;
- var SCCP_PAR_Address g_sccp_addr_own;
- var SCCP_PAR_Address g_sccp_addr_remote;
- var boolean g_use_osmux;
+ var BSC_MS_TestHdlrParams g_pars;
var charstring g_bsc_num_str;
}
@@ -42,21 +40,41 @@
integer mp_num_iterations := 10;
}
+/* helper function to create and connect a BSC_MS_ConnHdlr component */
+private function f_connect_handler(inout BSC_MS_ConnHdlr vc_conn) runs on BSC_CT {
+ /* connect client BSSAP port to BSSAP dispatcher */
+ connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
+}
+
+private function f_start_handler(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
+runs on BSC_CT return BSC_MS_ConnHdlr {
+ var BSC_MS_ConnHdlr vc_conn;
+ vc_conn := BSC_MS_ConnHdlr.create(id);
+ f_connect_handler(vc_conn);
+ vc_conn.start(f_handler_init(fn, id, pars));
+ return vc_conn;
+}
+
+/* first function inside ConnHdlr component; sets g_pars + starts function */
+private function f_handler_init(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
+runs on BSC_MS_ConnHdlr {
+ if (isvalue(pars)) {
+ g_pars := valueof(pars);
+ }
+ fn.apply(id);
+}
+
function main(charstring remote_ip, PortNumber remote_port,
charstring local_ip, PortNumber local_port,
MSC_SCCP_MTP3_parameters sccp_pars,
- SCCP_PAR_Address sccp_addr_own,
- SCCP_PAR_Address sccp_addr_remote,
- boolean use_osmux, charstring id) runs on BSC_CT
+ BSC_MS_TestHdlrParams pars,
+ void_fn_bsc_ms fn, charstring id) runs on BSC_CT
{
var integer i := 0;
timer T := 1.0;
var IPA_CCM_Parameters ccm_pars := IPA_Emulation.c_IPA_default_ccm_pars;
ccm_pars.name := id;
-
- g_sccp_addr_own := sccp_addr_own;
- g_sccp_addr_remote := sccp_addr_remote;
- g_use_osmux := use_osmux;
+ g_pars := pars;
/* create components for IPA/SCCP/BSS[M]AP stack */
vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
@@ -84,7 +102,7 @@
T.timeout;
for (i := 0; i < mp_num_iterations; i := i+1) {
- f_start_BSC_MS(id & "-MS-" & int2str(i));
+ f_start_BSC_MS(fn, id & "-MS-" & int2str(i));
}
/* explicitly stop all components that we started above */
@@ -93,15 +111,10 @@
vc_SCCP.stop;
}
-function f_start_BSC_MS(charstring id) runs on BSC_CT {
+function f_start_BSC_MS(void_fn_bsc_ms fn, charstring id) runs on BSC_CT {
var BSC_MS_ConnHdlr vc_conn;
-
- /* start new component */
- vc_conn := BSC_MS_ConnHdlr.create(id);
- /* connect client BSSAP port to BSSAP dispatcher */
- connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
/* start component */
- vc_conn.start(BSC_MS_ConnectionHandler.main(g_sccp_addr_own, g_sccp_addr_remote, g_use_osmux));
+ vc_conn := f_start_handler(fn, id, g_pars);
/* blocking wait until component terminates. If you want to start MSs in parallel,
* you have to remove this statement here */
vc_conn.done;