From 266e3008c9280325865a047b4a679b1ea4d17919 Mon Sep 17 00:00:00 2001 From: knqiufan Date: Mon, 7 Sep 2026 10:32:48 +0800 Subject: [PATCH] fix(service): kickstart newly bootstrapped LaunchAgents --- src/powercontext/service/adapters/launchd.py | 4 ++++ tests/test_service.py | 21 ++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/powercontext/service/adapters/launchd.py b/src/powercontext/service/adapters/launchd.py index beec18f15b..bba1c557a8 100644 --- a/src/powercontext/service/adapters/launchd.py +++ b/src/powercontext/service/adapters/launchd.py @@ -205,6 +205,10 @@ def start(self, *, reload_definition: bool) -> None: is_loaded = False if not is_loaded: self._run("bootstrap", self._domain, str(self.artifact_path)) + # bootstrap registers the job, while kickstart is the launchd + # operation that guarantees an immediate start regardless of the + # configured launch conditions. + self._run("kickstart", self._target) elif self.manager_state() is not ManagerState.ACTIVE: self._run("kickstart", "-k", self._target) diff --git a/tests/test_service.py b/tests/test_service.py index 0c773bc3f5..0918a59fc8 100644 --- a/tests/test_service.py +++ b/tests/test_service.py @@ -1086,6 +1086,27 @@ def test_launchd_stop_waits_until_bootout_removes_the_loaded_job( run.assert_called_once_with("bootout", "gui/501/com.oceanbase.powercontext") +def test_launchd_start_kickstarts_a_newly_bootstrapped_job( + tmp_path: Path, + monkeypatch: pytest.MonkeyPatch, +) -> None: + adapter = LaunchdUserAdapter(home=tmp_path, uid=501) + monkeypatch.setattr( + adapter, + "loaded_registration", + lambda: ManagerRegistration(ManagerOwnershipState.NOT_LOADED), + ) + run = Mock() + monkeypatch.setattr(adapter, "_run", run) + + adapter.start(reload_definition=False) + + assert run.call_args_list == [ + (("bootstrap", "gui/501", str(adapter.artifact_path)), {}), + (("kickstart", "gui/501/com.oceanbase.powercontext"), {}), + ] + + @pytest.mark.parametrize("corruption", ["fragment", "path", "arguments", "marker", "metadata"]) def test_systemd_loaded_registration_requires_matching_fragment_command_and_metadata( tmp_path: Path,