3 # Copyright (C) 2018 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
5 # SPDX-License-Identifier: LGPL-2.1-only
7 TEST_DESC
="Change working directory of process"
9 CURDIR
=$
(dirname "$0")/
10 TESTDIR
=$CURDIR/..
/..
/..
/
12 DIR
=$
(readlink
-f "$TESTDIR")
16 source $TESTDIR/utils
/utils.sh
18 #MUST set TESTDIR before calling those functions
21 print_test_banner
"$TEST_DESC"
22 function test_relayd
()
24 local relayd_bin_path
="$DIR/../src/bin/lttng-relayd/$RELAYD_BIN"
25 local working_dir
=$
(realpath
"$(mktemp -d -t "tmp.
${FUNCNAME[0]}_working_dir.XXXXXX
")")
30 diag
"Test lttng-relayd normal mode change working directory"
32 # There is no rendez-vous mechanism that can guarantee the good timing
33 # to check if the workdir directory was changed.
34 # In the case of lttng-sessiond this would be achieved using the
35 # --sig-parent option but lttng-relayd does not have this feature yet.
36 # Fall back on using polling of the value and unblock when the value is
37 # the one we expect. In case of a failure the test will hang.
38 $relayd_bin_path --working-directory "$working_dir" > /dev
/null
2>&1 &
42 cwd
=$
(readlink
"/proc/${pid}/cwd")
43 if test "$working_dir" = "$cwd"; then
44 # Working dir for process is valid
50 # If we are here the test passed
51 pass
"Working directory changed"
57 function test_relayd_daemon
()
61 local working_dir
=$
(realpath
"$(mktemp -d -t "tmp.
${FUNCNAME[0]}_working_dir.XXXXXX
")")
63 diag
"Test lttng-relayd daemon mode change working directory"
65 start_lttng_relayd_opt
1 "-d" "--working-directory $working_dir"
67 pid
=$
(lttng_pgrep
"$RELAYD_MATCH")
68 ok $?
"Found lttng-relayd"
70 cwd
=$
(readlink
"/proc/${pid}/cwd")
72 is
"$cwd" "$working_dir" "Working directory changed"
78 function test_relayd_daemon_no_working_dir
()
80 local expected_working_dir
="/"
84 diag
"Test lttng-relayd daemon mode change working directory"
86 start_lttng_relayd_opt
1 "-d" ""
88 pid
=$
(lttng_pgrep
"$RELAYD_MATCH")
89 ok $?
"Found lttng-relayd"
91 cwd
=$
(readlink
"/proc/${pid}/cwd")
93 is
"$cwd" "$expected_working_dir" "Working directory is $expected_working_dir"
99 function test_relayd_background
()
103 local working_dir
=$
(realpath
"$(mktemp -d -t "tmp.
${FUNCNAME[0]}_working_dir.XXXXXX
")")
105 diag
"Test lttng-relayd background mode change working directory"
107 start_lttng_relayd_opt
1 "-b" "--working-directory $working_dir"
109 pid
=$
(lttng_pgrep
"$RELAYD_MATCH")
110 ok $?
"Found lttng-relayd"
112 cwd
=$
(readlink
"/proc/${pid}/cwd")
114 is
"$cwd" "$working_dir" "Working directory changed"
117 rm -rf "$working_dir"
120 function test_relayd_background_no_working_dir
()
122 local expected_working_dir
="/"
126 diag
"Test lttng-relayd background working directory"
128 start_lttng_relayd_opt
1 "-b" ""
130 pid
=$
(lttng_pgrep
"$RELAYD_MATCH")
131 ok $?
"Found lttng-relayd"
133 cwd
=$
(readlink
"/proc/${pid}/cwd")
135 is
"$cwd" "$expected_working_dir" "Working directory is $expected_working_dir"
138 rm -rf "$working_dir"
141 function test_relayd_debug_permission
()
145 diag
"Test lttng-relayd change working directory on non writable directory"
147 if [ "$(id -u)" == "0" ]; then
153 skip
$is_user "Skipping permission debug output test; operation can't fail as root" 6 ||
155 local output_pattern
='Working directory \".*\" is not writable'
158 local working_dir
=$
(realpath
"$(mktemp -d -t "tmp.
${FUNCNAME[0]}_working_dir.XXXXXX
")")
160 # Removing write access to working dir
161 okx
chmod -w "$working_dir"
163 # Redirect the error output to a temporary file
165 ERROR_OUTPUT_DEST
=$
(mktemp
-t "tmp.${FUNCNAME[0]}_error_output.XXXXXX")
166 start_lttng_relayd_opt
1 "-b" "-v --working-dir $working_dir"
168 pid
=$
(lttng_pgrep
"$RELAYD_MATCH")
169 ok $?
"Found lttng-relayd"
171 cwd
=$
(readlink
"/proc/${pid}/cwd")
172 is
"$cwd" "$working_dir" "Working directory changed"
174 grep -q "$output_pattern" "$ERROR_OUTPUT_DEST"
175 ok $?
"Warning about missing write permission is present"
178 rm "$ERROR_OUTPUT_DEST"
179 rm -rf "$working_dir" "$ERROR_OUTPUT_DEST"
180 ERROR_OUTPUT_DEST
=/dev
/null
184 function test_relayd_failure
()
186 local output_pattern
='Failed to change working directory to'
187 local relayd_bin_path
="$DIR/../src/bin/lttng-relayd/$RELAYD_BIN"
188 local working_dir
=$
(realpath
"$(mktemp -d -t "tmp.
${FUNCNAME[0]}_working_dir.XXXXXX
")")
189 local output_dest
=$
(mktemp
-t "tmp.${FUNCNAME[0]}_working_dir.XXXXXX")
191 local working_dir_imaginary
194 working_dir_imaginary
="${working_dir}/imaginary_directory"
196 diag
"Test lttng-relayd normal mode change non-existing directory"
198 $relayd_bin_path -b --working-directory "$working_dir_imaginary" > "$output_dest" 2>&1
200 ok $?
"Expect failure to start lttng-relayd for non-existent working directory"
202 pid
=$
(lttng_pgrep
"$RELAYD_MATCH")
203 if [ -z "$pid" ]; then
204 pass
"No lttng-relayd present"
206 fail
"No lttng-relayd present"
207 stop_lttng_relayd_notap
210 grep -q "$output_pattern" "$output_dest"
211 ok $?
"Found error message: invalid directory"
214 rm -rf "$working_dir"
217 function test_relayd_env
()
221 local working_dir
=$
(realpath
"$(mktemp -d -t "tmp.
${FUNCNAME[0]}_working_dir.XXXXXX
")")
223 diag
"Test lttng-relayd change working directory from env. variable"
225 export LTTNG_RELAYD_WORKING_DIRECTORY
=${working_dir}
226 start_lttng_relayd_opt
1 "-b" ""
228 pid
=$
(lttng_pgrep
"$RELAYD_MATCH")
229 ok $?
"Found lttng-relayd"
231 cwd
=$
(readlink
"/proc/$pid/cwd")
233 is
"$cwd" "$working_dir" "Working directory changed"
236 rm -rf "$working_dir"
237 unset LTTNG_RELAYD_WORKING_DIRECTORY
240 function test_relayd_cmdline_overwrite_env
()
244 local working_dir_env
=$
(realpath
"$(mktemp -d -t "tmp.
${FUNCNAME[0]}_working_dir_even.XXXXXX
")")
245 local working_dir_cmdline
=$
(realpath
"$(mktemp -d -t "tmp.
${FUNCNAME[0]}_working_dir_cmdline.XXXXXX
")")
247 diag
"Test lttng-relayd change working directory command line overwrite env variable"
249 export LTTNG_RELAYD_WORKING_DIRECTORY
=${working_dir_env}
250 start_lttng_relayd_opt
1 "-b" "--working-dir ${working_dir_cmdline}"
252 pid
=$
(lttng_pgrep
"$RELAYD_MATCH")
253 ok $?
"Found lttng-relayd"
255 cwd
=$
(readlink
"/proc/$pid/cwd")
257 is
"$cwd" "$working_dir_cmdline" "Working directory is the one from command line"
260 rm -rf "$working_dir_env" "$working_dir_cmdline"
261 unset LTTNG_RELAYD_WORKING_DIRECTORY
267 test_relayd_daemon_no_working_dir
268 test_relayd_background
269 test_relayd_background_no_working_dir
270 test_relayd_debug_permission
273 test_relayd_cmdline_overwrite_env
276 for fct_test
in "${TESTS[@]}";
278 if ! ${fct_test}; then