From e5040385f57e122c45bd911d4676a66230ff5db5 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sat, 22 Aug 2026 07:47:20 +0200 Subject: [PATCH] test: fix flaky crashing.sh Two races, both around the post:script Finit runs when it gives up on a service. Finit marks the service crashed before it forks post:script, so the file the test greps for lands a moment later. Waiting for the state is not enough. slay then takes the PID from initctl status, and service_post_script() sets svc->pid to the script's PID, so once Finit has given up the PID reported for the service is the post:script. Killing that takes out the script instead of the service and the file never arrives at all. The guard for this was already there, with a comment describing it, but inside the loop that waits for a PID to appear, so it only covered the case where there was none. A PID that was already there went straight to kill -9. Hence the gcc leg killing once more at lap 13, after Finit had stopped restarting, where clang stopped at 12. Signed-off-by: Joachim Wiberg --- test/crashing.sh | 5 ++--- test/skel/bin/slay | 10 ++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/test/crashing.sh b/test/crashing.sh index 1322e502..0084feb1 100755 --- a/test/crashing.sh +++ b/test/crashing.sh @@ -8,7 +8,7 @@ TEST_DIR=$(dirname "$0") test_teardown() { say "Running test teardown." - run "rm -f $FINIT_CONF" "/tmp/post" + run "rm -f $FINIT_CONF /tmp/post" } crashit() @@ -48,8 +48,7 @@ test_one() fi retry "assert_status $nm crashed" 500 - run "cat /tmp/post" - assert_file_contains "/tmp/post" "POST" + retry "assert_file_contains /tmp/post POST" 100 run "rm -f /tmp/post" } diff --git a/test/skel/bin/slay b/test/skel/bin/slay index 0bd7d025..91e2825a 100755 --- a/test/skel/bin/slay +++ b/test/skel/bin/slay @@ -58,5 +58,15 @@ done echo "$pid" > /tmp/oldpid +# The check above only runs while waiting for a PID to appear. Finit +# reports the post:script's PID as the service's once it has given up +# restarting, so a PID that was already there needs the same guard: +# killing it would take out the script instead of the service, and the +# side effects the test is waiting for never happen. +st=$(initctl -p status "$nm" 2>/dev/null | awk '/Status/{print $3}') +if [ "$st" = "crashed" ]; then + exit 1 +fi + #echo "PID $pid, kill -9 ..." kill -9 "$pid" 2>/dev/null || true