1# make sure to use NON EXISTING kernel settings else they may conflict with
2# common-config.nix
3{ lib, pkgs }:
4
5let
6 lts_kernel = pkgs.linuxPackages.kernel;
7
8 # to see the result once the module transformed the lose structured config
9 getConfig =
10 structuredConfig:
11 (lts_kernel.override {
12 structuredExtraConfig = structuredConfig;
13 }).configfile.structuredConfig;
14
15 mandatoryVsOptionalConfig = lib.mkMerge [
16 { NIXOS_FAKE_USB_DEBUG = lib.kernel.yes; }
17 { NIXOS_FAKE_USB_DEBUG = lib.kernel.option lib.kernel.yes; }
18 ];
19
20 freeformConfig = lib.mkMerge [
21 { NIXOS_FAKE_MMC_BLOCK_MINORS = lib.kernel.freeform "32"; } # same as default, won't trigger any error
22 { NIXOS_FAKE_MMC_BLOCK_MINORS = lib.kernel.freeform "64"; } # will trigger an error but the message is not great:
23 ];
24
25 mkDefaultWorksConfig = lib.mkMerge [
26 { "NIXOS_TEST_BOOLEAN" = lib.kernel.yes; }
27 { "NIXOS_TEST_BOOLEAN" = lib.mkDefault lib.kernel.no; }
28 ];
29
30 allOptionalRemainOptional = lib.mkMerge [
31 { NIXOS_FAKE_USB_DEBUG = lib.kernel.option lib.kernel.yes; }
32 { NIXOS_FAKE_USB_DEBUG = lib.kernel.option lib.kernel.yes; }
33 ];
34
35 failures = lib.runTests {
36 testEasy = {
37 expr = (getConfig { NIXOS_FAKE_USB_DEBUG = lib.kernel.yes; }).NIXOS_FAKE_USB_DEBUG;
38 expected = {
39 tristate = "y";
40 optional = false;
41 freeform = null;
42 };
43 };
44
45 # mandatory flag should win over optional
46 testMandatoryCheck = {
47 expr = (getConfig mandatoryVsOptionalConfig).NIXOS_FAKE_USB_DEBUG.optional;
48 expected = false;
49 };
50
51 testYesWinsOverNo = {
52 expr = (getConfig mkDefaultWorksConfig)."NIXOS_TEST_BOOLEAN".tristate;
53 expected = "y";
54 };
55
56 testAllOptionalRemainOptional = {
57 expr = (getConfig allOptionalRemainOptional)."NIXOS_FAKE_USB_DEBUG".optional;
58 expected = true;
59 };
60
61 # check that freeform options are unique
62 # Should trigger
63 # > The option `settings.NIXOS_FAKE_MMC_BLOCK_MINORS.freeform' has conflicting definitions, in `<unknown-file>' and `<unknown-file>'
64 testTreeform =
65 let
66 res = builtins.tryEval ((getConfig freeformConfig).NIXOS_FAKE_MMC_BLOCK_MINORS.freeform);
67 in
68 {
69 expr = res.success;
70 expected = false;
71 };
72
73 };
74in
75
76lib.optional (failures != [ ]) (
77 throw "The following kernel unit tests failed: ${lib.generators.toPretty { } failures}"
78)