Remove `skip-string-normalization` in Python formatter config
[babeltrace.git] / tests / bindings / python / bt2 / test_event.py
CommitLineData
0235b0db 1# SPDX-License-Identifier: GPL-2.0-only
d2d857a8
MJ
2#
3# Copyright (C) 2019 EfficiOS Inc.
4#
d2d857a8 5
9cf643d1 6import unittest
9cf643d1 7import bt2
f0a42b33 8import utils
6c373cc9 9from utils import TestOutputPortMessageIterator
9cf643d1 10
f0a42b33
FD
11from bt2 import field as bt2_field
12from bt2 import stream as bt2_stream
13from bt2 import event_class as bt2_event_class
14from bt2 import clock_snapshot as bt2_clock_snapshot
15
9cf643d1
PP
16
17class EventTestCase(unittest.TestCase):
f0a42b33 18 def _create_test_const_event_message(
cfbd7cf3
FD
19 self,
20 packet_fields_config=None,
21 event_fields_config=None,
22 with_clockclass=False,
23 with_cc=False,
24 with_sc=False,
25 with_ep=False,
26 with_packet=False,
27 ):
2ae9f48c 28 class MyIter(bt2._UserMessageIterator):
8d8b141d 29 def __init__(self, config, self_output_port):
2ae9f48c 30 self._at = 0
cfbd7cf3 31 self._msgs = [self._create_stream_beginning_message(test_obj.stream)]
2ae9f48c 32
26fc5aed 33 if with_packet:
2ae9f48c 34 assert test_obj.packet
cfbd7cf3
FD
35 self._msgs.append(
36 self._create_packet_beginning_message(test_obj.packet)
37 )
26fc5aed
PP
38
39 default_clock_snapshot = 789 if with_clockclass else None
40
41 if with_packet:
2ae9f48c 42 assert test_obj.packet
26fc5aed
PP
43 ev_parent = test_obj.packet
44 else:
45 assert test_obj.stream
46 ev_parent = test_obj.stream
47
cfbd7cf3
FD
48 msg = self._create_event_message(
49 test_obj.event_class, ev_parent, default_clock_snapshot
50 )
26fc5aed
PP
51
52 if event_fields_config is not None:
53 event_fields_config(msg.event)
54
55 self._msgs.append(msg)
56
57 if with_packet:
58 self._msgs.append(self._create_packet_end_message(test_obj.packet))
59
60 self._msgs.append(self._create_stream_end_message(test_obj.stream))
61
62 def __next__(self):
63 if self._at == len(self._msgs):
2ae9f48c
SM
64 raise bt2.Stop
65
26fc5aed 66 msg = self._msgs[self._at]
2ae9f48c
SM
67 self._at += 1
68 return msg
69
70 class MySrc(bt2._UserSourceComponent, message_iterator_class=MyIter):
59225a3e 71 def __init__(self, config, params, obj):
f5567ea8 72 self._add_output_port("out")
2ae9f48c
SM
73 tc = self._create_trace_class()
74
75 clock_class = None
76 if with_clockclass:
77 clock_class = self._create_clock_class(frequency=1000)
78
79 # event common context (stream-class-defined)
80 cc = None
81 if with_cc:
82 cc = tc.create_structure_field_class()
45c51519 83 cc += [
f5567ea8
FD
84 ("cpu_id", tc.create_signed_integer_field_class(8)),
85 ("stuff", tc.create_double_precision_real_field_class()),
86 ("gnu", tc.create_string_field_class()),
45c51519 87 ]
2ae9f48c
SM
88
89 # packet context (stream-class-defined)
26fc5aed
PP
90 pc = None
91
92 if with_packet:
93 pc = tc.create_structure_field_class()
45c51519 94 pc += [
f5567ea8 95 ("something", tc.create_unsigned_integer_field_class(8)),
fe4df857 96 (
f5567ea8 97 "something_else",
fe4df857
FD
98 tc.create_double_precision_real_field_class(),
99 ),
45c51519 100 ]
2ae9f48c 101
cfbd7cf3
FD
102 stream_class = tc.create_stream_class(
103 default_clock_class=clock_class,
104 event_common_context_field_class=cc,
105 packet_context_field_class=pc,
106 supports_packets=with_packet,
107 )
2ae9f48c
SM
108
109 # specific context (event-class-defined)
110 sc = None
111 if with_sc:
112 sc = tc.create_structure_field_class()
45c51519 113 sc += [
f5567ea8
FD
114 ("ant", tc.create_signed_integer_field_class(16)),
115 ("msg", tc.create_string_field_class()),
45c51519 116 ]
2ae9f48c
SM
117
118 # event payload
119 ep = None
120 if with_ep:
121 ep = tc.create_structure_field_class()
45c51519 122 ep += [
f5567ea8
FD
123 ("giraffe", tc.create_signed_integer_field_class(32)),
124 ("gnu", tc.create_signed_integer_field_class(8)),
125 ("mosquito", tc.create_signed_integer_field_class(8)),
45c51519 126 ]
2ae9f48c 127
cfbd7cf3 128 event_class = stream_class.create_event_class(
f5567ea8 129 name="garou",
cfbd7cf3
FD
130 specific_context_field_class=sc,
131 payload_field_class=ep,
132 )
2ae9f48c
SM
133
134 trace = tc()
135 stream = trace.create_stream(stream_class)
26fc5aed
PP
136
137 if with_packet:
138 packet = stream.create_packet()
2ae9f48c
SM
139
140 if packet_fields_config is not None:
26fc5aed 141 assert packet
2ae9f48c
SM
142 packet_fields_config(packet)
143
26fc5aed
PP
144 if with_packet:
145 test_obj.packet = packet
146
2ae9f48c
SM
147 test_obj.stream = stream
148 test_obj.event_class = event_class
149
150 test_obj = self
151 self._graph = bt2.Graph()
f5567ea8 152 self._src_comp = self._graph.add_component(MySrc, "my_source")
6c373cc9 153 self._msg_iter = TestOutputPortMessageIterator(
f5567ea8 154 self._graph, self._src_comp.output_ports["out"]
cfbd7cf3 155 )
2ae9f48c 156
26fc5aed 157 for msg in self._msg_iter:
f0a42b33
FD
158 if type(msg) is bt2._EventMessageConst:
159 self._event_msg = msg
2ae9f48c 160 return msg
9cf643d1 161
f0a42b33
FD
162 def test_const_attr_event_class(self):
163 msg = self._create_test_const_event_message()
e8ac1aae 164 self.assertEqual(msg.event.cls.addr, self.event_class.addr)
f0a42b33
FD
165 self.assertIs(type(msg.event.cls), bt2_event_class._EventClassConst)
166
167 def test_attr_event_class(self):
168 msg = utils.get_event_message()
169 self.assertIs(type(msg.event.cls), bt2_event_class._EventClass)
9cf643d1 170
f0a42b33
FD
171 def test_const_attr_name(self):
172 msg = self._create_test_const_event_message()
2ae9f48c 173 self.assertEqual(msg.event.name, self.event_class.name)
9cf643d1 174
f0a42b33
FD
175 def test_const_attr_id(self):
176 msg = self._create_test_const_event_message()
2ae9f48c
SM
177 self.assertEqual(msg.event.id, self.event_class.id)
178
f0a42b33 179 def test_const_get_common_context_field(self):
2ae9f48c 180 def event_fields_config(event):
f5567ea8
FD
181 event.common_context_field["cpu_id"] = 1
182 event.common_context_field["stuff"] = 13.194
183 event.common_context_field["gnu"] = "salut"
2ae9f48c 184
f0a42b33 185 msg = self._create_test_const_event_message(
cfbd7cf3
FD
186 event_fields_config=event_fields_config, with_cc=True
187 )
2ae9f48c 188
f5567ea8
FD
189 self.assertEqual(msg.event.common_context_field["cpu_id"], 1)
190 self.assertEqual(msg.event.common_context_field["stuff"], 13.194)
191 self.assertEqual(msg.event.common_context_field["gnu"], "salut")
f0a42b33
FD
192 self.assertIs(
193 type(msg.event.common_context_field), bt2_field._StructureFieldConst
194 )
195
196 def test_attr_common_context_field(self):
197 msg = utils.get_event_message()
198 self.assertIs(type(msg.event.common_context_field), bt2_field._StructureField)
2ae9f48c 199
f0a42b33
FD
200 def test_const_no_common_context_field(self):
201 msg = self._create_test_const_event_message(with_cc=False)
2ae9f48c
SM
202 self.assertIsNone(msg.event.common_context_field)
203
f0a42b33 204 def test_const_get_specific_context_field(self):
2ae9f48c 205 def event_fields_config(event):
f5567ea8
FD
206 event.specific_context_field["ant"] = -1
207 event.specific_context_field["msg"] = "hellooo"
2ae9f48c 208
f0a42b33 209 msg = self._create_test_const_event_message(
cfbd7cf3
FD
210 event_fields_config=event_fields_config, with_sc=True
211 )
2ae9f48c 212
f5567ea8
FD
213 self.assertEqual(msg.event.specific_context_field["ant"], -1)
214 self.assertEqual(msg.event.specific_context_field["msg"], "hellooo")
f0a42b33
FD
215 self.assertIs(
216 type(msg.event.specific_context_field), bt2_field._StructureFieldConst
217 )
218
219 def test_attr_specific_context_field(self):
220 msg = utils.get_event_message()
221 self.assertIs(type(msg.event.specific_context_field), bt2_field._StructureField)
2ae9f48c 222
f0a42b33
FD
223 def test_const_no_specific_context_field(self):
224 msg = self._create_test_const_event_message(with_sc=False)
2ae9f48c 225 self.assertIsNone(msg.event.specific_context_field)
9cf643d1 226
f0a42b33 227 def test_const_get_event_payload_field(self):
2ae9f48c 228 def event_fields_config(event):
f5567ea8
FD
229 event.payload_field["giraffe"] = 1
230 event.payload_field["gnu"] = 23
231 event.payload_field["mosquito"] = 42
9cf643d1 232
f0a42b33 233 msg = self._create_test_const_event_message(
cfbd7cf3
FD
234 event_fields_config=event_fields_config, with_ep=True
235 )
9cf643d1 236
f5567ea8
FD
237 self.assertEqual(msg.event.payload_field["giraffe"], 1)
238 self.assertEqual(msg.event.payload_field["gnu"], 23)
239 self.assertEqual(msg.event.payload_field["mosquito"], 42)
f0a42b33
FD
240 self.assertIs(type(msg.event.payload_field), bt2_field._StructureFieldConst)
241
242 def test_attr_payload_field(self):
243 msg = utils.get_event_message()
244 self.assertIs(type(msg.event.payload_field), bt2_field._StructureField)
9cf643d1 245
f0a42b33
FD
246 def test_const_no_payload_field(self):
247 msg = self._create_test_const_event_message(with_ep=False)
2ae9f48c 248 self.assertIsNone(msg.event.payload_field)
9cf643d1 249
f0a42b33
FD
250 def test_const_clock_value(self):
251 msg = self._create_test_const_event_message(with_clockclass=True)
252 self.assertEqual(msg.default_clock_snapshot.value, 789)
253 self.assertIs(
254 type(msg.default_clock_snapshot), bt2_clock_snapshot._ClockSnapshotConst
255 )
256
2ae9f48c 257 def test_clock_value(self):
f0a42b33 258 msg = utils.get_event_message()
2ae9f48c 259 self.assertEqual(msg.default_clock_snapshot.value, 789)
f0a42b33
FD
260 self.assertIs(
261 type(msg.default_clock_snapshot), bt2_clock_snapshot._ClockSnapshotConst
262 )
2ae9f48c 263
f0a42b33
FD
264 def test_const_no_clock_value(self):
265 msg = self._create_test_const_event_message(with_clockclass=False)
1153eccb 266 with self.assertRaisesRegex(
f5567ea8 267 ValueError, "stream class has no default clock class"
1153eccb 268 ):
9ec609ec 269 msg.default_clock_snapshot
2ae9f48c 270
f0a42b33
FD
271 def test_const_stream(self):
272 msg = self._create_test_const_event_message()
2ae9f48c 273 self.assertEqual(msg.event.stream.addr, self.stream.addr)
f0a42b33 274 self.assertIs(type(msg.event.stream), bt2_stream._StreamConst)
2ae9f48c 275
f0a42b33
FD
276 def test_stream(self):
277 msg = utils.get_event_message()
278 self.assertIs(type(msg.event.stream), bt2_stream._Stream)
279
f03b6364
PP
280 @staticmethod
281 def _event_payload_fields_config(event):
f5567ea8
FD
282 event.payload_field["giraffe"] = 1
283 event.payload_field["gnu"] = 23
284 event.payload_field["mosquito"] = 42
f03b6364
PP
285
286 @staticmethod
287 def _event_fields_config(event):
288 EventTestCase._event_payload_fields_config(event)
f5567ea8
FD
289 event.specific_context_field["ant"] = -1
290 event.specific_context_field["msg"] = "hellooo"
291 event.common_context_field["cpu_id"] = 1
292 event.common_context_field["stuff"] = 13.194
293 event.common_context_field["gnu"] = "salut"
f03b6364
PP
294
295 @staticmethod
296 def _packet_fields_config(packet):
f5567ea8
FD
297 packet.context_field["something"] = 154
298 packet.context_field["something_else"] = 17.2
2ae9f48c 299
f03b6364 300 def test_const_getitem(self):
f0a42b33 301 msg = self._create_test_const_event_message(
f03b6364
PP
302 packet_fields_config=self._packet_fields_config,
303 event_fields_config=self._event_fields_config,
cfbd7cf3
FD
304 with_cc=True,
305 with_sc=True,
306 with_ep=True,
307 with_packet=True,
308 )
2ae9f48c
SM
309 ev = msg.event
310
311 # Test event fields
f5567ea8
FD
312 self.assertEqual(ev["giraffe"], 1)
313 self.assertIs(type(ev["giraffe"]), bt2_field._SignedIntegerFieldConst)
314 self.assertEqual(ev["gnu"], 23)
315 self.assertEqual(ev["mosquito"], 42)
316 self.assertEqual(ev["ant"], -1)
317 self.assertIs(type(ev["ant"]), bt2_field._SignedIntegerFieldConst)
318 self.assertEqual(ev["msg"], "hellooo")
319 self.assertEqual(ev["cpu_id"], 1)
320 self.assertIs(type(ev["cpu_id"]), bt2_field._SignedIntegerFieldConst)
321 self.assertEqual(ev["stuff"], 13.194)
2ae9f48c
SM
322
323 # Test packet fields
f5567ea8
FD
324 self.assertEqual(ev["something"], 154)
325 self.assertIs(type(ev["something"]), bt2_field._UnsignedIntegerFieldConst)
326 self.assertEqual(ev["something_else"], 17.2)
9cf643d1
PP
327
328 with self.assertRaises(KeyError):
f5567ea8 329 ev["yes"]
9cf643d1 330
3e05e718 331 def test_const_getitem_no_packet(self):
3e05e718 332 msg = self._create_test_const_event_message(
776a2a25
PP
333 event_fields_config=self._event_payload_fields_config,
334 with_ep=True,
3e05e718
PP
335 )
336 ev = msg.event
337
338 with self.assertRaises(KeyError):
f5567ea8 339 ev["yes"]
3e05e718 340
f0a42b33
FD
341 def test_getitem(self):
342 msg = utils.get_event_message()
343 ev = msg.event
f5567ea8
FD
344 self.assertEqual(ev["giraffe"], 1)
345 self.assertIs(type(ev["giraffe"]), bt2_field._SignedIntegerField)
346 self.assertEqual(ev["ant"], -1)
347 self.assertIs(type(ev["ant"]), bt2_field._SignedIntegerField)
348 self.assertEqual(ev["cpu_id"], 1)
349 self.assertIs(type(ev["cpu_id"]), bt2_field._SignedIntegerField)
350 self.assertEqual(ev["something"], 154)
351 self.assertIs(type(ev["something"]), bt2_field._UnsignedIntegerField)
f0a42b33 352
f03b6364
PP
353 def test_iter_full(self):
354 msg = self._create_test_const_event_message(
355 packet_fields_config=self._packet_fields_config,
356 event_fields_config=self._event_fields_config,
357 with_cc=True,
358 with_sc=True,
359 with_ep=True,
360 with_packet=True,
361 )
362 expected_field_names = [
363 # payload
f5567ea8
FD
364 "giraffe",
365 "gnu",
366 "mosquito",
f03b6364 367 # specific context
f5567ea8
FD
368 "ant",
369 "msg",
f03b6364 370 # common context
f5567ea8
FD
371 "cpu_id",
372 "stuff",
f03b6364 373 # packet context
f5567ea8
FD
374 "something",
375 "something_else",
f03b6364
PP
376 ]
377 self.assertEqual(list(msg.event), expected_field_names)
378
379 def test_iter_payload_only(self):
380 msg = self._create_test_const_event_message(
776a2a25
PP
381 event_fields_config=self._event_payload_fields_config,
382 with_ep=True,
f03b6364
PP
383 )
384 expected_field_names = [
385 # payload
f5567ea8
FD
386 "giraffe",
387 "gnu",
388 "mosquito",
f03b6364
PP
389 ]
390 self.assertEqual(list(msg.event), expected_field_names)
391
392 def test_len_full(self):
393 msg = self._create_test_const_event_message(
394 packet_fields_config=self._packet_fields_config,
395 event_fields_config=self._event_fields_config,
396 with_cc=True,
397 with_sc=True,
398 with_ep=True,
399 with_packet=True,
400 )
401 self.assertEqual(len(msg.event), 9)
402
403 def test_len_payload_only(self):
404 msg = self._create_test_const_event_message(
405 packet_fields_config=None,
406 event_fields_config=self._event_payload_fields_config,
407 with_ep=True,
408 )
409 self.assertEqual(len(msg.event), 3)
410
411 def test_in_full(self):
412 msg = self._create_test_const_event_message(
413 packet_fields_config=self._packet_fields_config,
414 event_fields_config=self._event_fields_config,
415 with_cc=True,
416 with_sc=True,
417 with_ep=True,
418 with_packet=True,
419 )
420 field_names = [
421 # payload
f5567ea8
FD
422 "giraffe",
423 "gnu",
424 "mosquito",
f03b6364 425 # specific context
f5567ea8
FD
426 "ant",
427 "msg",
f03b6364 428 # common context
f5567ea8
FD
429 "cpu_id",
430 "stuff",
f03b6364 431 # packet context
f5567ea8
FD
432 "something",
433 "something_else",
f03b6364
PP
434 ]
435
436 for field_name in field_names:
437 self.assertTrue(field_name in msg.event)
438
f5567ea8 439 self.assertFalse("lol" in msg.event)
f03b6364
PP
440
441 def test_in_payload_only(self):
442 msg = self._create_test_const_event_message(
443 packet_fields_config=None,
444 event_fields_config=self._event_payload_fields_config,
445 with_ep=True,
446 )
447 field_names = [
f5567ea8
FD
448 "giraffe",
449 "gnu",
450 "mosquito",
f03b6364
PP
451 ]
452
453 for field_name in field_names:
454 self.assertTrue(field_name in msg.event)
455
f5567ea8 456 self.assertFalse("lol" in msg.event)
f03b6364 457
2ae9f48c
SM
458
459if __name__ == "__main__":
460 unittest.main()
This page took 0.086815 seconds and 4 git commands to generate.