Skip to content

Commit 5c3a781

Browse files
cameroncookecodex
andcommitted
test: Stabilize release filesystem lifecycle tests
Cancel pending lifecycle timers during test resets and avoid using a fake result-bundle owner PID that can exist on CI runners. This keeps release unit tests deterministic across macOS runner process tables. Co-Authored-By: Codex <noreply@openai.com>
1 parent 36e051b commit 5c3a781

3 files changed

Lines changed: 11 additions & 1 deletion

File tree

src/utils/__tests__/test-common.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
setXcodeBuildMCPAppDirOverrideForTests,
1515
} from '../log-paths.ts';
1616
import { setRuntimeInstanceForTests } from '../runtime-instance.ts';
17+
import { resetWorkspaceFilesystemLifecycleStateForTests } from '../workspace-filesystem-lifecycle.ts';
1718

1819
function createSuccessfulCommandResponse(): CommandResponse {
1920
return {
@@ -115,6 +116,7 @@ describe('createTestExecutor', () => {
115116
});
116117

117118
afterEach(() => {
119+
resetWorkspaceFilesystemLifecycleStateForTests();
118120
setXcodeBuildMCPAppDirOverrideForTests(null);
119121
setRuntimeInstanceForTests(null);
120122
rmSync(tempAppDir, { recursive: true, force: true });

src/utils/__tests__/workspace-filesystem-lifecycle.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
import { setSimulatorLaunchOsLogRecordActiveOverrideForTests } from '../log-capture/simulator-launch-oslog-registry.ts';
2626

2727
let appDir: string;
28+
const DEAD_OWNER_PID = 999_999_999;
2829

2930
function writeFileWithMtime(filePath: string, content: string, mtimeMs: number): void {
3031
mkdirSync(path.dirname(filePath), { recursive: true });
@@ -37,7 +38,7 @@ function managedXcodebuildLogName(name = 'build_sim'): string {
3738
return `${name}_2026-05-02T12-00-00-000Z_pid123_abcdef12.log`;
3839
}
3940

40-
function managedResultBundleName(name = 'test', pid = 123): string {
41+
function managedResultBundleName(name = 'test', pid = DEAD_OWNER_PID): string {
4142
return `${name}_2026-05-02T12-00-00-000Z_pid${pid}_abcdef12.xcresult`;
4243
}
4344

src/utils/workspace-filesystem-lifecycle.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const FALLBACK_LOCK_DIR_NAME = '.filesystem-lifecycle.lock';
2828
const runningScheduledSweeps = new Set<string>();
2929
const lastScheduledAtByScope = new Map<string, number>();
3030
const lastScheduledAtByPreKey = new Map<string, number>();
31+
const scheduledSweepTimers = new Set<ReturnType<typeof setTimeout>>();
3132

3233
const HELPER_PID_PATTERN = /(?:^|_)helperpid(\d+)(?:_|\.|$)/g;
3334
const ISO_TIMESTAMP_PATTERN = '\\d{4}-\\d{2}-\\d{2}T\\d{2}-\\d{2}-\\d{2}-\\d{3}Z';
@@ -638,9 +639,11 @@ export function scheduleWorkspaceFilesystemLifecycleSweep(
638639
log('warn', `[FilesystemLifecycle] Cleanup failed: ${message}`);
639640
})
640641
.finally(() => {
642+
scheduledSweepTimers.delete(timer);
641643
runningScheduledSweeps.delete(scheduleKey);
642644
});
643645
}, WORKSPACE_FILESYSTEM_LIFECYCLE_SCHEDULE_DELAY_MS);
646+
scheduledSweepTimers.add(timer);
644647
timer.unref?.();
645648
}
646649

@@ -703,6 +706,10 @@ export function terminateOwnedWorkspaceFilesystemArtifactsSync(): {
703706
}
704707

705708
export function resetWorkspaceFilesystemLifecycleStateForTests(): void {
709+
for (const timer of scheduledSweepTimers) {
710+
clearTimeout(timer);
711+
}
712+
scheduledSweepTimers.clear();
706713
runningScheduledSweeps.clear();
707714
lastScheduledAtByScope.clear();
708715
lastScheduledAtByPreKey.clear();

0 commit comments

Comments
 (0)