<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>