@@ -4,7 +4,7 @@ import fs from 'node:fs';
44import os from 'node:os' ;
55import path from 'node:path' ;
66import { beforeEach , test , vi } from 'vitest' ;
7- import { IOS_SIMULATOR } from '../../../__tests__/test-utils/index.ts' ;
7+ import { IOS_DEVICE , IOS_SIMULATOR } from '../../../__tests__/test-utils/index.ts' ;
88import { AppError } from '../../../utils/errors.ts' ;
99import { flushDiagnosticsToSessionFile , withDiagnosticsScope } from '../../../utils/diagnostics.ts' ;
1010import type { RunnerSession } from '../runner-session-types.ts' ;
@@ -609,18 +609,9 @@ test('runner session starts xcodebuild through provider seams and reuses an aliv
609609 await stopRunnerSession ( session ) ;
610610} ) ;
611611
612- test ( 'runner session fails early when Apple developer mode is disabled' , async ( ) => {
613- const device = { ...IOS_SIMULATOR , id : 'runner-session-devtools-disabled-sim' } ;
614- mockRunAppleToolCommand . mockImplementation ( async ( cmd , args ) => {
615- if ( cmd === 'DevToolsSecurity' && args [ 0 ] === '-status' ) {
616- return {
617- exitCode : 0 ,
618- stdout : 'Developer mode is currently disabled.\n' ,
619- stderr : '' ,
620- } ;
621- }
622- return { exitCode : 0 , stdout : '' , stderr : '' } ;
623- } ) ;
612+ test ( 'runner session fails early for physical iOS devices when Apple developer mode is disabled' , async ( ) => {
613+ const device = { ...IOS_DEVICE , id : 'runner-session-devtools-disabled-device' } ;
614+ mockDevToolsSecurityDisabled ( ) ;
624615
625616 await assert . rejects (
626617 ( ) => ensureRunnerSession ( device , { } ) ,
@@ -637,6 +628,18 @@ test('runner session fails early when Apple developer mode is disabled', async (
637628 assert . equal ( mockRunCmdBackground . mock . calls . length , 0 ) ;
638629} ) ;
639630
631+ test ( 'runner session does not require Apple developer mode for iOS simulators' , async ( ) => {
632+ const device = { ...IOS_SIMULATOR , id : 'runner-session-devtools-disabled-sim' } ;
633+ mockDevToolsSecurityDisabled ( ) ;
634+
635+ const session = await ensureRunnerSession ( device , { } ) ;
636+
637+ assert . equal ( session . deviceId , device . id ) ;
638+ assert . equal ( mockEnsureXctestrunArtifact . mock . calls . length , 1 ) ;
639+ assert . equal ( mockRunCmdBackground . mock . calls . length , 1 ) ;
640+ assert . equal ( mockRunAppleToolCommand . mock . calls . some ( isDevToolsSecurityStatusCall ) , false ) ;
641+ } ) ;
642+
640643test ( 'runner session startup kills legacy ownerless xcodebuild before launching a new runner' , async ( ) => {
641644 const device = { ...IOS_SIMULATOR , id : 'runner-session-startup-stale-sim' } ;
642645
@@ -861,6 +864,24 @@ function isXcodebuildPkillCall(call: unknown[]): boolean {
861864 return call [ 0 ] === 'pkill' && Array . isArray ( args ) && args . includes ( '-f' ) ;
862865}
863866
867+ function isDevToolsSecurityStatusCall ( call : unknown [ ] ) : boolean {
868+ const args = call [ 1 ] ;
869+ return call [ 0 ] === 'DevToolsSecurity' && Array . isArray ( args ) && args [ 0 ] === '-status' ;
870+ }
871+
872+ function mockDevToolsSecurityDisabled ( ) : void {
873+ mockRunAppleToolCommand . mockImplementation ( async ( cmd , args ) => {
874+ if ( cmd === 'DevToolsSecurity' && args [ 0 ] === '-status' ) {
875+ return {
876+ exitCode : 0 ,
877+ stdout : 'Developer mode is currently disabled.\n' ,
878+ stderr : '' ,
879+ } ;
880+ }
881+ return { exitCode : 0 , stdout : '' , stderr : '' } ;
882+ } ) ;
883+ }
884+
864885function isSimctlTerminateCall ( call : unknown [ ] ) : boolean {
865886 const args = call [ 0 ] ;
866887 return Array . isArray ( args ) && args . includes ( 'simctl' ) && args . includes ( 'terminate' ) ;
0 commit comments