--- /dev/null
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+# shellcheck disable=SC2016
+set -eux
+set -o pipefail
+
+COUNTER=0
+
+sync_in() {
+ read -r x < /tmp/syncfifo2
+ test "$x" = "$1"
+}
+
+wait_for_signal() {
+ sleep infinity &
+ wait "$!" || :
+}
+
+sighup_handler() {
+ echo "hup$(( ++COUNTER ))" > /tmp/syncfifo1
+}
+
+trap sighup_handler SIGHUP
+
+export SYSTEMD_LOG_LEVEL=debug
+
+systemd-notify --ready
+
+wait_for_signal
+systemd-notify --reloading
+
+wait_for_signal
+systemd-notify --reloading
+sync_in ready
+systemd-notify --ready
+
+wait_for_signal
+systemd-notify --reloading --ready
+
+exec sleep infinity
systemctl stop notify.service
assert_eq "$(systemctl show notify.service -p NotifyAccess --value)" "all"
+# Timeout of READY=1 for Type=notify-reload services (issue #37515)
+
+systemctl start reload-timeout.service
+
+systemctl reload --no-block reload-timeout.service
+timeout 10 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "reload-signal" ]]; do sleep .5; done'
+sync_in hup1
+timeout 10 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "reload-notify" ]]; do sleep .5; done'
+timeout 80 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "running" ]]; do sleep 5; done'
+assert_eq "$(systemctl show reload-timeout.service -P ReloadResult)" "timeout"
+
+systemctl reload --no-block reload-timeout.service
+timeout 10 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "reload-signal" ]]; do sleep .5; done'
+assert_eq "$(systemctl show reload-timeout.service -P ReloadResult)" "success"
+sync_in hup2
+timeout 10 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "reload-notify" ]]; do sleep .5; done'
+sync_out ready
+timeout 40 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "running" ]]; do sleep 1; done'
+assert_eq "$(systemctl show reload-timeout.service -P ReloadResult)" "success"
+
+systemctl reload --no-block reload-timeout.service
+sync_in hup3
+timeout 40 bash -c 'until [[ $(systemctl show reload-timeout.service -P SubState) == "running" ]]; do sleep 1; done'
+assert_eq "$(systemctl show reload-timeout.service -P ReloadResult)" "success"
+
+systemctl stop reload-timeout.service
+
rm /tmp/syncfifo1 /tmp/syncfifo2
# Explicitly test busctl's BUSERROR= reporting and systemctl status should show it