pour the foundations for rpc, and let them set. this is very much unstable and must be opted into with explicit store uris (e.g. by setting `NIX_REMOTE=daemon?protocol=any`). the daemon sockets are not enabled by default and must be enabled with the `rpc-sockets` experimental feature. we will not advertise this just yet because in the current state it one has to be *very* dedicated to the rpc cause to deploy this, but once we have some more bits migrated we may want to add release notes and officially as for beta testing. Co-Authored-By: piegames <git@piegames.de> Change-Id: I85a96ccb700b91190c1eb37154bcc6ae1c03401a
103 lines
3.2 KiB
Python
103 lines
3.2 KiB
Python
import pytest
|
|
import itertools
|
|
|
|
from testlib.fixtures.nix import Nix
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def setup(nix: Nix):
|
|
nix.settings.add_xp_feature("nix-command")
|
|
|
|
|
|
def _observe_socket_order(nix: Nix, uri: str) -> list[str]:
|
|
cmd = nix.nix(["store", "ping", "--store", uri, "--debug"]).run()
|
|
cmd.expect(1)
|
|
return [
|
|
line.removeprefix("skipping socket ").split(":")[0]
|
|
for line in cmd.stderr_s.splitlines()
|
|
if line.startswith("skipping socket ")
|
|
]
|
|
|
|
|
|
def test_connection_order_plain(nix: Nix):
|
|
assert _observe_socket_order(nix, f"unix://{nix.env.dirs.home}/socket") == [
|
|
str(nix.env.dirs.home / "socket")
|
|
]
|
|
|
|
|
|
def test_connection_order_any(nix: Nix):
|
|
assert _observe_socket_order(nix, f"unix://{nix.env.dirs.home}?protocol=any") == [
|
|
str(nix.env.dirs.home / "lix-xp-1/socket"),
|
|
str(nix.env.dirs.home / "socket"),
|
|
]
|
|
|
|
|
|
def test_connection_protocol_invalid(nix: Nix):
|
|
cmd = nix.nix(["store", "ping", "--store", "unix:///dev/null?protocol=invalid"]).run()
|
|
cmd.expect(1)
|
|
assert "unsupported daemon protocol invalid" in cmd.stderr_s
|
|
|
|
|
|
def test_connection_protocol_any_not_standalone(nix: Nix):
|
|
cmd = nix.nix(["store", "ping", "--store", "unix:///dev/null?protocol=any,any"]).run()
|
|
cmd.expect(1)
|
|
assert "unsupported daemon protocol any" in cmd.stderr_s
|
|
|
|
|
|
_protocols: dict[str, str] = {
|
|
"lix-xp-1": "lix-xp-1/socket",
|
|
"legacy-combined": ".",
|
|
"legacy": "socket",
|
|
}
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("protos", "sockets"),
|
|
[
|
|
(list(ps), [_protocols[p] for p in ps])
|
|
for r in range(1, len(_protocols) + 1)
|
|
for ps in itertools.permutations(_protocols, r)
|
|
],
|
|
)
|
|
def test_connection_order_specific_unix(nix: Nix, protos: list[str], sockets: list[str]):
|
|
assert _observe_socket_order(
|
|
nix, f"unix://{nix.env.dirs.home}?protocol={','.join(protos)}"
|
|
) == [str(nix.env.dirs.home / s) for s in sockets]
|
|
|
|
|
|
# this once can't handle legacy-combined sockets because those don't search paths
|
|
@pytest.mark.parametrize(
|
|
("protos", "sockets"),
|
|
[
|
|
(list(ps), [_protocols[p] for p in ps])
|
|
for r in range(1, len(_protocols) + 1)
|
|
for ps in itertools.permutations(
|
|
{t: p for t, p in _protocols.items() if t != "legacy-combined"}, r
|
|
)
|
|
],
|
|
)
|
|
def test_connection_order_specific_daemon_modern(nix: Nix, protos: list[str], sockets: list[str]):
|
|
assert _observe_socket_order(nix, f"daemon?protocol={','.join(protos)}") == [
|
|
str(nix.env.dirs.nix_state_dir / "daemon-socket" / s) for s in sockets
|
|
]
|
|
|
|
|
|
# this once can't handle legacy-combined sockets because those don't search paths
|
|
@pytest.mark.parametrize(
|
|
("protos", "sockets"),
|
|
[
|
|
(list(ps), [_protocols[p] for p in ps])
|
|
for r in range(1, len(_protocols) + 1)
|
|
for ps in itertools.permutations(
|
|
{t: p for t, p in _protocols.items() if t != "legacy-combined"}, r
|
|
)
|
|
],
|
|
)
|
|
def test_connection_order_specific_daemon_modern_relocated(
|
|
nix: Nix, protos: list[str], sockets: list[str]
|
|
):
|
|
nix.env["LIX_DAEMON_SOCKET_DIR"] = str(nix.env.dirs.home)
|
|
assert _observe_socket_order(nix, f"daemon?protocol={','.join(protos)}") == [
|
|
str(nix.env.dirs.home / s) for s in sockets
|
|
]
|