BTS: reproduce a race condition described in OS#5245
Change-Id: I3b602ac9dbe0ab3e80eb30de573c9b48a79872d8
Depends: Idb1ef445bc14a6312f08a83ecacc3a938b0e1d70
Related: OS#5245
diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index 44d9de4..6753eec 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -6281,6 +6281,72 @@
vc_conn.done;
}
+/* Reproduce a race condition described in OS#5245 */
+private function f_rsl_chan_act_deact(charstring id) runs on ConnHdlr {
+ f_rsl_chan_act(g_pars.chan_mode);
+ f_sleep(1.0);
+ f_rsl_chan_deact();
+ setverdict(pass);
+}
+testcase TC_dyn_osmo_pdch_tchh_race_act() runs on test_CT {
+ var ConnHdlrPars pars[2];
+ var ConnHdlr vc_conn[2];
+ var TrxcMessage rsp;
+
+ f_init();
+
+ /* Configure an artificial delay of 200 ms for TRXC RSP messages */
+ rsp := f_TRXC_transceive(BTS_TRXC, g_bts_trxc_conn_id,
+ ts_TRXC_FAKE_TRXC_DELAY(200));
+
+ /* Activate all sub-channels of TCH/H on TS4 immediately in hope that the second
+ * CHANnel ACTIVation message will be handled before the PHY responds to 'SETSLOT' */
+ for (var integer i := 0; i < sizeof(pars); i := i + 1) {
+ /* TS4 is an Osmocom style dynamic timeslot, we want it to be TCH/H */
+ pars[i] := valueof(t_Pars(t_RslChanNr_Lm(4, i), ts_RSL_ChanMode_SIGN));
+ vc_conn[i] := f_start_handler(refers(f_rsl_chan_act_deact),
+ pars[i], l1ctl := false);
+ }
+
+ /* Wait for all components to finish */
+ for (var integer i := 0; i < sizeof(pars); i := i + 1) {
+ vc_conn[i].done;
+ }
+
+ /* Disable the artificial delay for TRXC RSP messages */
+ rsp := f_TRXC_transceive(BTS_TRXC, g_bts_trxc_conn_id,
+ ts_TRXC_FAKE_TRXC_DELAY(0));
+}
+testcase TC_dyn_osmo_pdch_sdcch8_race_act() runs on test_CT {
+ var ConnHdlrPars pars[8];
+ var ConnHdlr vc_conn[8];
+ var TrxcMessage rsp;
+
+ f_init();
+
+ /* Configure an artificial delay of 200 ms for TRXC RSP messages */
+ rsp := f_TRXC_transceive(BTS_TRXC, g_bts_trxc_conn_id,
+ ts_TRXC_FAKE_TRXC_DELAY(200));
+
+ /* Activate all sub-channels of SDCCH/8 on TS4 immediately in hope that subsequent
+ * CHANnel ACTIVation messages will be handled before the PHY responds to 'SETSLOT' */
+ for (var integer i := 0; i < sizeof(pars); i := i + 1) {
+ /* TS4 is an Osmocom style dynamic timeslot, we want it to be SDCCH/8 */
+ pars[i] := valueof(t_Pars(t_RslChanNr_SDCCH8(4, i), ts_RSL_ChanMode_SIGN));
+ vc_conn[i] := f_start_handler(refers(f_rsl_chan_act_deact),
+ pars[i], l1ctl := false);
+ }
+
+ /* Wait for all components to finish */
+ for (var integer i := 0; i < sizeof(pars); i := i + 1) {
+ vc_conn[i].done;
+ }
+
+ /* Disable the artificial delay for TRXC RSP messages */
+ rsp := f_TRXC_transceive(BTS_TRXC, g_bts_trxc_conn_id,
+ ts_TRXC_FAKE_TRXC_DELAY(0));
+}
+
/***********************************************************************
* IPA Style Dynamic Timeslot Support
***********************************************************************/
@@ -7915,6 +7981,8 @@
execute( TC_dyn_osmo_pdch_tchf_act() );
execute( TC_dyn_osmo_pdch_tchh_act() );
execute( TC_dyn_osmo_pdch_sdcch8_act() );
+ execute( TC_dyn_osmo_pdch_tchh_race_act() );
+ execute( TC_dyn_osmo_pdch_sdcch8_race_act() );
execute( TC_dyn_ipa_pdch_tchf_act() );
execute( TC_dyn_ipa_pdch_tchf_act_pdch_act_nack() );