Unverified Commit fa9727cf authored by Rebecca Turner's avatar Rebecca Turner
Browse files

lib: `modules.sh` should check JSON output for predictability

Currently, the `lib/tests/modules.sh` test checks the output of
`nix-instantiate --eval` without `--json`, which outputs an unspecified
human-readable format.

This patch modifies `modules.sh` to use the `--json` output instead, to
be robust against future changes to `nix-instantiate` output.
parent 5a9be427
Loading
Loading
Loading
Loading
+14 −14
Original line number Diff line number Diff line
@@ -24,14 +24,14 @@ evalConfig() {
    local attr=$1
    shift
    local script="import ./default.nix { modules = [ $* ];}"
    nix-instantiate --timeout 1 -E "$script" -A "$attr" --eval-only --show-trace --read-write-mode
    nix-instantiate --timeout 1 -E "$script" -A "$attr" --eval-only --show-trace --read-write-mode --json
}

reportFailure() {
    local attr=$1
    shift
    local script="import ./default.nix { modules = [ $* ];}"
    echo 2>&1 "$ nix-instantiate -E '$script' -A '$attr' --eval-only"
    echo 2>&1 "$ nix-instantiate -E '$script' -A '$attr' --eval-only --json"
    evalConfig "$attr" "$@" || true
    ((++fail))
}
@@ -366,12 +366,12 @@ checkConfigError 'The option .* has conflicting definitions' config.value ./type
checkConfigOutput '^0$' config.value.int ./types-anything/equal-atoms.nix
checkConfigOutput '^false$' config.value.bool ./types-anything/equal-atoms.nix
checkConfigOutput '^""$' config.value.string ./types-anything/equal-atoms.nix
checkConfigOutput '^/$' config.value.path ./types-anything/equal-atoms.nix
checkConfigOutput '^"/[^"]+"$' config.value.path ./types-anything/equal-atoms.nix
checkConfigOutput '^null$' config.value.null ./types-anything/equal-atoms.nix
checkConfigOutput '^0.1$' config.value.float ./types-anything/equal-atoms.nix
# Functions can't be merged together
checkConfigError "The option .value.multiple-lambdas.<function body>. has conflicting option types" config.applied.multiple-lambdas ./types-anything/functions.nix
checkConfigOutput '^<LAMBDA>$' config.value.single-lambda ./types-anything/functions.nix
checkConfigOutput '^true$' config.valueIsFunction.single-lambda ./types-anything/functions.nix
checkConfigOutput '^null$' config.applied.merging-lambdas.x ./types-anything/functions.nix
checkConfigOutput '^null$' config.applied.merging-lambdas.y ./types-anything/functions.nix
# Check that all mk* modifiers are applied
@@ -398,7 +398,7 @@ checkConfigOutput '^"a b y z"$' config.resultFooBar ./declare-variants.nix ./def
checkConfigOutput '^"a b c"$' config.resultFooFoo ./declare-variants.nix ./define-variant.nix

## emptyValue's
checkConfigOutput "[ ]" config.list.a ./emptyValues.nix
checkConfigOutput "\[\]" config.list.a ./emptyValues.nix
checkConfigOutput "{}" config.attrs.a ./emptyValues.nix
checkConfigOutput "null" config.null.a ./emptyValues.nix
checkConfigOutput "{}" config.submodule.a ./emptyValues.nix
@@ -407,7 +407,7 @@ checkConfigError 'The option .int.a. is used but not defined' config.int.a ./emp
checkConfigError 'The option .nonEmptyList.a. is used but not defined' config.nonEmptyList.a ./emptyValues.nix

## types.raw
checkConfigOutput "{ foo = <CODE>; }" config.unprocessedNesting ./raw.nix
checkConfigOutput '^true$' config.unprocessedNestingEvaluates.success ./raw.nix
checkConfigOutput "10" config.processedToplevel ./raw.nix
checkConfigError "The option .multiple. is defined multiple times" config.multiple ./raw.nix
checkConfigOutput "bar" config.priorities ./raw.nix
+4 −1
Original line number Diff line number Diff line
{ lib, ... }: {
{ lib, config, ... }: {

  options = {
    processedToplevel = lib.mkOption {
@@ -13,6 +13,9 @@
    priorities = lib.mkOption {
      type = lib.types.raw;
    };
    unprocessedNestingEvaluates = lib.mkOption {
      default = builtins.tryEval config.unprocessedNesting;
    };
  };

  config = {
+2 −2
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@
      value.int = 0;
      value.bool = false;
      value.string = "";
      value.path = /.;
      value.path = ./.;
      value.null = null;
      value.float = 0.1;
    }
@@ -17,7 +17,7 @@
      value.int = 0;
      value.bool = false;
      value.string = "";
      value.path = /.;
      value.path = ./.;
      value.null = null;
      value.float = 0.1;
    }
+4 −0
Original line number Diff line number Diff line
{ lib, config, ... }: {

  options.valueIsFunction = lib.mkOption {
    default = lib.mapAttrs (name: lib.isFunction) config.value;
  };

  options.value = lib.mkOption {
    type = lib.types.anything;
  };