cpp-common/bt2c/fmt.hpp: use `wise_enum::string_type` in `EnableIfIsWiseEnum` definition
[babeltrace.git] / tests / bindings / python / bt2 / test_trace_class.py
CommitLineData
0235b0db 1# SPDX-License-Identifier: GPL-2.0-only
d2d857a8
MJ
2#
3# Copyright (C) 2019 EfficiOS Inc.
4#
d2d857a8 5
fbbe9302 6import unittest
5995b304
SM
7
8from bt2 import utils as bt2_utils
9from bt2 import trace_class as bt2_trace_class
10from bt2 import stream_class as bt2_stream_class
f0a42b33
FD
11from utils import (
12 run_in_component_init,
13 get_default_trace_class,
14 get_const_stream_beginning_message,
15)
fbbe9302
SM
16
17
18class TraceClassTestCase(unittest.TestCase):
5783664e
PP
19 def assertRaisesInComponentInit(self, expected_exc_type, user_code):
20 def f(comp_self):
21 try:
22 user_code(comp_self)
23 except Exception as exc:
24 return type(exc)
25
26 exc_type = run_in_component_init(f)
27 self.assertIsNotNone(exc_type)
28 self.assertEqual(exc_type, expected_exc_type)
29
fbbe9302
SM
30 def test_create_default(self):
31 def f(comp_self):
32 return comp_self._create_trace_class()
33
34 tc = run_in_component_init(f)
35
36 self.assertEqual(len(tc), 0)
f0a42b33 37 self.assertIs(type(tc), bt2_trace_class._TraceClass)
fbbe9302 38 self.assertTrue(tc.assigns_automatic_stream_class_id)
5783664e
PP
39 self.assertEqual(len(tc.user_attributes), 0)
40
41 def test_create_user_attributes(self):
42 def f(comp_self):
f5567ea8 43 return comp_self._create_trace_class(user_attributes={"salut": 23})
5783664e
PP
44
45 tc = run_in_component_init(f)
f5567ea8 46 self.assertEqual(tc.user_attributes, {"salut": 23})
5783664e
PP
47
48 def test_create_invalid_user_attributes(self):
49 def f(comp_self):
50 return comp_self._create_trace_class(user_attributes=object())
51
52 self.assertRaisesInComponentInit(TypeError, f)
53
54 def test_create_invalid_user_attributes_value_type(self):
55 def f(comp_self):
56 return comp_self._create_trace_class(user_attributes=23)
57
58 self.assertRaisesInComponentInit(TypeError, f)
fbbe9302 59
46fc35d6
SM
60 def test_create_invalid_automatic_stream_class_id_type(self):
61 def f(comp_self):
62 return comp_self._create_trace_class(
f5567ea8 63 assigns_automatic_stream_class_id="perchaude"
46fc35d6
SM
64 )
65
66 self.assertRaisesInComponentInit(TypeError, f)
67
fbbe9302
SM
68 def test_automatic_stream_class_id(self):
69 def f(comp_self):
70 return comp_self._create_trace_class(assigns_automatic_stream_class_id=True)
71
72 tc = run_in_component_init(f)
73 self.assertTrue(tc.assigns_automatic_stream_class_id)
74
75 # This should not throw.
76 sc1 = tc.create_stream_class()
77 sc2 = tc.create_stream_class()
78
f0a42b33
FD
79 self.assertIs(type(sc1), bt2_stream_class._StreamClass)
80 self.assertIs(type(sc2), bt2_stream_class._StreamClass)
fbbe9302
SM
81 self.assertNotEqual(sc1.id, sc2.id)
82
83 def test_automatic_stream_class_id_raises(self):
84 def f(comp_self):
85 return comp_self._create_trace_class(assigns_automatic_stream_class_id=True)
86
87 tc = run_in_component_init(f)
88 self.assertTrue(tc.assigns_automatic_stream_class_id)
89
4430bc80 90 with self.assertRaises(ValueError):
082db648 91 tc.create_stream_class(23)
fbbe9302
SM
92
93 def test_no_assigns_automatic_stream_class_id(self):
94 def f(comp_self):
cfbd7cf3
FD
95 return comp_self._create_trace_class(
96 assigns_automatic_stream_class_id=False
97 )
fbbe9302
SM
98
99 tc = run_in_component_init(f)
100 self.assertFalse(tc.assigns_automatic_stream_class_id)
101
102 sc = tc.create_stream_class(id=28)
103 self.assertEqual(sc.id, 28)
104
105 def test_no_assigns_automatic_stream_class_id_raises(self):
106 def f(comp_self):
cfbd7cf3
FD
107 return comp_self._create_trace_class(
108 assigns_automatic_stream_class_id=False
109 )
fbbe9302
SM
110
111 tc = run_in_component_init(f)
112 self.assertFalse(tc.assigns_automatic_stream_class_id)
113
114 # In this mode, it is required to pass an explicit id.
4430bc80 115 with self.assertRaises(ValueError):
fbbe9302
SM
116 tc.create_stream_class()
117
fbbe9302
SM
118 @staticmethod
119 def _create_trace_class_with_some_stream_classes():
120 def f(comp_self):
cfbd7cf3
FD
121 return comp_self._create_trace_class(
122 assigns_automatic_stream_class_id=False
123 )
fbbe9302
SM
124
125 tc = run_in_component_init(f)
126 sc1 = tc.create_stream_class(id=12)
127 sc2 = tc.create_stream_class(id=54)
128 sc3 = tc.create_stream_class(id=2018)
129 return tc, sc1, sc2, sc3
130
131 def test_getitem(self):
132 tc, _, _, sc3 = self._create_trace_class_with_some_stream_classes()
f0a42b33 133 self.assertIs(type(tc[2018]), bt2_stream_class._StreamClass)
fbbe9302
SM
134 self.assertEqual(tc[2018].addr, sc3.addr)
135
f0a42b33
FD
136 def test_const_getitem(self):
137 const_tc = get_const_stream_beginning_message().stream.trace.cls
138 self.assertIs(type(const_tc[0]), bt2_stream_class._StreamClassConst)
139
fbbe9302
SM
140 def test_getitem_wrong_key_type(self):
141 tc, _, _, _ = self._create_trace_class_with_some_stream_classes()
142 with self.assertRaises(TypeError):
f5567ea8 143 tc["hello"]
fbbe9302
SM
144
145 def test_getitem_wrong_key(self):
146 tc, _, _, _ = self._create_trace_class_with_some_stream_classes()
147 with self.assertRaises(KeyError):
148 tc[4]
149
150 def test_len(self):
151 tc = get_default_trace_class()
152 self.assertEqual(len(tc), 0)
153 tc.create_stream_class()
154 self.assertEqual(len(tc), 1)
155
156 def test_iter(self):
157 tc, sc1, sc2, sc3 = self._create_trace_class_with_some_stream_classes()
158
159 for sc_id, stream_class in tc.items():
fbbe9302 160 if sc_id == 12:
f0a42b33 161 self.assertIs(type(stream_class), bt2_stream_class._StreamClass)
fbbe9302
SM
162 self.assertEqual(stream_class.addr, sc1.addr)
163 elif sc_id == 54:
164 self.assertEqual(stream_class.addr, sc2.addr)
165 elif sc_id == 2018:
166 self.assertEqual(stream_class.addr, sc3.addr)
167
f0a42b33
FD
168 def test_const_iter(self):
169 const_tc = get_const_stream_beginning_message().stream.trace.cls
170 const_sc = list(const_tc.values())[0]
171 self.assertIs(type(const_sc), bt2_stream_class._StreamClassConst)
172
fbbe9302
SM
173 def test_destruction_listener(self):
174 def on_trace_class_destruction(trace_class):
2d6b60ff
SM
175 nonlocal type_of_passed_trace_class
176 type_of_passed_trace_class = type(trace_class)
177
1114a7d5
SM
178 nonlocal num_destruct_calls
179 num_destruct_calls += 1
fbbe9302 180
2d6b60ff 181 type_of_passed_trace_class = None
1114a7d5 182 num_destruct_calls = 0
fbbe9302
SM
183
184 trace_class = get_default_trace_class()
fbbe9302 185
1114a7d5
SM
186 handle1 = trace_class.add_destruction_listener(on_trace_class_destruction)
187 self.assertIs(type(handle1), bt2_utils._ListenerHandle)
188
189 handle2 = trace_class.add_destruction_listener(on_trace_class_destruction)
190
191 trace_class.remove_destruction_listener(handle2)
192
1114a7d5 193 self.assertEqual(num_destruct_calls, 0)
fbbe9302
SM
194
195 del trace_class
196
1114a7d5 197 self.assertEqual(num_destruct_calls, 1)
2d6b60ff 198 self.assertIs(type_of_passed_trace_class, bt2_trace_class._TraceClassConst)
1114a7d5
SM
199
200 def test_remove_destruction_listener_wrong_type(self):
201 trace_class = get_default_trace_class()
202
203 with self.assertRaisesRegex(
204 TypeError, r"'int' is not a '<class 'bt2.utils._ListenerHandle'>' object"
205 ):
206 trace_class.remove_destruction_listener(123)
207
208 def test_remove_destruction_listener_wrong_object(self):
209 def on_trace_class_destruction(trace_class):
210 pass
211
212 trace_class_1 = get_default_trace_class()
213 trace_class_2 = get_default_trace_class()
214
215 handle1 = trace_class_1.add_destruction_listener(on_trace_class_destruction)
216
217 with self.assertRaisesRegex(
218 ValueError,
f5567ea8 219 r"This trace class destruction listener does not match the trace class object\.",
1114a7d5
SM
220 ):
221 trace_class_2.remove_destruction_listener(handle1)
222
223 def test_remove_destruction_listener_twice(self):
224 def on_trace_class_destruction(trace_class):
225 pass
226
227 trace_class = get_default_trace_class()
228 handle = trace_class.add_destruction_listener(on_trace_class_destruction)
229
230 trace_class.remove_destruction_listener(handle)
231
232 with self.assertRaisesRegex(
f5567ea8 233 ValueError, r"This trace class destruction listener was already removed\."
1114a7d5
SM
234 ):
235 trace_class.remove_destruction_listener(handle)
d14ddbba 236
64961f8b
SM
237 def test_raise_in_destruction_listener(self):
238 def on_trace_class_destruction(trace_class):
f5567ea8 239 raise ValueError("it hurts")
64961f8b
SM
240
241 trace_class = get_default_trace_class()
242 trace_class.add_destruction_listener(on_trace_class_destruction)
243
244 del trace_class
245
d14ddbba 246
f5567ea8 247if __name__ == "__main__":
d14ddbba 248 unittest.main()
This page took 0.07916 seconds and 5 git commands to generate.