<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/16568">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_msg.py: rewrite unit tests to use unittest framework<br><br>Change-Id: Ia0cc7447b193a705e994078d16f3902339219916<br>---<br>M src/target/trx_toolkit/data_msg.py<br>A src/target/trx_toolkit/test_data_msg.py<br>2 files changed, 193 insertions(+), 212 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/trx_toolkit/data_msg.py b/src/target/trx_toolkit/data_msg.py</span><br><span>index c96dddb..8710702 100644</span><br><span>--- a/src/target/trx_toolkit/data_msg.py</span><br><span>+++ b/src/target/trx_toolkit/data_msg.py</span><br><span>@@ -856,215 +856,3 @@</span><br><span>                      msg.burst = self.sbit2ubit(self.burst)</span><br><span> </span><br><span>           return msg</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-# Regression test</span><br><span style="color: hsl(0, 100%, 40%);">-if __name__ == '__main__':</span><br><span style="color: hsl(0, 100%, 40%);">-   import logging as log</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%);">-       log.info("Generating the reference messages")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- # Create messages of both types</span><br><span style="color: hsl(0, 100%, 40%);">- msg_l12trx_ref = DATAMSG_L12TRX()</span><br><span style="color: hsl(0, 100%, 40%);">-       msg_trx2l1_ref = DATAMSG_TRX2L1()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       # Validate header randomization</span><br><span style="color: hsl(0, 100%, 40%);">- for i in range(0, 100):</span><br><span style="color: hsl(0, 100%, 40%);">-         msg_l12trx_ref.rand_hdr()</span><br><span style="color: hsl(0, 100%, 40%);">-               msg_trx2l1_ref.rand_hdr()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               msg_l12trx_ref.rand_burst()</span><br><span style="color: hsl(0, 100%, 40%);">-             msg_trx2l1_ref.rand_burst()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             msg_l12trx_ref.validate()</span><br><span style="color: hsl(0, 100%, 40%);">-               msg_trx2l1_ref.validate()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       log.info("Validate header randomization: OK")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- # Test error handling for common fields</span><br><span style="color: hsl(0, 100%, 40%);">- msg = DATAMSG()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- # Make sure that message validation throws a ValueError</span><br><span style="color: hsl(0, 100%, 40%);">- def validate_throw(msg):</span><br><span style="color: hsl(0, 100%, 40%);">-                try:</span><br><span style="color: hsl(0, 100%, 40%);">-                    msg.validate()</span><br><span style="color: hsl(0, 100%, 40%);">-                  return False</span><br><span style="color: hsl(0, 100%, 40%);">-            except ValueError:</span><br><span style="color: hsl(0, 100%, 40%);">-                      return True</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     # Unknown version</span><br><span style="color: hsl(0, 100%, 40%);">-       msg.rand_hdr()</span><br><span style="color: hsl(0, 100%, 40%);">-  msg.ver = 100</span><br><span style="color: hsl(0, 100%, 40%);">-   assert(validate_throw(msg))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     # Uninitialized field</span><br><span style="color: hsl(0, 100%, 40%);">-   msg.rand_hdr()</span><br><span style="color: hsl(0, 100%, 40%);">-  msg.fn = None</span><br><span style="color: hsl(0, 100%, 40%);">-   assert(validate_throw(msg))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     # Out-of-range value</span><br><span style="color: hsl(0, 100%, 40%);">-    msg.rand_hdr()</span><br><span style="color: hsl(0, 100%, 40%);">-  msg.tn = 10</span><br><span style="color: hsl(0, 100%, 40%);">-     assert(validate_throw(msg))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     log.info("Check incorrect message validation: OK")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    log.info("Encoding the reference messages")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   # Encode DATA messages</span><br><span style="color: hsl(0, 100%, 40%);">-  l12trx_raw = msg_l12trx_ref.gen_msg()</span><br><span style="color: hsl(0, 100%, 40%);">-   trx2l1_raw = msg_trx2l1_ref.gen_msg()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   # Encode a TRX2L1 message in legacy mode</span><br><span style="color: hsl(0, 100%, 40%);">-        trx2l1_raw_legacy = msg_trx2l1_ref.gen_msg(legacy = True)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       log.info("Parsing generated messages back")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   # Parse generated DATA messages</span><br><span style="color: hsl(0, 100%, 40%);">- msg_l12trx_dec = DATAMSG_L12TRX()</span><br><span style="color: hsl(0, 100%, 40%);">-       msg_trx2l1_dec = DATAMSG_TRX2L1()</span><br><span style="color: hsl(0, 100%, 40%);">-       msg_l12trx_dec.parse_msg(l12trx_raw)</span><br><span style="color: hsl(0, 100%, 40%);">-    msg_trx2l1_dec.parse_msg(trx2l1_raw)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    # Parse generated TRX2L1 message in legacy mode</span><br><span style="color: hsl(0, 100%, 40%);">- msg_trx2l1_legacy_dec = DATAMSG_TRX2L1()</span><br><span style="color: hsl(0, 100%, 40%);">-        msg_trx2l1_legacy_dec.parse_msg(trx2l1_raw_legacy)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      log.info("Comparing decoded messages with the reference")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     # Compare bursts</span><br><span style="color: hsl(0, 100%, 40%);">-        assert(msg_l12trx_dec.burst == msg_l12trx_ref.burst)</span><br><span style="color: hsl(0, 100%, 40%);">-    assert(msg_trx2l1_dec.burst == msg_trx2l1_ref.burst)</span><br><span style="color: hsl(0, 100%, 40%);">-    assert(msg_trx2l1_legacy_dec.burst == msg_trx2l1_ref.burst)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     log.info("Compare bursts: OK")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        # Compare both parsed messages with the reference data</span><br><span style="color: hsl(0, 100%, 40%);">-  assert(msg_l12trx_dec.fn == msg_l12trx_ref.fn)</span><br><span style="color: hsl(0, 100%, 40%);">-  assert(msg_trx2l1_dec.fn == msg_trx2l1_ref.fn)</span><br><span style="color: hsl(0, 100%, 40%);">-  assert(msg_l12trx_dec.tn == msg_l12trx_ref.tn)</span><br><span style="color: hsl(0, 100%, 40%);">-  assert(msg_trx2l1_dec.tn == msg_trx2l1_ref.tn)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  log.info("Compare FN / TN: OK")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       # Compare message specific parts</span><br><span style="color: hsl(0, 100%, 40%);">-        assert(msg_trx2l1_dec.rssi == msg_trx2l1_ref.rssi)</span><br><span style="color: hsl(0, 100%, 40%);">-      assert(msg_l12trx_dec.pwr == msg_l12trx_ref.pwr)</span><br><span style="color: hsl(0, 100%, 40%);">-        assert(msg_trx2l1_dec.toa256 == msg_trx2l1_ref.toa256)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  log.info("Compare message specific data: OK")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- # Bit conversation test</span><br><span style="color: hsl(0, 100%, 40%);">- usbits_ref = list(range(0, 256))</span><br><span style="color: hsl(0, 100%, 40%);">-        sbits_ref = list(range(-127, 128))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      # Test both usbit2sbit() and sbit2usbit()</span><br><span style="color: hsl(0, 100%, 40%);">-       sbits = DATAMSG.usbit2sbit(usbits_ref)</span><br><span style="color: hsl(0, 100%, 40%);">-  usbits = DATAMSG.sbit2usbit(sbits)</span><br><span style="color: hsl(0, 100%, 40%);">-      assert(usbits[:255] == usbits_ref[:255])</span><br><span style="color: hsl(0, 100%, 40%);">-        assert(usbits[255] == 254)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      log.info("Check both usbit2sbit() and sbit2usbit(): OK")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      # Test both sbit2ubit() and ubit2sbit()</span><br><span style="color: hsl(0, 100%, 40%);">- ubits = DATAMSG.sbit2ubit(sbits_ref)</span><br><span style="color: hsl(0, 100%, 40%);">-    assert(ubits == ([1] * 127 + [0] * 128))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        sbits = DATAMSG.ubit2sbit(ubits)</span><br><span style="color: hsl(0, 100%, 40%);">-        assert(sbits == ([-127] * 127 + [127] * 128))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   log.info("Check both sbit2ubit() and ubit2sbit(): OK")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        # Test message transformation</span><br><span style="color: hsl(0, 100%, 40%);">-   msg_l12trx_dec = msg_trx2l1_ref.gen_l12trx()</span><br><span style="color: hsl(0, 100%, 40%);">-    msg_trx2l1_dec = msg_l12trx_ref.gen_trx2l1()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    assert(msg_l12trx_dec.fn == msg_trx2l1_ref.fn)</span><br><span style="color: hsl(0, 100%, 40%);">-  assert(msg_l12trx_dec.tn == msg_trx2l1_ref.tn)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  assert(msg_trx2l1_dec.fn == msg_l12trx_ref.fn)</span><br><span style="color: hsl(0, 100%, 40%);">-  assert(msg_trx2l1_dec.tn == msg_l12trx_ref.tn)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  assert(msg_l12trx_dec.burst == DATAMSG.sbit2ubit(msg_trx2l1_ref.burst))</span><br><span style="color: hsl(0, 100%, 40%);">- assert(msg_trx2l1_dec.burst == DATAMSG.ubit2sbit(msg_l12trx_ref.burst))</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- log.info("Check L12TRX <-> TRX2L1 type transformations: OK")</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    # Test header version coding</span><br><span style="color: hsl(0, 100%, 40%);">-    for ver in DATAMSG.known_versions:</span><br><span style="color: hsl(0, 100%, 40%);">-              # Create messages of both types</span><br><span style="color: hsl(0, 100%, 40%);">-         msg_l12trx = DATAMSG_L12TRX(ver = ver)</span><br><span style="color: hsl(0, 100%, 40%);">-          msg_trx2l1 = DATAMSG_TRX2L1(ver = ver)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          # Randomize message specific headers</span><br><span style="color: hsl(0, 100%, 40%);">-            msg_l12trx.rand_hdr()</span><br><span style="color: hsl(0, 100%, 40%);">-           msg_trx2l1.rand_hdr()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           # Randomize bursts</span><br><span style="color: hsl(0, 100%, 40%);">-              msg_l12trx.rand_burst()</span><br><span style="color: hsl(0, 100%, 40%);">-         msg_trx2l1.rand_burst()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         # Encode DATA messages</span><br><span style="color: hsl(0, 100%, 40%);">-          msg_l12trx_enc = msg_l12trx.gen_msg()</span><br><span style="color: hsl(0, 100%, 40%);">-           msg_trx2l1_enc = msg_trx2l1.gen_msg()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           # Parse generated DATA messages</span><br><span style="color: hsl(0, 100%, 40%);">-         msg_l12trx_dec = DATAMSG_L12TRX()</span><br><span style="color: hsl(0, 100%, 40%);">-               msg_trx2l1_dec = DATAMSG_TRX2L1()</span><br><span style="color: hsl(0, 100%, 40%);">-               msg_l12trx_dec.parse_msg(msg_l12trx_enc)</span><br><span style="color: hsl(0, 100%, 40%);">-                msg_trx2l1_dec.parse_msg(msg_trx2l1_enc)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                # Match the header version</span><br><span style="color: hsl(0, 100%, 40%);">-              assert(msg_l12trx_dec.ver == ver)</span><br><span style="color: hsl(0, 100%, 40%);">-               assert(msg_trx2l1_dec.ver == ver)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               # Match common TDMA fields</span><br><span style="color: hsl(0, 100%, 40%);">-              assert(msg_l12trx_dec.tn == msg_l12trx.tn)</span><br><span style="color: hsl(0, 100%, 40%);">-              assert(msg_trx2l1_dec.fn == msg_trx2l1.fn)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              # Match version specific fields</span><br><span style="color: hsl(0, 100%, 40%);">-         if msg_trx2l1.ver >= 0x01:</span><br><span style="color: hsl(0, 100%, 40%);">-                   assert(msg_trx2l1_dec.nope_ind == msg_trx2l1.nope_ind)</span><br><span style="color: hsl(0, 100%, 40%);">-                  assert(msg_trx2l1_dec.mod_type == msg_trx2l1.mod_type)</span><br><span style="color: hsl(0, 100%, 40%);">-                  assert(msg_trx2l1_dec.tsc_set == msg_trx2l1.tsc_set)</span><br><span style="color: hsl(0, 100%, 40%);">-                    assert(msg_trx2l1_dec.tsc == msg_trx2l1.tsc)</span><br><span style="color: hsl(0, 100%, 40%);">-                    assert(msg_trx2l1_dec.ci == msg_trx2l1.ci)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              log.info("Check header version %u coding: OK" % ver)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          # Compare bursts</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(msg_l12trx_dec.burst == msg_l12trx.burst)</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(msg_trx2l1_dec.burst == msg_trx2l1.burst)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                msg_trx2l1_gen = msg_l12trx.gen_trx2l1()</span><br><span style="color: hsl(0, 100%, 40%);">-                msg_l12trx_gen = msg_trx2l1.gen_l12trx()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                assert(msg_trx2l1_gen is not None)</span><br><span style="color: hsl(0, 100%, 40%);">-              assert(msg_l12trx_gen is not None)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              # Match the header version</span><br><span style="color: hsl(0, 100%, 40%);">-              assert(msg_trx2l1_gen.ver == ver)</span><br><span style="color: hsl(0, 100%, 40%);">-               assert(msg_l12trx_gen.ver == ver)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               # Match common TDMA fields</span><br><span style="color: hsl(0, 100%, 40%);">-              assert(msg_trx2l1_gen.tn == msg_l12trx.tn)</span><br><span style="color: hsl(0, 100%, 40%);">-              assert(msg_l12trx_gen.fn == msg_trx2l1.fn)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              log.info("Verify version %u direct transformation: OK" % ver)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         # Verify NOPE indication coding</span><br><span style="color: hsl(0, 100%, 40%);">-         if msg_trx2l1.ver >= 0x01:</span><br><span style="color: hsl(0, 100%, 40%);">-                   msg_trx2l1 = DATAMSG_TRX2L1(ver = ver)</span><br><span style="color: hsl(0, 100%, 40%);">-                  msg_trx2l1.nope_ind = True</span><br><span style="color: hsl(0, 100%, 40%);">-                      msg_trx2l1.rand_hdr()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                   msg_trx2l1_dec = DATAMSG_TRX2L1()</span><br><span style="color: hsl(0, 100%, 40%);">-                       msg_trx2l1_dec.parse_msg(msg_trx2l1.gen_msg())</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                  assert(msg_trx2l1.nope_ind == msg_trx2l1_dec.nope_ind)</span><br><span style="color: hsl(0, 100%, 40%);">-                  assert(msg_trx2l1.burst == msg_trx2l1_dec.burst)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                        log.info("Verify version %u NOPE indication coding: OK" % ver)</span><br><span>diff --git a/src/target/trx_toolkit/test_data_msg.py b/src/target/trx_toolkit/test_data_msg.py</span><br><span>new file mode 100644</span><br><span>index 0000000..6254203</span><br><span>--- /dev/null</span><br><span>+++ b/src/target/trx_toolkit/test_data_msg.py</span><br><span>@@ -0,0 +1,193 @@</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 test for TRXD message codec</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+from data_msg import DATAMSG, DATAMSG_L12TRX, DATAMSG_TRX2L1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+class DATAMSG_Test(unittest.TestCase):</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%);">+        # Make sure that message validation throws a ValueError</span><br><span style="color: hsl(120, 100%, 40%);">+       def test_validate(self):</span><br><span style="color: hsl(120, 100%, 40%);">+              # Unknown version</span><br><span style="color: hsl(120, 100%, 40%);">+             with self.assertRaises(ValueError):</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg = DATAMSG(fn = 0, tn = 0, ver = 100)</span><br><span style="color: hsl(120, 100%, 40%);">+                      msg.validate()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              # Uninitialized field</span><br><span style="color: hsl(120, 100%, 40%);">+         with self.assertRaises(ValueError):</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg = DATAMSG()</span><br><span style="color: hsl(120, 100%, 40%);">+                       msg.validate()</span><br><span style="color: hsl(120, 100%, 40%);">+                with self.assertRaises(ValueError):</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg = DATAMSG(fn = None, tn = 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                      msg.validate()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              # Out-of-range value(s)</span><br><span style="color: hsl(120, 100%, 40%);">+               with self.assertRaises(ValueError):</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg = DATAMSG(fn = -1, tn = 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                        msg.validate()</span><br><span style="color: hsl(120, 100%, 40%);">+                with self.assertRaises(ValueError):</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg = DATAMSG(fn = 0, tn = 10)</span><br><span style="color: hsl(120, 100%, 40%);">+                        msg.validate()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      # Validate header and burst randomization</span><br><span style="color: hsl(120, 100%, 40%);">+     def test_rand_hdr_burst(self):</span><br><span style="color: hsl(120, 100%, 40%);">+                msg_l12trx = DATAMSG_L12TRX()</span><br><span style="color: hsl(120, 100%, 40%);">+         msg_trx2l1 = DATAMSG_TRX2L1()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               for i in range(100):</span><br><span style="color: hsl(120, 100%, 40%);">+                  msg_l12trx.rand_burst()</span><br><span style="color: hsl(120, 100%, 40%);">+                       msg_trx2l1.rand_burst()</span><br><span style="color: hsl(120, 100%, 40%);">+                       msg_l12trx.rand_hdr()</span><br><span style="color: hsl(120, 100%, 40%);">+                 msg_trx2l1.rand_hdr()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                       msg_l12trx.validate()</span><br><span style="color: hsl(120, 100%, 40%);">+                 msg_trx2l1.validate()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       def _test_enc_dec(self, msg, legacy = False, nope_ind = False):</span><br><span style="color: hsl(120, 100%, 40%);">+               # Prepare a given message (randomize)</span><br><span style="color: hsl(120, 100%, 40%);">+         msg.rand_hdr()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              # NOPE.ind contains no burst</span><br><span style="color: hsl(120, 100%, 40%);">+          if not nope_ind:</span><br><span style="color: hsl(120, 100%, 40%);">+                      msg.rand_burst()</span><br><span style="color: hsl(120, 100%, 40%);">+              else:</span><br><span style="color: hsl(120, 100%, 40%);">+                 msg.nope_ind = True</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg.mod_type = None</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg.tsc_set = None</span><br><span style="color: hsl(120, 100%, 40%);">+                    msg.tsc = None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              # Encode a given message to bytes</span><br><span style="color: hsl(120, 100%, 40%);">+             msg_enc = msg.gen_msg(legacy)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               # Decode a new message from bytes</span><br><span style="color: hsl(120, 100%, 40%);">+             msg_dec = msg.__class__()</span><br><span style="color: hsl(120, 100%, 40%);">+             msg_dec.parse_msg(msg_enc)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          # Compare decoded vs the original</span><br><span style="color: hsl(120, 100%, 40%);">+             self._compare_msg(msg, msg_dec)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     # Validate encoding and decoding</span><br><span style="color: hsl(120, 100%, 40%);">+      def test_enc_dec(self):</span><br><span style="color: hsl(120, 100%, 40%);">+               for ver in DATAMSG.known_versions:</span><br><span style="color: hsl(120, 100%, 40%);">+                    with self.subTest("L1 -> TRX message", ver = ver):</span><br><span style="color: hsl(120, 100%, 40%);">+                               msg = DATAMSG_L12TRX(ver = ver)</span><br><span style="color: hsl(120, 100%, 40%);">+                               self._test_enc_dec(msg)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                     with self.subTest("TRX -> L1 message", ver = ver):</span><br><span style="color: hsl(120, 100%, 40%);">+                               msg = DATAMSG_TRX2L1(ver = ver)</span><br><span style="color: hsl(120, 100%, 40%);">+                               self._test_enc_dec(msg)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                     if ver >= 1:</span><br><span style="color: hsl(120, 100%, 40%);">+                               with self.subTest("TRX -> L1 NOPE.ind", ver = ver):</span><br><span style="color: hsl(120, 100%, 40%);">+                                      msg = DATAMSG_TRX2L1(ver = ver)</span><br><span style="color: hsl(120, 100%, 40%);">+                                       self._test_enc_dec(msg, nope_ind = True)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            with self.subTest("TRX -> L1 message (legacy)"):</span><br><span style="color: hsl(120, 100%, 40%);">+                 msg = DATAMSG_TRX2L1(ver = 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                 self._test_enc_dec(msg, legacy = True)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      # Validate bit conversations</span><br><span style="color: hsl(120, 100%, 40%);">+  def test_bit_conv(self):</span><br><span style="color: hsl(120, 100%, 40%);">+              usbits_ref = list(range(0, 256))</span><br><span style="color: hsl(120, 100%, 40%);">+              sbits_ref = list(range(-127, 128))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          # Test both usbit2sbit() and sbit2usbit()</span><br><span style="color: hsl(120, 100%, 40%);">+             sbits = DATAMSG.usbit2sbit(usbits_ref)</span><br><span style="color: hsl(120, 100%, 40%);">+                usbits = DATAMSG.sbit2usbit(sbits)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.assertEqual(usbits[:255], usbits_ref[:255])</span><br><span style="color: hsl(120, 100%, 40%);">+              self.assertEqual(usbits[255], 254)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          # Test both sbit2ubit() and ubit2sbit()</span><br><span style="color: hsl(120, 100%, 40%);">+               ubits = DATAMSG.sbit2ubit(sbits_ref)</span><br><span style="color: hsl(120, 100%, 40%);">+          self.assertEqual(ubits, ([1] * 127 + [0] * 128))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            sbits = DATAMSG.ubit2sbit(ubits)</span><br><span style="color: hsl(120, 100%, 40%);">+              self.assertEqual(sbits, ([-127] * 127 + [127] * 128))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       def _test_transform(self, msg):</span><br><span style="color: hsl(120, 100%, 40%);">+               # Prepare given messages</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            # Perform message transformation</span><br><span style="color: hsl(120, 100%, 40%);">+              if isinstance(msg, DATAMSG_L12TRX):</span><br><span style="color: hsl(120, 100%, 40%);">+                   msg_trans = msg.gen_trx2l1()</span><br><span style="color: hsl(120, 100%, 40%);">+          else:</span><br><span style="color: hsl(120, 100%, 40%);">+                 msg_trans = msg.gen_l12trx()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                self.assertEqual(msg_trans.ver, msg.ver)</span><br><span style="color: hsl(120, 100%, 40%);">+              self.assertEqual(msg_trans.fn, msg.fn)</span><br><span style="color: hsl(120, 100%, 40%);">+                self.assertEqual(msg_trans.tn, msg.tn)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if isinstance(msg, DATAMSG_TRX2L1):</span><br><span style="color: hsl(120, 100%, 40%);">+                   burst = DATAMSG.sbit2ubit(msg.burst)</span><br><span style="color: hsl(120, 100%, 40%);">+                  self.assertEqual(msg_trans.burst, burst)</span><br><span style="color: hsl(120, 100%, 40%);">+              else:</span><br><span style="color: hsl(120, 100%, 40%);">+                 burst = DATAMSG.ubit2sbit(msg.burst)</span><br><span style="color: hsl(120, 100%, 40%);">+                  self.assertEqual(msg_trans.burst, burst)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    # Validate message transformation</span><br><span style="color: hsl(120, 100%, 40%);">+     def test_transform(self):</span><br><span style="color: hsl(120, 100%, 40%);">+             for ver in DATAMSG.known_versions:</span><br><span style="color: hsl(120, 100%, 40%);">+                    with self.subTest("L1 -> TRX message", ver = ver):</span><br><span style="color: hsl(120, 100%, 40%);">+                               msg = DATAMSG_L12TRX(ver = ver)</span><br><span style="color: hsl(120, 100%, 40%);">+                               self._test_transform(msg)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   with self.subTest("TRX -> L1 message", ver = ver):</span><br><span style="color: hsl(120, 100%, 40%);">+                               msg = DATAMSG_TRX2L1(ver = ver)</span><br><span style="color: hsl(120, 100%, 40%);">+                               self._test_transform(msg)</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/+/16568">change 16568</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/+/16568"/><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: Ia0cc7447b193a705e994078d16f3902339219916 </div>
<div style="display:none"> Gerrit-Change-Number: 16568 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </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: fixeria <axilirator@gmail.com> </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>