vuls: init at 0.27.0 (#348530)
[NixPkgs.git] / pkgs / build-support / testers / default.nix
blobba605adeb9a0472b76a87050f8a4efd98976f812
2   lib,
3   buildPackages,
4   callPackage,
5   pkgs,
6   pkgsLinux,
8   diffoscopeMinimal,
9   runCommand,
10   runCommandWith,
11   stdenv,
12   stdenvNoCC,
13   substituteAll,
14   testers,
16 # Documentation is in doc/build-helpers/testers.chapter.md
18   # See https://nixos.org/manual/nixpkgs/unstable/#tester-lycheeLinkCheck
19   # or doc/build-helpers/testers.chapter.md
20   inherit (callPackage ./lychee.nix {}) lycheeLinkCheck;
22   # See https://nixos.org/manual/nixpkgs/unstable/#tester-testBuildFailure
23   # or doc/build-helpers/testers.chapter.md
24   testBuildFailure = drv: drv.overrideAttrs (orig: {
25     builder = buildPackages.bash;
26     args = [
27       (substituteAll { coreutils = buildPackages.coreutils; src = ./expect-failure.sh; })
28       orig.realBuilder or stdenv.shell
29     ] ++ orig.args or ["-e" (orig.builder or ../../stdenv/generic/default-builder.sh)];
30   });
32   # See https://nixos.org/manual/nixpkgs/unstable/#tester-testEqualDerivation
33   # or doc/build-helpers/testers.chapter.md
34   testEqualDerivation = callPackage ./test-equal-derivation.nix { };
36   # See https://nixos.org/manual/nixpkgs/unstable/#tester-testEqualContents
37   # or doc/build-helpers/testers.chapter.md
38   testEqualContents = {
39     assertion,
40     actual,
41     expected,
42   }: runCommand "equal-contents-${lib.strings.toLower assertion}" {
43     inherit assertion actual expected;
44     nativeBuildInputs = [ diffoscopeMinimal ];
45   } ''
46     echo "Checking:"
47     printf '%s\n' "$assertion"
48     if ! diffoscope --no-progress --text-color=always --exclude-directory-metadata=no -- "$actual" "$expected"
49     then
50       echo
51       echo 'Contents must be equal, but were not!'
52       echo
53       echo "+: expected,   at $expected"
54       echo "-: unexpected, at $actual"
55       false
56     else
57       echo "expected $expected and actual $actual match."
58       echo OK
59       touch -- "$out"
60     fi
61   '';
63   # See https://nixos.org/manual/nixpkgs/unstable/#tester-testVersion
64   # or doc/build-helpers/testers.chapter.md
65   testVersion =
66     { package,
67       command ? "${package.meta.mainProgram or package.pname or package.name} --version",
68       version ? package.version,
69     }: runCommand "${package.name}-test-version" { nativeBuildInputs = [ package ]; meta.timeout = 60; } ''
70       if output=$(${command} 2>&1 | sed -e 's|${builtins.storeDir}/[^/ ]*/|{{storeDir}}/|g'); then
71         if grep -Fw -- "${version}" - <<< "$output"; then
72           touch $out
73         else
74           echo "Version string '${version}' not found!" >&2
75           echo "The output was:" >&2
76           echo "$output" >&2
77           exit 1
78         fi
79       else
80         echo -n ${lib.escapeShellArg command} >&2
81         echo " returned a non-zero exit code." >&2
82         echo "$output" >&2
83         exit 1
84       fi
85     '';
87   # See https://nixos.org/manual/nixpkgs/unstable/#tester-invalidateFetcherByDrvHash
88   # or doc/build-helpers/testers.chapter.md
89   invalidateFetcherByDrvHash = f: args:
90     let
91       drvPath = (f args).drvPath;
92       # It's safe to discard the context, because we don't access the path.
93       salt = builtins.unsafeDiscardStringContext (lib.substring 0 12 (baseNameOf drvPath));
94       # New derivation incorporating the original drv hash in the name
95       salted = f (args // { name = "${args.name or "source"}-salted-${salt}"; });
96       # Make sure we did change the derivation. If the fetcher ignores `name`,
97       # `invalidateFetcherByDrvHash` doesn't work.
98       checked =
99         if salted.drvPath == drvPath
100         then throw "invalidateFetcherByDrvHash: Adding the derivation hash to the fixed-output derivation name had no effect. Make sure the fetcher's name argument ends up in the derivation name. Otherwise, the fetcher will not be re-run when its implementation changes. This is important for testing."
101         else salted;
102     in checked;
104   # See https://nixos.org/manual/nixpkgs/unstable/#tester-runCommand
105   runCommand = testers.invalidateFetcherByDrvHash (
106     {
107       hash ? pkgs.emptyFile.outputHash,
108       name,
109       script,
110       stdenv ? stdenvNoCC,
111       ...
112     }@args:
114     runCommandWith {
115       inherit name stdenv;
117       derivationArgs = {
118         outputHash = hash;
119         outputHashMode = "recursive";
120       } // lib.removeAttrs args [
121         "hash"
122         "name"
123         "script"
124         "stdenv"
125       ];
126     } script
127   );
129   # See https://nixos.org/manual/nixpkgs/unstable/#tester-runNixOSTest
130   # or doc/build-helpers/testers.chapter.md
131   runNixOSTest =
132     let nixos = import ../../../nixos/lib {
133       inherit lib;
134     };
135     in testModule:
136         nixos.runTest {
137           _file = "pkgs.runNixOSTest implementation";
138           imports = [
139             (lib.setDefaultModuleLocation "the argument that was passed to pkgs.runNixOSTest" testModule)
140           ];
141           hostPkgs = pkgs;
142           node.pkgs = pkgsLinux;
143         };
145   # See https://nixos.org/manual/nixpkgs/unstable/#tester-invalidateFetcherByDrvHash
146   # or doc/build-helpers/testers.chapter.md
147   nixosTest =
148     let
149       /* The nixos/lib/testing-python.nix module, preapplied with arguments that
150        * make sense for this evaluation of Nixpkgs.
151        */
152       nixosTesting =
153         (import ../../../nixos/lib/testing-python.nix {
154           inherit (stdenv.hostPlatform) system;
155           inherit pkgs;
156           extraConfigurations = [(
157             { lib, ... }: {
158               config.nixpkgs.pkgs = lib.mkDefault pkgsLinux;
159             }
160           )];
161         });
162     in
163       test:
164         let
165           loadedTest = if builtins.typeOf test == "path"
166             then import test
167             else test;
168           calledTest = lib.toFunction loadedTest pkgs;
169         in
170           nixosTesting.simpleTest calledTest;
172   hasPkgConfigModule =
173     { moduleName, ... }@args:
174     lib.warn "testers.hasPkgConfigModule has been deprecated in favor of testers.hasPkgConfigModules. It accepts a list of strings via the moduleNames argument instead of a single moduleName." (
175       testers.hasPkgConfigModules (builtins.removeAttrs args [ "moduleName" ] // {
176         moduleNames = [ moduleName ];
177       })
178     );
179   hasPkgConfigModules = callPackage ./hasPkgConfigModules/tester.nix { };
181   testMetaPkgConfig = callPackage ./testMetaPkgConfig/tester.nix { };
183   shellcheck = callPackage ./shellcheck/tester.nix { };