summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSilvan Mosberger <contact@infinisil.com>2020-09-02 22:34:13 +0200
committerSilvan Mosberger <contact@infinisil.com>2020-11-30 23:51:23 +0100
commit3e39d6efdf65ce8fbf18471c0bb1062b28bfe984 (patch)
treeaa417ae5b9d29712d12d6c24c296ed6e980b08df /lib
parent900c4a5abd1061db2390224849cbc5eb8eb07059 (diff)
lib/tests: Add tests for module-builtin assertions
Diffstat (limited to 'lib')
-rwxr-xr-xlib/tests/modules.sh37
-rw-r--r--lib/tests/modules/assertions/enable-false.nix8
-rw-r--r--lib/tests/modules/assertions/enable-lazy.nix17
-rw-r--r--lib/tests/modules/assertions/multi.nix23
-rw-r--r--lib/tests/modules/assertions/non-cascading.nix17
-rw-r--r--lib/tests/modules/assertions/simple.nix6
-rw-r--r--lib/tests/modules/assertions/submodule-attrsOf-attrsOf.nix13
-rw-r--r--lib/tests/modules/assertions/submodule-attrsOf.nix13
-rw-r--r--lib/tests/modules/assertions/submodule.nix13
-rw-r--r--lib/tests/modules/assertions/trigger-lazy.nix15
-rw-r--r--lib/tests/modules/assertions/trigger-submodule.nix18
-rw-r--r--lib/tests/modules/assertions/underscore-attributes.nix8
-rw-r--r--lib/tests/modules/assertions/warning.nix9
13 files changed, 197 insertions, 0 deletions
diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh
index 012835e48c13..65eb91c99276 100755
--- a/lib/tests/modules.sh
+++ b/lib/tests/modules.sh
@@ -275,6 +275,43 @@ checkConfigOutput true config.value.mkbefore ./types-anything/mk-mods.nix
checkConfigOutput 1 config.value.nested.foo ./types-anything/mk-mods.nix
checkConfigOutput baz config.value.nested.bar.baz ./types-anything/mk-mods.nix
+## Module assertions
+# Check that assertions are triggered by default for just evaluating config
+checkConfigError 'Failed assertions:\n- \[test\] Assertion failed' config ./assertions/simple.nix
+# Check that assertions are only triggered if they have a triggerPath that's evaluated
+checkConfigError 'Failed assertions:\n- \[test\] Assertion failed' config.foo ./assertions/trigger-lazy.nix
+checkConfigOutput true config.bar ./assertions/trigger-lazy.nix
+
+# The assertions enable condition should only be evaluated if the trigger is evaluated
+checkConfigError 'enable evaluated' config.foo ./assertions/enable-lazy.nix
+checkConfigOutput true config.bar ./assertions/enable-lazy.nix
+
+# Assertion is not triggered when enable is false
+checkConfigOutput '{ }' config ./assertions/enable-false.nix
+
+# Warnings should be displayed on standard error
+checkConfigCodeOutErr 0 '{ }' 'warning: \[test\] Warning message' config ./assertions/warning.nix
+
+# A triggerPath can be set to a submodule path
+checkConfigOutput '{ baz = <CODE>; }' config.foo.bar ./assertions/trigger-submodule.nix
+checkConfigError 'Failed assertions:\n- \[test\] Assertion failed' config.foo.bar.baz ./assertions/trigger-submodule.nix
+
+# Check that multiple assertions and warnings can be triggered at once
+checkConfigError 'Failed assertions:\n- \[test1\] Assertion 1 failed\n- \[test2\] Assertion 2 failed' config ./assertions/multi.nix
+checkConfigError 'trace: warning: \[test3\] Warning 3 failed\ntrace: warning: \[test4\] Warning 4 failed' config ./assertions/multi.nix
+
+# Submodules should be able to trigger assertions and display the submodule prefix in their error
+checkConfigError 'Failed assertions:\n- \[foo/test\] Assertion failed' config.foo ./assertions/submodule.nix
+checkConfigError 'Failed assertions:\n- \[foo.bar/test\] Assertion failed' config.foo.bar ./assertions/submodule-attrsOf.nix
+checkConfigError 'Failed assertions:\n- \[foo.bar.baz/test\] Assertion failed' config.foo.bar.baz ./assertions/submodule-attrsOf-attrsOf.nix
+
+# Assertions aren't triggered when the trigger path is only evaluated from within the same module evaluation
+# This behavior is necessary to allow assertions to depend on config values. This could potentially be changed in the future if all of NixOS' assertions are rewritten to not depend on any config values
+checkConfigOutput true config.bar ./assertions/non-cascading.nix
+
+# Assertions with an attribute starting with _ shouldn't have their name displayed
+checkConfigError 'Failed assertions:\n- Assertion failed' config ./assertions/underscore-attributes.nix
+
cat <<EOF
====== module tests ======
$pass Pass
diff --git a/lib/tests/modules/assertions/enable-false.nix b/lib/tests/modules/assertions/enable-false.nix
new file mode 100644
index 000000000000..13b9d99ac701
--- /dev/null
+++ b/lib/tests/modules/assertions/enable-false.nix
@@ -0,0 +1,8 @@
+{
+
+ _module.assertions.test = {
+ enable = false;
+ message = "Assertion failed";
+ };
+
+}
diff --git a/lib/tests/modules/assertions/enable-lazy.nix b/lib/tests/modules/assertions/enable-lazy.nix
new file mode 100644
index 000000000000..24b4d15fb8f7
--- /dev/null
+++ b/lib/tests/modules/assertions/enable-lazy.nix
@@ -0,0 +1,17 @@
+{ lib, ... }: {
+
+ options.foo = lib.mkOption {
+ default = true;
+ };
+
+ options.bar = lib.mkOption {
+ default = true;
+ };
+
+ config._module.assertions.test = {
+ enable = throw "enable evaluated";
+ message = "Assertion failed";
+ triggerPath = [ "foo" ];
+ };
+
+}
diff --git a/lib/tests/modules/assertions/multi.nix b/lib/tests/modules/assertions/multi.nix
new file mode 100644
index 000000000000..e2fe4ac1a2c5
--- /dev/null
+++ b/lib/tests/modules/assertions/multi.nix
@@ -0,0 +1,23 @@
+{
+
+ _module.assertions = {
+ test1 = {
+ enable = true;
+ message = "Assertion 1 failed";
+ };
+ test2 = {
+ enable = true;
+ message = "Assertion 2 failed";
+ };
+ test3 = {
+ enable = true;
+ message = "Warning 3 failed";
+ type = "warning";
+ };
+ test4 = {
+ enable = true;
+ message = "Warning 4 failed";
+ type = "warning";
+ };
+ };
+}
diff --git a/lib/tests/modules/assertions/non-cascading.nix b/lib/tests/modules/assertions/non-cascading.nix
new file mode 100644
index 000000000000..33ade1032a1f
--- /dev/null
+++ b/lib/tests/modules/assertions/non-cascading.nix
@@ -0,0 +1,17 @@
+{ lib, config, ... }: {
+
+ options.foo = lib.mkOption {
+ default = true;
+ };
+
+ options.bar = lib.mkOption {
+ default = config.foo;
+ };
+
+ config._module.assertions.foo = {
+ enable = true;
+ message = "Foo assertion";
+ triggerPath = [ "foo" ];
+ };
+
+}
diff --git a/lib/tests/modules/assertions/simple.nix b/lib/tests/modules/assertions/simple.nix
new file mode 100644
index 000000000000..c5128586ec3a
--- /dev/null
+++ b/lib/tests/modules/assertions/simple.nix
@@ -0,0 +1,6 @@
+{
+ _module.assertions.test = {
+ enable = true;
+ message = "Assertion failed";
+ };
+}
diff --git a/lib/tests/modules/assertions/submodule-attrsOf-attrsOf.nix b/lib/tests/modules/assertions/submodule-attrsOf-attrsOf.nix
new file mode 100644
index 000000000000..2c7db40dd5b3
--- /dev/null
+++ b/lib/tests/modules/assertions/submodule-attrsOf-attrsOf.nix
@@ -0,0 +1,13 @@
+{ lib, ... }: {
+
+ options.foo = lib.mkOption {
+ default = { bar.baz = {}; };
+ type = lib.types.attrsOf (lib.types.attrsOf (lib.types.submodule {
+ _module.assertions.test = {
+ enable = true;
+ message = "Assertion failed";
+ };
+ }));
+ };
+
+}
diff --git a/lib/tests/modules/assertions/submodule-attrsOf.nix b/lib/tests/modules/assertions/submodule-attrsOf.nix
new file mode 100644
index 000000000000..78e106181d32
--- /dev/null
+++ b/lib/tests/modules/assertions/submodule-attrsOf.nix
@@ -0,0 +1,13 @@
+{ lib, ... }: {
+
+ options.foo = lib.mkOption {
+ default = { bar = {}; };
+ type = lib.types.attrsOf (lib.types.submodule {
+ _module.assertions.test = {
+ enable = true;
+ message = "Assertion failed";
+ };
+ });
+ };
+
+}
diff --git a/lib/tests/modules/assertions/submodule.nix b/lib/tests/modules/assertions/submodule.nix
new file mode 100644
index 000000000000..292593816d67
--- /dev/null
+++ b/lib/tests/modules/assertions/submodule.nix
@@ -0,0 +1,13 @@
+{ lib, ... }: {
+
+ options.foo = lib.mkOption {
+ default = {};
+ type = lib.types.submodule {
+ _module.assertions.test = {
+ enable = true;
+ message = "Assertion failed";
+ };
+ };
+ };
+
+}
diff --git a/lib/tests/modules/assertions/trigger-lazy.nix b/lib/tests/modules/assertions/trigger-lazy.nix
new file mode 100644
index 000000000000..812a9ffad07e
--- /dev/null
+++ b/lib/tests/modules/assertions/trigger-lazy.nix
@@ -0,0 +1,15 @@
+{ lib, ... }: {
+ options.foo = lib.mkOption {
+ default = true;
+ };
+
+ options.bar = lib.mkOption {
+ default = true;
+ };
+
+ config._module.assertions.test = {
+ enable = true;
+ message = "Assertion failed";
+ triggerPath = [ "foo" ];
+ };
+}
diff --git a/lib/tests/modules/assertions/trigger-submodule.nix b/lib/tests/modules/assertions/trigger-submodule.nix
new file mode 100644
index 000000000000..b5c7821f00f5
--- /dev/null
+++ b/lib/tests/modules/assertions/trigger-submodule.nix
@@ -0,0 +1,18 @@
+{ lib, ... }: {
+
+ options.foo = lib.mkOption {
+ default = { bar = {}; };
+ type = lib.types.attrsOf (lib.types.submodule {
+ options.baz = lib.mkOption {
+ default = true;
+ };
+ });
+ };
+
+ config._module.assertions.test = {
+ enable = true;
+ message = "Assertion failed";
+ triggerPath = [ "foo" "bar" "baz" ];
+ };
+
+}
diff --git a/lib/tests/modules/assertions/underscore-attributes.nix b/lib/tests/modules/assertions/underscore-attributes.nix
new file mode 100644
index 000000000000..a485cd2e1bd9
--- /dev/null
+++ b/lib/tests/modules/assertions/underscore-attributes.nix
@@ -0,0 +1,8 @@
+{
+
+ _module.assertions._test = {
+ enable = true;
+ message = "Assertion failed";
+ };
+
+}
diff --git a/lib/tests/modules/assertions/warning.nix b/lib/tests/modules/assertions/warning.nix
new file mode 100644
index 000000000000..6c1dd2c750e6
--- /dev/null
+++ b/lib/tests/modules/assertions/warning.nix
@@ -0,0 +1,9 @@
+{
+
+ _module.assertions.test = {
+ enable = true;
+ type = "warning";
+ message = "Warning message";
+ };
+
+}