2018-01-19 12:58:28 +00:00
|
|
|
|
source common.sh
|
|
|
|
|
|
2021-07-26 04:54:55 +00:00
|
|
|
|
# XXX: This shouldn’t be, but #4813 cause this test to fail
|
|
|
|
|
buggyNeedLocalStore "see #4813"
|
|
|
|
|
|
2019-02-17 21:26:49 +00:00
|
|
|
|
checkBuildTempDirRemoved ()
|
|
|
|
|
{
|
|
|
|
|
buildDir=$(sed -n 's/CHECK_TMPDIR=//p' $1 | head -1)
|
|
|
|
|
checkBuildIdFile=${buildDir}/checkBuildId
|
|
|
|
|
[[ ! -f $checkBuildIdFile ]] || ! grep $checkBuildId $checkBuildIdFile
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# written to build temp directories to verify created by this instance
|
|
|
|
|
checkBuildId=$(date +%s%N)
|
|
|
|
|
|
2018-01-19 12:58:28 +00:00
|
|
|
|
clearStore
|
|
|
|
|
|
|
|
|
|
nix-build dependencies.nix --no-out-link
|
|
|
|
|
nix-build dependencies.nix --no-out-link --check
|
|
|
|
|
|
2023-06-22 18:23:25 +00:00
|
|
|
|
# Build failure exit codes (100, 104, etc.) are from
|
|
|
|
|
# doc/manual/src/command-ref/status-build-failure.md
|
|
|
|
|
|
2019-02-17 21:26:49 +00:00
|
|
|
|
# check for dangling temporary build directories
|
|
|
|
|
# only retain if build fails and --keep-failed is specified, or...
|
|
|
|
|
# ...build is non-deterministic and --check and --keep-failed are both specified
|
|
|
|
|
nix-build check.nix -A failed --argstr checkBuildId $checkBuildId \
|
|
|
|
|
--no-out-link 2> $TEST_ROOT/log || status=$?
|
|
|
|
|
[ "$status" = "100" ]
|
|
|
|
|
checkBuildTempDirRemoved $TEST_ROOT/log
|
|
|
|
|
|
|
|
|
|
nix-build check.nix -A failed --argstr checkBuildId $checkBuildId \
|
|
|
|
|
--no-out-link --keep-failed 2> $TEST_ROOT/log || status=$?
|
|
|
|
|
[ "$status" = "100" ]
|
|
|
|
|
if checkBuildTempDirRemoved $TEST_ROOT/log; then false; fi
|
|
|
|
|
|
2024-03-22 21:41:50 +00:00
|
|
|
|
test_custom_build_dir() {
|
|
|
|
|
local customBuildDir="$TEST_ROOT/custom-build-dir"
|
|
|
|
|
|
|
|
|
|
# Nix does not create the parent directories, and perhaps it shouldn't try to
|
|
|
|
|
# decide the permissions of build-dir.
|
|
|
|
|
mkdir "$customBuildDir"
|
|
|
|
|
nix-build check.nix -A failed --argstr checkBuildId $checkBuildId \
|
|
|
|
|
--no-out-link --keep-failed --option build-dir "$TEST_ROOT/custom-build-dir" 2> $TEST_ROOT/log || status=$?
|
|
|
|
|
[ "$status" = "100" ]
|
|
|
|
|
[[ 1 == "$(count "$customBuildDir/nix-build-"*)" ]]
|
|
|
|
|
local buildDir="$customBuildDir/nix-build-"*
|
|
|
|
|
grep $checkBuildId $buildDir/checkBuildId
|
|
|
|
|
}
|
|
|
|
|
test_custom_build_dir
|
|
|
|
|
|
2024-10-21 07:01:44 +00:00
|
|
|
|
test_custom_temp_dir() {
|
|
|
|
|
# like test_custom_build_dir(), but uses the temp-dir setting instead
|
|
|
|
|
# build-dir inherits from temp-dir when build-dir is unset
|
|
|
|
|
local customTempDir="$TEST_ROOT/custom-temp-dir"
|
|
|
|
|
|
|
|
|
|
mkdir "$customTempDir"
|
|
|
|
|
nix-build check.nix -A failed --argstr checkBuildId $checkBuildId \
|
|
|
|
|
--no-out-link --keep-failed --option temp-dir "$customTempDir" 2> $TEST_ROOT/log || status=$?
|
|
|
|
|
[ "$status" = "100" ]
|
|
|
|
|
[[ 1 == "$(count "$customTempDir/nix-build-"*)" ]]
|
|
|
|
|
local buildDir="$customTempDir/nix-build-"*
|
|
|
|
|
grep $checkBuildId $buildDir/checkBuildId
|
|
|
|
|
|
|
|
|
|
# also check a separate code path that doesn't involve build-dir
|
|
|
|
|
# nix-shell uses temp-dir for its rcfile path
|
|
|
|
|
rcpath=$(NIX_BUILD_SHELL=$SHELL nix-shell check.nix -A deterministic --option temp-dir "$customTempDir" --run 'echo $0' 2> $TEST_ROOT/log)
|
|
|
|
|
# rcpath is <temp-dir>/nix-shell-*/rc
|
|
|
|
|
[[ $rcpath = "$customTempDir"/* ]]
|
|
|
|
|
}
|
|
|
|
|
test_custom_temp_dir
|
|
|
|
|
|
|
|
|
|
test_shell_preserves_tmpdir() {
|
|
|
|
|
# ensure commands that spawn interactive shells don't overwrite TMPDIR with temp-dir
|
|
|
|
|
local envTempDir=$TEST_ROOT/shell-temp-dir-env
|
|
|
|
|
mkdir $envTempDir
|
|
|
|
|
local settingTempDir=$TEST_ROOT/shell-temp-dir-setting
|
|
|
|
|
mkdir $settingTempDir
|
|
|
|
|
|
|
|
|
|
# FIXME: switch to check.nix's deterministic once `nix develop` doesn't need `outputs`
|
|
|
|
|
# https://git.lix.systems/lix-project/lix/issues/556
|
|
|
|
|
local expr='with import ./config.nix; mkDerivation { name = "foo"; buildCommand = "echo foo > $out"; outputs = [ "out" ]; }'
|
|
|
|
|
|
|
|
|
|
local output
|
|
|
|
|
output=$(TMPDIR=$envTempDir NIX_BUILD_SHELL=$SHELL nix-shell -E "$expr" --option temp-dir "$settingTempDir" --command 'echo $TMPDIR' 2> $TEST_ROOT/log)
|
|
|
|
|
[[ $output = "$envTempDir" ]]
|
|
|
|
|
|
|
|
|
|
output=$(TMPDIR=$envTempDir nix develop --impure -E "$expr" --option temp-dir "$settingTempDir" --command bash -c 'echo $TMPDIR' 2> $TEST_ROOT/log)
|
|
|
|
|
[[ $output = "$envTempDir"/nix-shell.* ]]
|
|
|
|
|
|
|
|
|
|
output=$(TMPDIR=$envTempDir nix shell --impure -E "$expr" --option temp-dir "$settingTempDir" --command bash -c 'echo $TMPDIR' 2> $TEST_ROOT/log)
|
|
|
|
|
[[ $output = "$envTempDir" ]]
|
|
|
|
|
}
|
|
|
|
|
test_shell_preserves_tmpdir
|
|
|
|
|
|
2019-02-17 21:26:49 +00:00
|
|
|
|
nix-build check.nix -A deterministic --argstr checkBuildId $checkBuildId \
|
|
|
|
|
--no-out-link 2> $TEST_ROOT/log
|
|
|
|
|
checkBuildTempDirRemoved $TEST_ROOT/log
|
|
|
|
|
|
|
|
|
|
nix-build check.nix -A deterministic --argstr checkBuildId $checkBuildId \
|
|
|
|
|
--no-out-link --check --keep-failed 2> $TEST_ROOT/log
|
2021-12-09 15:26:46 +00:00
|
|
|
|
if grepQuiet 'may not be deterministic' $TEST_ROOT/log; then false; fi
|
2019-02-17 21:26:49 +00:00
|
|
|
|
checkBuildTempDirRemoved $TEST_ROOT/log
|
|
|
|
|
|
|
|
|
|
nix-build check.nix -A nondeterministic --argstr checkBuildId $checkBuildId \
|
|
|
|
|
--no-out-link 2> $TEST_ROOT/log
|
|
|
|
|
checkBuildTempDirRemoved $TEST_ROOT/log
|
|
|
|
|
|
|
|
|
|
nix-build check.nix -A nondeterministic --argstr checkBuildId $checkBuildId \
|
|
|
|
|
--no-out-link --check 2> $TEST_ROOT/log || status=$?
|
|
|
|
|
grep 'may not be deterministic' $TEST_ROOT/log
|
2024-10-15 08:53:08 +00:00
|
|
|
|
# the differences in both outputs should be reported
|
|
|
|
|
[[ $(grep -c 'differs' $TEST_ROOT/log) = 2 ]]
|
2019-02-17 21:26:49 +00:00
|
|
|
|
[ "$status" = "104" ]
|
|
|
|
|
checkBuildTempDirRemoved $TEST_ROOT/log
|
|
|
|
|
|
|
|
|
|
nix-build check.nix -A nondeterministic --argstr checkBuildId $checkBuildId \
|
|
|
|
|
--no-out-link --check --keep-failed 2> $TEST_ROOT/log || status=$?
|
2018-01-19 12:58:28 +00:00
|
|
|
|
grep 'may not be deterministic' $TEST_ROOT/log
|
2019-06-15 13:28:32 +00:00
|
|
|
|
[ "$status" = "104" ]
|
2019-02-17 21:26:49 +00:00
|
|
|
|
if checkBuildTempDirRemoved $TEST_ROOT/log; then false; fi
|
2018-01-19 12:58:28 +00:00
|
|
|
|
|
|
|
|
|
clearStore
|
|
|
|
|
|
2020-06-12 19:39:44 +00:00
|
|
|
|
path=$(nix-build check.nix -A fetchurl --no-out-link)
|
2018-01-19 13:53:34 +00:00
|
|
|
|
|
|
|
|
|
chmod +w $path
|
|
|
|
|
echo foo > $path
|
|
|
|
|
chmod -w $path
|
|
|
|
|
|
2020-06-12 19:39:44 +00:00
|
|
|
|
nix-build check.nix -A fetchurl --no-out-link --check
|
2018-01-19 13:53:34 +00:00
|
|
|
|
# Note: "check" doesn't repair anything, it just compares to the hash stored in the database.
|
|
|
|
|
[[ $(cat $path) = foo ]]
|
|
|
|
|
|
2020-06-12 19:39:44 +00:00
|
|
|
|
nix-build check.nix -A fetchurl --no-out-link --repair
|
2018-01-19 13:53:34 +00:00
|
|
|
|
[[ $(cat $path) != foo ]]
|
2019-05-11 21:32:53 +00:00
|
|
|
|
|
2022-12-06 15:36:42 +00:00
|
|
|
|
echo 'Hello World' > $TEST_ROOT/dummy
|
2020-06-12 19:39:44 +00:00
|
|
|
|
nix-build check.nix -A hashmismatch --no-out-link || status=$?
|
2019-05-11 21:32:53 +00:00
|
|
|
|
[ "$status" = "102" ]
|
|
|
|
|
|
2022-12-06 15:36:42 +00:00
|
|
|
|
echo -n > $TEST_ROOT/dummy
|
2020-06-12 19:39:44 +00:00
|
|
|
|
nix-build check.nix -A hashmismatch --no-out-link
|
2022-12-06 15:36:42 +00:00
|
|
|
|
echo 'Hello World' > $TEST_ROOT/dummy
|
2019-05-11 21:32:53 +00:00
|
|
|
|
|
2020-06-12 19:39:44 +00:00
|
|
|
|
nix-build check.nix -A hashmismatch --no-out-link --check || status=$?
|
2019-05-11 21:32:53 +00:00
|
|
|
|
[ "$status" = "102" ]
|
|
|
|
|
|
|
|
|
|
# Multiple failures with --keep-going
|
|
|
|
|
nix-build check.nix -A nondeterministic --no-out-link
|
2020-06-12 19:39:44 +00:00
|
|
|
|
nix-build check.nix -A nondeterministic -A hashmismatch --no-out-link --check --keep-going || status=$?
|
2019-06-15 13:28:32 +00:00
|
|
|
|
[ "$status" = "110" ]
|