<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/23136">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trx_toolkit/codec.py: implement check() API for Envelope<br><br>Change-Id: I8258504493cf85c401677866fe8474de2e49786b<br>Related: OS#4006, SYS#4895<br>---<br>M src/target/trx_toolkit/codec.py<br>M src/target/trx_toolkit/test_codec.py<br>2 files changed, 28 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/36/23136/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/trx_toolkit/codec.py b/src/target/trx_toolkit/codec.py</span><br><span>index e3cd600..cc3b5ed 100644</span><br><span>--- a/src/target/trx_toolkit/codec.py</span><br><span>+++ b/src/target/trx_toolkit/codec.py</span><br><span>@@ -271,6 +271,15 @@</span><br><span>       def __delitem__(self, key: str) -> None:</span><br><span>          del self.content[key]</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     def check(self) -> None:</span><br><span style="color: hsl(120, 100%, 40%);">+           ''' Check the content before encoding and after decoding.</span><br><span style="color: hsl(120, 100%, 40%);">+             Raise exceptions (e.g. ValueError) if something is wrong.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   Do not assert for every possible error (e.g. a negative value</span><br><span style="color: hsl(120, 100%, 40%);">+                 for a Uint field) if an exception will be thrown by the field's</span><br><span style="color: hsl(120, 100%, 40%);">+                   to_bytes() method anyway.  Only additional constraints here.</span><br><span style="color: hsl(120, 100%, 40%);">+              '''</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    def from_bytes(self, data: bytes, offset: int = 0) -> int:</span><br><span>                self.content = { } # forget the old content</span><br><span>          try: # Fields throw exceptions</span><br><span>@@ -282,6 +291,7 @@</span><br><span>                 if self.check_len and len(data) != offset:</span><br><span>                   raise DecodeError(self, 'Unhandled tail octets: %s'</span><br><span>                                          % data[offset:].hex())</span><br><span style="color: hsl(120, 100%, 40%);">+                self.check() # Check the content after decoding (raises exceptions)</span><br><span>          return offset</span><br><span> </span><br><span>    def to_bytes(self) -> bytes:</span><br><span>@@ -291,4 +301,5 @@</span><br><span>                        except Exception as e:</span><br><span>                               # Add contextual info</span><br><span>                                raise EncodeError(self, f) from e</span><br><span style="color: hsl(120, 100%, 40%);">+             self.check() # Check the content before encoding (raises exceptions)</span><br><span>                 return b''.join([proc(f) for f in self.STRUCT])</span><br><span>diff --git a/src/target/trx_toolkit/test_codec.py b/src/target/trx_toolkit/test_codec.py</span><br><span>index 0499f3a..287be92 100644</span><br><span>--- a/src/target/trx_toolkit/test_codec.py</span><br><span>+++ b/src/target/trx_toolkit/test_codec.py</span><br><span>@@ -419,6 +419,10 @@</span><br><span>          self.STRUCT[-1].get_pres_dec = lambda v, _: bool(v['flag'])</span><br><span>          self.STRUCT[-1].get_pres_enc = lambda v: bool(v['flag'])</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  def check(self) -> None:</span><br><span style="color: hsl(120, 100%, 40%);">+           if not self['ver'] in (0, 1, 2):</span><br><span style="color: hsl(120, 100%, 40%);">+                      raise ValueError('Unknown version %d' % self['ver'])</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> class Envelope(unittest.TestCase):</span><br><span>         def test_rest_octets(self):</span><br><span>          pdu = TestPDU(check_len=False)</span><br><span>@@ -467,5 +471,18 @@</span><br><span>                pdu.from_bytes(b'\x28\x00\x00\x01\xf0\xbe\xed')</span><br><span>              self.assertEqual(pdu.content, content)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    def test_to_bytes_check(self):</span><br><span style="color: hsl(120, 100%, 40%);">+                pdu = TestPDU()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             pdu.content = { 'ver' : 8, 'flag' : 1, 'data' : b'', 'tail' : b'\xde\xbe' }</span><br><span style="color: hsl(120, 100%, 40%);">+           with self.assertRaises(ValueError):</span><br><span style="color: hsl(120, 100%, 40%);">+                   pdu.to_bytes()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      def test_from_bytes_check(self):</span><br><span style="color: hsl(120, 100%, 40%);">+              pdu = TestPDU()</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             with self.assertRaises(ValueError):</span><br><span style="color: hsl(120, 100%, 40%);">+                   pdu.from_bytes(b'\xf0\x00\x00\x00')</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if __name__ == '__main__':</span><br><span>  unittest.main()</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/23136">change 23136</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/+/23136"/><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: I8258504493cf85c401677866fe8474de2e49786b </div>
<div style="display:none"> Gerrit-Change-Number: 23136 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>