]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: add a couple of tests for systemd-run 27891/head
authorFrantisek Sumsal <frantisek@sumsal.cz>
Thu, 1 Jun 2023 06:47:51 +0000 (08:47 +0200)
committerFrantisek Sumsal <frantisek@sumsal.cz>
Thu, 1 Jun 2023 21:12:47 +0000 (23:12 +0200)
test/test-functions
test/units/testsuite-74.run.sh [new file with mode: 0755]

index 073777a0eb38ddc4ae004930967454fae1116c06..250217790833312dd35bca46617f8f556ff94aea 100644 (file)
@@ -2668,7 +2668,7 @@ inst_binary() {
     #     nsswitch.conf uses [SUCCESS=merge] (like on Arch Linux)
     # delv, dig - pull in nss_resolve if `resolve` is in nsswitch.conf
     # tar - called by machinectl in TEST-25
-    bin_rx='/(chown|delv|dig|getent|login|ls|mkfs\.[a-z0-9]+|mksquashfs|mkswap|setfacl|setpriv|stat|su|tar|useradd|userdel)$'
+    bin_rx='/(chown|delv|dig|getent|id|login|ls|mkfs\.[a-z0-9]+|mksquashfs|mkswap|setfacl|setpriv|stat|su|tar|useradd|userdel)$'
     if get_bool "$IS_BUILT_WITH_ASAN" && [[ "$bin" =~ $bin_rx ]]; then
         wrap_binary=1
     fi
diff --git a/test/units/testsuite-74.run.sh b/test/units/testsuite-74.run.sh
new file mode 100755 (executable)
index 0000000..33a8e1e
--- /dev/null
@@ -0,0 +1,200 @@
+#!/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
+
+# FIXME(?):
+#   - empty ExecStart= is always inserted
+#   - weird results with systemd-run --property=ExecStart=false true
+#   - group settings for each section?
+#       - i.e systemd-run --remain-after-exit --on-clock-change
+#         --timer-property=After=systemd-journald.service true
+#         generates a unit that has two [Unit] and two [Timer] sections
+
+systemd-run --help --no-pager
+systemd-run --version
+systemd-run --no-ask-password true
+
+export PARENT_FOO=bar
+touch /tmp/public-marker
+
+: "Transient service (system daemon)"
+systemd-run --wait --pipe \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /system\.slice/run-.+\.service$ ]]'
+systemd-run --wait --pipe --system \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /system\.slice/run-.+\.service$ ]]'
+systemd-run --wait --pipe --slice=foo \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /foo\.slice/run-.+\.service$ ]]'
+systemd-run --wait --pipe --slice=foo.slice \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /foo\.slice/run-.+\.service$ ]]'
+systemd-run --wait --pipe --slice-inherit \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /system\.slice/run-.+\.service$ ]]'
+systemd-run --wait --pipe --slice-inherit --slice=foo \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /system\.slice/system-foo\.slice/run-.+\.service$ ]]'
+# We should not inherit caller's environment
+systemd-run --wait --pipe bash -xec '[[ -z "$PARENT_FOO" ]]'
+systemd-run --wait --pipe bash -xec '[[ "$PWD" == / ]]'
+systemd-run --wait --pipe \
+            --working-directory="" \
+            --working-directory=/tmp \
+            bash -xec '[[ "$PWD" == /tmp ]]'
+systemd-run --wait --pipe --same-dir bash -xec "[[ \"\$PWD\" == $PWD ]]"
+systemd-run --wait --pipe \
+            --property=LimitCORE=1M:2M \
+            --property=LimitCORE=16M:32M \
+            --property=PrivateTmp=yes \
+            bash -xec '[[ "$(ulimit -c -S)" -eq 16384 && "$(ulimit -c -H)" -eq 32768 && ! -e /tmp/public-marker ]]'
+systemd-run --wait --pipe \
+            --uid=testuser \
+            bash -xec '[[ "$(id -nu)" == testuser && "$(id -ng)" == testuser ]]'
+systemd-run --wait --pipe \
+            --gid=testuser \
+            bash -xec '[[ "$(id -nu)" == root && "$(id -ng)" == testuser ]]'
+systemd-run --wait --pipe \
+            --uid=testuser \
+            --gid=root \
+            bash -xec '[[ "$(id -nu)" == testuser && "$(id -ng)" == root ]]'
+systemd-run --wait --pipe --expand-environment=no \
+            --nice=10 \
+            bash -xec 'read -r -a SELF_STAT </proc/self/stat && [[ "${SELF_STAT[18]}" -eq 10 ]]'
+systemd-run --wait --pipe \
+            --setenv=ENV_HELLO="nope" \
+            --setenv=ENV_HELLO="env world" \
+            --setenv=EMPTY= \
+            --setenv=PARENT_FOO \
+            --property=Environment="ALSO_HELLO='also world'" \
+            bash -xec '[[ "$ENV_HELLO" == "env world" && -z "$EMPTY" && "$PARENT_FOO" == bar && "$ALSO_HELLO" == "also world" ]]'
+
+UNIT="service-0-$RANDOM"
+systemd-run --remain-after-exit --unit="$UNIT" \
+            --service-type=simple \
+            --service-type=oneshot \
+            true
+systemctl cat "$UNIT"
+grep -q "^Type=oneshot" "/run/systemd/transient/$UNIT.service"
+systemctl stop "$UNIT"
+(! systemctl cat "$UNIT")
+
+: "Transient service (user daemon)"
+systemd-run --wait --pipe --user --machine=testuser@ \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /user\.slice/.+/run-.+\.service$ ]]'
+systemd-run --wait --pipe --user --machine=testuser@ \
+            bash -xec '[[ "$(id -nu)" == testuser && "$(id -ng)" == testuser ]]'
+
+: "Transient scope (system daemon)"
+systemd-run --scope \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /system\.slice/run-.+\.scope$ ]]'
+systemd-run --scope --system \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /system\.slice/run-.+\.scope$ ]]'
+systemd-run --scope --slice=foo \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /foo\.slice/run-.+\.scope$ ]]'
+systemd-run --scope --slice=foo.slice \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /foo\.slice/run-.+\.scope$ ]]'
+systemd-run --scope --slice-inherit \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /system\.slice/run-.+\.scope$ ]]'
+systemd-run --scope --slice-inherit --slice=foo \
+            bash -xec '[[ "$(</proc/self/cgroup)" =~ /system\.slice/system-foo\.slice/run-.+\.scope$ ]]'
+# We should inherit caller's environment
+systemd-run --scope bash -xec '[[ "$PARENT_FOO" == bar ]]'
+
+: "Transient scope (user daemon)"
+# FIXME: https://github.com/systemd/systemd/issues/27883
+#systemd-run --scope --user --machine=testuser@ \
+#            bash -xec '[[ "$(</proc/self/cgroup)" =~ /user\.slice/run-.+\.scope$ ]]'
+# We should inherit caller's environment
+#systemd-run --scope --user --machine=testuser@ bash -xec '[[ "$PARENT_FOO" == bar ]]'
+
+: "Transient timer unit"
+UNIT="timer-0-$RANDOM"
+systemd-run --remain-after-exit \
+            --unit="$UNIT" \
+            --timer-property=OnUnitInactiveSec=16h \
+            true
+systemctl cat "$UNIT.service" "$UNIT.timer"
+grep -q "^OnUnitInactiveSec=16h$" "/run/systemd/transient/$UNIT.timer"
+grep -qE "^ExecStart=.*/bin/true.*$" "/run/systemd/transient/$UNIT.service"
+systemctl stop "$UNIT.timer" "$UNIT.service" || :
+
+UNIT="timer-1-$RANDOM"
+systemd-run --remain-after-exit \
+            --unit="$UNIT" \
+            --on-active=10 \
+            --on-active=30s \
+            --on-boot=1s \
+            --on-startup=2m \
+            --on-unit-active=3h20m \
+            --on-unit-inactive="5d 4m 32s" \
+            --on-calendar="mon,fri *-1/2-1,3 *:30:45" \
+            --on-clock-change \
+            --on-clock-change \
+            --on-timezone-change \
+            --timer-property=After=systemd-journald.service \
+            --description="Hello world" \
+            --description="My Fancy Timer" \
+            true
+systemctl cat "$UNIT.service" "$UNIT.timer"
+systemd-analyze verify --recursive-errors=no "/run/systemd/transient/$UNIT.service"
+systemd-analyze verify --recursive-errors=no "/run/systemd/transient/$UNIT.timer"
+grep -q "^Description=My Fancy Timer$" "/run/systemd/transient/$UNIT.timer"
+grep -q "^OnActiveSec=10s$" "/run/systemd/transient/$UNIT.timer"
+grep -q "^OnActiveSec=30s$" "/run/systemd/transient/$UNIT.timer"
+grep -q "^OnBootSec=1s$" "/run/systemd/transient/$UNIT.timer"
+grep -q "^OnStartupSec=2min$" "/run/systemd/transient/$UNIT.timer"
+grep -q "^OnUnitActiveSec=3h 20min$" "/run/systemd/transient/$UNIT.timer"
+grep -q "^OnUnitInactiveSec=5d 4min 32s$" "/run/systemd/transient/$UNIT.timer"
+grep -q "^OnCalendar=mon,fri \*\-1/2\-1,3 \*:30:45$" "/run/systemd/transient/$UNIT.timer"
+grep -q "^OnClockChange=yes$" "/run/systemd/transient/$UNIT.timer"
+grep -q "^OnTimezoneChange=yes$" "/run/systemd/transient/$UNIT.timer"
+grep -q "^After=systemd-journald.service$" "/run/systemd/transient/$UNIT.timer"
+grep -q "^Description=My Fancy Timer$" "/run/systemd/transient/$UNIT.service"
+grep -q "^RemainAfterExit=yes$" "/run/systemd/transient/$UNIT.service"
+grep -qE "^ExecStart=.*/bin/true.*$" "/run/systemd/transient/$UNIT.service"
+(! grep -q "^After=systemd-journald.service$" "/run/systemd/transient/$UNIT.service")
+systemctl stop "$UNIT.timer" "$UNIT.service" || :
+
+: "Transient path unit"
+UNIT="path-0-$RANDOM"
+systemd-run --remain-after-exit \
+            --unit="$UNIT" \
+            --path-property=PathExists=/tmp \
+            --path-property=PathExists=/tmp/foo \
+            --path-property=PathChanged=/root/bar \
+            true
+systemctl cat "$UNIT.service" "$UNIT.path"
+systemd-analyze verify --recursive-errors=no "/run/systemd/transient/$UNIT.service"
+systemd-analyze verify --recursive-errors=no "/run/systemd/transient/$UNIT.path"
+grep -q "^PathExists=/tmp$" "/run/systemd/transient/$UNIT.path"
+grep -q "^PathExists=/tmp/foo$" "/run/systemd/transient/$UNIT.path"
+grep -q "^PathChanged=/root/bar$" "/run/systemd/transient/$UNIT.path"
+grep -qE "^ExecStart=.*/bin/true.*$" "/run/systemd/transient/$UNIT.service"
+systemctl stop "$UNIT.path" "$UNIT.service" || :
+
+: "Transient socket unit"
+UNIT="socket-0-$RANDOM"
+systemd-run --remain-after-exit \
+            --unit="$UNIT" \
+            --socket-property=ListenFIFO=/tmp/socket.fifo \
+            --socket-property=SocketMode=0666 \
+            --socket-property=SocketMode=0644 \
+            true
+systemctl cat "$UNIT.service" "$UNIT.socket"
+systemd-analyze verify --recursive-errors=no "/run/systemd/transient/$UNIT.service"
+systemd-analyze verify --recursive-errors=no "/run/systemd/transient/$UNIT.socket"
+grep -q "^ListenFIFO=/tmp/socket.fifo$" "/run/systemd/transient/$UNIT.socket"
+grep -q "^SocketMode=0666$" "/run/systemd/transient/$UNIT.socket"
+grep -q "^SocketMode=0644$" "/run/systemd/transient/$UNIT.socket"
+grep -qE "^ExecStart=.*/bin/true.*$" "/run/systemd/transient/$UNIT.service"
+systemctl stop "$UNIT.socket" "$UNIT.service" || :
+
+(! systemd-run)
+(! systemd-run "")
+(! systemd-run --wait --pipe --slice=foo.service true)
+
+for opt in nice on-{active,boot,calendar,startup,unit-active,unit-inactive} property service-type setenv; do
+    (! systemd-run "--$opt=" true)
+    (! systemd-run "--$opt=''" true)
+done