Fix: bt2: _trim_docstring(): docstring can have 0 or 1 line
[babeltrace.git] / tests / bindings / python / bt2 / test_component_class.py
CommitLineData
32d2d479
MJ
1#
2# Copyright (C) 2019 EfficiOS Inc.
3#
4# This program is free software; you can redistribute it and/or
5# modify it under the terms of the GNU General Public License
6# as published by the Free Software Foundation; only version 2
7# of the License.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17#
18
f6a5e476 19import unittest
f6a5e476
PP
20import bt2
21
22
23class UserComponentClassTestCase(unittest.TestCase):
24 def _test_no_init(self, cls):
3b2be708 25 with self.assertRaises(RuntimeError):
f6a5e476
PP
26 cls()
27
28 def test_no_init_source(self):
a797a36f
SM
29 class MySource(
30 bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator
31 ):
f6a5e476
PP
32 pass
33
34 self._test_no_init(MySource)
35
36 def test_no_init_filter(self):
a797a36f
SM
37 class MyFilter(
38 bt2._UserFilterComponent, message_iterator_class=bt2._UserMessageIterator
39 ):
f6a5e476
PP
40 pass
41
42 self._test_no_init(MyFilter)
43
44 def test_no_init_sink(self):
45 class MySink(bt2._UserSinkComponent):
819d0ae7 46 def _user_consume(self):
8a08af82
SM
47 pass
48
f6a5e476
PP
49 self._test_no_init(MySink)
50
fa4c33e3 51 def test_incomplete_source_no_msg_iter_cls(self):
64e96b5d 52 with self.assertRaises(bt2._IncompleteUserClass):
61d96b89 53
f6a5e476
PP
54 class MySource(bt2._UserSourceComponent):
55 pass
56
fa4c33e3 57 def test_incomplete_source_wrong_msg_iter_cls_type(self):
64e96b5d 58 with self.assertRaises(bt2._IncompleteUserClass):
61d96b89
FD
59
60 class MySource(bt2._UserSourceComponent, message_iterator_class=int):
f6a5e476
PP
61 pass
62
fa4c33e3 63 def test_incomplete_filter_no_msg_iter_cls(self):
64e96b5d 64 with self.assertRaises(bt2._IncompleteUserClass):
61d96b89 65
f6a5e476
PP
66 class MyFilter(bt2._UserFilterComponent):
67 pass
68
69 def test_incomplete_sink_no_consume_method(self):
64e96b5d 70 with self.assertRaises(bt2._IncompleteUserClass):
61d96b89 71
f6a5e476
PP
72 class MySink(bt2._UserSinkComponent):
73 pass
74
75 def test_minimal_source(self):
a797a36f
SM
76 class MySource(
77 bt2._UserSourceComponent, message_iterator_class=bt2._UserMessageIterator
78 ):
f6a5e476
PP
79 pass
80
81 def test_minimal_filter(self):
a797a36f
SM
82 class MyFilter(
83 bt2._UserFilterComponent, message_iterator_class=bt2._UserMessageIterator
84 ):
f6a5e476
PP
85 pass
86
87 def test_minimal_sink(self):
88 class MySink(bt2._UserSinkComponent):
819d0ae7 89 def _user_consume(self):
8a08af82
SM
90 pass
91
f6a5e476
PP
92 def test_default_name(self):
93 class MySink(bt2._UserSinkComponent):
819d0ae7 94 def _user_consume(self):
8a08af82
SM
95 pass
96
f6a5e476
PP
97 self.assertEqual(MySink.name, 'MySink')
98
99 def test_custom_name(self):
100 class MySink(bt2._UserSinkComponent, name='salut'):
819d0ae7 101 def _user_consume(self):
8a08af82
SM
102 pass
103
f6a5e476
PP
104 self.assertEqual(MySink.name, 'salut')
105
106 def test_invalid_custom_name(self):
107 with self.assertRaises(TypeError):
61d96b89 108
f6a5e476 109 class MySink(bt2._UserSinkComponent, name=23):
819d0ae7 110 def _user_consume(self):
8a08af82
SM
111 pass
112
f6a5e476
PP
113 def test_description(self):
114 class MySink(bt2._UserSinkComponent):
115 """
116 The description.
117
118 Bacon ipsum dolor amet ribeye t-bone corned beef, beef jerky
119 porchetta burgdoggen prosciutto chicken frankfurter boudin
120 hamburger doner bacon turducken. Sirloin shank sausage,
121 boudin meatloaf alcatra meatball t-bone tongue pastrami
122 cupim flank tenderloin.
123 """
124
819d0ae7 125 def _user_consume(self):
8a08af82
SM
126 pass
127
f6a5e476
PP
128 self.assertEqual(MySink.description, 'The description.')
129
e30908cf 130 def test_empty_description_no_lines(self):
f6a5e476 131 class MySink(bt2._UserSinkComponent):
e30908cf
PP
132 # fmt: off
133 """"""
134 # fmt: on
135
136 def _user_consume(self):
137 pass
138
139 self.assertIsNone(MySink.description)
140
141 def test_empty_description_no_contents(self):
142 class MySink(bt2._UserSinkComponent):
143 # fmt: off
f6a5e476
PP
144 """
145 """
e30908cf 146 # fmt: on
f6a5e476 147
819d0ae7 148 def _user_consume(self):
8a08af82
SM
149 pass
150
f6a5e476
PP
151 self.assertIsNone(MySink.description)
152
e30908cf
PP
153 def test_empty_description_single_line(self):
154 class MySink(bt2._UserSinkComponent):
155 """my description"""
156
157 def _user_consume(self):
158 pass
159
160 self.assertEqual(MySink.description, "my description")
161
f6a5e476
PP
162 def test_help(self):
163 class MySink(bt2._UserSinkComponent):
164 """
165 The description.
166
167 The help
168 text is
169 here.
170 """
171
819d0ae7 172 def _user_consume(self):
8a08af82
SM
173 pass
174
f6a5e476
PP
175 self.assertEqual(MySink.help, 'The help\ntext is\nhere.')
176
177 def test_addr(self):
178 class MySink(bt2._UserSinkComponent):
819d0ae7 179 def _user_consume(self):
8a08af82
SM
180 pass
181
f6a5e476
PP
182 self.assertIsInstance(MySink.addr, int)
183 self.assertNotEqual(MySink.addr, 0)
184
185 def test_query_not_implemented(self):
186 class MySink(bt2._UserSinkComponent):
819d0ae7 187 def _user_consume(self):
8a08af82
SM
188 pass
189
7dd3e712 190 with self.assertRaises(bt2.UnknownObject):
bf403eb2 191 bt2.QueryExecutor(MySink, 'obj', 23).query()
f6a5e476
PP
192
193 def test_query_raises(self):
194 class MySink(bt2._UserSinkComponent):
819d0ae7 195 def _user_consume(self):
8a08af82
SM
196 pass
197
f6a5e476 198 @classmethod
bf403eb2 199 def _user_query(cls, priv_query_exec, obj, params):
f6a5e476
PP
200 raise ValueError
201
614743a5 202 with self.assertRaises(bt2._Error):
bf403eb2 203 bt2.QueryExecutor(MySink, 'obj', 23).query()
f6a5e476
PP
204
205 def test_query_wrong_return_type(self):
206 class MySink(bt2._UserSinkComponent):
819d0ae7 207 def _user_consume(self):
8a08af82
SM
208 pass
209
f6a5e476 210 @classmethod
f6e305ce 211 def _user_query(cls, priv_query_exec, obj, params, method_obj):
f6a5e476
PP
212 return ...
213
614743a5 214 with self.assertRaises(bt2._Error):
bf403eb2 215 bt2.QueryExecutor(MySink, 'obj', 23).query()
f6a5e476
PP
216
217 def test_query_params_none(self):
218 class MySink(bt2._UserSinkComponent):
819d0ae7 219 def _user_consume(self):
8a08af82
SM
220 pass
221
f6a5e476 222 @classmethod
f6e305ce 223 def _user_query(cls, priv_query_exec, obj, params, method_obj):
f6a5e476
PP
224 nonlocal query_params
225 query_params = params
226 return None
227
228 query_params = None
229 params = None
bf403eb2 230 res = bt2.QueryExecutor(MySink, 'obj', params).query()
f6a5e476
PP
231 self.assertEqual(query_params, params)
232 self.assertIsNone(res)
233 del query_params
234
999e7442
PP
235 def test_query_logging_level(self):
236 class MySink(bt2._UserSinkComponent):
819d0ae7 237 def _user_consume(self):
8a08af82
SM
238 pass
239
999e7442 240 @classmethod
f6e305ce 241 def _user_query(cls, priv_query_exec, obj, params, method_obj):
999e7442 242 nonlocal query_log_level
bf403eb2 243 query_log_level = priv_query_exec.logging_level
999e7442
PP
244
245 query_log_level = None
bf403eb2
PP
246 query_exec = bt2.QueryExecutor(MySink, 'obj', None)
247 query_exec.logging_level = bt2.LoggingLevel.WARNING
248 query_exec.query()
e9d0e821 249 self.assertEqual(query_log_level, bt2.LoggingLevel.WARNING)
999e7442
PP
250 del query_log_level
251
70ad0c69
SM
252 def test_query_returns_none(self):
253 class MySink(bt2._UserSinkComponent):
819d0ae7 254 def _user_consume(self):
8a08af82
SM
255 pass
256
70ad0c69 257 @staticmethod
f6e305ce 258 def _user_query(priv_query_exec, obj, params, method_obj):
70ad0c69
SM
259 return
260
bf403eb2 261 res = bt2.QueryExecutor(MySink, 'obj', None).query()
70ad0c69
SM
262 self.assertIsNone(res)
263
f6a5e476
PP
264 def test_query_simple(self):
265 class MySink(bt2._UserSinkComponent):
819d0ae7 266 def _user_consume(self):
8a08af82
SM
267 pass
268
f6a5e476 269 @classmethod
f6e305ce 270 def _user_query(cls, priv_query_exec, obj, params, method_obj):
f6a5e476
PP
271 nonlocal query_params
272 query_params = params
273 return 17.5
274
275 query_params = None
276 params = ['coucou', 23, None]
bf403eb2 277 res = bt2.QueryExecutor(MySink, 'obj', params).query()
f6a5e476
PP
278 self.assertEqual(query_params, params)
279 self.assertEqual(res, 17.5)
280 del query_params
281
282 def test_query_complex(self):
283 class MySink(bt2._UserSinkComponent):
819d0ae7 284 def _user_consume(self):
8a08af82
SM
285 pass
286
f6a5e476 287 @classmethod
f6e305ce 288 def _user_query(cls, priv_query_exec, obj, params, method_obj):
f6a5e476
PP
289 nonlocal query_params
290 query_params = params
61d96b89 291 return {'null': None, 'bt2': 'BT2'}
f6a5e476
PP
292
293 query_params = None
294 params = {
295 'array': ['coucou', 23, None],
61d96b89 296 'other_map': {'yes': 'yeah', '19': 19, 'minus 1.5': -1.5},
f6a5e476
PP
297 'null': None,
298 }
299
bf403eb2 300 res = bt2.QueryExecutor(MySink, 'obj', params).query()
f6a5e476 301 self.assertEqual(query_params, params)
61d96b89 302 self.assertEqual(res, {'null': None, 'bt2': 'BT2'})
f6a5e476
PP
303 del query_params
304
305 def test_eq(self):
306 class MySink(bt2._UserSinkComponent):
819d0ae7 307 def _user_consume(self):
8a08af82
SM
308 pass
309
f6a5e476
PP
310 self.assertEqual(MySink, MySink)
311
312
ede525fd 313class ComponentClassTestCase(unittest.TestCase):
f6a5e476
PP
314 def setUp(self):
315 class MySink(bt2._UserSinkComponent):
e30908cf 316 """
f6a5e476
PP
317 The description.
318
319 The help.
e30908cf 320 """
61d96b89 321
819d0ae7 322 def _user_consume(self):
8a08af82
SM
323 pass
324
f6a5e476 325 @classmethod
f6e305ce 326 def _user_query(cls, priv_query_exec, obj, params, method_obj):
f6a5e476
PP
327 return [obj, params, 23]
328
329 self._py_comp_cls = MySink
330 graph = bt2.Graph()
bc5c9924 331 comp = graph.add_component(MySink, 'salut')
c88be1c8 332 self._comp_cls = comp.cls
05920081 333 self.assertIs(type(self._comp_cls), bt2._SinkComponentClassConst)
f6a5e476
PP
334
335 def tearDown(self):
336 del self._py_comp_cls
337 del self._comp_cls
338
339 def test_description(self):
340 self.assertEqual(self._comp_cls.description, 'The description.')
341
342 def test_help(self):
343 self.assertEqual(self._comp_cls.help, 'The help.')
344
345 def test_name(self):
346 self.assertEqual(self._comp_cls.name, 'MySink')
347
348 def test_addr(self):
349 self.assertIsInstance(self._comp_cls.addr, int)
350 self.assertNotEqual(self._comp_cls.addr, 0)
351
352 def test_eq_invalid(self):
353 self.assertFalse(self._comp_cls == 23)
354
355 def test_eq(self):
356 self.assertEqual(self._comp_cls, self._comp_cls)
357 self.assertEqual(self._py_comp_cls, self._comp_cls)
358
359 def test_query(self):
bf403eb2 360 res = bt2.QueryExecutor(
61d96b89 361 self._comp_cls, 'an object', {'yes': 'no', 'book': -17}
bf403eb2 362 ).query()
f6a5e476
PP
363 expected = ['an object', {'yes': 'no', 'book': -17}, 23]
364 self.assertEqual(res, expected)
3db06b1d
SM
365
366
367if __name__ == '__main__':
368 unittest.main()
This page took 0.068373 seconds and 4 git commands to generate.