Files
nix/tests/functional/dyn-drv/failing-outer.sh

49 lines
1.8 KiB
Bash

#!/usr/bin/env bash
source common.sh
# Store layer needs bugfix
requireDaemonNewerThan "2.30pre20250515"
expected=100
if [[ -v NIX_DAEMON_PACKAGE ]]; then expected=1; fi # work around the daemon not returning a 100 status correctly
expectStderr "$expected" nix-build ./text-hashed-output.nix -A failingWrapper --no-out-link \
| grepQuiet "build of resolved derivation '.*use-dynamic-drv-in-non-dynamic-drv-wrong.drv' failed"
# Test that error messages are not empty when a producer derivation fails.
# This exercises the nrFailed path in DerivationTrampolineGoal::init().
#
# Using `nix build --expr` with builtins.outputOf creates a top-level
# DerivationTrampolineGoal that goes through buildPathsWithResults.
# When the producer fails, the nrFailed path must use doneFailure (not amDone)
# to set buildResult.inner with a proper error message.
#
# Without the fix, the error message would be empty because amDone doesn't
# set buildResult.inner, so rethrow() throws Error("") - an empty message.
out=$(nix build --impure --no-link --expr '
let
config = import (builtins.getEnv "_NIX_TEST_BUILD_DIR" + "/config.nix");
inherit (config) mkDerivation;
# A CA derivation that fails before producing a .drv
failingProducer = mkDerivation {
name = "failing-producer";
buildCommand = "echo This producer fails; exit 1";
__contentAddressed = true;
outputHashMode = "text";
outputHashAlgo = "sha256";
};
in
# Build the dynamic derivation output directly - this creates a top-level
# DerivationTrampolineGoal, not a nested one inside a DerivationGoal
builtins.outputOf failingProducer.outPath "out"
' 2>&1) || true
# Store layer needs bugfix
requireDaemonNewerThan "2.34pre"
# The error message must NOT be empty - it should mention the failed derivation
echo "$out" | grepQuiet "failed to obtain derivation of"