summaryrefslogtreecommitdiff
path: root/tests/common/leb128.py
blob: 037af4d642661785d3a8df92da8f8faec9b64b39 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88

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)