mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-03-12 08:58:20 +03:00
TEST-80: synchronize explicitly instead of by time
This removes "sleep" invocations, and makes the notify access testcase a lot more robust to runtime jitter. We use a pair of fifos in the fs to sync instead. Also various other improvoements, including comments. (Also removes the unnecessary "no-qemu" restriction)
This commit is contained in:
parent
49e8342965
commit
09ba6d1a14
@ -3,7 +3,6 @@
|
||||
set -e
|
||||
|
||||
TEST_DESCRIPTION="test NotifyAccess through sd-notify"
|
||||
TEST_NO_QEMU=1
|
||||
|
||||
# shellcheck source=test/test-functions
|
||||
. "${TEST_BASE_DIR:?}/test-functions"
|
||||
|
@ -4,23 +4,60 @@
|
||||
set -eux
|
||||
set -o pipefail
|
||||
|
||||
systemd-notify --status="Test starts, waiting for 5 seconds"
|
||||
sleep 5
|
||||
sync_in() {
|
||||
read -r x < /tmp/syncfifo2
|
||||
test "$x" = "$1"
|
||||
}
|
||||
|
||||
sync_out() {
|
||||
echo "$1" > /tmp/syncfifo1
|
||||
}
|
||||
|
||||
export SYSTEMD_LOG_LEVEL=debug
|
||||
|
||||
echo "toplevel PID: $BASHPID"
|
||||
|
||||
systemd-notify --status="Test starts"
|
||||
sync_out a
|
||||
sync_in b
|
||||
(
|
||||
systemd-notify --pid=auto
|
||||
echo "subshell PID: $BASHPID"
|
||||
|
||||
# Make us main process
|
||||
systemd-notify --pid="$BASHPID"
|
||||
|
||||
# Lock down access to just us
|
||||
systemd-notify "NOTIFYACCESS=main"
|
||||
|
||||
systemd-notify --status="Sending READY=1 in an unpriviledged process"
|
||||
(
|
||||
sleep 0.1
|
||||
systemd-notify --ready
|
||||
)
|
||||
sleep 10
|
||||
# This should still work
|
||||
systemd-notify --status="Sending READY=1 in an unprivileged process"
|
||||
|
||||
systemd-notify "MAINPID=$$"
|
||||
# Send as subprocess of the subshell, this should not work
|
||||
systemd-notify --ready --pid=self --status "BOGUS1"
|
||||
|
||||
sync_out c
|
||||
sync_in d
|
||||
|
||||
# Move main process back to toplevel
|
||||
systemd-notify --pid=parent "MAINPID=$$"
|
||||
|
||||
# Should be dropped again
|
||||
systemd-notify --status="BOGUS2" --pid=parent
|
||||
|
||||
# Apparently, bash will automatically invoke the last command in a subshell
|
||||
# via a simple execve() rather than fork()ing first. But we want that the
|
||||
# previous command uses the subshell's PID, hence let's insert a final,
|
||||
# bogus redundant command as last command to run in the subshell, so that
|
||||
# bash can't optimize things like that.
|
||||
echo "bye"
|
||||
)
|
||||
|
||||
echo "toplevel again: $BASHPID"
|
||||
|
||||
systemd-notify --ready --status="OK"
|
||||
systemd-notify "NOTIFYACCESS=none"
|
||||
sleep infinity
|
||||
systemd-notify --status="BOGUS3"
|
||||
|
||||
sync_out e
|
||||
|
||||
exec sleep infinity
|
||||
|
@ -9,17 +9,35 @@ set -o pipefail
|
||||
|
||||
: >/failed
|
||||
|
||||
systemctl --no-block start notify.service
|
||||
sleep 2
|
||||
mkfifo /tmp/syncfifo1 /tmp/syncfifo2
|
||||
|
||||
sync_in() {
|
||||
read -r x < /tmp/syncfifo1
|
||||
test "$x" = "$1"
|
||||
}
|
||||
|
||||
sync_out() {
|
||||
echo "$1" > /tmp/syncfifo2
|
||||
}
|
||||
|
||||
export SYSTEMD_LOG_LEVEL=debug
|
||||
|
||||
systemctl --no-block start notify.service
|
||||
|
||||
sync_in a
|
||||
|
||||
assert_eq "$(systemctl show notify.service -p StatusText --value)" "Test starts, waiting for 5 seconds"
|
||||
assert_eq "$(systemctl show notify.service -p NotifyAccess --value)" "all"
|
||||
sleep 5
|
||||
assert_eq "$(systemctl show notify.service -p StatusText --value)" "Test starts"
|
||||
|
||||
sync_out b
|
||||
sync_in c
|
||||
|
||||
assert_eq "$(systemctl show notify.service -p NotifyAccess --value)" "main"
|
||||
assert_eq "$(systemctl show notify.service -p StatusText --value)" "Sending READY=1 in an unpriviledged process"
|
||||
assert_eq "$(systemctl show notify.service -p StatusText --value)" "Sending READY=1 in an unprivileged process"
|
||||
assert_rc 3 systemctl --quiet is-active notify.service
|
||||
sleep 10
|
||||
|
||||
sync_out d
|
||||
sync_in e
|
||||
|
||||
systemctl --quiet is-active notify.service
|
||||
assert_eq "$(systemctl show notify.service -p StatusText --value)" "OK"
|
||||
@ -28,5 +46,7 @@ assert_eq "$(systemctl show notify.service -p NotifyAccess --value)" "none"
|
||||
systemctl stop notify.service
|
||||
assert_eq "$(systemctl show notify.service -p NotifyAccess --value)" "all"
|
||||
|
||||
rm /tmp/syncfifo1 /tmp/syncfifo2
|
||||
|
||||
touch /testok
|
||||
rm /failed
|
||||
|
Loading…
x
Reference in New Issue
Block a user