]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
test: fix race in TEST-07-PID1.socket-on-failure.sh
authorLuca Boccassi <luca.boccassi@gmail.com>
Tue, 19 May 2026 21:00:58 +0000 (22:00 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Tue, 19 May 2026 21:53:59 +0000 (22:53 +0100)
The test waited for the OnFailure= service's filesystem side effect
(`rmdir` of the directory) and then immediately invoked
`systemctl is-active`. Between `rmdir(2)` returning (which causes the
shell loop to exit) and PID1 reaping the child and transitioning the
oneshot service from `activating` to `active`, there is a small window
where `is-active` can observe `activating` and fail the test.

Wait directly on the unit state instead, matching the pattern used a
few lines above for the `is-failed` case.

  [ 1880.326704] TEST-07-PID1.sh[21489]: + timeout --foreground 60 bash -c 'while [[ -d '\''/tmp/TEST-07-PID1-socket-8467/test'\'' ]]; do sleep .5; done'
  [ 1880.330482] TEST-07-PID1.sh[21489]: + [[ ! -e /tmp/TEST-07-PID1-socket-8467/test ]]
  [ 1880.330482] TEST-07-PID1.sh[21489]: + systemctl is-active TEST-07-PID1-socket-OnFailure.service
  [ 1880.347470] TEST-07-PID1.sh[21520]: activating
  [ 1880.349508] TEST-07-PID1.sh[21489]: + at_exit
  [ 1880.349508] TEST-07-PID1.sh[21489]: + systemctl stop TEST-07-PID1-socket-8467.socket
  [ 1880.367331] TEST-07-PID1.sh[107]: Subtest /usr/lib/systemd/tests/testdata/units/TEST-07-PID1.socket-on-failure.sh failed
  [ 1880.367331] TEST-07-PID1.sh[107]: + return 1

Co-developed-by: Claude Opus 4.7 <noreply@anthropic.com>
test/units/TEST-07-PID1.socket-on-failure.sh

index 44b8a43634faa09955fbc8b42e88d10cc3e2246f..ff947b10e2675904947061f58b6c133d6861e84e 100755 (executable)
@@ -65,9 +65,8 @@ mkdir "/tmp/$UNIT_NAME/test"
 systemctl is-failed "$UNIT_NAME.socket"
 assert_eq "$(systemctl show "$UNIT_NAME.socket" -P SubState)" "failed"
 
-timeout --foreground 60 bash -c "while [[ -d '/tmp/$UNIT_NAME/test' ]]; do sleep .5; done"
+timeout --foreground 60 bash -c "until systemctl is-active TEST-07-PID1-socket-OnFailure.service; do sleep .5; done"
 [[ ! -e "/tmp/$UNIT_NAME/test" ]]
-systemctl is-active TEST-07-PID1-socket-OnFailure.service
 
 systemctl start "$UNIT_NAME.socket"
 systemctl is-active "$UNIT_NAME.socket"