summaryrefslogtreecommitdiff
path: root/pkgs/build-support/testers/testBuildFailurePrime/tests.nix
blob: 2664f752cd89d0c89ba5c7817db90de997e6b4c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
{
  emptyDirectory,
  hello,
  lib,
  overrideStructuredAttrs,
  runCommand,
  stdenvNoCC,
  testers,
}:
let
  inherit (lib.attrsets) recurseIntoAttrs;
  final = {
    # NOTE: This example is used in the docs.
    # See https://nixos.org/manual/nixpkgs/unstable/#tester-testBuildFailurePrime
    # or doc/build-helpers/testers.chapter.md
    doc-example = testers.testBuildFailure' {
      drv = runCommand "doc-example" { } ''
        echo ok-ish >"$out"
        echo failing though
        exit 3
      '';
      expectedBuilderExitCode = 3;
      expectedBuilderLogEntries = [ "failing though" ];
      script = ''
        grep --silent -F 'ok-ish' "$failed/result"
      '';
    };

    happy = testers.testBuildFailure' {
      drv = runCommand "happy" { } ''
        echo ok-ish >$out

        echo failing though
        echo also stderr 1>&2
        echo 'line\nwith-\bbackslashes'
        printf "incomplete line - no newline"

        exit 3
      '';
      expectedBuilderExitCode = 3;
      expectedBuilderLogEntries = [
        "failing though"
        "also stderr"
        ''line\nwith-\bbackslashes''
        "incomplete line - no newline"
      ];
      script = ''
        grep --silent -F 'ok-ish' "$failed/result"
      '';
    };

    happyStructuredAttrs = overrideStructuredAttrs true final.happy;

    helloDoesNotFail = testers.testBuildFailure' {
      drv = testers.testBuildFailure hello;
      expectedBuilderLogEntries = [
        "testBuildFailure: The builder did not fail, but a failure was expected"
      ];
    };

    multiOutput = testers.testBuildFailure' {
      drv =
        runCommand "multiOutput"
          {
            # dev will be the default output
            outputs = [
              "dev"
              "doc"
              "out"
            ];
          }
          ''
            echo i am failing
            exit 1
          '';
      expectedBuilderLogEntries = [
        "i am failing"
      ];
      script = ''
        # Checking our note that dev is the default output
        echo $failed/_ | grep -- '-dev/_' >/dev/null
        echo 'All good.'
      '';
    };

    multiOutputStructuredAttrs = overrideStructuredAttrs true final.multiOutput;

    sideEffects = testers.testBuildFailure' {
      drv = stdenvNoCC.mkDerivation {
        name = "fail-with-side-effects";
        src = emptyDirectory;

        postHook = ''
          echo touching side-effect...
          # Assert that the side-effect doesn't exist yet...
          # We're checking that this hook isn't run by expect-failure.sh
          if [[ -e side-effect ]]; then
            echo "side-effect already exists"
            exit 1
          fi
          touch side-effect
        '';

        buildPhase = ''
          echo i am failing
          exit 1
        '';
      };
      expectedBuilderLogEntries = [
        "touching side-effect..."
        "i am failing"
      ];
      script = ''
        [[ ! -e side-effect ]]
      '';
    };

    sideEffectsStructuredAttrs = overrideStructuredAttrs true final.sideEffects;

    exitCodeNegativeTest = testers.testBuildFailure' {
      drv = testers.testBuildFailure' {
        drv = runCommand "exit-code" { } "exit 3";
        # Default expected exit code is 1
      };
      expectedBuilderLogEntries = [
        "ERROR: testBuilderExitCode: original builder produced exit code 3 but was expected to produce 1"
      ];
    };

    exitCodeNegativeTestStructuredAttrs = overrideStructuredAttrs true final.exitCodeNegativeTest;

    logNegativeTest = testers.testBuildFailure' {
      drv = testers.testBuildFailure' {
        drv = runCommand "exit-code" { } ''
          nixLog "apples"
          exit 3
        '';
        expectedBuilderExitCode = 3;
        expectedBuilderLogEntries = [ "bees" ];
      };
      expectedBuilderLogEntries = [
        "ERROR: testBuilderLogEntries: original builder log does not contain 'bees'"
      ];
    };

    logNegativeTestStructuredAttrs = overrideStructuredAttrs true final.logNegativeTest;
  };
in
recurseIntoAttrs final