fix/tests/repair.sh
regnat addacfce4a Allow running all the tests with the daemon
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`
2021-07-27 17:06:11 +02:00

77 lines
1.7 KiB
Bash

source common.sh
needLocalStore "--repair needs a local store"
clearStore
path=$(nix-build dependencies.nix -o $TEST_ROOT/result)
path2=$(nix-store -qR $path | grep input-2)
nix-store --verify --check-contents -v
hash=$(nix-hash $path2)
# Corrupt a path and check whether nix-build --repair can fix it.
chmod u+w $path2
touch $path2/bad
(! nix-store --verify --check-contents -v)
# The path can be repaired by rebuilding the derivation.
nix-store --verify --check-contents --repair
(! [ -e $path2/bad ])
(! [ -w $path2 ])
nix-store --verify-path $path2
# Re-corrupt and delete the deriver. Now --verify --repair should
# not work.
chmod u+w $path2
touch $path2/bad
nix-store --delete $(nix-store -qd $path2)
(! nix-store --verify --check-contents --repair)
nix-build dependencies.nix -o $TEST_ROOT/result --repair
if [ "$(nix-hash $path2)" != "$hash" -o -e $path2/bad ]; then
echo "path not repaired properly" >&2
exit 1
fi
# Corrupt a path that has a substitute and check whether nix-store
# --verify can fix it.
clearCache
nix copy --to file://$cacheDir $path
chmod u+w $path2
rm -rf $path2
nix-store --verify --check-contents --repair --substituters "file://$cacheDir" --no-require-sigs
if [ "$(nix-hash $path2)" != "$hash" -o -e $path2/bad ]; then
echo "path not repaired properly" >&2
exit 1
fi
# Check --verify-path and --repair-path.
nix-store --verify-path $path2
chmod u+w $path2
rm -rf $path2
if nix-store --verify-path $path2; then
echo "nix-store --verify-path succeeded unexpectedly" >&2
exit 1
fi
nix-store --repair-path $path2 --substituters "file://$cacheDir" --no-require-sigs
if [ "$(nix-hash $path2)" != "$hash" -o -e $path2/bad ]; then
echo "path not repaired properly" >&2
exit 1
fi