from chrysacase import ChrysalideTestCase from pychrysalide.common import pack_uleb128, unpack_uleb128, pack_leb128, unpack_leb128 class TestLEB128Values(ChrysalideTestCase): """TestCase for common LEB128 features*""" def testUnsignedLeb128Encoding(self): """Pack and unpack unsigned LEB128 values.""" cases = { 624485: b'\xe5\x8e\x26', 127: b'\x7f', 128: b'\x80\x01', } # Lecture depuis des blocs individuels for value, encoding in cases.items(): self.assertEqual(pack_uleb128(value), encoding) v, r = unpack_uleb128(encoding) self.assertEqual(value, v) self.assertEqual(b'', r) # Lecture depuis un bloc commun data = b''.join(cases.values()) values = [] while len(data) > 0: val, data = unpack_uleb128(data) values.append(val) self.assertEqual(values, [ k for k in cases.keys() ]) def testSignedLeb128Encoding(self): """Pack and unpack signed LEB128 values.""" cases = { -123456: b'\xc0\xbb\x78', -42: b'\x56', -9001: b'\xd7\xb9\x7f', } # Lecture depuis des blocs individuels for value, encoding in cases.items(): self.assertEqual(pack_leb128(value), encoding) v, r = unpack_leb128(encoding) self.assertEqual(value, v) self.assertEqual(b'', r) # Lecture depuis un bloc commun data = b''.join(cases.values()) values = [] while len(data) > 0: val, data = unpack_leb128(data) values.append(val) self.assertEqual(values, [ k for k in cases.keys() ]) def testTooBigLeb128Encodings(self): """Prevent overflow for LEB128 values.""" v = unpack_uleb128(b'\x80' * 10 + b'\x7f') self.assertIsNone(v) v = unpack_leb128(b'\x80' * 10 + b'\x7f') self.assertIsNone(v)