1
0
mirror of https://github.com/systemd/systemd.git synced 2025-06-03 21:07:38 +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:
Lennart Poettering 2023-03-28 16:35:35 +02:00 committed by Yu Watanabe
parent 49e8342965
commit 09ba6d1a14
3 changed files with 74 additions and 18 deletions

View File

@ -3,7 +3,6 @@
set -e set -e
TEST_DESCRIPTION="test NotifyAccess through sd-notify" TEST_DESCRIPTION="test NotifyAccess through sd-notify"
TEST_NO_QEMU=1
# shellcheck source=test/test-functions # shellcheck source=test/test-functions
. "${TEST_BASE_DIR:?}/test-functions" . "${TEST_BASE_DIR:?}/test-functions"

View File

@ -4,23 +4,60 @@
set -eux set -eux
set -o pipefail set -o pipefail
systemd-notify --status="Test starts, waiting for 5 seconds" sync_in() {
sleep 5 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 "NOTIFYACCESS=main"
systemd-notify --status="Sending READY=1 in an unpriviledged process" # This should still work
( systemd-notify --status="Sending READY=1 in an unprivileged process"
sleep 0.1
systemd-notify --ready
)
sleep 10
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 --ready --status="OK"
systemd-notify "NOTIFYACCESS=none" systemd-notify "NOTIFYACCESS=none"
sleep infinity systemd-notify --status="BOGUS3"
sync_out e
exec sleep infinity

View File

@ -9,17 +9,35 @@ set -o pipefail
: >/failed : >/failed
systemctl --no-block start notify.service mkfifo /tmp/syncfifo1 /tmp/syncfifo2
sleep 2
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" 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 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 assert_rc 3 systemctl --quiet is-active notify.service
sleep 10
sync_out d
sync_in e
systemctl --quiet is-active notify.service systemctl --quiet is-active notify.service
assert_eq "$(systemctl show notify.service -p StatusText --value)" "OK" 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 systemctl stop notify.service
assert_eq "$(systemctl show notify.service -p NotifyAccess --value)" "all" assert_eq "$(systemctl show notify.service -p NotifyAccess --value)" "all"
rm /tmp/syncfifo1 /tmp/syncfifo2
touch /testok touch /testok
rm /failed rm /failed