Commit | Line | Data |
---|---|---|
161facee JR |
1 | import pytest |
2 | import os | |
3 | import shutil | |
4 | import signal | |
5 | import subprocess | |
6 | import time | |
7 | import socket | |
8 | ||
9 | import lttng_ivc.utils.ProjectFactory as ProjectFactory | |
10 | import lttng_ivc.utils.utils as utils | |
11 | import lttng_ivc.utils.runtime as Run | |
12 | import lttng_ivc.settings as Settings | |
13 | ||
14 | """ | |
15 | TODO: Add Command header section | |
16 | """ | |
17 | ||
18 | """ | |
19 | TODO: snapshot, file rotation, rotate | |
20 | """ | |
21 | ||
22 | """ | |
23 | First member: relayd via lttng-tools | |
24 | Second member: consumerd via lttng-tools | |
25 | """ | |
26 | test_matrix_streaming_base = [ | |
27 | ("lttng-tools-2.7", "lttng-tools-2.7", True), | |
28 | ("lttng-tools-2.7", "lttng-tools-2.8", True), | |
29 | ("lttng-tools-2.7", "lttng-tools-2.9", True), | |
30 | ("lttng-tools-2.7", "lttng-tools-2.10", True), | |
31 | ("lttng-tools-2.8", "lttng-tools-2.7", True), | |
32 | ("lttng-tools-2.8", "lttng-tools-2.8", True), | |
33 | ("lttng-tools-2.8", "lttng-tools-2.9", True), | |
34 | ("lttng-tools-2.8", "lttng-tools-2.10", True), | |
35 | ("lttng-tools-2.9", "lttng-tools-2.7", True), | |
36 | ("lttng-tools-2.9", "lttng-tools-2.8", True), | |
37 | ("lttng-tools-2.9", "lttng-tools-2.9", True), | |
38 | ("lttng-tools-2.9", "lttng-tools-2.10", True), | |
39 | ("lttng-tools-2.10", "lttng-tools-2.7", True), | |
40 | ("lttng-tools-2.10", "lttng-tools-2.8", True), | |
41 | ("lttng-tools-2.10", "lttng-tools-2.9", True), | |
42 | ("lttng-tools-2.10", "lttng-tools-2.10", True), | |
43 | ] | |
44 | ||
45 | test_matrix_streaming_regenerate_metadata = [ | |
46 | ("lttng-tools-2.7", "lttng-tools-2.7", "metadata regenerate", "Unsupported by tools"), | |
47 | ("lttng-tools-2.7", "lttng-tools-2.8", "metadata regenerate", "Unsupported by relayd"), | |
48 | ("lttng-tools-2.7", "lttng-tools-2.9", "regenerate metadata", "Unsupported by relayd"), | |
49 | ("lttng-tools-2.7", "lttng-tools-2.10", "regenerate metadata", "Unsupported by relayd"), | |
50 | ("lttng-tools-2.8", "lttng-tools-2.7", "metadata regenerate", "Unsupported by tools"), | |
51 | ("lttng-tools-2.8", "lttng-tools-2.8", "metadata regenerate", "Supported"), | |
52 | ("lttng-tools-2.8", "lttng-tools-2.9", "regenerate metadata", "Supported"), | |
53 | ("lttng-tools-2.8", "lttng-tools-2.10", "regenerate metadata", "Supported"), | |
54 | ("lttng-tools-2.9", "lttng-tools-2.7", "metadata regenerate", "Unsupported by tools"), | |
55 | ("lttng-tools-2.9", "lttng-tools-2.8", "metadata regenerate", "Supported"), | |
56 | ("lttng-tools-2.9", "lttng-tools-2.9", "regenerate metadata", "Supported"), | |
57 | ("lttng-tools-2.9", "lttng-tools-2.10", "regenerate metadata", "Supported"), | |
58 | ("lttng-tools-2.10", "lttng-tools-2.7", "metadata regenerate", "Unsupported by tools"), | |
59 | ("lttng-tools-2.10", "lttng-tools-2.8", "metadata regenerate", "Supported"), | |
60 | ("lttng-tools-2.10", "lttng-tools-2.9", "regenerate metadata", "Supported"), | |
61 | ("lttng-tools-2.10", "lttng-tools-2.10", "regenerate metadata", "Supported"), | |
62 | ] | |
63 | ||
64 | test_matrix_live_base = [ | |
65 | ("lttng-tools-2.7", "lttng-tools-2.7", True), | |
66 | ("lttng-tools-2.7", "lttng-tools-2.8", True), | |
67 | ("lttng-tools-2.7", "lttng-tools-2.9", True), | |
68 | ("lttng-tools-2.7", "lttng-tools-2.10", True), | |
69 | ("lttng-tools-2.8", "lttng-tools-2.7", True), | |
70 | ("lttng-tools-2.8", "lttng-tools-2.8", True), | |
71 | ("lttng-tools-2.8", "lttng-tools-2.9", True), | |
72 | ("lttng-tools-2.8", "lttng-tools-2.10", True), | |
73 | ("lttng-tools-2.9", "lttng-tools-2.7", True), | |
74 | ("lttng-tools-2.9", "lttng-tools-2.8", True), | |
75 | ("lttng-tools-2.9", "lttng-tools-2.9", True), | |
76 | ("lttng-tools-2.9", "lttng-tools-2.10", True), | |
77 | ("lttng-tools-2.10", "lttng-tools-2.7", True), | |
78 | ("lttng-tools-2.10", "lttng-tools-2.8", True), | |
79 | ("lttng-tools-2.10", "lttng-tools-2.9", True), | |
80 | ("lttng-tools-2.10", "lttng-tools-2.10", True), | |
81 | ] | |
82 | ||
83 | runtime_matrix_streaming_base = [] | |
84 | runtime_matrix_streaming_regenerate_metadata = [] | |
85 | runtime_matrix_live_base = [] | |
86 | ||
87 | if not Settings.test_only: | |
88 | runtime_matrix_streaming_base = test_matrix_streaming_base | |
89 | runtime_matrix_streaming_regenerate_metadata = test_matrix_streaming_regenerate_metadata | |
90 | runtime_matrix_live_base = test_matrix_live_base | |
91 | else: | |
92 | for tup in test_matrix_streaming_base: | |
93 | if (tup[0] in Settings.test_only or tup[1] in | |
94 | Settings.test_only): | |
95 | runtime_matrix_streaming_base.append(tup) | |
96 | for tup in test_matrix_streaming_regenerate_metadata: | |
97 | if (tup[0] in Settings.test_only or tup[1] in | |
98 | Settings.test_only): | |
99 | runtime_matrix_streaming_regenerate_metadata.append(tup) | |
100 | for tup in test_matrix_live_base: | |
101 | if (tup[0] in Settings.test_only or tup[1] in | |
102 | Settings.test_only): | |
103 | runtime_matrix_live_base.append(tup) | |
104 | ||
105 | @pytest.mark.parametrize("relayd_label,consumerd_label,scenario", runtime_matrix_streaming_base) | |
106 | def test_relayd_vs_consumerd_streaming_base(tmpdir, relayd_label, consumerd_label, scenario): | |
107 | ||
108 | nb_loop = 100 | |
109 | nb_expected_events = 100 | |
110 | ||
111 | # Prepare environment | |
112 | relayd = ProjectFactory.get_precook(relayd_label) | |
113 | consumerd = ProjectFactory.get_precook(consumerd_label) | |
114 | babeltrace = ProjectFactory.get_precook(Settings.default_babeltrace) | |
115 | ||
116 | relayd_runtime_path = os.path.join(str(tmpdir), "relayd") | |
117 | consumerd_runtime_path = os.path.join(str(tmpdir), "consumerd") | |
118 | app_path = os.path.join(str(tmpdir), "app") | |
119 | ||
120 | with Run.get_runtime(relayd_runtime_path) as runtime_relayd, Run.get_runtime(consumerd_runtime_path) as runtime_consumerd: | |
121 | runtime_relayd.add_project(relayd) | |
122 | runtime_relayd.add_project(babeltrace) | |
123 | runtime_consumerd.add_project(consumerd) | |
124 | ||
125 | # Make application using the ust runtime | |
126 | shutil.copytree(Settings.apps_gen_events_folder, app_path) | |
127 | runtime_consumerd.run("make V=1", cwd=app_path) | |
128 | ||
129 | # Start lttng-sessiond | |
130 | relayd = runtime_relayd.spawn_subprocess('lttng-relayd -vvv') | |
131 | # FIX: No way to know if good to go... | |
132 | time.sleep(1) | |
133 | ||
134 | sessiond = utils.sessiond_spawn(runtime_consumerd) | |
135 | ||
136 | url = "net://localhost" | |
137 | ||
138 | # Create session using mi to get path and session name | |
139 | runtime_consumerd.run('lttng create --set-url={} trace '.format(url)) | |
140 | ||
141 | runtime_consumerd.run('lttng enable-event -u tp:tptest') | |
142 | runtime_consumerd.run('lttng start') | |
143 | ||
144 | # Run application | |
145 | cmd = './app {}'.format(nb_loop) | |
146 | runtime_consumerd.run(cmd, cwd=app_path) | |
147 | ||
148 | # Stop tracing | |
149 | runtime_consumerd.run('lttng stop') | |
150 | runtime_consumerd.run('lttng destroy -a') | |
151 | runtime_consumerd.subprocess_terminate(sessiond) | |
152 | ||
153 | # TODO check for error. | |
154 | runtime_relayd.subprocess_terminate(relayd) | |
155 | ||
156 | ||
157 | # Read trace with babeltrace and check for event count via number of line | |
158 | cmd = 'babeltrace {}'.format(runtime_relayd.lttng_home) | |
159 | cp_process, cp_out, cp_err = runtime_relayd.run(cmd) | |
160 | assert(utils.line_count(cp_out) == nb_expected_events) | |
161 | ||
162 | ||
163 | @pytest.mark.parametrize("relayd_label,consumerd_label,command, scenario", runtime_matrix_streaming_regenerate_metadata) | |
164 | def test_relayd_vs_consumerd_streaming_regenerate_metadata(tmpdir, relayd_label, consumerd_label, command, scenario): | |
165 | ||
166 | nb_loop = 100 | |
167 | nb_expected_events = 100 | |
168 | ||
169 | # Prepare environment | |
170 | relayd = ProjectFactory.get_precook(relayd_label) | |
171 | consumerd = ProjectFactory.get_precook(consumerd_label) | |
172 | babeltrace = ProjectFactory.get_precook(Settings.default_babeltrace) | |
173 | ||
174 | relayd_runtime_path = os.path.join(str(tmpdir), "relayd") | |
175 | consumerd_runtime_path = os.path.join(str(tmpdir), "consumerd") | |
176 | app_path = os.path.join(str(tmpdir), "app") | |
177 | ||
178 | ||
179 | with Run.get_runtime(relayd_runtime_path) as runtime_relayd, Run.get_runtime(consumerd_runtime_path) as runtime_consumerd: | |
180 | runtime_relayd.add_project(relayd) | |
181 | runtime_relayd.add_project(babeltrace) | |
182 | runtime_consumerd.add_project(consumerd) | |
183 | ||
184 | babeltrace_cmd = 'babeltrace {}'.format(runtime_relayd.lttng_home) | |
185 | ||
186 | # Make application using the ust runtime | |
187 | shutil.copytree(Settings.apps_gen_events_folder, app_path) | |
188 | runtime_consumerd.run("make V=1", cwd=app_path) | |
189 | ||
190 | # Start lttng-sessiond | |
191 | relayd = runtime_relayd.spawn_subprocess('lttng-relayd -vvv') | |
192 | # FIX: No way to know if good to go... | |
193 | time.sleep(1) | |
194 | ||
195 | sessiond = utils.sessiond_spawn(runtime_consumerd) | |
196 | ||
197 | url = "net://localhost" | |
198 | ||
199 | # Create session using mi to get path and session name | |
200 | runtime_consumerd.run('lttng create --set-url={} trace '.format(url)) | |
201 | ||
202 | runtime_consumerd.run('lttng enable-event -u tp:tptest') | |
203 | runtime_consumerd.run('lttng start') | |
204 | ||
205 | # Run application | |
206 | cmd = './app {}'.format(nb_loop) | |
207 | runtime_consumerd.run(cmd, cwd=app_path) | |
208 | ||
209 | # Stop tracing | |
210 | runtime_consumerd.run('lttng stop') | |
211 | ||
212 | # Empty the metadata file | |
213 | metadata = utils.find_file(runtime_relayd.lttng_home, "metadata") | |
214 | open(metadata, 'w').close() | |
215 | ||
216 | # Babeltrace should never be able to parse the trace | |
217 | with pytest.raises(subprocess.CalledProcessError): | |
218 | runtime_relayd.run(babeltrace_cmd) | |
219 | ||
220 | runtime_consumerd.run("lttng start") | |
221 | ||
222 | # TODO: rework this a bit to differentiate each errors and rework how | |
223 | # the condition are meet | |
224 | if scenario == "Unsupported by tools" or scenario == "Unsupported by relayd": | |
225 | with pytest.raises(subprocess.CalledProcessError): | |
226 | runtime_consumerd.run("lttng {}".format(command)) | |
227 | ||
228 | # Make sure everything looks good on this side | |
229 | sessiond = runtime_consumerd.subprocess_terminate(sessiond) | |
230 | if sessiond.returncode != 0: | |
231 | pytest.fail("Return value of sessiond is not zero") | |
232 | relayd = runtime_relayd.subprocess_terminate(relayd) | |
233 | if relayd.returncode != 0: | |
234 | pytest.fail("Return value of relayd is not zero") | |
235 | return | |
236 | ||
237 | runtime_consumerd.run("lttng {}".format(command)) | |
238 | ||
239 | runtime_consumerd.run('lttng stop') | |
240 | runtime_consumerd.run('lttng destroy -a') | |
241 | ||
242 | # Make sure everything looks good | |
243 | sessiond = runtime_consumerd.subprocess_terminate(sessiond) | |
244 | if sessiond.returncode != 0: | |
245 | pytest.fail("Return value of sessiond is not zero") | |
246 | relayd = runtime_relayd.subprocess_terminate(relayd) | |
247 | if relayd.returncode != 0: | |
248 | pytest.fail("Return value of relayd is not zero") | |
249 | ||
250 | # Read trace with babeltrace and check for event count via number of line | |
251 | cp_process, cp_out, cp_err = runtime_relayd.run(babeltrace_cmd) | |
252 | assert(utils.line_count(cp_out) == nb_expected_events) | |
253 | ||
254 | @pytest.mark.parametrize("relayd_label,consumerd_label,scenario", runtime_matrix_streaming_base) | |
255 | def test_relayd_vs_consumerd_live_base(tmpdir, relayd_label, consumerd_label, scenario): | |
256 | ||
257 | nb_loop = 100 | |
258 | nb_expected_events = 100 | |
259 | ||
260 | # Prepare environment | |
261 | relayd = ProjectFactory.get_precook(relayd_label) | |
262 | consumerd = ProjectFactory.get_precook(consumerd_label) | |
263 | babeltrace = ProjectFactory.get_precook(Settings.default_babeltrace) | |
264 | ||
265 | relayd_runtime_path = os.path.join(str(tmpdir), "relayd") | |
266 | consumerd_runtime_path = os.path.join(str(tmpdir), "consumerd") | |
267 | app_path = os.path.join(str(tmpdir), "app") | |
268 | ||
269 | with Run.get_runtime(relayd_runtime_path) as runtime_relayd, Run.get_runtime(consumerd_runtime_path) as runtime_consumerd: | |
270 | runtime_relayd.add_project(relayd) | |
271 | runtime_relayd.add_project(babeltrace) | |
272 | runtime_consumerd.add_project(consumerd) | |
273 | ||
274 | # Make application using the ust runtime | |
275 | shutil.copytree(Settings.apps_gen_events_folder, app_path) | |
276 | runtime_consumerd.run("make V=1", cwd=app_path) | |
277 | ||
278 | # Start lttng-sessiond | |
279 | relayd = runtime_relayd.spawn_subprocess('lttng-relayd -vvv') | |
280 | # FIX: No way to know if good to go... | |
281 | time.sleep(1) | |
282 | ||
283 | sessiond = utils.sessiond_spawn(runtime_consumerd) | |
284 | ||
285 | url = "net://localhost" | |
286 | ||
287 | # Create session using mi to get path and session name | |
288 | runtime_consumerd.run('lttng create --live --set-url={} trace '.format(url)) | |
289 | ||
290 | runtime_consumerd.run('lttng enable-event -u tp:tptest') | |
291 | runtime_consumerd.run('lttng start') | |
292 | ||
293 | # Run application | |
294 | cmd = './app {}'.format(nb_loop) | |
295 | runtime_consumerd.run(cmd, cwd=app_path) | |
296 | ||
297 | # Stop tracing | |
298 | runtime_consumerd.run('lttng stop') | |
299 | runtime_consumerd.run('lttng destroy -a') | |
300 | runtime_consumerd.subprocess_terminate(sessiond) | |
301 | ||
302 | # TODO check for error. | |
303 | runtime_relayd.subprocess_terminate(relayd) | |
304 | ||
305 | ||
306 | # Read trace with babeltrace and check for event count via number of line | |
307 | cmd = 'babeltrace {}'.format(runtime_relayd.lttng_home) | |
308 | cp_process, cp_out, cp_err = runtime_relayd.run(cmd) | |
309 | assert(utils.line_count(cp_out) == nb_expected_events) | |
310 | ||
311 |