Files
lix/tests/functional2/cli/test_doctor.py
T
rootile 25d47498bd cli/doctor: fix crash when having relative paths in PATH
fixes #1244

Change-Id: Ifefab62dcedaea4bccd1546bf63e2081fc040ce1
2026-07-16 13:04:58 +00:00

137 lines
4.0 KiB
Python

from pathlib import Path
from textwrap import dedent
from testlib.fixtures.file_helper import File
from testlib.fixtures.file_helper import with_files
from testlib.fixtures.nix import Nix
import pytest
pytestmark = pytest.mark.no_daemon
@pytest.mark.usefixtures("fake_nixpkgs")
def test_doctor_local_store(nix: Nix):
res = nix.nix(["doctor", "-v"]).run().ok()
out = res.stderr_plain
assert "[PASS] All profiles are gcroots." in out
assert "[PASS] Client protocol matches store protocol." in out
assert "You are trusted" in out
assert "[FAIL] Error: current generation cannot be discovered" in out
@pytest.mark.usefixtures("fake_nixpkgs")
def test_doctor_remote_store(nix: Nix):
res = (
nix.nix(
[
"--store",
f"ssh-ng://localhost?remote-store={nix.env.dirs.test_root}/other-store",
"doctor",
]
)
.run()
.ok()
)
assert "Running checks against store uri ssh-ng://localhost" in res.stderr_plain
@pytest.mark.usefixtures("fake_nixpkgs")
def test_doctor_nixpkgs(nix: Nix):
res = nix.nix(["doctor", "-v"], flake=True).run().ok()
out = res.stderr_plain
assert "[INFO] Nixpkgs provenance: nixpkgs=" in out
@pytest.mark.usefixtures("fake_nixpkgs")
def test_doctor_no_builders(nix: Nix):
res = nix.nix(["doctor"]).run().ok()
assert "[INFO] no remote builders found" in res.stderr_plain
@pytest.mark.usefixtures("fake_nixpkgs")
def test_doctor_checks_builder_bad(nix: Nix):
nix.settings.builders = "[machines.hello]"
res = nix.nix(["doctor"]).run().expect(2)
assert "[FAIL] invalid remote builders configuration" in res.stderr_plain
@with_files(
{
"machines.toml": File(
dedent("""
[machines.andesite]
uri = "dummy://"
""")
)
}
)
@pytest.mark.usefixtures("fake_nixpkgs")
def test_doctor_checks_builder_connection_flag(nix: Nix, files: Path):
nix.settings.builders = f"@{files / 'machines.toml'}"
res = nix.nix(["doctor", "-v", "--check-remotes"]).run().expect(2)
out = res.stderr_plain
assert "[INFO] 1 remote builder(s) configured" in out
assert "Running checks against store uri dummy" in out
assert "Store protocol: unknown" in out
@with_files(
{
"machines.toml": File(
dedent("""
[machines.andesite]
uri = "bad://connection"
[machines.diorite]
uri = "another://bad.connection"
""")
)
}
)
@pytest.mark.usefixtures("fake_nixpkgs")
def test_doctor_builders_bad_connection(nix: Nix, files: Path):
nix.settings.builders = f"@{files / 'machines.toml'}"
res = nix.nix(["doctor", "-v", "--check-remotes"]).run().expect(2)
out = res.stderr_plain
assert "attempting connection to andesite" in out
assert "attempting connection to diorite" in out
assert (
"[FAIL] connection failed: error: don't know how to open Nix store 'bad://connection'"
in out
)
assert (
"[FAIL] connection failed: error: don't know how to open Nix store 'another://bad.connection'"
in out
)
@with_files(
{
"machines.toml": File(
dedent("""
[machines.andesite]
uri = "dummy://"
""")
)
}
)
@pytest.mark.usefixtures("fake_nixpkgs")
def test_doctor_no_check_connection(nix: Nix, files: Path):
nix.settings.builders = f"@{files / 'machines.toml'}"
res = nix.nix(["doctor", "-v"]).run().ok()
out = res.stderr_plain
assert "[INFO] 1 remote builder(s) configured" in out
assert "Running checks against store uri dummy" not in out
assert "Store protocol: unknown" not in out
@pytest.mark.usefixtures("fake_nixpkgs")
def test_doctor_dot_in_path(nix: Nix):
"""Haveing `.` in the PATH used to crash nix doctor with "not an absolute path" """
nix.env.path.prepend(".")
nix.nix(["doctor", "-v"]).run().ok()