Clean up daemon handling

Split `common.sh` into the vars and functions definitions vs starting
the daemon (and possibly other initialization logic). This way,
`init.sh` can just `source` the former. Trying to start the daemon
before `nix.conf` is written will fail because `nix daemon` requires
`--experimental-features 'nix-command'`.

`killDaemon` is idempotent, so it's safe to call when no daemon is
running.

`startDaemon` and `killDaemon` use the PID (which is now exported to
subshells) to decide whether there is work to be done, rather than
`NIX_REMOTE`, which might conceivably be set differently even if a
daemon is running.

`startDaemon` and `killDaemon` can save/restore the old `NIX_REMOTE` as
`NIX_REMOTE_OLD`.

`init.sh` kills daemon before deleting everything (including the daemon
socket).
This commit is contained in:
John Ericson 2021-12-09 15:16:18 +00:00
parent 5dbbf23332
commit 87da941348
6 changed files with 44 additions and 27 deletions

2
.gitignore vendored
View file

@ -75,7 +75,7 @@ perl/Makefile.config
# /tests/ # /tests/
/tests/test-tmp /tests/test-tmp
/tests/common.sh /tests/common/vars-and-functions.sh
/tests/result* /tests/result*
/tests/restricted-innocent /tests/restricted-innocent
/tests/shell /tests/shell

12
tests/common.sh Normal file
View file

@ -0,0 +1,12 @@
set -e
if [[ -z "${COMMON_SH_SOURCED-}" ]]; then
COMMON_SH_SOURCED=1
source "$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")/common/vars-and-functions.sh"
if [[ -n "${NIX_DAEMON_PACKAGE:-}" ]]; then
startDaemon
fi
fi # COMMON_SH_SOURCED

View file

