From 35406647fd02a7f0a5dd7fa25556c092313d5493 Mon Sep 17 00:00:00 2001 From: Robert Hensing Date: Wed, 19 May 2021 01:02:50 +0200 Subject: [PATCH] tests.trivial: Avoid evaluation and ${pkgs.path} dep > There is an issue in the test added by #123111. > [it] introduces a dependency on the contents of nixpkgs, > making every change evaluate with a different hash. --- pkgs/build-support/trivial-builders/test.nix | 32 ++++++++++-- pkgs/build-support/trivial-builders/test.sh | 49 +++++++++---------- .../invoke-writeDirectReferencesToFile.nix | 4 ++ .../test/invoke-writeReferencesToFile.nix | 4 ++ .../trivial-builders/test/sample.nix | 15 ++++++ 5 files changed, 76 insertions(+), 28 deletions(-) create mode 100644 pkgs/build-support/trivial-builders/test/invoke-writeDirectReferencesToFile.nix create mode 100644 pkgs/build-support/trivial-builders/test/invoke-writeReferencesToFile.nix create mode 100644 pkgs/build-support/trivial-builders/test/sample.nix diff --git a/pkgs/build-support/trivial-builders/test.nix b/pkgs/build-support/trivial-builders/test.nix index 0902a537222..cdc16b8af34 100644 --- a/pkgs/build-support/trivial-builders/test.nix +++ b/pkgs/build-support/trivial-builders/test.nix @@ -1,5 +1,27 @@ -{ lib, nixosTest, path, writeText, hello, figlet, stdenvNoCC }: +{ lib, nixosTest, pkgs, writeText, hello, figlet, stdenvNoCC }: +# -------------------------------------------------------------------------- # +# +# trivial-builders test +# +# -------------------------------------------------------------------------- # +# +# This file can be run independently (quick): +# +# $ pkgs/build-support/trivial-builders/test.sh +# +# or in the build sandbox with a ~20s VM overhead +# +# $ nix-build -A tests.trivial-builders +# +# -------------------------------------------------------------------------- # + +let + invokeSamples = file: + lib.concatStringsSep " " ( + lib.attrValues (import file { inherit pkgs; }) + ); +in nixosTest { name = "nixpkgs-trivial-builders"; nodes.machine = { ... }: { @@ -10,11 +32,15 @@ nixosTest { environment.etc."pre-built-paths".source = writeText "pre-built-paths" ( builtins.toJSON [hello figlet stdenvNoCC] ); + environment.variables = { + SAMPLE = invokeSamples ./test/sample.nix; + REFERENCES = invokeSamples ./test/invoke-writeReferencesToFile.nix; + DIRECT_REFS = invokeSamples ./test/invoke-writeDirectReferencesToFile.nix; + }; }; testScript = '' machine.succeed(""" - cd ${lib.cleanSource path} - ./pkgs/build-support/trivial-builders/test.sh 2>/dev/console + ${./test.sh} 2>/dev/console """) ''; } diff --git a/pkgs/build-support/trivial-builders/test.sh b/pkgs/build-support/trivial-builders/test.sh index 3e21b000815..b7c4726a9be 100755 --- a/pkgs/build-support/trivial-builders/test.sh +++ b/pkgs/build-support/trivial-builders/test.sh @@ -25,33 +25,32 @@ set -euo pipefail cd "$(dirname ${BASH_SOURCE[0]})" # nixpkgs root -testDirectReferences() { - expr="$1" +if [[ -z ${SAMPLE:-} ]]; then + sample=( `nix-build test/sample.nix` ) + directRefs=( `nix-build test/invoke-writeDirectReferencesToFile.nix` ) + references=( `nix-build test/invoke-writeReferencesToFile.nix` ) +else + # Injected by Nix (to avoid evaluating in a derivation) + # turn them into arrays + sample=($SAMPLE) + directRefs=($DIRECT_REFS) + references=($REFERENCES) +fi + +echo >&2 Testing direct references... +for i in "${!sample[@]}"; do + echo >&2 Checking '#'$i ${sample[$i]} ${directRefs[$i]} diff -U3 \ - <(sort <$(nix-build --no-out-link --expr "with import ../../.. {}; writeDirectReferencesToFile ($expr)")) \ - <(nix-store -q --references $(nix-build --no-out-link --expr "with import ../../.. {}; ($expr)") | sort) -} + <(sort <${directRefs[$i]}) \ + <(nix-store -q --references ${sample[$i]} | sort) +done -testDirectReferences 'hello' -testDirectReferences 'figlet' -testDirectReferences 'writeText "hi" "hello"' -testDirectReferences 'writeText "hi" "hello ${hello}"' -testDirectReferences 'writeText "hi" "hello ${hello} ${figlet}"' - - - -testClosure() { - expr="$1" +echo >&2 Testing closure... +for i in "${!sample[@]}"; do + echo >&2 Checking '#'$i ${sample[$i]} ${references[$i]} diff -U3 \ - <(sort <$(nix-build --no-out-link --expr "with import ../../.. {}; writeReferencesToFile ($expr)")) \ - <(nix-store -q --requisites $(nix-build --no-out-link --expr "with import ../../.. {}; ($expr)") | sort) -} - -testClosure 'hello' -testClosure 'figlet' -testClosure 'writeText "hi" "hello"' -testClosure 'writeText "hi" "hello ${hello}"' -testClosure 'writeText "hi" "hello ${hello} ${figlet}"' - + <(sort <${references[$i]}) \ + <(nix-store -q --requisites ${sample[$i]} | sort) +done echo 'OK!' diff --git a/pkgs/build-support/trivial-builders/test/invoke-writeDirectReferencesToFile.nix b/pkgs/build-support/trivial-builders/test/invoke-writeDirectReferencesToFile.nix new file mode 100644 index 00000000000..ead3f7a2f57 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/invoke-writeDirectReferencesToFile.nix @@ -0,0 +1,4 @@ +{ pkgs ? import ../../../.. { config = {}; overlays = []; } }: +pkgs.lib.mapAttrs + (k: v: pkgs.writeDirectReferencesToFile v) + (import ./sample.nix { inherit pkgs; }) diff --git a/pkgs/build-support/trivial-builders/test/invoke-writeReferencesToFile.nix b/pkgs/build-support/trivial-builders/test/invoke-writeReferencesToFile.nix new file mode 100644 index 00000000000..99c6c2f7dcc --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/invoke-writeReferencesToFile.nix @@ -0,0 +1,4 @@ +{ pkgs ? import ../../../.. { config = {}; overlays = []; } }: +pkgs.lib.mapAttrs + (k: v: pkgs.writeReferencesToFile v) + (import ./sample.nix { inherit pkgs; }) diff --git a/pkgs/build-support/trivial-builders/test/sample.nix b/pkgs/build-support/trivial-builders/test/sample.nix new file mode 100644 index 00000000000..060be011093 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/sample.nix @@ -0,0 +1,15 @@ +{ pkgs ? import ../../../.. { config = {}; overlays = []; } }: +let + inherit (pkgs) + figlet + hello + writeText + ; +in +{ + hello = hello; + figlet = figlet; + norefs = writeText "hi" "hello"; + helloRef = writeText "hi" "hello ${hello}"; + helloFigletRef = writeText "hi" "hello ${hello} ${figlet}"; +}