aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreldritch horrors <pennae@lix.systems>2024-03-07 02:43:26 +0100
committereldritch horrors <pennae@lix.systems>2024-03-07 03:34:00 +0100
commit25cae6d377844afb5f592a6ff87b0c2034240178 (patch)
tree2827e966b7ae6191ed20b5fe5f43afe7163249ef
parent706f0df55b4aaf7d0441227338bd4bec7121fe67 (diff)
Merge pull request #9604 from obsidiansystems/test-substitute-on-destination
Test `nix copy --substitute-on-destination` (cherry picked from commit ed93e51f4b0a8149521e3cf5b4f3ff4eabf5b060) Change-Id: I33f8b591f42acf96fd18f27758dd1141b4bbbb5f
-rw-r--r--tests/functional/nix-copy-ssh-common.sh70
-rw-r--r--tests/functional/nix-copy-ssh-ng.sh16
-rw-r--r--tests/functional/nix-copy-ssh.sh19
3 files changed, 77 insertions, 28 deletions
diff --git a/tests/functional/nix-copy-ssh-common.sh b/tests/functional/nix-copy-ssh-common.sh
new file mode 100644
index 000000000..cc8314ff7
--- /dev/null
+++ b/tests/functional/nix-copy-ssh-common.sh
@@ -0,0 +1,70 @@
+proto=$1
+shift
+(( $# == 0 ))
+
+clearStore
+clearCache
+
+mkdir -p $TEST_ROOT/stores
+
+# Create path to copy back and forth
+outPath=$(nix-build --no-out-link dependencies.nix)
+
+storeQueryParam="store=${NIX_STORE_DIR}"
+
+realQueryParam () {
+ echo "real=$1$NIX_STORE_DIR"
+}
+
+remoteRoot="$TEST_ROOT/stores/$proto"
+
+clearRemoteStore () {
+ chmod -R u+w "$remoteRoot" || true
+ rm -rf "$remoteRoot"
+}
+
+clearRemoteStore
+
+remoteStore="${proto}://localhost?${storeQueryParam}&remote-store=${remoteRoot}%3f${storeQueryParam}%26$(realQueryParam "$remoteRoot")"
+
+# Copy to store
+
+args=()
+if [[ "$proto" == "ssh-ng" ]]; then
+ # TODO investigate discrepancy
+ args+=(--no-check-sigs)
+fi
+
+[ ! -f ${remoteRoot}${outPath}/foobar ]
+nix copy "${args[@]}" --to "$remoteStore" $outPath
+[ -f ${remoteRoot}${outPath}/foobar ]
+
+# Copy back from store
+
+clearStore
+
+[ ! -f $outPath/foobar ]
+nix copy --no-check-sigs --from "$remoteStore" $outPath
+[ -f $outPath/foobar ]
+
+# Check --substitute-on-destination, avoid corrupted store
+
+clearRemoteStore
+
+corruptedRoot=$TEST_ROOT/stores/corrupted
+corruptedStore="${corruptedRoot}?${storeQueryParam}&$(realQueryParam "$corruptedRoot")"
+
+# Copy it to the corrupted store
+nix copy --no-check-sigs "$outPath" --to "$corruptedStore"
+
+# Corrupt it in there
+corruptPath="${corruptedRoot}${outPath}"
+chmod +w "$corruptPath"
+echo "not supposed to be here" > "$corruptPath/foobarbaz"
+chmod -w "$corruptPath"
+
+# Copy from the corrupted store with the regular store as a
+# substituter. It must use the substituter not the source store in
+# order to avoid errors.
+NIX_CONFIG=$(echo -e "substituters = local\nrequire-sigs = false") \
+ nix copy --no-check-sigs --from "$corruptedStore" --to "$remoteStore" --substitute-on-destination "$outPath"
diff --git a/tests/functional/nix-copy-ssh-ng.sh b/tests/functional/nix-copy-ssh-ng.sh
index 45e53c9c0..3987d5358 100644
--- a/tests/functional/nix-copy-ssh-ng.sh
+++ b/tests/functional/nix-copy-ssh-ng.sh
@@ -1,18 +1,14 @@
source common.sh
-clearStore
-clearCache
+source nix-copy-ssh-common.sh "ssh-ng"
-remoteRoot=$TEST_ROOT/store2
-chmod -R u+w "$remoteRoot" || true
-rm -rf "$remoteRoot"
+clearStore
+clearRemoteStore
outPath=$(nix-build --no-out-link dependencies.nix)
-nix store ping --store "ssh-ng://localhost?store=$NIX_STORE_DIR&remote-store=$remoteRoot%3fstore=$NIX_STORE_DIR%26real=$remoteRoot$NIX_STORE_DIR"
+nix store ping --store "$remoteStore"
# Regression test for https://github.com/NixOS/nix/issues/6253
-nix copy --to "ssh-ng://localhost?store=$NIX_STORE_DIR&remote-store=$remoteRoot%3fstore=$NIX_STORE_DIR%26real=$remoteRoot$NIX_STORE_DIR" $outPath --no-check-sigs &
-nix copy --to "ssh-ng://localhost?store=$NIX_STORE_DIR&remote-store=$remoteRoot%3fstore=$NIX_STORE_DIR%26real=$remoteRoot$NIX_STORE_DIR" $outPath --no-check-sigs
-
-[ -f $remoteRoot$outPath/foobar ]
+nix copy --to "$remoteStore" $outPath --no-check-sigs &
+nix copy --to "$remoteStore" $outPath --no-check-sigs
diff --git a/tests/functional/nix-copy-ssh.sh b/tests/functional/nix-copy-ssh.sh
index eb801548d..12e8346bc 100644
--- a/tests/functional/nix-copy-ssh.sh
+++ b/tests/functional/nix-copy-ssh.sh
@@ -1,20 +1,3 @@
source common.sh
-clearStore
-clearCache
-
-remoteRoot=$TEST_ROOT/store2
-chmod -R u+w "$remoteRoot" || true
-rm -rf "$remoteRoot"
-
-outPath=$(nix-build --no-out-link dependencies.nix)
-
-nix copy --to "ssh://localhost?store=$NIX_STORE_DIR&remote-store=$remoteRoot%3fstore=$NIX_STORE_DIR%26real=$remoteRoot$NIX_STORE_DIR" $outPath
-
-[ -f $remoteRoot$outPath/foobar ]
-
-clearStore
-
-nix copy --no-check-sigs --from "ssh://localhost?store=$NIX_STORE_DIR&remote-store=$remoteRoot%3fstore=$NIX_STORE_DIR%26real=$remoteRoot$NIX_STORE_DIR" $outPath
-
-[ -f $outPath/foobar ]
+source nix-copy-ssh-common.sh "ssh"