Commit | Line | Data |
---|---|---|
0235b0db | 1 | # SPDX-License-Identifier: GPL-2.0-only |
d2d857a8 MJ |
2 | # |
3 | # Copyright (C) 2019 EfficiOS Inc. | |
4 | # | |
d2d857a8 | 5 | |
811644b8 | 6 | import unittest |
5995b304 | 7 | |
811644b8 PP |
8 | import bt2 |
9 | ||
10 | ||
11 | class UserComponentClassTestCase(unittest.TestCase): | |
12 | def _test_no_init(self, cls): | |
ce4923b0 | 13 | with self.assertRaises(RuntimeError): |
811644b8 PP |
14 | cls() |
15 | ||
16 | def test_no_init_source(self): | |
5c61fb9d SM |
17 | class MySource( |
18 | bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator | |
19 | ): | |
811644b8 PP |
20 | pass |
21 | ||
22 | self._test_no_init(MySource) | |
23 | ||
24 | def test_no_init_filter(self): | |
5c61fb9d SM |
25 | class MyFilter( |
26 | bt2._UserFilterComponent, message_iterator_class=bt2._UserMessageIterator | |
27 | ): | |
811644b8 PP |
28 | pass |
29 | ||
30 | self._test_no_init(MyFilter) | |
31 | ||
32 | def test_no_init_sink(self): | |
33 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 34 | def _user_consume(self): |
a01b452b SM |
35 | pass |
36 | ||
811644b8 PP |
37 | self._test_no_init(MySink) |
38 | ||
5602ef81 | 39 | def test_incomplete_source_no_msg_iter_cls(self): |
cb06aa27 | 40 | with self.assertRaises(bt2._IncompleteUserClass): |
cfbd7cf3 | 41 | |
811644b8 PP |
42 | class MySource(bt2._UserSourceComponent): |
43 | pass | |
44 | ||
5602ef81 | 45 | def test_incomplete_source_wrong_msg_iter_cls_type(self): |
cb06aa27 | 46 | with self.assertRaises(bt2._IncompleteUserClass): |
cfbd7cf3 FD |
47 | |
48 | class MySource(bt2._UserSourceComponent, message_iterator_class=int): | |
811644b8 PP |
49 | pass |
50 | ||
5602ef81 | 51 | def test_incomplete_filter_no_msg_iter_cls(self): |
cb06aa27 | 52 | with self.assertRaises(bt2._IncompleteUserClass): |
cfbd7cf3 | 53 | |
811644b8 PP |
54 | class MyFilter(bt2._UserFilterComponent): |
55 | pass | |
56 | ||
57 | def test_incomplete_sink_no_consume_method(self): | |
cb06aa27 | 58 | with self.assertRaises(bt2._IncompleteUserClass): |
cfbd7cf3 | 59 | |
811644b8 PP |
60 | class MySink(bt2._UserSinkComponent): |
61 | pass | |
62 | ||
63 | def test_minimal_source(self): | |
5c61fb9d SM |
64 | class MySource( |
65 | bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator | |
66 | ): | |
811644b8 PP |
67 | pass |
68 | ||
69 | def test_minimal_filter(self): | |
5c61fb9d SM |
70 | class MyFilter( |
71 | bt2._UserFilterComponent, message_iterator_class=bt2._UserMessageIterator | |
72 | ): | |
811644b8 PP |
73 | pass |
74 | ||
75 | def test_minimal_sink(self): | |
76 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 77 | def _user_consume(self): |
a01b452b SM |
78 | pass |
79 | ||
811644b8 PP |
80 | def test_default_name(self): |
81 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 82 | def _user_consume(self): |
a01b452b SM |
83 | pass |
84 | ||
f5567ea8 | 85 | self.assertEqual(MySink.name, "MySink") |
811644b8 PP |
86 | |
87 | def test_custom_name(self): | |
f5567ea8 | 88 | class MySink(bt2._UserSinkComponent, name="salut"): |
6a91742b | 89 | def _user_consume(self): |
a01b452b SM |
90 | pass |
91 | ||
f5567ea8 | 92 | self.assertEqual(MySink.name, "salut") |
811644b8 PP |
93 | |
94 | def test_invalid_custom_name(self): | |
95 | with self.assertRaises(TypeError): | |
cfbd7cf3 | 96 | |
811644b8 | 97 | class MySink(bt2._UserSinkComponent, name=23): |
6a91742b | 98 | def _user_consume(self): |
a01b452b SM |
99 | pass |
100 | ||
811644b8 PP |
101 | def test_description(self): |
102 | class MySink(bt2._UserSinkComponent): | |
103 | """ | |
104 | The description. | |
105 | ||
106 | Bacon ipsum dolor amet ribeye t-bone corned beef, beef jerky | |
107 | porchetta burgdoggen prosciutto chicken frankfurter boudin | |
108 | hamburger doner bacon turducken. Sirloin shank sausage, | |
109 | boudin meatloaf alcatra meatball t-bone tongue pastrami | |
110 | cupim flank tenderloin. | |
111 | """ | |
112 | ||
6a91742b | 113 | def _user_consume(self): |
a01b452b SM |
114 | pass |
115 | ||
f5567ea8 | 116 | self.assertEqual(MySink.description, "The description.") |
811644b8 | 117 | |
ade5c95e | 118 | def test_empty_description_no_lines(self): |
811644b8 | 119 | class MySink(bt2._UserSinkComponent): |
ade5c95e PP |
120 | # fmt: off |
121 | """""" | |
122 | # fmt: on | |
123 | ||
124 | def _user_consume(self): | |
125 | pass | |
126 | ||
127 | self.assertIsNone(MySink.description) | |
128 | ||
129 | def test_empty_description_no_contents(self): | |
130 | class MySink(bt2._UserSinkComponent): | |
131 | # fmt: off | |
811644b8 PP |
132 | """ |
133 | """ | |
ade5c95e | 134 | # fmt: on |
811644b8 | 135 | |
6a91742b | 136 | def _user_consume(self): |
a01b452b SM |
137 | pass |
138 | ||
811644b8 PP |
139 | self.assertIsNone(MySink.description) |
140 | ||
ade5c95e PP |
141 | def test_empty_description_single_line(self): |
142 | class MySink(bt2._UserSinkComponent): | |
143 | """my description""" | |
144 | ||
145 | def _user_consume(self): | |
146 | pass | |
147 | ||
148 | self.assertEqual(MySink.description, "my description") | |
149 | ||
811644b8 PP |
150 | def test_help(self): |
151 | class MySink(bt2._UserSinkComponent): | |
152 | """ | |
153 | The description. | |
154 | ||
155 | The help | |
156 | text is | |
157 | here. | |
158 | """ | |
159 | ||
6a91742b | 160 | def _user_consume(self): |
a01b452b SM |
161 | pass |
162 | ||
f5567ea8 | 163 | self.assertEqual(MySink.help, "The help\ntext is\nhere.") |
811644b8 PP |
164 | |
165 | def test_addr(self): | |
166 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 167 | def _user_consume(self): |
a01b452b SM |
168 | pass |
169 | ||
811644b8 PP |
170 | self.assertIsInstance(MySink.addr, int) |
171 | self.assertNotEqual(MySink.addr, 0) | |
172 | ||
173 | def test_query_not_implemented(self): | |
174 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 175 | def _user_consume(self): |
a01b452b SM |
176 | pass |
177 | ||
76b6c2f7 | 178 | with self.assertRaises(bt2.UnknownObject): |
f5567ea8 | 179 | bt2.QueryExecutor(MySink, "obj", 23).query() |
811644b8 PP |
180 | |
181 | def test_query_raises(self): | |
182 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 183 | def _user_consume(self): |
a01b452b SM |
184 | pass |
185 | ||
811644b8 | 186 | @classmethod |
3c729b9a | 187 | def _user_query(cls, priv_query_exec, obj, params): |
811644b8 PP |
188 | raise ValueError |
189 | ||
694c792b | 190 | with self.assertRaises(bt2._Error): |
f5567ea8 | 191 | bt2.QueryExecutor(MySink, "obj", 23).query() |
811644b8 PP |
192 | |
193 | def test_query_wrong_return_type(self): | |
194 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 195 | def _user_consume(self): |
a01b452b SM |
196 | pass |
197 | ||
811644b8 | 198 | @classmethod |
7c14d641 | 199 | def _user_query(cls, priv_query_exec, obj, params, method_obj): |
811644b8 PP |
200 | return ... |
201 | ||
694c792b | 202 | with self.assertRaises(bt2._Error): |
f5567ea8 | 203 | bt2.QueryExecutor(MySink, "obj", 23).query() |
811644b8 PP |
204 | |
205 | def test_query_params_none(self): | |
206 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 207 | def _user_consume(self): |
a01b452b SM |
208 | pass |
209 | ||
811644b8 | 210 | @classmethod |
7c14d641 | 211 | def _user_query(cls, priv_query_exec, obj, params, method_obj): |
811644b8 PP |
212 | nonlocal query_params |
213 | query_params = params | |
214 | return None | |
215 | ||
216 | query_params = None | |
217 | params = None | |
f5567ea8 | 218 | res = bt2.QueryExecutor(MySink, "obj", params).query() |
811644b8 PP |
219 | self.assertEqual(query_params, params) |
220 | self.assertIsNone(res) | |
221 | del query_params | |
222 | ||
761e1890 PP |
223 | def test_query_logging_level(self): |
224 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 225 | def _user_consume(self): |
a01b452b SM |
226 | pass |
227 | ||
761e1890 | 228 | @classmethod |
7c14d641 | 229 | def _user_query(cls, priv_query_exec, obj, params, method_obj): |
761e1890 | 230 | nonlocal query_log_level |
3c729b9a | 231 | query_log_level = priv_query_exec.logging_level |
761e1890 PP |
232 | |
233 | query_log_level = None | |
f5567ea8 | 234 | query_exec = bt2.QueryExecutor(MySink, "obj", None) |
3c729b9a PP |
235 | query_exec.logging_level = bt2.LoggingLevel.WARNING |
236 | query_exec.query() | |
770538dd | 237 | self.assertEqual(query_log_level, bt2.LoggingLevel.WARNING) |
761e1890 PP |
238 | del query_log_level |
239 | ||
b5947615 SM |
240 | def test_query_returns_none(self): |
241 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 242 | def _user_consume(self): |
a01b452b SM |
243 | pass |
244 | ||
b5947615 | 245 | @staticmethod |
7c14d641 | 246 | def _user_query(priv_query_exec, obj, params, method_obj): |
b5947615 SM |
247 | return |
248 | ||
f5567ea8 | 249 | res = bt2.QueryExecutor(MySink, "obj", None).query() |
b5947615 SM |
250 | self.assertIsNone(res) |
251 | ||
811644b8 PP |
252 | def test_query_simple(self): |
253 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 254 | def _user_consume(self): |
a01b452b SM |
255 | pass |
256 | ||
811644b8 | 257 | @classmethod |
7c14d641 | 258 | def _user_query(cls, priv_query_exec, obj, params, method_obj): |
811644b8 PP |
259 | nonlocal query_params |
260 | query_params = params | |
261 | return 17.5 | |
262 | ||
263 | query_params = None | |
f5567ea8 FD |
264 | params = ["coucou", 23, None] |
265 | res = bt2.QueryExecutor(MySink, "obj", params).query() | |
811644b8 PP |
266 | self.assertEqual(query_params, params) |
267 | self.assertEqual(res, 17.5) | |
268 | del query_params | |
269 | ||
270 | def test_query_complex(self): | |
271 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 272 | def _user_consume(self): |
a01b452b SM |
273 | pass |
274 | ||
811644b8 | 275 | @classmethod |
7c14d641 | 276 | def _user_query(cls, priv_query_exec, obj, params, method_obj): |
811644b8 PP |
277 | nonlocal query_params |
278 | query_params = params | |
f5567ea8 | 279 | return {"null": None, "bt2": "BT2"} |
811644b8 PP |
280 | |
281 | query_params = None | |
282 | params = { | |
f5567ea8 FD |
283 | "array": ["coucou", 23, None], |
284 | "other_map": {"yes": "yeah", "19": 19, "minus 1.5": -1.5}, | |
285 | "null": None, | |
811644b8 PP |
286 | } |
287 | ||
f5567ea8 | 288 | res = bt2.QueryExecutor(MySink, "obj", params).query() |
811644b8 | 289 | self.assertEqual(query_params, params) |
f5567ea8 | 290 | self.assertEqual(res, {"null": None, "bt2": "BT2"}) |
811644b8 PP |
291 | del query_params |
292 | ||
293 | def test_eq(self): | |
294 | class MySink(bt2._UserSinkComponent): | |
6a91742b | 295 | def _user_consume(self): |
a01b452b SM |
296 | pass |
297 | ||
811644b8 PP |
298 | self.assertEqual(MySink, MySink) |
299 | ||
300 | ||
68e606ef | 301 | class ComponentClassTestCase(unittest.TestCase): |
811644b8 PP |
302 | def setUp(self): |
303 | class MySink(bt2._UserSinkComponent): | |
776a2a25 | 304 | """ |
811644b8 PP |
305 | The description. |
306 | ||
307 | The help. | |
776a2a25 | 308 | """ |
cfbd7cf3 | 309 | |
6a91742b | 310 | def _user_consume(self): |
a01b452b SM |
311 | pass |
312 | ||
811644b8 | 313 | @classmethod |
7c14d641 | 314 | def _user_query(cls, priv_query_exec, obj, params, method_obj): |
811644b8 PP |
315 | return [obj, params, 23] |
316 | ||
317 | self._py_comp_cls = MySink | |
318 | graph = bt2.Graph() | |
f5567ea8 | 319 | comp = graph.add_component(MySink, "salut") |
e8ac1aae | 320 | self._comp_cls = comp.cls |
242b863f | 321 | self.assertIs(type(self._comp_cls), bt2._SinkComponentClassConst) |
811644b8 PP |
322 | |
323 | def tearDown(self): | |
324 | del self._py_comp_cls | |
325 | del self._comp_cls | |
326 | ||
327 | def test_description(self): | |
f5567ea8 | 328 | self.assertEqual(self._comp_cls.description, "The description.") |
811644b8 PP |
329 | |
330 | def test_help(self): | |
f5567ea8 | 331 | self.assertEqual(self._comp_cls.help, "The help.") |
811644b8 PP |
332 | |
333 | def test_name(self): | |
f5567ea8 | 334 | self.assertEqual(self._comp_cls.name, "MySink") |
811644b8 PP |
335 | |
336 | def test_addr(self): | |
337 | self.assertIsInstance(self._comp_cls.addr, int) | |
338 | self.assertNotEqual(self._comp_cls.addr, 0) | |
339 | ||
340 | def test_eq_invalid(self): | |
341 | self.assertFalse(self._comp_cls == 23) | |
342 | ||
343 | def test_eq(self): | |
344 | self.assertEqual(self._comp_cls, self._comp_cls) | |
345 | self.assertEqual(self._py_comp_cls, self._comp_cls) | |
346 | ||
347 | def test_query(self): | |
3c729b9a | 348 | res = bt2.QueryExecutor( |
f5567ea8 | 349 | self._comp_cls, "an object", {"yes": "no", "book": -17} |
3c729b9a | 350 | ).query() |
f5567ea8 | 351 | expected = ["an object", {"yes": "no", "book": -17}, 23] |
811644b8 | 352 | self.assertEqual(res, expected) |
d14ddbba SM |
353 | |
354 | ||
f5567ea8 | 355 | if __name__ == "__main__": |
d14ddbba | 356 | unittest.main() |