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 <lafo...@gnumonks.org>

Reply via email to