Commit | Line | Data |
---|---|---|
91c75285 JG |
1 | #!/usr/bin/env python3 |
2 | # | |
9d16b343 | 3 | # Copyright (C) 2013 Jérémie Galarneau <jeremie.galarneau@efficios.com> |
91c75285 | 4 | # |
9d16b343 | 5 | # SPDX-License-Identifier: GPL-2.0-only |
91c75285 JG |
6 | |
7 | import os | |
8 | import subprocess | |
9 | import re | |
10 | import shutil | |
11 | import sys | |
12 | ||
13 | test_path = os.path.dirname(os.path.abspath(__file__)) + "/" | |
14 | test_utils_path = test_path | |
15 | for i in range(4): | |
16 | test_utils_path = os.path.dirname(test_utils_path) | |
17 | test_utils_path = test_utils_path + "/utils" | |
18 | sys.path.append(test_utils_path) | |
19 | from test_utils import * | |
20 | ||
21 | ||
22 | def check_ust_test_demo2_event(event_line, expected_int_field_value): | |
23 | match = re.search(r".*ust_tests_demo2:loop.*", event_line) | |
24 | if match is None: | |
25 | return False | |
26 | match = re.search(r".*intfield = (\d+)", event_line) | |
27 | if match is None or int(match.group(1)) != expected_int_field_value: | |
28 | return False | |
29 | match = re.search(r".*longfield = (\d+)", event_line) | |
30 | if match is None or int(match.group(1)) != expected_int_field_value: | |
31 | return False | |
32 | match = re.search(r".*netintfield = (\d+)", event_line) | |
33 | if match is None or int(match.group(1)) != expected_int_field_value: | |
34 | return False | |
35 | match = re.search(r".*intfield2 = 0x(\d+)", event_line) | |
36 | if match is None or int(match.group(1)) != expected_int_field_value: | |
37 | return False | |
38 | match = re.search(r".*netintfieldhex = 0x(\d+)", event_line) | |
39 | if match is None or int(match.group(1)) != expected_int_field_value: | |
40 | return False | |
41 | match = re.search(r".*floatfield = (\d+)", event_line) | |
42 | if match is None or int(match.group(1)) != 2222: | |
43 | return False | |
44 | match = re.search(r".*doublefield = (\d+)", event_line) | |
45 | if match is None or int(match.group(1)) != 2: | |
46 | return False | |
47 | match = re.search(r".*_seqfield1_length = (\d+)", event_line) | |
48 | if match is None or int(match.group(1)) != 4: | |
49 | return False | |
6a871bbe KS |
50 | match = re.search( |
51 | r".*seqfield1 = \[ \[0\] = (\d+), \[1\] = (\d+), \[2\] = (\d+), \[3\] = (\d+) \]", | |
52 | event_line, | |
53 | ) | |
54 | if ( | |
55 | match is None | |
56 | or int(match.group(1)) != 116 | |
57 | or int(match.group(2)) != 101 | |
58 | or int(match.group(3)) != 115 | |
59 | or int(match.group(4)) != 116 | |
60 | ): | |
91c75285 | 61 | return False |
6a871bbe KS |
62 | match = re.search( |
63 | r".*arrfield1 = \[ \[0\] = (\d), \[1\] = (\d), \[2\] = (\d) \]", event_line | |
64 | ) | |
65 | if ( | |
66 | match is None | |
67 | or int(match.group(1)) != 1 | |
68 | or int(match.group(2)) != 2 | |
69 | or int(match.group(3)) != 3 | |
70 | ): | |
91c75285 JG |
71 | return False |
72 | match = re.search(r".*arrfield2 = \"([a-z]*)\"", event_line) | |
73 | if match is None or match.group(1) != "test": | |
74 | return False | |
75 | match = re.search(r".*_seqfield2_length = (\d+)", event_line) | |
76 | if match is None or int(match.group(1)) != 4: | |
77 | return False | |
78 | match = re.search(r".*seqfield2 = \"([a-z]*)\"", event_line) | |
79 | if match is None or match.group(1) != "test": | |
80 | return False | |
81 | match = re.search(r".*stringfield = \"([a-z]*)\"", event_line) | |
82 | if match is None or match.group(1) != "test": | |
83 | return False | |
84 | ||
85 | return True | |
86 | ||
6a871bbe | 87 | |
91c75285 JG |
88 | NR_TESTS = 0 |
89 | DYNAMIC_TEST_ENABLED = False | |
90 | ||
91 | test_executables = [test_path + "demo_static", test_path + "demo_builtin"] | |
92 | if os.path.exists(test_path + "demo"): | |
93 | test_executables.append(test_path + "demo_preload") | |
94 | NR_TESTS = 2 | |
95 | DYNAMIC_TEST_ENABLED = True | |
96 | ||
97 | # Only enable tests that were compiled successfully | |
6a871bbe KS |
98 | test_executables = [ |
99 | executable for executable in test_executables if os.path.exists(executable) | |
100 | ] | |
91c75285 JG |
101 | |
102 | NR_TESTS += len(test_executables) * 10 | |
103 | ||
104 | current_test = 1 | |
105 | print("1..{0}".format(NR_TESTS)) | |
106 | ||
107 | if NR_TESTS == 0: | |
108 | print("# No test binary found") | |
109 | exit(-1) | |
110 | ||
111 | # Check if a sessiond is running... bail out if none found. | |
112 | if session_daemon_alive() == 0: | |
6a871bbe KS |
113 | bail( |
114 | 'No sessiond running. Please make sure you are running this test with the "run" shell script and verify that the lttng tools are properly installed.' | |
115 | ) | |
91c75285 JG |
116 | |
117 | if DYNAMIC_TEST_ENABLED: | |
118 | session_info = create_session() | |
119 | enable_ust_tracepoint_event(session_info, "ust_tests_demo*") | |
120 | start_session(session_info) | |
121 | ||
122 | # Dry run, no events should be logged | |
6a871bbe KS |
123 | demo_process = subprocess.Popen( |
124 | test_path + "demo", stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL | |
125 | ) | |
b6e2447a | 126 | demo_process.wait() |
91c75285 JG |
127 | stop_session(session_info) |
128 | ||
6a871bbe KS |
129 | print_test_result( |
130 | demo_process.returncode == 0, | |
131 | current_test, | |
132 | "Running application dynamically linked to providers, no preload", | |
133 | ) | |
91c75285 | 134 | current_test += 1 |
c996624c | 135 | trace_path = os.path.join(session_info.trace_path, "ust", "uid") |
6a871bbe KS |
136 | print_test_result( |
137 | not os.path.exists(trace_path), | |
138 | current_test, | |
139 | "No events logged when running demo application without preloading providers", | |
140 | ) | |
91c75285 JG |
141 | current_test += 1 |
142 | ||
143 | shutil.rmtree(session_info.tmp_directory) | |
144 | ||
145 | for executable in test_executables: | |
146 | executable_name = os.path.basename(executable) | |
147 | session_info = create_session() | |
148 | enable_ust_tracepoint_event(session_info, "ust_tests_demo*") | |
149 | start_session(session_info) | |
150 | ||
6a871bbe KS |
151 | demo_process = subprocess.Popen( |
152 | executable, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL | |
153 | ) | |
b6e2447a | 154 | demo_process.wait() |
91c75285 JG |
155 | stop_session(session_info) |
156 | ||
157 | trace_found = os.path.exists(session_info.trace_path) | |
6a871bbe KS |
158 | print_test_result( |
159 | trace_found, current_test, "{0}, resulting trace found".format(executable_name) | |
160 | ) | |
91c75285 JG |
161 | current_test += 1 |
162 | ||
163 | if not trace_found: | |
164 | print("# Skipping " + executable_name + " trace verification tests") | |
165 | continue | |
166 | ||
167 | try: | |
6a871bbe KS |
168 | babeltrace_process = subprocess.Popen( |
169 | [BABELTRACE_BIN, session_info.trace_path], | |
170 | stdout=subprocess.PIPE, | |
171 | stderr=subprocess.PIPE, | |
172 | ) | |
91c75285 | 173 | except FileNotFoundError: |
6a871bbe KS |
174 | bail( |
175 | "Could not open {}. Please make sure it is installed.".format( | |
176 | BABELTRACE_BIN | |
177 | ) | |
178 | ) | |
91c75285 JG |
179 | |
180 | # We should find 8 events in the resulting trace | |
181 | event_entries = [] | |
182 | for event_line in babeltrace_process.stdout: | |
6a871bbe | 183 | event_line = event_line.decode("utf-8").replace("\n", "") |
91c75285 JG |
184 | event_entries.append(event_line) |
185 | ||
186 | if len(event_entries) != 8: | |
6a871bbe KS |
187 | bail( |
188 | "{0}, wrong number of events found in resulting trace.".format( | |
189 | executable_name | |
190 | ) | |
191 | ) | |
91c75285 JG |
192 | |
193 | shutil.rmtree(session_info.tmp_directory) | |
194 | ||
6a871bbe KS |
195 | print_test_result( |
196 | len(event_entries) == 8, | |
197 | current_test, | |
198 | "{0}, total number of events logged is correct".format(executable_name), | |
199 | ) | |
91c75285 JG |
200 | current_test += 1 |
201 | ||
202 | # Check each loop event | |
203 | match = re.search(r".*ust_tests_demo:starting.*value = (\d+) ", event_entries[0]) | |
6a871bbe KS |
204 | print_test_result( |
205 | match is not None and (int(match.group(1)) == 123), | |
206 | current_test, | |
207 | "{0}, ust_tests_demo:starting event found in trace with a correct integer argument".format( | |
208 | executable_name | |
209 | ), | |
210 | ) | |
91c75285 JG |
211 | current_test += 1 |
212 | ||
213 | for i in range(5): | |
6a871bbe KS |
214 | print_test_result( |
215 | check_ust_test_demo2_event(event_entries[i + 1], i), | |
216 | current_test, | |
217 | "{0}, ust_tests_demo2:loop event found in trace and arguments are correct, iteration ".format( | |
218 | executable_name | |
219 | ) | |
220 | + str(i + 1), | |
221 | ) | |
91c75285 JG |
222 | current_test += 1 |
223 | ||
224 | match = re.search(r".*ust_tests_demo:done.*value = (\d+)", event_entries[6]) | |
6a871bbe KS |
225 | print_test_result( |
226 | match is not None and (int(match.group(1)) == 456), | |
227 | current_test, | |
228 | "{0}, ust_tests_demo:done event found in resulting trace with a correct integer argument".format( | |
229 | executable_name | |
230 | ), | |
231 | ) | |
91c75285 JG |
232 | current_test += 1 |
233 | ||
234 | match = re.search(r".*ust_tests_demo3:done.*value = (\d+)", event_entries[7]) | |
6a871bbe KS |
235 | print_test_result( |
236 | match is not None and (int(match.group(1)) == 42), | |
237 | current_test, | |
238 | "{0}, ust_tests_demo3:done event found in resulting trace with a correct integer argument".format( | |
239 | executable_name | |
240 | ), | |
241 | ) | |
91c75285 | 242 | current_test += 1 |