cpp-common/bt2c/fmt.hpp: use `wise_enum::string_type` in `EnableIfIsWiseEnum` definition
[babeltrace.git] / tests / bindings / python / bt2 / test_component_class.py
CommitLineData
0235b0db 1# SPDX-License-Identifier: GPL-2.0-only
d2d857a8
MJ
2#
3# Copyright (C) 2019 EfficiOS Inc.
4#
d2d857a8 5
811644b8 6import unittest
5995b304 7
811644b8
PP
8import bt2
9
10
11class 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 301class 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 355if __name__ == "__main__":
d14ddbba 356 unittest.main()
This page took 0.092053 seconds and 5 git commands to generate.