cpp-common/bt2c/fmt.hpp: use `wise_enum::string_type` in `EnableIfIsWiseEnum` definition
[babeltrace.git] / tests / bindings / python / bt2 / test_component_class.py
1 # SPDX-License-Identifier: GPL-2.0-only
2 #
3 # Copyright (C) 2019 EfficiOS Inc.
4 #
5
6 import unittest
7
8 import bt2
9
10
11 class UserComponentClassTestCase(unittest.TestCase):
12 def _test_no_init(self, cls):
13 with self.assertRaises(RuntimeError):
14 cls()
15
16 def test_no_init_source(self):
17 class MySource(
18 bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator
19 ):
20 pass
21
22 self._test_no_init(MySource)
23
24 def test_no_init_filter(self):
25 class MyFilter(
26 bt2._UserFilterComponent, message_iterator_class=bt2._UserMessageIterator
27 ):
28 pass
29
30 self._test_no_init(MyFilter)
31
32 def test_no_init_sink(self):
33 class MySink(bt2._UserSinkComponent):
34 def _user_consume(self):
35 pass
36
37 self._test_no_init(MySink)
38
39 def test_incomplete_source_no_msg_iter_cls(self):
40 with self.assertRaises(bt2._IncompleteUserClass):
41
42 class MySource(bt2._UserSourceComponent):
43 pass
44
45 def test_incomplete_source_wrong_msg_iter_cls_type(self):
46 with self.assertRaises(bt2._IncompleteUserClass):
47
48 class MySource(bt2._UserSourceComponent, message_iterator_class=int):
49 pass
50
51 def test_incomplete_filter_no_msg_iter_cls(self):
52 with self.assertRaises(bt2._IncompleteUserClass):
53
54 class MyFilter(bt2._UserFilterComponent):
55 pass
56
57 def test_incomplete_sink_no_consume_method(self):
58 with self.assertRaises(bt2._IncompleteUserClass):
59
60 class MySink(bt2._UserSinkComponent):
61 pass
62
63 def test_minimal_source(self):
64 class MySource(
65 bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator
66 ):
67 pass
68
69 def test_minimal_filter(self):
70 class MyFilter(
71 bt2._UserFilterComponent, message_iterator_class=bt2._UserMessageIterator
72 ):
73 pass
74
75 def test_minimal_sink(self):
76 class MySink(bt2._UserSinkComponent):
77 def _user_consume(self):
78 pass
79
80 def test_default_name(self):
81 class MySink(bt2._UserSinkComponent):
82 def _user_consume(self):
83 pass
84
85 self.assertEqual(MySink.name, "MySink")
86
87 def test_custom_name(self):
88 class MySink(bt2._UserSinkComponent, name="salut"):
89 def _user_consume(self):
90 pass
91
92 self.assertEqual(MySink.name, "salut")
93
94 def test_invalid_custom_name(self):
95 with self.assertRaises(TypeError):
96
97 class MySink(bt2._UserSinkComponent, name=23):
98 def _user_consume(self):
99 pass
100
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
113 def _user_consume(self):
114 pass
115
116 self.assertEqual(MySink.description, "The description.")
117
118 def test_empty_description_no_lines(self):
119 class MySink(bt2._UserSinkComponent):
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
132 """
133 """
134 # fmt: on
135
136 def _user_consume(self):
137 pass
138
139 self.assertIsNone(MySink.description)
140
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
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
160 def _user_consume(self):
161 pass
162
163 self.assertEqual(MySink.help, "The help\ntext is\nhere.")
164
165 def test_addr(self):
166 class MySink(bt2._UserSinkComponent):
167 def _user_consume(self):
168 pass
169
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):
175 def _user_consume(self):
176 pass
177
178 with self.assertRaises(bt2.UnknownObject):
179 bt2.QueryExecutor(MySink, "obj", 23).query()
180
181 def test_query_raises(self):
182 class MySink(bt2._UserSinkComponent):
183 def _user_consume(self):
184 pass
185
186 @classmethod
187 def _user_query(cls, priv_query_exec, obj, params):
188 raise ValueError
189
190 with self.assertRaises(bt2._Error):
191 bt2.QueryExecutor(MySink, "obj", 23).query()
192
193 def test_query_wrong_return_type(self):
194 class MySink(bt2._UserSinkComponent):
195 def _user_consume(self):
196 pass
197
198 @classmethod
199 def _user_query(cls, priv_query_exec, obj, params, method_obj):
200 return ...
201
202 with self.assertRaises(bt2._Error):
203 bt2.QueryExecutor(MySink, "obj", 23).query()
204
205 def test_query_params_none(self):
206 class MySink(bt2._UserSinkComponent):
207 def _user_consume(self):
208 pass
209
210 @classmethod
211 def _user_query(cls, priv_query_exec, obj, params, method_obj):
212 nonlocal query_params
213 query_params = params
214 return None
215
216 query_params = None
217 params = None
218 res = bt2.QueryExecutor(MySink, "obj", params).query()
219 self.assertEqual(query_params, params)
220 self.assertIsNone(res)
221 del query_params
222
223 def test_query_logging_level(self):
224 class MySink(bt2._UserSinkComponent):
225 def _user_consume(self):
226 pass
227
228 @classmethod
229 def _user_query(cls, priv_query_exec, obj, params, method_obj):
230 nonlocal query_log_level
231 query_log_level = priv_query_exec.logging_level
232
233 query_log_level = None
234 query_exec = bt2.QueryExecutor(MySink, "obj", None)
235 query_exec.logging_level = bt2.LoggingLevel.WARNING
236 query_exec.query()
237 self.assertEqual(query_log_level, bt2.LoggingLevel.WARNING)
238 del query_log_level
239
240 def test_query_returns_none(self):
241 class MySink(bt2._UserSinkComponent):
242 def _user_consume(self):
243 pass
244
245 @staticmethod
246 def _user_query(priv_query_exec, obj, params, method_obj):
247 return
248
249 res = bt2.QueryExecutor(MySink, "obj", None).query()
250 self.assertIsNone(res)
251
252 def test_query_simple(self):
253 class MySink(bt2._UserSinkComponent):
254 def _user_consume(self):
255 pass
256
257 @classmethod
258 def _user_query(cls, priv_query_exec, obj, params, method_obj):
259 nonlocal query_params
260 query_params = params
261 return 17.5
262
263 query_params = None
264 params = ["coucou", 23, None]
265 res = bt2.QueryExecutor(MySink, "obj", params).query()
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):
272 def _user_consume(self):
273 pass
274
275 @classmethod
276 def _user_query(cls, priv_query_exec, obj, params, method_obj):
277 nonlocal query_params
278 query_params = params
279 return {"null": None, "bt2": "BT2"}
280
281 query_params = None
282 params = {
283 "array": ["coucou", 23, None],
284 "other_map": {"yes": "yeah", "19": 19, "minus 1.5": -1.5},
285 "null": None,
286 }
287
288 res = bt2.QueryExecutor(MySink, "obj", params).query()
289 self.assertEqual(query_params, params)
290 self.assertEqual(res, {"null": None, "bt2": "BT2"})
291 del query_params
292
293 def test_eq(self):
294 class MySink(bt2._UserSinkComponent):
295 def _user_consume(self):
296 pass
297
298 self.assertEqual(MySink, MySink)
299
300
301 class ComponentClassTestCase(unittest.TestCase):
302 def setUp(self):
303 class MySink(bt2._UserSinkComponent):
304 """
305 The description.
306
307 The help.
308 """
309
310 def _user_consume(self):
311 pass
312
313 @classmethod
314 def _user_query(cls, priv_query_exec, obj, params, method_obj):
315 return [obj, params, 23]
316
317 self._py_comp_cls = MySink
318 graph = bt2.Graph()
319 comp = graph.add_component(MySink, "salut")
320 self._comp_cls = comp.cls
321 self.assertIs(type(self._comp_cls), bt2._SinkComponentClassConst)
322
323 def tearDown(self):
324 del self._py_comp_cls
325 del self._comp_cls
326
327 def test_description(self):
328 self.assertEqual(self._comp_cls.description, "The description.")
329
330 def test_help(self):
331 self.assertEqual(self._comp_cls.help, "The help.")
332
333 def test_name(self):
334 self.assertEqual(self._comp_cls.name, "MySink")
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):
348 res = bt2.QueryExecutor(
349 self._comp_cls, "an object", {"yes": "no", "book": -17}
350 ).query()
351 expected = ["an object", {"yes": "no", "book": -17}, 23]
352 self.assertEqual(res, expected)
353
354
355 if __name__ == "__main__":
356 unittest.main()
This page took 0.035892 seconds and 4 git commands to generate.