appium-ios-simulator 8.1.3 → 8.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/build/lib/extensions/settings.js +5 -5
- package/build/lib/extensions/settings.js.map +1 -1
- package/build/lib/simulator-xcode-14.d.ts +2 -0
- package/build/lib/simulator-xcode-14.d.ts.map +1 -1
- package/build/lib/simulator-xcode-14.js +16 -19
- package/build/lib/simulator-xcode-14.js.map +1 -1
- package/build/lib/simulator-xcode-15.d.ts.map +1 -1
- package/build/lib/simulator-xcode-15.js +2 -16
- package/build/lib/simulator-xcode-15.js.map +1 -1
- package/build/lib/simulator-xcode-27.d.ts +6 -0
- package/build/lib/simulator-xcode-27.d.ts.map +1 -0
- package/build/lib/simulator-xcode-27.js +13 -0
- package/build/lib/simulator-xcode-27.js.map +1 -0
- package/build/lib/simulator.d.ts.map +1 -1
- package/build/lib/simulator.js +9 -8
- package/build/lib/simulator.js.map +1 -1
- package/build/lib/utils/constants.d.ts +7 -0
- package/build/lib/utils/constants.d.ts.map +1 -0
- package/build/lib/utils/constants.js +10 -0
- package/build/lib/utils/constants.js.map +1 -0
- package/build/lib/{defaults-utils.d.ts → utils/defaults.d.ts} +1 -1
- package/build/lib/utils/defaults.d.ts.map +1 -0
- package/build/lib/{defaults-utils.js → utils/defaults.js} +2 -2
- package/build/lib/utils/defaults.js.map +1 -0
- package/build/lib/utils/devices.d.ts +13 -0
- package/build/lib/utils/devices.d.ts.map +1 -0
- package/build/lib/utils/devices.js +24 -0
- package/build/lib/utils/devices.js.map +1 -0
- package/build/lib/utils/get-devices.d.ts +7 -0
- package/build/lib/utils/get-devices.d.ts.map +1 -0
- package/build/lib/utils/get-devices.js +12 -0
- package/build/lib/utils/get-devices.js.map +1 -0
- package/build/lib/utils/index.d.ts +9 -0
- package/build/lib/utils/index.d.ts.map +1 -0
- package/build/lib/utils/index.js +29 -0
- package/build/lib/utils/index.js.map +1 -0
- package/build/lib/utils/lifecycle.d.ts +6 -0
- package/build/lib/utils/lifecycle.d.ts.map +1 -0
- package/build/lib/utils/lifecycle.js +66 -0
- package/build/lib/utils/lifecycle.js.map +1 -0
- package/build/lib/utils/process.d.ts +11 -0
- package/build/lib/utils/process.d.ts.map +1 -0
- package/build/lib/utils/process.js +36 -0
- package/build/lib/utils/process.js.map +1 -0
- package/build/lib/utils/types.d.ts +4 -0
- package/build/lib/utils/types.d.ts.map +1 -0
- package/build/lib/utils/types.js +3 -0
- package/build/lib/utils/types.js.map +1 -0
- package/build/lib/utils/xcode.d.ts +27 -0
- package/build/lib/utils/xcode.d.ts.map +1 -0
- package/build/lib/utils/xcode.js +80 -0
- package/build/lib/utils/xcode.js.map +1 -0
- package/lib/extensions/settings.ts +1 -1
- package/lib/simulator-xcode-14.ts +23 -19
- package/lib/simulator-xcode-15.ts +4 -15
- package/lib/simulator-xcode-27.ts +9 -0
- package/lib/simulator.ts +14 -10
- package/lib/utils/constants.ts +6 -0
- package/lib/{defaults-utils.ts → utils/defaults.ts} +1 -1
- package/lib/utils/devices.ts +25 -0
- package/lib/utils/get-devices.ts +10 -0
- package/lib/utils/index.ts +20 -0
- package/lib/utils/lifecycle.ts +78 -0
- package/lib/utils/process.ts +31 -0
- package/lib/utils/types.ts +3 -0
- package/lib/utils/xcode.ts +86 -0
- package/package.json +1 -1
- package/build/lib/defaults-utils.d.ts.map +0 -1
- package/build/lib/defaults-utils.js.map +0 -1
- package/build/lib/utils.d.ts +0 -44
- package/build/lib/utils.d.ts.map +0 -1
- package/build/lib/utils.js +0 -211
- package/build/lib/utils.js.map +0 -1
- package/lib/utils.ts +0 -189
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import {log} from '../logger';
|
|
2
|
+
import {exec, type ExecError} from 'teen_process';
|
|
3
|
+
import {waitForCondition} from 'asyncbox';
|
|
4
|
+
import {getVersion} from 'appium-xcode';
|
|
5
|
+
import {
|
|
6
|
+
DEVICE_HUB_UI_CLIENT_BUNDLE_ID,
|
|
7
|
+
MIN_DEVICE_HUB_XCODE_VERSION,
|
|
8
|
+
SIMULATOR_UI_CLIENT_BUNDLE_ID,
|
|
9
|
+
} from './constants';
|
|
10
|
+
import {getDevices} from './get-devices';
|
|
11
|
+
import {getMacAppPidByBundleId, killMacAppByBundleId} from './process';
|
|
12
|
+
|
|
13
|
+
const DEFAULT_SIM_SHUTDOWN_TIMEOUT_MS = 60000;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param timeout - Timeout in milliseconds (default: DEFAULT_SIM_SHUTDOWN_TIMEOUT_MS).
|
|
17
|
+
* @returns Promise that resolves when all simulators are killed.
|
|
18
|
+
*/
|
|
19
|
+
export async function killAllSimulators(
|
|
20
|
+
timeout: number = DEFAULT_SIM_SHUTDOWN_TIMEOUT_MS,
|
|
21
|
+
): Promise<void> {
|
|
22
|
+
log.debug('Killing all iOS Simulators');
|
|
23
|
+
const xcodeVersion = await getVersion(true);
|
|
24
|
+
const uiClientBundleId =
|
|
25
|
+
xcodeVersion.major >= MIN_DEVICE_HUB_XCODE_VERSION
|
|
26
|
+
? DEVICE_HUB_UI_CLIENT_BUNDLE_ID
|
|
27
|
+
: SIMULATOR_UI_CLIENT_BUNDLE_ID;
|
|
28
|
+
|
|
29
|
+
const startedMs = performance.now();
|
|
30
|
+
try {
|
|
31
|
+
await exec('xcrun', ['simctl', 'shutdown', 'all'], {timeout});
|
|
32
|
+
} catch (err: unknown) {
|
|
33
|
+
log.debug(
|
|
34
|
+
`Failed to shutdown all simulators: ${(err as ExecError).stderr || (err as Error).message}`,
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const uiClientPid = await getMacAppPidByBundleId(uiClientBundleId);
|
|
39
|
+
if (uiClientPid) {
|
|
40
|
+
log.debug(`Killing UI client '${uiClientBundleId}' (pid ${uiClientPid})`);
|
|
41
|
+
await killMacAppByBundleId(uiClientBundleId);
|
|
42
|
+
} else {
|
|
43
|
+
log.debug(`UI client '${uiClientBundleId}' is not running`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
await waitForCondition(allSimsAreDown, {
|
|
48
|
+
waitMs: Math.max(1000, startedMs + timeout - performance.now()),
|
|
49
|
+
intervalMs: 200,
|
|
50
|
+
});
|
|
51
|
+
} catch (err) {
|
|
52
|
+
const remainingDevices = await getNonShutdownDeviceDescriptions();
|
|
53
|
+
const message =
|
|
54
|
+
remainingDevices.length > 0
|
|
55
|
+
? `The following devices are still not in the correct state after ${timeout} ms:\n` +
|
|
56
|
+
remainingDevices.map((device) => ` ${device}`).join('\n')
|
|
57
|
+
: `Timed out after ${timeout} ms waiting for all simulators to shut down`;
|
|
58
|
+
throw new Error(message, {cause: err});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async function allSimsAreDown(): Promise<boolean> {
|
|
63
|
+
try {
|
|
64
|
+
return (await getNonShutdownDeviceDescriptions()).length === 0;
|
|
65
|
+
} catch {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function getNonShutdownDeviceDescriptions(): Promise<string[]> {
|
|
71
|
+
const devices = Object.values(await getDevices()).flat();
|
|
72
|
+
return devices
|
|
73
|
+
.filter((sim) => !['shutdown', 'unavailable', 'disconnected'].includes(sim.state.toLowerCase()))
|
|
74
|
+
.map(
|
|
75
|
+
(sim) =>
|
|
76
|
+
`${sim.name} (${sim.sdk}, udid: ${sim.udid}) is still in state '${sim.state.toLowerCase()}'`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {log} from '../logger';
|
|
2
|
+
import {exec} from 'teen_process';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @param bundleId - The bundle identifier of a running macOS application.
|
|
6
|
+
* @returns The process ID or null if the application is not running.
|
|
7
|
+
*/
|
|
8
|
+
export async function getMacAppPidByBundleId(bundleId: string): Promise<string | null> {
|
|
9
|
+
let stdout: string;
|
|
10
|
+
try {
|
|
11
|
+
({stdout} = await exec('lsappinfo', ['info', '-only', 'pid', bundleId]));
|
|
12
|
+
} catch {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const match = stdout.trim().match(/"pid"=(\d+)/);
|
|
16
|
+
return match?.[1] ?? null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @param bundleId - The bundle identifier of a running macOS application.
|
|
21
|
+
* @returns True if the kill command succeeded.
|
|
22
|
+
*/
|
|
23
|
+
export async function killMacAppByBundleId(bundleId: string): Promise<boolean> {
|
|
24
|
+
try {
|
|
25
|
+
await exec('lsappinfo', ['kill', '-hard', bundleId]);
|
|
26
|
+
return true;
|
|
27
|
+
} catch (e: any) {
|
|
28
|
+
log.debug(`Could not kill '${bundleId}' via lsappinfo: ${e.stderr || e.message}`);
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {fs} from '@appium/support';
|
|
2
|
+
import {exec} from 'teen_process';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import type {XcodeVersion} from 'appium-xcode';
|
|
5
|
+
import {MIN_DEVICE_HUB_XCODE_VERSION, MIN_SUPPORTED_XCODE_VERSION} from './constants';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @returns Promise that resolves to the developer root path.
|
|
9
|
+
*/
|
|
10
|
+
export async function getDeveloperRoot(): Promise<string> {
|
|
11
|
+
const {stdout} = await exec('xcode-select', ['-p']);
|
|
12
|
+
return stdout.trim();
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param bundleId - The bundle identifier of the Simulator UI client.
|
|
17
|
+
* @param xcodeVersion - The active Xcode version.
|
|
18
|
+
* @returns The full path to the UI client app in the active Xcode installation.
|
|
19
|
+
* @throws {Error} If no matching app is found in the active Xcode folder.
|
|
20
|
+
*/
|
|
21
|
+
export async function getUiClientAppPath(
|
|
22
|
+
bundleId: string,
|
|
23
|
+
xcodeVersion: XcodeVersion,
|
|
24
|
+
): Promise<string> {
|
|
25
|
+
const devRoot = await getDeveloperRoot();
|
|
26
|
+
const applicationsDir =
|
|
27
|
+
xcodeVersion.major >= MIN_DEVICE_HUB_XCODE_VERSION
|
|
28
|
+
? path.resolve(devRoot, '..', 'Applications')
|
|
29
|
+
: path.resolve(devRoot, 'Applications');
|
|
30
|
+
|
|
31
|
+
if (await fs.exists(applicationsDir)) {
|
|
32
|
+
const appPaths = (await fs.readdir(applicationsDir))
|
|
33
|
+
.filter((entry) => entry.endsWith('.app'))
|
|
34
|
+
.map((entry) => path.resolve(applicationsDir, entry));
|
|
35
|
+
const apps = await Promise.all(
|
|
36
|
+
appPaths.map(async (appPath) => ({
|
|
37
|
+
appPath,
|
|
38
|
+
bundleId: await readBundleIdFromPlist(path.resolve(appPath, 'Contents', 'Info.plist')),
|
|
39
|
+
})),
|
|
40
|
+
);
|
|
41
|
+
const match = apps.find((app) => app.bundleId === bundleId);
|
|
42
|
+
if (match) {
|
|
43
|
+
return match.appPath;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
throw new Error(
|
|
48
|
+
`Could not find UI client app with bundle id '${bundleId}' under '${applicationsDir}' ` +
|
|
49
|
+
`(active Xcode developer root: ${devRoot})`,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Asserts that the Xcode version meets the minimum supported version requirement.
|
|
55
|
+
*
|
|
56
|
+
* @template V - The Xcode version type.
|
|
57
|
+
* @param xcodeVersion - The Xcode version to check.
|
|
58
|
+
* @returns The same Xcode version if it meets the requirement.
|
|
59
|
+
* @throws {Error} If the Xcode version is below the minimum supported version.
|
|
60
|
+
*/
|
|
61
|
+
export function assertXcodeVersion<V extends XcodeVersion>(xcodeVersion: V): V {
|
|
62
|
+
if (xcodeVersion.major < MIN_SUPPORTED_XCODE_VERSION) {
|
|
63
|
+
throw new Error(
|
|
64
|
+
`Tried to use an iOS simulator with xcode version ${xcodeVersion.versionString} but only Xcode version ` +
|
|
65
|
+
`${MIN_SUPPORTED_XCODE_VERSION} and up are supported`,
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
return xcodeVersion;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @param infoPlistPath - The full path to an Info.plist file.
|
|
73
|
+
* @returns The bundle identifier or null if it cannot be read.
|
|
74
|
+
*/
|
|
75
|
+
export async function readBundleIdFromPlist(infoPlistPath: string): Promise<string | null> {
|
|
76
|
+
try {
|
|
77
|
+
const {stdout} = await exec('/usr/libexec/PlistBuddy', [
|
|
78
|
+
'-c',
|
|
79
|
+
'print CFBundleIdentifier',
|
|
80
|
+
infoPlistPath,
|
|
81
|
+
]);
|
|
82
|
+
return stdout.trim() || null;
|
|
83
|
+
} catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"defaults-utils.d.ts","sourceRoot":"","sources":["../../lib/defaults-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0C,KAAK,OAAO,EAAC,MAAM,gBAAgB,CAAC;AAKrF,qBAAa,cAAc;IACzB,KAAK,EAAE,MAAM,CAAC;gBAEF,KAAK,EAAE,MAAM;IAIzB;;;;;;OAMG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAY5C;;;;;;;;;;OAUG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAoB5D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,GAAE,OAAc,GAAG,MAAM,GAAG,OAAO,CA0ChF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,OAAO,GAAE,OAAe,GACvB,MAAM,EAAE,EAAE,CA4BZ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"defaults-utils.js","sourceRoot":"","sources":["../../lib/defaults-utils.ts"],"names":[],"mappings":"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"}
|
package/build/lib/utils.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import type { XcodeVersion } from 'appium-xcode';
|
|
2
|
-
import type { StringRecord } from '@appium/types';
|
|
3
|
-
export declare const SAFARI_STARTUP_TIMEOUT_MS: number;
|
|
4
|
-
export declare const MOBILE_SAFARI_BUNDLE_ID = "com.apple.mobilesafari";
|
|
5
|
-
export declare const SIMULATOR_APP_NAME = "Simulator.app";
|
|
6
|
-
export declare const MIN_SUPPORTED_XCODE_VERSION = 14;
|
|
7
|
-
export interface SimulatorInfoOptions {
|
|
8
|
-
devicesSetPath?: string | null;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* @param timeout - Timeout in milliseconds (default: DEFAULT_SIM_SHUTDOWN_TIMEOUT_MS).
|
|
12
|
-
* @returns Promise that resolves when all simulators are killed.
|
|
13
|
-
*/
|
|
14
|
-
export declare function killAllSimulators(timeout?: number): Promise<void>;
|
|
15
|
-
/**
|
|
16
|
-
* @param udid - The simulator UDID.
|
|
17
|
-
* @param opts - Options including devicesSetPath.
|
|
18
|
-
* @returns Promise that resolves to simulator info or undefined if not found.
|
|
19
|
-
*/
|
|
20
|
-
export declare function getSimulatorInfo(udid: string, opts?: SimulatorInfoOptions): Promise<any>;
|
|
21
|
-
/**
|
|
22
|
-
* @param udid - The simulator UDID.
|
|
23
|
-
* @returns Promise that resolves to true if simulator exists, false otherwise.
|
|
24
|
-
*/
|
|
25
|
-
export declare function simExists(udid: string): Promise<boolean>;
|
|
26
|
-
/**
|
|
27
|
-
* @returns Promise that resolves to the developer root path.
|
|
28
|
-
*/
|
|
29
|
-
export declare function getDeveloperRoot(): Promise<string>;
|
|
30
|
-
/**
|
|
31
|
-
* Asserts that the Xcode version meets the minimum supported version requirement.
|
|
32
|
-
*
|
|
33
|
-
* @template V - The Xcode version type.
|
|
34
|
-
* @param xcodeVersion - The Xcode version to check.
|
|
35
|
-
* @returns The same Xcode version if it meets the requirement.
|
|
36
|
-
* @throws {Error} If the Xcode version is below the minimum supported version.
|
|
37
|
-
*/
|
|
38
|
-
export declare function assertXcodeVersion<V extends XcodeVersion>(xcodeVersion: V): V;
|
|
39
|
-
/**
|
|
40
|
-
* @param simctlOpts - Optional simctl options
|
|
41
|
-
* @returns Promise that resolves to a record of devices grouped by SDK version
|
|
42
|
-
*/
|
|
43
|
-
export declare function getDevices(simctlOpts?: StringRecord): Promise<Record<string, any[]>>;
|
|
44
|
-
//# sourceMappingURL=utils.d.ts.map
|
package/build/lib/utils.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../lib/utils.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,cAAc,CAAC;AAG/C,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,eAAe,CAAC;AAKhD,eAAO,MAAM,yBAAyB,QAAY,CAAC;AACnD,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAChE,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAClD,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,GAAE,MAAwC,GAChD,OAAO,CAAC,IAAI,CAAC,CA6Ef;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,GAAG,CAAC,CAKd;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAGxD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,YAAY,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAQ7E;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,UAAU,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAE1F"}
|
package/build/lib/utils.js
DELETED
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.MIN_SUPPORTED_XCODE_VERSION = exports.SIMULATOR_APP_NAME = exports.MOBILE_SAFARI_BUNDLE_ID = exports.SAFARI_STARTUP_TIMEOUT_MS = void 0;
|
|
40
|
-
exports.killAllSimulators = killAllSimulators;
|
|
41
|
-
exports.getSimulatorInfo = getSimulatorInfo;
|
|
42
|
-
exports.simExists = simExists;
|
|
43
|
-
exports.getDeveloperRoot = getDeveloperRoot;
|
|
44
|
-
exports.assertXcodeVersion = assertXcodeVersion;
|
|
45
|
-
exports.getDevices = getDevices;
|
|
46
|
-
const logger_1 = require("./logger");
|
|
47
|
-
const teen_process_1 = require("teen_process");
|
|
48
|
-
const asyncbox_1 = require("asyncbox");
|
|
49
|
-
const appium_xcode_1 = require("appium-xcode");
|
|
50
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
51
|
-
const node_simctl_1 = require("node-simctl");
|
|
52
|
-
// it's a hack needed to stub getDevices in tests
|
|
53
|
-
const utilsModule = __importStar(require("./utils"));
|
|
54
|
-
const DEFAULT_SIM_SHUTDOWN_TIMEOUT_MS = 30000;
|
|
55
|
-
exports.SAFARI_STARTUP_TIMEOUT_MS = 25 * 1000;
|
|
56
|
-
exports.MOBILE_SAFARI_BUNDLE_ID = 'com.apple.mobilesafari';
|
|
57
|
-
exports.SIMULATOR_APP_NAME = 'Simulator.app';
|
|
58
|
-
exports.MIN_SUPPORTED_XCODE_VERSION = 14;
|
|
59
|
-
/**
|
|
60
|
-
* @param timeout - Timeout in milliseconds (default: DEFAULT_SIM_SHUTDOWN_TIMEOUT_MS).
|
|
61
|
-
* @returns Promise that resolves when all simulators are killed.
|
|
62
|
-
*/
|
|
63
|
-
async function killAllSimulators(timeout = DEFAULT_SIM_SHUTDOWN_TIMEOUT_MS) {
|
|
64
|
-
logger_1.log.debug('Killing all iOS Simulators');
|
|
65
|
-
const xcodeVersion = await (0, appium_xcode_1.getVersion)(true);
|
|
66
|
-
if (typeof xcodeVersion === 'string') {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
const appName = node_path_1.default.parse(exports.SIMULATOR_APP_NAME).name;
|
|
70
|
-
const version = xcodeVersion;
|
|
71
|
-
// later versions are slower to close
|
|
72
|
-
timeout = timeout * (version.major >= 8 ? 2 : 1);
|
|
73
|
-
try {
|
|
74
|
-
await (0, teen_process_1.exec)('xcrun', ['simctl', 'shutdown', version.major > 8 ? 'all' : 'booted'], { timeout });
|
|
75
|
-
}
|
|
76
|
-
catch { }
|
|
77
|
-
const pids = [];
|
|
78
|
-
try {
|
|
79
|
-
const { stdout } = await (0, teen_process_1.exec)('pgrep', ['-f', `${appName}.app/Contents/MacOS/`]);
|
|
80
|
-
if (stdout.trim()) {
|
|
81
|
-
pids.push(...stdout.trim().split(/\s+/));
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
catch (e) {
|
|
85
|
-
if (e.code === 1) {
|
|
86
|
-
logger_1.log.debug(`${appName} is not running. Continuing...`);
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
if (pids.length === 0) {
|
|
90
|
-
logger_1.log.warn(`pgrep error ${e.code} while detecting whether ${appName} is running. Trying to kill anyway.`);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
if (pids.length > 0) {
|
|
94
|
-
logger_1.log.debug(`Killing processes: ${pids.join(', ')}`);
|
|
95
|
-
try {
|
|
96
|
-
await (0, teen_process_1.exec)('kill', ['-9', ...pids.map((pid) => `${pid}`)]);
|
|
97
|
-
}
|
|
98
|
-
catch { }
|
|
99
|
-
}
|
|
100
|
-
logger_1.log.debug(`Using pkill to kill application: ${appName}`);
|
|
101
|
-
try {
|
|
102
|
-
await pkill(appName, true);
|
|
103
|
-
}
|
|
104
|
-
catch { }
|
|
105
|
-
// wait for all the devices to be shutdown before Continuing
|
|
106
|
-
// but only print out the failed ones when they are actually fully failed
|
|
107
|
-
let remainingDevices = [];
|
|
108
|
-
async function allSimsAreDown() {
|
|
109
|
-
remainingDevices = [];
|
|
110
|
-
const devicesRecord = await utilsModule.getDevices();
|
|
111
|
-
const devices = Object.values(devicesRecord).flat();
|
|
112
|
-
return devices.every((sim) => {
|
|
113
|
-
const state = sim.state.toLowerCase();
|
|
114
|
-
const done = ['shutdown', 'unavailable', 'disconnected'].includes(state);
|
|
115
|
-
if (!done) {
|
|
116
|
-
remainingDevices.push(`${sim.name} (${sim.sdk}, udid: ${sim.udid}) is still in state '${state}'`);
|
|
117
|
-
}
|
|
118
|
-
return done;
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
try {
|
|
122
|
-
await (0, asyncbox_1.waitForCondition)(allSimsAreDown, {
|
|
123
|
-
waitMs: timeout,
|
|
124
|
-
intervalMs: 200,
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
catch (err) {
|
|
128
|
-
if (remainingDevices.length > 0) {
|
|
129
|
-
logger_1.log.warn(`The following devices are still not in the correct state after ${timeout} ms:`);
|
|
130
|
-
for (const device of remainingDevices) {
|
|
131
|
-
logger_1.log.warn(` ${device}`);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
throw err;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* @param udid - The simulator UDID.
|
|
139
|
-
* @param opts - Options including devicesSetPath.
|
|
140
|
-
* @returns Promise that resolves to simulator info or undefined if not found.
|
|
141
|
-
*/
|
|
142
|
-
async function getSimulatorInfo(udid, opts = {}) {
|
|
143
|
-
const { devicesSetPath } = opts;
|
|
144
|
-
// see the README for github.com/appium/node-simctl for example output of getDevices()
|
|
145
|
-
const devices = Object.values(await utilsModule.getDevices({ devicesSetPath })).flat();
|
|
146
|
-
return devices.find((sim) => sim.udid === udid);
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* @param udid - The simulator UDID.
|
|
150
|
-
* @returns Promise that resolves to true if simulator exists, false otherwise.
|
|
151
|
-
*/
|
|
152
|
-
async function simExists(udid) {
|
|
153
|
-
return !!(await getSimulatorInfo(udid));
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* @returns Promise that resolves to the developer root path.
|
|
157
|
-
*/
|
|
158
|
-
async function getDeveloperRoot() {
|
|
159
|
-
const { stdout } = await (0, teen_process_1.exec)('xcode-select', ['-p']);
|
|
160
|
-
return stdout.trim();
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Asserts that the Xcode version meets the minimum supported version requirement.
|
|
164
|
-
*
|
|
165
|
-
* @template V - The Xcode version type.
|
|
166
|
-
* @param xcodeVersion - The Xcode version to check.
|
|
167
|
-
* @returns The same Xcode version if it meets the requirement.
|
|
168
|
-
* @throws {Error} If the Xcode version is below the minimum supported version.
|
|
169
|
-
*/
|
|
170
|
-
function assertXcodeVersion(xcodeVersion) {
|
|
171
|
-
if (xcodeVersion.major < exports.MIN_SUPPORTED_XCODE_VERSION) {
|
|
172
|
-
throw new Error(`Tried to use an iOS simulator with xcode version ${xcodeVersion.versionString} but only Xcode version ` +
|
|
173
|
-
`${exports.MIN_SUPPORTED_XCODE_VERSION} and up are supported`);
|
|
174
|
-
}
|
|
175
|
-
return xcodeVersion;
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* @param simctlOpts - Optional simctl options
|
|
179
|
-
* @returns Promise that resolves to a record of devices grouped by SDK version
|
|
180
|
-
*/
|
|
181
|
-
async function getDevices(simctlOpts) {
|
|
182
|
-
return await new node_simctl_1.Simctl(simctlOpts).getDevices();
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* @param appName - The application name to kill.
|
|
186
|
-
* @param forceKill - Whether to force kill the process.
|
|
187
|
-
* @returns Promise that resolves to 0 on success.
|
|
188
|
-
*/
|
|
189
|
-
async function pkill(appName, forceKill = false) {
|
|
190
|
-
const args = forceKill ? ['-9'] : [];
|
|
191
|
-
args.push('-x', appName);
|
|
192
|
-
try {
|
|
193
|
-
await (0, teen_process_1.exec)('pkill', args);
|
|
194
|
-
return 0;
|
|
195
|
-
}
|
|
196
|
-
catch (err) {
|
|
197
|
-
// pgrep/pkill exit codes:
|
|
198
|
-
// 0 One or more processes were matched.
|
|
199
|
-
// 1 No processes were matched.
|
|
200
|
-
// 2 Invalid options were specified on the command line.
|
|
201
|
-
// 3 An internal error occurred.
|
|
202
|
-
if (err.code !== undefined) {
|
|
203
|
-
throw new Error(`Cannot forcefully terminate ${appName}. pkill error code: ${err.code}`, {
|
|
204
|
-
cause: err,
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
logger_1.log.error(`Received unexpected error while trying to kill ${appName}: ${err.message}`);
|
|
208
|
-
throw err;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
//# sourceMappingURL=utils.js.map
|
package/build/lib/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../lib/utils.ts"],"names":[],"mappings":"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"}
|