Remove `skip-string-normalization` in Python formatter config
[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 import bt2
8
9
10 class UserComponentClassTestCase(unittest.TestCase):
11 def _test_no_init(self, cls):
12 with self.assertRaises(RuntimeError):
13 cls()
14
15 def test_no_init_source(self):
16 class MySource(
17 bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator
18 ):
19 pass
20
21 self._test_no_init(MySource)
22
23 def test_no_init_filter(self):
24 class MyFilter(
25 bt2._UserFilterComponent, message_iterator_class=bt2._UserMessageIterator
26 ):
27 pass
28
29 self._test_no_init(MyFilter)
30
31 def test_no_init_sink(self):
32 class MySink(bt2._UserSinkComponent):
33 def _user_consume(self):
34 pass
35
36 self._test_no_init(MySink)
37
38 def test_incomplete_source_no_msg_iter_cls(self):
39 with self.assertRaises(bt2._IncompleteUserClass):
40
41 class MySource(bt2._UserSourceComponent):
42 pass
43
44 def test_incomplete_source_wrong_msg_iter_cls_type(self):
45 with self.assertRaises(bt2._IncompleteUserClass):
46
47 class MySource(bt2._UserSourceComponent, message_iterator_class=int):
48 pass
49
50 def test_incomplete_filter_no_msg_iter_cls(self):
51 with self.assertRaises(bt2._IncompleteUserClass):
52
53 class MyFilter(bt2._UserFilterComponent):
54 pass
55
56 def test_incomplete_sink_no_consume_method(self):
57 with self.assertRaises(bt2._IncompleteUserClass):
58
59 class MySink(bt2._UserSinkComponent):
60 pass
61
62 def test_minimal_source(self):
63 class MySource(
64 bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator
65 ):
66 pass
67
68 def test_minimal_filter(self):
69 class MyFilter(
70 bt2._UserFilterComponent, message_iterator_class=bt2._UserMessageIterator
71 ):
72 pass
73
74 def test_minimal_sink(self):
75 class MySink(bt2._UserSinkComponent):
76 def _user_consume(self):
77 pass
78
79 def test_default_name(self):
80 class MySink(bt2._UserSinkComponent):
81 def _user_consume(self):
82 pass
83
84 self.assertEqual(MySink.name, "MySink")
85
86 def test_custom_name(self):
87 class MySink(bt2._UserSinkComponent, name="salut"):
88 def _user_consume(self):
89 pass
90
91 self.assertEqual(MySink.name, "salut")
92
93 def test_invalid_custom_name(self):
94 with self.assertRaises(TypeError):
95
96 class MySink(bt2._UserSinkComponent, name=23):
97 def _user_consume(self):
98 pass
99
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
112 def _user_consume(self):
113 pass
114
115 self.assertEqual(MySink.description, "The description.")
116
117 def test_empty_description_no_lines(self):
118 class MySink(bt2._UserSinkComponent):
119 # fmt: off
120 """"""
121 # fmt: on
122
123 def _user_consume(self):
124 pass
125
126 self.assertIsNone(MySink.description)
127
128 def test_empty_description_no_contents(self):
129 class MySink(bt2._UserSinkComponent):
130 # fmt: off
131 """
132 """
133 # fmt: on
134
135 def _user_consume(self):
136 pass
137
138 self.assertIsNone(MySink.description)
139
140 def test_empty_description_single_line(self):
141 class MySink(bt2._UserSinkComponent):
142 """my description"""
143
144 def _user_consume(self):
145 pass
146
147 self.assertEqual(MySink.description, "my description")
148
149 def test_help(self):
150 class MySink(bt2._UserSinkComponent):
151 """
152 The description.
153
154 The help
155 text is
156 here.
157 """
158
159 def _user_consume(self):
160 pass
161
162 self.assertEqual(MySink.help, "The help\ntext is\nhere.")
163
164 def test_addr(self):
165 class MySink(bt2._UserSinkComponent):
166 def _user_consume(self):
167 pass
168
169 self.assertIsInstance(MySink.addr, int)
170 self.assertNotEqual(MySink.addr, 0)
171
172 def test_query_not_implemented(self):
173 class MySink(bt2._UserSinkComponent):
174 def _user_consume(self):
175 pass
176
177 with self.assertRaises(bt2.UnknownObject):
178 bt2.QueryExecutor(MySink, "obj", 23).query()
179
180 def test_query_raises(self):
181 class MySink(bt2._UserSinkComponent):
182 def _user_consume(self):
183 pass
184
185 @classmethod
186 def _user_query(cls, priv_query_exec, obj, params):
187 raise ValueError
188
189 with self.assertRaises(bt2._Error):
190 bt2.QueryExecutor(MySink, "obj", 23).query()
191
192 def test_query_wrong_return_type(self):
193 class MySink(bt2._UserSinkComponent):
194 def _user_consume(self):
195 pass
196
197 @classmethod
198 def _user_query(cls, priv_query_exec, obj, params, method_obj):
199 return ...
200
201 with self.assertRaises(bt2._Error):
202 bt2.QueryExecutor(MySink, "obj", 23).query()
203
204 def test_query_params_none(self):
205 class MySink(bt2._UserSinkComponent):
206 def _user_consume(self):
207 pass
208
209 @classmethod
210 def _user_query(cls, priv_query_exec, obj, params, method_obj):
211 nonlocal query_params
212 query_params = params
213 return None
214
215 query_params = None
216 params = None
217 res = bt2.QueryExecutor(MySink, "obj", params).query()
218 self.assertEqual(query_params, params)
219 self.assertIsNone(res)
220 del query_params
221
222 def test_query_logging_level(self):
223 class MySink(bt2._UserSinkComponent):
224 def _user_consume(self):
225 pass
226
227 @classmethod
228 def _user_query(cls, priv_query_exec, obj, params, method_obj):
229 nonlocal query_log_level
230 query_log_level = priv_query_exec.logging_level
231
232 query_log_level = None
233 query_exec = bt2.QueryExecutor(MySink, "obj", None)
234 query_exec.logging_level = bt2.LoggingLevel.WARNING
235 query_exec.query()
236 self.assertEqual(query_log_level, bt2.LoggingLevel.WARNING)
237 del query_log_level
238
239 def test_query_returns_none(self):
240 class MySink(bt2._UserSinkComponent):
241 def _user_consume(self):
242 pass
243
244 @staticmethod
245 def _user_query(priv_query_exec, obj, params, method_obj):
246 return
247
248 res = bt2.QueryExecutor(MySink, "obj", None).query()
249 self.assertIsNone(res)
250
251 def test_query_simple(self):
252 class MySink(bt2._UserSinkComponent):
253 def _user_consume(self):
254 pass
255
256 @classmethod
257 def _user_query(cls, priv_query_exec, obj, params, method_obj):
258 nonlocal query_params
259 query_params = params
260 return 17.5
261
262 query_params = None
263 params = ["coucou", 23, None]
264 res = bt2.QueryExecutor(MySink, "obj", params).query()
265 self.assertEqual(query_params, params)
266 self.assertEqual(res, 17.5)
267 del query_params
268
269 def test_query_complex(self):
270 class MySink(bt2._UserSinkComponent):
271 def _user_consume(self):
272 pass
273
274 @classmethod
275 def _user_query(cls, priv_query_exec, obj, params, method_obj):
276 nonlocal query_params
277 query_params = params
278 return {"null": None, "bt2": "BT2"}
279
280 query_params = None
281 params = {
282 "array": ["coucou", 23, None],
283 "other_map": {"yes": "yeah", "19": 19, "minus 1.5": -1.5},
284 "null": None,
285 }
286
287 res = bt2.QueryExecutor(MySink, "obj", params).query()
288 self.assertEqual(query_params, params)
289 self.assertEqual(res, {"null": None, "bt2": "BT2"})
290 del query_params
291
292 def test_eq(self):
293 class MySink(bt2._UserSinkComponent):
294 def _user_consume(self):
295 pass
296
297 self.assertEqual(MySink, MySink)
298
299
300 class ComponentClassTestCase(unittest.TestCase):
301 def setUp(self):
302 class MySink(bt2._UserSinkComponent):
303 """
304 The description.
305
306 The help.
307 """
308
309 def _user_consume(self):
310 pass
311
312 @classmethod
313 def _user_query(cls, priv_query_exec, obj, params, method_obj):
314 return [obj, params, 23]
315
316 self._py_comp_cls = MySink
317 graph = bt2.Graph()
318 comp = graph.add_component(MySink, "salut")
319 self._comp_cls = comp.cls
320 self.assertIs(type(self._comp_cls), bt2._SinkComponentClassConst)
321
322 def tearDown(self):
323 del self._py_comp_cls
324 del self._comp_cls
325
326 def test_description(self):
327 self.assertEqual(self._comp_cls.description, "The description.")
328
329 def test_help(self):
330 self.assertEqual(self._comp_cls.help, "The help.")
331
332 def test_name(self):
333 self.assertEqual(self._comp_cls.name, "MySink")
334
335 def test_addr(self):
336 self.assertIsInstance(self._comp_cls.addr, int)
337 self.assertNotEqual(self._comp_cls.addr, 0)
338
339 def test_eq_invalid(self):
340 self.assertFalse(self._comp_cls == 23)
341
342 def test_eq(self):
343 self.assertEqual(self._comp_cls, self._comp_cls)
344 self.assertEqual(self._py_comp_cls, self._comp_cls)
345
346 def test_query(self):
347 res = bt2.QueryExecutor(
348 self._comp_cls, "an object", {"yes": "no", "book": -17}
349 ).query()
350 expected = ["an object", {"yes": "no", "book": -17}, 23]
351 self.assertEqual(res, expected)
352
353
354 if __name__ == "__main__":
355 unittest.main()
This page took 0.036399 seconds and 4 git commands to generate.