testing: migrate flakes/flakes.sh (part 9)

bulk of build tests

Change-Id: I2b357162e16e2d14bb8ae6247ad126ad452c0825
This commit is contained in:
eldritch horrors
2026-02-25 12:47:08 +00:00
parent 3327a1fcae
commit c090a9d1ec
2 changed files with 77 additions and 45 deletions
+1 -45
View File
@@ -81,17 +81,6 @@ echo -n '# foo' >> $flake1Dir/flake.nix
git -C $flake1Dir commit -a -m 'Foo'
hash2=$(nix flake metadata flake1 --json --refresh | jq -r .revision)
# Test 'nix build' on a flake.
nix build -o $TEST_ROOT/result flake1#foo
[[ -e $TEST_ROOT/result/hello ]]
# Test packages.default.
nix build -o $TEST_ROOT/result flake1
[[ -e $TEST_ROOT/result/hello ]]
nix build -o $TEST_ROOT/result $flake1Dir
nix build -o $TEST_ROOT/result git+file://$flake1Dir
# Check that store symlinks inside a flake are not interpreted as flakes.
nix build -o $flake1Dir/result git+file://$flake1Dir
nix path-info $flake1Dir/result
@@ -105,46 +94,13 @@ nix build -o $TEST_ROOT/result --expr "(builtins.getFlake \"$flake1Dir\").packag
nix build -o $TEST_ROOT/result --expr "(builtins.getFlake \"git+file://$flake1Dir?rev=$hash2\").packages.$system.default"
# Building a flake with an unlocked dependency should fail in pure mode.
(! nix build -o $TEST_ROOT/result flake2#bar --no-registries)
(! nix build -o $TEST_ROOT/result flake2#bar --no-use-registries)
(! nix eval --expr "builtins.getFlake \"$flake2Dir\"")
# But should succeed in impure mode.
(! nix build -o $TEST_ROOT/result flake2#bar --impure)
nix build -o $TEST_ROOT/result flake2#bar --impure --no-write-lock-file
nix eval --expr "builtins.getFlake \"$flake2Dir\"" --impure
# Building a local flake with an unlocked dependency should fail with --no-update-lock-file.
expect 1 nix build -o $TEST_ROOT/result $flake2Dir#bar --no-update-lock-file 2>&1 | grep 'requires lock file changes'
# But it should succeed without that flag.
nix build -o $TEST_ROOT/result $flake2Dir#bar --no-write-lock-file
expect 1 nix build -o $TEST_ROOT/result $flake2Dir#bar --no-update-lock-file 2>&1 | grep 'requires lock file changes'
# set up lockfiles for later tests
nix build -o $TEST_ROOT/result $flake2Dir#bar --commit-lock-file
[[ -e $flake2Dir/flake.lock ]]
[[ -z $(git -C $flake2Dir diff main || echo failed) ]]
# Rerunning the build should not change the lockfile.
nix build -o $TEST_ROOT/result $flake2Dir#bar
[[ -z $(git -C $flake2Dir diff main || echo failed) ]]
# Building with a lockfile should not require a fetch of the registry.
nix build -o $TEST_ROOT/result --flake-registry file:///no-registry.json $flake2Dir#bar --refresh
nix build -o $TEST_ROOT/result --no-registries $flake2Dir#bar --refresh
nix build -o $TEST_ROOT/result --no-use-registries $flake2Dir#bar --refresh
# Updating the flake should not change the lockfile.
nix flake lock $flake2Dir
[[ -z $(git -C $flake2Dir diff main || echo failed) ]]
# Now we should be able to build the flake in pure mode.
nix build -o $TEST_ROOT/result flake2#bar
# Or without a registry.
nix build -o $TEST_ROOT/result --no-registries git+file://$flake2Dir#bar --refresh
nix build -o $TEST_ROOT/result --no-use-registries git+file://$flake2Dir#bar --refresh
# Test whether indirect dependencies work.
nix build -o $TEST_ROOT/result $flake3Dir#xyzzy
git -C $flake3Dir add flake.lock
+76
View File
@@ -290,6 +290,82 @@ class TestRegistry:
@pytest.mark.usefixtures("registry")
class TestBuild:
def test_build_attr(self, nix: Nix):
nix.nix(["build", "flake1#foo"]).run().ok()
assert (nix.env.dirs.home / "result/hello").exists()
def test_build_without_attr_registry(self, nix: Nix):
nix.nix(["build", "flake1"]).run().ok()
assert (nix.env.dirs.home / "result/hello").exists()
@pytest.mark.parametrize("scheme", ["", "git+file://"])
def test_build_without_attr_url(self, nix: Nix, flake1: Path, scheme: str):
nix.nix(["build", f"{scheme}{flake1}"]).run().ok()
assert (nix.env.dirs.home / "result/hello").exists()
@pytest.mark.parametrize("arg", ["--no-registries", "--no-use-registries"])
def test_pure_build_unlocked_deps_failure(self, nix: Nix, arg: str):
result = nix.nix(["build", "flake2#bar", arg]).run().expect(1).stderr_s
assert (
"error: 'flake:flake2' is an indirect flake reference, but registry lookups are not allowed"
in result
)
def test_impure_build_unlocked_deps_fails(self, nix: Nix):
result = nix.nix(["build", "flake2#bar", "--impure"]).run().expect(1).stderr_s
assert "error: cannot write modified lock file" in result
def test_impure_build_unlocked_deps_succeeds_with_no_write(self, nix: Nix):
logs = (
nix.nix(["build", "flake2#bar", "--impure", "--no-write-lock-file"]).run().ok().stderr_s
)
assert re.search(r"building '.*-simple.drv'", logs)
def test_build_unlocked_fails_with_no_update(self, nix: Nix, flake2: Path):
logs = nix.nix(["build", f"{flake2}#bar", "--no-update-lock-file"]).run().expect(1).stderr_s
assert "requires lock file changes" in logs
def test_build_unlocked_succeeds_with_no_write(self, nix: Nix):
logs = nix.nix(["build", "flake2#bar", "--no-write-lock-file"]).run().ok().stderr_s
assert re.search(r"building '.*-simple.drv'", logs)
class TestLockedFlake2:
@pytest.fixture(autouse=True)
def lock_flake2(self, nix: Nix, flake2: Path, registry: Path): # noqa: ARG002
nix.nix(["flake", "lock", flake2, "--commit-lock-file"]).run().ok()
def test_setup_did_commit(self, flake2: Path, git: Git):
assert (flake2 / "flake.lock").exists()
assert not git(flake2, "diff", "HEAD").stdout_s
def test_rerunning_builds_does_not_change_lockfile(self, nix: Nix, flake2: Path, git: Git):
nix.nix(["build", f"{flake2}#bar", "--no-write-lock-file"]).run().ok()
assert not git(flake2, "diff", "HEAD").stdout_s
@pytest.mark.parametrize(
"args",
[
["--flake-registry", "file:///no-registry.json", "--refresh"],
["--no-registries", "--refresh"],
["--no-use-registries", "--refresh"],
[],
],
)
@pytest.mark.parametrize("scheme", ["", "git+file://"])
def test_locked_build_works(self, nix: Nix, flake2: Path, args: list[str], scheme: str):
# registry fetches are not logged anywhere!
nix.nix(["build", *args, f"{scheme}{flake2}#bar"]).run().ok()
def test_lock_idempotent(self, nix: Nix, flake2: Path, git: Git):
nix.nix(["flake", "lock", flake2]).run().ok()
assert not git(flake2, "diff", "HEAD").stdout_s
def test_indirect_dependencies(self, nix: Nix, flake3: Path):
logs = nix.nix(["build", f"{flake3}#xyzzy"]).run().ok().stderr_s
assert "Added input 'flake2'" in logs
assert "Added input 'flake2/flake1'" in logs
assert re.search(r"building '.*-simple.drv'", logs)
def test_bare_repo(self, nix: Nix, flake1: Path, git: Git):
git(None, "clone", "--bare", flake1, "bare")
logs = nix.nix(["build", f"git+file://{nix.env.dirs.home}/bare"]).run().ok().stderr_s