Test: Add syscall listing
[lttng-tools.git] / tests / regression / kernel / test_syscall
1 #!/bin/bash
2 #
3 # Copyright (C) - 2013 Christian Babeux <christian.babeux@efficios.com>
4 # Copyright (C) - 2014 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 #
6 # This program is free software; you can redistribute it and/or modify it
7 # under the terms of the GNU General Public License, version 2 only, as
8 # published by the Free Software Foundation.
9 #
10 # This program is distributed in the hope that it will be useful, but WITHOUT
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 # more details.
14 #
15 # You should have received a copy of the GNU General Public License along with
16 # this program; if not, write to the Free Software Foundation, Inc., 51
17 # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
19 TEST_DESC="Kernel tracer - System calls"
20
21 CURDIR=$(dirname $0)/
22 TESTDIR=$CURDIR/../..
23 NUM_TESTS=155
24
25 # test command issues at least open and close system calls
26 TESTCMD="cat /proc/cpuinfo > /dev/null"
27
28 source $TESTDIR/utils/utils.sh
29
30 function validate_list()
31 {
32 local session_name=$1
33 local event_name=$2
34 local opt=$3
35
36 out=$($TESTDIR/../src/bin/lttng/$LTTNG_BIN list $session_name $opt | grep $event_name)
37 if [ -z "$out" ]; then
38 fail "Validate syscall listing"
39 diag "$event_name not found when listing $session_name (opt $opt)"
40 else
41 pass "Validate syscall listing. Found $event_name."
42 fi
43 }
44
45 function test_syscall_event_list()
46 {
47 local EVENT_NAME="getpid"
48
49 diag "Syscall event listing"
50
51 validate_list "" $EVENT_NAME "-k --syscall"
52 }
53
54 function test_syscall_simple_list()
55 {
56 TRACE_PATH=$(mktemp -d)
57 SESSION_NAME="kernel_syscall_simple_list"
58 local EVENT_NAME="close"
59
60 diag "Syscall simple listing"
61
62 create_lttng_session $SESSION_NAME $TRACE_PATH
63
64 lttng_enable_kernel_syscall_ok $SESSION_NAME $EVENT_NAME
65
66 validate_list $SESSION_NAME $EVENT_NAME
67
68 start_lttng_tracing
69 eval ${TESTCMD}
70 stop_lttng_tracing
71
72 # ensure each is there.
73 validate_trace_exp "-e syscall_entry_$EVENT_NAME: -e compat_syscall_entry_$EVENT_NAME:" $TRACE_PATH
74 validate_trace_exp "-e syscall_exit_$EVENT_NAME: -e compat_syscall_exit_$EVENT_NAME:" $TRACE_PATH
75
76 # ensure trace only contains those.
77 validate_trace_only_exp "-e syscall_entry_$EVENT_NAME: -e compat_syscall_entry_$EVENT_NAME: -e syscall_exit_$EVENT_NAME: -e compat_syscall_exit_$EVENT_NAME:" $TRACE_PATH
78
79 destroy_lttng_session $SESSION_NAME
80
81 rm -rf $TRACE_PATH
82 }
83
84 function test_syscall_simple_list_two()
85 {
86 TRACE_PATH=$(mktemp -d)
87 SESSION_NAME="kernel_syscall_simple_list_two"
88 local EVENT_NAME="close"
89 local EVENT_NAME2="read"
90
91 diag "Syscall simple listing"
92
93 create_lttng_session $SESSION_NAME $TRACE_PATH
94
95 lttng_enable_kernel_syscall_ok $SESSION_NAME $EVENT_NAME
96 lttng_enable_kernel_syscall_ok $SESSION_NAME $EVENT_NAME2
97
98 validate_list $SESSION_NAME $EVENT_NAME
99 validate_list $SESSION_NAME $EVENT_NAME2
100
101 start_lttng_tracing
102 eval ${TESTCMD}
103 stop_lttng_tracing
104
105 # ensure each is there.
106 validate_trace_exp "-e syscall_entry_$EVENT_NAME: -e compat_syscall_entry_$EVENT_NAME:" $TRACE_PATH
107 validate_trace_exp "-e syscall_exit_$EVENT_NAME: -e compat_syscall_exit_$EVENT_NAME:" $TRACE_PATH
108
109 # ensure each is there.
110 validate_trace_exp "-e syscall_entry_$EVENT_NAME2: -e compat_syscall_entry_$EVENT_NAME2:" $TRACE_PATH
111 validate_trace_exp "-e syscall_exit_$EVENT_NAME2: -e compat_syscall_exit_$EVENT_NAME2:" $TRACE_PATH
112
113 # ensure trace only contains those.
114 validate_trace_only_exp "-e syscall_entry_$EVENT_NAME: -e compat_syscall_entry_$EVENT_NAME: -e syscall_exit_$EVENT_NAME: -e compat_syscall_exit_$EVENT_NAME: -e syscall_entry_$EVENT_NAME2: -e compat_syscall_entry_$EVENT_NAME2: -e syscall_exit_$EVENT_NAME2: -e compat_syscall_exit_$EVENT_NAME2:" $TRACE_PATH
115
116 destroy_lttng_session $SESSION_NAME
117
118 rm -rf $TRACE_PATH
119 }
120
121 function test_syscall_single()
122 {
123 TRACE_PATH=$(mktemp -d)
124 SESSION_NAME="kernel_syscall_single"
125
126 diag "Syscall trace single"
127
128 create_lttng_session $SESSION_NAME $TRACE_PATH
129
130 lttng_enable_kernel_syscall_ok $SESSION_NAME "open"
131
132 start_lttng_tracing
133 eval ${TESTCMD}
134 stop_lttng_tracing
135
136 # ensure each is there.
137 validate_trace_exp "-e syscall_entry_open: -e compat_syscall_entry_open:" $TRACE_PATH
138 validate_trace_exp "-e syscall_exit_open: -e compat_syscall_exit_open:" $TRACE_PATH
139
140 # ensure trace only contains those.
141 validate_trace_only_exp "-e syscall_entry_open: -e compat_syscall_entry_open: -e syscall_exit_open: -e compat_syscall_exit_open:" $TRACE_PATH
142
143 destroy_lttng_session $SESSION_NAME
144
145 rm -rf $TRACE_PATH
146 }
147
148 function test_syscall_two()
149 {
150 TRACE_PATH=$(mktemp -d)
151 SESSION_NAME="kernel_syscall_two"
152
153 diag "Syscall trace two events"
154
155 create_lttng_session $SESSION_NAME $TRACE_PATH
156
157 lttng_enable_kernel_syscall_ok $SESSION_NAME "open"
158 lttng_enable_kernel_syscall_ok $SESSION_NAME "close"
159
160 start_lttng_tracing
161 eval ${TESTCMD}
162 stop_lttng_tracing
163
164 # ensure each is there.
165 validate_trace_exp "-e syscall_entry_open: -e compat_syscall_entry_open:" $TRACE_PATH
166 validate_trace_exp "-e syscall_exit_open: -e compat_syscall_exit_open:" $TRACE_PATH
167 validate_trace_exp "-e syscall_entry_close: -e compat_syscall_entry_close:" $TRACE_PATH
168 validate_trace_exp "-e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
169
170 # ensure trace only contains those.
171 validate_trace_only_exp "-e syscall_entry_open: -e compat_syscall_entry_open: -e syscall_exit_open: -e compat_syscall_exit_open: -e syscall_entry_close: -e compat_syscall_entry_close: -e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
172
173 destroy_lttng_session $SESSION_NAME
174
175 rm -rf $TRACE_PATH
176 }
177
178 function test_syscall_all()
179 {
180 TRACE_PATH=$(mktemp -d)
181 SESSION_NAME="kernel_syscall_all"
182
183 diag "Syscall trace all events"
184
185 create_lttng_session $SESSION_NAME $TRACE_PATH
186
187 # enable all syscalls
188 lttng_enable_kernel_syscall_ok $SESSION_NAME
189
190 start_lttng_tracing
191 eval ${TESTCMD}
192 stop_lttng_tracing
193
194 # ensure at least open and close are there.
195 validate_trace_exp "-e syscall_entry_open: -e compat_syscall_entry_open:" $TRACE_PATH
196 validate_trace_exp "-e syscall_exit_open: -e compat_syscall_exit_open:" $TRACE_PATH
197 validate_trace_exp "-e syscall_entry_close: -e compat_syscall_entry_close:" $TRACE_PATH
198 validate_trace_exp "-e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
199 # trace may contain other syscalls.
200
201 destroy_lttng_session $SESSION_NAME
202
203 rm -rf $TRACE_PATH
204 }
205
206 function test_syscall_all_disable_one()
207 {
208 TRACE_PATH=$(mktemp -d)
209 SESSION_NAME="kernel_syscall_all_disable_one"
210
211 diag "Syscall trace all events and disable one"
212
213 create_lttng_session $SESSION_NAME $TRACE_PATH
214
215 # enable all syscalls
216 lttng_enable_kernel_syscall_ok $SESSION_NAME
217 # disable open system call
218 lttng_disable_kernel_syscall_ok $SESSION_NAME "open"
219
220 start_lttng_tracing
221 eval ${TESTCMD}
222 stop_lttng_tracing
223
224 # ensure "open" syscall is not there.
225 validate_trace_only_exp "-v -e syscall_entry_open: -e compat_syscall_entry_open: -e syscall_exit_open: -e compat_syscall_exit_open:" $TRACE_PATH
226
227 # ensure "close" syscall is there.
228 validate_trace_exp "-e syscall_entry_close: -e compat_syscall_entry_close:" $TRACE_PATH
229 validate_trace_exp "-e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
230
231 destroy_lttng_session $SESSION_NAME
232
233 rm -rf $TRACE_PATH
234 }
235
236 function test_syscall_all_disable_two()
237 {
238 TRACE_PATH=$(mktemp -d)
239 SESSION_NAME="kernel_syscall_all_disable_two"
240
241 diag "Syscall trace all events and disable two"
242
243 create_lttng_session $SESSION_NAME $TRACE_PATH
244
245 # enable all syscalls
246 lttng_enable_kernel_syscall_ok $SESSION_NAME
247 # disable open system call
248 lttng_disable_kernel_syscall_ok $SESSION_NAME "open"
249 lttng_disable_kernel_syscall_ok $SESSION_NAME "close"
250
251 start_lttng_tracing
252 # generates open, close, execve (at least)
253 eval ${TESTCMD}
254 stop_lttng_tracing
255
256 # ensure "open" and "close" syscalls are not there.
257 validate_trace_only_exp "-v -e syscall_entry_open: -e compat_syscall_entry_open: -e syscall_exit_open: -e compat_syscall_exit_open: -e syscall_entry_close: -e compat_syscall_entry_close: -e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
258
259 # ensure "execve" syscall is there.
260 validate_trace_exp "-e syscall_entry_execve: -e compat_syscall_entry_execve:" $TRACE_PATH
261 validate_trace_exp "-e syscall_exit_execve: -e compat_syscall_exit_execve:" $TRACE_PATH
262
263 destroy_lttng_session $SESSION_NAME
264
265 rm -rf $TRACE_PATH
266 }
267
268 function test_syscall_enable_all_disable_all()
269 {
270 TRACE_PATH=$(mktemp -d)
271 SESSION_NAME="kernel_syscall_enable_all_disable_all"
272
273 diag "Syscall trace all events and disable all"
274
275 create_lttng_session $SESSION_NAME $TRACE_PATH
276
277 # enable all system calls
278 lttng_enable_kernel_syscall_ok $SESSION_NAME
279 # disable all system calls
280 lttng_disable_kernel_syscall_ok $SESSION_NAME
281
282 start_lttng_tracing
283 # generates open, close, execve (at least)
284 eval ${TESTCMD}
285 stop_lttng_tracing
286
287 # ensure nothing has been traced.
288 validate_trace_empty $TRACE_PATH
289
290 destroy_lttng_session $SESSION_NAME
291
292 rm -rf $TRACE_PATH
293 }
294
295 function test_syscall_enable_all_disable_all_enable_all()
296 {
297 TRACE_PATH=$(mktemp -d)
298 SESSION_NAME="kernel_syscall_enable_all_disable_all_enable_all"
299
300 diag "Syscall trace all events and enable/disable all"
301
302 create_lttng_session $SESSION_NAME $TRACE_PATH
303
304 # enable all system calls
305 lttng_enable_kernel_syscall_ok $SESSION_NAME
306 # disable all system calls
307 lttng_disable_kernel_syscall_ok $SESSION_NAME
308 # enable all system calls
309 lttng_enable_kernel_syscall_ok $SESSION_NAME
310
311 start_lttng_tracing
312 # generates open, close, execve (at least)
313 eval ${TESTCMD}
314 stop_lttng_tracing
315
316 # ensure at least open and close are there.
317 validate_trace_exp "-e syscall_entry_open: -e compat_syscall_entry_open:" $TRACE_PATH
318 validate_trace_exp "-e syscall_exit_open: -e compat_syscall_exit_open:" $TRACE_PATH
319 validate_trace_exp "-e syscall_entry_close: -e compat_syscall_entry_close:" $TRACE_PATH
320 validate_trace_exp "-e syscall_exit_close: -e compat_syscall_exit_close:" $TRACE_PATH
321 # trace may contain other syscalls.
322
323 destroy_lttng_session $SESSION_NAME
324
325 rm -rf $TRACE_PATH
326 }
327
328 function test_syscall_enable_all_disable_all_twice()
329 {
330 TRACE_PATH=$(mktemp -d)
331 SESSION_NAME="kernel_syscall_enable_all_disable_all_twice"
332
333 diag "Syscall trace all events and enable/disable all twice"
334
335 create_lttng_session $SESSION_NAME $TRACE_PATH
336
337 # enable all system calls
338 lttng_enable_kernel_syscall_ok $SESSION_NAME
339 # disable all system calls
340 lttng_disable_kernel_syscall_ok $SESSION_NAME
341 # enable all system calls
342 lttng_enable_kernel_syscall_ok $SESSION_NAME
343 # disable all system calls
344 lttng_disable_kernel_syscall_ok $SESSION_NAME
345
346 start_lttng_tracing
347 # generates open, close, execve (at least)
348 eval ${TESTCMD}
349 stop_lttng_tracing
350
351 # ensure nothing has been traced.
352 validate_trace_empty $TRACE_PATH
353
354 destroy_lttng_session $SESSION_NAME
355
356 rm -rf $TRACE_PATH
357 }
358
359 function test_syscall_enable_one_disable_one()
360 {
361 TRACE_PATH=$(mktemp -d)
362 SESSION_NAME="kernel_syscall_enable_one_disable_one"
363
364 diag "Syscall trace one event and disable one"
365
366 create_lttng_session $SESSION_NAME $TRACE_PATH
367
368 # enable open system call
369 lttng_enable_kernel_syscall_ok $SESSION_NAME "open"
370 # disable open system call
371 lttng_disable_kernel_syscall_ok $SESSION_NAME "open"
372
373 start_lttng_tracing
374 # generates open, close, execve (at least)
375 eval ${TESTCMD}
376 stop_lttng_tracing
377
378 # ensure nothing has been traced.
379 validate_trace_empty $TRACE_PATH
380
381 destroy_lttng_session $SESSION_NAME
382
383 rm -rf $TRACE_PATH
384 }
385
386 function test_syscall_enable_two_disable_two()
387 {
388 TRACE_PATH=$(mktemp -d)
389 SESSION_NAME="kernel_syscall_enable_two_disable_two"
390
391 diag "Syscall trace two events and disable two"
392
393 create_lttng_session $SESSION_NAME $TRACE_PATH
394
395 # enable open and close system calls
396 lttng_enable_kernel_syscall_ok $SESSION_NAME "open"
397 lttng_enable_kernel_syscall_ok $SESSION_NAME "close"
398 # disable open and close system calls
399 lttng_disable_kernel_syscall_ok $SESSION_NAME "open"
400 lttng_disable_kernel_syscall_ok $SESSION_NAME "close"
401
402 start_lttng_tracing
403 # generates open, close, execve (at least)
404 eval ${TESTCMD}
405 stop_lttng_tracing
406
407 # ensure nothing has been traced.
408 validate_trace_empty $TRACE_PATH
409
410 destroy_lttng_session $SESSION_NAME
411
412 rm -rf $TRACE_PATH
413 }
414
415 function test_syscall_enable_two_disable_one()
416 {
417 TRACE_PATH=$(mktemp -d)
418 SESSION_NAME="kernel_syscall_enable_two_disable_one"
419
420 diag "Syscall trace two events and disable one"
421
422 create_lttng_session $SESSION_NAME $TRACE_PATH
423
424 # enable open and close system calls
425 lttng_enable_kernel_syscall_ok $SESSION_NAME "open"
426 lttng_enable_kernel_syscall_ok $SESSION_NAME "close"
427 # disable close system call
428 lttng_disable_kernel_syscall_ok $SESSION_NAME "close"
429
430 start_lttng_tracing
431 # generates open, close, execve (at least)
432 eval ${TESTCMD}
433 stop_lttng_tracing
434
435 # ensure open is there.
436 validate_trace_exp "-e syscall_entry_open: -e compat_syscall_entry_open:" $TRACE_PATH
437 validate_trace_exp "-e syscall_exit_open: -e compat_syscall_exit_open:" $TRACE_PATH
438
439 # ensure trace only contains those.
440 validate_trace_only_exp "-e syscall_entry_open: -e compat_syscall_entry_open: -e syscall_exit_open: -e compat_syscall_exit_open:" $TRACE_PATH
441
442 destroy_lttng_session $SESSION_NAME
443
444 rm -rf $TRACE_PATH
445 }
446
447 function test_syscall_disable_twice()
448 {
449 TRACE_PATH=$(mktemp -d)
450 SESSION_NAME="kernel_syscall_disable_twice"
451
452 diag "Syscall trace one event and disable twice"
453
454 create_lttng_session $SESSION_NAME $TRACE_PATH
455
456 lttng_enable_kernel_syscall_ok $SESSION_NAME "open"
457 # First disable will succeed
458 lttng_disable_kernel_syscall_ok $SESSION_NAME "open"
459 # Second disable will fail
460 lttng_disable_kernel_syscall_fail $SESSION_NAME "open"
461
462 destroy_lttng_session $SESSION_NAME
463
464 rm -rf $TRACE_PATH
465 }
466
467 function test_syscall_disable_all_twice()
468 {
469 TRACE_PATH=$(mktemp -d)
470 SESSION_NAME="kernel_syscall_disable_all_twice"
471
472 diag "Syscall trace all events and disable all twice"
473
474 create_lttng_session $SESSION_NAME $TRACE_PATH
475
476 lttng_enable_kernel_syscall_ok $SESSION_NAME
477 # First disable will succeed
478 lttng_disable_kernel_syscall_ok $SESSION_NAME
479 # Second disable will fail
480 lttng_disable_kernel_syscall_fail $SESSION_NAME
481
482 destroy_lttng_session $SESSION_NAME
483
484 rm -rf $TRACE_PATH
485 }
486
487
488 function test_syscall_enable_unknown()
489 {
490 TRACE_PATH=$(mktemp -d)
491 SESSION_NAME="kernel_syscall_enable_unknown"
492
493 diag "Syscall enable an unknown event"
494
495 create_lttng_session $SESSION_NAME $TRACE_PATH
496
497 lttng_enable_kernel_syscall_fail $SESSION_NAME "thissyscallcannotexist"
498
499 destroy_lttng_session $SESSION_NAME
500
501 rm -rf $TRACE_PATH
502 }
503
504 function test_syscall_enable_all_enable_one()
505 {
506 TRACE_PATH=$(mktemp -d)
507 SESSION_NAME="kernel_syscall_enable_all_enable_one"
508
509 diag "Syscall enable all and enable one"
510
511 create_lttng_session $SESSION_NAME $TRACE_PATH
512
513 lttng_enable_kernel_syscall_ok $SESSION_NAME
514 # Enabling an event already enabled fails.
515 lttng_enable_kernel_syscall_fail $SESSION_NAME "open"
516
517 destroy_lttng_session $SESSION_NAME
518
519 rm -rf $TRACE_PATH
520 }
521
522 function test_syscall_disable_all_disable_one()
523 {
524 TRACE_PATH=$(mktemp -d)
525 SESSION_NAME="kernel_syscall_enable_all_enable_one"
526
527 diag "Syscall disable all and disable one"
528
529 create_lttng_session $SESSION_NAME $TRACE_PATH
530
531 lttng_enable_kernel_syscall_ok $SESSION_NAME
532 lttng_disable_kernel_syscall_ok $SESSION_NAME
533 # Disabling an event already disabled fails.
534 lttng_disable_kernel_syscall_fail $SESSION_NAME "open"
535
536 destroy_lttng_session $SESSION_NAME
537
538 rm -rf $TRACE_PATH
539 }
540
541 function test_syscall_enable_channel_disable_all()
542 {
543 TRACE_PATH=$(mktemp -d)
544 SESSION_NAME="kernel_syscall_enable_channel_disable_all"
545 CHANNEL_NAME="channel"
546
547 diag "Syscall enable channel and disable all"
548
549 create_lttng_session $SESSION_NAME $TRACE_PATH
550
551 lttng_enable_kernel_channel_ok $SESSION_NAME $CHANNEL_NAME
552 lttng_disable_kernel_syscall_fail $SESSION_NAME "-a" $CHANNEL_NAME
553
554 destroy_lttng_session $SESSION_NAME
555
556 rm -rf $TRACE_PATH
557 }
558
559 function test_syscall_enable_channel_disable_one()
560 {
561 TRACE_PATH=$(mktemp -d)
562 SESSION_NAME="kernel_syscall_enable_channel_disable_all"
563 CHANNEL_NAME="channel"
564
565 diag "Syscall enable channel and disable one"
566
567 create_lttng_session $SESSION_NAME $TRACE_PATH
568
569 lttng_enable_kernel_channel_ok $SESSION_NAME $CHANNEL_NAME
570 lttng_disable_kernel_syscall_fail $SESSION_NAME "open" $CHANNEL_NAME
571
572 destroy_lttng_session $SESSION_NAME
573
574 rm -rf $TRACE_PATH
575 }
576
577 # MUST set TESTDIR before calling those functions
578 plan_tests $NUM_TESTS
579
580 print_test_banner "$TEST_DESC"
581
582 if [ "$(id -u)" == "0" ]; then
583 isroot=1
584 else
585 isroot=0
586 fi
587
588 skip $isroot "Root access is needed. Skipping all tests." $NUM_TESTS ||
589 {
590 start_lttng_sessiond
591
592 test_syscall_event_list
593 test_syscall_simple_list
594 test_syscall_simple_list_two
595 test_syscall_single
596 test_syscall_two
597 test_syscall_all
598 test_syscall_all_disable_one
599 test_syscall_all_disable_two
600 test_syscall_enable_all_disable_all
601 test_syscall_enable_all_disable_all_enable_all
602 test_syscall_enable_all_disable_all_twice
603 test_syscall_enable_one_disable_one
604 test_syscall_enable_two_disable_two
605 test_syscall_enable_two_disable_one
606 test_syscall_disable_twice
607 test_syscall_disable_all_twice
608 test_syscall_enable_unknown
609 test_syscall_enable_all_enable_one
610 test_syscall_disable_all_disable_one
611 test_syscall_enable_channel_disable_all
612 test_syscall_enable_channel_disable_one
613
614 stop_lttng_sessiond
615 }
This page took 0.046553 seconds and 5 git commands to generate.