Tests: add kernel namespace context change tests
[lttng-tools.git] / tests / regression / kernel / test_ns_contexts_change
CommitLineData
5f0d4e78
MJ
1#!/bin/bash
2#
3# Copyright (C) 2019 Michael Jeanson <mjeanson@efficios.com>
4#
5# This library is free software; you can redistribute it and/or modify it under
6# the terms of the GNU Lesser General Public License as published by the Free
7# Software Foundation; version 2.1 of the License.
8#
9# This library is distributed in the hope that it will be useful, but WITHOUT
10# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
12# details.
13#
14# You should have received a copy of the GNU Lesser General Public License
15# along with this library; if not, write to the Free Software Foundation, Inc.,
16# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
18TEST_DESC="Kernel tracer - Namespace contexts change"
19
20CURDIR=$(dirname "$0")/
21TESTDIR=$CURDIR/../..
22
23TESTAPP_PATH="$TESTDIR/utils/testapp"
24TESTAPP_NAME="gen-ns-events"
25TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
26
27TESTS_PER_NS=19
28
29NUM_TESTS=$((TESTS_PER_NS * 6))
30
31source "$TESTDIR/utils/utils.sh"
32
33# MUST set TESTDIR before calling those functions
34
35function add_context_kernel_skip_ok()
36{
37 local session_name=$1
38 local channel_name=$2
39 local context_name=$3
40 local skip_num=$4
41
42 local ret
43
44 "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" add-context -k \
45 -s "$session_name" -c "$channel_name" \
46 -t "$context_name" 1>"$OUTPUT_DEST" 2>"$ERROR_OUTPUT_DEST"
47 ret=$?
48
49 if [ "$ret" == "4" ]; then
50 skip 0 "Current kernel doesn't implement '$context_name' context" $((skip_num + 1))
51 else
52 ok $ret "Add context command for type: $context_name"
53 fi
54
55 return $ret
56}
57
58function enable_kernel_lttng_event_filter_ok()
59{
60 local session_name=$1
61 local syscall_name=$2
62 local channel_name=$3
63 local filter=$4
64
65 "$TESTDIR/../src/bin/lttng/$LTTNG_BIN" enable-event -k \
66 -c "$channel_name" -s "$session_name" \
67 --syscall "$syscall_name" \
68 -f "$filter" \
69 1>"$OUTPUT_DEST" 2>"$ERROR_OUTPUT_DEST"
70
71 ok $? "Add syscall with filter"
72}
73
74function test_ns()
75{
76 local ns=$1
77
78 local session_name="${ns}_ns"
79 local chan_name="${ns}_ns"
80 local context_name="${ns}_ns"
81
82 local trace_path
83 local ns_inode
84 local file_sync_wait_before_unshare
85 local file_sync_wait_after_unshare
86 local file_sync_signal_after_unshare
87
88 # Check if the kernel has support for this ns type
89 if [ ! -f "/proc/$$/ns/$ns" ]; then
90 skip 0 "System has no $ns namespace support" $TESTS_PER_NS
91 return
92 fi
93
94 trace_path=$(mktemp -d)
95 file_sync_wait_before_unshare=$(mktemp -u)
96 file_sync_wait_after_unshare=$(mktemp -u)
97 file_sync_signal_after_unshare=$(mktemp -u)
98
99 # Get the current ns inode number
100 ns_inode=$(stat -c '%i' -L "/proc/$$/ns/$ns")
101 ok $? "Get current $ns namespace inode: $ns_inode" || ns_inode="invalid"
102
103 $TESTAPP_BIN -n "$ns" -a "$file_sync_wait_after_unshare" -b "$file_sync_wait_before_unshare" -s "$file_sync_signal_after_unshare" &
104 ok $? "Launch test app."
105 app_pid=$!
106
107 app_ns_inode=$(stat -c '%i' -L "/proc/$app_pid/ns/$ns")
108 ok $? "Get app current $ns namespace inode: $app_ns_inode" || app_ns_inode="invalid"
109
110 start_lttng_sessiond
111
112 create_lttng_session_ok "$session_name" "$trace_path"
113 enable_kernel_lttng_channel_ok "$session_name" "$chan_name"
114 add_context_kernel_skip_ok "$session_name" "$chan_name" "$context_name" 10
115 if [ "$?" != "4" ]; then
116 lttng_enable_kernel_syscall_ok "$session_name" "unshare" "$chan_name"
117 lttng_track_pid_ok "$app_pid"
118 start_lttng_tracing_ok "$session_name"
119
120 touch "$file_sync_wait_before_unshare"
121
122 # Let the app do it's thing before entering the synchronisation loop
123 sleep 0.5
124
125 while [ ! -f "$file_sync_signal_after_unshare" ]; do
126 # Break if the app failed / died
127 if [ ! -f "/proc/$app_pid" ]; then
128 break
129 fi
130 echo "# Waiting for app..."
131 sleep 0.5
132 done
133
134 app_unshare_ns_inode=$(stat -c '%i' -L "/proc/$app_pid/ns/$ns")
135 ok $? "Get app current $ns namespace inode: $app_unshare_ns_inode" || app_unshare_ns_inode="invalid"
136
137 test "$app_ns_inode" != "invalid" && test "$app_unshare_ns_inode" != "invalid" && test "$app_ns_inode" != "$app_unshare_ns_inode"
138 ok $? "Reported namespace inode changed after unshare"
139
140 touch "$file_sync_wait_after_unshare"
141
142 stop_lttng_tracing_ok "$session_name"
143
144 # Check that the events contain the right namespace inode number
145 validate_trace_count "${ns}_ns = $app_ns_inode" "$trace_path" 1
146 validate_trace_count "${ns}_ns = $app_unshare_ns_inode" "$trace_path" 1
147 fi
148
149 # stop and destroy
150 destroy_lttng_session_ok "$session_name"
151 stop_lttng_sessiond
152
153 rm -rf "$trace_path"
154 rm -f "$file_sync_wait_after_unshare"
155 rm -f "$file_sync_wait_before_unshare"
156 rm -f "$file_sync_signal_after_unshare"
157}
158
159
160plan_tests $NUM_TESTS
161
162print_test_banner "$TEST_DESC"
163
164
165isroot=0
166if [ "$(id -u)" == "0" ]; then
167 isroot=1
168fi
169
170skip $isroot "Root access is needed. Skipping all tests." "$NUM_TESTS" && exit 0
171
172
173system_has_ns=0
174if [ -d "/proc/$$/ns" ]; then
175 system_has_ns=1
176fi
177
178skip $system_has_ns "System has no namespaces support" $NUM_TESTS && exit 0
179
180
181validate_lttng_modules_present
182
183test_ns cgroup
184test_ns ipc
185test_ns mnt
186test_ns net
187#test_ns pid # pid_ns is special, can't be changed that way
188test_ns user
189test_ns uts
This page took 0.02952 seconds and 5 git commands to generate.