Skip to content

Commit d055691

Browse files
committed
test(apple-runner): one device-set redirect double for the session tests
The size ratchet refused this PR's six-line growth in `runner-session.test.ts`, which is 1,955 lines at the merge-base and already over the tripwire, and its own remedy is the right one here: the handle the launch hands the session was being fabricated four times over, twice in that file alone, with a per-file spy that each file then counted calls on. It now lives once in `runner-session-fixtures.ts`, the module this test family already shares, and the family is five lines shorter than it was. One spy answers both give-backs on purpose. The session-level tests ask whether the host's device set came back when a launch failed or a session was disposed; which of the two doors it came back through is the thing this PR changed, and that is pinned where the handle is made, in `runner-device-set.test.ts`, where each door is a separate test.
1 parent b92a416 commit d055691

5 files changed

Lines changed: 29 additions & 34 deletions

File tree

‎packages/platform-apple/src/runner/__tests__/runner-request-cancellation.test.ts‎

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import path from 'node:path';
55
import { beforeEach, test, vi } from 'vitest';
66
import { IOS_DEVICE, IOS_SIMULATOR } from './device-fixtures.ts';
77
import { mkdtempForTestSync } from './tmp-dir.ts';
8+
import { redirectHandle } from './runner-session-fixtures.ts';
89
import { appleRunnerTestHost } from '../test-host.ts';
910

