<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18876">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: MSC pooling: also test rate counters<br><br>Add some generic ways of checking rate counters in bulk, and use that to verify<br>the MSC pool rate counters.  This nicely also verifies the intended effect of<br>each test in detail.<br><br>Depends: I2ded757958dfa62b502efbab765203bcadf899e2 (osmo-bsc)<br>Change-Id: I2006f1def5352b4b73d0159bfcaa2da9c64bfe3f<br>---<br>M bsc/BSC_Tests.ttcn<br>1 file changed, 191 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/76/18876/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn</span><br><span>index 78fc8ec..0980e1f 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -75,6 +75,31 @@</span><br><span>    IPA_Client rsl</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* One counter value, e.g. { "name", 23 } */</span><br><span style="color: hsl(120, 100%, 40%);">+type record CounterNameVal {</span><br><span style="color: hsl(120, 100%, 40%);">+ charstring name,</span><br><span style="color: hsl(120, 100%, 40%);">+      integer val</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* List of one instance's counters,</span><br><span style="color: hsl(120, 100%, 40%);">+ * e.g. { {"foo",23}, {"bar",42} }</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+type record of CounterNameVal CounterNameVals;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* List of numerous instances' counters,</span><br><span style="color: hsl(120, 100%, 40%);">+ * e.g. { { {"foo",23}, {"bar",42} },</span><br><span style="color: hsl(120, 100%, 40%);">+ *        { {"foo",23}, {"bar",42} } } */</span><br><span style="color: hsl(120, 100%, 40%);">+type record of CounterNameVals CounterNameValsList;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Default list of counters for an 'msc' entity. */</span><br><span style="color: hsl(120, 100%, 40%);">+const CounterNameVals counternames_msc_mscpool := {</span><br><span style="color: hsl(120, 100%, 40%);">+     { "mscpool:subscr:new", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "mscpool:subscr:known", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      { "mscpool:subscr:reattach", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+   { "mscpool:subscr:attach_lost", 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+        { "mscpool:subscr:paged", 0 }</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> type component test_CT extends CTRL_Adapter_CT {</span><br><span>    /* Array of per-BTS state */</span><br><span>         var BTS_State bts[NUM_BTS];</span><br><span>@@ -107,6 +132,7 @@</span><br><span>    /* global test case guard timer */</span><br><span>   timer T_guard := 30.0;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    var CounterNameValsList g_ctr_msc;</span><br><span> }</span><br><span> </span><br><span> modulepar {</span><br><span>@@ -179,6 +205,105 @@</span><br><span>   return pars;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Retrieve and verify rate counter values in bulk */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_counter_name_vals_add(CounterNameVals vals, charstring countername, integer val := 1) return CounterNameVals{</span><br><span style="color: hsl(120, 100%, 40%);">+      for (var integer i := 0; i < lengthof(vals); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (vals[i].name == countername) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    vals[i].val := vals[i].val + val;</span><br><span style="color: hsl(120, 100%, 40%);">+                     return vals;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     /* name not found, append */</span><br><span style="color: hsl(120, 100%, 40%);">+  vals[lengthof(vals)] := {</span><br><span style="color: hsl(120, 100%, 40%);">+             name := countername,</span><br><span style="color: hsl(120, 100%, 40%);">+          val := val</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     return vals;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_counter_name_vals_list_add(CounterNameValsList vals, integer idx, charstring countername, integer val := 1) return CounterNameValsList {</span><br><span style="color: hsl(120, 100%, 40%);">+        vals[idx] := f_counter_name_vals_add(vals[idx], countername, val);</span><br><span style="color: hsl(120, 100%, 40%);">+    return vals;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_counter_name_vals_get(charstring instance_name, integer instance_nr, CounterNameVals counternames := counternames_msc_mscpool) runs on test_CT return CounterNameVals {</span><br><span style="color: hsl(120, 100%, 40%);">+ var CounterNameVals vals;</span><br><span style="color: hsl(120, 100%, 40%);">+     for (var integer i := 0; i < lengthof(counternames); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vals[i] := {</span><br><span style="color: hsl(120, 100%, 40%);">+                  name := counternames[i].name,</span><br><span style="color: hsl(120, 100%, 40%);">+                 val := f_ctrl_get_ratectr_abs(IPA_CTRL, instance_name, instance_nr, counternames[i].name)</span><br><span style="color: hsl(120, 100%, 40%);">+             };</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     return vals;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_counter_name_vals_get_n(charstring instance_name := "msc", integer instance_count := NUM_MSC, CounterNameVals counternames := counternames_msc_mscpool) runs on test_CT return CounterNameValsList {</span><br><span style="color: hsl(120, 100%, 40%);">+  var CounterNameValsList valslist;</span><br><span style="color: hsl(120, 100%, 40%);">+     for (var integer instance_nr := 0; instance_nr < instance_count; instance_nr := instance_nr + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         valslist[instance_nr] := f_counter_name_vals_get(instance_name, instance_nr, counternames);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     log("retrieved rate counters: ", valslist);</span><br><span style="color: hsl(120, 100%, 40%);">+ return valslist;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_counter_name_vals_expect(charstring instance_name, integer instance_nr, CounterNameVals vals) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+     var CounterNameVals now := f_counter_name_vals_get(instance_name, instance_nr, vals);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (var integer i := 0; i < lengthof(vals); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (now[i].name != vals[i].name) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    setverdict(fail, "Internal error");</span><br><span style="color: hsl(120, 100%, 40%);">+         }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (now[i].val != vals[i].val) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      setverdict(fail, "Rate counter mismatch: ", instance_name, " ", instance_nr, " ", vals[i].name, " is at ", now[i].val, " but expected ", vals[i].val);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_counter_name_vals_expect_n(charstring instance_name, CounterNameValsList valslist) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       for (var integer instance_nr := 0; instance_nr < lengthof(valslist); instance_nr := instance_nr + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+             f_counter_name_vals_expect(instance_name, instance_nr, valslist[instance_nr]);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Convenience functions for rate counters using g_ctr_msc. */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_ctrs_msc_init(integer mscs_count := NUM_MSC, CounterNameVals counternames := counternames_msc_mscpool) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       g_ctr_msc := f_counter_name_vals_get_n("msc", mscs_count, counternames);</span><br><span style="color: hsl(120, 100%, 40%);">+    log("initial msc rate counters: ", g_ctr_msc);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_ctrs_msc_add(integer msc_nr, charstring countername, integer val := 1) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+    g_ctr_msc := f_counter_name_vals_list_add(g_ctr_msc, msc_nr, countername, val);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_thing(on_msc := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_thing(on_msc := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_other(on_msc := 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_ctrs_msc_add(0, "thing", 2);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_ctrs_msc_add(1, "other");</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_ctrs_msc_verify();</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_ctrs_msc_verify() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        log("verifying msc rate counters: ", g_ctr_msc);</span><br><span style="color: hsl(120, 100%, 40%);">+    f_counter_name_vals_expect_n("msc", g_ctr_msc);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* convenience: f_ctrs_msc_add() and f_ctrs_msc_verify() in one call.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_thing(on_msc := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_thing(on_msc := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_do_thing(on_msc := 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ *  f_ctrs_msc_expect(0, "thing", 3);</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_ctrs_msc_expect(integer msc_nr, charstring countername, integer val := 1) runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_ctrs_msc_add(msc_nr, countername, val);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_ctrs_msc_verify();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> private function f_shutdown_helper() runs on test_CT {</span><br><span>        all component.stop;</span><br><span>  setverdict(pass);</span><br><span>@@ -4590,8 +4715,13 @@</span><br><span>   f_sleep(1.0);</span><br><span>        var MSC_ConnHdlr vc_conn;</span><br><span>    var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         vc_conn := f_start_handler(refers(f_tc_mscpool_L3Compl_on_1_msc), pars);</span><br><span>     vc_conn.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_ctrs_msc_expect(0, "mscpool:subscr:new", 4);</span><br><span> }</span><br><span> </span><br><span> /* Three Layer 3 Complete by IMSI are round-robin'ed across two connected MSCs */</span><br><span>@@ -4606,12 +4736,15 @@</span><br><span>          * would be randomly affected by which other tests ran before this. */</span><br><span>       f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span>    pars1.mscpool.rsl_idx := 0;</span><br><span>  pars1.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_IMSI_LV('001010000000001'H)), '00F110'O));</span><br><span>     vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span>   vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:new");</span><br><span> </span><br><span>    var MSC_ConnHdlr vc_conn2;</span><br><span>   var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span>@@ -4619,6 +4752,7 @@</span><br><span>    pars2.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, valueof(ts_MI_IMSI_LV('001010000000002'H))));</span><br><span>       vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span>   vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(1, "mscpool:subscr:new");</span><br><span> </span><br><span>    /* Test round-robin wrap to the first MSC */</span><br><span>         var MSC_ConnHdlr vc_conn3;</span><br><span>@@ -4627,6 +4761,7 @@</span><br><span>   pars3.mscpool.l3_info := valueof(ts_PAG_RESP(valueof(ts_MI_IMSI_LV('001010000000003'H))));</span><br><span>   vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span>   vc_conn3.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:new");</span><br><span> }</span><br><span> </span><br><span> /* Three LU by TMSI are round-robin'ed across two connected MSCs, because they contain the NULL-NRI 0</span><br><span>@@ -4642,12 +4777,15 @@</span><br><span>         * would be randomly affected by which other tests ran before this. */</span><br><span>       f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span>    pars1.mscpool.rsl_idx := 0;</span><br><span>  pars1.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(0)), '00F110'O));</span><br><span>  vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span>   vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:reattach");</span><br><span> </span><br><span>       var MSC_ConnHdlr vc_conn2;</span><br><span>   var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span>@@ -4655,6 +4793,7 @@</span><br><span>    pars2.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(0)), '00F110'O));</span><br><span>  vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span>   vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(1, "mscpool:subscr:reattach");</span><br><span> </span><br><span>       /* Test round-robin wrap to the first MSC */</span><br><span>         var MSC_ConnHdlr vc_conn3;</span><br><span>@@ -4663,6 +4802,7 @@</span><br><span>   pars3.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(0)), '00F110'O));</span><br><span>  vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span>   vc_conn3.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:reattach");</span><br><span> }</span><br><span> </span><br><span> /* Three LU by TMSI are round-robin'ed across two connected MSCs, because they contain the NULL-NRI 1</span><br><span>@@ -4679,12 +4819,15 @@</span><br><span>    * would be randomly affected by which other tests ran before this. */</span><br><span>       f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span>    pars1.mscpool.rsl_idx := 0;</span><br><span>  pars1.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(1)), '00F110'O));</span><br><span>  vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span>   vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:reattach");</span><br><span> </span><br><span>       var MSC_ConnHdlr vc_conn2;</span><br><span>   var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span>@@ -4692,6 +4835,7 @@</span><br><span>    pars2.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(1)), '00F110'O));</span><br><span>  vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span>   vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(1, "mscpool:subscr:reattach");</span><br><span> </span><br><span>       /* Test round-robin wrap to the first MSC */</span><br><span>         var MSC_ConnHdlr vc_conn3;</span><br><span>@@ -4700,6 +4844,7 @@</span><br><span>   pars3.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(1)), '00F110'O));</span><br><span>  vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span>   vc_conn3.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:reattach");</span><br><span> }</span><br><span> </span><br><span> /* Three Layer 3 Complete by TMSI are round-robin'ed across two connected MSCs, because they contain an NRI not</span><br><span>@@ -4715,6 +4860,8 @@</span><br><span>    * would be randomly affected by which other tests ran before this. */</span><br><span>       f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span>    pars1.mscpool.rsl_idx := 0;</span><br><span>@@ -4722,6 +4869,7 @@</span><br><span>  pars1.mscpool.l3_info := valueof(ts_ML3_MO_MM_IMSI_DET_Ind(valueof(ts_MI_TMSI_NRI_LV(1023))));</span><br><span>       vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span>   vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:new");</span><br><span> </span><br><span>    var MSC_ConnHdlr vc_conn2;</span><br><span>   var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span>@@ -4730,6 +4878,7 @@</span><br><span>    pars2.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(768)), '00F110'O));</span><br><span>        vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span>   vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(1, "mscpool:subscr:new");</span><br><span> </span><br><span>    /* Test round-robin wrap to the first MSC */</span><br><span>         var MSC_ConnHdlr vc_conn3;</span><br><span>@@ -4739,6 +4888,7 @@</span><br><span>   pars3.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_SS_ACT, valueof(ts_MI_TMSI_NRI_LV(819))));</span><br><span>   vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span>   vc_conn3.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:new");</span><br><span> }</span><br><span> </span><br><span> /* Three Layer 3 Complete by TMSI are round-robin'ed across two connected MSCs, because they contain an NRI</span><br><span>@@ -4754,6 +4904,8 @@</span><br><span>     * would be randomly affected by which other tests ran before this. */</span><br><span>       f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span>    pars1.mscpool.rsl_idx := 0;</span><br><span>@@ -4761,6 +4913,9 @@</span><br><span>  pars1.mscpool.l3_info := valueof(ts_PAG_RESP(valueof(ts_MI_TMSI_NRI_LV(512))));</span><br><span>      vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span>   vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_add(2, "mscpool:subscr:attach_lost");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ctrs_msc_add(0, "mscpool:subscr:new");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ctrs_msc_verify();</span><br><span> </span><br><span>     var MSC_ConnHdlr vc_conn2;</span><br><span>   var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span>@@ -4769,6 +4924,9 @@</span><br><span>    pars2.mscpool.l3_info := valueof(ts_ML3_MO_MM_IMSI_DET_Ind(valueof(ts_MI_TMSI_NRI_LV(767))));</span><br><span>        vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span>   vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_add(2, "mscpool:subscr:attach_lost");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ctrs_msc_add(1, "mscpool:subscr:new");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ctrs_msc_verify();</span><br><span> </span><br><span>     /* Test round-robin wrap to the first MSC */</span><br><span>         var MSC_ConnHdlr vc_conn3;</span><br><span>@@ -4778,6 +4936,9 @@</span><br><span>   pars3.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(750)), '00F110'O));</span><br><span>        vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span>   vc_conn3.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_add(2, "mscpool:subscr:attach_lost");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ctrs_msc_add(0, "mscpool:subscr:new");</span><br><span style="color: hsl(120, 100%, 40%);">+    f_ctrs_msc_verify();</span><br><span> }</span><br><span> </span><br><span> /* Three Layer 3 Complete by TMSI with valid NRI for the second MSC are all directed to the second MSC (configured in</span><br><span>@@ -4793,6 +4954,8 @@</span><br><span>        * this is not using round-robin. */</span><br><span>         f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span>    pars1.mscpool.rsl_idx := 0;</span><br><span>@@ -4800,6 +4963,7 @@</span><br><span>  pars1.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_SMS, valueof(ts_MI_TMSI_NRI_LV(256))));</span><br><span>   vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span>   vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(1, "mscpool:subscr:known");</span><br><span> </span><br><span>  var MSC_ConnHdlr vc_conn2;</span><br><span>   var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span>@@ -4808,6 +4972,7 @@</span><br><span>    pars2.mscpool.l3_info := valueof(ts_PAG_RESP(valueof(ts_MI_TMSI_NRI_LV(260))));</span><br><span>      vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span>   vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(1, "mscpool:subscr:known");</span><br><span> </span><br><span>  var MSC_ConnHdlr vc_conn3;</span><br><span>   var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span>@@ -4816,6 +4981,7 @@</span><br><span>    pars3.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(511)), '00F110'O));</span><br><span>        vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span>   vc_conn3.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(1, "mscpool:subscr:known");</span><br><span> }</span><br><span> </span><br><span> /* Layer 3 Complete by TMSI with valid NRI for the third MSC are directed to the third MSC (configured in osmo-bsc.cfg),</span><br><span>@@ -4831,6 +4997,8 @@</span><br><span>          * this is not using round-robin. */</span><br><span>         f_vty_transceive(BSCVTY, "mscpool roundrobin next 1");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 2);</span><br><span>    pars1.mscpool.rsl_idx := 0;</span><br><span>@@ -4838,6 +5006,7 @@</span><br><span>  pars1.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_SMS, valueof(ts_MI_TMSI_NRI_LV(512))));</span><br><span>   vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span>   vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(2, "mscpool:subscr:known");</span><br><span> </span><br><span>  var MSC_ConnHdlr vc_conn2;</span><br><span>   var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 2);</span><br><span>@@ -4846,6 +5015,7 @@</span><br><span>    pars2.mscpool.l3_info := valueof(ts_PAG_RESP(valueof(ts_MI_TMSI_NRI_LV(678))));</span><br><span>      vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span>   vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(2, "mscpool:subscr:known");</span><br><span> </span><br><span>  /* The above forwardings to third MSC have not affected the round robin, which still points at the second MSC */</span><br><span>     var MSC_ConnHdlr vc_conn3;</span><br><span>@@ -4854,6 +5024,7 @@</span><br><span>   pars3.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_IMSI_LV('001010000000013'H)), '00F110'O));</span><br><span>     vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span>   vc_conn3.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(1, "mscpool:subscr:new");</span><br><span> }</span><br><span> </span><br><span> /* LU with a TMSI but indicating a different PLMN in its previous LAI: ignore the NRI. */</span><br><span>@@ -4868,6 +5039,8 @@</span><br><span>   * instead, and hits msc 0. */</span><br><span>       f_vty_transceive(BSCVTY, "mscpool roundrobin next 0");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /* An NRI of the second MSC's range (256-511), but a PLMN that doesn't match with osmo-bsc.cfg */</span><br><span>    var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span>@@ -4875,6 +5048,7 @@</span><br><span>    pars1.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(260)), '99F999'O));</span><br><span>        vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span>   vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:new");</span><br><span> </span><br><span>    /* An NRI of the third MSC's range (512-767) and a matching PLMN gets directed by NRI. */</span><br><span>        var MSC_ConnHdlr vc_conn2;</span><br><span>@@ -4883,6 +5057,7 @@</span><br><span>   pars2.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_TMSI_NRI_LV(555)), '00F110'O));</span><br><span>        vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span>   vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(2, "mscpool:subscr:known");</span><br><span> }</span><br><span> </span><br><span> /* Make sure that whichever MSC paged a subscriber will also get the Paging Response. Page by IMSI, which would be</span><br><span>@@ -4923,6 +5098,8 @@</span><br><span>        * second MSC to make sure we're getting the Paging logic, not a coincidental round robin match. */</span><br><span>      f_vty_transceive(BSCVTY, "mscpool roundrobin next 1");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span>    pars1.mscpool.rsl_idx := 0;</span><br><span>@@ -4930,6 +5107,7 @@</span><br><span>  pars1.mscpool.sccp_addr_msc := g_bssap[pars1.mscpool.bssap_idx].sccp_addr_own;</span><br><span>       vc_conn1 := f_start_handler(refers(f_tc_mscpool_paging_imsi), pars1);</span><br><span>        vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:paged");</span><br><span> }</span><br><span> </span><br><span> /* Make sure that whichever MSC paged a subscriber will also get the Paging Response.  Page by TMSI with an NRI value</span><br><span>@@ -4972,6 +5150,8 @@</span><br><span>     * third MSC to make sure we're getting the Paging logic, not a coincidental round robin match. */</span><br><span>       f_vty_transceive(BSCVTY, "mscpool roundrobin next 2");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span>    pars1.mscpool.rsl_idx := 0;</span><br><span>@@ -4979,6 +5159,7 @@</span><br><span>  pars1.mscpool.sccp_addr_msc := g_bssap[pars1.mscpool.bssap_idx].sccp_addr_own;</span><br><span>       vc_conn1 := f_start_handler(refers(f_tc_mscpool_paging_tmsi), pars1);</span><br><span>        vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:paged");</span><br><span> }</span><br><span> </span><br><span> /* For round-robin, skip an MSC that has 'no allow-attach' set. */</span><br><span>@@ -4999,12 +5180,15 @@</span><br><span>     f_vty_transceive(BSCVTY, "exit");</span><br><span>  f_vty_transceive(BSCVTY, "exit");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span>    pars1.mscpool.rsl_idx := 0;</span><br><span>  pars1.mscpool.l3_info := valueof(ts_LU_REQ(LU_Type_IMSI_Attach, valueof(ts_MI_IMSI_LV('001010000000001'H)), '00F110'O));</span><br><span>     vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span>   vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:new");</span><br><span> </span><br><span>    var MSC_ConnHdlr vc_conn2;</span><br><span>   var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 2);</span><br><span>@@ -5012,6 +5196,7 @@</span><br><span>    pars2.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, valueof(ts_MI_IMSI_LV('001010000000002'H))));</span><br><span>       vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span>   vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(2, "mscpool:subscr:new");</span><br><span> </span><br><span>    var MSC_ConnHdlr vc_conn3;</span><br><span>   var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span>@@ -5019,6 +5204,7 @@</span><br><span>    pars3.mscpool.l3_info := valueof(ts_PAG_RESP(valueof(ts_MI_IMSI_LV('001010000000003'H))));</span><br><span>   vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span>   vc_conn3.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:new");</span><br><span> </span><br><span>    f_vty_enter_cfg_msc(BSCVTY, 1);</span><br><span>      f_vty_transceive(BSCVTY, "allow-attach");</span><br><span>@@ -5043,6 +5229,8 @@</span><br><span>  f_vty_transceive(BSCVTY, "exit");</span><br><span>  f_vty_transceive(BSCVTY, "exit");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       f_ctrs_msc_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /* Round robin points at msc 0, but the valid NRI directs to msc 1, even though msc 1 has 'no allow-attach'. */</span><br><span>      var MSC_ConnHdlr vc_conn1;</span><br><span>   var TestHdlrParams pars1 := f_gen_test_hdlr_pars(bssap_idx := 1);</span><br><span>@@ -5051,6 +5239,7 @@</span><br><span>    pars1.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, valueof(ts_MI_TMSI_NRI_LV(260))));</span><br><span>  vc_conn1 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars1);</span><br><span>   vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(1, "mscpool:subscr:known");</span><br><span> </span><br><span>  var MSC_ConnHdlr vc_conn2;</span><br><span>   var TestHdlrParams pars2 := f_gen_test_hdlr_pars(bssap_idx := 0);</span><br><span>@@ -5058,6 +5247,7 @@</span><br><span>    pars2.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, valueof(ts_MI_IMSI_LV('001010000000002'H))));</span><br><span>       vc_conn2 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars2);</span><br><span>   vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(0, "mscpool:subscr:new");</span><br><span> </span><br><span>    var MSC_ConnHdlr vc_conn3;</span><br><span>   var TestHdlrParams pars3 := f_gen_test_hdlr_pars(bssap_idx := 2);</span><br><span>@@ -5065,6 +5255,7 @@</span><br><span>    pars3.mscpool.l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_MO_CALL, valueof(ts_MI_IMSI_LV('001010000000003'H))));</span><br><span>       vc_conn3 := f_start_handler(refers(f_tc_mscpool_compl_l3), pars3);</span><br><span>   vc_conn3.done;</span><br><span style="color: hsl(120, 100%, 40%);">+        f_ctrs_msc_expect(2, "mscpool:subscr:new");</span><br><span> </span><br><span>    f_vty_enter_cfg_msc(BSCVTY, 1);</span><br><span>      f_vty_transceive(BSCVTY, "allow-attach");</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18876">change 18876</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18876"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I2006f1def5352b4b73d0159bfcaa2da9c64bfe3f </div>
<div style="display:none"> Gerrit-Change-Number: 18876 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>