python: run isort on everything
[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):
1114a7d5
SM
175 nonlocal num_destruct_calls
176 num_destruct_calls += 1
fbbe9302 177
1114a7d5 178 num_destruct_calls = 0
fbbe9302
SM
179
180 trace_class = get_default_trace_class()
fbbe9302 181
1114a7d5
SM
182 handle1 = trace_class.add_destruction_listener(on_trace_class_destruction)
183 self.assertIs(type(handle1), bt2_utils._ListenerHandle)
184
185 handle2 = trace_class.add_destruction_listener(on_trace_class_destruction)
186
187 trace_class.remove_destruction_listener(handle2)
188
1114a7d5 189 self.assertEqual(num_destruct_calls, 0)
fbbe9302
SM
190
191 del trace_class
192
1114a7d5
SM
193 self.assertEqual(num_destruct_calls, 1)
194
195 def test_remove_destruction_listener_wrong_type(self):
196 trace_class = get_default_trace_class()
197
198 with self.assertRaisesRegex(
199 TypeError, r"'int' is not a '<class 'bt2.utils._ListenerHandle'>' object"
200 ):
201 trace_class.remove_destruction_listener(123)
202
203 def test_remove_destruction_listener_wrong_object(self):
204 def on_trace_class_destruction(trace_class):
205 pass
206
207 trace_class_1 = get_default_trace_class()
208 trace_class_2 = get_default_trace_class()
209
210 handle1 = trace_class_1.add_destruction_listener(on_trace_class_destruction)
211
212 with self.assertRaisesRegex(
213 ValueError,
f5567ea8 214 r"This trace class destruction listener does not match the trace class object\.",
1114a7d5
SM
215 ):
216 trace_class_2.remove_destruction_listener(handle1)
217
218 def test_remove_destruction_listener_twice(self):
219 def on_trace_class_destruction(trace_class):
220 pass
221
222 trace_class = get_default_trace_class()
223 handle = trace_class.add_destruction_listener(on_trace_class_destruction)
224
225 trace_class.remove_destruction_listener(handle)
226
227 with self.assertRaisesRegex(
f5567ea8 228 ValueError, r"This trace class destruction listener was already removed\."
1114a7d5
SM
229 ):
230 trace_class.remove_destruction_listener(handle)
d14ddbba 231
64961f8b
SM
232 def test_raise_in_destruction_listener(self):
233 def on_trace_class_destruction(trace_class):
f5567ea8 234 raise ValueError("it hurts")
64961f8b
SM
235
236 trace_class = get_default_trace_class()
237 trace_class.add_destruction_listener(on_trace_class_destruction)
238
239 del trace_class
240
d14ddbba 241
f5567ea8 242if __name__ == "__main__":
d14ddbba 243 unittest.main()
This page took 0.063951 seconds and 4 git commands to generate.