7 import lttng_ivc
.utils
.ProjectFactory
as ProjectFactory
8 import lttng_ivc
.utils
.utils
as utils
9 import lttng_ivc
.utils
.runtime
as Run
10 import lttng_ivc
.settings
as Settings
15 BC: Feature of the smallest version number will works.
16 TU: Tracing unavailable
18 NOTE: tracing between 2.7 and 2.8 should work but a problem with
19 _ustctl_basic_type prevent event registration. Hence consider in further test
20 that the event registration is expected to fail.
22 +------------------------------------------------------------------------------+
23 | LTTng UST control protocol compatibility matrix |
24 | (between applications and tools linked on LTTng UST and liblttng-ust-ctl) |
25 +--------------------------+------------+------------+------------+------------+
26 | LTTng UST / LTTng Tools | 2.7 (6.0) | 2.8 (6.1) | 2.9 (7.1) | 2.10 (7.2) |
27 +--------------------------+------------+------------+------------+------------+
28 | 2.7 (6.0) | FC | BC | TU | TU |
29 | 2.8 (6.1) | BC | FC | TU | TU |
30 | 2.9 (7.1) | TU | TU | FC | BC |
31 | 2.10 (7.2) | TU | TU | BC | FC |
32 +--------------------------+------------+------------+------------+------------+
34 Version number of this API is defined in include/lttng/ust-abi.h of lttng-ust project
39 First tuple member: lttng-ust label
40 Second tuple member: lttng-tool label
41 Third tuple member: expected scenario
44 event_registration_error
= "Error: UST app recv reg unsupported version"
46 test_matrix_tracing_available
= [
47 ("lttng-ust-2.7", "lttng-tools-2.7", "Success"),
48 ("lttng-ust-2.7", "lttng-tools-2.8", "Unsupported version"),
49 ("lttng-ust-2.7", "lttng-tools-2.9", "Unsupported"),
50 ("lttng-ust-2.7", "lttng-tools-2.10", "Unsupported"),
51 ("lttng-ust-2.8", "lttng-tools-2.7", "Unsupported version"),
52 ("lttng-ust-2.8", "lttng-tools-2.8", "Success"),
53 ("lttng-ust-2.8", "lttng-tools-2.9", "Unsupported"),
54 ("lttng-ust-2.8", "lttng-tools-2.10", "Unsupported"),
55 ("lttng-ust-2.9", "lttng-tools-2.7", "Unsupported"),
56 ("lttng-ust-2.9", "lttng-tools-2.8", "Unsupported"),
57 ("lttng-ust-2.9", "lttng-tools-2.9", "Success"),
58 ("lttng-ust-2.9", "lttng-tools-2.10", "Success"),
59 ("lttng-ust-2.10", "lttng-tools-2.7", "Unsupported"),
60 ("lttng-ust-2.10", "lttng-tools-2.8", "Unsupported"),
61 ("lttng-ust-2.10", "lttng-tools-2.9", "Success"),
62 ("lttng-ust-2.10", "lttng-tools-2.10", "Success"),
65 # Only consider test case for which tracing is valid
66 test_matrix_app_context
= [
67 ("lttng-ust-2.7", "lttng-tools-2.7", ""),
68 ("lttng-ust-2.7", "lttng-tools-2.8", ""),
69 ("lttng-ust-2.7", "lttng-tools-2.9", ""),
70 ("lttng-ust-2.7", "lttng-tools-2.10", ""),
71 ("lttng-ust-2.8", "lttng-tools-2.7", ""),
72 ("lttng-ust-2.8", "lttng-tools-2.8", ""),
73 ("lttng-ust-2.8", "lttng-tools-2.9", ""),
74 ("lttng-ust-2.8", "lttng-tools-2.10", ""),
75 ("lttng-ust-2.9", "lttng-tools-2.7", ""),
76 ("lttng-ust-2.9", "lttng-tools-2.8", ""),
77 ("lttng-ust-2.9", "lttng-tools-2.9", ""),
78 ("lttng-ust-2.9", "lttng-tools-2.10", ""),
79 ("lttng-ust-2.10", "lttng-tools-2.7", ""),
80 ("lttng-ust-2.10", "lttng-tools-2.8", ""),
81 ("lttng-ust-2.10", "lttng-tools-2.9", ""),
82 ("lttng-ust-2.10", "lttng-tools-2.10", ""),
86 Statedump are supported starting at lttng-ust >= 2.9.
87 No need to test for prior lttng-ust givent that there is also a bump leading to
88 loss of tracing for application running under lttng-ust < 2.9.
90 test_matrix_regen_statedump
= [
91 ("lttng-ust-2.9", "lttng-tools-2.9", True),
92 ("lttng-ust-2.9", "lttng-tools-2.10", True),
93 ("lttng-ust-2.10", "lttng-tools-2.9", True),
94 ("lttng-ust-2.10", "lttng-tools-2.10", True),
97 test_matrix_starglobing_enabler
= [
98 ("lttng-ust-2.9", "lttng-tools-2.9", "Unsupported by tools"),
99 ("lttng-ust-2.9", "lttng-tools-2.10", "Unsupported by ust"),
100 ("lttng-ust-2.10", "lttng-tools-2.9", "Unsupported by tools"),
101 ("lttng-ust-2.10", "lttng-tools-2.10", "Supported"),
104 runtime_matrix_tracing_available
= []
105 runtime_matrix_regen_statedump
= []
106 runtime_rix_starglobing_enabler
= []
108 if not Settings
.test_only
:
109 runtime_matrix_tracing_available
= test_matrix_tracing_available
110 runtime_matrix_regen_statedump
= test_matrix_regen_statedump
111 runtime_matrix_starglobing_enabler
= test_matrix_starglobing_enabler
113 for tup
in test_matrix_tracing_available
:
114 if (tup
[0] in Settings
.test_only
or tup
[1] in
116 runtime_matrix_tracing_available
.append(tup
)
117 for tup
in test_matrix_regen_statedump
:
118 if (tup
[0] in Settings
.test_only
or tup
[1] in
120 runtime_matrix_regen_statedump
.append(tup
)
121 for tup
in test_matrix_starglobing_enabler
:
122 if (tup
[0] in Settings
.test_only
or tup
[1] in
124 runtime_matrix_starglobing_enabler
.append(tup
)
127 @pytest.mark
.parametrize("ust_label,tools_label,outcome", runtime_matrix_tracing_available
)
128 def test_ust_app_tracing_available(tmpdir
, ust_label
, tools_label
, outcome
):
132 # Prepare environment
133 ust
= ProjectFactory
.get_precook(ust_label
)
134 tools
= ProjectFactory
.get_precook(tools_label
)
135 babeltrace
= ProjectFactory
.get_precook(Settings
.default_babeltrace
)
137 tools_runtime_path
= os
.path
.join(str(tmpdir
), "tools")
138 ust_runtime_path
= os
.path
.join(str(tmpdir
), "ust")
139 app_path
= os
.path
.join(str(tmpdir
), "app")
141 with Run
.get_runtime(ust_runtime_path
) as runtime_app
, Run
.get_runtime(tools_runtime_path
) as runtime_tools
:
142 runtime_tools
.add_project(tools
)
143 runtime_tools
.add_project(babeltrace
)
145 runtime_app
.add_project(ust
)
146 runtime_app
.lttng_home
= runtime_tools
.lttng_home
148 trace_path
= os
.path
.join(runtime_tools
.lttng_home
, 'trace')
150 # Make application using the ust runtime
151 shutil
.copytree(Settings
.apps_gen_events_folder
, app_path
)
152 runtime_app
.run("make V=1", cwd
=app_path
)
154 # Start lttng-sessiond
155 sessiond
= utils
.sessiond_spawn(runtime_tools
)
157 # Create session using mi to get path and session name
158 runtime_tools
.run('lttng create trace --output={}'.format(trace_path
))
160 runtime_tools
.run('lttng enable-event -u tp:tptest')
161 runtime_tools
.run('lttng start')
164 cmd
= './app {}'.format(nb_events
)
165 runtime_app
.run(cmd
, cwd
=app_path
)
168 runtime_tools
.run('lttng stop')
169 runtime_tools
.run('lttng destroy -a')
170 cp
= runtime_tools
.subprocess_terminate(sessiond
)
171 if cp
.returncode
!= 0:
172 pytest
.fail("Sessiond return code")
175 cmd
= 'babeltrace {}'.format(trace_path
)
176 if outcome
== "Success":
177 cp_process
, cp_out
, cp_err
= runtime_tools
.run(cmd
)
178 assert(utils
.line_count(cp_out
) == nb_events
)
180 with pytest
.raises(subprocess
.CalledProcessError
):
181 cp_process
, cp_out
, cp_err
= runtime_tools
.run(cmd
)
182 if outcome
== "Unsupported version":
183 assert(utils
.file_contains(runtime_tools
.get_subprocess_stderr_path(sessiond
),
184 [event_registration_error
]))
186 @pytest.mark
.parametrize("ust_label,tools_label, success", runtime_matrix_regen_statedump
)
187 def test_ust_app_regen_statedump(tmpdir
, ust_label
, tools_label
, success
):
195 ust
= ProjectFactory
.get_precook(ust_label
)
196 tools
= ProjectFactory
.get_precook(tools_label
)
197 babeltrace
= ProjectFactory
.get_precook(Settings
.default_babeltrace
)
199 tools_runtime_path
= os
.path
.join(str(tmpdir
), "tools")
200 ust_runtime_path
= os
.path
.join(str(tmpdir
), "ust")
201 app_path
= os
.path
.join(str(tmpdir
), "app")
204 app_sync_start
= os
.path
.join(app_path
, 'sync_start')
205 app_sync_end
= os
.path
.join(app_path
, 'sync_end')
207 with Run
.get_runtime(ust_runtime_path
) as runtime_app
, Run
.get_runtime(tools_runtime_path
) as runtime_tools
:
208 runtime_tools
.add_project(tools
)
209 runtime_tools
.add_project(babeltrace
)
211 runtime_app
.add_project(ust
)
212 runtime_app
.lttng_home
= runtime_tools
.lttng_home
214 trace_path
= os
.path
.join(runtime_tools
.lttng_home
, 'trace')
216 # Make application using the ust runtime
217 shutil
.copytree(Settings
.apps_gen_events_folder
, app_path
)
218 runtime_app
.run("make V=1", cwd
=app_path
)
220 # Start lttng-sessiond
221 sessiond
= utils
.sessiond_spawn(runtime_tools
)
223 # Create session using mi to get path and session name
224 runtime_tools
.run('lttng create trace --output={}'.format(trace_path
))
226 runtime_tools
.run('lttng enable-event -u lttng_ust_statedump:start,lttng_ust_statedump:end')
227 runtime_tools
.run('lttng start')
230 cmd
= './app {} 0 {} {}'.format(nb_events
, app_sync_start
, app_sync_end
)
231 runtime_app
.spawn_subprocess(cmd
, cwd
=app_path
)
233 utils
.wait_for_file(app_sync_start
)
236 with pytest
.raises(subprocess
.CalledProcessError
):
237 runtime_tools
.run('lttng regenerate statedump')
239 runtime_tools
.run('lttng regenerate statedump')
241 utils
.create_empty_file(app_sync_end
)
244 runtime_tools
.run('lttng stop')
245 runtime_tools
.run('lttng destroy -a')
246 cp
= runtime_tools
.subprocess_terminate(sessiond
)
247 if cp
.returncode
!= 0:
248 pytest
.fail("Sessiond return code")
250 # Read trace with babeltrace and check for event count via number of line
251 cmd
= 'babeltrace {}'.format(trace_path
)
252 cp_process
, cp_out
, cp_err
= runtime_tools
.run(cmd
)
253 assert(utils
.line_count(cp_out
) == expected_events
)
255 @pytest.mark
.parametrize("ust_label,tools_label, scenario", runtime_matrix_starglobing_enabler
)
256 def test_ust_app_starglobing_enabler(tmpdir
, ust_label
, tools_label
, scenario
):
260 if scenario
== "Unsupported by ust":
263 expected_events
= nb_events
265 # Prepare environment
266 ust
= ProjectFactory
.get_precook(ust_label
)
267 tools
= ProjectFactory
.get_precook(tools_label
)
268 babeltrace
= ProjectFactory
.get_precook(Settings
.default_babeltrace
)
270 tools_runtime_path
= os
.path
.join(str(tmpdir
), "tools")
271 ust_runtime_path
= os
.path
.join(str(tmpdir
), "ust")
272 app_path
= os
.path
.join(str(tmpdir
), "app")
274 with Run
.get_runtime(ust_runtime_path
) as runtime_app
, Run
.get_runtime(tools_runtime_path
) as runtime_tools
:
275 runtime_tools
.add_project(tools
)
276 runtime_tools
.add_project(babeltrace
)
278 runtime_app
.add_project(ust
)
279 runtime_app
.lttng_home
= runtime_tools
.lttng_home
281 trace_path
= os
.path
.join(runtime_tools
.lttng_home
, 'trace')
283 # Make application using the ust runtime
284 shutil
.copytree(Settings
.apps_gen_events_folder
, app_path
)
285 runtime_app
.run("make V=1", cwd
=app_path
)
287 # Start lttng-sessiond
288 sessiond
= utils
.sessiond_spawn(runtime_tools
)
290 # Create session using mi to get path and session name
291 runtime_tools
.run('lttng create trace --output={}'.format(trace_path
))
293 # If unsupported by tools simply finish early
294 if scenario
== "Unsupported by tools":
295 with pytest
.raises(subprocess
.CalledProcessError
):
296 runtime_tools
.run('lttng enable-event -u "tp:*te*"')
298 # TODO move this to internal runtime...
299 cp
= runtime_tools
.subprocess_terminate(sessiond
)
300 if cp
.returncode
!= 0:
301 pytest
.fail("Sessiond return code")
304 runtime_tools
.run('lttng enable-event -u "tp:*te*"')
306 runtime_tools
.run('lttng start')
309 cmd
= './app {}'.format(nb_events
)
310 runtime_app
.run(cmd
, cwd
=app_path
)
313 runtime_tools
.run('lttng stop')
314 runtime_tools
.run('lttng destroy -a')
315 cp
= runtime_tools
.subprocess_terminate(sessiond
)
316 if cp
.returncode
!= 0:
317 pytest
.fail("Sessiond return code")
319 # Read trace with babeltrace and check for event count via number of line
320 cmd
= 'babeltrace {}'.format(trace_path
)
321 cp_process
, cp_out
, cp_err
= runtime_tools
.run(cmd
)
322 assert(utils
.line_count(cp_out
) == expected_events
)