diff --git a/scripts/write-xcuitest-cache-metadata.mjs b/scripts/write-xcuitest-cache-metadata.mjs index befa4af52..c0bfe8c79 100644 --- a/scripts/write-xcuitest-cache-metadata.mjs +++ b/scripts/write-xcuitest-cache-metadata.mjs @@ -113,7 +113,7 @@ function resolveDeviceKind() { function resolveTarget() { if (platform === 'macos') return 'desktop'; if (platform === 'tvos') return 'tv'; - return 'phone'; + return 'mobile'; } function resolveMacRunnerArch() { diff --git a/src/platforms/ios/__tests__/runner-xctestrun.test.ts b/src/platforms/ios/__tests__/runner-xctestrun.test.ts index 621c22ede..a5481db96 100644 --- a/src/platforms/ios/__tests__/runner-xctestrun.test.ts +++ b/src/platforms/ios/__tests__/runner-xctestrun.test.ts @@ -1,5 +1,6 @@ import { test, vi } from 'vitest'; import assert from 'node:assert/strict'; +import { execFileSync } from 'node:child_process'; import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; @@ -10,6 +11,7 @@ import { acquireXcodebuildSimulatorSetRedirect, findXctestrun, prepareXctestrunWithEnv, + resolveExpectedRunnerCacheMetadata, resolveXcodebuildSimulatorDeviceSetPath, scoreXctestrunCandidate, } from '../runner-xctestrun.ts'; @@ -19,6 +21,7 @@ const iosSimulator: DeviceInfo = { id: 'sim-1', name: 'iPhone Simulator', kind: 'simulator', + target: 'mobile', booted: true, }; @@ -193,6 +196,25 @@ test('scoreXctestrunCandidate penalizes macos and env xctestrun files for simula assert.ok(simulatorScore > macosEnvScore); }); +test('setup metadata script matches expected iOS simulator cache metadata', async () => { + await withTempDir('runner-cache-metadata-', async (root) => { + execFileSync( + process.execPath, + ['scripts/write-xcuitest-cache-metadata.mjs', 'ios', root, 'generic/platform=iOS Simulator'], + { cwd: process.cwd(), stdio: ['ignore', 'ignore', 'inherit'] }, + ); + + const actual = JSON.parse( + fs.readFileSync(path.join(root, '.agent-device-runner-cache.json'), 'utf8'), + ); + const { artifacts: _actualArtifacts, ...actualComparable } = actual; + const { artifacts: _expectedArtifacts, ...expectedComparable } = + resolveExpectedRunnerCacheMetadata(iosSimulator); + + assert.deepEqual(actualComparable, expectedComparable); + }); +}); + test('prepareXctestrunWithEnv avoids XCTest screen recordings for nested and legacy targets', async () => { await withTempDir('runner-xctestrun-policy-', async (root) => { const xctestrunPath = path.join(root, 'AgentDeviceRunner.xctestrun'); diff --git a/src/platforms/ios/runner-xctestrun.ts b/src/platforms/ios/runner-xctestrun.ts index 7585d9b73..a4d745736 100644 --- a/src/platforms/ios/runner-xctestrun.ts +++ b/src/platforms/ios/runner-xctestrun.ts @@ -89,7 +89,7 @@ export type RunnerXctestrunCacheMetadata = { runnerSourceFingerprint: string; platformName: string; deviceKind: DeviceInfo['kind']; - target: DeviceInfo['target'] | 'phone'; + target: NonNullable; buildDestinationFamily: string; runnerBundleBuildSettings: string[]; runnerSigningBuildSettings: string[]; @@ -684,7 +684,7 @@ export function resolveExpectedRunnerCacheMetadata( runnerSourceFingerprint: computeRunnerSourceFingerprint(projectRoot), platformName: resolveRunnerPlatformName(device), deviceKind: device.kind, - target: device.target ?? 'phone', + target: device.target ?? 'mobile', buildDestinationFamily: resolveRunnerBuildDestinationFamily(device), runnerBundleBuildSettings: resolveRunnerBundleBuildSettings(process.env), runnerSigningBuildSettings: resolveRunnerSigningBuildSettings(