diff --git a/src/daemon/service.test.ts b/src/daemon/service.test.ts new file mode 100644 index 00000000000..19811e49699 --- /dev/null +++ b/src/daemon/service.test.ts @@ -0,0 +1,40 @@ +import { afterEach, describe, expect, it } from "vitest"; +import { resolveGatewayService } from "./service.js"; + +const originalPlatformDescriptor = Object.getOwnPropertyDescriptor(process, "platform"); + +function setPlatform(value: NodeJS.Platform | "aix") { + if (!originalPlatformDescriptor) { + throw new Error("missing process.platform descriptor"); + } + Object.defineProperty(process, "platform", { + configurable: true, + enumerable: originalPlatformDescriptor.enumerable ?? false, + value, + }); +} + +afterEach(() => { + if (!originalPlatformDescriptor) { + return; + } + Object.defineProperty(process, "platform", originalPlatformDescriptor); +}); + +describe("resolveGatewayService", () => { + it.each([ + { platform: "darwin" as const, label: "LaunchAgent", loadedText: "loaded" }, + { platform: "linux" as const, label: "systemd", loadedText: "enabled" }, + { platform: "win32" as const, label: "Scheduled Task", loadedText: "registered" }, + ])("returns the registered adapter for $platform", ({ platform, label, loadedText }) => { + setPlatform(platform); + const service = resolveGatewayService(); + expect(service.label).toBe(label); + expect(service.loadedText).toBe(loadedText); + }); + + it("throws for unsupported platforms", () => { + setPlatform("aix"); + expect(() => resolveGatewayService()).toThrow("Gateway service install not supported on aix"); + }); +}); diff --git a/src/daemon/service.ts b/src/daemon/service.ts index f38c59fef66..b0de0baa49b 100644 --- a/src/daemon/service.ts +++ b/src/daemon/service.ts @@ -64,51 +64,49 @@ export type GatewayService = { readRuntime: (env: GatewayServiceEnv) => Promise; }; +const GATEWAY_SERVICE_REGISTRY = { + darwin: { + label: "LaunchAgent", + loadedText: "loaded", + notLoadedText: "not loaded", + install: ignoreInstallResult(installLaunchAgent), + uninstall: uninstallLaunchAgent, + stop: stopLaunchAgent, + restart: restartLaunchAgent, + isLoaded: isLaunchAgentLoaded, + readCommand: readLaunchAgentProgramArguments, + readRuntime: readLaunchAgentRuntime, + }, + linux: { + label: "systemd", + loadedText: "enabled", + notLoadedText: "disabled", + install: ignoreInstallResult(installSystemdService), + uninstall: uninstallSystemdService, + stop: stopSystemdService, + restart: restartSystemdService, + isLoaded: isSystemdServiceEnabled, + readCommand: readSystemdServiceExecStart, + readRuntime: readSystemdServiceRuntime, + }, + win32: { + label: "Scheduled Task", + loadedText: "registered", + notLoadedText: "missing", + install: ignoreInstallResult(installScheduledTask), + uninstall: uninstallScheduledTask, + stop: stopScheduledTask, + restart: restartScheduledTask, + isLoaded: isScheduledTaskInstalled, + readCommand: readScheduledTaskCommand, + readRuntime: readScheduledTaskRuntime, + }, +} satisfies Partial>; + export function resolveGatewayService(): GatewayService { - if (process.platform === "darwin") { - return { - label: "LaunchAgent", - loadedText: "loaded", - notLoadedText: "not loaded", - install: ignoreInstallResult(installLaunchAgent), - uninstall: uninstallLaunchAgent, - stop: stopLaunchAgent, - restart: restartLaunchAgent, - isLoaded: isLaunchAgentLoaded, - readCommand: readLaunchAgentProgramArguments, - readRuntime: readLaunchAgentRuntime, - }; + const service = GATEWAY_SERVICE_REGISTRY[process.platform]; + if (service) { + return service; } - - if (process.platform === "linux") { - return { - label: "systemd", - loadedText: "enabled", - notLoadedText: "disabled", - install: ignoreInstallResult(installSystemdService), - uninstall: uninstallSystemdService, - stop: stopSystemdService, - restart: restartSystemdService, - isLoaded: isSystemdServiceEnabled, - readCommand: readSystemdServiceExecStart, - readRuntime: readSystemdServiceRuntime, - }; - } - - if (process.platform === "win32") { - return { - label: "Scheduled Task", - loadedText: "registered", - notLoadedText: "missing", - install: ignoreInstallResult(installScheduledTask), - uninstall: uninstallScheduledTask, - stop: stopScheduledTask, - restart: restartScheduledTask, - isLoaded: isScheduledTaskInstalled, - readCommand: readScheduledTaskCommand, - readRuntime: readScheduledTaskRuntime, - }; - } - throw new Error(`Gateway service install not supported on ${process.platform}`); }