<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/26618">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">vty: add f_verify_talloc_count()<br><br>Counts talloc objects via VTY and waits for a specific object count.<br>Useful to test against leaks.<br><br>The intended use is to check against leakage of bsc_subscr and<br>gsm_subscriber_connection after each BSC_Tests.*, see patch in 'Related'<br>below.<br><br>Related: OS#5337<br>Related: I69d4c5c6f8d499bb7f0b96a48af045361433c57b (osmo-ttcn3-hacks)<br>Change-Id: Iafe720a4931270e868f40c4f623d10bb9c14dc80<br>---<br>M library/Osmocom_VTY_Functions.ttcn<br>1 file changed, 63 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/18/26618/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/library/Osmocom_VTY_Functions.ttcn b/library/Osmocom_VTY_Functions.ttcn</span><br><span>index 49f587d..083c70c 100644</span><br><span>--- a/library/Osmocom_VTY_Functions.ttcn</span><br><span>+++ b/library/Osmocom_VTY_Functions.ttcn</span><br><span>@@ -14,6 +14,7 @@</span><br><span>  import from Misc_Helpers all;</span><br><span>        import from TELNETasp_PortType all;</span><br><span>  import from Osmocom_Types all;</span><br><span style="color: hsl(120, 100%, 40%);">+        import from TCCConversion_Functions all;</span><br><span> </span><br><span>         modulepar {</span><br><span>          charstring mp_prompt_prefix := "OpenBSC";</span><br><span>@@ -226,4 +227,66 @@</span><br><span>   return "";</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+function f_strstr_count(in charstring str, in charstring sub_str) return integer</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    var integer count := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       var integer pos := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       while (true) {</span><br><span style="color: hsl(120, 100%, 40%);">+                var integer at := f_strstr(str, sub_str, pos);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (at < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             count := count + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+           pos := at + 1;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     return count;</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%);">+type record of charstring StrList;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Perform a 'show talloc-context' to get a count of the given object_strs that are still allocated.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Retry 'attempts' times until the actual talloc object count matches 'expect_count'.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Useful to ensure that no mem leaks remain after running a test. */</span><br><span style="color: hsl(120, 100%, 40%);">+function f_verify_talloc_count(TELNETasp_PT pt, StrList object_strs, integer expect_count := 0,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       integer attempts := 5, float wait_time := 3.0)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      var charstring show_cmd := "show talloc-context application full filter "</span><br><span style="color: hsl(120, 100%, 40%);">+   for (var integer i := 0; i < lengthof(object_strs); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+          var charstring obj_str := object_strs[i];</span><br><span style="color: hsl(120, 100%, 40%);">+             /* spaces confuse the VTY command */</span><br><span style="color: hsl(120, 100%, 40%);">+          obj_str := f_replaceEveryOccurenceOfSubstring(obj_str, " ", ".");</span><br><span style="color: hsl(120, 100%, 40%);">+         /* In the regexp, expect word start and word end to bound the obj name */</span><br><span style="color: hsl(120, 100%, 40%);">+             obj_str := "\\<" & obj_str & "\\>";</span><br><span style="color: hsl(120, 100%, 40%);">+         if (i > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       show_cmd := show_cmd & "\\|";</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+             show_cmd := show_cmd & obj_str;</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%);">+   while (attempts > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             attempts := attempts - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+             var charstring ret := f_vty_transceive_ret(pt, show_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           var boolean ok := true;</span><br><span style="color: hsl(120, 100%, 40%);">+               for (var integer i := 0; i < lengthof(object_strs); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  var charstring object_str := object_strs[i];</span><br><span style="color: hsl(120, 100%, 40%);">+                  var integer count := f_strstr_count(ret, object_str);</span><br><span style="color: hsl(120, 100%, 40%);">+                 log("talloc reports ", object_str, " x ", count, ", expecting ", expect_count);</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (count != expect_count) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          ok := false;</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%);">+             if (ok) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     return;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+             if (attempts == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             log("count mismatch, retrying in ", wait_time);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_sleep(wait_time);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     setverdict(fail, "talloc count mismatch");</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/+/26618">change 26618</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/+/26618"/><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: Iafe720a4931270e868f40c4f623d10bb9c14dc80 </div>
<div style="display:none"> Gerrit-Change-Number: 26618 </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>