-
-
Notifications
You must be signed in to change notification settings - Fork 15.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
testers.testBuildFailure': init (#383511)
- Loading branch information
Showing
7 changed files
with
317 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
47 changes: 47 additions & 0 deletions
47
pkgs/build-support/testers/testBuildFailurePrime/build-command.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# shellcheck shell=bash | ||
|
||
set -eu | ||
|
||
declare -ag preScriptHooks=(testBuilderExitCode) | ||
# shellcheck disable=SC2154 | ||
((${#expectedBuilderLogEntries[@]})) && preScriptHooks+=(testBuilderLogEntries) | ||
|
||
testBuilderExitCode() { | ||
nixLog "checking original builder exit code" | ||
local -ir builderExitCode=$(<"${failed:?}/testBuildFailure.exit") | ||
# shellcheck disable=SC2154 | ||
if ((expectedBuilderExitCode == builderExitCode)); then | ||
nixLog "original builder exit code matches expected value of $expectedBuilderExitCode" | ||
return 0 | ||
else | ||
nixErrorLog "original builder produced exit code $builderExitCode but was expected to produce $expectedBuilderExitCode" | ||
return 1 | ||
fi | ||
} | ||
|
||
testBuilderLogEntries() { | ||
nixLog "checking original builder log" | ||
local -r builderLogEntries="$(<"${failed:?}/testBuildFailure.log")" | ||
local -i shouldExit=0 | ||
local expectedBuilderLogEntry | ||
for expectedBuilderLogEntry in "${expectedBuilderLogEntries[@]}"; do | ||
if [[ ${builderLogEntries} == *"$expectedBuilderLogEntry"* ]]; then | ||
nixLog "original builder log contains ${expectedBuilderLogEntry@Q}" | ||
else | ||
nixErrorLog "original builder log does not contain ${expectedBuilderLogEntry@Q}" | ||
shouldExit=1 | ||
fi | ||
done | ||
return $shouldExit | ||
} | ||
|
||
scriptPhase() { | ||
runHook preScript | ||
|
||
runHook script | ||
|
||
runHook postScript | ||
} | ||
|
||
runHook scriptPhase | ||
touch "${out:?}" |
37 changes: 37 additions & 0 deletions
37
pkgs/build-support/testers/testBuildFailurePrime/default.nix
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
{ | ||
lib, | ||
stdenvNoCC, | ||
testers, | ||
}: | ||
# See https://nixos.org/manual/nixpkgs/unstable/#tester-testBuildFailurePrime | ||
# or doc/build-helpers/testers.chapter.md | ||
lib.makeOverridable ( | ||
{ | ||
drv, | ||
name ? "testBuildFailure-${drv.name}", | ||
expectedBuilderExitCode ? 1, | ||
expectedBuilderLogEntries ? [ ], | ||
script ? "", | ||
}: | ||
stdenvNoCC.mkDerivation (finalAttrs: { | ||
__structuredAttrs = true; | ||
strictDeps = true; | ||
|
||
inherit name; | ||
|
||
nativeBuildInputs = [ finalAttrs.failed ]; | ||
|
||
failed = testers.testBuildFailure drv; | ||
|
||
inherit expectedBuilderExitCode expectedBuilderLogEntries; | ||
|
||
inherit script; | ||
|
||
buildCommandPath = ./build-command.sh; | ||
|
||
meta = { | ||
description = "A wrapper around testers.testBuildFailure to simplify common use cases"; | ||
maintainers = [ lib.maintainers.connorbaker ]; | ||
}; | ||
}) | ||
) |
149 changes: 149 additions & 0 deletions
149
pkgs/build-support/testers/testBuildFailurePrime/tests.nix
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,149 @@ | ||
{ | ||
emptyDirectory, | ||
hello, | ||
lib, | ||
overrideStructuredAttrs, | ||
runCommand, | ||
stdenvNoCC, | ||
testers, | ||
}: | ||
let | ||
inherit (lib.attrsets) recurseIntoAttrs; | ||
final = { | ||
# NOTE: This example is used in the docs. | ||
# See https://nixos.org/manual/nixpkgs/unstable/#tester-testBuildFailurePrime | ||
# or doc/build-helpers/testers.chapter.md | ||
doc-example = testers.testBuildFailure' { | ||
drv = runCommand "doc-example" { } '' | ||
echo ok-ish >"$out" | ||
echo failing though | ||
exit 3 | ||
''; | ||
expectedBuilderExitCode = 3; | ||
expectedBuilderLogEntries = [ "failing though" ]; | ||
script = '' | ||
grep --silent -F 'ok-ish' "$failed/result" | ||
''; | ||
}; | ||
|
||
happy = testers.testBuildFailure' { | ||
drv = runCommand "happy" { } '' | ||
echo ok-ish >$out | ||
echo failing though | ||
echo also stderr 1>&2 | ||
echo 'line\nwith-\bbackslashes' | ||
printf "incomplete line - no newline" | ||
exit 3 | ||
''; | ||
expectedBuilderExitCode = 3; | ||
expectedBuilderLogEntries = [ | ||
"failing though" | ||
"also stderr" | ||
''line\nwith-\bbackslashes'' | ||
"incomplete line - no newline" | ||
]; | ||
script = '' | ||
grep --silent -F 'ok-ish' "$failed/result" | ||
''; | ||
}; | ||
|
||
happyStructuredAttrs = overrideStructuredAttrs true final.happy; | ||
|
||
helloDoesNotFail = testers.testBuildFailure' { | ||
drv = testers.testBuildFailure hello; | ||
expectedBuilderLogEntries = [ | ||
"testBuildFailure: The builder did not fail, but a failure was expected" | ||
]; | ||
}; | ||
|
||
multiOutput = testers.testBuildFailure' { | ||
drv = | ||
runCommand "multiOutput" | ||
{ | ||
# dev will be the default output | ||
outputs = [ | ||
"dev" | ||
"doc" | ||
"out" | ||
]; | ||
} | ||
'' | ||
echo i am failing | ||
exit 1 | ||
''; | ||
expectedBuilderLogEntries = [ | ||
"i am failing" | ||
]; | ||
script = '' | ||
# Checking our note that dev is the default output | ||
echo $failed/_ | grep -- '-dev/_' >/dev/null | ||
echo 'All good.' | ||
''; | ||
}; | ||
|
||
multiOutputStructuredAttrs = overrideStructuredAttrs true final.multiOutput; | ||
|
||
sideEffects = testers.testBuildFailure' { | ||
drv = stdenvNoCC.mkDerivation { | ||
name = "fail-with-side-effects"; | ||
src = emptyDirectory; | ||
|
||
postHook = '' | ||
echo touching side-effect... | ||
# Assert that the side-effect doesn't exist yet... | ||
# We're checking that this hook isn't run by expect-failure.sh | ||
if [[ -e side-effect ]]; then | ||
echo "side-effect already exists" | ||
exit 1 | ||
fi | ||
touch side-effect | ||
''; | ||
|
||
buildPhase = '' | ||
echo i am failing | ||
exit 1 | ||
''; | ||
}; | ||
expectedBuilderLogEntries = [ | ||
"touching side-effect..." | ||
"i am failing" | ||
]; | ||
script = '' | ||
[[ ! -e side-effect ]] | ||
''; | ||
}; | ||
|
||
sideEffectsStructuredAttrs = overrideStructuredAttrs true final.sideEffects; | ||
|
||
exitCodeNegativeTest = testers.testBuildFailure' { | ||
drv = testers.testBuildFailure' { | ||
drv = runCommand "exit-code" { } "exit 3"; | ||
# Default expected exit code is 1 | ||
}; | ||
expectedBuilderLogEntries = [ | ||
"ERROR: testBuilderExitCode: original builder produced exit code 3 but was expected to produce 1" | ||
]; | ||
}; | ||
|
||
exitCodeNegativeTestStructuredAttrs = overrideStructuredAttrs true final.exitCodeNegativeTest; | ||
|
||
logNegativeTest = testers.testBuildFailure' { | ||
drv = testers.testBuildFailure' { | ||
drv = runCommand "exit-code" { } '' | ||
nixLog "apples" | ||
exit 3 | ||
''; | ||
expectedBuilderExitCode = 3; | ||
expectedBuilderLogEntries = [ "bees" ]; | ||
}; | ||
expectedBuilderLogEntries = [ | ||
"ERROR: testBuilderLogEntries: original builder log does not contain 'bees'" | ||
]; | ||
}; | ||
|
||
logNegativeTestStructuredAttrs = overrideStructuredAttrs true final.logNegativeTest; | ||
}; | ||
in | ||
recurseIntoAttrs final |