1 # Copyright (c) 2017 Jonathan Rajotte-Julien <jonathan.rajotte-julien@efficios.com>
3 # Permission is hereby granted, free of charge, to any person obtaining a copy
4 # of this software and associated documentation files (the "Software"), to deal
5 # in the Software without restriction, including without limitation the rights
6 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 # copies of the Software, and to permit persons to whom the Software is
8 # furnished to do so, subject to the following conditions:
10 # The above copyright notice and this permission notice shall be included in all
11 # copies or substantial portions of the Software.
13 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 import lttng_ivc
.utils
.ProjectFactory
as ProjectFactory
30 import lttng_ivc
.utils
.utils
as utils
31 import lttng_ivc
.utils
.runtime
as Run
32 import lttng_ivc
.settings
as Settings
35 TODO: Add Command header section
39 TODO: snapshot, file rotation, rotate
43 First member: relayd via lttng-tools
44 Second member: consumerd via lttng-tools
46 test_matrix_streaming_base
= [
47 ("lttng-tools-2.7", "lttng-tools-2.7", True),
48 ("lttng-tools-2.7", "lttng-tools-2.8", True),
49 ("lttng-tools-2.7", "lttng-tools-2.9", True),
50 ("lttng-tools-2.7", "lttng-tools-2.10", True),
51 ("lttng-tools-2.8", "lttng-tools-2.7", True),
52 ("lttng-tools-2.8", "lttng-tools-2.8", True),
53 ("lttng-tools-2.8", "lttng-tools-2.9", True),
54 ("lttng-tools-2.8", "lttng-tools-2.10", True),
55 ("lttng-tools-2.9", "lttng-tools-2.7", True),
56 ("lttng-tools-2.9", "lttng-tools-2.8", True),
57 ("lttng-tools-2.9", "lttng-tools-2.9", True),
58 ("lttng-tools-2.9", "lttng-tools-2.10", True),
59 ("lttng-tools-2.10", "lttng-tools-2.7", True),
60 ("lttng-tools-2.10", "lttng-tools-2.8", True),
61 ("lttng-tools-2.10", "lttng-tools-2.9", True),
62 ("lttng-tools-2.10", "lttng-tools-2.10", True),
65 test_matrix_streaming_regenerate_metadata
= [
66 ("lttng-tools-2.7", "lttng-tools-2.7", "metadata regenerate", "Unsupported by tools"),
67 ("lttng-tools-2.7", "lttng-tools-2.8", "metadata regenerate", "Unsupported by relayd"),
68 ("lttng-tools-2.7", "lttng-tools-2.9", "regenerate metadata", "Unsupported by relayd"),
69 ("lttng-tools-2.7", "lttng-tools-2.10", "regenerate metadata", "Unsupported by relayd"),
70 ("lttng-tools-2.8", "lttng-tools-2.7", "metadata regenerate", "Unsupported by tools"),
71 ("lttng-tools-2.8", "lttng-tools-2.8", "metadata regenerate", "Supported"),
72 ("lttng-tools-2.8", "lttng-tools-2.9", "regenerate metadata", "Supported"),
73 ("lttng-tools-2.8", "lttng-tools-2.10", "regenerate metadata", "Supported"),
74 ("lttng-tools-2.9", "lttng-tools-2.7", "metadata regenerate", "Unsupported by tools"),
75 ("lttng-tools-2.9", "lttng-tools-2.8", "metadata regenerate", "Supported"),
76 ("lttng-tools-2.9", "lttng-tools-2.9", "regenerate metadata", "Supported"),
77 ("lttng-tools-2.9", "lttng-tools-2.10", "regenerate metadata", "Supported"),
78 ("lttng-tools-2.10", "lttng-tools-2.7", "metadata regenerate", "Unsupported by tools"),
79 ("lttng-tools-2.10", "lttng-tools-2.8", "metadata regenerate", "Supported"),
80 ("lttng-tools-2.10", "lttng-tools-2.9", "regenerate metadata", "Supported"),
81 ("lttng-tools-2.10", "lttng-tools-2.10", "regenerate metadata", "Supported"),
84 test_matrix_live_base
= [
85 ("lttng-tools-2.7", "lttng-tools-2.7", True),
86 ("lttng-tools-2.7", "lttng-tools-2.8", True),
87 ("lttng-tools-2.7", "lttng-tools-2.9", True),
88 ("lttng-tools-2.7", "lttng-tools-2.10", True),
89 ("lttng-tools-2.8", "lttng-tools-2.7", True),
90 ("lttng-tools-2.8", "lttng-tools-2.8", True),
91 ("lttng-tools-2.8", "lttng-tools-2.9", True),
92 ("lttng-tools-2.8", "lttng-tools-2.10", True),
93 ("lttng-tools-2.9", "lttng-tools-2.7", True),
94 ("lttng-tools-2.9", "lttng-tools-2.8", True),
95 ("lttng-tools-2.9", "lttng-tools-2.9", True),
96 ("lttng-tools-2.9", "lttng-tools-2.10", True),
97 ("lttng-tools-2.10", "lttng-tools-2.7", True),
98 ("lttng-tools-2.10", "lttng-tools-2.8", True),
99 ("lttng-tools-2.10", "lttng-tools-2.9", True),
100 ("lttng-tools-2.10", "lttng-tools-2.10", True),
103 runtime_matrix_streaming_base
= []
104 runtime_matrix_streaming_regenerate_metadata
= []
105 runtime_matrix_live_base
= []
107 if not Settings
.test_only
:
108 runtime_matrix_streaming_base
= test_matrix_streaming_base
109 runtime_matrix_streaming_regenerate_metadata
= test_matrix_streaming_regenerate_metadata
110 runtime_matrix_live_base
= test_matrix_live_base
112 for tup
in test_matrix_streaming_base
:
113 if (tup
[0] in Settings
.test_only
or tup
[1] in
115 runtime_matrix_streaming_base
.append(tup
)
116 for tup
in test_matrix_streaming_regenerate_metadata
:
117 if (tup
[0] in Settings
.test_only
or tup
[1] in
119 runtime_matrix_streaming_regenerate_metadata
.append(tup
)
120 for tup
in test_matrix_live_base
:
121 if (tup
[0] in Settings
.test_only
or tup
[1] in
123 runtime_matrix_live_base
.append(tup
)
125 @pytest.mark
.parametrize("relayd_label,consumerd_label,scenario", runtime_matrix_streaming_base
)
126 def test_relayd_vs_consumerd_streaming_base(tmpdir
, relayd_label
, consumerd_label
, scenario
):
129 nb_expected_events
= 100
131 # Prepare environment
132 relayd
= ProjectFactory
.get_precook(relayd_label
)
133 consumerd
= ProjectFactory
.get_precook(consumerd_label
)
134 babeltrace
= ProjectFactory
.get_precook(Settings
.default_babeltrace
)
136 relayd_runtime_path
= os
.path
.join(str(tmpdir
), "relayd")
137 consumerd_runtime_path
= os
.path
.join(str(tmpdir
), "consumerd")
138 app_path
= os
.path
.join(str(tmpdir
), "app")
140 with Run
.get_runtime(relayd_runtime_path
) as runtime_relayd
, Run
.get_runtime(consumerd_runtime_path
) as runtime_consumerd
:
141 runtime_relayd
.add_project(relayd
)
142 runtime_relayd
.add_project(babeltrace
)
143 runtime_consumerd
.add_project(consumerd
)
145 # Make application using the ust runtime
146 shutil
.copytree(Settings
.apps_gen_events_folder
, app_path
)
147 runtime_consumerd
.run("make V=1", cwd
=app_path
)
149 # Start lttng-sessiond
150 relayd
= runtime_relayd
.spawn_subprocess('lttng-relayd -vvv')
151 # FIX: No way to know if good to go...
154 sessiond
= utils
.sessiond_spawn(runtime_consumerd
)
156 url
= "net://localhost"
158 # Create session using mi to get path and session name
159 runtime_consumerd
.run('lttng create --set-url={} trace '.format(url
))
161 runtime_consumerd
.run('lttng enable-event -u tp:tptest')
162 runtime_consumerd
.run('lttng start')
165 cmd
= './app {}'.format(nb_loop
)
166 runtime_consumerd
.run(cmd
, cwd
=app_path
)
169 runtime_consumerd
.run('lttng stop')
170 runtime_consumerd
.run('lttng destroy -a')
171 runtime_consumerd
.subprocess_terminate(sessiond
)
173 # TODO check for error.
174 runtime_relayd
.subprocess_terminate(relayd
)
177 # Read trace with babeltrace and check for event count via number of line
178 cmd
= 'babeltrace {}'.format(runtime_relayd
.lttng_home
)
179 cp_process
, cp_out
, cp_err
= runtime_relayd
.run(cmd
)
180 assert(utils
.line_count(cp_out
) == nb_expected_events
)
183 @pytest.mark
.parametrize("relayd_label,consumerd_label,command, scenario", runtime_matrix_streaming_regenerate_metadata
)
184 def test_relayd_vs_consumerd_streaming_regenerate_metadata(tmpdir
, relayd_label
, consumerd_label
, command
, scenario
):
187 nb_expected_events
= 100
189 # Prepare environment
190 relayd
= ProjectFactory
.get_precook(relayd_label
)
191 consumerd
= ProjectFactory
.get_precook(consumerd_label
)
192 babeltrace
= ProjectFactory
.get_precook(Settings
.default_babeltrace
)
194 relayd_runtime_path
= os
.path
.join(str(tmpdir
), "relayd")
195 consumerd_runtime_path
= os
.path
.join(str(tmpdir
), "consumerd")
196 app_path
= os
.path
.join(str(tmpdir
), "app")
199 with Run
.get_runtime(relayd_runtime_path
) as runtime_relayd
, Run
.get_runtime(consumerd_runtime_path
) as runtime_consumerd
:
200 runtime_relayd
.add_project(relayd
)
201 runtime_relayd
.add_project(babeltrace
)
202 runtime_consumerd
.add_project(consumerd
)
204 babeltrace_cmd
= 'babeltrace {}'.format(runtime_relayd
.lttng_home
)
206 # Make application using the ust runtime
207 shutil
.copytree(Settings
.apps_gen_events_folder
, app_path
)
208 runtime_consumerd
.run("make V=1", cwd
=app_path
)
210 # Start lttng-sessiond
211 relayd
= runtime_relayd
.spawn_subprocess('lttng-relayd -vvv')
212 # FIX: No way to know if good to go...
215 sessiond
= utils
.sessiond_spawn(runtime_consumerd
)
217 url
= "net://localhost"
219 # Create session using mi to get path and session name
220 runtime_consumerd
.run('lttng create --set-url={} trace '.format(url
))
222 runtime_consumerd
.run('lttng enable-event -u tp:tptest')
223 runtime_consumerd
.run('lttng start')
226 cmd
= './app {}'.format(nb_loop
)
227 runtime_consumerd
.run(cmd
, cwd
=app_path
)
230 runtime_consumerd
.run('lttng stop')
232 # Empty the metadata file
233 metadata
= utils
.find_file(runtime_relayd
.lttng_home
, "metadata")
234 open(metadata
, 'w').close()
236 # Babeltrace should never be able to parse the trace
237 with pytest
.raises(subprocess
.CalledProcessError
):
238 runtime_relayd
.run(babeltrace_cmd
)
240 runtime_consumerd
.run("lttng start")
242 # TODO: rework this a bit to differentiate each errors and rework how
243 # the condition are meet
244 if scenario
== "Unsupported by tools" or scenario
== "Unsupported by relayd":
245 with pytest
.raises(subprocess
.CalledProcessError
):
246 runtime_consumerd
.run("lttng {}".format(command
))
248 # Make sure everything looks good on this side
249 sessiond
= runtime_consumerd
.subprocess_terminate(sessiond
)
250 if sessiond
.returncode
!= 0:
251 pytest
.fail("Return value of sessiond is not zero")
252 relayd
= runtime_relayd
.subprocess_terminate(relayd
)
253 if relayd
.returncode
!= 0:
254 pytest
.fail("Return value of relayd is not zero")
257 runtime_consumerd
.run("lttng {}".format(command
))
259 runtime_consumerd
.run('lttng stop')
260 runtime_consumerd
.run('lttng destroy -a')
262 # Make sure everything looks good
263 sessiond
= runtime_consumerd
.subprocess_terminate(sessiond
)
264 if sessiond
.returncode
!= 0:
265 pytest
.fail("Return value of sessiond is not zero")
266 relayd
= runtime_relayd
.subprocess_terminate(relayd
)
267 if relayd
.returncode
!= 0:
268 pytest
.fail("Return value of relayd is not zero")
270 # Read trace with babeltrace and check for event count via number of line
271 cp_process
, cp_out
, cp_err
= runtime_relayd
.run(babeltrace_cmd
)
272 assert(utils
.line_count(cp_out
) == nb_expected_events
)
274 @pytest.mark
.parametrize("relayd_label,consumerd_label,scenario", runtime_matrix_streaming_base
)
275 def test_relayd_vs_consumerd_live_base(tmpdir
, relayd_label
, consumerd_label
, scenario
):
278 nb_expected_events
= 100
280 # Prepare environment
281 relayd
= ProjectFactory
.get_precook(relayd_label
)
282 consumerd
= ProjectFactory
.get_precook(consumerd_label
)
283 babeltrace
= ProjectFactory
.get_precook(Settings
.default_babeltrace
)
285 relayd_runtime_path
= os
.path
.join(str(tmpdir
), "relayd")
286 consumerd_runtime_path
= os
.path
.join(str(tmpdir
), "consumerd")
287 app_path
= os
.path
.join(str(tmpdir
), "app")
289 with Run
.get_runtime(relayd_runtime_path
) as runtime_relayd
, Run
.get_runtime(consumerd_runtime_path
) as runtime_consumerd
:
290 runtime_relayd
.add_project(relayd
)
291 runtime_relayd
.add_project(babeltrace
)
292 runtime_consumerd
.add_project(consumerd
)
294 # Make application using the ust runtime
295 shutil
.copytree(Settings
.apps_gen_events_folder
, app_path
)
296 runtime_consumerd
.run("make V=1", cwd
=app_path
)
298 # Start lttng-sessiond
299 relayd
= runtime_relayd
.spawn_subprocess('lttng-relayd -vvv')
300 # FIX: No way to know if good to go...
303 sessiond
= utils
.sessiond_spawn(runtime_consumerd
)
305 url
= "net://localhost"
307 # Create session using mi to get path and session name
308 runtime_consumerd
.run('lttng create --live --set-url={} trace '.format(url
))
310 runtime_consumerd
.run('lttng enable-event -u tp:tptest')
311 runtime_consumerd
.run('lttng start')
314 cmd
= './app {}'.format(nb_loop
)
315 runtime_consumerd
.run(cmd
, cwd
=app_path
)
318 runtime_consumerd
.run('lttng stop')
319 runtime_consumerd
.run('lttng destroy -a')
320 runtime_consumerd
.subprocess_terminate(sessiond
)
322 # TODO check for error.
323 runtime_relayd
.subprocess_terminate(relayd
)
326 # Read trace with babeltrace and check for event count via number of line
327 cmd
= 'babeltrace {}'.format(runtime_relayd
.lttng_home
)
328 cp_process
, cp_out
, cp_err
= runtime_relayd
.run(cmd
)
329 assert(utils
.line_count(cp_out
) == nb_expected_events
)