mirror of
https://github.com/systemd/systemd.git
synced 2025-01-10 05:18:17 +03:00
0651e71749
Provides coverage for systemd/systemd#26872. With systemd/systemd#26875 reverted: [16444.287652] testsuite-03.sh[71]: + for i in {0..19} [16444.287652] testsuite-03.sh[71]: + systemctl start transaction-cycle0.service [16444.359503] systemd[1]: ================================================================= [16444.360321] systemd[1]: ==1==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6180002e578e at pc 0x7f73b25ec7a6 bp 0x7ffc5531c6f0 sp 0x7ffc5531be68 [16444.360798] systemd[1]: [16444.361044] systemd[1]: READ of size 783 at 0x6180002e578e thread T0 (systemd) [16444.391684] systemd[1]: #0 0x7f73b25ec7a5 (/lib64/libasan.so.5+0x557a5) [16444.392167] systemd[1]: #1 0x7f73b260a1d5 in __interceptor_vasprintf (/lib64/libasan.so.5+0x731d5) [16444.392442] systemd[1]: #2 0x7f73afa1d1e1 in log_format_iovec ../src/basic/log.c:996 [16444.392750] systemd[1]: #3 0x7f73afa1e7b6 in log_struct_internal ../src/basic/log.c:1058 [16444.393101] systemd[1]: #4 0x7f73b1979136 in transaction_verify_order_one ../src/core/transaction.c:392 [16444.393540] systemd[1]: #5 0x7f73b197ac82 in transaction_verify_order_one ../src/core/transaction.c:463 [16444.393946] systemd[1]: #6 0x7f73b197ac82 in transaction_verify_order_one ../src/core/transaction.c:463 [16444.394262] systemd[1]: #7 0x7f73b197ac82 in transaction_verify_order_one ../src/core/transaction.c:463 [16444.394532] systemd[1]: #8 0x7f73b197ac82 in transaction_verify_order_one ../src/core/transaction.c:463 [16444.394812] systemd[1]: #9 0x7f73b197ac82 in transaction_verify_order_one ../src/core/transaction.c:463 ...
131 lines
4.1 KiB
Bash
Executable File
131 lines
4.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
set -eux
|
|
set -o pipefail
|
|
|
|
# Simple test for that daemon-reexec works in container.
|
|
# See: https://github.com/systemd/systemd/pull/23883
|
|
systemctl daemon-reexec
|
|
|
|
# Test merging of a --job-mode=ignore-dependencies job into a previously
|
|
# installed job.
|
|
|
|
systemctl start --no-block hello-after-sleep.target
|
|
|
|
systemctl list-jobs >/root/list-jobs.txt
|
|
while ! grep 'sleep\.service.*running' /root/list-jobs.txt; do
|
|
systemctl list-jobs >/root/list-jobs.txt
|
|
done
|
|
|
|
grep 'hello\.service.*waiting' /root/list-jobs.txt
|
|
|
|
# This is supposed to finish quickly, not wait for sleep to finish.
|
|
START_SEC=$(date -u '+%s')
|
|
systemctl start --job-mode=ignore-dependencies hello
|
|
END_SEC=$(date -u '+%s')
|
|
ELAPSED=$((END_SEC-START_SEC))
|
|
|
|
test "$ELAPSED" -lt 3
|
|
|
|
# sleep should still be running, hello not.
|
|
systemctl list-jobs >/root/list-jobs.txt
|
|
grep 'sleep\.service.*running' /root/list-jobs.txt
|
|
grep 'hello\.service' /root/list-jobs.txt && exit 1
|
|
systemctl stop sleep.service hello-after-sleep.target
|
|
|
|
# Some basic testing that --show-transaction does something useful
|
|
(! systemctl is-active systemd-importd)
|
|
systemctl -T start systemd-importd
|
|
systemctl is-active systemd-importd
|
|
systemctl --show-transaction stop systemd-importd
|
|
(! systemctl is-active systemd-importd)
|
|
|
|
# Test for a crash when enqueuing a JOB_NOP when other job already exists
|
|
systemctl start --no-block hello-after-sleep.target
|
|
# hello.service should still be waiting, so these try-restarts will collapse
|
|
# into NOPs.
|
|
systemctl try-restart --job-mode=fail hello.service
|
|
systemctl try-restart hello.service
|
|
systemctl stop hello.service sleep.service hello-after-sleep.target
|
|
|
|
# TODO: add more job queueing/merging tests here.
|
|
|
|
# Test that restart propagates to activating units
|
|
systemctl -T --no-block start always-activating.service
|
|
systemctl list-jobs | grep 'always-activating.service'
|
|
ACTIVATING_ID_PRE=$(systemctl show -P InvocationID always-activating.service)
|
|
systemctl -T start always-activating.socket # Wait for the socket to come up
|
|
systemctl -T restart always-activating.socket
|
|
ACTIVATING_ID_POST=$(systemctl show -P InvocationID always-activating.service)
|
|
[ "$ACTIVATING_ID_PRE" != "$ACTIVATING_ID_POST" ] || exit 1
|
|
|
|
# Test for irreversible jobs
|
|
systemctl start unstoppable.service
|
|
|
|
# This is expected to fail with 'job cancelled'
|
|
systemctl stop unstoppable.service && exit 1
|
|
# But this should succeed
|
|
systemctl stop --job-mode=replace-irreversibly unstoppable.service
|
|
|
|
# We're going to shutdown soon. Let's see if it succeeds when
|
|
# there's an active service that tries to be unstoppable.
|
|
# Shutdown of the container/VM will hang if not.
|
|
systemctl start unstoppable.service
|
|
|
|
# Test waiting for a started units to terminate again
|
|
cat <<EOF >/run/systemd/system/wait2.service
|
|
[Unit]
|
|
Description=Wait for 2 seconds
|
|
[Service]
|
|
ExecStart=/bin/sh -ec 'sleep 2'
|
|
EOF
|
|
cat <<EOF >/run/systemd/system/wait5fail.service
|
|
[Unit]
|
|
Description=Wait for 5 seconds and fail
|
|
[Service]
|
|
ExecStart=/bin/sh -ec 'sleep 5; false'
|
|
EOF
|
|
|
|
# wait2 succeeds
|
|
START_SEC=$(date -u '+%s')
|
|
systemctl start --wait wait2.service
|
|
END_SEC=$(date -u '+%s')
|
|
ELAPSED=$((END_SEC-START_SEC))
|
|
[[ "$ELAPSED" -ge 2 ]] && [[ "$ELAPSED" -le 4 ]] || exit 1
|
|
|
|
# wait5fail fails, so systemctl should fail
|
|
START_SEC=$(date -u '+%s')
|
|
(! systemctl start --wait wait2.service wait5fail.service)
|
|
END_SEC=$(date -u '+%s')
|
|
ELAPSED=$((END_SEC-START_SEC))
|
|
[[ "$ELAPSED" -ge 5 ]] && [[ "$ELAPSED" -le 7 ]] || exit 1
|
|
|
|
# Test time-limited scopes
|
|
START_SEC=$(date -u '+%s')
|
|
set +e
|
|
systemd-run --scope --property=RuntimeMaxSec=3s sleep 10
|
|
RESULT=$?
|
|
END_SEC=$(date -u '+%s')
|
|
ELAPSED=$((END_SEC-START_SEC))
|
|
[[ "$ELAPSED" -ge 3 ]] && [[ "$ELAPSED" -le 5 ]] || exit 1
|
|
[[ "$RESULT" -ne 0 ]] || exit 1
|
|
|
|
# Test transactions with cycles
|
|
# Provides coverage for issues like https://github.com/systemd/systemd/issues/26872
|
|
for i in {0..19}; do
|
|
cat >"/run/systemd/system/transaction-cycle$i.service" <<EOF
|
|
[Unit]
|
|
After=transaction-cycle$(((i + 1) % 20)).service
|
|
Requires=transaction-cycle$(((i + 1) % 20)).service
|
|
|
|
[Service]
|
|
ExecStart=true
|
|
EOF
|
|
done
|
|
systemctl daemon-reload
|
|
for i in {0..19}; do
|
|
systemctl start "transaction-cycle$i.service"
|
|
done
|
|
|
|
touch /testok
|