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_DAEMON_SOCKET_PATH ${NIX_DAEMON_COMMAND:-nix daemon} & for ((i = 0; i < 30; i++)); do if [[ -S $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