ctf: remove unused fields from `babeltrace.trace-info` query
[babeltrace.git] / tests / plugins / src.ctf.fs / query / test_query_trace_info.py
CommitLineData
d907165c
SM
1# Copyright (C) 2019 Simon Marchi <simon.marchi@efficios.com>
2#
3# This program is free software; you can redistribute it and/or
4# modify it under the terms of the GNU General Public License
5# as published by the Free Software Foundation; only version 2
6# of the License.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program; if not, write to the Free Software
15# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16
17import unittest
18import bt2
19import os
a38d7650 20import re
f2bad367 21from pathlib import PureWindowsPath, PurePosixPath
d907165c
SM
22
23
bbff0ab4 24test_ctf_traces_path = os.environ['BT_CTF_TRACES_PATH']
d907165c
SM
25
26
1d4ac4b6
FD
27# Key to sort streams in a predictable order.
28def sort_predictably(stream):
0dc26f89 29 return stream['port-name']
d907165c
SM
30
31
32class QueryTraceInfoClockOffsetTestCase(unittest.TestCase):
d907165c
SM
33 def setUp(self):
34 ctf = bt2.find_plugin('ctf')
35 self._fs = ctf.source_component_classes['fs']
36
73760435 37 self._inputs = [
cfbd7cf3
FD
38 os.path.join(test_ctf_traces_path, 'intersection', '3eventsintersect')
39 ]
d907165c
SM
40
41 def _check(self, trace, offset):
cfbd7cf3
FD
42 self.assertEqual(
43 trace['intersection-range-ns']['begin'], 13515309000000070 + offset
44 )
45 self.assertEqual(
46 trace['intersection-range-ns']['end'], 13515309000000100 + offset
47 )
d907165c 48
1d4ac4b6 49 streams = sorted(trace['streams'], key=sort_predictably)
d907165c
SM
50 self.assertEqual(streams[0]['range-ns']['begin'], 13515309000000000 + offset)
51 self.assertEqual(streams[0]['range-ns']['end'], 13515309000000100 + offset)
52 self.assertEqual(streams[1]['range-ns']['begin'], 13515309000000070 + offset)
53 self.assertEqual(streams[1]['range-ns']['end'], 13515309000000120 + offset)
54
55 # Test various cominations of the clock-class-offset-s and
1a29b831 56 # clock-class-offset-ns parameters to babeltrace.trace-info queries.
d907165c
SM
57
58 # Without clock class offset
59
60 def test_no_clock_class_offset(self):
3c729b9a 61 res = bt2.QueryExecutor(
1a29b831 62 self._fs, 'babeltrace.trace-info', {'inputs': self._inputs}
3c729b9a 63 ).query()
d907165c
SM
64 trace = res[0]
65 self._check(trace, 0)
66
67 # With clock-class-offset-s
68
69 def test_clock_class_offset_s(self):
3c729b9a 70 res = bt2.QueryExecutor(
1a29b831
PP
71 self._fs,
72 'babeltrace.trace-info',
73 {'inputs': self._inputs, 'clock-class-offset-s': 2},
3c729b9a 74 ).query()
d907165c
SM
75 trace = res[0]
76 self._check(trace, 2000000000)
77
78 # With clock-class-offset-ns
79
80 def test_clock_class_offset_ns(self):
3c729b9a 81 res = bt2.QueryExecutor(
1a29b831
PP
82 self._fs,
83 'babeltrace.trace-info',
84 {'inputs': self._inputs, 'clock-class-offset-ns': 2},
3c729b9a 85 ).query()
d907165c
SM
86 trace = res[0]
87 self._check(trace, 2)
88
89 # With both, negative
90
91 def test_clock_class_offset_both(self):
3c729b9a 92 res = bt2.QueryExecutor(
cfbd7cf3 93 self._fs,
1a29b831 94 'babeltrace.trace-info',
cfbd7cf3 95 {
73760435 96 'inputs': self._inputs,
cfbd7cf3
FD
97 'clock-class-offset-s': -2,
98 'clock-class-offset-ns': -2,
99 },
3c729b9a 100 ).query()
d907165c
SM
101 trace = res[0]
102 self._check(trace, -2000000002)
103
104 def test_clock_class_offset_s_wrong_type(self):
a635e507 105 with self.assertRaises(bt2._Error):
3c729b9a 106 bt2.QueryExecutor(
cfbd7cf3 107 self._fs,
1a29b831 108 'babeltrace.trace-info',
73760435 109 {'inputs': self._inputs, 'clock-class-offset-s': "2"},
3c729b9a 110 ).query()
d907165c
SM
111
112 def test_clock_class_offset_s_wrong_type_none(self):
a635e507 113 with self.assertRaises(bt2._Error):
3c729b9a 114 bt2.QueryExecutor(
cfbd7cf3 115 self._fs,
1a29b831 116 'babeltrace.trace-info',
73760435 117 {'inputs': self._inputs, 'clock-class-offset-s': None},
3c729b9a 118 ).query()
d907165c
SM
119
120 def test_clock_class_offset_ns_wrong_type(self):
a635e507 121 with self.assertRaises(bt2._Error):
3c729b9a 122 bt2.QueryExecutor(
cfbd7cf3 123 self._fs,
1a29b831 124 'babeltrace.trace-info',
73760435 125 {'inputs': self._inputs, 'clock-class-offset-ns': "2"},
3c729b9a 126 ).query()
d907165c
SM
127
128 def test_clock_class_offset_ns_wrong_type_none(self):
a635e507 129 with self.assertRaises(bt2._Error):
3c729b9a 130 bt2.QueryExecutor(
cfbd7cf3 131 self._fs,
1a29b831 132 'babeltrace.trace-info',
73760435 133 {'inputs': self._inputs, 'clock-class-offset-ns': None},
3c729b9a 134 ).query()
d907165c 135
a38d7650
SM
136
137class QueryTraceInfoPortNameTestCase(unittest.TestCase):
138 def setUp(self):
139 ctf = bt2.find_plugin("ctf")
140 self._fs = ctf.source_component_classes["fs"]
141
a38d7650 142 def test_trace_uuid_stream_class_id_no_stream_id(self):
3c729b9a 143 res = bt2.QueryExecutor(
a38d7650 144 self._fs,
1a29b831 145 "babeltrace.trace-info",
a38d7650 146 {
73760435 147 "inputs": [
a38d7650
SM
148 os.path.join(
149 test_ctf_traces_path, "intersection", "3eventsintersect"
150 )
151 ]
152 },
3c729b9a 153 ).query()
f2bad367
JR
154
155 os_stream_path = PurePosixPath(
156 '/tests/data/ctf-traces/intersection/3eventsintersect/'
157 )
158 if os.environ['BT_OS_TYPE'] == 'mingw':
159 os_stream_path = PureWindowsPath(os_stream_path)
160
a38d7650
SM
161 self.assertEqual(len(res), 1)
162 trace = res[0]
1d4ac4b6 163 streams = sorted(trace["streams"], key=sort_predictably)
a38d7650
SM
164 self.assertEqual(len(streams), 2)
165 self.assertRegexpMatches(
166 str(streams[0]["port-name"]),
f2bad367
JR
167 r"^7afe8fbe-79b8-4f6a-bbc7-d0c782e7ddaf \| 0 \| .*"
168 + re.escape(str(os_stream_path / "test_stream_0"))
169 + r"$",
a38d7650
SM
170 )
171 self.assertRegexpMatches(
172 str(streams[1]["port-name"]),
f2bad367
JR
173 r"^7afe8fbe-79b8-4f6a-bbc7-d0c782e7ddaf \| 0 \| .*"
174 + re.escape(str(os_stream_path / "test_stream_1"))
175 + r"$",
a38d7650
SM
176 )
177
178 def test_trace_uuid_no_stream_class_id_no_stream_id(self):
3c729b9a 179 res = bt2.QueryExecutor(
a38d7650 180 self._fs,
1a29b831 181 "babeltrace.trace-info",
73760435 182 {"inputs": [os.path.join(test_ctf_traces_path, "succeed", "succeed1")]},
3c729b9a 183 ).query()
f2bad367
JR
184
185 os_stream_path = PurePosixPath(
186 '/tests/data/ctf-traces/succeed/succeed1/dummystream'
187 )
188 if os.environ['BT_OS_TYPE'] == 'mingw':
189 os_stream_path = PureWindowsPath(os_stream_path)
190
a38d7650
SM
191 self.assertEqual(len(res), 1)
192 trace = res[0]
1d4ac4b6 193 streams = sorted(trace["streams"], key=sort_predictably)
a38d7650
SM
194 self.assertEqual(len(streams), 1)
195 self.assertRegexpMatches(
196 str(streams[0]["port-name"]),
f2bad367
JR
197 r"^2a6422d0-6cee-11e0-8c08-cb07d7b3a564 \| .*"
198 + re.escape(str(os_stream_path))
199 + r"$",
a38d7650
SM
200 )
201
202
1d4ac4b6
FD
203class QueryTraceInfoRangeTestCase(unittest.TestCase):
204 def setUp(self):
205 ctf = bt2.find_plugin("ctf")
206 self._fs = ctf.source_component_classes["fs"]
207
1d4ac4b6 208 def test_trace_no_range(self):
1a29b831
PP
209 # This trace has no `timestamp_begin` and `timestamp_end` in its
210 # packet context. The `babeltrace.trace-info` query should omit
211 # the `range-ns` fields in the `trace` and `stream` data
212 # structures.
1d4ac4b6 213
3c729b9a 214 res = bt2.QueryExecutor(
1d4ac4b6 215 self._fs,
1a29b831 216 "babeltrace.trace-info",
73760435 217 {"inputs": [os.path.join(test_ctf_traces_path, "succeed", "succeed1")]},
3c729b9a 218 ).query()
1d4ac4b6
FD
219
220 self.assertEqual(len(res), 1)
221 trace = res[0]
222 streams = trace["streams"]
223 self.assertEqual(len(streams), 1)
224
225 self.assertRaises(KeyError, lambda: trace['range-ns'])
226 self.assertRaises(KeyError, lambda: streams[0]['range-ns'])
227
228
8e03dac5
FD
229class QueryTraceInfoPacketTimestampQuirksTestCase(unittest.TestCase):
230 def setUp(self):
231 ctf = bt2.find_plugin('ctf')
232 self._fs = ctf.source_component_classes['fs']
233 self._path = os.path.join(test_ctf_traces_path, 'succeed')
234
235 def _test_lttng_quirks(self, trace_name):
236 res = bt2.QueryExecutor(
237 self._fs,
238 "babeltrace.trace-info",
239 {"inputs": [os.path.join(self._path, trace_name)]},
240 ).query()
241
242 self.assertEqual(len(res), 1)
243 return res[0]
244
245 def test_event_after_packet(self):
246 trace = self._test_lttng_quirks("lttng-event-after-packet")
247 streams = trace["streams"]
248 self.assertEqual(len(streams), 1)
249
250 self.assertEqual(streams[0]['range-ns']['begin'], 1565957300948091100)
251 self.assertEqual(streams[0]['range-ns']['end'], 1565957302180016069)
252
253 def test_lttng_crash(self):
254 trace = self._test_lttng_quirks("lttng-crash")
255 streams = trace["streams"]
256 self.assertEqual(len(streams), 1)
257
258 self.assertEqual(streams[0]['range-ns']['begin'], 1565891729288866738)
259 self.assertEqual(streams[0]['range-ns']['end'], 1565891729293526525)
260
261
d907165c
SM
262if __name__ == '__main__':
263 unittest.main()
This page took 0.043621 seconds and 4 git commands to generate.