mirror of
https://github.com/NixOS/nix.git
synced 2024-11-22 23:02:27 +00:00
da82d67022
... so that we may perhaps later extend the interface. Note that Nixpkgs' lib.warn already requires a string coercible argument, so this is reasonable. Also note that string coercible values aren't all strings, but in practice, for warn, they are.
170 lines
6.2 KiB
Bash
Executable File
170 lines
6.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
source common.sh
|
|
|
|
set -o pipefail
|
|
|
|
source lang/framework.sh
|
|
|
|
# specialize function a bit
|
|
function diffAndAccept() {
|
|
local -r testName="$1"
|
|
local -r got="lang/$testName.$2"
|
|
local -r expected="lang/$testName.$3"
|
|
diffAndAcceptInner "$testName" "$got" "$expected"
|
|
}
|
|
|
|
export TEST_VAR=foo # for eval-okay-getenv.nix
|
|
export NIX_REMOTE=dummy://
|
|
export NIX_STORE_DIR=/nix/store
|
|
|
|
nix-instantiate --eval -E 'builtins.trace "Hello" 123' 2>&1 | grepQuiet Hello
|
|
nix-instantiate --eval -E 'builtins.trace "Hello" 123' 2>/dev/null | grepQuiet 123
|
|
nix-instantiate --eval -E 'builtins.addErrorContext "Hello" 123' 2>&1
|
|
nix-instantiate --trace-verbose --eval -E 'builtins.traceVerbose "Hello" 123' 2>&1 | grepQuiet Hello
|
|
nix-instantiate --eval -E 'builtins.traceVerbose "Hello" 123' 2>&1 | grepQuietInverse Hello
|
|
nix-instantiate --show-trace --eval -E 'builtins.addErrorContext "Hello" 123' 2>&1 | grepQuietInverse Hello
|
|
expectStderr 1 nix-instantiate --show-trace --eval -E 'builtins.addErrorContext "Hello" (throw "Foo")' | grepQuiet Hello
|
|
expectStderr 1 nix-instantiate --show-trace --eval -E 'builtins.addErrorContext "Hello %" (throw "Foo")' | grepQuiet 'Hello %'
|
|
# Relies on parsing the expression derivation as a derivation, can't use --eval
|
|
expectStderr 1 nix-instantiate --show-trace lang/non-eval-fail-bad-drvPath.nix | grepQuiet "store path '8qlfcic10lw5304gqm8q45nr7g7jl62b-cachix-1.7.3-bin' is not a valid derivation path"
|
|
|
|
|
|
nix-instantiate --eval -E 'let x = builtins.trace { x = x; } true; in x' \
|
|
2>&1 | grepQuiet -E 'trace: { x = «potential infinite recursion»; }'
|
|
|
|
nix-instantiate --eval -E 'let x = { repeating = x; tracing = builtins.trace x true; }; in x.tracing'\
|
|
2>&1 | grepQuiet -F 'trace: { repeating = «repeated»; tracing = «potential infinite recursion»; }'
|
|
|
|
nix-instantiate --eval -E 'builtins.warn "Hello" 123' 2>&1 | grepQuiet 'warning: Hello'
|
|
nix-instantiate --eval -E 'builtins.addErrorContext "while doing ${"something"} interesting" (builtins.warn "Hello" 123)' 2>/dev/null | grepQuiet 123
|
|
|
|
# warn does not accept non-strings for now
|
|
expectStderr 1 nix-instantiate --eval -E 'let x = builtins.warn { x = x; } true; in x' \
|
|
| grepQuiet "expected a string but found a set"
|
|
expectStderr 1 nix-instantiate --eval --abort-on-warn -E 'builtins.warn "Hello" 123' | grepQuiet Hello
|
|
NIX_ABORT_ON_WARN=1 expectStderr 1 nix-instantiate --eval -E 'builtins.addErrorContext "while doing ${"something"} interesting" (builtins.warn "Hello" 123)' | grepQuiet "while doing something interesting"
|
|
|
|
set +x
|
|
|
|
badDiff=0
|
|
badExitCode=0
|
|
|
|
for i in lang/parse-fail-*.nix; do
|
|
echo "parsing $i (should fail)";
|
|
i=$(basename "$i" .nix)
|
|
if expectStderr 1 nix-instantiate --parse - < "lang/$i.nix" > "lang/$i.err"
|
|
then
|
|
diffAndAccept "$i" err err.exp
|
|
else
|
|
echo "FAIL: $i shouldn't parse"
|
|
badExitCode=1
|
|
fi
|
|
done
|
|
|
|
for i in lang/parse-okay-*.nix; do
|
|
echo "parsing $i (should succeed)";
|
|
i=$(basename "$i" .nix)
|
|
if
|
|
expect 0 nix-instantiate --parse - < "lang/$i.nix" \
|
|
1> "lang/$i.out" \
|
|
2> "lang/$i.err"
|
|
then
|
|
sed "s!$(pwd)!/pwd!g" "lang/$i.out" "lang/$i.err"
|
|
diffAndAccept "$i" out exp
|
|
diffAndAccept "$i" err err.exp
|
|
else
|
|
echo "FAIL: $i should parse"
|
|
badExitCode=1
|
|
fi
|
|
done
|
|
|
|
for i in lang/eval-fail-*.nix; do
|
|
echo "evaluating $i (should fail)";
|
|
i=$(basename "$i" .nix)
|
|
flags="$(
|
|
if [[ -e "lang/$i.flags" ]]; then
|
|
sed -e 's/#.*//' < "lang/$i.flags"
|
|
else
|
|
# note that show-trace is also set by common/init.sh
|
|
echo "--eval --strict --show-trace"
|
|
fi
|
|
)"
|
|
if
|
|
expectStderr 1 nix-instantiate $flags "lang/$i.nix" \
|
|
| sed "s!$(pwd)!/pwd!g" > "lang/$i.err"
|
|
then
|
|
diffAndAccept "$i" err err.exp
|
|
else
|
|
echo "FAIL: $i shouldn't evaluate"
|
|
badExitCode=1
|
|
fi
|
|
done
|
|
|
|
for i in lang/eval-okay-*.nix; do
|
|
echo "evaluating $i (should succeed)";
|
|
i=$(basename "$i" .nix)
|
|
|
|
if test -e "lang/$i.exp.xml"; then
|
|
if expect 0 nix-instantiate --eval --xml --no-location --strict \
|
|
"lang/$i.nix" > "lang/$i.out.xml"
|
|
then
|
|
diffAndAccept "$i" out.xml exp.xml
|
|
else
|
|
echo "FAIL: $i should evaluate"
|
|
badExitCode=1
|
|
fi
|
|
elif test ! -e "lang/$i.exp-disabled"; then
|
|
declare -a flags=()
|
|
if test -e "lang/$i.flags"; then
|
|
read -r -a flags < "lang/$i.flags"
|
|
fi
|
|
|
|
if
|
|
expect 0 env \
|
|
NIX_PATH=lang/dir3:lang/dir4 \
|
|
HOME=/fake-home \
|
|
nix-instantiate "${flags[@]}" --eval --strict "lang/$i.nix" \
|
|
1> "lang/$i.out" \
|
|
2> "lang/$i.err"
|
|
then
|
|
sed -i "s!$(pwd)!/pwd!g" "lang/$i.out" "lang/$i.err"
|
|
diffAndAccept "$i" out exp
|
|
diffAndAccept "$i" err err.exp
|
|
else
|
|
echo "FAIL: $i should evaluate"
|
|
badExitCode=1
|
|
fi
|
|
fi
|
|
done
|
|
|
|
if test -n "${_NIX_TEST_ACCEPT-}"; then
|
|
if (( "$badDiff" )); then
|
|
echo 'Output did mot match, but accepted output as the persisted expected output.'
|
|
echo 'That means the next time the tests are run, they should pass.'
|
|
else
|
|
echo 'NOTE: Environment variable _NIX_TEST_ACCEPT is defined,'
|
|
echo 'indicating the unexpected output should be accepted as the expected output going forward,'
|
|
echo 'but no tests had unexpected output so there was no expected output to update.'
|
|
fi
|
|
if (( "$badExitCode" )); then
|
|
exit "$badExitCode"
|
|
else
|
|
skipTest "regenerating golden masters"
|
|
fi
|
|
else
|
|
if (( "$badDiff" )); then
|
|
echo ''
|
|
echo 'You can rerun this test with:'
|
|
echo ''
|
|
echo ' _NIX_TEST_ACCEPT=1 make tests/functional/lang.sh.test'
|
|
echo ''
|
|
echo 'to regenerate the files containing the expected output,'
|
|
echo 'and then view the git diff to decide whether a change is'
|
|
echo 'good/intentional or bad/unintentional.'
|
|
echo 'If the diff contains arbitrary or impure information,'
|
|
echo 'please improve the normalization that the test applies to the output.'
|
|
fi
|
|
exit $(( "$badExitCode" + "$badDiff" ))
|
|
fi
|