`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"}]
```
80 lines
2.3 KiB
Nix
80 lines
2.3 KiB
Nix
# make sure to use NON EXISTING kernel settings else they may conflict with
|
|
# common-config.nix
|
|
{ lib, pkgs }:
|
|
|
|
let
|
|
lts_kernel = pkgs.linuxPackages.kernel;
|
|
|
|
# to see the result once the module transformed the lose structured config
|
|
getConfig =
|
|
structuredConfig:
|
|
(lts_kernel.override {
|
|
structuredExtraConfig = structuredConfig;
|
|
}).configfile.structuredConfig;
|
|
|
|
mandatoryVsOptionalConfig = lib.mkMerge [
|
|
{ NIXOS_FAKE_USB_DEBUG = lib.kernel.yes; }
|
|
{ NIXOS_FAKE_USB_DEBUG = lib.kernel.option lib.kernel.yes; }
|
|
];
|
|
|
|
freeformConfig = lib.mkMerge [
|
|
{ NIXOS_FAKE_MMC_BLOCK_MINORS = lib.kernel.freeform "32"; } # same as default, won't trigger any error
|
|
{ NIXOS_FAKE_MMC_BLOCK_MINORS = lib.kernel.freeform "64"; } # will trigger an error but the message is not great:
|
|
];
|
|
|
|
mkDefaultWorksConfig = lib.mkMerge [
|
|
{ "NIXOS_TEST_BOOLEAN" = lib.kernel.yes; }
|
|
{ "NIXOS_TEST_BOOLEAN" = lib.mkDefault lib.kernel.no; }
|
|
];
|
|
|
|
allOptionalRemainOptional = lib.mkMerge [
|
|
{ NIXOS_FAKE_USB_DEBUG = lib.kernel.option lib.kernel.yes; }
|
|
{ NIXOS_FAKE_USB_DEBUG = lib.kernel.option lib.kernel.yes; }
|
|
];
|
|
|
|
failures = lib.runTests {
|
|
testEasy = {
|
|
expr = (getConfig { NIXOS_FAKE_USB_DEBUG = lib.kernel.yes; }).NIXOS_FAKE_USB_DEBUG;
|
|
expected = {
|
|
tristate = "y";
|
|
optional = false;
|
|
freeform = null;
|
|
};
|
|
};
|
|
|
|
# mandatory flag should win over optional
|
|
testMandatoryCheck = {
|
|
expr = (getConfig mandatoryVsOptionalConfig).NIXOS_FAKE_USB_DEBUG.optional;
|
|
expected = false;
|
|
};
|
|
|
|
testYesWinsOverNo = {
|
|
expr = (getConfig mkDefaultWorksConfig)."NIXOS_TEST_BOOLEAN".tristate;
|
|
expected = "y";
|
|
};
|
|
|
|
testAllOptionalRemainOptional = {
|
|
expr = (getConfig allOptionalRemainOptional)."NIXOS_FAKE_USB_DEBUG".optional;
|
|
expected = true;
|
|
};
|
|
|
|
# check that freeform options are unique
|
|
# Should trigger
|
|
# > The option `settings.NIXOS_FAKE_MMC_BLOCK_MINORS.freeform' has conflicting definitions, in `<unknown-file>' and `<unknown-file>'
|
|
testTreeform =
|
|
let
|
|
res = builtins.tryEval ((getConfig freeformConfig).NIXOS_FAKE_MMC_BLOCK_MINORS.freeform);
|
|
in
|
|
{
|
|
expr = res.success;
|
|
expected = false;
|
|
};
|
|
|
|
};
|
|
in
|
|
|
|
lib.debug.throwTestFailures {
|
|
inherit failures;
|
|
description = "kernel unit tests";
|
|
}
|