about summary refs log tree commit diff
path: root/pkgs/build-support/trivial-builders/test
diff options
context:
space:
mode:
authorYueh-Shun Li <shamrocklee@posteo.net>2023-07-14 05:19:15 +0800
committerYueh-Shun Li <shamrocklee@posteo.net>2023-12-07 22:28:30 +0000
commit79a1e9d729d3703945b2cd46c725ba1f0255a358 (patch)
treecba133d816587f96f13831be0335c474440599de /pkgs/build-support/trivial-builders/test
parent1d56e7909d692b4a8cd52d8d503391e63f279c7a (diff)
tests.trivial-builders.references: refactor expression
Define package `testScriptBin` that contains the substituted test script.
* Add an `installCheckPhase` to check the result script with ShellCheck.
* Passthru as `references.testScriptBin` to run the
  (substituted) test script directly (without VM).
* Drop the logic in build script that detects if
  it is run in the Nix sandbox.
* Inline sample application; drop invoke-*.nix.

Format expressions.
* Format with `nixpkgs-fmt`.
* Use multi-line style of set patterns.

Call the samples with `callPackage`.
* Rename `sample` -> `samples`.
* Take individual packages / build helpers directly from the
  set pattern.
* Define `cleanSamples` to filter out overriders such as `<pkg>.override`.
  added by `callPackage`.

Passthru samples and invocation results for easier debugging.
* Passthru samples, references, directReferences
* Provide tests.trivial-builders.writeStringReferencesToFile with such
  samples argument.
Diffstat (limited to 'pkgs/build-support/trivial-builders/test')
-rw-r--r--pkgs/build-support/trivial-builders/test/default.nix9
-rw-r--r--pkgs/build-support/trivial-builders/test/invoke-writeDirectReferencesToFile.nix4
-rw-r--r--pkgs/build-support/trivial-builders/test/invoke-writeReferencesToFile.nix4
-rwxr-xr-xpkgs/build-support/trivial-builders/test/references-test.sh49
-rw-r--r--pkgs/build-support/trivial-builders/test/references.nix105
-rw-r--r--pkgs/build-support/trivial-builders/test/sample.nix29
-rw-r--r--pkgs/build-support/trivial-builders/test/samples.nix30
-rw-r--r--pkgs/build-support/trivial-builders/test/writeStringReferencesToFile.nix7
8 files changed, 148 insertions, 89 deletions
diff --git a/pkgs/build-support/trivial-builders/test/default.nix b/pkgs/build-support/trivial-builders/test/default.nix
index cbd1b388ef666..1863e6fbb85ac 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.nix {};
 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 {}
+    then references
     else null;
   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
index 4f464ac249fed..1b8f8e1504ec8 100755
--- a/pkgs/build-support/trivial-builders/test/references-test.sh
+++ b/pkgs/build-support/trivial-builders/test/references-test.sh
@@ -6,13 +6,21 @@
 #
 # -------------------------------------------------------------------------- #
 #
-#  This file can be run independently (quick):
+# Execute this build script directly (quick):
 #
-#      $ pkgs/build-support/trivial-builders/references-test.sh
+# * Classic
+#   $ NIX_PATH="nixpkgs=$PWD" nix-shell -p tests.trivial-builders.references.testScriptBin --run references-test
 #
-#  or in the build sandbox with a ~20s VM overhead
+# * Flake-based
+#   $ nix run .#tests.trivial-builders.references.testScriptBin
 #
-#      $ nix-build -A tests.trivial-builders.references
+# 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
 #
 # -------------------------------------------------------------------------- #
 
@@ -25,44 +33,29 @@ set -euo pipefail
 
 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
-#   # shellcheck disable=SC2206 # deliberately unquoted
-#   sample=( $(nix-build --no-out-link sample.nix) )
-#   # shellcheck disable=SC2206 # deliberately unquoted
-#   directRefs=( $(nix-build --no-out-link invoke-writeDirectReferencesToFile.nix) )
-#   # shellcheck disable=SC2206 # deliberately unquoted
-#   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
   # shellcheck disable=SC2206 # deliberately unquoted
