<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18932">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Osmocom_CTRL_Functions: add: retrieve and verify rate counters in bulk<br><br>First user will be new MSC pooling tests in ttcn3-bsc-test, see<br>I2006f1def5352b4b73d0159bfcaa2da9c64bfe3f.<br><br>Change-Id: Ief0d9b096feeee7d37b5f2429dd3e80de0161806<br>---<br>M library/Osmocom_CTRL_Functions.ttcn<br>1 file changed, 113 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/32/18932/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/Osmocom_CTRL_Functions.ttcn b/library/Osmocom_CTRL_Functions.ttcn</span><br><span>index 22ed405..804a4f5 100644</span><br><span>--- a/library/Osmocom_CTRL_Functions.ttcn</span><br><span>+++ b/library/Osmocom_CTRL_Functions.ttcn</span><br><span>@@ -148,4 +148,117 @@</span><br><span>       }</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%);">+     * BSC_Tests.ttcn shows a nice way to conveniently shorten the code needed to use these functions, see</span><br><span style="color: hsl(120, 100%, 40%);">+         * f_ctrs_msc_init() and f_ctrs_msc_expect().</span><br><span style="color: hsl(120, 100%, 40%);">+  *</span><br><span style="color: hsl(120, 100%, 40%);">+     * Here also a full usage example:</span><br><span style="color: hsl(120, 100%, 40%);">+     *</span><br><span style="color: hsl(120, 100%, 40%);">+     * const CounterNameVals my_counternames := {</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:attach_lost", 0 },</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%);">+     * var CounterNameValsList my_counters := f_counter_name_vals_get_n(instance_name := "msc", instance_count := 3, counternames := my_counternames);</span><br><span style="color: hsl(120, 100%, 40%);">+   *</span><br><span style="color: hsl(120, 100%, 40%);">+     * // run some tests that increment rate counters in the program,</span><br><span style="color: hsl(120, 100%, 40%);">+      * // and increment expected counters accordingly:</span><br><span style="color: hsl(120, 100%, 40%);">+     * my_counters := f_counter_name_vals_list_add(my_counters, instance_nr := 1, "mscpool:subscr:new", 7);</span><br><span style="color: hsl(120, 100%, 40%);">+      * my_counters := f_counter_name_vals_list_add(my_counters, instance_nr := 2, "mscpool:subscr:attach_lost", 3);</span><br><span style="color: hsl(120, 100%, 40%);">+      *</span><br><span style="color: hsl(120, 100%, 40%);">+     * // verify that the program reflects the expected counters:</span><br><span style="color: hsl(120, 100%, 40%);">+  * f_counter_name_vals_expect_n(instance_name := "msc", my_counters);</span><br><span style="color: hsl(120, 100%, 40%);">+        *</span><br><span style="color: hsl(120, 100%, 40%);">+     * // run some more tests...</span><br><span style="color: hsl(120, 100%, 40%);">+   * my_counters := f_counter_name_vals_list_add(my_counters, instance_nr := 0, "mscpool:subscr:known");</span><br><span style="color: hsl(120, 100%, 40%);">+       * // and verify again</span><br><span style="color: hsl(120, 100%, 40%);">+         * f_counter_name_vals_expect_n(instance_name := "msc", my_counters);</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%);">+ /* 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%);">+     */</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%);">+ /* Retrieve one instance's rate counter values of the given names. */</span><br><span style="color: hsl(120, 100%, 40%);">+     function f_counter_name_vals_get(IPA_CTRL_PT pt, charstring instance_name, integer instance_nr, CounterNameVals counternames) 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(pt, 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%);">+   /* Retrieve the first N instances' rate counter values of the given names */</span><br><span style="color: hsl(120, 100%, 40%);">+      function f_counter_name_vals_get_n(IPA_CTRL_PT pt, charstring instance_name := "msc", integer instance_count, CounterNameVals counternames) 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(pt, 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: ", instance_name, ": ", 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%);">+   /* In a list of one instance's counters, increment a specifically named counter. */</span><br><span style="color: hsl(120, 100%, 40%);">+       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%);">+   /* In a list of several instances' counters, increment a specific instance's specifically named counter. */</span><br><span style="color: hsl(120, 100%, 40%);">+   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%);">+   /* For a specific instance, call f_counter_name_vals_get() and compare with expected counter values.</span><br><span style="color: hsl(120, 100%, 40%);">+   * Set the test verdict accordingly. */</span><br><span style="color: hsl(120, 100%, 40%);">+       function f_counter_name_vals_expect(IPA_CTRL_PT pt, charstring instance_name, integer instance_nr, CounterNameVals vals) {</span><br><span style="color: hsl(120, 100%, 40%);">+            var CounterNameVals now := f_counter_name_vals_get(pt, 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%);">+   /* For N instances, call f_counter_name_vals_get() and compare with expected counter values.</span><br><span style="color: hsl(120, 100%, 40%);">+   * Set the test verdict accordingly. The number of instances is given by lengthof(valslist). */</span><br><span style="color: hsl(120, 100%, 40%);">+       function f_counter_name_vals_expect_n(IPA_CTRL_PT pt, charstring instance_name, CounterNameValsList valslist) {</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(pt, 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> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18932">change 18932</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/+/18932"/><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: Ief0d9b096feeee7d37b5f2429dd3e80de0161806 </div>
<div style="display:none"> Gerrit-Change-Number: 18932 </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>