1011
const {
@@ -22,7 +23,6 @@ const {
2223
mockSignalPidsBestEffort,
2324
mockSignalProcessGroupBestEffort,
2425
mockWaitForRunner,
25-
mockRedirectRelease,
2626
} = vi.hoisted(() => ({
2727
mockAcquireXcodebuildSimulatorSetRedirect: vi.fn(),
2828
mockEnsureXctestrunArtifact: vi.fn(),
@@ -39,7 +39,6 @@ const {
3939
mockSignalPidsBestEffort: vi.fn(),
4040
mockSignalProcessGroupBestEffort: vi.fn(),
4141
mockWaitForRunner: vi.fn(),
42-
mockRedirectRelease: vi.fn(),
4342
}));
4443

4544
vi.mock('../runner-io.ts', async () => {
@@ -155,10 +154,7 @@ beforeEach(async () => {
155154
});
156155
mockResolveExpectedRunnerCacheMetadata.mockReturnValue({ schemaVersion: 1 });
157156
mockResolveRunnerDerivedPath.mockReturnValue('/tmp/derived');
158-
mockAcquireXcodebuildSimulatorSetRedirect.mockResolvedValue({
159-
release: mockRedirectRelease,
160-
releaseBestEffort: mockRedirectRelease,
161-
});
157+
mockAcquireXcodebuildSimulatorSetRedirect.mockResolvedValue(redirectHandle);
162158
mockRunCmdBackground.mockReturnValue(makeBackgroundRunner(4242));
163159
mockRunAppleToolCommand.mockResolvedValue({ exitCode: 0, stdout: '', stderr: '' });
164160
mockIsProcessAlive.mockReturnValue(true);

‎packages/platform-apple/src/runner/__tests__/runner-session-fixtures.ts‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import assert from 'node:assert/strict';
22
import fs from 'node:fs';
33
import { EventEmitter } from 'node:events';
4+
import { vi } from 'vitest';
45
import { IOS_SIMULATOR } from './device-fixtures.ts';
56
import { appleRunnerTestHost } from '../test-host.ts';
67
import { runnerOwnerStartTime, type RunnerLease } from '../runner-lease.ts';
78
import type { RunnerSession } from '../runner-session-types.ts';
9+
import type { XcodebuildSimulatorSetRedirectHandle } from '../runner-device-set.ts';
810

911
// Fabricated runner sessions, leases, background children, and transport
1012
// payloads shared by the runner-session tests. The child pids here are made up
@@ -182,3 +184,14 @@ export function makeClassifyOwnerLivenessViaMocks(deps: {
182184
return stateDir ? classifyStateDir(stateDir) : 'live';
183185
};
184186
}
187+
188+
/**
189+
* The give-back a launched session holds. One spy answers both strictnesses: the the host's device set came back, and which door it came back
190+
* through is pinned where the handle is made, in `runner-device-set.test.ts`.
191+
*/
192+
export const redirectRelease = vi.fn(async () => {});
193+
194+
export const redirectHandle: XcodebuildSimulatorSetRedirectHandle = {
195+
release: redirectRelease,
196+
releaseBestEffort: redirectRelease,
197+
};

‎packages/platform-apple/src/runner/__tests__/runner-session-speculative.test.ts‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
makeBackgroundRunner,
77
makeClassifyOwnerLivenessViaMocks,
88
runnerResponse,
9+
redirectHandle,
910
} from './runner-session-fixtures.ts';
1011
import { mkdtempForTestSync } from './tmp-dir.ts';
1112

@@ -28,7 +29,6 @@ const {
2829
mockSignalPidsBestEffort,
2930
mockSignalProcessGroupBestEffort,
3031
mockWaitForRunner,
31-
mockRedirectRelease,
3232
} = vi.hoisted(() => ({
3333
mockAcquireXcodebuildSimulatorSetRedirect: vi.fn(),
3434
mockCleanupTempFile: vi.fn(),
@@ -52,7 +52,6 @@ const {
5252
mockSignalPidsBestEffort: vi.fn(),
5353
mockSignalProcessGroupBestEffort: vi.fn(),
5454
mockWaitForRunner: vi.fn(),
55-
mockRedirectRelease: vi.fn(),
5655
}));
5756

5857
vi.mock('../runner-io.ts', async () => {
@@ -138,10 +137,7 @@ beforeEach(async () => {
138137
});
139138
mockResolveExpectedRunnerCacheMetadata.mockReturnValue({ schemaVersion: 1 });
140139
mockResolveRunnerDerivedPath.mockReturnValue('/tmp/derived');
141-
mockAcquireXcodebuildSimulatorSetRedirect.mockResolvedValue({
142-
release: mockRedirectRelease,
143-
releaseBestEffort: mockRedirectRelease,
144-
});
140+
mockAcquireXcodebuildSimulatorSetRedirect.mockResolvedValue(redirectHandle);
145141
mockRunCmdBackground.mockReturnValue(makeBackgroundRunner(4242));
146142
mockRunAppleToolCommand.mockResolvedValue({ exitCode: 0, stdout: '', stderr: '' });
147143
mockIsProcessAlive.mockReturnValue(true);
@@ -192,7 +188,7 @@ test('a release that arrives while the speculative start is still in flight stop
192188
});
193189
mockAcquireXcodebuildSimulatorSetRedirect.mockImplementation(async () => {
194190
await gate;
195-
return { release: mockRedirectRelease, releaseBestEffort: mockRedirectRelease };
191+
return redirectHandle;
196192
});
197193

198194
const starting = ensureRunnerSession(device, { speculative: true });
@@ -218,7 +214,7 @@ test('a release that waits out a demanded start leaves that runner alone', async
218214
});
219215
mockAcquireXcodebuildSimulatorSetRedirect.mockImplementation(async () => {
220216
await gate;
221-
return { release: mockRedirectRelease, releaseBestEffort: mockRedirectRelease };
217+
return redirectHandle;
222218
});
223219

224220
const starting = ensureRunnerSession(device, {});

‎packages/platform-apple/src/runner/__tests__/runner-session-stale-bundles.test.ts‎

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
makeBackgroundRunner,
77
makeClassifyOwnerLivenessViaMocks,
88
runnerResponse,
9+
redirectHandle,
910
} from './runner-session-fixtures.ts';
1011
import { mkdtempForTestSync } from './tmp-dir.ts';
1112

@@ -28,7 +29,6 @@ const {
2829
mockSignalPidsBestEffort,
2930
mockSignalProcessGroupBestEffort,
3031
mockWaitForRunner,
31-
mockRedirectRelease,
3232
} = vi.hoisted(() => ({
3333
mockAcquireXcodebuildSimulatorSetRedirect: vi.fn(),
3434
mockCleanupTempFile: vi.fn(),
@@ -56,7 +56,6 @@ const {
5656
mockSignalPidsBestEffort: vi.fn(),
5757
mockSignalProcessGroupBestEffort: vi.fn(),
5858
mockWaitForRunner: vi.fn(),
59-
mockRedirectRelease: vi.fn(),
6059
}));
6160

6261
vi.mock('../runner-io.ts', async () => {
@@ -146,10 +145,7 @@ beforeEach(async () => {
146145
});
147146
mockResolveExpectedRunnerCacheMetadata.mockReturnValue({ schemaVersion: 1 });
148147
mockResolveRunnerDerivedPath.mockReturnValue('/tmp/derived');
149-
mockAcquireXcodebuildSimulatorSetRedirect.mockResolvedValue({
150-
release: mockRedirectRelease,
151-
releaseBestEffort: mockRedirectRelease,
152-
});
148+
mockAcquireXcodebuildSimulatorSetRedirect.mockResolvedValue(redirectHandle);
153149
mockRunCmdBackground.mockReturnValue(makeBackgroundRunner(4242));
154150
mockRunAppleToolCommand.mockResolvedValue({ exitCode: 0, stdout: '', stderr: '' });
155151
mockIsProcessAlive.mockReturnValue(true);

‎packages/platform-apple/src/runner/__tests__/runner-session.test.ts‎

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import {
1515
makeRunnerSession,
1616
runnerError,
1717
runnerResponse,
18+
redirectHandle,
19+
redirectRelease,
1820
} from './runner-session-fixtures.ts';
1921
import { mkdtempForTestSync } from './tmp-dir.ts';
2022

@@ -37,7 +39,6 @@ const {
3739
mockSignalPidsBestEffort,
3840
mockSignalProcessGroupBestEffort,
3941
mockWaitForRunner,
40-
mockRedirectRelease,
4142
} = vi.hoisted(() => ({
4243
mockAcquireXcodebuildSimulatorSetRedirect: vi.fn(),
4344
mockCleanupTempFile: vi.fn(),
@@ -67,7 +68,6 @@ const {
6768
mockSignalPidsBestEffort: vi.fn(),
6869
mockSignalProcessGroupBestEffort: vi.fn(),
6970
mockWaitForRunner: vi.fn(),
70-
mockRedirectRelease: vi.fn(),
7171
}));
7272

7373
// Fixed owner-identity value shared by the readProcessStartTime override
@@ -192,10 +192,7 @@ beforeEach(async () => {
192192
});
193193
mockResolveExpectedRunnerCacheMetadata.mockReturnValue({ schemaVersion: 1 });
194194
mockResolveRunnerDerivedPath.mockReturnValue('/tmp/derived');
195-
mockAcquireXcodebuildSimulatorSetRedirect.mockResolvedValue({
196-
release: mockRedirectRelease,
197-
releaseBestEffort: mockRedirectRelease,
198-
});
195+
mockAcquireXcodebuildSimulatorSetRedirect.mockResolvedValue(redirectHandle);
199196
mockRunCmdBackground.mockReturnValue(makeBackgroundRunner(4242));
200197
mockRunAppleToolCommand.mockResolvedValue({ exitCode: 0, stdout: '', stderr: '' });
201198
mockIsProcessAlive.mockReturnValue(true);
@@ -703,10 +700,7 @@ test('runner session emits XCTest startup progress only after a runner rebuild',
703700
xctestrunPath: '/tmp/session-runner.xctestrun',
704701
jsonPath: '/tmp/session-runner.json',
705702
});
706-
mockAcquireXcodebuildSimulatorSetRedirect.mockResolvedValue({
707-
release: mockRedirectRelease,
708-
releaseBestEffort: mockRedirectRelease,
709-
});
703+
mockAcquireXcodebuildSimulatorSetRedirect.mockResolvedValue(redirectHandle);
710704
mockRunCmdBackground.mockReturnValue(makeBackgroundRunner(4242));
711705
mockWaitForRunner.mockResolvedValue(runnerResponse({ uptimeMs: 1 }));
712706

@@ -857,7 +851,7 @@ test('shutdown detach keeps scoped simulator-set runner sessions for the kill pa
857851
// XCTestDevices symlink; detach never releases the redirect itself.
858852
assert.equal(detached, 0);
859853
assert.ok(getRunnerSessionSnapshot(device.id));
860-
assert.equal(mockRedirectRelease.mock.calls.length, 0);
854+
assert.equal(redirectRelease.mock.calls.length, 0);
861855
});
862856

863857
test('runner session startup kills legacy ownerless xcodebuild before launching a new runner', async () => {
@@ -1471,7 +1465,7 @@ test('runner session restarts dead runner without graceful shutdown', async () =
14711465
['/tmp/session-runner.xctestrun'],
14721466
['/tmp/session-runner.json'],
14731467
]);
1474-
assert.equal(mockRedirectRelease.mock.calls.length, 1);
1468+
assert.equal(redirectRelease.mock.calls.length, 1);
14751469
});
14761470

14771471
test('runner session stop kills only owned stale xcodebuild runner processes without in-memory session', async () => {
@@ -1510,7 +1504,7 @@ test('runner session abort removes owned lease for in-memory sessions', async ()
15101504
['/tmp/session-runner.xctestrun'],
15111505
['/tmp/session-runner.json'],
15121506
]);
1513-
assert.equal(mockRedirectRelease.mock.calls.length, 1);
1507+
assert.equal(redirectRelease.mock.calls.length, 1);
15141508
});
15151509

15161510
function isXcodebuildPkillCall(call: unknown[]): boolean {
@@ -1552,7 +1546,7 @@ test('runner session invalidation skips graceful shutdown and removes stale sess
15521546
['/tmp/session-runner.xctestrun'],
15531547
['/tmp/session-runner.json'],
15541548
]);
1555-
assert.equal(mockRedirectRelease.mock.calls.length, 1);
1549+
assert.equal(redirectRelease.mock.calls.length, 1);
15561550
assert.equal(getRunnerSessionSnapshot(device.id), null);
15571551
});
15581552

0 commit comments

Comments
 (0)