Skip to content

Commit cb9873b

Browse files
thymikeeclaude
andcommitted
test(test-kit): load the real host-kit capabilities on demand
A static import of every capability made suites that mock host-kit modules incomplete. Load them, the plutil runner and the request deadline lazily. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
1 parent 184cfcc commit cb9873b

4 files changed

Lines changed: 69 additions & 66 deletions

File tree

‎packages/apple-runner/src/__tests__/host-setup.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { createAppleRunnerTestHostDefaults } from './test-host-defaults.ts';
77
// The apple-runner vitest project runs the package's own suites against a package-local host:
88
// real host-kit and kernel capabilities with explicit Apple test adapters (`test-host-defaults.ts`),
99
// overridable per test. This setup installs it and resets the overrides before each case.
10-
installAppleRunnerTestHost(createAppleRunnerTestHostDefaults());
10+
installAppleRunnerTestHost(await createAppleRunnerTestHostDefaults());
1111

1212
// Runner code reads its settings from the command host; tests run as one whose environment is the
1313
// live process environment, so `vi.stubEnv` reaches it.

‎packages/apple-runner/src/__tests__/test-host-defaults.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import type { ScopedSimctlCommand } from '@agent-device/contracts/platform-runti
88
import { bootFailureHint, classifyBootFailure } from '@agent-device/provision-kit/boot-diagnostics';
99
import {
1010
createLiveTestHostEnvironment,
11-
realHostKitCapabilities,
11+
loadRealHostKitCapabilities,
1212
runRealHostCommand,
1313
} from '@agent-device/test-kit';
1414
import type { AppleRunnerHost } from '../host.ts';
@@ -87,9 +87,9 @@ function appleToolingTestAdapters(): Pick<
8787
* kernel capabilities (so retry, lock, process and request semantics are genuine), the live process
8888
* environment, and the explicit Apple adapters above. It reads no platform-apple or root code.
8989
*/
90-
export function createAppleRunnerTestHostDefaults(): AppleRunnerHost {
90+
export async function createAppleRunnerTestHostDefaults(): Promise<AppleRunnerHost> {
9191
return {
92-
...realHostKitCapabilities,
92+
...(await loadRealHostKitCapabilities()),
9393
...appleToolingTestAdapters(),
9494
hostEnvironment: createLiveTestHostEnvironment,
9595
shellQuote,
Lines changed: 60 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,68 @@
1-
import {
2-
commandDeveloperDir,
3-
isCommandTimeoutError,
4-
requireExecSuccess,
5-
runCmd,
6-
runCmdBackground,
7-
runCmdStreaming,
8-
} from '@agent-device/host-kit/command';
9-
import { emitDiagnostic, withDiagnosticTimer } from '@agent-device/host-kit/diagnostics';
10-
import { acquireProcessLock, publishFileSync, withProcessLock } from '@agent-device/host-kit/file';
11-
import {
12-
classifyOwnerLiveness,
13-
isProcessAlive,
14-
isProcessGroupAlive,
15-
readHostCpuArchSync,
16-
readProcessCommand,
17-
readProcessStartTime,
18-
signalPidsBestEffort,
19-
signalProcessGroupBestEffort,
20-
} from '@agent-device/host-kit/process';
21-
import {
22-
emitRequestProgress,
23-
getRequestSignal,
24-
isRequestCanceled,
25-
} from '@agent-device/host-kit/request';
26-
import { Deadline, isEnvTruthy, retryWithPolicy } from '@agent-device/host-kit/retry';
27-
import { runtimeSlot } from '@agent-device/host-kit/runtime-slots';
28-
import { findProjectRoot, readVersion } from '@agent-device/host-kit/version';
29-
301
/**
312
* The real host-kit capabilities a package suite takes as its host defaults, under the names the
323
* Apple runner host port uses for them. A suite that must not import host-kit itself (the runner
334
* port is the one place its package reaches host-kit) assembles its host from these and from its own
345
* explicit adapters, so retry, lock, process and request-cancellation semantics stay genuine.
6+
*
7+
* Loaded on demand: the test-kit entry is imported by suites that mock host-kit modules, and a static
8+
* import of every capability would make those mocks incomplete.
359
*/
36-
export const realHostKitCapabilities = {
37-
runCmdStreaming,
38-
runCmdBackground,
39-
requireExecSuccess,
40-
isCommandTimeoutError,
41-
commandDeveloperDir,
42-
emitDiagnostic,
43-
withDiagnosticTimer,
44-
retryWithPolicy,
45-
isEnvTruthy,
46-
deadlineFromTimeoutMs: (timeoutMs: number, nowMs?: number) =>
47-
Deadline.fromTimeoutMs(timeoutMs, nowMs),
48-
isProcessAlive,
49-
isProcessGroupAlive,
50-
readProcessStartTime,
51-
readProcessCommand,
52-
signalPidsBestEffort,
53-
signalProcessGroupBestEffort,
54-
classifyOwnerLiveness,
55-
readHostCpuArchSync,
56-
findProjectRoot,
57-
readVersion,
58-
acquireProcessLock,
59-
withProcessLock,
60-
publishFileSync,
61-
emitRequestProgress,
62-
getRequestSignal,
63-
isRequestCanceled,
64-
runnerRuntimeSlot: runtimeSlot,
65-
} as const;
10+
export async function loadRealHostKitCapabilities() {
11+
const [command, diagnostics, file, processModule, request, retry, runtimeSlots, version] =
12+
await Promise.all([
13+
import('@agent-device/host-kit/command'),
14+
import('@agent-device/host-kit/diagnostics'),
15+
import('@agent-device/host-kit/file'),
16+
import('@agent-device/host-kit/process'),
17+
import('@agent-device/host-kit/request'),
18+
import('@agent-device/host-kit/retry'),
19+
import('@agent-device/host-kit/runtime-slots'),
20+
import('@agent-device/host-kit/version'),
21+
]);
22+
return {
23+
runCmdStreaming: command.runCmdStreaming,
24+
runCmdBackground: command.runCmdBackground,
25+
requireExecSuccess: command.requireExecSuccess,
26+
isCommandTimeoutError: command.isCommandTimeoutError,
27+
commandDeveloperDir: command.commandDeveloperDir,
28+
emitDiagnostic: diagnostics.emitDiagnostic,
29+
withDiagnosticTimer: diagnostics.withDiagnosticTimer,
30+
retryWithPolicy: retry.retryWithPolicy,
31+
isEnvTruthy: retry.isEnvTruthy,
32+
deadlineFromTimeoutMs: (timeoutMs: number, nowMs?: number) =>
33+
retry.Deadline.fromTimeoutMs(timeoutMs, nowMs),
34+
isProcessAlive: processModule.isProcessAlive,
35+
isProcessGroupAlive: processModule.isProcessGroupAlive,
36+
readProcessStartTime: processModule.readProcessStartTime,
37+
readProcessCommand: processModule.readProcessCommand,
38+
signalPidsBestEffort: processModule.signalPidsBestEffort,
39+
signalProcessGroupBestEffort: processModule.signalProcessGroupBestEffort,
40+
classifyOwnerLiveness: processModule.classifyOwnerLiveness,
41+
readHostCpuArchSync: processModule.readHostCpuArchSync,
42+
findProjectRoot: version.findProjectRoot,
43+
readVersion: version.readVersion,
44+
acquireProcessLock: file.acquireProcessLock,
45+
withProcessLock: file.withProcessLock,
46+
publishFileSync: file.publishFileSync,
47+
emitRequestProgress: request.emitRequestProgress,
48+
getRequestSignal: request.getRequestSignal,
49+
isRequestCanceled: request.isRequestCanceled,
50+
runnerRuntimeSlot: runtimeSlots.runtimeSlot,
51+
} as const;
52+
}
6653

6754
/** The real host command runner, for a suite adapter that runs one genuine tool (such as `plutil`). */
68-
export const runRealHostCommand = runCmd;
55+
export async function runRealHostCommand(
56+
...args: Parameters<typeof import('@agent-device/host-kit/command').runCmd>
57+
) {
58+
const { runCmd } = await import('@agent-device/host-kit/command');
59+
return await runCmd(...args);
60+
}
61+
62+
/** Keeps a daemon deadline on the request's cancellation signal until its work settles. */
63+
export async function withRequestDeadline(
64+
...args: Parameters<typeof import('@agent-device/host-kit/request').withRequestDeadline>
65+
) {
66+
const { withRequestDeadline: run } = await import('@agent-device/host-kit/request');
67+
return await run(...args);
68+
}

‎packages/test-kit/src/index.ts‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,16 @@ export {
127127
recordArticleEvidence,
128128
} from './target-classification-fixtures.ts';
129129
export { mkdtempForTest, mkdtempForTestSync } from './tmp-dir.ts';
130-
export { withRequestDeadline } from '@agent-device/host-kit/request';
131130
export {
132131
STUBBED_APPLE_TOOLCHAIN,
133132
stubbedAppleDeveloperDir,
134133
writeXcodeFixture,
135134
} from './apple-toolchain-fixtures.ts';
136-
export { realHostKitCapabilities, runRealHostCommand } from './host-kit-capabilities.ts';
135+
export {
136+
loadRealHostKitCapabilities,
137+
runRealHostCommand,
138+
withRequestDeadline,
139+
} from './host-kit-capabilities.ts';
137140
export {
138141
assertProducedRunnerRequests,
139142
readRunnerRequestFixture,

0 commit comments

Comments
 (0)