Files
2025-02-21 09:29:52 -06:00

167 lines
4.6 KiB
Python

import unittest
from hypothesis import given
from hypothesis.strategies import integers, text, binary
from src.ms_nmf import (
NMFRecord,
NMFVersion,
NMFMode,
NMFVia,
NMFKnownEncoding,
NMFSizedEnvelope,
NMFEnd,
NMFFault,
NMFUpgradeRequest,
NMFUpgradeResponse,
NMFPreambleEnd,
NMFPreambleAck,
NMFPreamble,
)
class TestSizeEncoding(unittest.TestCase):
"""Testing the variable length field encoding of
[MC-NMF] record sizes.
The record size feild (payload len) is variable between
1 and 5 bytes. Or between 0x0 and 0xFFFFFFFF
"""
def test_decode_simple(self):
expected_size = 0x92
data = b'\x92\01'
size, _, _ = NMFRecord.decode_size(data)
self.assertEqual(size, expected_size)
def test_decode_three(self):
data = b'\x80\x81\x01'
expected_size = 0x4080
size, _, _ = NMFRecord.decode_size(data)
self.assertEqual(size, expected_size)
def test_decode_16(self):
data = b'\x10'
expected_size = 0x10
size, _, _ = NMFRecord.decode_size(data)
self.assertEqual(size, expected_size)
# ======= Encode Tests =========
def test_encode_simple(self):
expected_data = b'\x92\01'
size = 0x92
data = NMFRecord.encode_size(size)
self.assertEqual(data, expected_data)
def test_encode_three_bytes(self):
expected_data = b'\x80\x81\x01'
size = 0x4080
data = NMFRecord.encode_size(size)
self.assertEqual(data, expected_data)
def test_encode_16(self):
expected_data = b'\x10'
size = 0x10
data = NMFRecord.encode_size(size)
self.assertEqual(data, expected_data)
# stress test
@given(integers(min_value=0x0, max_value=0xFFFFFFFF))
def test_decoding_invariant(self, i):
self.assertEqual(NMFRecord.decode_size(NMFRecord.encode_size(i))[0], i)
class TestRecords(unittest.TestCase):
@given(v1=integers(min_value=0x0, max_value=0xff), v2=integers(min_value=0x0, max_value=0xff))
def test_version_record_invariant(self, v1, v2):
data = NMFVersion(minor_version=v1, major_version=v2).getData()
v = NMFVersion(data=data)
self.assertEqual(v['major_version'], v2)
self.assertEqual(v['minor_version'], v1)
@given(i=integers(min_value=0x0, max_value=0x4))
def test_mode_record_invariants(self, i):
data = NMFMode(mode=i).getData()
v = NMFMode(data=data)
self.assertEqual(v['mode'], i)
@given(s=text(max_size=0xFFFFFFFF))
def test_via_record_invaiant(self, s):
data = NMFVia(s).getData()
v = NMFVia(data=data)
self.assertEqual(v['via'], s)
@given(i=integers(min_value=0x0, max_value=0xff))
def test_knownencoding_record_invariant(self, i):
data = NMFKnownEncoding(i).getData()
v = NMFKnownEncoding(data=data)
self.assertEqual(v['encoding'], i)
@given(b=binary(max_size=0xffffffff))
def test_sizedenvelope_invaiant(self, b):
data = NMFSizedEnvelope(b).getData()
v = NMFSizedEnvelope(data=data)
self.assertEqual(v['payload'], b)
def test_end_record(self):
data = NMFEnd().getData()
v = NMFEnd(data=data)
self.assertEqual(v['record_type'], 0x7)
@given(s=text(max_size=0xFFFFFFFF))
def test_fault_record_invaiant(self, s):
data = NMFFault(s).getData()
v = NMFFault(data=data)
self.assertEqual(v['fault'], s)
@given(s=text(max_size=0xffffffff))
def test_upgrade_request_record_invariant(self, s):
data = NMFUpgradeRequest(s).getData()
v = NMFUpgradeRequest(data=data)
self.assertEqual(v['proto'], s)
def test_upgrade_response_record(self):
data = NMFUpgradeResponse().getData()
v = NMFUpgradeResponse(data=data)
self.assertEqual(v['record_type'], 0xA)
def test_preamble_end_record(self):
data = NMFPreambleEnd().getData()
v = NMFPreambleEnd(data=data)
self.assertEqual(v['record_type'], 0xC)
def test_preamble_ack_record(self):
data = NMFPreambleAck().getData()
v = NMFPreambleAck(data=data)
self.assertEqual(v['record_type'], 0xB)
def test_preamble_record(self):
version = (1, 1)
mode = 0x1
via = "test_via"
encoding = 0x4
data = NMFPreamble(version, mode, via, encoding).getData()
expected = NMFVersion(*version).getData()
expected += NMFMode(mode).getData()
expected += NMFVia(via).getData()
expected += NMFKnownEncoding(encoding).getData()
self.assertEqual(data, expected)