about summary refs log tree commit diff
path: root/nix/utils/tests/default.nix
blob: b87c29cac722e319df7e90f4081ddc3dd1349203 (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
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
{ depot, lib, ... }:

let
  inherit (depot.nix.runTestsuite)
    runTestsuite
    it
    assertEq
    assertThrows
    assertDoesNotThrow
    ;

  inherit (depot.nix.utils)
    isDirectory
    realPathIsDirectory
    isRegularFile
    isSymlink
    pathType
    storePathName
    ;

  assertUtilsPred = msg: act: exp: [
    (assertDoesNotThrow "${msg} does not throw" act)
    (assertEq msg (builtins.tryEval act).value exp)
  ];

  pathPredicates = it "judges paths correctly" (lib.flatten [
    # isDirectory
    (assertUtilsPred "directory isDirectory"
      (isDirectory ./directory)
      true)
    (assertUtilsPred "symlink not isDirectory"
      (isDirectory ./symlink-directory)
      false)
    (assertUtilsPred "file not isDirectory"
      (isDirectory ./directory/file)
      false)
    # realPathIsDirectory
    (assertUtilsPred "directory realPathIsDirectory"
      (realPathIsDirectory ./directory)
      true)
    (assertUtilsPred "symlink to directory realPathIsDirectory"
      (realPathIsDirectory ./symlink-directory)
      true)
    (assertUtilsPred "realPathIsDirectory resolves chained symlinks"
      (realPathIsDirectory ./symlink-symlink-directory)
      true)
    # isRegularFile
    (assertUtilsPred "file isRegularFile"
      (isRegularFile ./directory/file)
      true)
    (assertUtilsPred "symlink not isRegularFile"
      (isRegularFile ./symlink-file)
      false)
    (assertUtilsPred "directory not isRegularFile"
      (isRegularFile ./directory)
      false)
    # isSymlink
    (assertUtilsPred "symlink to file isSymlink"
      (isSymlink ./symlink-file)
      true)
    (assertUtilsPred "symlink to directory isSymlink"
      (isSymlink ./symlink-directory)
      true)
    (assertUtilsPred "symlink to symlink isSymlink"
      (isSymlink ./symlink-symlink-file)
      true)
    (assertUtilsPred "symlink to missing file isSymlink"
      (isSymlink ./missing)
      true)
    (assertUtilsPred "directory not isSymlink"
      (isSymlink ./directory)
      false)
    (assertUtilsPred "file not isSymlink"
      (isSymlink ./directory/file)
      false)
    # missing files throw
    (assertThrows "isDirectory throws on missing file"
      (isDirectory ./does-not-exist))
    (assertThrows "realPathIsDirectory throws on missing file"
      (realPathIsDirectory ./does-not-exist))
    (assertThrows "isRegularFile throws on missing file"
      (isRegularFile ./does-not-exist))
    (assertThrows "isSymlink throws on missing file"
      (isSymlink ./does-not-exist))
  ]);

  symlinkPathTypeTests = it "correctly judges symlinks" [
    (assertEq "symlinks to directories are detected correcty"
      ((pathType ./symlink-directory).symlink or null) "directory")
    (assertEq "symlinks to symlinks to directories are detected correctly"
      ((pathType ./symlink-symlink-directory).symlink or null) "directory")
    (assertEq "symlinks to nowhere are not distinguished from files"
      ((pathType ./missing).symlink or null) "regular-or-missing")

    # These tests are commented out because they no longer work with
    # restrict-eval turned on.

    # (assertEq "symlinks to files are detected-ish"
    #   ((pathType ./symlink-file).symlink or null) "regular-or-missing")
    # (assertEq "symlinks to symlinks to files are detected-ish"
    #   ((pathType ./symlink-symlink-file).symlink or null) "regular-or-missing")
  ];

  cheddarStorePath =
    builtins.unsafeDiscardStringContext depot.tools.cheddar.outPath;

  cleanedSource = lib.cleanSource ./.;

  storePathNameTests = it "correctly gets the basename of a store path" [
    (assertEq "base name of a derivation"
      (storePathName depot.tools.cheddar)
      depot.tools.cheddar.name)
    (assertEq "base name of a store path string"
      (storePathName cheddarStorePath)
      depot.tools.cheddar.name)
    (assertEq "base name of a path within a store path"
      (storePathName "${cheddarStorePath}/bin/cheddar") "cheddar")
    (assertEq "base name of a path"
      (storePathName ../default.nix) "default.nix")
    (assertEq "base name of a cleanSourced path"
      (storePathName cleanedSource)
      cleanedSource.name)
  ];
in

runTestsuite "nix.utils" [
  pathPredicates
  symlinkPathTypeTests
  storePathNameTests
]