<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/16669">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trx_toolkit/data_dump.py: rewrite unit tests to use unittest framework<br><br>Change-Id: I8b934c15ba96d856aa79d10bf296d1446f043dd1<br>---<br>M src/target/trx_toolkit/data_dump.py<br>A src/target/trx_toolkit/test_data_dump.py<br>2 files changed, 165 insertions(+), 145 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/trx_toolkit/data_dump.py b/src/target/trx_toolkit/data_dump.py</span><br><span>index b91408f..7c5452b 100644</span><br><span>--- a/src/target/trx_toolkit/data_dump.py</span><br><span>+++ b/src/target/trx_toolkit/data_dump.py</span><br><span>@@ -220,148 +220,3 @@</span><br><span>       def append_all(self, msgs):</span><br><span>          for msg in msgs:</span><br><span>                     self.append_msg(msg)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-# Regression tests</span><br><span style="color: hsl(0, 100%, 40%);">-if __name__ == '__main__':</span><br><span style="color: hsl(0, 100%, 40%);">-        from tempfile import TemporaryFile</span><br><span style="color: hsl(0, 100%, 40%);">-      from gsm_shared import *</span><br><span style="color: hsl(0, 100%, 40%);">-        import random</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   # Configure logging</span><br><span style="color: hsl(0, 100%, 40%);">-     log.basicConfig(level = log.DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-              format = "[%(levelname)s] %(filename)s:%(lineno)d %(message)s")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       # Create a temporary file</span><br><span style="color: hsl(0, 100%, 40%);">-       tf = TemporaryFile()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    # Create an instance of DATA dump manager</span><br><span style="color: hsl(0, 100%, 40%);">-       ddf = DATADumpFile(tf)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  # Generate two random bursts</span><br><span style="color: hsl(0, 100%, 40%);">-    burst_l12trx = []</span><br><span style="color: hsl(0, 100%, 40%);">-       burst_trx2l1 = []</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for i in range(0, GSM_BURST_LEN):</span><br><span style="color: hsl(0, 100%, 40%);">-               ubit = random.randint(0, 1)</span><br><span style="color: hsl(0, 100%, 40%);">-             burst_l12trx.append(ubit)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               sbit = random.randint(-127, 127)</span><br><span style="color: hsl(0, 100%, 40%);">-                burst_trx2l1.append(sbit)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       # Generate a basic list of random messages</span><br><span style="color: hsl(0, 100%, 40%);">-      log.info("Generating the reference messages")</span><br><span style="color: hsl(0, 100%, 40%);">- messages_ref = []</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for i in range(100):</span><br><span style="color: hsl(0, 100%, 40%);">-            # Create a message</span><br><span style="color: hsl(0, 100%, 40%);">-              if i % 2:</span><br><span style="color: hsl(0, 100%, 40%);">-                       msg = DATAMSG_L12TRX()</span><br><span style="color: hsl(0, 100%, 40%);">-                  msg.burst = burst_l12trx</span><br><span style="color: hsl(0, 100%, 40%);">-                else:</span><br><span style="color: hsl(0, 100%, 40%);">-                   msg = DATAMSG_TRX2L1()</span><br><span style="color: hsl(0, 100%, 40%);">-                  msg.burst = burst_trx2l1</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                # Randomize the header</span><br><span style="color: hsl(0, 100%, 40%);">-          msg.rand_hdr()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          # Append</span><br><span style="color: hsl(0, 100%, 40%);">-                messages_ref.append(msg)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        log.info("Adding the following messages to the capture:")</span><br><span style="color: hsl(0, 100%, 40%);">-     for msg in messages_ref[:3]:</span><br><span style="color: hsl(0, 100%, 40%);">-            log.info("%s: burst_len=%d"</span><br><span style="color: hsl(0, 100%, 40%);">-                   % (msg.desc_hdr(), len(msg.burst)))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     # Check single message appending</span><br><span style="color: hsl(0, 100%, 40%);">-        ddf.append_msg(messages_ref[0])</span><br><span style="color: hsl(0, 100%, 40%);">- ddf.append_msg(messages_ref[1])</span><br><span style="color: hsl(0, 100%, 40%);">- ddf.append_msg(messages_ref[2])</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- # Read the written messages back</span><br><span style="color: hsl(0, 100%, 40%);">-        messages_check = ddf.parse_all()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        log.info("Read the following messages back:")</span><br><span style="color: hsl(0, 100%, 40%);">- for msg in messages_check:</span><br><span style="color: hsl(0, 100%, 40%);">-              log.info("%s: burst_len=%d"</span><br><span style="color: hsl(0, 100%, 40%);">-                   % (msg.desc_hdr(), len(msg.burst)))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     # Expecting three messages</span><br><span style="color: hsl(0, 100%, 40%);">-      assert(len(messages_check) == 3)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        # Check the messages</span><br><span style="color: hsl(0, 100%, 40%);">-    for i in range(3):</span><br><span style="color: hsl(0, 100%, 40%);">-              # Compare common header parts and bursts</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(messages_check[i].burst == messages_ref[i].burst)</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(messages_check[i].fn == messages_ref[i].fn)</span><br><span style="color: hsl(0, 100%, 40%);">-              assert(messages_check[i].tn == messages_ref[i].tn)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              # Validate a message</span><br><span style="color: hsl(0, 100%, 40%);">-            messages_check[i].validate()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    log.info("Check append_msg(): OK")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    # Append the pending reference messages</span><br><span style="color: hsl(0, 100%, 40%);">- ddf.append_all(messages_ref[3:])</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        # Read the written messages back</span><br><span style="color: hsl(0, 100%, 40%);">-        messages_check = ddf.parse_all()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        # Check the final amount</span><br><span style="color: hsl(0, 100%, 40%);">-        assert(len(messages_check) == len(messages_ref))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        # Check the messages</span><br><span style="color: hsl(0, 100%, 40%);">-    for i in range(len(messages_check)):</span><br><span style="color: hsl(0, 100%, 40%);">-            # Compare common header parts and bursts</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(messages_check[i].burst == messages_ref[i].burst)</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(messages_check[i].fn == messages_ref[i].fn)</span><br><span style="color: hsl(0, 100%, 40%);">-              assert(messages_check[i].tn == messages_ref[i].tn)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              # Validate a message</span><br><span style="color: hsl(0, 100%, 40%);">-            messages_check[i].validate()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    log.info("Check append_all(): OK")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    # Check parse_msg()</span><br><span style="color: hsl(0, 100%, 40%);">-     msg0 = ddf.parse_msg(0)</span><br><span style="color: hsl(0, 100%, 40%);">- msg10 = ddf.parse_msg(10)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       # Make sure parsing was successful</span><br><span style="color: hsl(0, 100%, 40%);">-      assert(msg0 and msg10)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  # Compare common header parts and bursts</span><br><span style="color: hsl(0, 100%, 40%);">-        assert(msg0.burst == messages_ref[0].burst)</span><br><span style="color: hsl(0, 100%, 40%);">-     assert(msg0.fn == messages_ref[0].fn)</span><br><span style="color: hsl(0, 100%, 40%);">-   assert(msg0.tn == messages_ref[0].tn)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   assert(msg10.burst == messages_ref[10].burst)</span><br><span style="color: hsl(0, 100%, 40%);">-   assert(msg10.fn == messages_ref[10].fn)</span><br><span style="color: hsl(0, 100%, 40%);">- assert(msg10.tn == messages_ref[10].tn)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- # Validate both messages</span><br><span style="color: hsl(0, 100%, 40%);">-        msg0.validate()</span><br><span style="color: hsl(0, 100%, 40%);">- msg10.validate()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        log.info("Check parse_msg(): OK")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     # Check parse_all() with range</span><br><span style="color: hsl(0, 100%, 40%);">-  messages_check = ddf.parse_all(skip = 10, count = 20)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   # Make sure parsing was successful</span><br><span style="color: hsl(0, 100%, 40%);">-      assert(messages_check)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  # Check the amount</span><br><span style="color: hsl(0, 100%, 40%);">-      assert(len(messages_check) == 20)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for i in range(20):</span><br><span style="color: hsl(0, 100%, 40%);">-             # Compare common header parts and bursts</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(messages_check[i].burst == messages_ref[i + 10].burst)</span><br><span style="color: hsl(0, 100%, 40%);">-           assert(messages_check[i].fn == messages_ref[i + 10].fn)</span><br><span style="color: hsl(0, 100%, 40%);">-         assert(messages_check[i].tn == messages_ref[i + 10].tn)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         # Validate a message</span><br><span style="color: hsl(0, 100%, 40%);">-            messages_check[i].validate()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    log.info("Check parse_all(): OK")</span><br><span>diff --git a/src/target/trx_toolkit/test_data_dump.py b/src/target/trx_toolkit/test_data_dump.py</span><br><span>new file mode 100644</span><br><span>index 0000000..2f7e25a</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/trx_toolkit/test_data_dump.py</span><br><span>@@ -0,0 +1,165 @@</span><br><span style="color: hsl(120, 100%, 40%);">+#!/usr/bin/env python3</span><br><span style="color: hsl(120, 100%, 40%);">+# -*- coding: utf-8 -*-</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# TRX Toolkit</span><br><span style="color: hsl(120, 100%, 40%);">+# Unit tests for DATA capture management</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# (C) 2019 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+# it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+# the Free Software Foundation; either version 2 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+# (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+# but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+# GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+#</span><br><span style="color: hsl(120, 100%, 40%);">+# You should have received a copy of the GNU General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+# with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+import unittest</span><br><span style="color: hsl(120, 100%, 40%);">+import tempfile</span><br><span style="color: hsl(120, 100%, 40%);">+import random</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from gsm_shared import *</span><br><span style="color: hsl(120, 100%, 40%);">+from data_dump import *</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class DATADump_Test(unittest.TestCase):</span><br><span style="color: hsl(120, 100%, 40%);">+   def setUp(self):</span><br><span style="color: hsl(120, 100%, 40%);">+              # Create a temporary file</span><br><span style="color: hsl(120, 100%, 40%);">+             self._tf = tempfile.TemporaryFile(mode = 'w+b')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             # Create an instance of DATA dump manager</span><br><span style="color: hsl(120, 100%, 40%);">+             self._ddf = DATADumpFile(self._tf)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # Compare message a with message b</span><br><span style="color: hsl(120, 100%, 40%);">+    def _compare_msg(self, a, b):</span><br><span style="color: hsl(120, 100%, 40%);">+         # Make sure we're comparing messages of the same type</span><br><span style="color: hsl(120, 100%, 40%);">+             self.assertEqual(a.__class__, b.__class__)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          # Compare common header fields</span><br><span style="color: hsl(120, 100%, 40%);">+                self.assertEqual(a.ver, b.ver)</span><br><span style="color: hsl(120, 100%, 40%);">+                self.assertEqual(a.fn, b.fn)</span><br><span style="color: hsl(120, 100%, 40%);">+          self.assertEqual(a.tn, b.tn)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                # Burst bits (if present)</span><br><span style="color: hsl(120, 100%, 40%);">+             self.assertEqual(a.burst, b.burst)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          # TRX2L1 specific fields</span><br><span style="color: hsl(120, 100%, 40%);">+              if isinstance(a, DATAMSG_L12TRX):</span><br><span style="color: hsl(120, 100%, 40%);">+                     self.assertEqual(a.pwr, b.pwr)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              # L12TRX specific fields</span><br><span style="color: hsl(120, 100%, 40%);">+              if isinstance(a, DATAMSG_TRX2L1):</span><br><span style="color: hsl(120, 100%, 40%);">+                     # Version independent fields</span><br><span style="color: hsl(120, 100%, 40%);">+                  self.assertEqual(a.toa256, b.toa256)</span><br><span style="color: hsl(120, 100%, 40%);">+                  self.assertEqual(a.rssi, b.rssi)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                    # Version specific fields</span><br><span style="color: hsl(120, 100%, 40%);">+                     if a.ver >= 1:</span><br><span style="color: hsl(120, 100%, 40%);">+                             self.assertEqual(a.nope_ind, b.nope_ind)</span><br><span style="color: hsl(120, 100%, 40%);">+                              self.assertEqual(a.mod_type, b.mod_type)</span><br><span style="color: hsl(120, 100%, 40%);">+                              self.assertEqual(a.tsc_set, b.tsc_set)</span><br><span style="color: hsl(120, 100%, 40%);">+                                self.assertEqual(a.tsc, b.tsc)</span><br><span style="color: hsl(120, 100%, 40%);">+                                self.assertEqual(a.ci, b.ci)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # Generate a random message of a given type / version</span><br><span style="color: hsl(120, 100%, 40%);">+ def _gen_rand_message(self, cls, ver = 1):</span><br><span style="color: hsl(120, 100%, 40%);">+            msg = cls(ver = ver)</span><br><span style="color: hsl(120, 100%, 40%);">+          msg.rand_hdr()</span><br><span style="color: hsl(120, 100%, 40%);">+                msg.rand_burst()</span><br><span style="color: hsl(120, 100%, 40%);">+              return msg</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # Generate a list of random messages</span><br><span style="color: hsl(120, 100%, 40%);">+  def _gen_rand_messages(self, cls, count, ver = 1):</span><br><span style="color: hsl(120, 100%, 40%);">+            msg_list = []</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               for i in range(count):</span><br><span style="color: hsl(120, 100%, 40%);">+                        msg = self._gen_rand_message(cls, ver)</span><br><span style="color: hsl(120, 100%, 40%);">+                        msg_list.append(msg)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                return msg_list</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     # Generate a mixed list of random messages</span><br><span style="color: hsl(120, 100%, 40%);">+    def _gen_rand_message_mix(self, count, ver = 1):</span><br><span style="color: hsl(120, 100%, 40%);">+              msg_list = []</span><br><span style="color: hsl(120, 100%, 40%);">+         msg_list += self._gen_rand_messages(DATAMSG_TRX2L1, count)</span><br><span style="color: hsl(120, 100%, 40%);">+            msg_list += self._gen_rand_messages(DATAMSG_L12TRX, count)</span><br><span style="color: hsl(120, 100%, 40%);">+            random.shuffle(msg_list)</span><br><span style="color: hsl(120, 100%, 40%);">+              return msg_list</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     def _test_store_and_parse(self, cls):</span><br><span style="color: hsl(120, 100%, 40%);">+         msg_ref = self._gen_rand_message(cls)</span><br><span style="color: hsl(120, 100%, 40%);">+         self._ddf.append_msg(msg_ref)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               msg = self._ddf.parse_msg(0)</span><br><span style="color: hsl(120, 100%, 40%);">+          self._compare_msg(msg, msg_ref)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     # Store one TRX2L1 message in a file, read it back and compare</span><br><span style="color: hsl(120, 100%, 40%);">+        def test_store_and_parse_trx2l1(self):</span><br><span style="color: hsl(120, 100%, 40%);">+                self._test_store_and_parse(DATAMSG_TRX2L1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # Store one L12TRX message in a file, read it back and compare</span><br><span style="color: hsl(120, 100%, 40%);">+        def test_store_and_parse_l12trx(self):</span><br><span style="color: hsl(120, 100%, 40%);">+                self._test_store_and_parse(DATAMSG_L12TRX)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # Store multiple TRX2L1/L12TRX messages in a file, read them back and compare</span><br><span style="color: hsl(120, 100%, 40%);">+ def test_store_and_parse_all(self):</span><br><span style="color: hsl(120, 100%, 40%);">+           # Store a mixed list of random messages (19 + 19)</span><br><span style="color: hsl(120, 100%, 40%);">+             msg_list_ref = self._gen_rand_message_mix(19)</span><br><span style="color: hsl(120, 100%, 40%);">+         self._ddf.append_all(msg_list_ref)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          # Retrieve and compare stored messages</span><br><span style="color: hsl(120, 100%, 40%);">+                msg_list = self._ddf.parse_all()</span><br><span style="color: hsl(120, 100%, 40%);">+              for i in range(len(msg_list_ref)):</span><br><span style="color: hsl(120, 100%, 40%);">+                    self._compare_msg(msg_list[i], msg_list_ref[i])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     # Verify random access to stored messages</span><br><span style="color: hsl(120, 100%, 40%);">+     def test_parse_msg_idx(self):</span><br><span style="color: hsl(120, 100%, 40%);">+         # Store a mixed list of random messages (19 + 19)</span><br><span style="color: hsl(120, 100%, 40%);">+             msg_list_ref = self._gen_rand_message_mix(19)</span><br><span style="color: hsl(120, 100%, 40%);">+         self._ddf.append_all(msg_list_ref)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          # Random access</span><br><span style="color: hsl(120, 100%, 40%);">+               for _ in range(100):</span><br><span style="color: hsl(120, 100%, 40%);">+                  idx = random.randrange(len(msg_list_ref))</span><br><span style="color: hsl(120, 100%, 40%);">+                     msg = self._ddf.parse_msg(idx)</span><br><span style="color: hsl(120, 100%, 40%);">+                        self._compare_msg(msg, msg_list_ref[idx])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   def test_parse_empty(self):</span><br><span style="color: hsl(120, 100%, 40%);">+           with self.assertLogs(level = 'ERROR'):</span><br><span style="color: hsl(120, 100%, 40%);">+                        idx = random.randrange(100)</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg = self._ddf.parse_msg(idx)</span><br><span style="color: hsl(120, 100%, 40%);">+                        self.assertEqual(msg, False)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        def test_parse_all_empty(self):</span><br><span style="color: hsl(120, 100%, 40%);">+               msg_list = self._ddf.parse_all()</span><br><span style="color: hsl(120, 100%, 40%);">+              self.assertEqual(msg_list, [])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      def test_parse_len_overflow(self):</span><br><span style="color: hsl(120, 100%, 40%);">+            # Write a malformed message directly</span><br><span style="color: hsl(120, 100%, 40%);">+          self._tf.write(DATADump.TAG_L12TRX)</span><br><span style="color: hsl(120, 100%, 40%);">+           self._tf.write(b'\x00\x63') # 99</span><br><span style="color: hsl(120, 100%, 40%);">+              self._tf.write(b'\xff' * 90)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                with self.assertLogs(level = 'ERROR'):</span><br><span style="color: hsl(120, 100%, 40%);">+                        msg = self._ddf.parse_msg(0)</span><br><span style="color: hsl(120, 100%, 40%);">+                  self.assertEqual(msg, None)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ def test_parse_unknown_tag(self):</span><br><span style="color: hsl(120, 100%, 40%);">+             # Write a malformed message directly</span><br><span style="color: hsl(120, 100%, 40%);">+          self._tf.write(b'\x33')</span><br><span style="color: hsl(120, 100%, 40%);">+               self._tf.write(b'\x00\x63') # 99</span><br><span style="color: hsl(120, 100%, 40%);">+              self._tf.write(b'\xff' * 90)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                with self.assertLogs(level = 'ERROR'):</span><br><span style="color: hsl(120, 100%, 40%);">+                        msg = self._ddf.parse_msg(0)</span><br><span style="color: hsl(120, 100%, 40%);">+                  self.assertEqual(msg, None)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if __name__ == '__main__':</span><br><span style="color: hsl(120, 100%, 40%);">+     unittest.main()</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/16669">change 16669</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/osmocom-bb/+/16669"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I8b934c15ba96d856aa79d10bf296d1446f043dd1 </div>
<div style="display:none"> Gerrit-Change-Number: 16669 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>