[PATCH] osmo-ttcn3-hacks[master]: msc tests: Put everything together; implement first ConnHdlr...

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
Sun Jan 21 18:12:18 UTC 2018


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>



More information about the gerrit-log mailing list