Commit | Line | Data |
---|---|---|
91c75285 JG |
1 | #!/usr/bin/env python3 |
2 | # | |
3 | # Copyright (C) - 2013 Jérémie Galarneau <jeremie.galarneau@efficios.com> | |
4 | # | |
5 | # This program is free software; you can redistribute it and/or modify it | |
6 | # under the terms of the GNU General Public License, version 2 only, as | |
7 | # published by the Free Software Foundation. | |
8 | # | |
9 | # This program is distributed in the hope that it will be useful, but WITHOUT | |
10 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 | # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | |
12 | # more details. | |
13 | # | |
14 | # You should have received a copy of the GNU General Public License along with | |
15 | # this program; if not, write to the Free Software Foundation, Inc., 51 | |
16 | # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
17 | ||
18 | import os | |
19 | import subprocess | |
20 | import re | |
21 | import shutil | |
22 | import sys | |
23 | ||
24 | test_path = os.path.dirname(os.path.abspath(__file__)) + "/" | |
25 | test_utils_path = test_path | |
26 | for i in range(4): | |
27 | test_utils_path = os.path.dirname(test_utils_path) | |
28 | test_utils_path = test_utils_path + "/utils" | |
29 | sys.path.append(test_utils_path) | |
30 | from test_utils import * | |
31 | ||
32 | ||
33 | def check_ust_test_demo2_event(event_line, expected_int_field_value): | |
34 | match = re.search(r".*ust_tests_demo2:loop.*", event_line) | |
35 | if match is None: | |
36 | return False | |
37 | match = re.search(r".*intfield = (\d+)", event_line) | |
38 | if match is None or int(match.group(1)) != expected_int_field_value: | |
39 | return False | |
40 | match = re.search(r".*longfield = (\d+)", event_line) | |
41 | if match is None or int(match.group(1)) != expected_int_field_value: | |
42 | return False | |
43 | match = re.search(r".*netintfield = (\d+)", event_line) | |
44 | if match is None or int(match.group(1)) != expected_int_field_value: | |
45 | return False | |
46 | match = re.search(r".*intfield2 = 0x(\d+)", event_line) | |
47 | if match is None or int(match.group(1)) != expected_int_field_value: | |
48 | return False | |
49 | match = re.search(r".*netintfieldhex = 0x(\d+)", event_line) | |
50 | if match is None or int(match.group(1)) != expected_int_field_value: | |
51 | return False | |
52 | match = re.search(r".*floatfield = (\d+)", event_line) | |
53 | if match is None or int(match.group(1)) != 2222: | |
54 | return False | |
55 | match = re.search(r".*doublefield = (\d+)", event_line) | |
56 | if match is None or int(match.group(1)) != 2: | |
57 | return False | |
58 | match = re.search(r".*_seqfield1_length = (\d+)", event_line) | |
59 | if match is None or int(match.group(1)) != 4: | |
60 | return False | |
61 | match = re.search(r".*seqfield1 = \[ \[0\] = (\d+), \[1\] = (\d+), \[2\] = (\d+), \[3\] = (\d+) \]", event_line) | |
62 | if match is None or int(match.group(1)) != 116 or int(match.group(2)) != 101 or int(match.group(3)) != 115 or int(match.group(4)) != 116: | |
63 | return False | |
64 | match = re.search(r".*arrfield1 = \[ \[0\] = (\d), \[1\] = (\d), \[2\] = (\d) \]", event_line) | |
65 | if match is None or int(match.group(1)) != 1 or int(match.group(2)) != 2 or int(match.group(3)) != 3: | |
66 | return False | |
67 | match = re.search(r".*arrfield2 = \"([a-z]*)\"", event_line) | |
68 | if match is None or match.group(1) != "test": | |
69 | return False | |
70 | match = re.search(r".*_seqfield2_length = (\d+)", event_line) | |
71 | if match is None or int(match.group(1)) != 4: | |
72 | return False | |
73 | match = re.search(r".*seqfield2 = \"([a-z]*)\"", event_line) | |
74 | if match is None or match.group(1) != "test": | |
75 | return False | |
76 | match = re.search(r".*stringfield = \"([a-z]*)\"", event_line) | |
77 | if match is None or match.group(1) != "test": | |
78 | return False | |
79 | ||
80 | return True | |
81 | ||
82 | NR_TESTS = 0 | |
83 | DYNAMIC_TEST_ENABLED = False | |
84 | ||
85 | test_executables = [test_path + "demo_static", test_path + "demo_builtin"] | |
86 | if os.path.exists(test_path + "demo"): | |
87 | test_executables.append(test_path + "demo_preload") | |
88 | NR_TESTS = 2 | |
89 | DYNAMIC_TEST_ENABLED = True | |
90 | ||
91 | # Only enable tests that were compiled successfully | |
92 | test_executables = [executable for executable in test_executables if os.path.exists(executable)] | |
93 | ||
94 | NR_TESTS += len(test_executables) * 10 | |
95 | ||
96 | current_test = 1 | |
97 | print("1..{0}".format(NR_TESTS)) | |
98 | ||
99 | if NR_TESTS == 0: | |
100 | print("# No test binary found") | |
101 | exit(-1) | |
102 | ||
103 | # Check if a sessiond is running... bail out if none found. | |
104 | if session_daemon_alive() == 0: | |
105 | bail("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.") | |
106 | ||
107 | if DYNAMIC_TEST_ENABLED: | |
108 | session_info = create_session() | |
109 | enable_ust_tracepoint_event(session_info, "ust_tests_demo*") | |
110 | start_session(session_info) | |
111 | ||
112 | # Dry run, no events should be logged | |
5e7baece | 113 | demo_process = subprocess.Popen(test_path + "demo", stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) |
b6e2447a | 114 | demo_process.wait() |
91c75285 JG |
115 | stop_session(session_info) |
116 | ||
117 | print_test_result(demo_process.returncode == 0, current_test,\ | |
118 | "Running application dynamically linked to providers, no preload") | |
119 | current_test += 1 | |
c996624c JD |
120 | trace_path = os.path.join(session_info.trace_path, "ust", "uid") |
121 | print_test_result(not os.path.exists(trace_path), current_test,\ | |
91c75285 JG |
122 | "No events logged when running demo application without preloading providers") |
123 | current_test += 1 | |
124 | ||
125 | shutil.rmtree(session_info.tmp_directory) | |
126 | ||
127 | for executable in test_executables: | |
128 | executable_name = os.path.basename(executable) | |
129 | session_info = create_session() | |
130 | enable_ust_tracepoint_event(session_info, "ust_tests_demo*") | |
131 | start_session(session_info) | |
132 | ||
5e7baece | 133 | demo_process = subprocess.Popen(executable, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) |
b6e2447a | 134 | demo_process.wait() |
91c75285 JG |
135 | stop_session(session_info) |
136 | ||
137 | trace_found = os.path.exists(session_info.trace_path) | |
138 | print_test_result(trace_found, current_test,\ | |
139 | "{0}, resulting trace found".format(executable_name)) | |
140 | current_test += 1 | |
141 | ||
142 | if not trace_found: | |
143 | print("# Skipping " + executable_name + " trace verification tests") | |
144 | continue | |
145 | ||
146 | try: | |
147 | babeltrace_process = subprocess.Popen(["babeltrace", session_info.trace_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) | |
148 | except FileNotFoundError: | |
149 | bail("Could not open babeltrace. Please make sure it is installed.") | |
150 | ||
151 | # We should find 8 events in the resulting trace | |
152 | event_entries = [] | |
153 | for event_line in babeltrace_process.stdout: | |
154 | event_line = event_line.decode('utf-8').replace("\n", "") | |
155 | event_entries.append(event_line) | |
156 | ||
157 | if len(event_entries) != 8: | |
158 | bail("{0}, wrong number of events found in resulting trace.".format(executable_name)) | |
159 | ||
160 | shutil.rmtree(session_info.tmp_directory) | |
161 | ||
162 | print_test_result(len(event_entries) == 8, current_test,\ | |
163 | "{0}, total number of events logged is correct".format(executable_name)) | |
164 | current_test += 1 | |
165 | ||
166 | # Check each loop event | |
167 | match = re.search(r".*ust_tests_demo:starting.*value = (\d+) ", event_entries[0]) | |
168 | print_test_result(match is not None and (int(match.group(1)) == 123), current_test,\ | |
169 | "{0}, ust_tests_demo:starting event found in trace with a correct integer argument".format(executable_name)) | |
170 | current_test += 1 | |
171 | ||
172 | for i in range(5): | |
173 | print_test_result(check_ust_test_demo2_event(event_entries[i+1], i), current_test,\ | |
174 | "{0}, ust_tests_demo2:loop event found in trace and arguments are correct, iteration ".format(executable_name)\ | |
175 | + str(i + 1)) | |
176 | current_test += 1 | |
177 | ||
178 | match = re.search(r".*ust_tests_demo:done.*value = (\d+)", event_entries[6]) | |
179 | print_test_result(match is not None and (int(match.group(1)) == 456), current_test,\ | |
180 | "{0}, ust_tests_demo:done event found in resulting trace with a correct integer argument".format(executable_name)) | |
181 | current_test += 1 | |
182 | ||
183 | match = re.search(r".*ust_tests_demo3:done.*value = (\d+)", event_entries[7]) | |
184 | print_test_result(match is not None and (int(match.group(1)) == 42), current_test,\ | |
185 | "{0}, ust_tests_demo3:done event found in resulting trace with a correct integer argument".format(executable_name)) | |
186 | current_test += 1 |