diff --git a/tests/common.sh b/tests/common.sh index 8941671d6..7b0922c9f 100644 --- a/tests/common.sh +++ b/tests/common.sh @@ -4,7 +4,7 @@ if [[ -z "${COMMON_SH_SOURCED-}" ]]; then COMMON_SH_SOURCED=1 -source "$(readlink -f "$(dirname "${BASH_SOURCE[0]}")")/common/vars-and-functions.sh" +source "$(readlink -f "$(dirname "${BASH_SOURCE[0]-$0}")")/common/vars-and-functions.sh" if [[ -n "${NIX_DAEMON_PACKAGE:-}" ]]; then startDaemon fi diff --git a/tests/local.mk b/tests/local.mk index 61fb1a85b..ea5550c75 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -133,7 +133,8 @@ nix_tests = \ impure-derivations.sh \ path-from-hash-part.sh \ toString-path.sh \ - overlay-local-store.sh + overlay-local-store/outer.sh \ + overlay-local-store/bad-uris.sh ifeq ($(HAVE_LIBCPUID), 1) nix_tests += compute-levels.sh diff --git a/tests/overlay-local-store.sh b/tests/overlay-local-store.sh deleted file mode 100644 index 242c16e20..000000000 --- a/tests/overlay-local-store.sh +++ /dev/null @@ -1,10 +0,0 @@ -source common.sh - -requireSandboxSupport -[[ $busybox =~ busybox ]] || skipTest "no busybox" -if [[ $(uname) != Linux ]]; then skipTest "Need Linux for overlayfs"; fi -needLocalStore "The test uses --store always so we would just be bypassing the daemon" - -echo "drop-supplementary-groups = false" >> "$NIX_CONF_DIR"/nix.conf - -exec unshare --mount --map-root-user overlay-local-store/inner.sh diff --git a/tests/overlay-local-store/bad-uris.sh b/tests/overlay-local-store/bad-uris.sh new file mode 100644 index 000000000..d4261bd97 --- /dev/null +++ b/tests/overlay-local-store/bad-uris.sh @@ -0,0 +1,25 @@ +source common.sh + +requireEnvironment +setupConfig +storeDirs + +mkdir -p $TEST_ROOT/bad_test +badTestRoot=$TEST_ROOT/bad_test +storeBadRoot="local-overlay?root=$badTestRoot&lower-store=$storeA&upper-layer=$storeBTop" +storeBadLower="local-overlay?root=$TEST_ROOT/merged-store&lower-store=$badTestRoot&upper-layer=$storeBTop" +storeBadUpper="local-overlay?root=$TEST_ROOT/merged-store&lower-store=$storeA&upper-layer=$badTestRoot" + +declare -a storesBad=( + "$storeBadRoot" "$storeBadLower" "$storeBadUpper" +) + +for i in "${storesBad[@]}"; do + echo $i + unshare --mount --map-root-user bash <> "$NIX_CONF_DIR"/nix.conf + echo "build-users-group = " >> "$NIX_CONF_DIR"/nix.conf +} + +storeDirs () { + storeA="$TEST_ROOT/store-a" + storeBTop="$TEST_ROOT/store-b" + storeB="local-overlay?root=$TEST_ROOT/merged-store&lower-store=$storeA&upper-layer=$storeBTop" + # Creating testing directories + mkdir -p "$TEST_ROOT"/{store-a/nix/store,store-b,merged-store/nix/store,workdir} +} + +# Mounting Overlay Store +mountOverlayfs () { + mount -t overlay overlay \ + -o lowerdir="$storeA/nix/store" \ + -o upperdir="$storeBTop" \ + -o workdir="$TEST_ROOT/workdir" \ + "$TEST_ROOT/merged-store/nix/store" \ + || skipTest "overlayfs is not supported" + + cleanupOverlay () { + umount "$TEST_ROOT/merged-store/nix/store" + rm -r $TEST_ROOT/workdir + } + trap cleanupOverlay EXIT +} + +toRealPath () { + storeDir=$1; shift + storePath=$1; shift + echo $storeDir$(echo $storePath | sed "s^$NIX_STORE_DIR^^") +} + +initLowerStore () { + # Init lower store with some stuff + nix-store --store "$storeA" --add ../dummy + + # Build something in lower store + drvPath=$(nix-instantiate --store $storeA ../hermetic.nix --arg busybox "$busybox" --arg seed 1) + path=$(nix-store --store "$storeA" --realise $drvPath) +} diff --git a/tests/overlay-local-store/inner.sh b/tests/overlay-local-store/inner.sh index c8d49eb19..adbe29557 100755 --- a/tests/overlay-local-store/inner.sh +++ b/tests/overlay-local-store/inner.sh @@ -6,53 +6,11 @@ set -x source common.sh -export NIX_CONFIG='build-users-group = ' +storeDirs -# Creating testing directories +initLowerStore -storeA="$TEST_ROOT/store-a" -storeBTop="$TEST_ROOT/store-b" -storeB="local-overlay?root=$TEST_ROOT/merged-store&lower-store=$storeA&upper-layer=$storeBTop" - -mkdir -p $TEST_ROOT/bad_test -badTestRoot=$TEST_ROOT/bad_test -storeBadRoot="local-overlay?root=$badTestRoot&lower-store=$storeA&upper-layer=$storeBTop" -storeBadLower="local-overlay?root=$TEST_ROOT/merged-store&lower-store=$badTestRoot&upper-layer=$storeBTop" -storeBadUpper="local-overlay?root=$TEST_ROOT/merged-store&lower-store=$storeA&upper-layer=$badTestRoot" - -declare -a storesBad=( - "$storeBadRoot" "$storeBadLower" "$storeBadUpper" -) - -mkdir -p "$TEST_ROOT"/{store-a,store-b,merged-store/nix/store,workdir} - -# Mounting Overlay Store - -# Init lower store with some stuff -nix-store --store "$storeA" --add dummy - -# Build something in lower store -drvPath=$(nix-instantiate --store $storeA ./hermetic.nix --arg busybox "$busybox" --arg seed 1) -path=$(nix-store --store "$storeA" --realise $drvPath) - -mount -t overlay overlay \ - -o lowerdir="$storeA/nix/store" \ - -o upperdir="$storeBTop" \ - -o workdir="$TEST_ROOT/workdir" \ - "$TEST_ROOT/merged-store/nix/store" \ - || skipTest "overlayfs is not supported" - -cleanupOverlay () { - umount "$TEST_ROOT/merged-store/nix/store" - rm -r $TEST_ROOT/workdir -} -trap cleanupOverlay EXIT - -toRealPath () { - storeDir=$1; shift - storePath=$1; shift - echo $storeDir$(echo $storePath | sed "s^$NIX_STORE_DIR^^") -} +mountOverlayfs ### Check status @@ -113,12 +71,7 @@ hashPart=$(echo $path | sed "s^$NIX_STORE_DIR/^^" | sed 's/-.*//') # upper layer should not have it expect 1 stat $(toRealPath "$storeBTop/nix/store" "$path") -path=$(nix-store --store "$storeB" --add dummy) - -for i in "${storesBad[@]}"; do - echo $i - expectStderr 1 nix-store --store "$i" --add dummy | grepQuiet "overlay filesystem .* mounted incorrectly" -done +path=$(nix-store --store "$storeB" --add ../dummy) # lower store should have it from before stat $(toRealPath "$storeA/nix/store" "$path") @@ -128,7 +81,7 @@ expect 1 stat $(toRealPath "$storeB/nix/store" "$path") ### Do a build in overlay store -path=$(nix-build ./hermetic.nix --arg busybox $busybox --arg seed 2 --store "$storeB" --no-out-link) +path=$(nix-build ../hermetic.nix --arg busybox $busybox --arg seed 2 --store "$storeB" --no-out-link) # Checking for path in lower layer (should fail) expect 1 stat $(toRealPath "$storeA/nix/store" "$path") diff --git a/tests/overlay-local-store/outer.sh b/tests/overlay-local-store/outer.sh new file mode 100755 index 000000000..ba55f1d06 --- /dev/null +++ b/tests/overlay-local-store/outer.sh @@ -0,0 +1,5 @@ +source common.sh + +requireEnvironment +setupConfig +exec unshare --mount --map-root-user ./inner.sh