`lib.debug.runTests` provides a unit test evaluator for Nix, but its
results are returned in a raw and difficult-to-read form.
Currently, different callers output the results in various ways:
`builtins.throw (builtins.toJSON failures)` and `builtins.throw ("Tests
failed: " + lib.generators.toPretty { } failures)` are both used.
This change adds a new `lib.debug.throwTestFailures` function which
displays the results nicely before throwing an exception (or returns
`null` if no failures are given), unifying these disparate call-sites.
First, each failing test is pretty-printed in a `trace` message:
```
trace: FAIL testDerivation:
Expected: <derivation a>
Result: <derivation b>
```
Then, an exception is thrown containing the number of tests that failed
(and their names), followed by the raw JSON of the results (for parity
with previous usage, and because `lib.generators.toPretty` sometimes
omits information that `builins.toJSON` includes):
```
error:
… while evaluating the file '...':
… caused by explicit throw
at /nix/store/.../lib/debug.nix:528:7:
527| in
528| throw (
| ^
529| builtins.seq traceFailures (
error: 1 tests failed:
- testDerivation
[{"expected":"/nix/store/xh7kyqp69mxkwspmi81a94m9xx74r8dr-a","name":"testDerivation","result":"/nix/store/503l84nir4zw57d1shfhai25bxxn16c6-b"}]
```
59 lines
1.4 KiB
Nix
59 lines
1.4 KiB
Nix
{
|
|
pkgs,
|
|
lib,
|
|
stdenv,
|
|
...
|
|
}:
|
|
|
|
let
|
|
failures = lib.runTests {
|
|
# Merging two non-list definitions must still result in an error
|
|
# about a conflicting definition.
|
|
test-unitOption-merging-non-lists-conflict =
|
|
let
|
|
nixos = pkgs.nixos {
|
|
system.stateVersion = lib.trivial.release;
|
|
systemd.services.systemd-test-nixos = {
|
|
serviceConfig = lib.mkMerge [
|
|
{ StateDirectory = "foo"; }
|
|
{ StateDirectory = "bar"; }
|
|
];
|
|
};
|
|
};
|
|
in
|
|
{
|
|
expr =
|
|
(builtins.tryEval (nixos.config.systemd.services.systemd-test-nixos.serviceConfig.StateDirectory))
|
|
.success;
|
|
expected = false;
|
|
};
|
|
|
|
# Merging must lift non-list definitions to a list
|
|
# if at least one of them is a list.
|
|
test-unitOption-merging-list-non-list-append =
|
|
let
|
|
nixos = pkgs.nixos {
|
|
system.stateVersion = lib.trivial.release;
|
|
systemd.services.systemd-test-nixos = {
|
|
serviceConfig = lib.mkMerge [
|
|
{ StateDirectory = "foo"; }
|
|
{ StateDirectory = [ "bar" ]; }
|
|
];
|
|
};
|
|
};
|
|
in
|
|
{
|
|
expr = nixos.config.systemd.services.systemd-test-nixos.serviceConfig.StateDirectory;
|
|
expected = [
|
|
"foo"
|
|
"bar"
|
|
];
|
|
};
|
|
};
|
|
in
|
|
|
|
lib.debug.throwTestFailures {
|
|
inherit failures;
|
|
description = "systemd unit tests";
|
|
}
|