systemd-ts 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index-DeNBLyGA.d.mts.map +1 -0
- package/dist/test.d.mts.map +1 -0
- package/dist/test.mjs.map +1 -1
- package/package.json +2 -2
- package/src/test/harness.ts +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-DeNBLyGA.d.mts","names":[],"sources":["../src/main/internal.ts","../src/main/executable.ts","../src/main/systemd-service.ts","../src/main/systemd-timer.ts","../src/main/types.ts","../src/main/errors.ts","../src/main/notify.ts","../src/main/systemctl.ts","../src/main/systemd.ts","../src/main/index.ts"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.mts","names":[],"sources":["../src/test/host.ts","../src/test/harness.ts","../src/test/sandbox.ts"],"mappings":";;;UAwBiB,YAAA;EAAA,SACN,OAAA,EAAS,mBAAA;EAAA,SACT,UAAA;EAAA,SACA,aAAA;EAAA,SACA,QAAA;EAAA,SACA,QAAA;EAAA,SACA,SAAA;AAAA;AAAA,KAGN,mBAAA;AAAA,iBAYW,eAAA,CAAA,GAAmB,YAAA;AAAA,iBAInB,cAAA,CAAA,GAAkB,OAAA,CAAQ,YAAA;AAAA,iBAK1B,aAAA,CAAA;AAAA,iBAIM,eAAA,CAAgB,MAAA,WAAiB,OAAA;AAAA,iBAKjC,uBAAA,CAAwB,MAAA,WAAiB,OAAA;;;;;AAvC/D;;iBCVgB,0BAAA,CACd,UAAA,GAAa,MAAA,aAAmB,OAAA,WAC/B,eAAA;;;;cAqBU,oBAAA,EAAsB,eAAA;;;;cAKtB,4BAAA,EAA8B,eAAA;;;ADX1C;;iBCkBe,cAAA,CAAA,GAAkB,OAAA;;;ADJlC;;iBCkBgB,sBAAA,CAAA,GAA0B,OAAA;;;UC3DzB,WAAA;EAAA,SACN,EAAA;EAAA,SACA,aAAA;EAAA,SACA,UAAA;EAAA,SACA,OAAA;EAAA,SACA,OAAA;AAAA;AAAA,iBASW,iBAAA,CAAkB,QAAA,YAAoB,OAAA,CAAQ,WAAA;AAAA,iBAyB9C,yBAAA,CAAA,GAA6B,OAAA;AAAA,iBAgCnC,qBAAA,CAAA,GAAyB,WAAA"}
|
package/dist/test.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.mjs","names":["delay","shellQuote","shellQuote"],"sources":["../src/test/host.ts","../src/test/sandbox.ts","../src/test/harness.ts"],"sourcesContent":["import { execFile, spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\nconst commandMaxBufferBytes = 16 * 1024 * 1024;\nconst dockerBuildTimeoutMs = 5 * 60 * 1_000;\nconst dockerExecTimeoutMs = 60 * 1_000;\nconst guestCommandTimeoutMs = 10 * 1_000;\nconst repoRoot = fileURLToPath(new URL(`../../../../`, import.meta.url));\nconst dockerfilePath = fileURLToPath(new URL(`./systemd-container.Dockerfile`, import.meta.url));\nconst selectedBackendName = resolveBackendName(process.env[`SYSTEMD_TS_TEST_HOST_BACKEND`]);\nconst colimaHome = process.env[`COLIMA_HOME`] ?? `${repoRoot}.colima`;\nconst limaHome = process.env[`LIMA_HOME`] ?? `${colimaHome}/_lima`;\nconst colimaProfile = process.env[`COLIMA_PROFILE`] ?? `systemd-ts`;\nconst dockerStateRoot = process.env[`SYSTEMD_TS_TEST_HOST_ROOT`] ?? `${repoRoot}.docker`;\nconst dockerImage = process.env[`SYSTEMD_TS_TEST_DOCKER_IMAGE`] ?? `systemd-ts-test-host:local`;\nconst dockerUser = process.env[`SYSTEMD_TS_TEST_DOCKER_USER`] ?? `runner`;\nconst dockerConfiguredUserId = process.env[`SYSTEMD_TS_TEST_DOCKER_UID`];\nconst dockerContainer =\n process.env[`SYSTEMD_TS_TEST_DOCKER_CONTAINER`] ?? defaultDockerContainerName();\n\nexport interface TestHostInfo {\n readonly backend: TestHostBackendName;\n readonly colimaHome?: string;\n readonly colimaProfile?: string;\n readonly limaHome?: string;\n readonly repoRoot: string;\n readonly stateRoot: string;\n}\n\ntype TestHostBackendName = `colima` | `docker`;\n\ninterface TestHostBackend {\n readonly info: TestHostInfo;\n ensureHost(): Promise<void>;\n createGuestShellProcess(): ChildProcessWithoutNullStreams;\n runIsolatedCommand(script: string): Promise<string>;\n}\n\nlet ensuredHost: Promise<TestHostInfo> | undefined;\nlet guestShell: GuestShell | undefined;\n\nexport function getTestHostInfo(): TestHostInfo {\n return backend.info;\n}\n\nexport function ensureTestHost(): Promise<TestHostInfo> {\n ensuredHost ??= ensureTestHostInner();\n return ensuredHost;\n}\n\nexport function closeTestHost(): void {\n closeGuestShell(`warmup complete`);\n}\n\nexport async function runGuestCommand(script: string): Promise<string> {\n const shell = getGuestShell();\n return shell.run(script);\n}\n\nexport async function runIsolatedGuestCommand(script: string): Promise<string> {\n return backend.runIsolatedCommand(script);\n}\n\nasync function ensureTestHostInner(): Promise<TestHostInfo> {\n logTestHost(`Ensuring ${backend.info.backend} test host`);\n await backend.ensureHost();\n logTestHost(`Waiting for systemd --user readiness`);\n await waitForUserSystemd();\n logTestHost(`Test host ready`);\n return getTestHostInfo();\n}\n\nasync function waitForUserSystemd(): Promise<void> {\n for (let attempt = 0; attempt < 30; attempt += 1) {\n const state = await runGuestCommandWithTimeout(\n `printf 'pid1=%s\\n' \"$(ps -p 1 -o comm=)\"; systemctl --user is-system-running || true; printf 'xdg=%s\\n' \"$XDG_RUNTIME_DIR\"`,\n guestCommandTimeoutMs,\n );\n\n if (\n state.includes(`pid1=systemd`) &&\n state.includes(`xdg=/run/user/`) &&\n [`running`, `degraded`].some((status) => state.includes(status))\n ) {\n logTestHost(\n `systemd --user ready after ${attempt + 1} attempt${attempt === 0 ? `` : `s`}: ${summarizeSystemdState(state)}`,\n );\n return;\n }\n\n if (attempt === 0 || (attempt + 1) % 5 === 0) {\n logTestHost(\n `systemd --user not ready yet (${attempt + 1}/30): ${summarizeSystemdState(state)}`,\n );\n }\n\n await delay(1_000);\n }\n\n throw new Error(`Timed out waiting for systemd --user in the ${backend.info.backend} guest`);\n}\n\nfunction getGuestShell(): GuestShell {\n guestShell ??= new GuestShell(\n () => backend.createGuestShellProcess(),\n () => {\n if (guestShell !== undefined) {\n guestShell = undefined;\n }\n },\n );\n return guestShell;\n}\n\nfunction closeGuestShell(reason: string): void {\n if (guestShell === undefined) {\n return;\n }\n\n logTestHost(`Resetting guest shell: ${reason}`);\n guestShell.close();\n guestShell = undefined;\n}\n\nasync function runGuestCommandWithTimeout(script: string, timeoutMs: number): Promise<string> {\n const shell = getGuestShell();\n try {\n return await shell.run(script, timeoutMs);\n } catch (error) {\n if (error instanceof Error && error.message.includes(`timed out`)) {\n closeGuestShell(error.message);\n }\n\n throw error;\n }\n}\n\nfunction mergeOutput(stdout: string, stderr: string): string {\n return [stdout, stderr].filter((output) => output.length > 0).join(`\\n`);\n}\n\nfunction summarizeSystemdState(state: string): string {\n return state\n .split(`\\n`)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(`; `);\n}\n\nfunction inferBackendName(): TestHostBackendName {\n if (process.platform === `darwin`) {\n return `colima`;\n }\n\n if (process.platform === `linux`) {\n return `docker`;\n }\n\n throw new Error(\n `Unsupported test host platform: ${process.platform}. Set SYSTEMD_TS_TEST_HOST_BACKEND explicitly if you have a compatible backend.`,\n );\n}\n\nfunction resolveBackendName(value: string | undefined): TestHostBackendName {\n if (value === undefined) {\n return inferBackendName();\n }\n\n if (value === `colima` || value === `docker`) {\n return value;\n }\n\n throw new Error(\n `Unsupported SYSTEMD_TS_TEST_HOST_BACKEND value: ${value}. Expected \"colima\" or \"docker\".`,\n );\n}\n\nfunction defaultDockerContainerName(): string {\n const digest = createHash(`sha256`).update(repoRoot).digest(`hex`).slice(0, 12);\n return `systemd-ts-${digest}`;\n}\n\nfunction logTestHost(message: string): void {\n console.info(`[systemd-ts:test-host] ${message}`);\n}\n\nfunction createBackend(name: TestHostBackendName): TestHostBackend {\n switch (name) {\n case `colima`:\n return new ColimaBackend();\n case `docker`:\n return new DockerBackend();\n }\n}\n\nclass ColimaBackend implements TestHostBackend {\n public readonly info: TestHostInfo = {\n backend: `colima`,\n colimaHome,\n colimaProfile,\n limaHome,\n repoRoot,\n stateRoot: colimaHome,\n };\n\n public async ensureHost(): Promise<void> {\n if (await this.isRunning()) {\n return;\n }\n\n console.info(`Starting repo-local Colima host for integration tests...`);\n await this.execColima([\n `start`,\n `--cpu`,\n `2`,\n `--memory`,\n `4`,\n `--disk`,\n `30`,\n `--runtime`,\n `containerd`,\n ]);\n }\n\n public createGuestShellProcess(): ChildProcessWithoutNullStreams {\n return spawn(`colima`, [`ssh`, `--`, `bash`, `--noprofile`, `--norc`, `-s`], {\n env: this.hostEnv,\n stdio: [`pipe`, `pipe`, `pipe`],\n });\n }\n\n public async runIsolatedCommand(script: string): Promise<string> {\n return this.execColima([`ssh`, `--`, `bash`, `-lc`, script]);\n }\n\n private readonly hostEnv = {\n ...process.env,\n COLIMA_HOME: colimaHome,\n COLIMA_PROFILE: colimaProfile,\n LIMA_HOME: limaHome,\n };\n\n private async isRunning(): Promise<boolean> {\n try {\n const status = await this.execColima([`status`]);\n return status.includes(`is running`);\n } catch {\n return false;\n }\n }\n\n private async execColima(args: readonly string[]): Promise<string> {\n const result = await execFileAsync(`colima`, args, {\n env: this.hostEnv,\n maxBuffer: commandMaxBufferBytes,\n });\n return mergeOutput(result.stdout, result.stderr);\n }\n}\n\nclass DockerBackend implements TestHostBackend {\n public readonly info: TestHostInfo = {\n backend: `docker`,\n repoRoot,\n stateRoot: dockerStateRoot,\n };\n\n private runtimeInfo:\n | {\n readonly home: string;\n readonly runtimeDir: string;\n readonly userId: number;\n }\n | undefined;\n\n public async ensureHost(): Promise<void> {\n logTestHost(`Building Docker test host image ${dockerImage}`);\n await this.execDocker(\n [`build`, `--quiet`, `--tag`, dockerImage, `--file`, dockerfilePath, repoRoot],\n { timeout: dockerBuildTimeoutMs },\n );\n logTestHost(`Docker test host image ready`);\n\n if (!(await this.isContainerRunning())) {\n await this.removeExistingContainer();\n logTestHost(`Starting Docker test host container ${dockerContainer}`);\n await this.execDocker([\n `run`,\n `--detach`,\n `--name`,\n dockerContainer,\n `--hostname`,\n `systemd-ts-test-host`,\n `--privileged`,\n `--cgroupns=host`,\n `--tmpfs`,\n `/run`,\n `--tmpfs`,\n `/run/lock`,\n `--volume`,\n `/sys/fs/cgroup:/sys/fs/cgroup:rw`,\n `--volume`,\n `${repoRoot}:${repoRoot}`,\n `--volume`,\n `${dockerStateRoot}:${dockerStateRoot}`,\n `--workdir`,\n repoRoot,\n dockerImage,\n ]);\n logTestHost(`Docker test host container started`);\n } else {\n logTestHost(`Reusing running Docker test host container ${dockerContainer}`);\n }\n\n await this.ensureUserSession();\n }\n\n public createGuestShellProcess(): ChildProcessWithoutNullStreams {\n const runtimeInfo = this.requireRuntimeInfo();\n return spawn(\n `docker`,\n [\n `exec`,\n `--interactive`,\n `--user`,\n dockerUser,\n `--env`,\n `HOME=${runtimeInfo.home}`,\n `--env`,\n `XDG_RUNTIME_DIR=${runtimeInfo.runtimeDir}`,\n `--env`,\n `DBUS_SESSION_BUS_ADDRESS=unix:path=${runtimeInfo.runtimeDir}/bus`,\n dockerContainer,\n `bash`,\n `--noprofile`,\n `--norc`,\n `-s`,\n ],\n {\n stdio: [`pipe`, `pipe`, `pipe`],\n },\n );\n }\n\n public async runIsolatedCommand(script: string): Promise<string> {\n const runtimeInfo = this.requireRuntimeInfo();\n const result = await this.execDockerAsUser(runtimeInfo, [`bash`, `-lc`, script]);\n\n return mergeOutput(result.stdout, result.stderr);\n }\n\n private async isContainerRunning(): Promise<boolean> {\n try {\n const status = await this.execDocker([\n `inspect`,\n `--format`,\n `{{.State.Running}}`,\n dockerContainer,\n ]);\n return status.trim() === `true`;\n } catch {\n return false;\n }\n }\n\n private async removeExistingContainer(): Promise<void> {\n try {\n await this.execDocker([`rm`, `--force`, dockerContainer]);\n } catch {\n // Ignore missing containers so the first run can proceed.\n }\n }\n\n private async ensureUserSession(): Promise<void> {\n const runtimeInfo = await this.resolveRuntimeInfo();\n logTestHost(\n `Ensuring user session for ${dockerUser} (uid=${runtimeInfo.userId}, home=${runtimeInfo.home})`,\n );\n await this.execDocker(\n [\n `exec`,\n dockerContainer,\n `bash`,\n `-lc`,\n [\n `mkdir -p ${shellQuote(dockerStateRoot)}`,\n `chown ${runtimeInfo.userId}:${runtimeInfo.userId} ${shellQuote(dockerStateRoot)}`,\n `loginctl enable-linger ${shellQuote(dockerUser)}`,\n `systemctl start user@${runtimeInfo.userId}.service`,\n ].join(`\\n`),\n ],\n { timeout: dockerExecTimeoutMs },\n );\n await this.execDockerAsUser(runtimeInfo, [\n `bash`,\n `-lc`,\n `mkdir -p ${shellQuote(`${dockerStateRoot}/tests`)}`,\n ]);\n logTestHost(`User session started for ${dockerUser}`);\n }\n\n private async execDocker(\n args: readonly string[],\n options?: {\n readonly timeout?: number;\n },\n ): Promise<string> {\n const result = await execFileAsync(`docker`, args, {\n maxBuffer: commandMaxBufferBytes,\n timeout: options?.timeout,\n });\n return mergeOutput(result.stdout, result.stderr);\n }\n\n private execDockerAsUser(\n runtimeInfo: {\n readonly home: string;\n readonly runtimeDir: string;\n readonly userId: number;\n },\n command: readonly string[],\n ) {\n return execFileAsync(\n `docker`,\n [\n `exec`,\n `--user`,\n dockerUser,\n `--env`,\n `HOME=${runtimeInfo.home}`,\n `--env`,\n `XDG_RUNTIME_DIR=${runtimeInfo.runtimeDir}`,\n `--env`,\n `DBUS_SESSION_BUS_ADDRESS=unix:path=${runtimeInfo.runtimeDir}/bus`,\n dockerContainer,\n ...command,\n ],\n { maxBuffer: commandMaxBufferBytes },\n );\n }\n\n private requireRuntimeInfo(): {\n readonly home: string;\n readonly runtimeDir: string;\n readonly userId: number;\n } {\n if (this.runtimeInfo === undefined) {\n throw new Error(`Docker test host runtime info is unavailable before ensureHost() completes`);\n }\n\n return this.runtimeInfo;\n }\n\n private async resolveRuntimeInfo(): Promise<{\n readonly home: string;\n readonly runtimeDir: string;\n readonly userId: number;\n }> {\n if (this.runtimeInfo !== undefined) {\n return this.runtimeInfo;\n }\n\n const userId =\n dockerConfiguredUserId === undefined\n ? await this.lookupUserId()\n : Number(dockerConfiguredUserId);\n const home = await this.lookupUserHome();\n\n this.runtimeInfo = {\n home,\n runtimeDir: `/run/user/${userId}`,\n userId,\n };\n\n return this.runtimeInfo;\n }\n\n private async lookupUserHome(): Promise<string> {\n logTestHost(`Resolving home directory for Docker test user ${dockerUser}`);\n const output = await this.execDocker([\n `exec`,\n dockerContainer,\n `bash`,\n `-lc`,\n `getent passwd ${shellQuote(dockerUser)} | cut -d: -f6`,\n ]);\n\n const home = output.trim();\n if (home.length === 0) {\n throw new Error(`Could not resolve home directory for Docker test user ${dockerUser}`);\n }\n\n logTestHost(`Resolved home directory for ${dockerUser}: ${home}`);\n return home;\n }\n\n private async lookupUserId(): Promise<number> {\n logTestHost(`Resolving uid for Docker test user ${dockerUser}`);\n const output = await this.execDocker([\n `exec`,\n dockerContainer,\n `bash`,\n `-lc`,\n `id -u ${shellQuote(dockerUser)}`,\n ]);\n\n const parsed = Number(output.trim());\n if (!Number.isInteger(parsed)) {\n throw new Error(`Could not resolve uid for Docker test user ${dockerUser}`);\n }\n\n logTestHost(`Resolved uid for ${dockerUser}: ${parsed}`);\n return parsed;\n }\n}\n\nclass GuestShell {\n private readonly process: ChildProcessWithoutNullStreams;\n private readonly onExitCleanup: () => void;\n private closed = false;\n private buffer = ``;\n private current:\n | {\n marker: string;\n timeoutId: NodeJS.Timeout | undefined;\n reject: (error: Error) => void;\n resolve: (output: string) => void;\n }\n | undefined;\n private readonly queue: Array<{\n script: string;\n reject: (error: Error) => void;\n resolve: (output: string) => void;\n timeoutMs: number | undefined;\n }> = [];\n\n public constructor(\n createProcess: () => ChildProcessWithoutNullStreams,\n onExitCleanup: () => void,\n ) {\n this.process = createProcess();\n this.onExitCleanup = onExitCleanup;\n this.process.stdout.setEncoding(`utf8`);\n this.process.stderr.setEncoding(`utf8`);\n this.process.stdout.on(`data`, (chunk: string) => this.onData(chunk));\n this.process.stderr.on(`data`, (chunk: string) => this.onData(chunk));\n this.process.on(`exit`, (code, signal) => {\n const reason = new Error(\n `Persistent guest shell exited unexpectedly (code=${code ?? `null`}, signal=${signal ?? `null`})`,\n );\n this.failCurrent(reason);\n while (this.queue.length > 0) {\n this.queue.shift()?.reject(reason);\n }\n this.onExitCleanup();\n });\n\n process.once(`exit`, () => {\n this.process.kill();\n });\n }\n\n public run(script: string, timeoutMs?: number): Promise<string> {\n return new Promise((resolve, reject) => {\n this.queue.push({ script, resolve, reject, timeoutMs });\n this.drain();\n });\n }\n\n public close(): void {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n this.process.kill();\n }\n\n private drain(): void {\n if (this.current !== undefined) {\n return;\n }\n\n const next = this.queue.shift();\n if (next === undefined) {\n return;\n }\n\n const marker = `__SYSTEMD_TS_END_${randomUUID()}__`;\n const timeoutId =\n next.timeoutMs === undefined\n ? undefined\n : setTimeout(() => {\n if (this.current?.marker !== marker) {\n return;\n }\n\n const reason = new Error(`Guest command timed out after ${next.timeoutMs}ms`);\n this.failCurrent(reason);\n this.close();\n }, next.timeoutMs);\n this.current = {\n marker,\n timeoutId,\n reject: next.reject,\n resolve: next.resolve,\n };\n\n this.buffer = ``;\n const command = `(\n${next.script}\n) 2>&1\nstatus=$?\nprintf '\\\\n${marker}:%s\\\\n' \"$status\"\n`;\n\n this.process.stdin.write(command);\n }\n\n private failCurrent(error: Error): void {\n const current = this.current;\n this.current = undefined;\n if (current?.timeoutId !== undefined) {\n clearTimeout(current.timeoutId);\n }\n current?.reject(error);\n }\n\n private onData(chunk: string): void {\n if (this.current === undefined) {\n return;\n }\n\n this.buffer += chunk;\n const markerIndex = this.buffer.indexOf(this.current.marker);\n if (markerIndex === -1) {\n return;\n }\n\n const output = this.buffer.slice(0, markerIndex).replace(/\\n$/, ``);\n const statusMatch = this.buffer\n .slice(markerIndex)\n .match(/^__SYSTEMD_TS_END_[^:]+__:(\\d+)\\r?\\n?/u);\n\n if (statusMatch === null) {\n return;\n }\n\n const status = Number(statusMatch[1]);\n const remainder = this.buffer.slice(markerIndex + statusMatch[0].length);\n const current = this.current;\n this.current = undefined;\n this.buffer = remainder;\n if (current.timeoutId !== undefined) {\n clearTimeout(current.timeoutId);\n }\n\n if (status === 0) {\n current.resolve(output);\n } else {\n current.reject(new Error(output.length > 0 ? output : `Guest command failed`));\n }\n\n this.drain();\n }\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(`'`, `'\\\\''`)}'`;\n}\n\nconst backend = createBackend(selectedBackendName);\n","import { randomUUID } from \"node:crypto\";\n\nimport { getTestHostInfo, runGuestCommand } from \"./host.ts\";\n\nexport interface TestSandbox {\n readonly id: string;\n readonly linkedUnitDir: string;\n readonly namePrefix: string;\n readonly rootDir: string;\n readonly workDir: string;\n}\n\nexport interface DestroyTestSandboxOptions {\n readonly noisy?: boolean;\n}\n\nlet currentSandbox: TestSandbox | undefined;\n\nexport async function createTestSandbox(testName?: string): Promise<TestSandbox> {\n const id = randomUUID().slice(0, 8);\n const slug = slugify(testName ?? `sandbox`);\n const namePrefix = `systemd-ts-${slug}-${id}`;\n const rootDir = `${getTestHostInfo().stateRoot}/tests/${namePrefix}`;\n const linkedUnitDir = `${rootDir}/linked-units`;\n const workDir = `${rootDir}/work`;\n\n await runGuestCommand(\n `set -euo pipefail\nrm -rf ${shellQuote(rootDir)}\nmkdir -p ${shellQuote(linkedUnitDir)} ${shellQuote(workDir)}`,\n );\n\n currentSandbox = {\n id,\n linkedUnitDir,\n namePrefix,\n rootDir,\n workDir,\n };\n\n return currentSandbox;\n}\n\nexport async function destroyCurrentTestSandbox(): Promise<void> {\n if (currentSandbox === undefined) {\n return;\n }\n\n const sandbox = currentSandbox;\n currentSandbox = undefined;\n\n const unitsOutput = await runGuestCommand(\n `systemctl --user list-unit-files --all --no-legend ${shellQuote(`${sandbox.namePrefix}*`)} 2>/dev/null | awk '{print $1}' || true`,\n );\n\n const units = unitsOutput\n .split(`\\n`)\n .map((unit) => unit.trim())\n .filter((unit) => unit.length > 0);\n\n if (units.length > 0) {\n await runGuestCommand(`systemctl --user stop ${units.map(shellQuote).join(` `)} || true`);\n\n await runGuestCommand(`systemctl --user disable ${units.map(shellQuote).join(` `)} || true`);\n\n await runGuestCommand(\n `systemctl --user reset-failed ${units.map(shellQuote).join(` `)} || true`,\n );\n }\n\n await runGuestCommand(`systemctl --user daemon-reload || true`);\n\n await runGuestCommand(`rm -rf ${shellQuote(sandbox.rootDir)}`);\n}\n\nexport function useCurrentTestSandbox(): TestSandbox {\n if (currentSandbox === undefined) {\n throw new Error(`No active test sandbox is available`);\n }\n\n return currentSandbox;\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(`'`, `'\\\\''`)}'`;\n}\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, `-`)\n .replaceAll(/^-+|-+$/g, ``)\n .slice(0, 32);\n}\n","import {\n Systemd,\n type CommandExecutionOptions,\n type CommandExecutor,\n type CommandOutput,\n} from \"../main/index.ts\";\n\nimport { runGuestCommand, runIsolatedGuestCommand } from \"./host.ts\";\nimport { useCurrentTestSandbox } from \"./sandbox.ts\";\n\n/**\n * Creates a command executor that runs argv-style commands inside the current\n * test host guest shell.\n */\nexport function createGuestCommandExecutor(\n runCommand: (script: string) => Promise<string>,\n): CommandExecutor {\n return async (\n command: string,\n args: readonly string[],\n options: CommandExecutionOptions = {},\n ): Promise<CommandOutput> => {\n try {\n const stdout = await runCommand(buildGuestCommand(command, args, options));\n return {\n stderr: ``,\n stdout,\n };\n } catch (cause) {\n throw enrichGuestCommandError(cause);\n }\n };\n}\n\n/**\n * Executor that reuses the warm guest shell for fast sandbox-backed tests.\n */\nexport const guestCommandExecutor = createGuestCommandExecutor(runGuestCommand);\n\n/**\n * Executor that runs each guest command in a fresh isolated guest shell.\n */\nexport const isolatedGuestCommandExecutor = createGuestCommandExecutor(runIsolatedGuestCommand);\n\n/**\n * Creates a `Systemd` instance scoped to the active test sandbox and backed by\n * the warm guest-shell executor.\n */\nexport function sandboxSystemd(): Systemd {\n const sandbox = useCurrentTestSandbox();\n return new Systemd({\n executor: guestCommandExecutor,\n linkUnits: true,\n scope: `user`,\n unitDir: sandbox.linkedUnitDir,\n });\n}\n\n/**\n * Creates a `Systemd` instance scoped to the active test sandbox and backed by\n * a fresh guest shell per command.\n */\nexport function isolatedSandboxSystemd(): Systemd {\n const sandbox = useCurrentTestSandbox();\n return new Systemd({\n executor: isolatedGuestCommandExecutor,\n linkUnits: true,\n scope: `user`,\n unitDir: sandbox.linkedUnitDir,\n });\n}\n\nfunction buildGuestCommand(\n command: string,\n args: readonly string[],\n options: CommandExecutionOptions,\n): string {\n const envArgs =\n options.env === undefined\n ? []\n : Object.entries(options.env).flatMap(([key, value]) =>\n value === undefined ? [`-u`, key] : [`${key}=${value}`],\n );\n\n return [`env`, ...envArgs, command, ...args].map((part) => shellQuote(part)).join(` `);\n}\n\nfunction enrichGuestCommandError(cause: unknown): Error {\n if (cause instanceof Error) {\n return Object.assign(cause, {\n code: 1,\n stderr: ``,\n stdout: cause.message,\n });\n }\n\n return Object.assign(new Error(`Guest command failed`), {\n code: 1,\n stderr: ``,\n stdout: ``,\n });\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(`'`, `'\\\\''`)}'`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"test.mjs","names":["delay","shellQuote","shellQuote"],"sources":["../src/test/host.ts","../src/test/sandbox.ts","../src/test/harness.ts"],"sourcesContent":["import { execFile, spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\nconst commandMaxBufferBytes = 16 * 1024 * 1024;\nconst dockerBuildTimeoutMs = 5 * 60 * 1_000;\nconst dockerExecTimeoutMs = 60 * 1_000;\nconst guestCommandTimeoutMs = 10 * 1_000;\nconst repoRoot = fileURLToPath(new URL(`../../../../`, import.meta.url));\nconst dockerfilePath = fileURLToPath(new URL(`./systemd-container.Dockerfile`, import.meta.url));\nconst selectedBackendName = resolveBackendName(process.env[`SYSTEMD_TS_TEST_HOST_BACKEND`]);\nconst colimaHome = process.env[`COLIMA_HOME`] ?? `${repoRoot}.colima`;\nconst limaHome = process.env[`LIMA_HOME`] ?? `${colimaHome}/_lima`;\nconst colimaProfile = process.env[`COLIMA_PROFILE`] ?? `systemd-ts`;\nconst dockerStateRoot = process.env[`SYSTEMD_TS_TEST_HOST_ROOT`] ?? `${repoRoot}.docker`;\nconst dockerImage = process.env[`SYSTEMD_TS_TEST_DOCKER_IMAGE`] ?? `systemd-ts-test-host:local`;\nconst dockerUser = process.env[`SYSTEMD_TS_TEST_DOCKER_USER`] ?? `runner`;\nconst dockerConfiguredUserId = process.env[`SYSTEMD_TS_TEST_DOCKER_UID`];\nconst dockerContainer =\n process.env[`SYSTEMD_TS_TEST_DOCKER_CONTAINER`] ?? defaultDockerContainerName();\n\nexport interface TestHostInfo {\n readonly backend: TestHostBackendName;\n readonly colimaHome?: string;\n readonly colimaProfile?: string;\n readonly limaHome?: string;\n readonly repoRoot: string;\n readonly stateRoot: string;\n}\n\ntype TestHostBackendName = `colima` | `docker`;\n\ninterface TestHostBackend {\n readonly info: TestHostInfo;\n ensureHost(): Promise<void>;\n createGuestShellProcess(): ChildProcessWithoutNullStreams;\n runIsolatedCommand(script: string): Promise<string>;\n}\n\nlet ensuredHost: Promise<TestHostInfo> | undefined;\nlet guestShell: GuestShell | undefined;\n\nexport function getTestHostInfo(): TestHostInfo {\n return backend.info;\n}\n\nexport function ensureTestHost(): Promise<TestHostInfo> {\n ensuredHost ??= ensureTestHostInner();\n return ensuredHost;\n}\n\nexport function closeTestHost(): void {\n closeGuestShell(`warmup complete`);\n}\n\nexport async function runGuestCommand(script: string): Promise<string> {\n const shell = getGuestShell();\n return shell.run(script);\n}\n\nexport async function runIsolatedGuestCommand(script: string): Promise<string> {\n return backend.runIsolatedCommand(script);\n}\n\nasync function ensureTestHostInner(): Promise<TestHostInfo> {\n logTestHost(`Ensuring ${backend.info.backend} test host`);\n await backend.ensureHost();\n logTestHost(`Waiting for systemd --user readiness`);\n await waitForUserSystemd();\n logTestHost(`Test host ready`);\n return getTestHostInfo();\n}\n\nasync function waitForUserSystemd(): Promise<void> {\n for (let attempt = 0; attempt < 30; attempt += 1) {\n const state = await runGuestCommandWithTimeout(\n `printf 'pid1=%s\\n' \"$(ps -p 1 -o comm=)\"; systemctl --user is-system-running || true; printf 'xdg=%s\\n' \"$XDG_RUNTIME_DIR\"`,\n guestCommandTimeoutMs,\n );\n\n if (\n state.includes(`pid1=systemd`) &&\n state.includes(`xdg=/run/user/`) &&\n [`running`, `degraded`].some((status) => state.includes(status))\n ) {\n logTestHost(\n `systemd --user ready after ${attempt + 1} attempt${attempt === 0 ? `` : `s`}: ${summarizeSystemdState(state)}`,\n );\n return;\n }\n\n if (attempt === 0 || (attempt + 1) % 5 === 0) {\n logTestHost(\n `systemd --user not ready yet (${attempt + 1}/30): ${summarizeSystemdState(state)}`,\n );\n }\n\n await delay(1_000);\n }\n\n throw new Error(`Timed out waiting for systemd --user in the ${backend.info.backend} guest`);\n}\n\nfunction getGuestShell(): GuestShell {\n guestShell ??= new GuestShell(\n () => backend.createGuestShellProcess(),\n () => {\n if (guestShell !== undefined) {\n guestShell = undefined;\n }\n },\n );\n return guestShell;\n}\n\nfunction closeGuestShell(reason: string): void {\n if (guestShell === undefined) {\n return;\n }\n\n logTestHost(`Resetting guest shell: ${reason}`);\n guestShell.close();\n guestShell = undefined;\n}\n\nasync function runGuestCommandWithTimeout(script: string, timeoutMs: number): Promise<string> {\n const shell = getGuestShell();\n try {\n return await shell.run(script, timeoutMs);\n } catch (error) {\n if (error instanceof Error && error.message.includes(`timed out`)) {\n closeGuestShell(error.message);\n }\n\n throw error;\n }\n}\n\nfunction mergeOutput(stdout: string, stderr: string): string {\n return [stdout, stderr].filter((output) => output.length > 0).join(`\\n`);\n}\n\nfunction summarizeSystemdState(state: string): string {\n return state\n .split(`\\n`)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .join(`; `);\n}\n\nfunction inferBackendName(): TestHostBackendName {\n if (process.platform === `darwin`) {\n return `colima`;\n }\n\n if (process.platform === `linux`) {\n return `docker`;\n }\n\n throw new Error(\n `Unsupported test host platform: ${process.platform}. Set SYSTEMD_TS_TEST_HOST_BACKEND explicitly if you have a compatible backend.`,\n );\n}\n\nfunction resolveBackendName(value: string | undefined): TestHostBackendName {\n if (value === undefined) {\n return inferBackendName();\n }\n\n if (value === `colima` || value === `docker`) {\n return value;\n }\n\n throw new Error(\n `Unsupported SYSTEMD_TS_TEST_HOST_BACKEND value: ${value}. Expected \"colima\" or \"docker\".`,\n );\n}\n\nfunction defaultDockerContainerName(): string {\n const digest = createHash(`sha256`).update(repoRoot).digest(`hex`).slice(0, 12);\n return `systemd-ts-${digest}`;\n}\n\nfunction logTestHost(message: string): void {\n console.info(`[systemd-ts:test-host] ${message}`);\n}\n\nfunction createBackend(name: TestHostBackendName): TestHostBackend {\n switch (name) {\n case `colima`:\n return new ColimaBackend();\n case `docker`:\n return new DockerBackend();\n }\n}\n\nclass ColimaBackend implements TestHostBackend {\n public readonly info: TestHostInfo = {\n backend: `colima`,\n colimaHome,\n colimaProfile,\n limaHome,\n repoRoot,\n stateRoot: colimaHome,\n };\n\n public async ensureHost(): Promise<void> {\n if (await this.isRunning()) {\n return;\n }\n\n console.info(`Starting repo-local Colima host for integration tests...`);\n await this.execColima([\n `start`,\n `--cpu`,\n `2`,\n `--memory`,\n `4`,\n `--disk`,\n `30`,\n `--runtime`,\n `containerd`,\n ]);\n }\n\n public createGuestShellProcess(): ChildProcessWithoutNullStreams {\n return spawn(`colima`, [`ssh`, `--`, `bash`, `--noprofile`, `--norc`, `-s`], {\n env: this.hostEnv,\n stdio: [`pipe`, `pipe`, `pipe`],\n });\n }\n\n public async runIsolatedCommand(script: string): Promise<string> {\n return this.execColima([`ssh`, `--`, `bash`, `-lc`, script]);\n }\n\n private readonly hostEnv = {\n ...process.env,\n COLIMA_HOME: colimaHome,\n COLIMA_PROFILE: colimaProfile,\n LIMA_HOME: limaHome,\n };\n\n private async isRunning(): Promise<boolean> {\n try {\n const status = await this.execColima([`status`]);\n return status.includes(`is running`);\n } catch {\n return false;\n }\n }\n\n private async execColima(args: readonly string[]): Promise<string> {\n const result = await execFileAsync(`colima`, args, {\n env: this.hostEnv,\n maxBuffer: commandMaxBufferBytes,\n });\n return mergeOutput(result.stdout, result.stderr);\n }\n}\n\nclass DockerBackend implements TestHostBackend {\n public readonly info: TestHostInfo = {\n backend: `docker`,\n repoRoot,\n stateRoot: dockerStateRoot,\n };\n\n private runtimeInfo:\n | {\n readonly home: string;\n readonly runtimeDir: string;\n readonly userId: number;\n }\n | undefined;\n\n public async ensureHost(): Promise<void> {\n logTestHost(`Building Docker test host image ${dockerImage}`);\n await this.execDocker(\n [`build`, `--quiet`, `--tag`, dockerImage, `--file`, dockerfilePath, repoRoot],\n { timeout: dockerBuildTimeoutMs },\n );\n logTestHost(`Docker test host image ready`);\n\n if (!(await this.isContainerRunning())) {\n await this.removeExistingContainer();\n logTestHost(`Starting Docker test host container ${dockerContainer}`);\n await this.execDocker([\n `run`,\n `--detach`,\n `--name`,\n dockerContainer,\n `--hostname`,\n `systemd-ts-test-host`,\n `--privileged`,\n `--cgroupns=host`,\n `--tmpfs`,\n `/run`,\n `--tmpfs`,\n `/run/lock`,\n `--volume`,\n `/sys/fs/cgroup:/sys/fs/cgroup:rw`,\n `--volume`,\n `${repoRoot}:${repoRoot}`,\n `--volume`,\n `${dockerStateRoot}:${dockerStateRoot}`,\n `--workdir`,\n repoRoot,\n dockerImage,\n ]);\n logTestHost(`Docker test host container started`);\n } else {\n logTestHost(`Reusing running Docker test host container ${dockerContainer}`);\n }\n\n await this.ensureUserSession();\n }\n\n public createGuestShellProcess(): ChildProcessWithoutNullStreams {\n const runtimeInfo = this.requireRuntimeInfo();\n return spawn(\n `docker`,\n [\n `exec`,\n `--interactive`,\n `--user`,\n dockerUser,\n `--env`,\n `HOME=${runtimeInfo.home}`,\n `--env`,\n `XDG_RUNTIME_DIR=${runtimeInfo.runtimeDir}`,\n `--env`,\n `DBUS_SESSION_BUS_ADDRESS=unix:path=${runtimeInfo.runtimeDir}/bus`,\n dockerContainer,\n `bash`,\n `--noprofile`,\n `--norc`,\n `-s`,\n ],\n {\n stdio: [`pipe`, `pipe`, `pipe`],\n },\n );\n }\n\n public async runIsolatedCommand(script: string): Promise<string> {\n const runtimeInfo = this.requireRuntimeInfo();\n const result = await this.execDockerAsUser(runtimeInfo, [`bash`, `-lc`, script]);\n\n return mergeOutput(result.stdout, result.stderr);\n }\n\n private async isContainerRunning(): Promise<boolean> {\n try {\n const status = await this.execDocker([\n `inspect`,\n `--format`,\n `{{.State.Running}}`,\n dockerContainer,\n ]);\n return status.trim() === `true`;\n } catch {\n return false;\n }\n }\n\n private async removeExistingContainer(): Promise<void> {\n try {\n await this.execDocker([`rm`, `--force`, dockerContainer]);\n } catch {\n // Ignore missing containers so the first run can proceed.\n }\n }\n\n private async ensureUserSession(): Promise<void> {\n const runtimeInfo = await this.resolveRuntimeInfo();\n logTestHost(\n `Ensuring user session for ${dockerUser} (uid=${runtimeInfo.userId}, home=${runtimeInfo.home})`,\n );\n await this.execDocker(\n [\n `exec`,\n dockerContainer,\n `bash`,\n `-lc`,\n [\n `mkdir -p ${shellQuote(dockerStateRoot)}`,\n `chown ${runtimeInfo.userId}:${runtimeInfo.userId} ${shellQuote(dockerStateRoot)}`,\n `loginctl enable-linger ${shellQuote(dockerUser)}`,\n `systemctl start user@${runtimeInfo.userId}.service`,\n ].join(`\\n`),\n ],\n { timeout: dockerExecTimeoutMs },\n );\n await this.execDockerAsUser(runtimeInfo, [\n `bash`,\n `-lc`,\n `mkdir -p ${shellQuote(`${dockerStateRoot}/tests`)}`,\n ]);\n logTestHost(`User session started for ${dockerUser}`);\n }\n\n private async execDocker(\n args: readonly string[],\n options?: {\n readonly timeout?: number;\n },\n ): Promise<string> {\n const result = await execFileAsync(`docker`, args, {\n maxBuffer: commandMaxBufferBytes,\n timeout: options?.timeout,\n });\n return mergeOutput(result.stdout, result.stderr);\n }\n\n private execDockerAsUser(\n runtimeInfo: {\n readonly home: string;\n readonly runtimeDir: string;\n readonly userId: number;\n },\n command: readonly string[],\n ) {\n return execFileAsync(\n `docker`,\n [\n `exec`,\n `--user`,\n dockerUser,\n `--env`,\n `HOME=${runtimeInfo.home}`,\n `--env`,\n `XDG_RUNTIME_DIR=${runtimeInfo.runtimeDir}`,\n `--env`,\n `DBUS_SESSION_BUS_ADDRESS=unix:path=${runtimeInfo.runtimeDir}/bus`,\n dockerContainer,\n ...command,\n ],\n { maxBuffer: commandMaxBufferBytes },\n );\n }\n\n private requireRuntimeInfo(): {\n readonly home: string;\n readonly runtimeDir: string;\n readonly userId: number;\n } {\n if (this.runtimeInfo === undefined) {\n throw new Error(`Docker test host runtime info is unavailable before ensureHost() completes`);\n }\n\n return this.runtimeInfo;\n }\n\n private async resolveRuntimeInfo(): Promise<{\n readonly home: string;\n readonly runtimeDir: string;\n readonly userId: number;\n }> {\n if (this.runtimeInfo !== undefined) {\n return this.runtimeInfo;\n }\n\n const userId =\n dockerConfiguredUserId === undefined\n ? await this.lookupUserId()\n : Number(dockerConfiguredUserId);\n const home = await this.lookupUserHome();\n\n this.runtimeInfo = {\n home,\n runtimeDir: `/run/user/${userId}`,\n userId,\n };\n\n return this.runtimeInfo;\n }\n\n private async lookupUserHome(): Promise<string> {\n logTestHost(`Resolving home directory for Docker test user ${dockerUser}`);\n const output = await this.execDocker([\n `exec`,\n dockerContainer,\n `bash`,\n `-lc`,\n `getent passwd ${shellQuote(dockerUser)} | cut -d: -f6`,\n ]);\n\n const home = output.trim();\n if (home.length === 0) {\n throw new Error(`Could not resolve home directory for Docker test user ${dockerUser}`);\n }\n\n logTestHost(`Resolved home directory for ${dockerUser}: ${home}`);\n return home;\n }\n\n private async lookupUserId(): Promise<number> {\n logTestHost(`Resolving uid for Docker test user ${dockerUser}`);\n const output = await this.execDocker([\n `exec`,\n dockerContainer,\n `bash`,\n `-lc`,\n `id -u ${shellQuote(dockerUser)}`,\n ]);\n\n const parsed = Number(output.trim());\n if (!Number.isInteger(parsed)) {\n throw new Error(`Could not resolve uid for Docker test user ${dockerUser}`);\n }\n\n logTestHost(`Resolved uid for ${dockerUser}: ${parsed}`);\n return parsed;\n }\n}\n\nclass GuestShell {\n private readonly process: ChildProcessWithoutNullStreams;\n private readonly onExitCleanup: () => void;\n private closed = false;\n private buffer = ``;\n private current:\n | {\n marker: string;\n timeoutId: NodeJS.Timeout | undefined;\n reject: (error: Error) => void;\n resolve: (output: string) => void;\n }\n | undefined;\n private readonly queue: Array<{\n script: string;\n reject: (error: Error) => void;\n resolve: (output: string) => void;\n timeoutMs: number | undefined;\n }> = [];\n\n public constructor(\n createProcess: () => ChildProcessWithoutNullStreams,\n onExitCleanup: () => void,\n ) {\n this.process = createProcess();\n this.onExitCleanup = onExitCleanup;\n this.process.stdout.setEncoding(`utf8`);\n this.process.stderr.setEncoding(`utf8`);\n this.process.stdout.on(`data`, (chunk: string) => this.onData(chunk));\n this.process.stderr.on(`data`, (chunk: string) => this.onData(chunk));\n this.process.on(`exit`, (code, signal) => {\n const reason = new Error(\n `Persistent guest shell exited unexpectedly (code=${code ?? `null`}, signal=${signal ?? `null`})`,\n );\n this.failCurrent(reason);\n while (this.queue.length > 0) {\n this.queue.shift()?.reject(reason);\n }\n this.onExitCleanup();\n });\n\n process.once(`exit`, () => {\n this.process.kill();\n });\n }\n\n public run(script: string, timeoutMs?: number): Promise<string> {\n return new Promise((resolve, reject) => {\n this.queue.push({ script, resolve, reject, timeoutMs });\n this.drain();\n });\n }\n\n public close(): void {\n if (this.closed) {\n return;\n }\n\n this.closed = true;\n this.process.kill();\n }\n\n private drain(): void {\n if (this.current !== undefined) {\n return;\n }\n\n const next = this.queue.shift();\n if (next === undefined) {\n return;\n }\n\n const marker = `__SYSTEMD_TS_END_${randomUUID()}__`;\n const timeoutId =\n next.timeoutMs === undefined\n ? undefined\n : setTimeout(() => {\n if (this.current?.marker !== marker) {\n return;\n }\n\n const reason = new Error(`Guest command timed out after ${next.timeoutMs}ms`);\n this.failCurrent(reason);\n this.close();\n }, next.timeoutMs);\n this.current = {\n marker,\n timeoutId,\n reject: next.reject,\n resolve: next.resolve,\n };\n\n this.buffer = ``;\n const command = `(\n${next.script}\n) 2>&1\nstatus=$?\nprintf '\\\\n${marker}:%s\\\\n' \"$status\"\n`;\n\n this.process.stdin.write(command);\n }\n\n private failCurrent(error: Error): void {\n const current = this.current;\n this.current = undefined;\n if (current?.timeoutId !== undefined) {\n clearTimeout(current.timeoutId);\n }\n current?.reject(error);\n }\n\n private onData(chunk: string): void {\n if (this.current === undefined) {\n return;\n }\n\n this.buffer += chunk;\n const markerIndex = this.buffer.indexOf(this.current.marker);\n if (markerIndex === -1) {\n return;\n }\n\n const output = this.buffer.slice(0, markerIndex).replace(/\\n$/, ``);\n const statusMatch = this.buffer\n .slice(markerIndex)\n .match(/^__SYSTEMD_TS_END_[^:]+__:(\\d+)\\r?\\n?/u);\n\n if (statusMatch === null) {\n return;\n }\n\n const status = Number(statusMatch[1]);\n const remainder = this.buffer.slice(markerIndex + statusMatch[0].length);\n const current = this.current;\n this.current = undefined;\n this.buffer = remainder;\n if (current.timeoutId !== undefined) {\n clearTimeout(current.timeoutId);\n }\n\n if (status === 0) {\n current.resolve(output);\n } else {\n current.reject(new Error(output.length > 0 ? output : `Guest command failed`));\n }\n\n this.drain();\n }\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(`'`, `'\\\\''`)}'`;\n}\n\nconst backend = createBackend(selectedBackendName);\n","import { randomUUID } from \"node:crypto\";\n\nimport { getTestHostInfo, runGuestCommand } from \"./host.ts\";\n\nexport interface TestSandbox {\n readonly id: string;\n readonly linkedUnitDir: string;\n readonly namePrefix: string;\n readonly rootDir: string;\n readonly workDir: string;\n}\n\nexport interface DestroyTestSandboxOptions {\n readonly noisy?: boolean;\n}\n\nlet currentSandbox: TestSandbox | undefined;\n\nexport async function createTestSandbox(testName?: string): Promise<TestSandbox> {\n const id = randomUUID().slice(0, 8);\n const slug = slugify(testName ?? `sandbox`);\n const namePrefix = `systemd-ts-${slug}-${id}`;\n const rootDir = `${getTestHostInfo().stateRoot}/tests/${namePrefix}`;\n const linkedUnitDir = `${rootDir}/linked-units`;\n const workDir = `${rootDir}/work`;\n\n await runGuestCommand(\n `set -euo pipefail\nrm -rf ${shellQuote(rootDir)}\nmkdir -p ${shellQuote(linkedUnitDir)} ${shellQuote(workDir)}`,\n );\n\n currentSandbox = {\n id,\n linkedUnitDir,\n namePrefix,\n rootDir,\n workDir,\n };\n\n return currentSandbox;\n}\n\nexport async function destroyCurrentTestSandbox(): Promise<void> {\n if (currentSandbox === undefined) {\n return;\n }\n\n const sandbox = currentSandbox;\n currentSandbox = undefined;\n\n const unitsOutput = await runGuestCommand(\n `systemctl --user list-unit-files --all --no-legend ${shellQuote(`${sandbox.namePrefix}*`)} 2>/dev/null | awk '{print $1}' || true`,\n );\n\n const units = unitsOutput\n .split(`\\n`)\n .map((unit) => unit.trim())\n .filter((unit) => unit.length > 0);\n\n if (units.length > 0) {\n await runGuestCommand(`systemctl --user stop ${units.map(shellQuote).join(` `)} || true`);\n\n await runGuestCommand(`systemctl --user disable ${units.map(shellQuote).join(` `)} || true`);\n\n await runGuestCommand(\n `systemctl --user reset-failed ${units.map(shellQuote).join(` `)} || true`,\n );\n }\n\n await runGuestCommand(`systemctl --user daemon-reload || true`);\n\n await runGuestCommand(`rm -rf ${shellQuote(sandbox.rootDir)}`);\n}\n\nexport function useCurrentTestSandbox(): TestSandbox {\n if (currentSandbox === undefined) {\n throw new Error(`No active test sandbox is available`);\n }\n\n return currentSandbox;\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(`'`, `'\\\\''`)}'`;\n}\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, `-`)\n .replaceAll(/^-+|-+$/g, ``)\n .slice(0, 32);\n}\n","import {\n Systemd,\n type CommandExecutionOptions,\n type CommandExecutor,\n type CommandOutput,\n} from \"../main/index.ts\";\n\nimport { runGuestCommand, runIsolatedGuestCommand } from \"./host.ts\";\nimport { useCurrentTestSandbox } from \"./sandbox.ts\";\n\n/**\n * Creates a command executor that runs argv-style commands inside the current\n * test host guest shell.\n */\nexport function createGuestCommandExecutor(\n runCommand: (script: string) => Promise<string>,\n): CommandExecutor {\n return async (\n command: string,\n args: readonly string[],\n options: CommandExecutionOptions = {},\n ): Promise<CommandOutput> => {\n try {\n const stdout = await runCommand(buildGuestCommand(command, args, options));\n return {\n stderr: ``,\n stdout,\n };\n } catch (cause) {\n throw enrichGuestCommandError(cause);\n }\n };\n}\n\n/**\n * Executor that reuses the warm guest shell for fast sandbox-backed tests.\n */\nexport const guestCommandExecutor: CommandExecutor = createGuestCommandExecutor(runGuestCommand);\n\n/**\n * Executor that runs each guest command in a fresh isolated guest shell.\n */\nexport const isolatedGuestCommandExecutor: CommandExecutor =\n createGuestCommandExecutor(runIsolatedGuestCommand);\n\n/**\n * Creates a `Systemd` instance scoped to the active test sandbox and backed by\n * the warm guest-shell executor.\n */\nexport function sandboxSystemd(): Systemd {\n const sandbox = useCurrentTestSandbox();\n return new Systemd({\n executor: guestCommandExecutor,\n linkUnits: true,\n scope: `user`,\n unitDir: sandbox.linkedUnitDir,\n });\n}\n\n/**\n * Creates a `Systemd` instance scoped to the active test sandbox and backed by\n * a fresh guest shell per command.\n */\nexport function isolatedSandboxSystemd(): Systemd {\n const sandbox = useCurrentTestSandbox();\n return new Systemd({\n executor: isolatedGuestCommandExecutor,\n linkUnits: true,\n scope: `user`,\n unitDir: sandbox.linkedUnitDir,\n });\n}\n\nfunction buildGuestCommand(\n command: string,\n args: readonly string[],\n options: CommandExecutionOptions,\n): string {\n const envArgs =\n options.env === undefined\n ? []\n : Object.entries(options.env).flatMap(([key, value]) =>\n value === undefined ? [`-u`, key] : [`${key}=${value}`],\n );\n\n return [`env`, ...envArgs, command, ...args].map((part) => shellQuote(part)).join(` `);\n}\n\nfunction enrichGuestCommandError(cause: unknown): Error {\n if (cause instanceof Error) {\n return Object.assign(cause, {\n code: 1,\n stderr: ``,\n stdout: cause.message,\n });\n }\n\n return Object.assign(new Error(`Guest command failed`), {\n code: 1,\n stderr: ``,\n stdout: ``,\n });\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replaceAll(`'`, `'\\\\''`)}'`;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "systemd-ts",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.3",
|
|
4
4
|
"description": "TypeScript builders and helpers for systemd services and timers.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"access": "public"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@types/node": "25.
|
|
25
|
+
"@types/node": "25.7.0",
|
|
26
26
|
"@typescript/native-preview": "7.0.0-dev.20260511.1",
|
|
27
27
|
"takua": "0.1.1",
|
|
28
28
|
"typescript": "6.0.3",
|
package/src/test/harness.ts
CHANGED
|
@@ -35,12 +35,13 @@ export function createGuestCommandExecutor(
|
|
|
35
35
|
/**
|
|
36
36
|
* Executor that reuses the warm guest shell for fast sandbox-backed tests.
|
|
37
37
|
*/
|
|
38
|
-
export const guestCommandExecutor = createGuestCommandExecutor(runGuestCommand);
|
|
38
|
+
export const guestCommandExecutor: CommandExecutor = createGuestCommandExecutor(runGuestCommand);
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Executor that runs each guest command in a fresh isolated guest shell.
|
|
42
42
|
*/
|
|
43
|
-
export const isolatedGuestCommandExecutor =
|
|
43
|
+
export const isolatedGuestCommandExecutor: CommandExecutor =
|
|
44
|
+
createGuestCommandExecutor(runIsolatedGuestCommand);
|
|
44
45
|
|
|
45
46
|
/**
|
|
46
47
|
* Creates a `Systemd` instance scoped to the active test sandbox and backed by
|