@ -1,8 +1,8 @@
set -e set -e
if [[ -z "$COMMON_SH_SOURCED" ]]; then if [[ -z "${COMMON_VARS_AND_FUNCTIONS_SH_SOURCED-}" ]]; then
COMMON_SH_SOURCED=1 COMMON_VARS_AND_FUNCTIONS_SH_SOURCED=1
export PS4='+(${BASH_SOURCE[0]}:$LINENO) ' export PS4='+(${BASH_SOURCE[0]}:$LINENO) '
@ -25,7 +25,7 @@ if [[ -n $NIX_STORE ]]; then
fi fi
export _NIX_IN_TEST=$TEST_ROOT/shared export _NIX_IN_TEST=$TEST_ROOT/shared
export _NIX_TEST_NO_LSOF=1 export _NIX_TEST_NO_LSOF=1
export NIX_REMOTE=$NIX_REMOTE_ export NIX_REMOTE=${NIX_REMOTE_-}
unset NIX_PATH unset NIX_PATH
export TEST_HOME=$TEST_ROOT/test-home export TEST_HOME=$TEST_ROOT/test-home
export HOME=$TEST_HOME export HOME=$TEST_HOME
@ -90,13 +90,14 @@ clearCacheCache() {
startDaemon() { startDaemon() {
# Dont start the daemon twice, as this would just make it loop indefinitely # Dont start the daemon twice, as this would just make it loop indefinitely
if [[ "$NIX_REMOTE" == daemon ]]; then if [[ "${_NIX_TEST_DAEMON_PID-}" != '' ]]; then
return return
fi fi
# Start the daemon, wait for the socket to appear. # Start the daemon, wait for the socket to appear.
rm -f $NIX_DAEMON_SOCKET_PATH rm -f $NIX_DAEMON_SOCKET_PATH
PATH=$DAEMON_PATH nix-daemon& PATH=$DAEMON_PATH nix-daemon &
pidDaemon=$! _NIX_TEST_DAEMON_PID=$!
export _NIX_TEST_DAEMON_PID
for ((i = 0; i < 300; i++)); do for ((i = 0; i < 300; i++)); do
if [[ -S $NIX_DAEMON_SOCKET_PATH ]]; then if [[ -S $NIX_DAEMON_SOCKET_PATH ]]; then
DAEMON_STARTED=1 DAEMON_STARTED=1
@ -108,25 +109,35 @@ startDaemon() {
fail "Didnt manage to start the daemon" fail "Didnt manage to start the daemon"
fi fi
trap "killDaemon" EXIT trap "killDaemon" EXIT
# Save for if daemon is killed
NIX_REMOTE_OLD=$NIX_REMOTE
export NIX_REMOTE=daemon export NIX_REMOTE=daemon
} }
killDaemon() { killDaemon() {
kill $pidDaemon # Dont fail trying to stop a non-existant daemon twice
if [[ "${_NIX_TEST_DAEMON_PID-}" == '' ]]; then
return
fi
kill $_NIX_TEST_DAEMON_PID
for i in {0..100}; do for i in {0..100}; do
kill -0 $pidDaemon 2> /dev/null || break kill -0 $_NIX_TEST_DAEMON_PID 2> /dev/null || break
sleep 0.1 sleep 0.1
done done
kill -9 $pidDaemon 2> /dev/null || true kill -9 $_NIX_TEST_DAEMON_PID 2> /dev/null || true
wait $pidDaemon || true wait $_NIX_TEST_DAEMON_PID || true
rm -f $NIX_DAEMON_SOCKET_PATH
# Indicate daemon is stopped
unset _NIX_TEST_DAEMON_PID
# Restore old nix remote
NIX_REMOTE=$NIX_REMOTE_OLD
trap "" EXIT trap "" EXIT
} }
restartDaemon() { restartDaemon() {
[[ -z "${pidDaemon:-}" ]] && return 0 [[ -z "${_NIX_TEST_DAEMON_PID:-}" ]] && return 0
killDaemon killDaemon
unset NIX_REMOTE
startDaemon startDaemon
} }
@ -190,10 +201,6 @@ enableFeatures() {
set -x set -x
if [[ -n "${NIX_DAEMON_PACKAGE:-}" ]]; then
startDaemon
fi
onError() { onError() {
set +x set +x
echo "$0: test failed at:" >&2 echo "$0: test failed at:" >&2
@ -205,4 +212,4 @@ onError() {
trap onError ERR trap onError ERR
fi # COMMON_SH_SOURCED fi # COMMON_VARS_AND_FUNCTIONS_SH_SOURCED

View file

@ -9,7 +9,6 @@ fi
source common.sh source common.sh
killDaemon killDaemon
unset NIX_REMOTE
# Fill the db using the older Nix # Fill the db using the older Nix
PATH_WITH_NEW_NIX="$PATH" PATH_WITH_NEW_NIX="$PATH"

View file

@ -1,14 +1,13 @@
set -e -o pipefail set -eu -o pipefail
source common.sh # Don't start the daemon
source common/vars-and-functions.sh
test -n "$TEST_ROOT" test -n "$TEST_ROOT"
if test -d "$TEST_ROOT"; then if test -d "$TEST_ROOT"; then
chmod -R u+w "$TEST_ROOT" chmod -R u+w "$TEST_ROOT"
# We would delete any daemon socket, so let's stop the daemon first. # We would delete any daemon socket, so let's stop the daemon first.
if [[ -n "${NIX_DAEMON_PACKAGE:-}" ]]; then
killDaemon killDaemon
fi
rm -rf "$TEST_ROOT" rm -rf "$TEST_ROOT"
fi fi
mkdir "$TEST_ROOT" mkdir "$TEST_ROOT"

View file

@ -129,9 +129,9 @@ endif
install-tests += $(foreach x, $(nix_tests), tests/$(x)) install-tests += $(foreach x, $(nix_tests), tests/$(x))
clean-files += $(d)/common.sh $(d)/config.nix $(d)/ca/config.nix clean-files += $(d)/tests/common/vars-and-functions.sh $(d)/config.nix $(d)/ca/config.nix
test-deps += tests/common.sh tests/config.nix tests/ca/config.nix test-deps += tests/common/vars-and-functions.sh tests/config.nix tests/ca/config.nix tests/plugins/libplugintest.$(SO_EXT)
ifeq ($(BUILD_SHARED_LIBS), 1) ifeq ($(BUILD_SHARED_LIBS), 1)
test-deps += tests/plugins/libplugintest.$(SO_EXT) test-deps += tests/plugins/libplugintest.$(SO_EXT)