appium-webdriveragent
Version:
Package bundling WebDriverAgent
120 lines • 6.14 kB
JavaScript
;
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