From 72a817c64373a703c435006f4703b89d97b8fc05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Pierzcha=C5=82a?= Date: Mon, 1 Jun 2026 19:08:31 -0500 Subject: [PATCH] fix: bound iOS simulator app termination --- src/platforms/ios/__tests__/index.test.ts | 19 +++++++++++++++++++ src/platforms/ios/apps.ts | 7 ++++++- src/platforms/ios/config.ts | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/platforms/ios/__tests__/index.test.ts b/src/platforms/ios/__tests__/index.test.ts index 1b218dbc9..d1329e8ae 100644 --- a/src/platforms/ios/__tests__/index.test.ts +++ b/src/platforms/ios/__tests__/index.test.ts @@ -71,6 +71,7 @@ import { ensureBootedSimulator, openIosSimulatorApp } from '../simulator.ts'; import { prepareSimulatorStatusBarForScreenshot as prepareStatusBarForScreenshot } from '../screenshot-status-bar.ts'; import { runIosRunnerCommand } from '../runner-client.ts'; import { iosRunnerOverrides } from '../interactions.ts'; +import { IOS_SIMULATOR_TERMINATE_TIMEOUT_MS } from '../config.ts'; import type { DeviceInfo } from '../../../utils/device.ts'; import { withDiagnosticsScope } from '../../../utils/diagnostics.ts'; import { AppError } from '../../../utils/errors.ts'; @@ -1136,6 +1137,24 @@ test('closeIosApp on macOS uses helper quit for bundle identifiers', async () => ); }); +test('closeIosApp on iOS simulator bounds simctl terminate', async () => { + mockEnsureBootedSimulator.mockResolvedValue(undefined); + mockRunCmd.mockResolvedValue({ stdout: '', stderr: '', exitCode: 0 }); + + await closeIosApp(IOS_TEST_SIMULATOR, 'com.example.foobar'); + + assert.equal(mockRunCmd.mock.calls.length, 1); + assert.equal(mockRunCmd.mock.calls[0]?.[0], 'xcrun'); + assert.deepEqual(mockRunCmd.mock.calls[0]?.[1], [ + 'simctl', + 'terminate', + 'sim-1', + 'com.example.foobar', + ]); + assert.equal(mockRunCmd.mock.calls[0]?.[2]?.allowFailure, true); + assert.equal(mockRunCmd.mock.calls[0]?.[2]?.timeoutMs, IOS_SIMULATOR_TERMINATE_TIMEOUT_MS); +}); + test('quitMacOsApp rejects invalid bundle identifiers before invoking helper', async () => { await assert.rejects(() => quitMacOsApp('not a bundle id'), /reverse-DNS form/i); }); diff --git a/src/platforms/ios/apps.ts b/src/platforms/ios/apps.ts index 382e2994e..071784fd1 100644 --- a/src/platforms/ios/apps.ts +++ b/src/platforms/ios/apps.ts @@ -28,7 +28,11 @@ import { type CommandAttemptFailure, } from '../command-attempts.ts'; -import { IOS_APP_LAUNCH_TIMEOUT_MS, IOS_DEVICECTL_TIMEOUT_MS } from './config.ts'; +import { + IOS_APP_LAUNCH_TIMEOUT_MS, + IOS_DEVICECTL_TIMEOUT_MS, + IOS_SIMULATOR_TERMINATE_TIMEOUT_MS, +} from './config.ts'; import { IOS_DEVICECTL_DEFAULT_HINT, listIosDeviceApps, @@ -277,6 +281,7 @@ export async function closeIosApp(device: DeviceInfo, app: string): Promise