1import pytest
2#pytest.skip("Skip RAPID decoding as it was not fixed by Solenix in this release", allow_module_level=True)
3import os
4import io
5from pathlib import Path
6
7try:
8 os.environ["CHART_SETTINGS_MODULE"]
9except KeyError:
10 os.environ["CHART_SETTINGS_MODULE"] = "chartepssg.project_settings"
11from chart.project import settings
12settings.SOURCES = Path(Path(__file__).parent) / "testdata" / "sources.xml"
13from chart.products.rapidfile.rapid_io import gen_rapid_from_raw
14
15
16@pytest.fixture
17def emptyfile(tmpdir):
18 f = Path(tmpdir) / "empty"
19 f.touch()
20 return f
21
22
23def test_tc_parsing_empty(emptyfile):
24 with pytest.raises(StopIteration):
25 next(gen_rapid_from_raw(emptyfile.open("rb").read()))
26
27
28@pytest.fixture
29def one_tc_packet_f():
30 f = io.BytesIO(
31 b"\x00\x00\x02q\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05"
32 b"\xb9VF.H\xb7\x00\x00\x00\x00\x00\x00\x029\x00\x00\x00\x00\x1a\xcf\xfc\x1d\x00\x00\x00\x00\x00\x00\x00\x00"
33 b"\x00\x00\x01\x00`\x08F\x87\x00\x04\xd8\xf7`\x08F\x87\x00\x04\xec\x7f\x00\x00\x00\x00\x00\x03\x00\x1c\x00\x00"
34 b"\x029%0\x00\x01\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00\x00\x97\x00\x05\x00\x01\x00\x00\x00\x01\x00\x00"
35 b"`\x08F\x87\x00\x06\xb0|`\x08F\x87\x00\x06\xc4\x04`\x08F\x87\x00\x08\xf8\x1a\x00\x00\x00\x01\x00\x01"
36 b"\x01\x96\x00\xbc\x02I\x11\x01\t\x01\x00\x00\x01 ASC17000\x00PrfrmCo"
37 b"nnectTest\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
38 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
39 b"\x00\x00\x00\x00\x00\x00\x00\x7f\x00\x00\x00\x01\x00\x00\xff\xfb\x00\x08\x00\x00\x0f\xff\x00D\x00\x00\x029\x00\x00"
40 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x01\x01\x00\x01\x02\t\x00\x04\x00\x04\x00\x04\x00\x04\x00\x00\x00\x04"
41 b"\x00\x00\x00\x00\x00\x00\x00\x04\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
42 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0f\x00\x00\x00\x0f\x00\x00\x00;"
43 b"\x00\x00\x00\x00'\x0f\x00\x00\x00\x00\x00\x7f\x06\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
44 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00"
45 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b\x00\x0c\x00\x00\x00\x00\x00"
46 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
47 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
48 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
49 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
50 b"\x00\x00\x00Q\x00\x07\x00\x03\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
51 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x18\xbc\xc2I\x00\x05\x19\x11\x01\x00?v"
52 )
53 return f
54
55
56def test_tc_one_tc_packet_len(one_tc_packet_f):
57 output = len([x for x in gen_rapid_from_raw(one_tc_packet_f.read())])
58 expected = 1
59 assert expected == output
60
61
62@pytest.mark.parametrize(
63 "expected,field",
64 [
65 ("ASC17000", "name"),
66 ("PrfrmConnectTest", "description"),
67 (17, "service"),
68 (1, "subservice"),
69 (188, "apid"),
70 ],
71)
72def test_tc_one_tc_packet_packet_def(expected, field, one_tc_packet_f):
73 packet_def = next(gen_rapid_from_raw(one_tc_packet_f.read())).packet_def
74 assert expected == getattr(packet_def, field)
75
76
77@pytest.mark.parametrize(
78 "expected,field",
79 [
80 (0, "version_number"),
81 (1, "type_flag"),
82 (1, "dfh_flag"),
83 (188, "apid"),
84 (11, "pid"),
85 (12, "cat"),
86 (3, "grouping_flags"),
87 (585, "sequence_count"),
88 (12, "length"),
89 (5, "dflength"),
90 (17, "service"),
91 (1, "subservice"),
92 ],
93)
94def test_tc_one_tc_packet_ccsds(expected, field, one_tc_packet_f):
95 ccsds = next(gen_rapid_from_raw(one_tc_packet_f.read())).ccsds
96 assert expected == getattr(ccsds, field)
97
98
99@pytest.fixture
100def one_tm_packet_f():
101 # One TM Rapid packet
102 f = io.BytesIO(
103 b"\x00\x00\x03\xf2\x00\x00\x00\x00\x00\x00\x00d\x00\x00\x00\x00"
104 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\xb9-"
105 b"\xb7\xab\x93\x18\x00\x00\x00\x00\x00\x00\x03\xba"
106 b"\x00\x00\x00\x00\x1a\xcf\xfc\x1d\x00\x00\x00\x00"
107 b"\x00\x00\x00\x00\x00\x00\x00\x01`\x05\x9e\x19\x00\n\x9a\xd8"
108 b"`\x05\x9e\x1f\x00\x01\xa3\xa2\x00\x00\x00\x01\x00\x03\x00\x1c"
109 b"\x00\x00\x03\xba\x156\x00\x01\x00\x00\x00\x00\x00\x00Q\x08"
110 b"\x00\x00\x00\x00\x00\x97\x00\x05\x00\x01\x00\x00"
111 b"\x00\x01\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff"
112 b"\xff\x10\x00\xa4\x0c\x92\x03\x19\x08\xa4\xcc\x92\x03g\x10\x03"
113 b"\x19\x00\x00\x00\x04\x1c\x01\x01K\x05\x00\x00\x00\x02\x00\x00"
114 b"\x00\x00\x00\x00\x00:\x00\x00\x00\x05\x00\x00\x005\x00\x00"
115 b"\x00L\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00#\x00\x00"
116 b"\x00\x00\x00\x00I\xd1\x00\x00\x94@\x00\x00\x00\x01\x00\x00"
117 b"\x00\x01\x00\x01\x00\x00\x00@\x00\x00\x01\xff,\x00\x01\xef"
118 b"\xd0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
119 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00W"
120 b"\xe4\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
121 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
122 b"\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00"
123 b"\x00\x00\x00\x89d\x01\x00\x00\x02\x11\x00\x00\x00\x00\x00\x00"
124 b"\x00\x00\x00\x00\x03\xc0\x00\x00\x00\x00\x00\x00"
125 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
126 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
127 b"\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
128 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
129 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
130 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
131 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
132 b"\x00\x00\x00\x00\x00\x00\x00\x00\x04\x1c\x00\x00"
133 b"\x00\x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x00"
134 b"\x00\x00\x00\x00\xbc\x00\x00\x01+\x00\xff\xff\xff\xff\xff\xff"
135 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
136 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
137 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
138 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
139 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
140 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
141 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
142 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
143 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
144 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
145 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
146 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
147 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
148 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
149 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
150 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
151 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
152 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
153 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
154 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
155 b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00"
156 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
157 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
158 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\x00\x00"
159 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
160 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
161 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
162 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
163 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
164 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
165 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
166 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
167 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
168 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
169 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
170 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
171 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
172 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
173 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
174 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
175 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
176 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
177 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
178 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
179 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
180 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
181 b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
182 b"\x00\x00\x00\x00O\xc1",
183 )
184 return f
185
186
187@pytest.mark.parametrize(
188 "expected,field",
189 [
190 ("CSY_HK_20744", "name"),
191 (3, "service"),
192 (25, "subservice"),
193 (164, "apid"),
194 (20744, "spid"),
195 (2, "param1"),
196 (0, "param2"),
197 ],
198)
199def test_tm_one_tm_packet_packet_def(expected, field, one_tm_packet_f):
200 packet_def = next(gen_rapid_from_raw(one_tm_packet_f.read())).packet_def
201 assert expected == getattr(packet_def, field)
202
203
204@pytest.mark.parametrize(
205 "expected,field",
206 [
207 (0, "version_number"),
208 (0, "type_flag"),
209 (1, "dfh_flag"),
210 (164, "apid"),
211 (10, "pid"),
212 (4, "cat"),
213 (3, "grouping_flags"),
214 (3218, "sequence_count"),
215 (871, "dflength"),
216 (878, "length"),
217 (3, "service"),
218 (25, "subservice"),
219 ((1052, 257, 75), "obt"),
220 (5, "time_status"),
221 (2, "param1"),
222 (0, "param2"),
223 ],
224)
225def test_tm_one_tm_packet_ccsds(expected, field, one_tm_packet_f):
226 ccsds = next(gen_rapid_from_raw(one_tm_packet_f.read())).ccsds
227 print(type(ccsds))
228 ccsds.show_header()
229 assert expected == getattr(ccsds, field)