Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
async getCrashes () {
let crashLogsRoot = this.logDir;
if (this.udid) {
this.phoneName = this.phoneName || await utilities.getDeviceName(this.udid);
crashLogsRoot = path.resolve(crashLogsRoot, this.phoneName);
}
if (!await fs.exists(crashLogsRoot)) {
log.debug(`Crash reports root '${crashLogsRoot}' does not exist. Got nothing to gather.`);
return [];
}
const foundFiles = await fs.glob(`${crashLogsRoot}/**/*.crash`);
if (this.udid) {
return foundFiles;
}
// For Simulator only include files, that contain current UDID
return await B.filter(foundFiles, async (x) => {
try {
const content = await fs.readFile(x, 'utf8');
return content.toUpperCase().includes(this.sim.udid.toUpperCase());
} catch (err) {
return false;
}
});
}
async function generateCommands () {
await registerSpecUrlHelper();
const commands = path.resolve(rootFolder, 'commands-yml', 'commands/**/*.yml');
log('Traversing YML files', commands);
await fs.rimraf(path.resolve(rootFolder, 'docs', 'en', 'commands'));
// get the template from which the md files will be created
const template = Handlebars.compile(await fs.readFile(path.resolve(rootFolder, 'commands-yml', 'template.md'), 'utf8'), {noEscape: true, strict: true});
let fileCount = 0;
for (const filename of await fs.glob(commands)) {
const relativeFilename = path.relative(path.resolve(rootFolder, 'commands-yml'), filename);
log(`Rendering file: ${filename} ${relativeFilename}`);
// Translate the YML specs to JSON
const inputYML = await fs.readFile(filename, 'utf8');
const inputJSON = yaml.load(inputYML);
inputJSON.ymlFileName = `/${path.relative(rootFolder, filename)}`;
const validationErrors = validate(inputJSON, validator);
if (validationErrors) {
throw new Error(`Data validation error for ${filename}: ${JSON.stringify(validationErrors)}`);
}
// Pass the inputJS into our Handlebars template
const markdown = template(inputJSON);
// Write the markdown to its right place
async getChromedrivers (mapping) {
// go through the versions available
const executables = await fs.glob(`${this.executableDir}/*`);
log.debug(`Found ${executables.length} executable${executables.length === 1 ? '' : 's'} ` +
`in '${this.executableDir}'`);
const cds = (await asyncmap(executables, async function mapChromedriver (executable) {
const logError = ({message, stdout = null, stderr = null}) => {
let errMsg = `Cannot retrieve version number from '${path.basename(executable)}' Chromedriver binary. ` +
`Make sure it returns a valid version string in response to '--version' command line argument. ${message}`;
if (stdout) {
errMsg += `\nStdout: ${stdout}`;
}
if (stderr) {
errMsg += `\nStderr: ${stderr}`;
}
log.warn(errMsg);
return null;
};
pathBundlePair = async (dir) => {
dir = path.resolve(applicationList, dir);
let appFiles = await fs.glob(`${dir}/*.app`);
let bundleId = appFiles[0].match(/.*\/(.*)\.app/)[1];
return {path: dir, bundleId};
};
} else {
async getCrashes () {
try {
return await fs.glob(`${this.logDir}/*.crash`);
} catch (err) {
logger.errorAndThrow(`There was a problem getting the crash list: ${err}`);
}
}
logger.errorAndThrow(`iOS log capture with Xcode ${this.xcodeVersion.versionString} requires a sim udid`);
}
let logPath = this.sim.getLogDir();
try {
if (logPath.indexOf('*') >= 0) {
logger.error(`Log path has * in it. Unable to start log capture: ${logPath}`);
return;
}
let systemLogPath = path.resolve(logPath, 'system.log');
logger.debug(`System log path: ${systemLogPath}`);
await mkdirp(logPath);
await fs.writeFile(systemLogPath, 'A new Appium session is about to start!\n', {flag: 'a'});
let files;
try {
files = await fs.glob(systemLogPath);
if (files.length < 1) {
throw new Error('Could not start log capture');
}
} catch (e) {
logger.error(`Could not start log capture because no iOS ` +
`simulator logs could be found at ${systemLogPath}. ` +
`Logging will not be functional for this run`);
}
let lastModifiedLogPath = files[0];
let lastModifiedLogTime = (await fs.stat(lastModifiedLogPath)).mtime;
for (let file of files) {
let {mtime} = await fs.stat(file);
if (mtime > lastModifiedLogTime) {
lastModifiedLogPath = file;
lastModifiedLogTime = mtime;
const getBuildToolsDirs = _.memoize(async function getBuildToolsDirs (sdkRoot) {
let buildToolsDirs = await fs.glob(path.resolve(sdkRoot, 'build-tools', '*'), {absolute: true});
try {
buildToolsDirs = buildToolsDirs
.map((dir) => [path.basename(dir), dir])
.sort((a, b) => semver.rcompare(a[0], b[0]))
.map((pair) => pair[1]);
} catch (err) {
log.warn(`Cannot sort build-tools folders ${JSON.stringify(buildToolsDirs.map((dir) => path.basename(dir)))} ` +
`by semantic version names.`);
log.warn(`Falling back to sorting by modification date. Original error: ${err.message}`);
const pairs = await B.map(buildToolsDirs, async (dir) => [(await fs.stat(dir)).mtime.valueOf(), dir]);
buildToolsDirs = pairs
.sort((a, b) => a[0] < b[0])
.map((pair) => pair[1]);
}
log.info(`Found ${buildToolsDirs.length} 'build-tools' folders under '${sdkRoot}' (newest first):`);
for (let dir of buildToolsDirs) {
async function getAndroidPlatformAndPath () {
const sdkRoot = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
if (_.isEmpty(sdkRoot)) {
throw new Error('Neither ANDROID_HOME nor ANDROID_SDK_ROOT environment variable was exported');
}
let propsPaths = await fs.glob(path.resolve(sdkRoot, 'platforms', '*', 'build.prop'), {
absolute: true
});
const platformsMapping = {};
for (const propsPath of propsPaths) {
const propsContent = await fs.readFile(propsPath, 'utf-8');
const platformPath = path.dirname(propsPath);
const platform = path.basename(platformPath);
const match = /ro\.build\.version\.sdk=(\d+)/.exec(propsContent);
if (!match) {
log.warn(`Cannot read the SDK version from '${propsPath}'. Skipping '${platform}'`);
continue;
}
platformsMapping[parseInt(match[1], 10)] = {
platform,
platformPath,
};