From 04db3589a8150c0a97869b10e269d6d5c516f3e9 Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Thu, 25 May 2023 22:39:28 +0200 Subject: lib.filesystem.pathType: Fix tests for Nix >= 2.14 --- lib/tests/filesystem.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'lib/tests') diff --git a/lib/tests/filesystem.sh b/lib/tests/filesystem.sh index 4a5ffeb12431..1e33174429b8 100755 --- a/lib/tests/filesystem.sh +++ b/lib/tests/filesystem.sh @@ -41,7 +41,7 @@ checkPathType() { local actualPathType=$(nix-instantiate --eval --strict --json 2>&1 \ -E '{ path }: let lib = import ; in lib.filesystem.pathType path' \ --argstr path "$path") - if [[ "$actualPathType" != "$expectedPathType" ]]; then + if [[ ! "$actualPathType" =~ $expectedPathType ]]; then die "lib.filesystem.pathType \"$path\" == $actualPathType, but $expectedPathType was expected" fi } @@ -51,7 +51,8 @@ checkPathType "$PWD/directory" '"directory"' checkPathType "$PWD/regular" '"regular"' checkPathType "$PWD/symlink" '"symlink"' checkPathType "$PWD/fifo" '"unknown"' -checkPathType "$PWD/non-existent" "error: evaluation aborted with the following error message: 'lib.filesystem.pathType: Path $PWD/non-existent does not exist.'" +# Different errors depending on whether the builtins.readFilePath primop is available or not +checkPathType "$PWD/non-existent" "error: (evaluation aborted with the following error message: 'lib.filesystem.pathType: Path $PWD/non-existent does not exist.'|getting status of '$PWD/non-existent': No such file or directory)" checkPathIsDirectory() { local path=$1 -- cgit 1.4.1 From de0c11241f8a2e72c2cd02b86fedaaeb30292e97 Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Fri, 26 May 2023 18:29:45 +0200 Subject: lib/tests/filesystem.sh: Check success and failure separately --- lib/tests/filesystem.sh | 83 ++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 46 deletions(-) (limited to 'lib/tests') diff --git a/lib/tests/filesystem.sh b/lib/tests/filesystem.sh index 1e33174429b8..cfd333d0001b 100755 --- a/lib/tests/filesystem.sh +++ b/lib/tests/filesystem.sh @@ -35,59 +35,50 @@ touch regular ln -s target symlink mkfifo fifo -checkPathType() { - local path=$1 - local expectedPathType=$2 - local actualPathType=$(nix-instantiate --eval --strict --json 2>&1 \ - -E '{ path }: let lib = import ; in lib.filesystem.pathType path' \ - --argstr path "$path") - if [[ ! "$actualPathType" =~ $expectedPathType ]]; then - die "lib.filesystem.pathType \"$path\" == $actualPathType, but $expectedPathType was expected" +expectSuccess() { + local expr=$1 + local expectedResultRegex=$2 + if ! result=$(nix-instantiate --eval --strict --json \ + --expr "with (import ).filesystem; $expr"); then + die "$expr failed to evaluate, but it was expected to succeed" + fi + if [[ ! "$result" =~ $expectedResultRegex ]]; then + die "$expr == $result, but $expectedResultRegex was expected" fi } -checkPathType "/" '"directory"' -checkPathType "$PWD/directory" '"directory"' -checkPathType "$PWD/regular" '"regular"' -checkPathType "$PWD/symlink" '"symlink"' -checkPathType "$PWD/fifo" '"unknown"' -# Different errors depending on whether the builtins.readFilePath primop is available or not -checkPathType "$PWD/non-existent" "error: (evaluation aborted with the following error message: 'lib.filesystem.pathType: Path $PWD/non-existent does not exist.'|getting status of '$PWD/non-existent': No such file or directory)" - -checkPathIsDirectory() { - local path=$1 - local expectedIsDirectory=$2 - local actualIsDirectory=$(nix-instantiate --eval --strict --json 2>&1 \ - -E '{ path }: let lib = import ; in lib.filesystem.pathIsDirectory path' \ - --argstr path "$path") - if [[ "$actualIsDirectory" != "$expectedIsDirectory" ]]; then - die "lib.filesystem.pathIsDirectory \"$path\" == $actualIsDirectory, but $expectedIsDirectory was expected" +expectFailure() { + local expr=$1 + local expectedErrorRegex=$2 + if result=$(nix-instantiate --eval --strict --json 2>"$work/stderr" \ + --expr "with (import ).filesystem; $expr"); then + die "$expr evaluated successfully to $result, but it was expected to fail" + fi + if [[ ! "$(<"$work/stderr")" =~ $expectedErrorRegex ]]; then + die "Error was $(<"$work/stderr"), but $expectedErrorRegex was expected" fi } -checkPathIsDirectory "/" "true" -checkPathIsDirectory "$PWD/directory" "true" -checkPathIsDirectory "$PWD/regular" "false" -checkPathIsDirectory "$PWD/symlink" "false" -checkPathIsDirectory "$PWD/fifo" "false" -checkPathIsDirectory "$PWD/non-existent" "false" +expectSuccess "pathType /." '"directory"' +expectSuccess "pathType $PWD/directory" '"directory"' +expectSuccess "pathType $PWD/regular" '"regular"' +expectSuccess "pathType $PWD/symlink" '"symlink"' +expectSuccess "pathType $PWD/fifo" '"unknown"' +# Different errors depending on whether the builtins.readFilePath primop is available or not +expectFailure "pathType $PWD/non-existent" "error: (evaluation aborted with the following error message: 'lib.filesystem.pathType: Path $PWD/non-existent does not exist.'|getting status of '$PWD/non-existent': No such file or directory)" -checkPathIsRegularFile() { - local path=$1 - local expectedIsRegularFile=$2 - local actualIsRegularFile=$(nix-instantiate --eval --strict --json 2>&1 \ - -E '{ path }: let lib = import ; in lib.filesystem.pathIsRegularFile path' \ - --argstr path "$path") - if [[ "$actualIsRegularFile" != "$expectedIsRegularFile" ]]; then - die "lib.filesystem.pathIsRegularFile \"$path\" == $actualIsRegularFile, but $expectedIsRegularFile was expected" - fi -} +expectSuccess "pathIsDirectory /." "true" +expectSuccess "pathIsDirectory $PWD/directory" "true" +expectSuccess "pathIsDirectory $PWD/regular" "false" +expectSuccess "pathIsDirectory $PWD/symlink" "false" +expectSuccess "pathIsDirectory $PWD/fifo" "false" +expectSuccess "pathIsDirectory $PWD/non-existent" "false" -checkPathIsRegularFile "/" "false" -checkPathIsRegularFile "$PWD/directory" "false" -checkPathIsRegularFile "$PWD/regular" "true" -checkPathIsRegularFile "$PWD/symlink" "false" -checkPathIsRegularFile "$PWD/fifo" "false" -checkPathIsRegularFile "$PWD/non-existent" "false" +expectSuccess "pathIsRegularFile /." "false" +expectSuccess "pathIsRegularFile $PWD/directory" "false" +expectSuccess "pathIsRegularFile $PWD/regular" "true" +expectSuccess "pathIsRegularFile $PWD/symlink" "false" +expectSuccess "pathIsRegularFile $PWD/fifo" "false" +expectSuccess "pathIsRegularFile $PWD/non-existent" "false" echo >&2 tests ok -- cgit 1.4.1 From 0b6021ee53eb4677e96f28a260db9157b4f19c7a Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Fri, 26 May 2023 18:31:35 +0200 Subject: lib/tests: Fix when run with Nix 2.3 --- lib/tests/modules.sh | 2 +- lib/tests/sources.sh | 23 ++++++++++++++--------- 2 files changed, 15 insertions(+), 10 deletions(-) (limited to 'lib/tests') diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh index 7fdc3d3d81aa..7aebba6b589e 100755 --- a/lib/tests/modules.sh +++ b/lib/tests/modules.sh @@ -378,7 +378,7 @@ checkConfigOutput '^{ }$' config.sub.nixosOk ./class-check.nix checkConfigError 'The module .*/module-class-is-darwin.nix was imported into nixos instead of darwin.' config.sub.nixosFail.config ./class-check.nix # submoduleWith type merge with different class -checkConfigError 'error: A submoduleWith option is declared multiple times with conflicting class values "darwin" and "nixos".' config.sub.mergeFail.config ./class-check.nix +checkConfigError 'A submoduleWith option is declared multiple times with conflicting class values "darwin" and "nixos".' config.sub.mergeFail.config ./class-check.nix # _type check checkConfigError 'Could not load a value as a module, because it is of type "flake", in file .*/module-imports-_type-check.nix' config.ok.config ./module-imports-_type-check.nix diff --git a/lib/tests/sources.sh b/lib/tests/sources.sh index a7f490a79d74..cda77aa96b28 100755 --- a/lib/tests/sources.sh +++ b/lib/tests/sources.sh @@ -23,14 +23,19 @@ clean_up() { trap clean_up EXIT cd "$work" -touch {README.md,module.o,foo.bar} +# Crudely unquotes a JSON string by just taking everything between the first and the second quote. +# We're only using this for resulting /nix/store paths, which can't contain " anyways, +# nor can they contain any other characters that would need to be escaped specially in JSON +# This way we don't need to add a dependency on e.g. jq +crudeUnquoteJSON() { + cut -d \" -f2 +} -# nix-instantiate doesn't write out the source, only computing the hash, so -# this uses the experimental nix command instead. +touch {README.md,module.o,foo.bar} -dir="$(nix eval --impure --raw --expr '(with import ; "${ +dir="$(nix-instantiate --eval --strict --read-write-mode --json --expr '(with import ; "${ cleanSource ./. -}")')" +}")' | crudeUnquoteJSON)" (cd "$dir"; find) | sort -f | diff -U10 - <(cat < Date: Fri, 26 May 2023 18:32:38 +0200 Subject: lib/tests: Also run with nixVersions.minimum and nixVersions.unstable The previous commits ensure that the tests also succeed with those versions --- lib/tests/release.nix | 106 +++++++++++++++++++++++++++----------------------- 1 file changed, 58 insertions(+), 48 deletions(-) (limited to 'lib/tests') diff --git a/lib/tests/release.nix b/lib/tests/release.nix index f5c6e81030ca..c3bf58db241f 100644 --- a/lib/tests/release.nix +++ b/lib/tests/release.nix @@ -2,53 +2,63 @@ # Don't test properties of pkgs.lib, but rather the lib in the parent directory pkgs ? import ../.. {} // { lib = throw "pkgs.lib accessed, but the lib tests should use nixpkgs' lib path directly!"; }, nix ? pkgs.nix, + nixVersions ? [ pkgs.nixVersions.minimum nix pkgs.nixVersions.unstable ], }: -pkgs.runCommand "nixpkgs-lib-tests" { - buildInputs = [ - (import ./check-eval.nix) - (import ./maintainers.nix { - inherit pkgs; - lib = import ../.; - }) - (import ./teams.nix { - inherit pkgs; - lib = import ../.; - }) - (import ../path/tests { - inherit pkgs; - }) - ]; - nativeBuildInputs = [ - nix - ]; - strictDeps = true; -} '' - datadir="${nix}/share" - export TEST_ROOT=$(pwd)/test-tmp - export NIX_BUILD_HOOK= - export NIX_CONF_DIR=$TEST_ROOT/etc - export NIX_LOCALSTATE_DIR=$TEST_ROOT/var - export NIX_LOG_DIR=$TEST_ROOT/var/log/nix - export NIX_STATE_DIR=$TEST_ROOT/var/nix - export NIX_STORE_DIR=$TEST_ROOT/store - export PAGER=cat - cacheDir=$TEST_ROOT/binary-cache - - mkdir -p $NIX_CONF_DIR - echo "experimental-features = nix-command" >> $NIX_CONF_DIR/nix.conf - - nix-store --init - - cp -r ${../.} lib - echo "Running lib/tests/modules.sh" - bash lib/tests/modules.sh - - echo "Running lib/tests/filesystem.sh" - TEST_LIB=$PWD/lib bash lib/tests/filesystem.sh - - echo "Running lib/tests/sources.sh" - TEST_LIB=$PWD/lib bash lib/tests/sources.sh - - touch $out -'' +let + testWithNix = nix: + pkgs.runCommand "nixpkgs-lib-tests-nix-${nix.version}" { + buildInputs = [ + (import ./check-eval.nix) + (import ./maintainers.nix { + inherit pkgs; + lib = import ../.; + }) + (import ./teams.nix { + inherit pkgs; + lib = import ../.; + }) + (import ../path/tests { + inherit pkgs; + }) + ]; + nativeBuildInputs = [ + nix + ]; + strictDeps = true; + } '' + datadir="${nix}/share" + export TEST_ROOT=$(pwd)/test-tmp + export NIX_BUILD_HOOK= + export NIX_CONF_DIR=$TEST_ROOT/etc + export NIX_LOCALSTATE_DIR=$TEST_ROOT/var + export NIX_LOG_DIR=$TEST_ROOT/var/log/nix + export NIX_STATE_DIR=$TEST_ROOT/var/nix + export NIX_STORE_DIR=$TEST_ROOT/store + export PAGER=cat + cacheDir=$TEST_ROOT/binary-cache + + mkdir -p $NIX_CONF_DIR + echo "experimental-features = nix-command" >> $NIX_CONF_DIR/nix.conf + + nix-store --init + + cp -r ${../.} lib + echo "Running lib/tests/modules.sh" + bash lib/tests/modules.sh + + echo "Running lib/tests/filesystem.sh" + TEST_LIB=$PWD/lib bash lib/tests/filesystem.sh + + echo "Running lib/tests/sources.sh" + TEST_LIB=$PWD/lib bash lib/tests/sources.sh + + mkdir $out + echo success > $out/${nix.version} + ''; + +in + pkgs.symlinkJoin { + name = "nixpkgs-lib-tests"; + paths = map testWithNix nixVersions; + } -- cgit 1.4.1