UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

75 lines 10.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = require("path"); const execa_1 = require("execa"); const lodash_1 = require("lodash"); const tree_kill_1 = __importDefault(require("tree-kill")); const os_family_1 = __importDefault(require("os-family")); const delay_1 = __importDefault(require("../utils/delay")); const runtime_1 = require("../errors/runtime"); const types_1 = require("../errors/types"); const resolve_path_relatively_cwd_1 = __importDefault(require("../utils/resolve-path-relatively-cwd")); const debug_1 = __importDefault(require("debug")); const MODULES_BIN_DIR = (0, resolve_path_relatively_cwd_1.default)('./node_modules/.bin'); const ENV_PATH_KEY = (function () { if (os_family_1.default.win) { let pathKey = 'Path'; Object.keys(process.env).forEach(key => { if (key.toLowerCase() === 'path') pathKey = key; }); return pathKey; } return 'PATH'; })(); class TestedApp { constructor() { this._process = null; this._killed = false; this._stdoutLogger = (0, debug_1.default)('testcafe:tested-app:stdout'); this._stderrLogger = (0, debug_1.default)('testcafe:tested-app:stderr'); this.errorPromise = null; } async _run(command) { const env = Object.assign({}, process.env); const path = env[ENV_PATH_KEY] || ''; const pathParts = path.split(path_1.delimiter); pathParts.unshift(MODULES_BIN_DIR); env[ENV_PATH_KEY] = pathParts.join(path_1.delimiter); this._process = (0, execa_1.command)(command, { shell: true, env }); if (this._process.stdout) this._process.stdout.on('data', data => this._stdoutLogger(String(data))); if (this._process.stderr) this._process.stderr.on('data', data => this._stderrLogger(String(data))); try { await this._process; } catch (err) { if (this._killed) return; const message = err.stack || String(err); throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.testedAppFailedWithError, message); } } async start(command, initDelay) { // NOTE: We should not resolve it if no error was thrown this.errorPromise = this ._run(command) .then(() => new Promise(lodash_1.noop)); await Promise.race([ (0, delay_1.default)(initDelay), this.errorPromise, ]); } async kill() { this._killed = true; const killPromise = new Promise(resolve => { var _a; return (0, tree_kill_1.default)((_a = this._process.pid) !== null && _a !== void 0 ? _a : 0, 'SIGTERM', resolve); }); await killPromise; } } exports.default = TestedApp; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGVkLWFwcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5uZXIvdGVzdGVkLWFwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLCtCQUFrRDtBQUNsRCxpQ0FBZ0Q7QUFDaEQsbUNBQThCO0FBQzlCLDBEQUE2QjtBQUM3QiwwREFBMkI7QUFDM0IsMkRBQW1DO0FBQ25DLCtDQUFpRDtBQUNqRCwyQ0FBaUQ7QUFDakQsdUdBQTRFO0FBQzVFLGtEQUFnQztBQUVoQyxNQUFNLGVBQWUsR0FBRyxJQUFBLHFDQUF3QixFQUFDLHFCQUFxQixDQUFDLENBQUM7QUFFeEUsTUFBTSxZQUFZLEdBQUcsQ0FBQztJQUNsQixJQUFJLG1CQUFFLENBQUMsR0FBRyxFQUFFO1FBQ1IsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXJCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNuQyxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNO2dCQUM1QixPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ3RCLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUM7S0FDbEI7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDO0FBR0wsTUFBcUIsU0FBUztJQVExQjtRQUNJLElBQUksQ0FBQyxRQUFRLEdBQVksSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxPQUFPLEdBQWEsS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQU8sSUFBQSxlQUFXLEVBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsYUFBYSxHQUFPLElBQUEsZUFBVyxFQUFDLDRCQUE0QixDQUFDLENBQUM7UUFFbkUsSUFBSSxDQUFDLFlBQVksR0FBUSxJQUFJLENBQUM7SUFDbEMsQ0FBQztJQUVPLEtBQUssQ0FBQyxJQUFJLENBQUUsT0FBZTtRQUMvQixNQUFNLEdBQUcsR0FBUyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsTUFBTSxJQUFJLEdBQVEsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFhLENBQUMsQ0FBQztRQUU1QyxTQUFTLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRW5DLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLGdCQUFhLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUEsZUFBWSxFQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUU1RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFOUUsSUFBSTtZQUNBLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELE9BQU8sR0FBUSxFQUFFO1lBQ2IsSUFBSSxJQUFJLENBQUMsT0FBTztnQkFDWixPQUFPO1lBRVgsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFekMsTUFBTSxJQUFJLHNCQUFZLENBQUMsc0JBQWMsQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUM1RTtJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsS0FBSyxDQUFFLE9BQWUsRUFBRSxTQUFpQjtRQUNsRCx3REFBd0Q7UUFDeEQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJO2FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDYixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsYUFBSSxDQUFDLENBQUMsQ0FBQztRQUVuQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDZixJQUFBLGVBQUssRUFBQyxTQUFTLENBQUM7WUFDaEIsSUFBSSxDQUFDLFlBQVk7U0FDcEIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFJO1FBQ2IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFFcEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBQyxPQUFBLElBQUEsbUJBQUksRUFBQyxNQUFDLElBQUksQ0FBQyxRQUF5QixDQUFDLEdBQUcsbUNBQUksQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQSxFQUFBLENBQUMsQ0FBQztRQUUvRyxNQUFNLFdBQVcsQ0FBQztJQUN0QixDQUFDO0NBQ0o7QUFsRUQsNEJBa0VDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBkZWxpbWl0ZXIgYXMgcGF0aERlbGltaXRlciB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgY29tbWFuZCBhcyBzcGF3bkNvbW1hbmQgfSBmcm9tICdleGVjYSc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBraWxsIGZyb20gJ3RyZWUta2lsbCc7XG5pbXBvcnQgT1MgZnJvbSAnb3MtZmFtaWx5JztcbmltcG9ydCBkZWxheSBmcm9tICcuLi91dGlscy9kZWxheSc7XG5pbXBvcnQgeyBHZW5lcmFsRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMvcnVudGltZSc7XG5pbXBvcnQgeyBSVU5USU1FX0VSUk9SUyB9IGZyb20gJy4uL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgcmVzb2x2ZVBhdGhSZWxhdGl2ZWx5Q3dkIGZyb20gJy4uL3V0aWxzL3Jlc29sdmUtcGF0aC1yZWxhdGl2ZWx5LWN3ZCc7XG5pbXBvcnQgZGVidWdMb2dnZXIgZnJvbSAnZGVidWcnO1xuXG5jb25zdCBNT0RVTEVTX0JJTl9ESVIgPSByZXNvbHZlUGF0aFJlbGF0aXZlbHlDd2QoJy4vbm9kZV9tb2R1bGVzLy5iaW4nKTtcblxuY29uc3QgRU5WX1BBVEhfS0VZID0gKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoT1Mud2luKSB7XG4gICAgICAgIGxldCBwYXRoS2V5ID0gJ1BhdGgnO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKHByb2Nlc3MuZW52KS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoa2V5LnRvTG93ZXJDYXNlKCkgPT09ICdwYXRoJylcbiAgICAgICAgICAgICAgICBwYXRoS2V5ID0ga2V5O1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcGF0aEtleTtcbiAgICB9XG5cbiAgICByZXR1cm4gJ1BBVEgnO1xufSkoKTtcblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXN0ZWRBcHAge1xuICAgIHByaXZhdGUgX2tpbGxlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9wcm9jZXNzOiBudWxsIHwgQ2hpbGRQcm9jZXNzO1xuICAgIHByaXZhdGUgX3N0ZG91dExvZ2dlcjogZGVidWcuRGVidWdnZXI7XG4gICAgcHJpdmF0ZSBfc3RkZXJyTG9nZ2VyOiBkZWJ1Zy5EZWJ1Z2dlcjtcblxuICAgIHB1YmxpYyBlcnJvclByb21pc2U6IG51bGwgfCBQcm9taXNlPHZvaWQ+O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5fcHJvY2VzcyAgICAgICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMuX2tpbGxlZCAgICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fc3Rkb3V0TG9nZ2VyICAgICA9IGRlYnVnTG9nZ2VyKCd0ZXN0Y2FmZTp0ZXN0ZWQtYXBwOnN0ZG91dCcpO1xuICAgICAgICB0aGlzLl9zdGRlcnJMb2dnZXIgICAgID0gZGVidWdMb2dnZXIoJ3Rlc3RjYWZlOnRlc3RlZC1hcHA6c3RkZXJyJyk7XG5cbiAgICAgICAgdGhpcy5lcnJvclByb21pc2UgICAgICA9IG51bGw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfcnVuIChjb21tYW5kOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgZW52ICAgICAgID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYpO1xuICAgICAgICBjb25zdCBwYXRoICAgICAgPSBlbnZbRU5WX1BBVEhfS0VZXSB8fCAnJztcbiAgICAgICAgY29uc3QgcGF0aFBhcnRzID0gcGF0aC5zcGxpdChwYXRoRGVsaW1pdGVyKTtcblxuICAgICAgICBwYXRoUGFydHMudW5zaGlmdChNT0RVTEVTX0JJTl9ESVIpO1xuXG4gICAgICAgIGVudltFTlZfUEFUSF9LRVldID0gcGF0aFBhcnRzLmpvaW4ocGF0aERlbGltaXRlcik7XG5cbiAgICAgICAgdGhpcy5fcHJvY2VzcyA9IHNwYXduQ29tbWFuZChjb21tYW5kLCB7IHNoZWxsOiB0cnVlLCBlbnYgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3Byb2Nlc3Muc3Rkb3V0KVxuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzcy5zdGRvdXQub24oJ2RhdGEnLCBkYXRhID0+IHRoaXMuX3N0ZG91dExvZ2dlcihTdHJpbmcoZGF0YSkpKTtcblxuICAgICAgICBpZiAodGhpcy5fcHJvY2Vzcy5zdGRlcnIpXG4gICAgICAgICAgICB0aGlzLl9wcm9jZXNzLnN0ZGVyci5vbignZGF0YScsIGRhdGEgPT4gdGhpcy5fc3RkZXJyTG9nZ2VyKFN0cmluZyhkYXRhKSkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9wcm9jZXNzO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2tpbGxlZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnIuc3RhY2sgfHwgU3RyaW5nKGVycik7XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBHZW5lcmFsRXJyb3IoUlVOVElNRV9FUlJPUlMudGVzdGVkQXBwRmFpbGVkV2l0aEVycm9yLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBzdGFydCAoY29tbWFuZDogc3RyaW5nLCBpbml0RGVsYXk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAvLyBOT1RFOiBXZSBzaG91bGQgbm90IHJlc29sdmUgaXQgaWYgbm8gZXJyb3Igd2FzIHRocm93blxuICAgICAgICB0aGlzLmVycm9yUHJvbWlzZSA9IHRoaXNcbiAgICAgICAgICAgIC5fcnVuKGNvbW1hbmQpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBuZXcgUHJvbWlzZShub29wKSk7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5yYWNlKFtcbiAgICAgICAgICAgIGRlbGF5KGluaXREZWxheSksXG4gICAgICAgICAgICB0aGlzLmVycm9yUHJvbWlzZSxcbiAgICAgICAgXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGtpbGwgKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLl9raWxsZWQgPSB0cnVlO1xuXG4gICAgICAgIGNvbnN0IGtpbGxQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBraWxsKCh0aGlzLl9wcm9jZXNzIGFzIENoaWxkUHJvY2VzcykucGlkID8/IDAsICdTSUdURVJNJywgcmVzb2x2ZSkpO1xuXG4gICAgICAgIGF3YWl0IGtpbGxQcm9taXNlO1xuICAgIH1cbn1cbiJdfQ==