diff --git a/tests/functional/export.sh b/tests/functional/export.sh deleted file mode 100644 index 2238539bc..000000000 --- a/tests/functional/export.sh +++ /dev/null @@ -1,36 +0,0 @@ -source common.sh - -clearStore - -outPath=$(nix-build dependencies.nix --no-out-link) - -nix-store --export $outPath > $TEST_ROOT/exp - -nix-store --export $(nix-store -qR $outPath) > $TEST_ROOT/exp_all - -if nix-store --export $outPath >/dev/full ; then - echo "exporting to a bad file descriptor should fail" - exit 1 -fi - - -clearStore - -if nix-store --import < $TEST_ROOT/exp; then - echo "importing a non-closure should fail" - exit 1 -fi - - -clearStore - -nix-store --import < $TEST_ROOT/exp_all - -nix-store --export $(nix-store -qR $outPath) > $TEST_ROOT/exp_all2 - - -clearStore - -# Regression test: the derivers in exp_all2 are empty, which shouldn't -# cause a failure. -nix-store --import < $TEST_ROOT/exp_all2 diff --git a/tests/functional/meson.build b/tests/functional/meson.build index 052e3d66f..527ed368f 100644 --- a/tests/functional/meson.build +++ b/tests/functional/meson.build @@ -77,7 +77,6 @@ functional_tests_scripts = [ 'repl.sh', 'binary-cache-build-remote.sh', 'logging.sh', - 'export.sh', 'config.sh', 'filter-source.sh', 'misc.sh', diff --git a/tests/functional2/store/test_export.py b/tests/functional2/store/test_export.py new file mode 100644 index 000000000..327206bc7 --- /dev/null +++ b/tests/functional2/store/test_export.py @@ -0,0 +1,56 @@ +from collections.abc import Callable +from testlib.fixtures.command import Command +from testlib.fixtures.file_helper import with_files +from testlib.utils import get_global_asset_pack +from testlib.fixtures.nix import Nix + + +@with_files(get_global_asset_pack("dependencies")) +def test_export(nix: Nix): + out_path = nix.nix_build(["dependencies.nix", "--no-out-link"]).run().ok().stdout_plain + + res = nix.nix_store(["--export", out_path]).run().ok() + exported = res.stdout + + nix.clear_store() + + res = nix.nix_store(["--import"]).with_stdin(exported).run().expect(1) + # importing a non-closure should fail + assert "does not exist in the Lix database" in res.stderr_plain + + +@with_files(get_global_asset_pack("dependencies")) +def test_export_full(nix: Nix): + out_path = nix.nix_build(["dependencies.nix", "--no-out-link"]).run().ok().stdout_plain + + paths = nix.nix_store(["-qR", out_path]).run().ok().stdout_plain.splitlines() + res = nix.nix_store(["--export", *paths]).run().ok() + exported = res.stdout + + nix.clear_store() + + res = nix.nix_store(["--import"]).with_stdin(exported).run().ok() + + assert set(res.stdout_plain.splitlines()) == set(paths) + + res = nix.nix_store(["--export", *paths]).run().ok() + + nix.clear_store() + + # Regression test: the derivers in exp_all2 are empty, which shouldn't + # cause a failure. + + res = nix.nix_store(["--import"]).with_stdin(res.stdout).run().ok() + assert set(res.stdout_plain.splitlines()) == set(paths) + + +@with_files(get_global_asset_pack("dependencies")) +def test_bad_fd(nix: Nix, command: Callable[[list[str]], Command]): + out_path = nix.nix_build(["dependencies.nix", "--no-out-link"]).run().ok().stdout_plain + # HACK(rootile, 2026-06): we can't pipe things into files from within our framework + cmd = command(["bash", "-c", 'nix-store --export "$1" > /dev/full', "nix-store", out_path]) + res = cmd.run().expect(1) + assert ( + "error: writing to file:" in res.stderr_plain + or "Operation not permitted" in res.stderr_plain + )