diff options
author | Robert Hensing <roberth@users.noreply.github.com> | 2023-12-09 14:45:20 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-09 14:45:20 +0100 |
commit | 6ac78f1174be76d961c393d0d1b61967243cf010 (patch) | |
tree | 66baec84ea0d44c94636797a660987846267cb85 | |
parent | 676285f3fa53756925885f02f21b040ae0bba7df (diff) | |
parent | 7950a226f6580beddf86b4b1bca808e0dc053946 (diff) |
Merge pull request #204462 from ShamrockLee/test-references
tests.trivial-builders.references: refactor and move expressions into trivial-builders/test/references
10 files changed, 225 insertions, 159 deletions
diff --git a/pkgs/build-support/trivial-builders/test/default.nix b/pkgs/build-support/trivial-builders/test/default.nix index cbd1b388ef666..59dbba3f18410 100644 --- a/pkgs/build-support/trivial-builders/test/default.nix +++ b/pkgs/build-support/trivial-builders/test/default.nix @@ -14,21 +14,24 @@ { callPackage, lib, stdenv }: let inherit (lib) recurseIntoAttrs; + references = callPackage ./references {}; in recurseIntoAttrs { concat = callPackage ./concat-test.nix {}; linkFarm = callPackage ./link-farm.nix {}; overriding = callPackage ../test-overriding.nix {}; + # VM test not supported beyond linux yet references = - # VM test not supported beyond linux yet if stdenv.hostPlatform.isLinux - then callPackage ./references.nix {} - else null; + then references + else {}; writeCBin = callPackage ./writeCBin.nix {}; writeShellApplication = callPackage ./writeShellApplication.nix {}; writeScriptBin = callPackage ./writeScriptBin.nix {}; writeShellScript = callPackage ./write-shell-script.nix {}; writeShellScriptBin = callPackage ./writeShellScriptBin.nix {}; - writeStringReferencesToFile = callPackage ./writeStringReferencesToFile.nix {}; + writeStringReferencesToFile = callPackage ./writeStringReferencesToFile.nix { + inherit (references) samples; + }; writeTextFile = callPackage ./write-text-file.nix {}; } diff --git a/pkgs/build-support/trivial-builders/test/invoke-writeDirectReferencesToFile.nix b/pkgs/build-support/trivial-builders/test/invoke-writeDirectReferencesToFile.nix deleted file mode 100644 index ead3f7a2f5712..0000000000000 --- a/pkgs/build-support/trivial-builders/test/invoke-writeDirectReferencesToFile.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ 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 deleted file mode 100644 index 99c6c2f7dcc43..0000000000000 --- a/pkgs/build-support/trivial-builders/test/invoke-writeReferencesToFile.nix +++ /dev/null @@ -1,4 +0,0 @@ -{ 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/references-test.sh b/pkgs/build-support/trivial-builders/test/references-test.sh deleted file mode 100755 index 473ca6e107694..0000000000000 --- a/pkgs/build-support/trivial-builders/test/references-test.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env bash - -# -------------------------------------------------------------------------- # -# -# trivial-builders test -# -# -------------------------------------------------------------------------- # -# -# This file can be run independently (quick): -# -# $ pkgs/build-support/trivial-builders/references-test.sh -# -# or in the build sandbox with a ~20s VM overhead -# -# $ nix-build -A tests.trivial-builders.references -# -# -------------------------------------------------------------------------- # - -# strict bash -set -euo pipefail - -# debug -# set -x -# PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' - -cd "$(dirname ${BASH_SOURCE[0]})" # nixpkgs root - -if [[ -z ${SAMPLE:-} ]]; then - echo "Running the script directly is currently not supported." - echo "If you need to iterate, remove the raw path, which is not returned by nix-build." - exit 1 -# sample=( `nix-build --no-out-link sample.nix` ) -# directRefs=( `nix-build --no-out-link invoke-writeDirectReferencesToFile.nix` ) -# references=( `nix-build --no-out-link invoke-writeReferencesToFile.nix` ) -# echo "sample: ${#sample[@]}" -# echo "direct: ${#directRefs[@]}" -# echo "indirect: ${#references[@]}" -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 <${directRefs[$i]}) \ - <(nix-store -q --references ${sample[$i]} | sort) -done - -echo >&2 Testing closure... -for i in "${!sample[@]}"; do - echo >&2 Checking '#'$i ${sample[$i]} ${references[$i]} - diff -U3 \ - <(sort <${references[$i]}) \ - <(nix-store -q --requisites ${sample[$i]} | sort) -done - -echo 'OK!' diff --git a/pkgs/build-support/trivial-builders/test/references.nix b/pkgs/build-support/trivial-builders/test/references.nix deleted file mode 100644 index 7c8ea83f3c8bf..0000000000000 --- a/pkgs/build-support/trivial-builders/test/references.nix +++ /dev/null @@ -1,52 +0,0 @@ -{ lib, testers, pkgs, writeText, hello, figlet, stdenvNoCC }: - -# -------------------------------------------------------------------------- # -# -# trivial-builders test -# -# -------------------------------------------------------------------------- # -# -# This file can be run independently (quick): -# -# $ pkgs/build-support/trivial-builders/references-test.sh -# -# or in the build sandbox with a ~20s VM overhead -# -# $ nix-build -A tests.trivial-builders.references -# -# -------------------------------------------------------------------------- # - -let - invokeSamples = file: - lib.concatStringsSep " " ( - lib.attrValues (import file { inherit pkgs; }) - ); -in -testers.nixosTest { - name = "nixpkgs-trivial-builders"; - nodes.machine = { ... }: { - virtualisation.writableStore = true; - - # Test runs without network, so we don't substitute and prepare our deps - nix.settings.substituters = lib.mkForce []; - environment.etc."pre-built-paths".source = writeText "pre-built-paths" ( - builtins.toJSON [hello figlet stdenvNoCC] - ); - environment.variables = { - SAMPLE = invokeSamples ./sample.nix; - REFERENCES = invokeSamples ./invoke-writeReferencesToFile.nix; - DIRECT_REFS = invokeSamples ./invoke-writeDirectReferencesToFile.nix; - }; - }; - testScript = - '' - machine.succeed(""" - ${./references-test.sh} 2>/dev/console - """) - ''; - meta = { - maintainers = with lib.maintainers; [ - roberth - ]; - }; -} diff --git a/pkgs/build-support/trivial-builders/test/references/default.nix b/pkgs/build-support/trivial-builders/test/references/default.nix new file mode 100644 index 0000000000000..3e21c905321e4 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/references/default.nix @@ -0,0 +1,124 @@ +{ lib +, stdenvNoCC +, testers +, callPackage +, writeText + # nativeBuildInputs +, shellcheck-minimal + # Samples +, samples ? cleanSamples (callPackage ./samples.nix { }) + # Filter out the non-string-like attributes such as <pkg>.override added by + # callPackage. +, cleanSamples ? lib.filterAttrs (n: lib.isStringLike) + # Test targets +, writeDirectReferencesToFile +, writeReferencesToFile +}: + +# -------------------------------------------------------------------------- # +# +# trivial-builders test +# +# -------------------------------------------------------------------------- # +# +# Execute this build script directly (quick): +# +# * Classic +# $ NIX_PATH="nixpkgs=$PWD" nix-shell -p tests.trivial-builders.references.testScriptBin --run references-test +# +# * Flake-based +# $ nix run .#tests.trivial-builders.references.testScriptBin +# +# or in the build sandbox with a ~20s VM overhead: +# +# * Classic +# $ nix-build --no-out-link -A tests.trivial-builders.references +# +# * Flake-based +# $ nix build -L --no-link .#tests.trivial-builders.references +# +# -------------------------------------------------------------------------- # + +let + # Map each attribute to an element specification of Bash associative arrary + # and concatenate them with white spaces, to be used to define a + # one-line Bash associative array. + samplesToString = attrs: + lib.concatMapStringsSep " " (name: "[${name}]=${lib.escapeShellArg "${attrs.${name}}"}") (builtins.attrNames attrs); + + references = lib.mapAttrs (n: v: writeReferencesToFile v) samples; + directReferences = lib.mapAttrs (n: v: writeDirectReferencesToFile v) samples; + + testScriptBin = stdenvNoCC.mkDerivation (finalAttrs: { + name = "references-test"; + + src = ./references-test.sh; + dontUnpack = true; + dontBuild = true; + + installPhase = '' + runHook preInstall + mkdir -p "$out/bin" + substitute "$src" "$out/bin/${finalAttrs.meta.mainProgram}" \ + --replace "@SAMPLES@" ${lib.escapeShellArg (samplesToString samples)} \ + --replace "@REFERENCES@" ${lib.escapeShellArg (samplesToString references)} \ + --replace "@DIRECT_REFS@" ${lib.escapeShellArg (samplesToString directReferences)} + runHook postInstall + chmod +x "$out/bin/${finalAttrs.meta.mainProgram}" + ''; + + doInstallCheck = true; + nativeInstallCheckInputs = [ + shellcheck-minimal + ]; + installCheckPhase = '' + runHook preInstallCheck + shellcheck "$out/bin/${finalAttrs.meta.mainProgram}" + runHook postInstallCheck + ''; + + passthru = { + inherit + directReferences + references + samples + ; + }; + + meta = with lib; { + mainProgram = "references-test"; + }; + }); +in +testers.nixosTest { + name = "nixpkgs-trivial-builders"; + nodes.machine = { ... }: { + virtualisation.writableStore = true; + + # Test runs without network, so we don't substitute and prepare our deps + nix.settings.substituters = lib.mkForce [ ]; + environment.etc."pre-built-paths".source = writeText "pre-built-paths" ( + builtins.toJSON [ testScriptBin ] + ); + }; + testScript = + '' + machine.succeed(""" + ${lib.getExe testScriptBin} 2>/dev/console + """) + ''; + passthru = { + inherit + directReferences + references + samples + testScriptBin + ; + }; + meta = { + maintainers = with lib.maintainers; [ + roberth + ShamrockLee + ]; + }; +} diff --git a/pkgs/build-support/trivial-builders/test/references/references-test.sh b/pkgs/build-support/trivial-builders/test/references/references-test.sh new file mode 100755 index 0000000000000..1b8f8e1504ec8 --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/references/references-test.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +# -------------------------------------------------------------------------- # +# +# trivial-builders test +# +# -------------------------------------------------------------------------- # +# +# Execute this build script directly (quick): +# +# * Classic +# $ NIX_PATH="nixpkgs=$PWD" nix-shell -p tests.trivial-builders.references.testScriptBin --run references-test +# +# * Flake-based +# $ nix run .#tests.trivial-builders.references.testScriptBin +# +# or in the build sandbox with a ~20s VM overhead: +# +# * Classic +# $ nix-build --no-out-link -A tests.trivial-builders.references +# +# * Flake-based +# $ nix build -L --no-link .#tests.trivial-builders.references +# +# -------------------------------------------------------------------------- # + +# strict bash +set -euo pipefail + +# debug +# set -x +# PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' + +cd "$(dirname "${BASH_SOURCE[0]}")" # nixpkgs root + + # Injected by Nix (to avoid evaluating in a derivation) + # turn them into arrays + # shellcheck disable=SC2206 # deliberately unquoted + declare -A samples=( @SAMPLES@ ) + # shellcheck disable=SC2206 # deliberately unquoted + declare -A directRefs=( @DIRECT_REFS@ ) + # shellcheck disable=SC2206 # deliberately unquoted + declare -A references=( @REFERENCES@ ) + +echo >&2 Testing direct references... +for i in "${!samples[@]}"; do + echo >&2 Checking "$i" "${samples[$i]}" "${directRefs[$i]}" + diff -U3 \ + <(sort <"${directRefs[$i]}") \ + <(nix-store -q --references "${samples[$i]}" | sort) +done + +echo >&2 Testing closure... +for i in "${!samples[@]}"; do + echo >&2 Checking "$i" "${samples[$i]}" "${references[$i]}" + diff -U3 \ + <(sort <"${references[$i]}") \ + <(nix-store -q --requisites "${samples[$i]}" | sort) +done + +echo 'OK!' diff --git a/pkgs/build-support/trivial-builders/test/references/samples.nix b/pkgs/build-support/trivial-builders/test/references/samples.nix new file mode 100644 index 0000000000000..3afb970c08aeb --- /dev/null +++ b/pkgs/build-support/trivial-builders/test/references/samples.nix @@ -0,0 +1,30 @@ +{ lib +, runCommand +, writeText +, emptyFile +, emptyDirectory +, figlet +, hello +, zlib +}: +{ + inherit + figlet + hello + zlib + ; + zlib-dev = zlib.dev; + norefs = writeText "hi" "hello"; + norefsDup = writeText "hi" "hello"; + helloRef = writeText "hi" "hello ${hello}"; + helloRefDup = writeText "hi" "hello ${hello}"; + path = ./samples.nix; + pathLike.outPath = ./samples.nix; + helloFigletRef = writeText "hi" "hello ${hello} ${figlet}"; + selfRef = runCommand "self-ref-1" { } "echo $out >$out"; + selfRef2 = runCommand "self-ref-2" { } ''echo "${figlet}, $out" >$out''; + inherit + emptyFile + emptyDirectory + ; +} diff --git a/pkgs/build-support/trivial-builders/test/sample.nix b/pkgs/build-support/trivial-builders/test/sample.nix deleted file mode 100644 index a4eedce8417eb..0000000000000 --- a/pkgs/build-support/trivial-builders/test/sample.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ pkgs ? import ../../../.. { config = { }; overlays = [ ]; } }: -let - inherit (pkgs) - figlet - zlib - hello - writeText - runCommand - ; -in -{ - hello = hello; - figlet = figlet; - zlib = zlib; - zlib-dev = zlib.dev; - norefs = writeText "hi" "hello"; - norefsDup = writeText "hi" "hello"; - helloRef = writeText "hi" "hello ${hello}"; - helloRefDup = writeText "hi" "hello ${hello}"; - path = ./invoke-writeReferencesToFile.nix; - pathLike.outPath = ./invoke-writeReferencesToFile.nix; - helloFigletRef = writeText "hi" "hello ${hello} ${figlet}"; - selfRef = runCommand "self-ref-1" {} "echo $out >$out"; - selfRef2 = runCommand "self-ref-2" {} ''echo "${figlet}, $out" >$out''; - inherit (pkgs) - emptyFile - emptyDirectory - ; -} diff --git a/pkgs/build-support/trivial-builders/test/writeStringReferencesToFile.nix b/pkgs/build-support/trivial-builders/test/writeStringReferencesToFile.nix index b93b43b74aa49..dedd7e183a178 100644 --- a/pkgs/build-support/trivial-builders/test/writeStringReferencesToFile.nix +++ b/pkgs/build-support/trivial-builders/test/writeStringReferencesToFile.nix @@ -1,14 +1,13 @@ -{ callPackage, lib, pkgs, runCommand, writeText, writeStringReferencesToFile }: +{ callPackage, lib, pkgs, runCommand, samples, writeText, writeStringReferencesToFile }: let - sample = import ./sample.nix { inherit pkgs; }; - samplePaths = lib.unique (lib.attrValues sample); + samplePaths = lib.unique (lib.attrValues samples); stri = x: "${x}"; sampleText = writeText "sample-text" (lib.concatStringsSep "\n" (lib.unique (map stri samplePaths))); stringReferencesText = writeStringReferencesToFile ((lib.concatMapStringsSep "fillertext" stri - (lib.attrValues sample)) + '' + (lib.attrValues samples)) + '' STORE=${builtins.storeDir};\nsystemctl start bar-foo.service ''); in |