forked from lix-project/lix
addacfce4a
When `NIX_DAEMON_PACKAGE` is set, make all the tests use the Nix daemon. That way we can test every piece of Nix functionality both with and without the daemon. Tests for which using the daemon isn’t possible or doesn’t make sens can selectively be disabled with `needLocalStore`
180 lines
3.8 KiB
Bash
180 lines
3.8 KiB
Bash
set -e
|
||
|
||
if [[ -z "$COMMON_SH_SOURCED" ]]; then
|
||
|
||
COMMON_SH_SOURCED=1
|
||
|
||
export TEST_ROOT=$(realpath ${TMPDIR:-/tmp}/nix-test)/${TEST_NAME:-default}
|
||
export NIX_STORE_DIR
|
||
if ! NIX_STORE_DIR=$(readlink -f $TEST_ROOT/store 2> /dev/null); then
|
||
# Maybe the build directory is symlinked.
|
||
export NIX_IGNORE_SYMLINK_STORE=1
|
||
NIX_STORE_DIR=$TEST_ROOT/store
|
||
fi
|
||
export NIX_LOCALSTATE_DIR=$TEST_ROOT/var
|
||
export NIX_LOG_DIR=$TEST_ROOT/var/log/nix
|
||
export NIX_STATE_DIR=$TEST_ROOT/var/nix
|
||
export NIX_CONF_DIR=$TEST_ROOT/etc
|
||
export NIX_DAEMON_SOCKET_PATH=$TEST_ROOT/dSocket
|
||
unset NIX_USER_CONF_FILES
|
||
export _NIX_TEST_SHARED=$TEST_ROOT/shared
|
||
if [[ -n $NIX_STORE ]]; then
|
||
export _NIX_TEST_NO_SANDBOX=1
|
||
fi
|
||
export _NIX_IN_TEST=$TEST_ROOT/shared
|
||
export _NIX_TEST_NO_LSOF=1
|
||
export NIX_REMOTE=$NIX_REMOTE_
|
||
unset NIX_PATH
|
||
export TEST_HOME=$TEST_ROOT/test-home
|
||
export HOME=$TEST_HOME
|
||
unset XDG_CONFIG_HOME
|
||
unset XDG_CONFIG_DIRS
|
||
unset XDG_CACHE_HOME
|
||
mkdir -p $TEST_HOME
|
||
|
||
export PATH=@bindir@:$PATH
|
||
if [[ -n "${NIX_CLIENT_PACKAGE:-}" ]]; then
|
||
export PATH="$NIX_CLIENT_PACKAGE/bin":$PATH
|
||
fi
|
||
if [[ -n "${NIX_DAEMON_PACKAGE:-}" ]]; then
|
||
export NIX_DAEMON_COMMAND="$NIX_DAEMON_PACKAGE/bin/nix-daemon"
|
||
fi
|
||
coreutils=@coreutils@
|
||
|
||
export dot=@dot@
|
||
export SHELL="@bash@"
|
||
export PAGER=cat
|
||
export busybox="@sandbox_shell@"
|
||
|
||
export version=@PACKAGE_VERSION@
|
||
export system=@system@
|
||
|
||
export IMPURE_VAR1=foo
|
||
export IMPURE_VAR2=bar
|
||
|
||
cacheDir=$TEST_ROOT/binary-cache
|
||
|
||
readLink() {
|
||
ls -l "$1" | sed 's/.*->\ //'
|
||
}
|
||
|
||
clearProfiles() {
|
||
profiles="$NIX_STATE_DIR"/profiles
|
||
rm -rf $profiles
|
||
}
|
||
|
||
clearStore() {
|
||
echo "clearing store..."
|
||
chmod -R +w "$NIX_STORE_DIR"
|
||
rm -rf "$NIX_STORE_DIR"
|
||
mkdir "$NIX_STORE_DIR"
|
||
rm -rf "$NIX_STATE_DIR"
|
||
mkdir "$NIX_STATE_DIR"
|
||
clearProfiles
|
||
}
|
||
|
||
clearCache() {
|
||
rm -rf "$cacheDir"
|
||
}
|
||
|
||
clearCacheCache() {
|
||
rm -f $TEST_HOME/.cache/nix/binary-cache*
|
||
}
|
||
|
||
startDaemon() {
|
||
# Don’t start the daemon twice, as this would just make it loop indefinitely
|
||
if [[ "$NIX_REMOTE" == daemon ]]; then
|
||
return
|
||
fi
|
||
# Start the daemon, wait for the socket to appear. !!!
|
||
# ‘nix-daemon’ should have an option to fork into the background.
|
||
rm -f $NIX_STATE_DIR/daemon-socket/socket
|
||
${NIX_DAEMON_COMMAND:-nix daemon} &
|
||
for ((i = 0; i < 30; i++)); do
|
||
if [ -e $NIX_DAEMON_SOCKET_PATH ]; then break; fi
|
||
sleep 1
|
||
done
|
||
pidDaemon=$!
|
||
trap "killDaemon" EXIT
|
||
export NIX_REMOTE=daemon
|
||
}
|
||
|
||
killDaemon() {
|
||
kill $pidDaemon
|
||
for i in {0.10}; do
|
||
kill -0 $pidDaemon || break
|
||
sleep 1
|
||
done
|
||
kill -9 $pidDaemon || true
|
||
wait $pidDaemon || true
|
||
trap "" EXIT
|
||
}
|
||
|
||
restartDaemon() {
|
||
[[ -z "${pidDaemon:-}" ]] && return 0
|
||
|
||
killDaemon
|
||
unset NIX_REMOTE
|
||
startDaemon
|
||
}
|
||
|
||
if [[ $(uname) == Linux ]] && [[ -L /proc/self/ns/user ]] && unshare --user true; then
|
||
_canUseSandbox=1
|
||
fi
|
||
|
||
isDaemonNewer () {
|
||
[[ -n "${NIX_DAEMON_PACKAGE:-}" ]] || return 0
|
||
local requiredVersion="$1"
|
||
local daemonVersion=$($NIX_DAEMON_PACKAGE/bin/nix-daemon --version | cut -d' ' -f3)
|
||
return [[ $(nix eval --expr "builtins.compareVersions ''$daemonVersion'' ''2.4''") -ge 0 ]]
|
||
}
|
||
|
||
requireDaemonNewerThan () {
|
||
isDaemonNewer "$1" || exit 99
|
||
}
|
||
|
||
canUseSandbox() {
|
||
if [[ ! $_canUseSandbox ]]; then
|
||
echo "Sandboxing not supported, skipping this test..."
|
||
return 1
|
||
fi
|
||
|
||
return 0
|
||
}
|
||
|
||
fail() {
|
||
echo "$1"
|
||
exit 1
|
||
}
|
||
|
||
expect() {
|
||
local expected res
|
||
expected="$1"
|
||
shift
|
||
set +e
|
||
"$@"
|
||
res="$?"
|
||
set -e
|
||
[[ $res -eq $expected ]]
|
||
}
|
||
|
||
needLocalStore() {
|
||
if [[ "$NIX_REMOTE" == "daemon" ]]; then
|
||
echo "Can’t run through the daemon ($1), skipping this test..."
|
||
return 99
|
||
fi
|
||
}
|
||
|
||
# Just to make it easy to find which tests should be fixed
|
||
buggyNeedLocalStore () {
|
||
needLocalStore
|
||
}
|
||
|
||
set -x
|
||
|
||
if [[ -n "${NIX_DAEMON_PACKAGE:-}" ]]; then
|
||
startDaemon
|
||
fi
|
||
|
||
fi # COMMON_SH_SOURCED
|