summary refs log tree commit diff
path: root/pkgs/build-support/testers/default.nix
blob: e5a8dbc79609e0bee333a7ffa3aadf245639027b (plain) (blame)
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
{ pkgs, lib, callPackage, runCommand }:
{

  /* Checks that two packages produce the exact same build instructions.

     This can be used to make sure that a certain difference of configuration,
     such as the presence of an overlay does not cause a cache miss.

     When the derivations are equal, the return value is an empty file.
     Otherwise, the build log explains the difference via `nix-diff`.

     Example:

         testEqualDerivation
           "The hello package must stay the same when enabling checks."
           hello
           (hello.overrideAttrs(o: { doCheck = true; }))
  */
  testEqualDerivation = callPackage ./test-equal-derivation.nix { };

  /* Checks the command output contains the specified version

     Although simplistic, this test assures that the main program
     can run. While there's no substitute for a real test case,
     it does catch dynamic linking errors and such. It also provides
     some protection against accidentally building the wrong version,
     for example when using an 'old' hash in a fixed-output derivation.

     Examples:

       passthru.tests.version = testVersion { package = hello; };

       passthru.tests.version = testVersion {
         package = seaweedfs;
         command = "weed version";
       };

       passthru.tests.version = testVersion {
         package = key;
         command = "KeY --help";
         # Wrong '2.5' version in the code. Drop on next version.
         version = "2.5";
       };
  */
  testVersion =
    { package,
      command ? "${package.meta.mainProgram or package.pname or package.name} --version",
      version ? package.version,
    }: runCommand "${package.name}-test-version" { nativeBuildInputs = [ package ]; meta.timeout = 60; } ''
      if output=$(${command} 2>&1); then
        grep -Fw "${version}" - <<< "$output"
        touch $out
      else
        echo "$output" >&2 && exit 1
      fi
    '';
}