UNPKG

gst-atom-xcuitest-driver

Version:

ATOM driver for iOS using XCUITest for backend

162 lines (122 loc) 13.8 kB
"use strict"; 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==