anvil-editor: init at 0.4
[NixPkgs.git] / pkgs / build-support / trivial-builders / test-overriding.nix
bloba16bbbee1b1b1bdf0578b4af40138b3b8251d4c6
1 # Check that overriding works for trivial-builders like
2 # `writeShellScript` via `overrideAttrs`. This is useful
3 # to override the `checkPhase`, e. g. if you want
4 # to disable extglob in `writeShellScript`.
6 # Run using `nix-build -A tests.trivial-builders.overriding`.
7 { lib
8 , stdenv
9 , runtimeShell
10 , runCommand
11 , callPackage
12 , writeShellScript
13 , writeTextFile
14 , writeShellScriptBin
17 let
18   extglobScript = ''
19     shopt -s extglob
20     touch success
21     echo @(success|failure)
22     rm success
23   '';
25   simpleCase = case:
26     writeShellScript "test-trivial-overriding-${case}" extglobScript;
28   callPackageCase = case: callPackage (
29     { writeShellScript }:
30     writeShellScript "test-trivial-callpackage-overriding-${case}" extglobScript
31   ) { };
33   binCase = case:
34     writeShellScriptBin "test-trivial-overriding-bin-${case}" extglobScript;
36   # building this derivation would fail without overriding
37   textFileCase = writeTextFile {
38     name = "test-trivial-overriding-text-file";
39     checkPhase = "false";
40     text = ''
41       #!${runtimeShell}
42       echo success
43     '';
44     executable = true;
45   };
47     disallowExtglob = x: x.overrideAttrs (_: {
48       checkPhase = ''
49         ${stdenv.shell} -n "$target"
50       '';
51     });
53     # Run old checkPhase, but only succeed if it fails.
54     # This HACK is required because we can't introspect build failures
55     # in nix: With `assertFail` we want to make sure that the default
56     # `checkPhase` would fail if extglob was used in the script.
57     assertFail = x: x.overrideAttrs (old: {
58       checkPhase = ''
59         if
60           ${old.checkPhase}
61         then exit 1; fi
62       '';
63     });
65   mkCase = case: outcome: isBin:
66     let
67       drv = lib.pipe outcome ([ case ] ++ lib.optionals (outcome == "fail") [ disallowExtglob assertFail ]);
68     in if isBin then "${drv}/bin/${drv.name}" else drv;
70   writeTextOverrides = {
71     # Make sure extglob works by default
72     simpleSucc = mkCase simpleCase "succ" false;
73     # Ensure it's possible to fail; in this case extglob is not enabled
74     simpleFail = mkCase simpleCase "fail" false;
75     # Do the same checks after wrapping with callPackage
76     # to make sure callPackage doesn't mess with the override
77     callpSucc = mkCase callPackageCase "succ" false;
78     callpFail = mkCase callPackageCase "fail" false;
79     # Do the same check using `writeShellScriptBin`
80     binSucc = mkCase binCase "succ" true;
81     binFail = mkCase binCase "fail" true;
82     # Check that we can also override plain writeTextFile
83     textFileSuccess = textFileCase.overrideAttrs (_: {
84       checkPhase = "true";
85     });
86   };
88   # `runTest` forces nix to build the script of our test case and
89   # run its `checkPhase` which is our main interest. Additionally
90   # it executes the script and thus makes sure that extglob also
91   # works at run time.
92   runTest = script:
93     let
94       name = script.name or (builtins.baseNameOf script);
95     in writeShellScript "run-${name}" ''
96       if [ "$(${script})" != "success" ]; then
97         echo "Failed in ${name}"
98         exit 1
99       fi
100     '';
103 runCommand "test-writeShellScript-overriding" {
104   passthru = { inherit writeTextOverrides; };
105 } ''
106   ${lib.concatMapStrings (test: ''
107       ${runTest test}
108     '') (lib.attrValues writeTextOverrides)}
109   touch "$out"