diff --git a/tests/distccd/test-script.py b/tests/distccd/test-script.py index a5e35ee..ea12bd7 100644 --- a/tests/distccd/test-script.py +++ b/tests/distccd/test-script.py @@ -19,7 +19,7 @@ if TYPE_CHECKING: assert machine.shell is not None ls = "eza -lah --color=always --group-directories-first" - +testing_client = "/root/.nix-profile/libexec/dynix-testing-client.py" indent = functools.partial(textwrap.indent, prefix=' ') @beartype @@ -70,13 +70,12 @@ def get_cli_args() -> argparse.Namespace: return args @beartype -def dynix_append(option: str, value: Any): +def dynix_append_cli(option: str, value: Any): + value = f'"{value}"' if isinstance(value, str) else value machine.succeed(f''' dynix append {shlex.quote(option)} {shlex.quote(str(value))} '''.strip()) -@beartype -def do_apply(): expr = textwrap.dedent(""" (import { }).config.dynamicism.applyDynamicConfiguration { } """).strip() @@ -85,49 +84,86 @@ def do_apply(): nix run --show-trace --log-format raw-with-logs --impure -E {shlex.quote(expr)} """.strip()) +@beartype +def dynix_append_daemon(option: str, value: Any): + import json + payload = json.dumps(dict( + action="append", + args=dict( + name=option, + value=value, + ), + )) + + status = machine.succeed(f"echo '{payload}' | {testing_client} /run/user/0/dynix.sock") + machine.log(f"daemon replied with status {status}") + machine.wait_for_unit("distccd.service") + +@beartype +def run_all_tests(machine: Machine, *, use_daemon: bool): + dynix_append = dynix_append_daemon if use_daemon else dynix_append_cli + + dynix_out = machine.succeed("dynix --version") + assert "dynix" in dynix_out, f"dynix not in {dynix_out=}" + + # Config should have our initial values. + args = get_cli_args() + assert args.jobs == 12, f'{args.jobs=} != 12' + assert args.job_lifetime == 900, f'{args.job_lifetime} != 900' + assert args.log_level == 'warning', f'{args.log_level=} != warning' + + with machine.nested("must succeed: initial nixos-rebuild switch"): + machine.succeed("env PAGER= nixos-rebuild switch --log-format raw-with-logs --no-reexec --fallback") + + # Config should not have changed. + args = get_cli_args() + assert args.jobs == 12, f'{args.jobs=} != 12' + assert args.job_lifetime == 900, f'{args.job_lifetime} != 900' + assert args.log_level == 'warning', f'{args.log_level=} != warning' + + new_jobs = 4 + dynix_append("services.distccd.maxJobs", new_jobs) + + # Only jobs should have changed. The others should still be default. + args = get_cli_args() + assert args.jobs == new_jobs, f'{args.jobs=} != {new_jobs=}' + assert args.job_lifetime == 900, f'{args.job_lifetime} != 900' + assert args.log_level == 'warning', f'{args.log_level=} != warning' + + new_log_level = 'error' + dynix_append("services.distccd.logLevel", f'{new_log_level}') + + args = get_cli_args() + assert args.jobs == new_jobs, f'{args.jobs=} != {new_jobs=}' + assert args.job_lifetime == 900, f'{args.job_lifetime} != 900' + assert args.log_level == new_log_level, f'{args.log_level=} != {new_log_level=}' + + # And this should set everything back. + machine.succeed("env PAGER= nixos-rebuild switch --log-format raw-with-logs --no-reexec --fallback") + args = get_cli_args() + assert args.jobs == 12, f'{args.jobs=} != 12' + assert args.job_lifetime == 900, f'{args.job_lifetime} != 900' + assert args.log_level == 'warning', f'{args.log_level=} != warning' + +machine.start(allow_reboot=True) machine.wait_for_unit("default.target") machine.wait_for_unit("install-dynix.service") +try: + run_all_tests(machine, use_daemon=False) +except Exception as e: + machine.logger.error(f"ERROR during CLI tests: {e}") + raise -dynix_out = machine.succeed("dynix --version") -assert "dynix" in dynix_out, f"dynix not in {dynix_out=}" +machine.reboot() -# Config should have our initial values. -args = get_cli_args() -assert args.jobs == 12, f'{args.jobs=} != 12' -assert args.job_lifetime == 900, f'{args.job_lifetime} != 900' -assert args.log_level == 'warning', f'{args.log_level=} != warning' - -with machine.nested("must succeed: initial nixos-rebuild switch"): - machine.succeed("env PAGER= nixos-rebuild switch --log-format raw-with-logs --no-reexec --fallback") - -# Config should not have changed. -args = get_cli_args() -assert args.jobs == 12, f'{args.jobs=} != 12' -assert args.job_lifetime == 900, f'{args.job_lifetime} != 900' -assert args.log_level == 'warning', f'{args.log_level=} != warning' - -new_jobs = 4 -dynix_append("services.distccd.maxJobs", new_jobs) -do_apply() - -# Only jobs should have changed. The others should still be default. -args = get_cli_args() -assert args.jobs == new_jobs, f'{args.jobs=} != {new_jobs=}' -assert args.job_lifetime == 900, f'{args.job_lifetime} != 900' -assert args.log_level == 'warning', f'{args.log_level=} != warning' - -new_log_level = 'error' -dynix_append("services.distccd.logLevel", f'"{new_log_level}"') -do_apply() - -args = get_cli_args() -assert args.jobs == new_jobs, f'{args.jobs=} != {new_jobs=}' -assert args.job_lifetime == 900, f'{args.job_lifetime} != 900' -assert args.log_level == new_log_level, f'{args.log_level=} != {new_log_level=}' - -# And this should set everything back. -machine.succeed("env PAGER= nixos-rebuild switch --log-format raw-with-logs --no-reexec --fallback") -args = get_cli_args() -assert args.jobs == 12, f'{args.jobs=} != 12' -assert args.job_lifetime == 900, f'{args.job_lifetime} != 900' -assert args.log_level == 'warning', f'{args.log_level=} != warning' +machine.wait_for_unit("default.target") +machine.wait_for_unit("install-dynix.service") +machine.succeed("systemctl start user@0.service") +machine.wait_for_unit("user@0.service") +machine.succeed("systemctl start dynix-daemon.service") +machine.wait_for_unit("dynix-daemon.service") +try: + run_all_tests(machine, use_daemon=True) +except Exception as e: + machine.logger.error(f"ERROR during DAEMON tests: {e}") + raise diff --git a/tests/dynix-vm-configuration.nix b/tests/dynix-vm-configuration.nix index 677ef70..f7370ae 100644 --- a/tests/dynix-vm-configuration.nix +++ b/tests/dynix-vm-configuration.nix @@ -69,7 +69,7 @@ in path = [ config.nix.package ]; serviceConfig = { Environment = [ - "RUST_LOG=trace" + "RUST_LOG=info,dynix=trace" ]; ExecSearchPath = [ "/run/current-system/sw/bin" ]; SuccessExitStatus = [ "0" "2" ];