@@ -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' ;
@@ -612,18 +612,9 @@ test('runner session starts xcodebuild through provider seams and reuses an aliv
612612 await stopRunnerSession ( session ) ;
613613} ) ;
614614
615- test ( 'runner session fails early when Apple developer mode is disabled' , async ( ) => {
616- const device = { ...IOS_SIMULATOR , id : 'runner-session-devtools-disabled-sim' } ;
617- mockRunAppleToolCommand . mockImplementation ( async ( cmd , args ) => {
618- if ( cmd === 'DevToolsSecurity' && args [ 0 ] === '-status' ) {
619- return {
620- exitCode : 0 ,
621- stdout : 'Developer mode is currently disabled.\n' ,
622- stderr : '' ,
623- } ;
624- }
625- return { exitCode : 0 , stdout : '' , stderr : '' } ;
626- } ) ;
615+ test ( 'runner session fails early for physical iOS devices when Apple developer mode is disabled' , async ( ) => {
616+ const device = { ...IOS_DEVICE , id : 'runner-session-devtools-disabled-device' } ;
617+ mockDevToolsSecurityDisabled ( ) ;
627618
628619 await assert . rejects (
629620 ( ) => ensureRunnerSession ( device , { } ) ,
@@ -640,6 +631,18 @@ test('runner session fails early when Apple developer mode is disabled', async (
640631 assert . equal ( mockRunCmdBackground . mock . calls . length , 0 ) ;
641632} ) ;
642633
634+ test ( 'runner session does not require Apple developer mode for iOS simulators' , async ( ) => {
635+ const device = { ...IOS_SIMULATOR , id : 'runner-session-devtools-disabled-sim' } ;
636+ mockDevToolsSecurityDisabled ( ) ;
637+
638+ const session = await ensureRunnerSession ( device , { } ) ;
639+
640+ assert . equal ( session . deviceId , device . id ) ;
641+ assert . equal ( mockEnsureXctestrunArtifact . mock . calls . length , 1 ) ;
642+ assert . equal ( mockRunCmdBackground . mock . calls . length , 1 ) ;
643+ assert . equal ( mockRunAppleToolCommand . mock . calls . some ( isDevToolsSecurityStatusCall ) , false ) ;
644+ } ) ;
645+
643646test ( 'runner session startup kills legacy ownerless xcodebuild before launching a new runner' , async ( ) => {
644647 const device = { ...IOS_SIMULATOR , id : 'runner-session-startup-stale-sim' } ;
645648
@@ -884,6 +887,24 @@ function isXcodebuildPkillCall(call: unknown[]): boolean {
884887 return call [ 0 ] === 'pkill' && Array . isArray ( args ) && args . includes ( '-f' ) ;
885888}
886889
890+ function isDevToolsSecurityStatusCall ( call : unknown [ ] ) : boolean {
891+ const args = call [ 1 ] ;
892+ return call [ 0 ] === 'DevToolsSecurity' && Array . isArray ( args ) && args [ 0 ] === '-status' ;
893+ }
894+
895+ function mockDevToolsSecurityDisabled ( ) : void {
896+ mockRunAppleToolCommand . mockImplementation ( async ( cmd , args ) => {
897+ if ( cmd === 'DevToolsSecurity' && args [ 0 ] === '-status' ) {
898+ return {
899+ exitCode : 0 ,
900+ stdout : 'Developer mode is currently disabled.\n' ,
901+ stderr : '' ,
902+ } ;
903+ }
904+ return { exitCode : 0 , stdout : '' , stderr : '' } ;
905+ } ) ;
906+ }
907+
887908function isSimctlTerminateCall ( call : unknown [ ] ) : boolean {
888909 const args = call [ 0 ] ;
889910 return Array . isArray ( args ) && args . includes ( 'simctl' ) && args . includes ( 'terminate' ) ;
0 commit comments