osmo-ttcn3-hacks/mme/MME_Tests.ttcn

119 lines
3.2 KiB
Plaintext
Raw Normal View History

/* MME (Mobility Management Engine) test suite 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
*/
module MME_Tests {
import from SGsAP_Types all;
import from SGsAP_Templates all;
import from SGsAP_Emulation all;
import from L3_Templates all;
import from DNS_Helpers all;
friend module MME_Tests_SGsAP;
type component MTC_CT {
var SGsAP_Emulation_CT vc_SGsAP;
port SGsAP_PT SGsAP_UNIT;
port SGsAPEM_PROC_PT SGsAP_PROC;
}
type component ConnHdlr extends SGsAP_ConnHdlr {
var ConnHdlrPars g_pars;
timer g_Tguard := 30.0;
}
type record ConnHdlrPars {
hexstring imsi
}
modulepar {
charstring mp_sgs_local_ip := "127.0.0.1";
integer mp_sgs_local_port := 29118;
charstring mp_vlr_name := "vlr.example.net";
charstring mp_mme_name := "mmec01.mmegi0001.mme.epc.mnc070.mcc901.3gppnetwork.org";
}
/* send incoming unit data messages (like reset) to global SGsAP_UNIT port */
friend function ForwardUnitdataCallback(PDU_SGsAP msg)
runs on SGsAP_Emulation_CT return template PDU_SGsAP {
SGsAP_UNIT.send(msg);
return omit;
}
friend function f_init_sgsap(charstring id) runs on MTC_CT {
id := id & "-SGsAP";
var SGsAPOps ops := {
create_cb := refers(SGsAP_Emulation.ExpectedCreateCallback),
unitdata_cb := refers(ForwardUnitdataCallback)
}
var SGsAP_conn_parameters pars := {
remote_ip := "",
remote_sctp_port := -1,
local_ip := mp_sgs_local_ip,
local_sctp_port := mp_sgs_local_port
}
vc_SGsAP := SGsAP_Emulation_CT.create(id);
map(vc_SGsAP:SGsAP, system:SGsAP_CODEC_PT);
connect(vc_SGsAP:SGsAP_PROC, self:SGsAP_PROC);
connect(vc_SGsAP:SGsAP_UNIT, self:SGsAP_UNIT);
vc_SGsAP.start(SGsAP_Emulation.main(ops, pars, id));
}
/* generate parameters for a connection handler */
friend function f_init_pars(integer imsi_suffix)
runs on MTC_CT return ConnHdlrPars {
var ConnHdlrPars pars := {
imsi := f_gen_imsi(imsi_suffix)
};
return pars;
}
type function void_fn(ConnHdlrPars pars) runs on ConnHdlr;
/* start a connection handler with given parameters */
friend function f_start_handler_with_pars(void_fn fn, ConnHdlrPars pars, integer s1ap_idx := 0)
runs on MTC_CT return ConnHdlr {
var ConnHdlr vc_conn;
var charstring id := testcasename() & int2str(s1ap_idx);
vc_conn := ConnHdlr.create(id);
/* SGsAP part */
connect(vc_conn:SGsAP, vc_SGsAP:SGsAP_CLIENT);
connect(vc_conn:SGsAP_PROC, vc_SGsAP:SGsAP_PROC);
/* We cannot use vc_conn.start(f_init_handler(fn, id, pars)); as we cannot have
* a stand-alone 'derefers()' call, see https://www.eclipse.org/forums/index.php/t/1091364/ */
vc_conn.start(derefers(fn)(pars));
return vc_conn;
}
/* altstep for the global guard timer */
private altstep as_Tguard()runs on ConnHdlr {
[] g_Tguard.timeout {
setverdict(fail, "Tguard timeout");
mtc.stop;
}
}
friend function f_init_handler(ConnHdlrPars pars, float t_guard := 30.0) runs on ConnHdlr {
/* make parameters available via component variable */
g_pars := pars;
/* start guard timre and activate it as default */
g_Tguard.start(t_guard);
activate(as_Tguard());
/* Route all SGsAP mesages for our IMSIto us */
f_create_sgsap_expect(pars.imsi);
}
}