Commit | Line | Data |
---|---|---|
c3e68e71 JR |
1 | #!/bin/bash |
2 | # | |
3 | # Copyright (C) 2020 Francis Deslauriers <francis.deslauriers@efficios.com> | |
4 | # | |
5 | # SPDX-License-Identifier: LGPL-2.1-only | |
6 | ||
7 | CURDIR=$(dirname "$0")/ | |
8 | TESTDIR=$CURDIR/../../.. | |
9 | NR_ITER=5 | |
10 | KERNEL_EVENT_NAME="lttng_test_filter_event" | |
11 | KERNEL_TEST_FILE_NAME="/proc/lttng-test-filter-event" | |
12 | TESTAPP_PATH="$TESTDIR/utils/testapp" | |
13 | TESTAPP_SYSCALL_BIN="$TESTAPP_PATH/gen-syscall-events/gen-syscall-events" | |
14 | TESTAPP_USERSPACE_BINARY="$TESTAPP_PATH/userspace-probe-elf-binary/.libs/userspace-probe-elf-binary" | |
15 | ||
16 | KERNEL_NUM_TESTS=421 | |
17 | NUM_TESTS=$(($KERNEL_NUM_TESTS)) | |
18 | ||
19 | TMPDIR=$(mktemp -d) | |
20 | ||
21 | SH_TAP=1 | |
22 | ||
23 | # shellcheck source=../../../utils/utils.sh | |
24 | source "$TESTDIR/utils/utils.sh" | |
25 | source "$CURDIR/map_base_test.sh" | |
26 | ||
27 | FULL_LTTNG_BIN="${TESTDIR}/../src/bin/lttng/${LTTNG_BIN}" | |
28 | ||
29 | plan_tests $NUM_TESTS | |
30 | ||
31 | function kernel_test_app() | |
32 | { | |
33 | /bin/echo -n "$NR_ITER" > "$KERNEL_TEST_FILE_NAME" | |
34 | } | |
35 | ||
36 | function kernel_syscall_test_app() | |
37 | { | |
38 | for i in $(seq 1 $NR_ITER) | |
39 | do | |
40 | "$TESTAPP_SYSCALL_BIN" /dev/null /proc/cpuinfo /proc/cmdline | |
41 | done | |
42 | } | |
43 | ||
44 | function kernel_userspace_test_app() | |
45 | { | |
46 | for i in $(seq 1 $NR_ITER) | |
47 | do | |
48 | "$TESTAPP_USERSPACE_BINARY" | |
49 | done | |
50 | } | |
51 | ||
52 | function test_map_kernel_create() | |
53 | { | |
54 | local MAP_NAME="my_map_name" | |
55 | local MAP_NAME_2="my_map_name2" | |
56 | local MAP_NAME_3="my_map_name3" | |
57 | local MAP_NAME_4="my_map_name4" | |
58 | local SESSION_NAME="my_session_name" | |
59 | ||
60 | create_lttng_session_ok "$SESSION_NAME" | |
61 | ||
62 | "$FULL_LTTNG_BIN" add-map --kernel --bitness 32 --session "wrong_session_name" "$MAP_NAME" > /dev/null | |
63 | isnt $? 0 "Map creation failed on wrong session name" | |
64 | ||
65 | "$FULL_LTTNG_BIN" add-map --kernel --bitness 42 --session "$SESSION_NAME" "$MAP_NAME" > /dev/null | |
66 | isnt $? 0 "Map creation failed \"--bitness\" wrong value as expected" | |
67 | ||
68 | "$FULL_LTTNG_BIN" add-map --kernel --session "SESS_DOESNT_EXIST" "$MAP_NAME" > /dev/null | |
69 | isnt $? 0 "Failed to add map to session that doesn't exist" | |
70 | ||
71 | "$FULL_LTTNG_BIN" disable-map --kernel "MAP_DOESNT_EXIST" > /dev/null | |
72 | isnt $? 0 "Failed to disable map that doesn't exist" | |
73 | ||
74 | "$FULL_LTTNG_BIN" add-map --kernel --bitness 64 --session "$SESSION_NAME" "$MAP_NAME" > /dev/null | |
75 | ok $? "Map with 64bit bitness created succesfully" | |
76 | ||
77 | "$FULL_LTTNG_BIN" disable-map --kernel "$MAP_NAME" > /dev/null | |
78 | ok $? "Map disabled succesfully" | |
79 | ||
80 | "$FULL_LTTNG_BIN" add-map --kernel --bitness 32 --session "$SESSION_NAME" "$MAP_NAME_2" > /dev/null | |
81 | ok $? "Map with 32bit bitness created succesfully" | |
82 | ||
83 | "$FULL_LTTNG_BIN" add-map --kernel --session "$SESSION_NAME" "$MAP_NAME_2" > /dev/null | |
84 | isnt $? 0 "Duplicated map fails to create as expected" | |
85 | ||
86 | "$FULL_LTTNG_BIN" disable-map --kernel "$MAP_NAME_2" > /dev/null | |
87 | ok $? "Map disabled succesfully" | |
88 | ||
89 | "$FULL_LTTNG_BIN" add-map --kernel --session "$SESSION_NAME" "$MAP_NAME_3" > /dev/null | |
90 | ok $? "Map with default bitness created succesfully" | |
91 | ||
92 | "$FULL_LTTNG_BIN" disable-map --kernel "$MAP_NAME_3" > /dev/null | |
93 | ok $? "Map removed succesfully" | |
94 | ||
95 | "$FULL_LTTNG_BIN" add-map --kernel --session "$SESSION_NAME" --max-key-count 212 "$MAP_NAME_4" > /dev/null | |
96 | ok $? "Map with max key count created succesfully" | |
97 | ||
98 | "$FULL_LTTNG_BIN" disable-map --kernel "$MAP_NAME_4" > /dev/null | |
99 | ok $? "Map disabled succesfully" | |
100 | ||
101 | "$FULL_LTTNG_BIN" enable-map --kernel "$MAP_NAME_4" > /dev/null | |
102 | ok $? "Map enabled succesfully" | |
103 | ||
104 | destroy_lttng_session_ok "$SESSION_NAME" | |
105 | } | |
106 | ||
107 | function test_map_kernel_probe() | |
108 | { | |
109 | local MAP_NAME="my_map_name" | |
110 | local SESSION_NAME="my_session_name" | |
111 | local TRIGGER_NAME_1="my_trigger_name_1" | |
112 | local TRIGGER_NAME_2="my_trigger_name_2" | |
113 | local TARGET_SYMBOL="lttng_test_filter_event_write" | |
114 | local event_name_1="my_probe1" | |
115 | local event_name_2="my_probe2" | |
116 | local KEY="foo" | |
117 | ||
118 | diag "Test map kernel probe" | |
119 | create_lttng_session_ok "$SESSION_NAME" | |
120 | ||
121 | lttng_add_map_ok "$MAP_NAME" "$SESSION_NAME" "--kernel" "32" "" | |
122 | ||
123 | lttng_add_trigger_ok "$TRIGGER_NAME_1" \ | |
124 | --condition \ | |
125 | on-event --kernel --probe="$TARGET_SYMBOL" "$event_name_1" \ | |
126 | --action \ | |
127 | incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "$KEY" | |
128 | ||
129 | lttng_add_trigger_ok "$TRIGGER_NAME_2" \ | |
130 | --condition \ | |
131 | on-event --kernel --probe="$TARGET_SYMBOL" "$event_name_2" \ | |
132 | --action \ | |
133 | incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "\${EVENT_NAME}" | |
134 | ||
135 | start_lttng_tracing_ok $SESSION_NAME | |
136 | ||
137 | kernel_test_app | |
138 | ||
139 | stop_lttng_tracing_ok $SESSION_NAME | |
140 | ||
141 | view_map_ok "$MAP_NAME" "$KEY" "1" | |
142 | view_map_ok "$MAP_NAME" "$event_name_2" "1" | |
143 | ||
144 | lttng_remove_trigger_ok "$TRIGGER_NAME_1" | |
145 | lttng_remove_trigger_ok "$TRIGGER_NAME_2" | |
146 | ||
147 | destroy_lttng_session_ok "$SESSION_NAME" | |
148 | } | |
149 | ||
150 | function test_map_kernel_function() | |
151 | { | |
152 | local MAP_NAME="my_map_name" | |
153 | local SESSION_NAME="my_session_name" | |
154 | local TRIGGER_NAME="my_trigger_name_1" | |
155 | local TARGET_SYMBOL="lttng_test_filter_event_write" | |
156 | local event_name="my_probe1" | |
157 | local KEY="foo" | |
158 | ||
159 | diag "Test map kernel function" | |
160 | create_lttng_session_ok "$SESSION_NAME" | |
161 | ||
162 | lttng_add_map_ok "$MAP_NAME" "$SESSION_NAME" "--kernel" "32" "" | |
163 | ||
164 | lttng_add_trigger_ok "$TRIGGER_NAME" \ | |
165 | --condition \ | |
166 | on-event --kernel --function="$TARGET_SYMBOL" "$event_name" \ | |
167 | --action incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "$KEY" \ | |
168 | --action incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "\${EVENT_NAME}" | |
169 | ||
170 | start_lttng_tracing_ok $SESSION_NAME | |
171 | ||
172 | kernel_test_app | |
173 | ||
174 | stop_lttng_tracing_ok $SESSION_NAME | |
175 | ||
176 | view_map_ok "$MAP_NAME" "${KEY}" "2" | |
177 | view_map_ok "$MAP_NAME" "${event_name}_entry" "1" | |
178 | view_map_ok "$MAP_NAME" "${event_name}_return" "1" | |
179 | ||
180 | lttng_remove_trigger_ok "$TRIGGER_NAME" | |
181 | ||
182 | destroy_lttng_session_ok "$SESSION_NAME" | |
183 | } | |
184 | ||
185 | function test_map_kernel_syscall() | |
186 | { | |
187 | local MAP_NAME="my_map_name" | |
188 | local SESSION_NAME="my_session_name" | |
189 | local TRIGGER_NAME_1="my_trigger_name_1" | |
190 | local TRIGGER_NAME_2="my_trigger_name_2" | |
191 | local FILE_1="/proc/cmdline" | |
192 | local FILE_2="/proc/cpuinfo" | |
193 | local TARGET_SYSCALL=openat | |
194 | local KEY="foo" | |
195 | ||
196 | diag "Test map kernel syscall" | |
197 | create_lttng_session_ok "$SESSION_NAME" | |
198 | ||
199 | lttng_add_map_ok "$MAP_NAME" "$SESSION_NAME" "--kernel" "32" "" | |
200 | ||
201 | lttng_add_trigger_ok "$TRIGGER_NAME_1" \ | |
202 | --condition \ | |
203 | on-event --kernel --syscall "$TARGET_SYSCALL" --filter "filename == \"$FILE_1\"" \ | |
204 | --action \ | |
205 | incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "$KEY" | |
206 | ||
207 | lttng_add_trigger_ok "$TRIGGER_NAME_2" \ | |
208 | --condition \ | |
209 | on-event --kernel --syscall "$TARGET_SYSCALL" --filter "filename == \"$FILE_2\"" \ | |
210 | --action \ | |
211 | incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "\${EVENT_NAME}" | |
212 | ||
213 | start_lttng_tracing_ok $SESSION_NAME | |
214 | ||
215 | kernel_syscall_test_app | |
216 | ||
217 | stop_lttng_tracing_ok $SESSION_NAME | |
218 | ||
219 | # When using filtering on filename we only get hits on the entry event | |
220 | # as it's the one having the filename argument. | |
221 | view_map_ok "$MAP_NAME" "${KEY}" "$NR_ITER" | |
222 | view_map_ok "$MAP_NAME" "syscall_entry_$TARGET_SYSCALL" "$NR_ITER" | |
223 | ||
224 | lttng_remove_trigger_ok "$TRIGGER_NAME_1" | |
225 | lttng_remove_trigger_ok "$TRIGGER_NAME_2" | |
226 | ||
227 | destroy_lttng_session_ok "$SESSION_NAME" | |
228 | } | |
229 | ||
230 | function test_map_kernel_userspace_probe() | |
231 | { | |
232 | local MAP_NAME="my_map_name" | |
233 | local SESSION_NAME="my_session_name" | |
234 | local TRIGGER_NAME_1="my_trigger_name_1" | |
235 | local TEST_FUNCTION="test_function" | |
236 | local KEY="foo" | |
237 | ||
238 | diag "Test map kernel userspace probe" | |
239 | create_lttng_session_ok "$SESSION_NAME" | |
240 | ||
241 | lttng_add_map_ok "$MAP_NAME" "$SESSION_NAME" "--kernel" "32" "" | |
242 | ||
243 | lttng_add_trigger_ok "$TRIGGER_NAME_1" \ | |
244 | --condition \ | |
245 | on-event --kernel --userspace-probe="elf:$TESTAPP_USERSPACE_BINARY:$TEST_FUNCTION" event_name \ | |
246 | --action \ | |
247 | incr-value --session "$SESSION_NAME" --map "$MAP_NAME" --key "$KEY" | |
248 | ||
249 | start_lttng_tracing_ok $SESSION_NAME | |
250 | ||
251 | kernel_userspace_test_app | |
252 | ||
253 | stop_lttng_tracing_ok $SESSION_NAME | |
254 | ||
255 | view_map_ok "$MAP_NAME" "$KEY" "$NR_ITER" | |
256 | ||
257 | lttng_remove_trigger_ok "$TRIGGER_NAME_1" | |
258 | ||
259 | destroy_lttng_session_ok "$SESSION_NAME" | |
260 | } | |
261 | ||
262 | if [ "$(id -u)" == "0" ]; then | |
263 | ||
264 | start_lttng_sessiond_notap | |
265 | ||
266 | validate_lttng_modules_present | |
267 | ||
268 | modprobe lttng-test | |
269 | ||
270 | test_map_kernel_create | |
271 | ||
272 | test_map_formated_keys "--kernel" "$KERNEL_EVENT_NAME" "\${EVENT_NAME}" "$KERNEL_EVENT_NAME" kernel_test_app | |
273 | test_map_formated_keys "--kernel" "$KERNEL_EVENT_NAME" "pitarifique-\${EVENT_NAME}" "pitarifique-$KERNEL_EVENT_NAME" kernel_test_app | |
274 | ||
275 | test_map_view_empty "--kernel" "64" "" | |
276 | test_map_view_empty "--kernel" "32" "" | |
277 | ||
278 | test_map_n_triggers_n_keys "--kernel" "32" "$KERNEL_EVENT_NAME" kernel_test_app | |
279 | test_map_n_triggers_n_keys "--kernel" "64" "$KERNEL_EVENT_NAME" kernel_test_app | |
280 | ||
281 | test_map_n_triggers_1_key "--kernel" "32" "$KERNEL_EVENT_NAME" kernel_test_app | |
282 | test_map_n_triggers_1_key "--kernel" "64" "$KERNEL_EVENT_NAME" kernel_test_app | |
283 | ||
284 | test_map_n_triggers_1_key_coalesced "--kernel" "32" "$KERNEL_EVENT_NAME" kernel_test_app | |
285 | test_map_n_triggers_1_key_coalesced "--kernel" "64" "$KERNEL_EVENT_NAME" kernel_test_app | |
286 | ||
287 | test_map_disable_enable "--kernel" "32" "$KERNEL_EVENT_NAME" kernel_test_app | |
288 | test_map_disable_enable "--kernel" "64" "$KERNEL_EVENT_NAME" kernel_test_app | |
289 | ||
290 | test_map_add_remove_add_trigger "--kernel" "32" "$KERNEL_EVENT_NAME" kernel_test_app | |
291 | test_map_add_remove_add_trigger "--kernel" "64" "$KERNEL_EVENT_NAME" kernel_test_app | |
292 | ||
293 | test_map_creation_after_trigger "--kernel" "32" "$KERNEL_EVENT_NAME" kernel_test_app | |
294 | test_map_creation_after_trigger "--kernel" "64" "$KERNEL_EVENT_NAME" kernel_test_app | |
295 | ||
296 | test_map_remove_trigger_before_stop "--kernel" "32" "$KERNEL_EVENT_NAME" kernel_test_app | |
297 | test_map_remove_trigger_before_stop "--kernel" "64" "$KERNEL_EVENT_NAME" kernel_test_app | |
298 | ||
299 | test_map_two_incr_value_two_keys "--kernel" "64" "$KERNEL_EVENT_NAME" kernel_test_app | |
300 | ||
301 | test_map_clear "--kernel" 32 "$KERNEL_EVENT_NAME" kernel_test_app | |
302 | test_map_clear "--kernel" 64 "$KERNEL_EVENT_NAME" kernel_test_app | |
303 | ||
304 | test_map_kernel_probe | |
305 | test_map_kernel_function | |
306 | ||
307 | test_map_kernel_syscall | |
308 | ||
309 | test_map_kernel_userspace_probe | |
310 | ||
311 | test_map_filter "--kernel" "$KERNEL_EVENT_NAME" "intfield" kernel_test_app | |
312 | ||
313 | modprobe --remove lttng-test | |
314 | ||
315 | stop_lttng_sessiond_notap | |
316 | else | |
317 | # Kernel tests are skipped. | |
318 | skip 0 "Root access is needed. Skipping all kernel notification tests." $KERNEL_NUM_TESTS | |
319 | fi | |
320 | ||
321 | ||
322 | rm -rf "$TMPDIR" |