This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.org
Review at https://gerrit.osmocom.org/5958
msc tests: Put everything together; implement first ConnHdlr based tests
Change-Id: I0e77af4e8eaa9a8134e45a209b279d86d615d081
---
M msc_tests/BSC_ConnectionHandler.ttcn
M msc_tests/MSC_Tests.ttcn
2 files changed, 193 insertions(+), 34 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/58/5958/1
diff --git a/msc_tests/BSC_ConnectionHandler.ttcn b/msc_tests/BSC_ConnectionHandler.ttcn
index cc3e2e8..15a460b 100644
--- a/msc_tests/BSC_ConnectionHandler.ttcn
+++ b/msc_tests/BSC_ConnectionHandler.ttcn
@@ -16,11 +16,22 @@
import from MobileL3_Types all;
import from MobileL3_CommonIE_Types all;
+import from MobileL3_MM_Types all;
import from L3_Templates all;
/* this component represents a single subscriber connection */
type component BSC_ConnHdlr extends BSSAP_ConnHdlr, MNCC_ConnHdlr, GSUP_ConnHdlr {
+ var BSC_ConnHdlrPars g_pars;
}
+
+type record BSC_ConnHdlrPars {
+ SCCP_PAR_Address sccp_addr_own,
+ SCCP_PAR_Address sccp_addr_peer,
+ BSSMAP_IE_CellIdentifier cell_id,
+ hexstring imsi,
+ hexstring msisdn
+};
+
/* Callback function from general BSSMAP_Emulation whenever a connectionless
* BSSMAP message arrives. Canreturn a PDU_BSSAPthat should be sent in return */
@@ -42,7 +53,9 @@
const BssmapOps BSC_BssmapOps := {
/* Create call-back for inbound connections from MSC (hand-over) */
create_cb := refers(BSSMAP_Emulation.ExpectedCreateCallback),
- unitdata_cb := refers(BscUnitdataCallback)
+ unitdata_cb := refers(BscUnitdataCallback),
+ decode_dtap := true,
+ role_ms := true
}
@@ -73,28 +86,94 @@
spare1_1 := '0'B
}
-function f_establish_fully(SCCP_PAR_Address sccp_addr_peer, SCCP_PAR_Address sccp_addr_own)
+/* Encode 'l3' and ask BSSMAP_Emulation to create new connection with COMPL L3 INFO */
+function f_bssap_compl_l3(PDU_ML3_MS_NW l3)
runs on BSC_ConnHdlr {
+ log("Sending COMPL L3: ", l3);
+ var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3);
+ BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
+ valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, l3_enc))));
+}
- var hexstring imsi := '26242012345678'H;
+/* helper function to fully establish a dedicated channel */
+function f_establish_fully(MobileIdentityLV mi, boolean expect_auth)
+runs on BSC_ConnHdlr {
+ var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0001'B, mi));
+ var PDU_DTAP_MT dtap_mt;
+
+ /* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
+ f_bssap_compl_l3(l3_info);
+
+ if (expect_auth) {
+ /* FIXME */
+ }
+ BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC));
+}
+
+/* build a PDU_ML3_MS_NW containing a Location Update by IMSI */
+function f_build_lu_imsi(hexstring imsi) return PDU_ML3_MS_NW
+{
var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(imsi));
+ return f_build_lu(mi);
+}
+private function f_build_lu(MobileIdentityLV mi) return PDU_ML3_MS_NW
+{
var LocationAreaIdentification_V old_lai := { '62F220'O, '9999'O };
- var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23,42));
var PDU_ML3_MS_NW l3_info := valueof(ts_ML3_MO_LU_Req(valueof(ts_ML3_IE_LuType_Attach),
old_lai, mi, valueof(ts_CM1)));
- var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3_info);
+ return l3_info;
+}
+
+function f_perform_lu(boolean expect_auth, boolean expect_tmsi)
+runs on BSC_ConnHdlr {
+ var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
+ var PDU_DTAP_MT dtap_mt;
/* tell GSUP dispatcher to send this IMSI to us */
- f_create_gsup_expect(hex2str(imsi));
+ f_create_gsup_expect(hex2str(g_pars.imsi));
- log("Sending COMPL L3", l3_info);
/* Send BSSAP_Conn_Req with COMPL L3 INFO to MSC */
- BSSAP.send(ts_BSSAP_Conn_Req(sccp_addr_peer, sccp_addr_own,
- valueof(ts_BSSMAP_ComplL3(cell_id, l3_enc))));
+ f_bssap_compl_l3(l3_lu);
- GSUP.receive(tr_GSUP_UL_REQ(imsi));
- GSUP.send(ts_GSUP_UL_RES(imsi));
+ if (expect_auth) {
+ /* FIXME */
+ }
+ /* Expect MSC to perform LU with HLR */
+ GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
+ GSUP.send(ts_GSUP_ISD_REQ(g_pars.imsi, g_pars.msisdn));
+ GSUP.receive(tr_GSUP_ISD_RES(g_pars.imsi));
+ GSUP.send(ts_GSUP_UL_RES(g_pars.imsi));
+
+ alt {
+ [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) -> value dtap_mt {
+ var PDU_ML3_LocationUpdateAccept lu_acc := dtap_mt.dtap.msgs.mm.locationUpdateAccept;
+ if (expect_tmsi) {
+ if (not ispresent(lu_acc.mobileIdentityTLV) or
+ not ischosen(lu_acc.mobileIdentityTLV.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi)) {
+ setverdict(fail, "Expected TMSI but no TMSI was allocated");
+ self.stop;
+ } else {
+ BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_TmsiRealloc_Cmpl));
+ }
+ } else {
+ if (ispresent(lu_acc.mobileIdentityTLV) and
+ ischosen(lu_acc.mobileIdentityTLV.mobileIdentityLV.mobileIdentityV.oddEvenInd_identity.tmsi_ptmsi)) {
+ setverdict(fail, "Expected no TMSI but TMSI was allocated");
+ self.stop;
+ }
+ }
+ }
+ [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) {
+ setverdict(fail, "Expected LU ACK, but received LU REJ");
+ self.stop;
+ }
+ }
+ /* FIXME: there could be pending SMS or other common procedures by the MSC, let's ignore them */
+ BSSAP.receive(tr_BSSMAP_ClearCommand);
+ BSSAP.send(ts_BSSMAP_ClearComplete);
+ BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+ setverdict(pass);
}
function f_foo() runs on BSC_ConnHdlr{
diff --git a/msc_tests/MSC_Tests.ttcn b/msc_tests/MSC_Tests.ttcn
index de65b0b..272cc71 100644
--- a/msc_tests/MSC_Tests.ttcn
+++ b/msc_tests/MSC_Tests.ttcn
@@ -23,12 +23,14 @@
import from MNCC_Emulation all;
import from GSUP_Emulation all;
+import from GSUP_Types all;
import from IPA_Emulation all;
import from BSSAP_Types all;
import from BSSAP_Adapter all;
import from BSSAP_CodecPort all;
import from BSSMAP_Templates all;
+import from BSSMAP_Emulation all;
import from BSC_ConnectionHandler all;
import from MobileL3_Types all;
@@ -285,19 +287,28 @@
BSSAP.send(ts_BSSAP_UNITDATA_req(g_sccp_addr_peer, g_sccp_addr_own, bssap))
}
-type record BSC_ConnHdlrPars {
- SCCP_PAR_Address sccp_addr_own,
- SCCP_PAR_Address sccp_addr_peer
-};
-
type function void_fn(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr;
+function f_gen_imsi(hexstring prefix, integer suffix) return hexstring {
+ var integer suffix_len := 15 - lengthof(prefix);
+ suffix_len := suffix_len-1; /* FIXME: fix odd IMSI length */
+ return prefix & int2hex(suffix, suffix_len);
+}
+
+function f_gen_msisdn(hexstring prefix, integer suffix) return hexstring {
+ var integer suffix_len := 12 - lengthof(prefix);
+ return prefix & int2hex(suffix, suffix_len);
+}
+
/* FIXME: move into BSC_ConnectionHandler? */
-function f_start_handler(void_fn fn, charstring id) runs on MTC_CT return BSC_ConnHdlr {
+function f_start_handler(void_fn fn, charstring id, integer imsi_suffix) runs on MTC_CT return BSC_ConnHdlr {
var BSC_ConnHdlr vc_conn;
var BSC_ConnHdlrPars pars := {
sccp_addr_own := g_sccp_addr_own,
- sccp_addr_peer := g_sccp_addr_peer
+ sccp_addr_peer := g_sccp_addr_peer,
+ cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42)),
+ imsi := f_gen_imsi('26242'H, imsi_suffix),
+ msisdn := f_gen_msisdn('491239999'H, imsi_suffix)
};
vc_conn := BSC_ConnHdlr.create(id);
@@ -321,17 +332,88 @@
T.timeout;
}
-private function f_tc_foo(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
- f_establish_fully(pars.sccp_addr_peer, pars.sccp_addr_own);
- f_sleep(30.0);
+private function f_tc_lu_imsi_noauth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+ g_pars := pars;
+ f_perform_lu(false, true);
}
-testcase TC_nothing() runs on MTC_CT {
+testcase TC_lu_imsi_noauth_tmsi() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
-
f_init();
- vc_conn := f_start_handler(refers(f_tc_foo), testcasename());
+ vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_tmsi), testcasename(), 1);
+ vc_conn.done;
+}
+
+private function f_tc_lu_imsi_noauth_notmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+ g_pars := pars;
+ f_perform_lu(false, false);
+}
+
+testcase TC_lu_imsi_noauth_notmsi() runs on MTC_CT {
+ var BSC_ConnHdlr vc_conn;
+ f_init();
+
+ vc_conn := f_start_handler(refers(f_tc_lu_imsi_noauth_notmsi), testcasename(), 2);
+ vc_conn.done;
+}
+
+/* Do LU by IMSI, refuse it on GSUP and expect LU REJ back to MS */
+private function f_tc_lu_imsi_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+ g_pars := pars;
+ var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
+
+ f_create_gsup_expect(hex2str(g_pars.imsi));
+ f_bssap_compl_l3(l3_lu);
+ GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
+ GSUP.send(ts_GSUP_UL_ERR(g_pars.imsi, 23));
+ alt {
+ [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej(int2oct(23,1)))) { }
+ [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
+ setverdict(fail, "Expecting LU REJ, but got ACCEPT");
+ self.stop;
+ }
+ }
+ BSSAP.receive(tr_BSSMAP_ClearCommand);
+ BSSAP.send(ts_BSSMAP_ClearComplete);
+ BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+ setverdict(pass);
+}
+testcase TC_lu_imsi_reject() runs on MTC_CT {
+ var BSC_ConnHdlr vc_conn;
+ f_init();
+
+ vc_conn := f_start_handler(refers(f_tc_lu_imsi_reject), testcasename(), 3);
+ vc_conn.done;
+}
+
+/* Do LU by IMSI, timeout on GSUP */
+private function f_tc_lu_imsi_timeout_gsup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+ g_pars := pars;
+ var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
+
+ f_create_gsup_expect(hex2str(g_pars.imsi));
+ f_bssap_compl_l3(l3_lu);
+ GSUP.receive(tr_GSUP_UL_REQ(g_pars.imsi));
+ /* Normally the HLR would need to respond here, but we decide to force a timeout here */
+ alt {
+ /* FIXME: Expect specific reject cause */
+ [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Rej)) { }
+ [] BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_LU_Acc)) {
+ setverdict(fail, "Expecting LU REJ, but got ACCEPT");
+ self.stop;
+ }
+ }
+ BSSAP.receive(tr_BSSMAP_ClearCommand);
+ BSSAP.send(ts_BSSMAP_ClearComplete);
+ BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+ setverdict(pass);
+}
+testcase TC_lu_imsi_timeout_gsup() runs on MTC_CT {
+ var BSC_ConnHdlr vc_conn;
+ f_init();
+
+ vc_conn := f_start_handler(refers(f_tc_lu_imsi_timeout_gsup), testcasename(), 4);
vc_conn.done;
}
@@ -339,8 +421,7 @@
private function f_tc_cmserv_imsi_unknown(charstring id, BSC_ConnHdlrPars pars)
runs on BSC_ConnHdlr {
- var hexstring imsi := '262430000000000'H;
- var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(imsi));
+ var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42));
var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ('0001'B, mi));
var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3_info);
@@ -356,12 +437,8 @@
timer T := 10.0;
T.start;
alt {
- [] BSSAP.receive(tr_BSSAP_DTAP) -> value bssap_rx {
- l3_rx := dec_PDU_ML3_NW_MS(bssap_rx.pdu.dtap);
- if (not match(l3_rx, tr_CM_SERV_REJ)) {
- setverdict(fail, "Received unexpeted DTAP/L3");
- }
- }
+ [] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_REJ)) { }
+ //[] BSSAP.receive(tr_PDU_DTAP_MT(tr_CM_SERV_ACC)) { }
[] BSSAP.receive { setverdict(fail, "Received unexpected BSSAP"); }
[] T.timeout { setverdict(inconc, "Timeout waiting for CM SERV REQ"); }
}
@@ -378,7 +455,7 @@
testcase TC_cmserv_imsi_unknown() runs on MTC_CT {
var BSC_ConnHdlr vc_conn;
f_init();
- vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), testcasename());
+ vc_conn := f_start_handler(refers(f_tc_cmserv_imsi_unknown), testcasename(), 5);
vc_conn.done;
}
@@ -387,7 +464,10 @@
control {
execute( TC_cmserv_imsi_unknown() );
- execute( TC_nothing() );
+ execute( TC_lu_imsi_noauth_tmsi() );
+ //execute( TC_lu_imsi_noauth_notmsi() );
+ execute( TC_lu_imsi_reject() );
+ execute( TC_lu_imsi_timeout_gsup() );
}
--
To view, visit https://gerrit.osmocom.org/5958
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0e77af4e8eaa9a8134e45a209b279d86d615d081
Gerrit-PatchSet: 1
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>