BSC_Test_ASCI: Add Talker detect with link fail test

The talker requests uplink. Instead of receiving link establishment from
the BTS, the BSC receives a link failure. The MSC expects to receive an
UPLINK RELEASE INDICATION, caused by radio link failure.

Change-Id: Ied56a6bdc0bfa541b1419e63e9e209ed20af804c
diff --git a/bsc/BSC_Tests_ASCI.ttcn b/bsc/BSC_Tests_ASCI.ttcn
index 70fcb4d..b4b0173 100644
--- a/bsc/BSC_Tests_ASCI.ttcn
+++ b/bsc/BSC_Tests_ASCI.ttcn
@@ -92,6 +92,7 @@
 	var boolean uplink_req := false;
 	var boolean uplink_req_conf := false;
 	var boolean uplink_rel_ind := false;
+	var boolean uplink_rel_ind_failure := false;
 	var boolean assign_res := false;
 	var boolean assign_fail := false;
 	/* Note: This timer is used to receive messages after the expected event.
@@ -150,6 +151,14 @@
 		}
 		repeat;
 		}
+	[] BSSAP.receive(tr_BSSMAP_UplinkRelInd(GSM0808_CAUSE_RADIO_INTERFACE_FAILURE, omit)) -> value rx_bssap {
+		log("VGCS: received uplink rel ind, caused by failure");
+		uplink_rel_ind_failure := true;
+		if (g_pars.asci_test.vgcs_talker_fail) {
+			T.start;
+		}
+		repeat;
+		}
 	[] COORD.receive(COORD_VGCS_ASSIGN_RES) {
 		log("VGCS: got assignment result at call control");
 		assign_res := true;
@@ -236,6 +245,19 @@
 		setverdict(pass);
 		return;
 	}
+	if (g_pars.asci_test.vgcs_talker_fail) {
+		if (not uplink_rel_ind_failure) {
+			setverdict(fail, "VGCS: No uplink release indication as expected!");
+			return;
+		}
+		if (not uplink_free) {
+			setverdict(fail, "VGCS: Uplink not free as expected!");
+			return;
+		}
+		log("VGCS: Uplink release and uplink marked free as expected!");
+		setverdict(pass);
+		return;
+	}
 	if (g_pars.asci_test.vgcs_talker_est) {
 		if (not uplink_req_conf) {
 			setverdict(fail, "VGCS: No uplink request confirm as expected!");
@@ -343,11 +365,16 @@
 		log("VGCS: got assignment result on channel");
 		COORD.send(COORD_VGCS_ASSIGN_RES);
 		if (g_pars.asci_test.vgcs_talker_req or
+		    g_pars.asci_test.vgcs_talker_fail or
 		    g_pars.asci_test.vgcs_talker_est or
 		    g_pars.asci_test.vgcs_talker_rel) {
 			log("VGCS: sending talker det");
 			RSL.send(ts_RSL_TALKER_DET(g_chan_nr));
 		}
+		if (g_pars.asci_test.vgcs_talker_fail) {
+			log("VGCS: sending RSL failure ind");
+			RSL.send(ts_RSL_CONN_FAIL_IND(g_chan_nr, RSL_ERR_TALKER_ACC_FAIL));
+		}
 		if (g_pars.asci_test.vgcs_talker_est or
 		    g_pars.asci_test.vgcs_talker_rel) {
 			log("VGCS: sending RSL etabish ind");
@@ -493,6 +520,28 @@
 	f_shutdown_helper();
 }
 
+testcase TC_vgcs_vbs_talker_fail() runs on test_CT {
+	var MSC_ConnHdlr call_conn, chan_conn;
+	var TestHdlrParams pars := f_gen_test_hdlr_pars();
+
+	f_init(1, true);
+
+	pars.sccp_addr_msc := g_bssap[0].sccp_addr_own;
+	pars.sccp_addr_bsc := g_bssap[0].sccp_addr_peer;
+
+	pars.asci_test.vgcs_talker_fail := true;
+
+	call_conn := f_start_handler(refers(f_tc_vgcs_vbs_setup), pars);
+	chan_conn := f_start_handler(refers(f_tc_asci_assignment), pars);
+	/* Connect COORD ports of both functions. The functions will delay before using them. */
+	connect(call_conn:COORD, chan_conn:COORD);
+
+	call_conn.done;
+	chan_conn.done;
+
+	f_shutdown_helper();
+}
+
 testcase TC_vgcs_vbs_talker_est() runs on test_CT {
 	var MSC_ConnHdlr call_conn, chan_conn;
 	var TestHdlrParams pars := f_gen_test_hdlr_pars();
@@ -586,6 +635,7 @@
 	execute( TC_vgcs_vbs_assignment() );
 	execute( TC_vgcs_vbs_assignment_fail() );
 	execute( TC_vgcs_vbs_talker_req() );
+	execute( TC_vgcs_vbs_talker_fail() );
 	execute( TC_vgcs_vbs_talker_est() );
 	execute( TC_vgcs_vbs_talker_rel() );
 	execute( TC_vgcs_vbs_uplink_seized() );