mirror of
https://github.com/systemd/systemd.git
synced 2024-12-22 17:35:35 +03:00
cb153b4fe9
So we can extend it with additional utility functions without making it confusing. No functional change.
132 lines
4.5 KiB
Bash
Executable File
132 lines
4.5 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
# shellcheck disable=SC2016
|
|
set -eux
|
|
set -o pipefail
|
|
|
|
# shellcheck source=test/units/util.sh
|
|
. "$(dirname "$0")"/util.sh
|
|
|
|
: >/failed
|
|
|
|
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 NotifyAccess --value)" "all"
|
|
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 unprivileged process"
|
|
assert_rc 3 systemctl --quiet is-active notify.service
|
|
|
|
sync_out d
|
|
sync_in e
|
|
|
|
systemctl --quiet is-active notify.service
|
|
assert_eq "$(systemctl show notify.service -p StatusText --value)" "OK"
|
|
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
|
|
|
|
# Now test basic fdstore behaviour
|
|
|
|
MYSCRIPT="/tmp/myscript$RANDOM.sh"
|
|
cat >> "$MYSCRIPT" <<'EOF'
|
|
#!/usr/bin/env bash
|
|
set -eux
|
|
set -o pipefail
|
|
test "$FDSTORE" -eq 7
|
|
N="/tmp/$RANDOM"
|
|
echo $RANDOM > "$N"
|
|
systemd-notify --fd=4 --fdname=quux --pid=parent 4< "$N"
|
|
rm "$N"
|
|
systemd-notify --ready
|
|
exec sleep infinity
|
|
EOF
|
|
|
|
chmod +x "$MYSCRIPT"
|
|
|
|
MYUNIT="myunit$RANDOM.service"
|
|
systemd-run -u "$MYUNIT" -p Type=notify -p StandardOutput=journal+console -p StandardError=journal+console -p FileDescriptorStoreMax=7 "$MYSCRIPT"
|
|
|
|
test "$(systemd-analyze fdstore "$MYUNIT" | wc -l)" -eq 2
|
|
systemd-analyze fdstore "$MYUNIT" --json=short
|
|
systemd-analyze fdstore "$MYUNIT" --json=short | grep -P -q '\[{"fdname":"quux","type":.*,"devno":\[.*\],"inode":.*,"rdevno":null,"path":"/tmp/.*","flags":"ro"}\]'
|
|
|
|
systemctl stop "$MYUNIT"
|
|
rm "$MYSCRIPT"
|
|
|
|
systemd-analyze log-level debug
|
|
|
|
# Test fdstore pinning (this will pull in fdstore-pin.service fdstore-nopin.service)
|
|
systemctl start fdstore-pin.target
|
|
|
|
assert_eq "$(systemctl show fdstore-pin.service -P FileDescriptorStorePreserve)" yes
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P FileDescriptorStorePreserve)" restart
|
|
assert_eq "$(systemctl show fdstore-pin.service -P SubState)" running
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P SubState)" running
|
|
assert_eq "$(systemctl show fdstore-pin.service -P NFileDescriptorStore)" 1
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P NFileDescriptorStore)" 1
|
|
|
|
# The file descriptor store should survive service restarts
|
|
systemctl restart fdstore-pin.service fdstore-nopin.service
|
|
|
|
assert_eq "$(systemctl show fdstore-pin.service -P NFileDescriptorStore)" 1
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P NFileDescriptorStore)" 1
|
|
assert_eq "$(systemctl show fdstore-pin.service -P SubState)" running
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P SubState)" running
|
|
|
|
# It should not survive the service stop plus a later start (unless pinned)
|
|
systemctl stop fdstore-pin.service fdstore-nopin.service
|
|
|
|
assert_eq "$(systemctl show fdstore-pin.service -P NFileDescriptorStore)" 1
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P NFileDescriptorStore)" 0
|
|
assert_eq "$(systemctl show fdstore-pin.service -P SubState)" dead-resources-pinned
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P SubState)" dead
|
|
|
|
systemctl start fdstore-pin.service fdstore-nopin.service
|
|
|
|
assert_eq "$(systemctl show fdstore-pin.service -P NFileDescriptorStore)" 1
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P NFileDescriptorStore)" 0
|
|
assert_eq "$(systemctl show fdstore-pin.service -P SubState)" running
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P SubState)" running
|
|
|
|
systemctl stop fdstore-pin.service fdstore-nopin.service
|
|
|
|
assert_eq "$(systemctl show fdstore-pin.service -P NFileDescriptorStore)" 1
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P NFileDescriptorStore)" 0
|
|
assert_eq "$(systemctl show fdstore-pin.service -P SubState)" dead-resources-pinned
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P SubState)" dead
|
|
|
|
systemctl clean fdstore-pin.service --what=fdstore
|
|
|
|
assert_eq "$(systemctl show fdstore-pin.service -P NFileDescriptorStore)" 0
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P NFileDescriptorStore)" 0
|
|
assert_eq "$(systemctl show fdstore-pin.service -P SubState)" dead
|
|
assert_eq "$(systemctl show fdstore-nopin.service -P SubState)" dead
|
|
|
|
touch /testok
|
|
rm /failed
|
|
|
|
exit 0
|