Fix: src.ctf.fs: initialize the other_entry variable
[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
d907165c
SM
21
22
bbff0ab4 23test_ctf_traces_path = os.environ['BT_CTF_TRACES_PATH']
d907165c
SM
24
25
1d4ac4b6
FD
26# Key to sort streams in a predictable order.
27def sort_predictably(stream):
0dc26f89 28 return stream['port-name']
d907165c
SM
29
30
31class QueryTraceInfoClockOffsetTestCase(unittest.TestCase):
d907165c
SM
32 def setUp(self):
33 ctf = bt2.find_plugin('ctf')
34 self._fs = ctf.source_component_classes['fs']
35
73760435 36 self._inputs = [
cfbd7cf3
FD
37 os.path.join(test_ctf_traces_path, 'intersection', '3eventsintersect')
38 ]
d907165c
SM
39
40 def _check(self, trace, offset):
5f2a1585 41 streams = sorted(trace['stream-infos'], key=sort_predictably)
d907165c
SM
42 self.assertEqual(streams[0]['range-ns']['begin'], 13515309000000000 + offset)
43 self.assertEqual(streams[0]['range-ns']['end'], 13515309000000100 + offset)
44 self.assertEqual(streams[1]['range-ns']['begin'], 13515309000000070 + offset)
45 self.assertEqual(streams[1]['range-ns']['end'], 13515309000000120 + offset)
46
47 # Test various cominations of the clock-class-offset-s and
5f2a1585 48 # clock-class-offset-ns parameters to babeltrace.trace-infos queries.
d907165c
SM
49
50 # Without clock class offset
51
52 def test_no_clock_class_offset(self):
3c729b9a 53 res = bt2.QueryExecutor(
5f2a1585 54 self._fs, 'babeltrace.trace-infos', {'inputs': self._inputs}
3c729b9a 55 ).query()
d907165c
SM
56 trace = res[0]
57 self._check(trace, 0)
58
59 # With clock-class-offset-s
60
61 def test_clock_class_offset_s(self):
3c729b9a 62 res = bt2.QueryExecutor(
1a29b831 63 self._fs,
5f2a1585 64 'babeltrace.trace-infos',
1a29b831 65 {'inputs': self._inputs, 'clock-class-offset-s': 2},
3c729b9a 66 ).query()
d907165c
SM
67 trace = res[0]
68 self._check(trace, 2000000000)
69
70 # With clock-class-offset-ns
71
72 def test_clock_class_offset_ns(self):
3c729b9a 73 res = bt2.QueryExecutor(
1a29b831 74 self._fs,
5f2a1585 75 'babeltrace.trace-infos',
1a29b831 76 {'inputs': self._inputs, 'clock-class-offset-ns': 2},
3c729b9a 77 ).query()
d907165c
SM
78 trace = res[0]
79 self._check(trace, 2)
80
81 # With both, negative
82
83 def test_clock_class_offset_both(self):
3c729b9a 84 res = bt2.QueryExecutor(
cfbd7cf3 85 self._fs,
5f2a1585 86 'babeltrace.trace-infos',
cfbd7cf3 87 {
73760435 88 'inputs': self._inputs,
cfbd7cf3
FD
89 'clock-class-offset-s': -2,
90 'clock-class-offset-ns': -2,
91 },
3c729b9a 92 ).query()
d907165c
SM
93 trace = res[0]
94 self._check(trace, -2000000002)
95
96 def test_clock_class_offset_s_wrong_type(self):
a635e507 97 with self.assertRaises(bt2._Error):
3c729b9a 98 bt2.QueryExecutor(
cfbd7cf3 99 self._fs,
5f2a1585 100 'babeltrace.trace-infos',
73760435 101 {'inputs': self._inputs, 'clock-class-offset-s': "2"},
3c729b9a 102 ).query()
d907165c
SM
103
104 def test_clock_class_offset_s_wrong_type_none(self):
a635e507 105 with self.assertRaises(bt2._Error):
3c729b9a 106 bt2.QueryExecutor(
cfbd7cf3 107 self._fs,
5f2a1585 108 'babeltrace.trace-infos',
73760435 109 {'inputs': self._inputs, 'clock-class-offset-s': None},
3c729b9a 110 ).query()
d907165c
SM
111
112 def test_clock_class_offset_ns_wrong_type(self):
a635e507 113 with self.assertRaises(bt2._Error):
3c729b9a 114 bt2.QueryExecutor(
cfbd7cf3 115 self._fs,
5f2a1585 116 'babeltrace.trace-infos',
73760435 117 {'inputs': self._inputs, 'clock-class-offset-ns': "2"},
3c729b9a 118 ).query()
d907165c
SM
119
120 def test_clock_class_offset_ns_wrong_type_none(self):
a635e507 121 with self.assertRaises(bt2._Error):
3c729b9a 122 bt2.QueryExecutor(
cfbd7cf3 123 self._fs,
5f2a1585 124 'babeltrace.trace-infos',
73760435 125 {'inputs': self._inputs, 'clock-class-offset-ns': None},
3c729b9a 126 ).query()
d907165c 127
a38d7650
SM
128
129class QueryTraceInfoPortNameTestCase(unittest.TestCase):
130 def setUp(self):
131 ctf = bt2.find_plugin("ctf")
132 self._fs = ctf.source_component_classes["fs"]
133
a38d7650 134 def test_trace_uuid_stream_class_id_no_stream_id(self):
3c729b9a 135 res = bt2.QueryExecutor(
a38d7650 136 self._fs,
5f2a1585 137 "babeltrace.trace-infos",
a38d7650 138 {
73760435 139 "inputs": [
a38d7650
SM
140 os.path.join(
141 test_ctf_traces_path, "intersection", "3eventsintersect"
142 )
143 ]
144 },
3c729b9a 145 ).query()
f2bad367 146
f2bad367 147 if os.environ['BT_OS_TYPE'] == 'mingw':
b00e2e76
SM
148 os_stream_path = (
149 '\\tests\\data\\ctf-traces\\intersection\\3eventsintersect\\'
150 )
151 else:
152 os_stream_path = '/tests/data/ctf-traces/intersection/3eventsintersect/'
f2bad367 153
a38d7650
SM
154 self.assertEqual(len(res), 1)
155 trace = res[0]
5f2a1585 156 streams = sorted(trace["stream-infos"], key=sort_predictably)
a38d7650 157 self.assertEqual(len(streams), 2)
5687169d 158 self.assertRegex(
a38d7650 159 str(streams[0]["port-name"]),
f2bad367 160 r"^7afe8fbe-79b8-4f6a-bbc7-d0c782e7ddaf \| 0 \| .*"
b00e2e76 161 + re.escape(os_stream_path + "test_stream_0")
f2bad367 162 + r"$",
a38d7650 163 )
5687169d 164 self.assertRegex(
a38d7650 165 str(streams[1]["port-name"]),
f2bad367 166 r"^7afe8fbe-79b8-4f6a-bbc7-d0c782e7ddaf \| 0 \| .*"
b00e2e76 167 + re.escape(os_stream_path + "test_stream_1")
f2bad367 168 + r"$",
a38d7650
SM
169 )
170
171 def test_trace_uuid_no_stream_class_id_no_stream_id(self):
3c729b9a 172 res = bt2.QueryExecutor(
a38d7650 173 self._fs,
5f2a1585 174 "babeltrace.trace-infos",
73760435 175 {"inputs": [os.path.join(test_ctf_traces_path, "succeed", "succeed1")]},
3c729b9a 176 ).query()
f2bad367 177
f2bad367 178 if os.environ['BT_OS_TYPE'] == 'mingw':
b00e2e76
SM
179 os_stream_path = '\\tests\\data\\ctf-traces\\succeed\\succeed1\\dummystream'
180 else:
181 os_stream_path = '/tests/data/ctf-traces/succeed/succeed1/dummystream'
f2bad367 182
a38d7650
SM
183 self.assertEqual(len(res), 1)
184 trace = res[0]
5f2a1585 185 streams = sorted(trace["stream-infos"], key=sort_predictably)
a38d7650 186 self.assertEqual(len(streams), 1)
5687169d 187 self.assertRegex(
a38d7650 188 str(streams[0]["port-name"]),
f2bad367 189 r"^2a6422d0-6cee-11e0-8c08-cb07d7b3a564 \| .*"
b00e2e76 190 + re.escape(os_stream_path)
f2bad367 191 + r"$",
a38d7650
SM
192 )
193
194
1d4ac4b6
FD
195class QueryTraceInfoRangeTestCase(unittest.TestCase):
196 def setUp(self):
197 ctf = bt2.find_plugin("ctf")
198 self._fs = ctf.source_component_classes["fs"]
199
1d4ac4b6 200 def test_trace_no_range(self):
1a29b831 201 # This trace has no `timestamp_begin` and `timestamp_end` in its
5f2a1585 202 # packet context. The `babeltrace.trace-infos` query should omit
1a29b831
PP
203 # the `range-ns` fields in the `trace` and `stream` data
204 # structures.
1d4ac4b6 205
3c729b9a 206 res = bt2.QueryExecutor(
1d4ac4b6 207 self._fs,
5f2a1585 208 "babeltrace.trace-infos",
73760435 209 {"inputs": [os.path.join(test_ctf_traces_path, "succeed", "succeed1")]},
3c729b9a 210 ).query()
1d4ac4b6
FD
211
212 self.assertEqual(len(res), 1)
213 trace = res[0]
5f2a1585 214 streams = trace["stream-infos"]
1d4ac4b6
FD
215 self.assertEqual(len(streams), 1)
216
217 self.assertRaises(KeyError, lambda: trace['range-ns'])
218 self.assertRaises(KeyError, lambda: streams[0]['range-ns'])
219
ce75de14
SM
220 def test_trace_with_tracefile_rotation(self):
221 res = bt2.QueryExecutor(
222 self._fs,
223 "babeltrace.trace-infos",
224 {
225 "inputs": [
226 os.path.join(
227 test_ctf_traces_path,
228 "succeed",
229 "lttng-tracefile-rotation",
230 "kernel",
231 )
232 ]
233 },
234 ).query()
235
236 self.assertEqual(len(res), 1)
237 trace = res[0]
238 streams = trace["stream-infos"]
239 self.assertEqual(len(streams), 4)
240
241 # Note: the end timestamps are not the end timestamps found in the
242 # index files, because fix_index_lttng_event_after_packet_bug changes
243 # them based on the time of the last event in the stream.
244
245 self.assertEqual(streams[0]['range-ns']['begin'], 1571261795455986789)
246 self.assertEqual(streams[0]['range-ns']['end'], 1571261797582611840)
247
248 self.assertEqual(streams[1]['range-ns']['begin'], 1571261795456368232)
249 self.assertEqual(streams[1]['range-ns']['end'], 1571261797577754111)
250
251 self.assertEqual(streams[2]['range-ns']['begin'], 1571261795456748255)
252 self.assertEqual(streams[2]['range-ns']['end'], 1571261797577727795)
253
254 self.assertEqual(streams[3]['range-ns']['begin'], 1571261795457285142)
255 self.assertEqual(streams[3]['range-ns']['end'], 1571261797582522088)
256
1d4ac4b6 257
8e03dac5
FD
258class QueryTraceInfoPacketTimestampQuirksTestCase(unittest.TestCase):
259 def setUp(self):
260 ctf = bt2.find_plugin('ctf')
261 self._fs = ctf.source_component_classes['fs']
262 self._path = os.path.join(test_ctf_traces_path, 'succeed')
263
264 def _test_lttng_quirks(self, trace_name):
265 res = bt2.QueryExecutor(
266 self._fs,
5f2a1585 267 "babeltrace.trace-infos",
8e03dac5
FD
268 {"inputs": [os.path.join(self._path, trace_name)]},
269 ).query()
270
271 self.assertEqual(len(res), 1)
272 return res[0]
273
274 def test_event_after_packet(self):
275 trace = self._test_lttng_quirks("lttng-event-after-packet")
5f2a1585 276 streams = trace["stream-infos"]
8e03dac5
FD
277 self.assertEqual(len(streams), 1)
278
279 self.assertEqual(streams[0]['range-ns']['begin'], 1565957300948091100)
280 self.assertEqual(streams[0]['range-ns']['end'], 1565957302180016069)
281
282 def test_lttng_crash(self):
283 trace = self._test_lttng_quirks("lttng-crash")
5f2a1585 284 streams = trace["stream-infos"]
8e03dac5
FD
285 self.assertEqual(len(streams), 1)
286
287 self.assertEqual(streams[0]['range-ns']['begin'], 1565891729288866738)
288 self.assertEqual(streams[0]['range-ns']['end'], 1565891729293526525)
289
290
d907165c
SM
291if __name__ == '__main__':
292 unittest.main()
This page took 0.05844 seconds and 4 git commands to generate.