File: test_parse_comment_telemetry.py

package info (click to toggle)
python-aprslib 0.7.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 352 kB
  • sloc: python: 2,973; makefile: 216
file content (141 lines) | stat: -rw-r--r-- 4,142 bytes parent folder | download
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import unittest

from aprslib.parsing import parse_comment_telemetry
from aprslib import base91
from random import randint


class ParseCommentTelemetry(unittest.TestCase):
    def setUp(self):
        self.b91max = 91**2 - 1

    def genTelem(self, seq, vals, bits=None):
        data = {
            'seq': seq,
            'vals': vals
            }

        if isinstance(bits, str):
            data.update({'bits': bits})

        return data

    def telemString(self, telem):
        text = ['|']

        # sequence
        if 'seq' in telem:
            text.append(base91.from_decimal(telem['seq'], 2))

        # telemetry channels
        if 'vals' in telem:
            for val in telem['vals']:
                text.append(base91.from_decimal(val, 2))

        # bits as str(11111111)
        if 'bits' in telem:
            val = int(telem['bits'][::-1], 2)
            text.append(base91.from_decimal(val, 2))

        text.append("|")

        return "".join(text)

    def test_random_valid_telemetry(self):
        for i in range(100):
            vals = [randint(0, self.b91max) for x in range(randint(1, 5))]

            bits = None

            if len(vals) == 5 and randint(1, 10) > 5:
                bits = "{0:08b}".format(randint(0, 255))[::-1]

            testData = self.genTelem(i, vals, bits)

            extra, resData = parse_comment_telemetry(self.telemString(testData))
            resData = resData['telemetry']

            # clean up extra data, so we can compare
            if bits is None:
                del resData['bits']

            resData['vals'] = resData['vals'][:len(vals)]

            self.assertEqual(testData, resData)

    def test_prefix_sufix_glue(self):
        testData = [
            # resulting extra should be 'asdzxc'
            ['asd', '|"!"!|', 'zxc'],
            ['', '|"!"!|', 'zxc'],
            ['asd', '|"!"!|', ''],
            # empty extra
            ['', '|"!"!|', ''],
            # should parse only first occurance of |ss11|
            ['asd', '|"!"!|', '|"!"!|'],
            ['', '|"!"!|', '|"!"!|'],
            ['|aa|', '|"!"!|', '|"!"!|'],
            ['|aa|', '|"!"!|', ''],
            ]

        for datum in testData:
            extra, telem = parse_comment_telemetry("".join(datum))

            self.assertEqual(datum[0]+datum[2], extra)

    def test_invalid_telemetry(self):
        testData = [
            "||",
            # odd number of characters between pipes
            "|!!|",
            "|!!!|",
            "|!!!!!|",
            "|!!!!!!!|",
            "|!!!!!!!!!|",
            "|!!!!!!!!!!!|",
            "|!!!!!!!!!!!!!|",
            # invalid characters in sequence
            "| a|",
            "|a |",
            "|aa  |",
            "|aaaa  |",
            "|aaaaaa  |",
            "|aaaaaaaa  |",
            "|aaaaaaaaaa  |",
            "|aaaaaaaaaaaa  |",
            "|ss11223344556677|",  # over 8 fields
            ]

        for datum in testData:
            extra, telem = parse_comment_telemetry(datum)

            self.assertEqual(datum, extra)

    def test_output_format(self):
        parsedOutput = parse_comment_telemetry("|aabb|")

        self.assertTrue(isinstance(parsedOutput, tuple))
        self.assertTrue(len(parsedOutput) == 2)

        extra, telemetry = parsedOutput

        self.assertTrue(isinstance(extra, str))
        self.assertTrue(isinstance(telemetry, dict))

        self.assertTrue('telemetry' in telemetry)

        self.assertTrue('seq' in telemetry['telemetry'])
        self.assertTrue(isinstance(telemetry['telemetry']['seq'], int))

        self.assertTrue('vals' in telemetry['telemetry'])
        self.assertTrue(isinstance(telemetry['telemetry']['vals'], list))
        self.assertTrue(len(telemetry['telemetry']['vals']) == 5)

        self.assertTrue('bits' in telemetry['telemetry'])
        self.assertTrue(isinstance(telemetry['telemetry']['bits'], str))
        self.assertTrue(len(telemetry['telemetry']['bits']) == 8)
        self.assertTrue(len(telemetry['telemetry']['bits'].replace('0', '')) == 0)


if __name__ == '__main__':
    unittest.main()