Commit | Line | Data |
---|---|---|
5f0d4e78 MJ |
1 | #!/bin/bash |
2 | # | |
3 | # Copyright (C) 2019 Michael Jeanson <mjeanson@efficios.com> | |
4 | # | |
9d16b343 | 5 | # SPDX-License-Identifier: LGPL-2.1-only |
5f0d4e78 MJ |
6 | |
7 | TEST_DESC="Kernel tracer - Namespace contexts change" | |
8 | ||
9 | CURDIR=$(dirname "$0")/ | |
10 | TESTDIR=$CURDIR/../.. | |
11 | ||
12 | TESTAPP_PATH="$TESTDIR/utils/testapp" | |
13 | TESTAPP_NAME="gen-ns-events" | |
14 | TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME" | |
15 | ||
16 | TESTS_PER_NS=19 | |
17 | ||
18 | NUM_TESTS=$((TESTS_PER_NS * 6)) | |
19 | ||
20 | source "$TESTDIR/utils/utils.sh" | |
21 | ||
22 | # MUST set TESTDIR before calling those functions | |
23 | ||
24 | function add_context_kernel_skip_ok() | |
25 | { | |
26 | local session_name=$1 | |
27 | local channel_name=$2 | |
28 | local context_name=$3 | |
29 | local skip_num=$4 | |
30 | ||
31 | local ret | |
32 | ||
b445e3da KS |
33 | _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" add-context -k \ |
34 | -s "$session_name" -c "$channel_name" -t "$context_name" | |
5f0d4e78 MJ |
35 | ret=$? |
36 | ||
37 | if [ "$ret" == "4" ]; then | |
38 | skip 0 "Current kernel doesn't implement '$context_name' context" $((skip_num + 1)) | |
39 | else | |
40 | ok $ret "Add context command for type: $context_name" | |
41 | fi | |
42 | ||
43 | return $ret | |
44 | } | |
45 | ||
46 | function enable_kernel_lttng_event_filter_ok() | |
47 | { | |
48 | local session_name=$1 | |
49 | local syscall_name=$2 | |
50 | local channel_name=$3 | |
51 | local filter=$4 | |
52 | ||
b445e3da KS |
53 | _run_lttng_cmd "$(lttng_client_log_file)" "$(lttng_client_err_file)" enable-event -k \ |
54 | -c "$channel_name" -s "$session_name" \ --syscall "$syscall_name" \ | |
55 | -f "$filter" | |
5f0d4e78 MJ |
56 | |
57 | ok $? "Add syscall with filter" | |
58 | } | |
59 | ||
60 | function test_ns() | |
61 | { | |
62 | local ns=$1 | |
63 | ||
64 | local session_name="${ns}_ns" | |
65 | local chan_name="${ns}_ns" | |
66 | local context_name="${ns}_ns" | |
67 | ||
68 | local trace_path | |
69 | local ns_inode | |
70 | local file_sync_wait_before_unshare | |
71 | local file_sync_wait_after_unshare | |
72 | local file_sync_signal_after_unshare | |
73 | ||
74 | # Check if the kernel has support for this ns type | |
75 | if [ ! -f "/proc/$$/ns/$ns" ]; then | |
76 | skip 0 "System has no $ns namespace support" $TESTS_PER_NS | |
77 | return | |
78 | fi | |
79 | ||
8d5a3312 MJ |
80 | trace_path=$(mktemp -d -t "tmp.${FUNCNAME[0]}_trace_path.XXXXXX") |
81 | file_sync_wait_before_unshare=$(mktemp -u -t "tmp.${FUNCNAME[0]}_sync_before_unshare.XXXXXX") | |
82 | file_sync_wait_after_unshare=$(mktemp -u -t "tmp.${FUNCNAME[0]}_sync_after_unshare.XXXXXX") | |
83 | file_sync_signal_after_unshare=$(mktemp -u -t "tmp.${FUNCNAME[0]}_sync_signal_after_unshare.XXXXXX") | |
5f0d4e78 MJ |
84 | |
85 | # Get the current ns inode number | |
86 | ns_inode=$(stat -c '%i' -L "/proc/$$/ns/$ns") | |
87 | ok $? "Get current $ns namespace inode: $ns_inode" || ns_inode="invalid" | |
88 | ||
89 | $TESTAPP_BIN -n "$ns" -a "$file_sync_wait_after_unshare" -b "$file_sync_wait_before_unshare" -s "$file_sync_signal_after_unshare" & | |
90 | ok $? "Launch test app." | |
91 | app_pid=$! | |
92 | ||
93 | app_ns_inode=$(stat -c '%i' -L "/proc/$app_pid/ns/$ns") | |
94 | ok $? "Get app current $ns namespace inode: $app_ns_inode" || app_ns_inode="invalid" | |
95 | ||
96 | start_lttng_sessiond | |
97 | ||
98 | create_lttng_session_ok "$session_name" "$trace_path" | |
99 | enable_kernel_lttng_channel_ok "$session_name" "$chan_name" | |
100 | add_context_kernel_skip_ok "$session_name" "$chan_name" "$context_name" 10 | |
101 | if [ "$?" != "4" ]; then | |
102 | lttng_enable_kernel_syscall_ok "$session_name" "unshare" "$chan_name" | |
103 | lttng_track_pid_ok "$app_pid" | |
104 | start_lttng_tracing_ok "$session_name" | |
105 | ||
106 | touch "$file_sync_wait_before_unshare" | |
107 | ||
5f0d4e78 MJ |
108 | while [ ! -f "$file_sync_signal_after_unshare" ]; do |
109 | # Break if the app failed / died | |
70a7f9f7 | 110 | if ! kill -0 "$app_pid" ; then |
5f0d4e78 | 111 | break |
70a7f9f7 | 112 | echo "# App failed" |
5f0d4e78 MJ |
113 | fi |
114 | echo "# Waiting for app..." | |
115 | sleep 0.5 | |
116 | done | |
117 | ||
118 | app_unshare_ns_inode=$(stat -c '%i' -L "/proc/$app_pid/ns/$ns") | |
119 | ok $? "Get app current $ns namespace inode: $app_unshare_ns_inode" || app_unshare_ns_inode="invalid" | |
120 | ||
121 | test "$app_ns_inode" != "invalid" && test "$app_unshare_ns_inode" != "invalid" && test "$app_ns_inode" != "$app_unshare_ns_inode" | |
122 | ok $? "Reported namespace inode changed after unshare" | |
123 | ||
124 | touch "$file_sync_wait_after_unshare" | |
125 | ||
126 | stop_lttng_tracing_ok "$session_name" | |
127 | ||
128 | # Check that the events contain the right namespace inode number | |
129 | validate_trace_count "${ns}_ns = $app_ns_inode" "$trace_path" 1 | |
130 | validate_trace_count "${ns}_ns = $app_unshare_ns_inode" "$trace_path" 1 | |
0159fa50 JR |
131 | else |
132 | touch "$file_sync_wait_before_unshare" | |
133 | ||
134 | while [ ! -f "$file_sync_signal_after_unshare" ]; do | |
135 | # Break if the app failed / died | |
136 | if ! kill -0 "$app_pid" ; then | |
137 | break | |
138 | echo "# App failed" | |
139 | fi | |
140 | echo "# Waiting for app..." | |
141 | sleep 0.5 | |
142 | done | |
143 | touch "$file_sync_wait_after_unshare" | |
5f0d4e78 MJ |
144 | fi |
145 | ||
0159fa50 | 146 | |
5f0d4e78 MJ |
147 | # stop and destroy |
148 | destroy_lttng_session_ok "$session_name" | |
149 | stop_lttng_sessiond | |
150 | ||
151 | rm -rf "$trace_path" | |
152 | rm -f "$file_sync_wait_after_unshare" | |
153 | rm -f "$file_sync_wait_before_unshare" | |
154 | rm -f "$file_sync_signal_after_unshare" | |
155 | } | |
156 | ||
157 | ||
158 | plan_tests $NUM_TESTS | |
159 | ||
160 | print_test_banner "$TEST_DESC" | |
161 | ||
3a174400 | 162 | check_skip_kernel_test "$NUM_TESTS" "Skipping all tests." && exit 0 |
5f0d4e78 MJ |
163 | |
164 | system_has_ns=0 | |
165 | if [ -d "/proc/$$/ns" ]; then | |
166 | system_has_ns=1 | |
167 | fi | |
168 | ||
169 | skip $system_has_ns "System has no namespaces support" $NUM_TESTS && exit 0 | |
170 | ||
171 | ||
172 | validate_lttng_modules_present | |
173 | ||
174 | test_ns cgroup | |
175 | test_ns ipc | |
176 | test_ns mnt | |
177 | test_ns net | |
178 | #test_ns pid # pid_ns is special, can't be changed that way | |
d37ac3cd | 179 | #test_ns time # time_ns is special, can't be changed that way |
5f0d4e78 MJ |
180 | test_ns user |
181 | test_ns uts | |
0159fa50 | 182 | set +x |