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