gst-atom-xcuitest-driver
Version:
ATOM driver for iOS using XCUITest for backend
162 lines (122 loc) • 13.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.IOSSimulatorLog = void 0;
require("source-map-support/register");
var _lodash = _interopRequireDefault(require("lodash"));
var _iosLog = require("./ios-log");
var _appiumSupport = require("appium-support");
var _teen_process = require("teen_process");
const log = _appiumSupport.logger.getLogger('IOSSimulatorLog');
const START_TIMEOUT = 10000;
class IOSSimulatorLog extends _iosLog.IOSLog {
constructor({
sim,
showLogs,
xcodeVersion,
iosSimulatorLogsPredicate
}) {
super();
this.sim = sim;
this.showLogs = !!showLogs;
this.xcodeVersion = xcodeVersion;
this.predicate = iosSimulatorLogsPredicate;
this.proc = null;
}
async startCapture() {
if (_lodash.default.isUndefined(this.sim.udid)) {
throw new Error(`Log capture requires a sim udid`);
}
if (!(await this.sim.isRunning())) {
throw new Error(`iOS Simulator with udid '${this.sim.udid}' is not running`);
}
const spawnArgs = ['log', 'stream', '--style', 'compact'];
if (this.predicate) {
spawnArgs.push('--predicate', this.predicate);
}
log.debug(`Starting log capture for iOS Simulator with udid '${this.sim.udid}' ` + `using simctl`);
try {
await (0, _teen_process.exec)('pkill', ['-f', [this.sim.udid, ...spawnArgs].join(' ')]);
} catch (ign) {}
try {
this.proc = await this.sim.simctl.spawnSubProcess(spawnArgs);
await this.finishStartingLogCapture();
} catch (e) {
throw new Error(`Simulator log capture failed. Original error: ${e.message}`);
}
}
async finishStartingLogCapture() {
if (!this.proc) {
log.errorAndThrow('Could not capture simulator log');
}
let firstLine = true;
let logRow = '';
this.proc.on('output', (stdout, stderr) => {
if (stdout) {
if (firstLine) {
if (stdout.endsWith('\n')) {
firstLine = false;
}
} else {
logRow += stdout;
if (stdout.endsWith('\n')) {
this.onOutput(logRow);
logRow = '';
}
}
}
if (stderr) {
this.onOutput(logRow, 'STDERR');
}
});
let sd = (stdout, stderr) => {
if (/execvp\(\)/.test(stderr)) {
throw new Error('iOS log capture process failed to start');
}
return stdout || stderr;
};
await this.proc.start(sd, START_TIMEOUT);
}
async stopCapture() {
if (!this.proc) {
return;
}
await this.killLogSubProcess();
this.proc = null;
}
async killLogSubProcess() {
if (!this.proc.isRunning) {
return;
}
log.debug('Stopping iOS log capture');
try {
await this.proc.stop('SIGTERM', 1000);
} catch (e) {
if (!this.proc.isRunning) {
return;
}
_appiumSupport.logger.warn('Cannot stop log capture process. Sending SIGKILL...');
await this.proc.stop('SIGKILL');
}
}
get isCapturing() {
return this.proc && this.proc.isRunning;
}
onOutput(logRow, prefix = '') {
const logs = _lodash.default.cloneDeep(logRow.split('\n'));
for (const logLine of logs) {
if (!logLine) continue;
this.broadcast(logLine);
if (this.showLogs) {
const space = prefix.length > 0 ? ' ' : '';
log.info(`[IOS_SYSLOG_ROW${space}${prefix}] ${logLine}`);
}
}
}
}
exports.IOSSimulatorLog = IOSSimulatorLog;
var _default = IOSSimulatorLog;
exports.default = _default;require('source-map-support').install();
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9kZXZpY2UtbG9nL2lvcy1zaW11bGF0b3ItbG9nLmpzIl0sIm5hbWVzIjpbImxvZyIsImxvZ2dlciIsImdldExvZ2dlciIsIlNUQVJUX1RJTUVPVVQiLCJJT1NTaW11bGF0b3JMb2ciLCJJT1NMb2ciLCJjb25zdHJ1Y3RvciIsInNpbSIsInNob3dMb2dzIiwieGNvZGVWZXJzaW9uIiwiaW9zU2ltdWxhdG9yTG9nc1ByZWRpY2F0ZSIsInByZWRpY2F0ZSIsInByb2MiLCJzdGFydENhcHR1cmUiLCJfIiwiaXNVbmRlZmluZWQiLCJ1ZGlkIiwiRXJyb3IiLCJpc1J1bm5pbmciLCJzcGF3bkFyZ3MiLCJwdXNoIiwiZGVidWciLCJqb2luIiwiaWduIiwic2ltY3RsIiwic3Bhd25TdWJQcm9jZXNzIiwiZmluaXNoU3RhcnRpbmdMb2dDYXB0dXJlIiwiZSIsIm1lc3NhZ2UiLCJlcnJvckFuZFRocm93IiwiZmlyc3RMaW5lIiwibG9nUm93Iiwib24iLCJzdGRvdXQiLCJzdGRlcnIiLCJlbmRzV2l0aCIsIm9uT3V0cHV0Iiwic2QiLCJ0ZXN0Iiwic3RhcnQiLCJzdG9wQ2FwdHVyZSIsImtpbGxMb2dTdWJQcm9jZXNzIiwic3RvcCIsIndhcm4iLCJpc0NhcHR1cmluZyIsInByZWZpeCIsImxvZ3MiLCJjbG9uZURlZXAiLCJzcGxpdCIsImxvZ0xpbmUiLCJicm9hZGNhc3QiLCJzcGFjZSIsImxlbmd0aCIsImluZm8iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsR0FBRyxHQUFHQyxzQkFBT0MsU0FBUCxDQUFpQixpQkFBakIsQ0FBWjs7QUFFQSxNQUFNQyxhQUFhLEdBQUcsS0FBdEI7O0FBRUEsTUFBTUMsZUFBTixTQUE4QkMsY0FBOUIsQ0FBcUM7QUFDbkNDLEVBQUFBLFdBQVcsQ0FBRTtBQUFDQyxJQUFBQSxHQUFEO0FBQU1DLElBQUFBLFFBQU47QUFBZ0JDLElBQUFBLFlBQWhCO0FBQThCQyxJQUFB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QUksQ0FBQ0csT0FBTCxFQUFjO0FBQ2QsV0FBS0MsU0FBTCxDQUFlRCxPQUFmOztBQUNBLFVBQUksS0FBS3pDLFFBQVQsRUFBbUI7QUFDakIsY0FBTTJDLEtBQUssR0FBR04sTUFBTSxDQUFDTyxNQUFQLEdBQWdCLENBQWhCLEdBQW9CLEdBQXBCLEdBQTBCLEVBQXhDO0FBQ0FwRCxRQUFBQSxHQUFHLENBQUNxRCxJQUFKLENBQVUsa0JBQWlCRixLQUFNLEdBQUVOLE1BQU8sS0FBSUksT0FBUSxFQUF0RDtBQUNEO0FBQ0Y7QUFDRjs7QUFqSGtDOzs7ZUFxSHRCN0MsZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBJT1NMb2cgfSBmcm9tICcuL2lvcy1sb2cnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnYXBwaXVtLXN1cHBvcnQnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5cbmNvbnN0IGxvZyA9IGxvZ2dlci5nZXRMb2dnZXIoJ0lPU1NpbXVsYXRvckxvZycpO1xuXG5jb25zdCBTVEFSVF9USU1FT1VUID0gMTAwMDA7XG5cbmNsYXNzIElPU1NpbXVsYXRvckxvZyBleHRlbmRzIElPU0xvZyB7XG4gIGNvbnN0cnVjdG9yICh7c2ltLCBzaG93TG9ncywgeGNvZGVWZXJzaW9uLCBpb3NTaW11bGF0b3JMb2dzUHJlZGljYXRlfSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5zaW0gPSBzaW07XG4gICAgdGhpcy5zaG93TG9ncyA9ICEhc2hvd0xvZ3M7XG4gICAgdGhpcy54Y29kZVZlcnNpb24gPSB4Y29kZVZlcnNpb247XG4gICAgdGhpcy5wcmVkaWNhdGUgPSBpb3NTaW11bGF0b3JMb2dzUHJlZGljYXRlO1xuICAgIHRoaXMucHJvYyA9IG51bGw7XG4gIH1cblxuICBhc3luYyBzdGFydENhcHR1cmUgKCkge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuc2ltLnVkaWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExvZyBjYXB0dXJlIHJlcXVpcmVzIGEgc2ltIHVkaWRgKTtcbiAgICB9XG5cbiAgICBpZiAoIWF3YWl0IHRoaXMuc2ltLmlzUnVubmluZygpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGlPUyBTaW11bGF0b3Igd2l0aCB1ZGlkICcke3RoaXMuc2ltLnVkaWR9JyBpcyBub3QgcnVubmluZ2ApO1xuICAgIH1cbiAgICBjb25zdCBzcGF3bkFyZ3MgPSBbXG4gICAgICAnbG9nJyxcbiAgICAgICdzdHJlYW0nLFxuICAgICAgJy0tc3R5bGUnLCAnY29tcGFjdCcsXG4gICAgXTtcbiAgICBpZiAodGhpcy5wcmVkaWNhdGUpIHtcbiAgICAgIHNwYXduQXJncy5wdXNoKCctLXByZWRpY2F0ZScsIHRoaXMucHJlZGljYXRlKTtcbiAgICB9XG4gICAgbG9nLmRlYnVnKGBTdGFydGluZyBsb2cgY2FwdHVyZSBmb3IgaU9TIFNpbXVsYXRvciB3aXRoIHVkaWQgJyR7dGhpcy5zaW0udWRpZH0nIGAgK1xuICAgICAgYHVzaW5nIHNpbWN0bGApO1xuICAgIHRyeSB7XG4gICAgICAvLyBjbGVhbnVwIGV4aXN0aW5nIGxpc3RlbmVycyBpZiB0aGUgcHJldmlvdXMgc2Vzc2lvbiBoYXMgbm90IGJlZW4gdGVybWluYXRlZCBwcm9wZXJseVxuICAgICAgYXdhaXQgZXhlYygncGtpbGwnLCBbJy1mJywgW3RoaXMuc2ltLnVkaWQsIC4uLnNwYXduQXJnc10uam9pbignICcpXSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIHRyeSB7XG4gICAgICB0aGlzLnByb2MgPSBhd2FpdCB0aGlzLnNpbS5zaW1jdGwuc3Bhd25TdWJQcm9jZXNzKHNwYXduQXJncyk7XG4gICAgICBhd2FpdCB0aGlzLmZpbmlzaFN0YXJ0aW5nTG9nQ2FwdHVyZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2ltdWxhdG9yIGxvZyBjYXB0dXJlIGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFN0YXJ0aW5nTG9nQ2FwdHVyZSAoKSB7XG4gICAgaWYgKCF0aGlzLnByb2MpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KCdDb3VsZCBub3QgY2FwdHVyZSBzaW11bGF0b3IgbG9nJyk7XG4gICAgfVxuICAgIGxldCBmaXJzdExpbmUgPSB0cnVlO1xuICAgIGxldCBsb2dSb3cgPSAnJztcbiAgICB0aGlzLnByb2Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKHN0ZG91dCkge1xuICAgICAgICBpZiAoZmlyc3RMaW5lKSB7XG4gICAgICAgICAgaWYgKHN0ZG91dC5lbmRzV2l0aCgnXFxuJykpIHtcbiAgICAgICAgICAgIC8vIGRvbid0IHN0b3JlIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBsb2cgYmVjYXVzZSBpdCBjYW1lIGJlZm9yZSB0aGUgc2ltIHdhcyBsYXVuY2hlZFxuICAgICAgICAgICAgZmlyc3RMaW5lID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ1JvdyArPSBzdGRvdXQ7XG4gICAgICAgICAgaWYgKHN0ZG91dC5lbmRzV2l0aCgnXFxuJykpIHtcbiAgICAgICAgICAgIHRoaXMub25PdXRwdXQobG9nUm93KTtcbiAgICAgICAgICAgIGxvZ1JvdyA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICB0aGlzLm9uT3V0cHV0KGxvZ1JvdywgJ1NUREVSUicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgbGV0IHNkID0gKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBpZiAoL2V4ZWN2cFxcKFxcKS8udGVzdChzdGRlcnIpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaU9TIGxvZyBjYXB0dXJlIHByb2Nlc3MgZmFpbGVkIHRvIHN0YXJ0Jyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Rkb3V0IHx8IHN0ZGVycjtcbiAgICB9O1xuICAgIGF3YWl0IHRoaXMucHJvYy5zdGFydChzZCwgU1RBUlRfVElNRU9VVCk7XG4gIH1cblxuICBhc3luYyBzdG9wQ2FwdHVyZSAoKSB7XG4gICAgaWYgKCF0aGlzLnByb2MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5raWxsTG9nU3ViUHJvY2VzcygpO1xuICAgIHRoaXMucHJvYyA9IG51bGw7XG4gIH1cblxuICBhc3luYyBraWxsTG9nU3ViUHJvY2VzcyAoKSB7XG4gICAgaWYgKCF0aGlzLnByb2MuaXNSdW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxvZy5kZWJ1ZygnU3RvcHBpbmcgaU9TIGxvZyBjYXB0dXJlJyk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMucHJvYy5zdG9wKCdTSUdURVJNJywgMTAwMCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCF0aGlzLnByb2MuaXNSdW5uaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxvZ2dlci53YXJuKCdDYW5ub3Qgc3RvcCBsb2cgY2FwdHVyZSBwcm9jZXNzLiBTZW5kaW5nIFNJR0tJTEwuLi4nKTtcbiAgICAgIGF3YWl0IHRoaXMucHJvYy5zdG9wKCdTSUdLSUxMJyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzQ2FwdHVyaW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9jICYmIHRoaXMucHJvYy5pc1J1bm5pbmc7XG4gIH1cblxuICBvbk91dHB1dCAobG9nUm93LCBwcmVmaXggPSAnJykge1xuICAgIGNvbnN0IGxvZ3MgPSBfLmNsb25lRGVlcChsb2dSb3cuc3BsaXQoJ1xcbicpKTtcbiAgICBmb3IgKGNvbnN0IGxvZ0xpbmUgb2YgbG9ncykge1xuICAgICAgaWYgKCFsb2dMaW5lKSBjb250aW51ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBjdXJseVxuICAgICAgdGhpcy5icm9hZGNhc3QobG9nTGluZSk7XG4gICAgICBpZiAodGhpcy5zaG93TG9ncykge1xuICAgICAgICBjb25zdCBzcGFjZSA9IHByZWZpeC5sZW5ndGggPiAwID8gJyAnIDogJyc7XG4gICAgICAgIGxvZy5pbmZvKGBbSU9TX1NZU0xPR19ST1cke3NwYWNlfSR7cHJlZml4fV0gJHtsb2dMaW5lfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgeyBJT1NTaW11bGF0b3JMb2cgfTtcbmV4cG9ydCBkZWZhdWx0IElPU1NpbXVsYXRvckxvZztcbiJdLCJmaWxlIjoibGliL2RldmljZS1sb2cvaW9zLXNpbXVsYXRvci1sb2cuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==