-  sample=( $SAMPLE )
+  declare -A samples=( @SAMPLES@ )
   # shellcheck disable=SC2206 # deliberately unquoted
-  directRefs=( $DIRECT_REFS )
+  declare -A directRefs=( @DIRECT_REFS@ )
   # shellcheck disable=SC2206 # deliberately unquoted
-  references=( $REFERENCES )
-fi
+  declare -A references=( @REFERENCES@ )
 
 echo >&2 Testing direct references...
-for i in "${!sample[@]}"; do
-  echo >&2 Checking "#$i" "${sample[$i]}" "${directRefs[$i]}"
+for i in "${!samples[@]}"; do
+  echo >&2 Checking "$i" "${samples[$i]}" "${directRefs[$i]}"
   diff -U3 \
     <(sort <"${directRefs[$i]}") \
-    <(nix-store -q --references "${sample[$i]}" | sort)
+    <(nix-store -q --references "${samples[$i]}" | sort)
 done
 
 echo >&2 Testing closure...
-for i in "${!sample[@]}"; do
-  echo >&2 Checking "#$i" "${sample[$i]}" "${references[$i]}"
+for i in "${!samples[@]}"; do
+  echo >&2 Checking "$i" "${samples[$i]}" "${references[$i]}"
   diff -U3 \
     <(sort <"${references[$i]}") \
-    <(nix-store -q --requisites "${sample[$i]}" | sort)
+    <(nix-store -q --requisites "${samples[$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
index 7c8ea83f3c8bf..6b5e91b9a4e22 100644
--- a/pkgs/build-support/trivial-builders/test/references.nix
+++ b/pkgs/build-support/trivial-builders/test/references.nix
@@ -1,4 +1,19 @@
-{ lib, testers, pkgs, writeText, hello, figlet, stdenvNoCC }:
+{ 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
+}:
 
 # -------------------------------------------------------------------------- #
 #
@@ -6,21 +21,74 @@
 #
 # -------------------------------------------------------------------------- #
 #
-#  This file can be run independently (quick):
+# Execute this build script directly (quick):
 #
-#      $ pkgs/build-support/trivial-builders/references-test.sh
+# * Classic
+#   $ NIX_PATH="nixpkgs=$PWD" nix-shell -p tests.trivial-builders.references.testScriptBin --run references-test
 #
-#  or in the build sandbox with a ~20s VM overhead
+# * Flake-based
+#   $ nix run .#tests.trivial-builders.references.testScriptBin
 #
-#      $ nix-build -A tests.trivial-builders.references
+# 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
-  invokeSamples = file:
-    lib.concatStringsSep " " (
-      lib.attrValues (import file { inherit pkgs; })
-    );
+  # 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";
@@ -28,22 +96,25 @@ testers.nixosTest {
     virtualisation.writableStore = true;
 
     # Test runs without network, so we don't substitute and prepare our deps
-    nix.settings.substituters = lib.mkForce [];
+    nix.settings.substituters = lib.mkForce [ ];
     environment.etc."pre-built-paths".source = writeText "pre-built-paths" (
-      builtins.toJSON [hello figlet stdenvNoCC]
+      builtins.toJSON [ testScriptBin ]
     );
-    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
+        ${lib.getExe testScriptBin} 2>/dev/console
       """)
     '';
+  passthru = {
+    inherit
+      directReferences
+      references
+      samples
+      testScriptBin
+      ;
+  };
   meta = {
     maintainers = with lib.maintainers; [
       roberth
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/samples.nix b/pkgs/build-support/trivial-builders/test/samples.nix
new file mode 100644
index 0000000000000..3afb970c08aeb
--- /dev/null
+++ b/pkgs/build-support/trivial-builders/test/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/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