bsc: add TC_mscpool_sccp_n_pcstate_detaches_msc

Related: SYS#6319 OS#5917
Related: I3a0869598b8395601a16d78dbc46eec400c0ea84 (osmo-bsc)
Change-Id: Ia1aea4e33230d6a685b72ea5ba20dd9c7d265d44
diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn
index bfab0fa..39c82ab 100644
--- a/bsc/BSC_Tests.ttcn
+++ b/bsc/BSC_Tests.ttcn
@@ -9161,6 +9161,50 @@
 	f_shutdown_helper();
 }
 
+/* When an MSC point-code gets an SCCP N-PCSTATE saying it is unreachable, immediately mark the MSC as unusable. */
+testcase TC_mscpool_sccp_n_pcstate_detaches_msc() runs on test_CT {
+
+	f_init(nr_bts := 3, handler_mode := true, nr_msc := 2);
+	f_sleep(1.0);
+
+	/* Control which MSC gets chosen next by the round-robin, otherwise
+	 * would be randomly affected by which other tests ran before this. */
+	f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");
+
+	f_ctrs_msc_init();
+
+	var MSC_ConnHdlr vc_conn1;
+	var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);
+	pars1.mscpool.rsl_idx := 0;
+	pars1.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_IMSI_LV('001010000000001'H)), '00F110'O));
+	vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);
+	vc_conn1.done;
+	f_ctrs_msc_expect(0, "mscpool:subscr:new");
+
+	var MSC_ConnHdlr vc_conn2;
+	var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);
+	pars2.mscpool.rsl_idx := 1;
+	pars2.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, valueof(ts_MI_IMSI_LV('001010000000002'H))));
+	vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);
+	vc_conn2.done;
+	f_ctrs_msc_expect(1, "mscpool:subscr:new");
+
+	f_logp(BSCVTY, "disconnecting msc0");
+	/* Disconnect the first MSC */
+	f_ran_adapter_cleanup(g_bssap[0]);
+
+	/* Now round-robin would wrap to the first MSC, but since the first MSC is disconnected, it wraps around to msc
+	 * 2 again. */
+	var MSC_ConnHdlr vc_conn3;
+	var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 1);
+	pars3.mscpool.rsl_idx := 2;
+	pars3.mscpool.l3_info := valueof(ts_PAG_RESP(valueof(ts_MI_IMSI_LV('001010000000003'H))));
+	vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);
+	vc_conn3.done;
+	f_ctrs_msc_expect(1, "mscpool:subscr:new");
+	f_shutdown_helper();
+}
+
 /* Allow/Deny emergency calls globally via VTY */
 private function f_vty_allow_emerg_msc(boolean allow) runs on test_CT {
 	f_vty_enter_cfg_msc(BSCVTY, 0);
@@ -12463,6 +12507,8 @@
 		execute( TC_mscpool_paging_and_response_tmsi() );
 		execute( TC_mscpool_no_allow_attach_round_robin() );
 		execute( TC_mscpool_no_allow_attach_valid_nri() );
+
+		execute( TC_mscpool_sccp_n_pcstate_detaches_msc() );
 	}
 
 	execute( TC_early_conn_fail() );