WIP: MSC: Add MO call testing

Change-Id: If32cb359b3cf732c4752856538552595dbbf2a8a
diff --git a/msc_tests/MSC_Tests.ttcn b/msc_tests/MSC_Tests.ttcn
index 68e0bef..dea27a7 100644
--- a/msc_tests/MSC_Tests.ttcn
+++ b/msc_tests/MSC_Tests.ttcn
@@ -21,6 +21,7 @@
 import from Osmocom_CTRL_Adapter all;
 
 import from MNCC_Emulation all;
+import from MNCC_Types all;
 
 import from GSUP_Emulation all;
 import from GSUP_Types all;
@@ -458,6 +459,56 @@
 	vc_conn.done;
 }
 
+private function f_tc_lu_and_mo_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
+	g_pars := pars;
+	f_perform_lu(false, true, true);
+
+	f_establish_fully(valueof(ts_MI_IMSI_LV(g_pars.imsi)), false);
+
+	var hexstring called := '12345'H;
+	var integer tid := 0;
+	var MNCC_PDU mncc;
+	f_create_mncc_expect(hex2str(called));
+
+	BSSAP.send(ts_PDU_DTAP_MO(ts_ML3_MO_CC_SETUP(tid, called)));
+	MNCC.receive(tr_MNCC_SETUP_ind(?, tr_MNCC_number(hex2str(called)))) -> value mncc;
+	/* FIXME: extract call_id */
+
+	/* Call Proceeding */
+	MNCC.send(ts_MNCC_CALL_PROC_req(mncc.u.signal.callref, ts_MNCC_bcap_voice));
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_CALL_PROC(tid)));
+
+	/* Alerting */
+	MNCC.send(ts_MNCC_ALERT_req(mncc.u.signal.callref));
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_ALERTING(tid)));
+
+	/* Answer. This causes TCH assignment in case of "late assignment" */
+	MNCC.send(ts_MNCC_SETUP_COMPL_req(mncc.u.signal.callref));
+
+	f_sleep(3.0);
+
+	/* Hangup by "B" side */
+	MNCC.send(ts_MNCC_DISC_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(23))));
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_DISC(tid)));
+
+	/* Release of call */
+	MNCC.send(ts_MNCC_REL_req(mncc.u.signal.callref, valueof(ts_MNCC_cause(42))));
+	BSSAP.receive(tr_PDU_DTAP_MT(tr_ML3_MT_CC_RELEASE(tid)));
+
+	/* clearing of radio channel */
+	BSSAP.receive(tr_BSSMAP_ClearCommand);
+	BSSAP.send(ts_BSSMAP_ClearComplete);
+	BSSAP.receive(BSSAP_Conn_Prim:MSC_CONN_PRIM_DISC_IND);
+
+	f_sleep(5.0);
+}
+testcase TC_lu_and_mo_call() runs on MTC_CT {
+	var BSC_ConnHdlr vc_conn;
+	f_init();
+
+	vc_conn := f_start_handler(refers(f_tc_lu_and_mo_call), testcasename(), 1);
+	vc_conn.done;
+}
 
 
 
@@ -467,6 +518,7 @@
 	//execute( TC_lu_imsi_noauth_notmsi() );
 	execute( TC_lu_imsi_reject() );
 	execute( TC_lu_imsi_timeout_gsup() );
+	execute( TC_lu_and_mo_call() );
 }