UNPKG

appium-webdriveragent

Version:
120 lines 6.14 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.setXctestrunFile = setXctestrunFile; exports.getAdditionalRunContent = getAdditionalRunContent; exports.getXctestrunFilePath = getXctestrunFilePath; exports.getXctestrunFileName = getXctestrunFileName; const support_1 = require("@appium/support"); const node_path_1 = __importDefault(require("node:path")); const node_os_1 = require("node:os"); const logger_1 = require("../logger"); const platform_1 = require("./platform"); /** * Creates xctestrun file per device & platform version. * We expect to have WebDriverAgentRunner_iphoneos${sdkVersion|platformVersion}-arm64.xctestrun for real device * and WebDriverAgentRunner_iphonesimulator${sdkVersion|platformVersion}-${x86_64|arm64}.xctestrun for simulator located @bootstrapPath * Newer Xcode (Xcode 10.0 at least) generates xctestrun file following sdkVersion. * e.g. Xcode which has iOS SDK Version 12.2 on an intel Mac host machine generates WebDriverAgentRunner_iphonesimulator.2-x86_64.xctestrun * even if the cap has platform version 11.4 * * @param args * @return returns xctestrunFilePath for given device * @throws if WebDriverAgentRunner_iphoneos${sdkVersion|platformVersion}-arm64.xctestrun for real device * or WebDriverAgentRunner_iphonesimulator${sdkVersion|platformVersion}-x86_64.xctestrun for simulator is not found @bootstrapPath, * then it will throw a file not found exception */ async function setXctestrunFile(args) { const { deviceInfo, sdkVersion, bootstrapPath, wdaRemotePort, wdaBindingIP, maxHttpRequestBodySize, } = args; const xctestrunFilePath = await getXctestrunFilePath(deviceInfo, sdkVersion, bootstrapPath); const xctestRunContent = await support_1.plist.parsePlistFile(xctestrunFilePath); const updateWDAPort = getAdditionalRunContent(deviceInfo.platformName, wdaRemotePort, wdaBindingIP, maxHttpRequestBodySize); const newXctestRunContent = mergeObjects(xctestRunContent, updateWDAPort); await support_1.plist.updatePlistFile(xctestrunFilePath, newXctestRunContent, true); return xctestrunFilePath; } /** * Return the WDA object which appends existing xctest runner content * @param platformName - The name of the platform * @param wdaRemotePort - The remote port number * @param wdaBindingIP - The IP address to bind to. If not given, it binds to all interfaces. * @param maxHttpRequestBodySize - The maximum HTTP request body size in bytes. * @return returns a runner object which has USE_PORT and optionally USE_IP */ function getAdditionalRunContent(platformName, wdaRemotePort, wdaBindingIP, maxHttpRequestBodySize) { const runner = `WebDriverAgentRunner${(0, platform_1.isTvOS)(platformName) ? '_tvOS' : ''}`; return { [runner]: { EnvironmentVariables: { // USE_PORT must be 'string' USE_PORT: `${wdaRemotePort}`, ...(wdaBindingIP ? { USE_IP: wdaBindingIP } : {}), ...(maxHttpRequestBodySize ? { MAX_HTTP_REQUEST_BODY_SIZE: `${maxHttpRequestBodySize}` } : {}), }, }, }; } /** * Return the path of xctestrun if it exists * @param deviceInfo * @param sdkVersion - The Xcode SDK version of OS. * @param bootstrapPath - The folder path containing xctestrun file. */ async function getXctestrunFilePath(deviceInfo, sdkVersion, bootstrapPath) { // First try the SDK path, for Xcode 10 (at least) const sdkBased = [ node_path_1.default.resolve(bootstrapPath, `${deviceInfo.udid}_${sdkVersion}.xctestrun`), sdkVersion, ]; // Next try Platform path, for earlier Xcode versions const platformBased = [ node_path_1.default.resolve(bootstrapPath, `${deviceInfo.udid}_${deviceInfo.platformVersion}.xctestrun`), deviceInfo.platformVersion, ]; for (const [filePath, version] of [sdkBased, platformBased]) { if (await support_1.fs.exists(filePath)) { logger_1.log.info(`Using '${filePath}' as xctestrun file`); return filePath; } const originalXctestrunFile = node_path_1.default.resolve(bootstrapPath, getXctestrunFileName(deviceInfo, version)); if (await support_1.fs.exists(originalXctestrunFile)) { // If this is first time run for given device, then first generate xctestrun file for device. // We need to have a xctestrun file **per device** because we cannot have same wda port for all devices. await support_1.fs.copyFile(originalXctestrunFile, filePath); logger_1.log.info(`Using '${filePath}' as xctestrun file copied by '${originalXctestrunFile}'`); return filePath; } } throw new Error(`If you are using 'useXctestrunFile' capability then you ` + `need to have a xctestrun file (expected: ` + `'${node_path_1.default.resolve(bootstrapPath, getXctestrunFileName(deviceInfo, sdkVersion))}')`); } /** * Return the name of xctestrun file * @param deviceInfo * @param version - The Xcode SDK version of OS. * @return returns xctestrunFilePath for given device */ function getXctestrunFileName(deviceInfo, version) { const archSuffix = deviceInfo.isRealDevice ? `os${version}-arm64` : `simulator${version}-${(0, node_os_1.arch)() === 'arm64' ? 'arm64' : 'x86_64'}`; return `WebDriverAgentRunner_${(0, platform_1.isTvOS)(deviceInfo.platformName) ? 'tvOS_appletv' : 'iphone'}${archSuffix}.xctestrun`; } function mergeObjects(target, source) { const output = { ...target }; for (const [key, sourceValue] of Object.entries(source)) { const targetValue = output[key]; if (support_1.util.isPlainObject(targetValue) && support_1.util.isPlainObject(sourceValue)) { output[key] = mergeObjects(targetValue, sourceValue); continue; } output[key] = sourceValue; } return output; } //# sourceMappingURL=xctestrun.js.map