msc: New TC_cl3_rnd_payload / TC_cl3_no_payload for COMPLETE L3

Test BSSMAP COMPLETE L3 INFO either with no payload whatsoever or with
random payload.

Change-Id: I37ca3e5048cc1c2678d763a44b7e228da29851cc
diff --git a/msc_tests/MSC_Tests.ttcn b/msc_tests/MSC_Tests.ttcn
index 426f479..5f49d3a 100644
--- a/msc_tests/MSC_Tests.ttcn
+++ b/msc_tests/MSC_Tests.ttcn
@@ -1089,6 +1089,63 @@
 	vc_conn.done;
 }
 
+/* Test Complete L3 without payload */
+private function f_tc_cl3_no_payload(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+
+	/* Send Complete L3 Info with empty L3 frame */
+	BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
+					valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, ''O))));
+
+	alt {
+	[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
+	/* Expect LU REJECT with Cause == Illegal MS */
+	[] BSSAP.receive(tr_BSSMAP_ClearCommand) {
+		BSSAP.send(ts_BSSMAP_ClearComplete);
+		BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+		}
+	}
+	setverdict(pass);
+}
+testcase TC_cl3_no_payload() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_cl3_no_payload), testcasename(), 24);
+	vc_conn.done;
+}
+
+/* Test Complete L3 with random payload */
+private function f_tc_cl3_rnd_payload(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+
+	var integer len := float2int(rnd() * 256.0);
+	var octetstring payl := f_rnd_octstring(len);
+
+	/* Send Complete L3 Info with empty L3 frame */
+	BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
+					valueof(ts_BSSMAP_ComplL3(g_pars.cell_id, payl))));
+
+	alt {
+	/* Immediate disconnect */
+	[] BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND) {}
+	/* Expect LU REJECT with Cause == Illegal MS */
+	[] BSSAP.receive(tr_BSSMAP_ClearCommand) {
+		BSSAP.send(ts_BSSMAP_ClearComplete);
+		BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+		}
+	[] BSSAP.receive(tr_PDU_DTAP_MT(?)) { repeat; }
+	}
+	setverdict(pass);
+}
+testcase TC_cl3_rnd_payload() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_cl3_rnd_payload), testcasename(), 24);
+	vc_conn.done;
+}
+
 
 /* TODO:
    * continue to send repeated MO signalling messages to keep channel open: does MSC tmeout?
@@ -1096,8 +1153,6 @@
    * MT call while LU or is ongoing: Do we use existing lchan or page while lchan active?
    * 3G/2G auth permutations
    * encryption algorithms vs. classmark vs. vty config
-   * emergency call
-   * IMSI DETACH
    * send new transaction after/during clear (like SMS, ...)
    * too long L3 INFO in DTAP
    * too long / padded BSSAP
@@ -1127,6 +1182,10 @@
 	execute( TC_cm_serv_req_vbs_reject() );
 	execute( TC_cm_serv_req_lcs_reject() );
 	execute( TC_cm_reest_req_reject() );
+	execute( TC_lu_auth_2G_fail() );
+	execute( TC_lu_imsi_auth_tmsi_encr_13_13() );
+	execute( TC_cl3_no_payload() );
+	execute( TC_cl3_rnd_payload() );
 }