bsc: Factor out duplicated code into f_exp_chan_rel_and_clear()

There's a sequence of commands which was repeated over at least
four test cases.  Let's factor this out into the new
f_exp_chan_rel_and_clear() function, and use that function from
all the former copy+pasted sections.

Change-Id: Ic6791fce4e8787e38b818a12ed526d3e47f313ef
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index bab56d1..a5509fd 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -667,9 +667,23 @@
 	return dt;
 }
 
+/* expect RF CAN REL from BTS, acknowledge it and clear the MSC side */
+private function f_exp_chan_rel_and_clear(DchanTuple dt, integer bts_nr := 0) runs on test_CT {
+	var RSL_Message rx_rsl;
+	/* expect BSC to disable the channel */
+	rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
+	/* respond with CHAN REL ACK */
+	f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
+
+	/* expect Clear Complete from BSC */
+	BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete));
+
+	/* MSC disconnects as instructed. */
+	BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
+}
+
 /* Test behavior of channel release after unilateral RLL REL IND (DISC from MS) */
 testcase TC_chan_rel_rll_rel_ind() runs on test_CT {
-	var RSL_Message rx_rsl;
 	var BSSAP_N_DATA_ind rx_di;
 	var DchanTuple dt;
 
@@ -688,15 +702,7 @@
 	BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
 
 	/* expect BSC to disable the channel */
-	rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
-	/* respond with CHAN REL ACK */
-	f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
-
-	/* expect Clear Complete from BSC */
-	BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete));
-
-	/* release the SCCP connection */
-	BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
+	f_exp_chan_rel_and_clear(dt, 0);
 
 	/* wait for SCCP emulation to do its job */
 	f_sleep(1.0);
@@ -707,7 +713,6 @@
 /* Test behavior of channel release after CONN FAIL IND from BTS */
 testcase TC_chan_rel_conn_fail() runs on test_CT {
 	var BSSAP_N_DATA_ind rx_di;
-	var RSL_Message rx_rsl;
 	var DchanTuple dt;
 
 	f_init(1);
@@ -726,15 +731,7 @@
 	BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
 
 	/* expect BSC to disable the channel */
-	rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
-	/* respond with CHAN REL ACK */
-	f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
-
-	/* expect Clear Complete from BSC */
-	BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete));
-
-	/* release the SCCP connection */
-	BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
+	f_exp_chan_rel_and_clear(dt, 0);
 
 	/* wait for SCCP emulation to do its job */
 	f_sleep(1.0);
@@ -2092,7 +2089,6 @@
 	var integer i;
 	var DchanTuple dt;
 	var BSSAP_N_DATA_ind rx_di;
-	var RSL_Message rx_rsl;
 	var myBSSMAP_Cause cause_val := GSM0808_CAUSE_CALL_CONTROL;
 	var BssmapCause cause := enum2int(cause_val);
 
@@ -2120,15 +2116,7 @@
 		BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
 
 		/* expect BSC to disable the channel */
-		rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
-		/* respond with CHAN REL ACK */
-		f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
-
-		/* expect Clear Complete from BSC */
-		BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete));
-
-		/* MSC disconnects as instructed. */
-		BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
+		f_exp_chan_rel_and_clear(dt, 0);
 	}
 
 	/* In the buggy behavior, a timeout of 2 seconds happens between above
@@ -2148,7 +2136,6 @@
 	var integer i;
 	var DchanTuple dt;
 	var BSSAP_N_DATA_ind rx_di;
-	var RSL_Message rx_rsl;
 	var integer j;
 
 	f_init();
@@ -2182,15 +2169,7 @@
 		BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));
 
 		/* expect BSC to disable the channel */
-		rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
-		/* respond with CHAN REL ACK */
-		f_ipa_tx(0, ts_RSL_RF_CHAN_REL_ACK(dt.rsl_chan_nr));
-
-		/* expect Clear Complete from BSC */
-		BSSAP.receive(tr_BSSAP_DATA_ind(dt.sccp_conn_id, tr_BSSMAP_ClearComplete));
-
-		/* MSC disconnects as instructed. */
-		BSSAP.send(ts_BSSAP_DISC_req(dt.sccp_conn_id, 0));
+		f_exp_chan_rel_and_clear(dt, 0);
 	}
 
 	/* In the buggy behavior, a timeout of 2 seconds happens between above