@browserstack/testcafe
Version:
Automated browser testing for the modern web development stack.
93 lines • 13.4 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const child_process_1 = require("child_process");
const io_1 = require("./io");
const test_structure_1 = require("./test-structure");
const test_run_tracker_1 = __importDefault(require("../../api/test-run-tracker"));
const proxy_1 = require("../utils/ipc/proxy");
const transport_1 = require("../utils/ipc/transport");
const async_event_emitter_1 = __importDefault(require("../../utils/async-event-emitter"));
const error_list_1 = __importDefault(require("../../errors/error-list"));
const SERVICE_PATH = require.resolve('./service');
class CompilerHost extends async_event_emitter_1.default {
constructor() {
super();
this.runtime = Promise.resolve(void 0);
}
_setupRoutes(proxy) {
proxy.register(this.executeAction, this);
proxy.register(this.ready, this);
}
async _init(runtime) {
const resolvedRuntime = await runtime;
if (resolvedRuntime)
return resolvedRuntime;
try {
const service = child_process_1.spawn(process.argv0, [SERVICE_PATH], { stdio: [0, 1, 2, 'pipe', 'pipe', 'pipe'] });
// HACK: Node.js definition are not correct when additional I/O channels are sp
const stdio = service.stdio;
const proxy = new proxy_1.IPCProxy(new transport_1.HostTransport(stdio[io_1.HOST_INPUT_FD], stdio[io_1.HOST_OUTPUT_FD], stdio[io_1.HOST_SYNC_FD]));
this._setupRoutes(proxy);
await this.once('ready');
return { proxy, service };
}
catch (e) {
return void 0;
}
}
async _getRuntime() {
const runtime = await this.runtime;
if (!runtime)
throw new Error();
return runtime;
}
async init() {
this.runtime = this._init(this.runtime);
await this.runtime;
}
async stop() {
const { service } = await this._getRuntime();
service.kill();
}
_wrapTestFunction(id, functionName) {
return async (testRun) => {
try {
return await this.runTest({ id, functionName, testRunId: testRun.id });
}
catch (err) {
const errList = new error_list_1.default();
errList.addError(err);
throw errList;
}
};
}
async ready() {
this.emit('ready');
}
async executeAction(data) {
if (!test_run_tracker_1.default.activeTestRuns[data.id])
return void 0;
return test_run_tracker_1.default
.activeTestRuns[data.id]
.executeAction(data.apiMethodName, data.command, data.callsite);
}
async getTests({ sourceList, compilerOptions }) {
const { proxy } = await this._getRuntime();
const units = await proxy.call(this.getTests, { sourceList, compilerOptions });
return test_structure_1.restore(units, (...args) => this._wrapTestFunction(...args));
}
async runTest({ id, functionName, testRunId }) {
const { proxy } = await this._getRuntime();
return await proxy.call(this.runTest, { id, functionName, testRunId });
}
async cleanUp() {
const { proxy } = await this._getRuntime();
await proxy.call(this.cleanUp);
}
}
exports.default = CompilerHost;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9zdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jb21waWxlci9ob3N0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsaURBQW9EO0FBQ3BELDZCQUFtRTtBQUNuRSxxREFBbUU7QUFDbkUsa0ZBQWdGO0FBQ2hGLDhDQUE4QztBQUM5QyxzREFBdUQ7QUFDdkQsMEZBQTJEO0FBQzNELHlFQUF3RDtBQU94RCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBV2xELE1BQXFCLFlBQWEsU0FBUSw2QkFBWTtJQUdsRDtRQUNJLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLFlBQVksQ0FBRSxLQUFlO1FBQ2pDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6QyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUdPLEtBQUssQ0FBQyxLQUFLLENBQUUsT0FBNEM7UUFDN0QsTUFBTSxlQUFlLEdBQUcsTUFBTSxPQUFPLENBQUM7UUFFdEMsSUFBSSxlQUFlO1lBQ2YsT0FBTyxlQUFlLENBQUM7UUFFM0IsSUFBSTtZQUNBLE1BQU0sT0FBTyxHQUFHLHFCQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFbkcsK0VBQStFO1lBQy9FLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFZLENB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LFNBQVMsRUFBb0I7UUFDbkUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTNDLE9BQU8sTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVNLEtBQUssQ0FBQyxPQUFPO1FBQ2hCLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUUzQyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7Q0FFSjtBQTlHRCwrQkE4R0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBIT1NUX0lOUFVUX0ZELCBIT1NUX09VVFBVVF9GRCwgSE9TVF9TWU5DX0ZEIH0gZnJvbSAnLi9pbyc7XG5pbXBvcnQgeyByZXN0b3JlIGFzIHJlc3RvcmVUZXN0U3RydWN0dXJlIH0gZnJvbSAnLi90ZXN0LXN0cnVjdHVyZSc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHRlc3RSdW5UcmFja2VyLCBUZXN0UnVuIH0gZnJvbSAnLi4vLi4vYXBpL3Rlc3QtcnVuLXRyYWNrZXInO1xuaW1wb3J0IHsgSVBDUHJveHkgfSBmcm9tICcuLi91dGlscy9pcGMvcHJveHknO1xuaW1wb3J0IHsgSG9zdFRyYW5zcG9ydCB9IGZyb20gJy4uL3V0aWxzL2lwYy90cmFuc3BvcnQnO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICcuLi8uLi91dGlscy9hc3luYy1ldmVudC1lbWl0dGVyJztcbmltcG9ydCBUZXN0Q2FmZUVycm9yTGlzdCBmcm9tICcuLi8uLi9lcnJvcnMvZXJyb3ItbGlzdCc7XG5cbmltcG9ydCB7IENvbXBpbGVyUHJvdG9jb2wsIFJ1blRlc3RBcmd1bWVudHMsIEV4ZWN1dGVDb21tYW5kQXJndW1lbnRzLCBGdW5jdGlvblByb3BlcnRpZXMgfSBmcm9tICcuL3Byb3RvY29sJztcbmltcG9ydCB7IENvbXBpbGVyQXJndW1lbnRzIH0gZnJvbSAnLi4vLi4vY29tcGlsZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBUZXN0IH0gZnJvbSAnLi4vLi4vYXBpL3N0cnVjdHVyZS9pbnRlcmZhY2VzJztcblxuXG5jb25zdCBTRVJWSUNFX1BBVEggPSByZXF1aXJlLnJlc29sdmUoJy4vc2VydmljZScpO1xuXG5pbnRlcmZhY2UgUnVudGltZVJlc291cmNlcyB7XG4gICAgc2VydmljZTogQ2hpbGRQcm9jZXNzO1xuICAgIHByb3h5OiBJUENQcm94eTtcbn1cblxuaW50ZXJmYWNlIFRlc3RGdW5jdGlvbiB7XG4gICAgKHRlc3RSdW46IFRlc3RSdW4pOiBQcm9taXNlPHVua25vd24+O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb21waWxlckhvc3QgZXh0ZW5kcyBFdmVudEVtaXR0ZXIgaW1wbGVtZW50cyBDb21waWxlclByb3RvY29sIHtcbiAgICBwcml2YXRlIHJ1bnRpbWU6IFByb21pc2U8UnVudGltZVJlc291cmNlc3x1bmRlZmluZWQ+O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLnJ1bnRpbWUgPSBQcm9taXNlLnJlc29sdmUodm9pZCAwKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXR1cFJvdXRlcyAocHJveHk6IElQQ1Byb3h5KTogdm9pZCB7XG4gICAgICAgIHByb3h5LnJlZ2lzdGVyKHRoaXMuZXhlY3V0ZUFjdGlvbiwgdGhpcyk7XG4gICAgICAgIHByb3h5LnJlZ2lzdGVyKHRoaXMucmVhZHksIHRoaXMpO1xuICAgIH1cblxuXG4gICAgcHJpdmF0ZSBhc3luYyBfaW5pdCAocnVudGltZTogUHJvbWlzZTxSdW50aW1lUmVzb3VyY2VzfHVuZGVmaW5lZD4pOiBQcm9taXNlPFJ1bnRpbWVSZXNvdXJjZXN8dW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkUnVudGltZSA9IGF3YWl0IHJ1bnRpbWU7XG5cbiAgICAgICAgaWYgKHJlc29sdmVkUnVudGltZSlcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFJ1bnRpbWU7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSBzcGF3bihwcm9jZXNzLmFyZ3YwLCBbU0VSVklDRV9QQVRIXSwgeyBzdGRpbzogWzAsIDEsIDIsICdwaXBlJywgJ3BpcGUnLCAncGlwZSddIH0pO1xuXG4gICAgICAgICAgICAvLyBIQUNLOiBOb2RlLmpzIGRlZmluaXRpb24gYXJlIG5vdCBjb3JyZWN0IHdoZW4gYWRkaXRpb25hbCBJL08gY2hhbm5lbHMgYXJlIHNwXG4gICAgICAgICAgICBjb25zdCBzdGRpbyA9IHNlcnZpY2Uuc3RkaW8gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgcHJveHkgPSBuZXcgSVBDUHJveHkobmV3IEhvc3RUcmFuc3BvcnQoc3RkaW9bSE9TVF9JTlBVVF9GRF0sIHN0ZGlvW0hPU1RfT1VUUFVUX0ZEXSwgc3RkaW9bSE9TVF9TWU5DX0ZEXSkpO1xuXG4gICAgICAgICAgICB0aGlzLl9zZXR1cFJvdXRlcyhwcm94eSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25jZSgncmVhZHknKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgcHJveHksIHNlcnZpY2UgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX2dldFJ1bnRpbWUgKCk6IFByb21pc2U8UnVudGltZVJlc291cmNlcz4ge1xuICAgICAgICBjb25zdCBydW50aW1lID0gYXdhaXQgdGhpcy5ydW50aW1lO1xuXG4gICAgICAgIGlmICghcnVudGltZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuXG4gICAgICAgIHJldHVybiBydW50aW1lO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0ICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5ydW50aW1lID0gdGhpcy5faW5pdCh0aGlzLnJ1bnRpbWUpO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucnVudGltZTtcbiAgICB9XG5cblxuICAgIHB1YmxpYyBhc3luYyBzdG9wICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgeyBzZXJ2aWNlIH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgc2VydmljZS5raWxsKCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIF93cmFwVGVzdEZ1bmN0aW9uIChpZDogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IEZ1bmN0aW9uUHJvcGVydGllcyk6IFRlc3RGdW5jdGlvbiB7XG4gICAgICAgIHJldHVybiBhc3luYyB0ZXN0UnVuID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuVGVzdCh7IGlkLCBmdW5jdGlvbk5hbWUsIHRlc3RSdW5JZDogdGVzdFJ1bi5pZCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJMaXN0ID0gbmV3IFRlc3RDYWZlRXJyb3JMaXN0KCk7XG5cbiAgICAgICAgICAgICAgICBlcnJMaXN0LmFkZEVycm9yKGVycik7XG5cbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJMaXN0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkeSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW1pdCgncmVhZHknKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZXhlY3V0ZUFjdGlvbiAoZGF0YTogRXhlY3V0ZUNvbW1hbmRBcmd1bWVudHMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgaWYgKCF0ZXN0UnVuVHJhY2tlci5hY3RpdmVUZXN0UnVuc1tkYXRhLmlkXSlcbiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7XG5cbiAgICAgICAgcmV0dXJuIHRlc3RSdW5UcmFja2VyXG4gICAgICAgICAgICAuYWN0aXZlVGVzdFJ1bnNbZGF0YS5pZF1cbiAgICAgICAgICAgIC5leGVjdXRlQWN0aW9uKGRhdGEuYXBpTWV0aG9kTmFtZSwgZGF0YS5jb21tYW5kLCBkYXRhLmNhbGxzaXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VGVzdHMgKHsgc291cmNlTGlzdCwgY29tcGlsZXJPcHRpb25zIH06IENvbXBpbGVyQXJndW1lbnRzKTogUHJvbWlzZTxUZXN0W10+IHtcbiAgICAgICAgY29uc3QgeyBwcm94eSB9ID0gYXdhaXQgdGhpcy5fZ2V0UnVudGltZSgpO1xuXG4gICAgICAgIGNvbnN0IHVuaXRzID0gYXdhaXQgcHJveHkuY2FsbCh0aGlzLmdldFRlc3RzLCB7IHNvdXJjZUxpc3QsIGNvbXBpbGVyT3B0aW9ucyB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdG9yZVRlc3RTdHJ1Y3R1cmUodW5pdHMsICguLi5hcmdzKSA9PiB0aGlzLl93cmFwVGVzdEZ1bmN0aW9uKC4uLmFyZ3MpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgcnVuVGVzdCAoeyBpZCwgZnVuY3Rpb25OYW1lLCB0ZXN0UnVuSWQgfTogUnVuVGVzdEFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICBjb25zdCB7IHByb3h5IH0gPSBhd2FpdCB0aGlzLl9nZXRSdW50aW1lKCk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHByb3h5LmNhbGwodGhpcy5ydW5UZXN0LCB7IGlkLCBmdW5jdGlvbk5hbWUsIHRlc3RSdW5JZCB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYW5VcCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHsgcHJveHkgfSA9IGF3YWl0IHRoaXMuX2dldFJ1bnRpbWUoKTtcblxuICAgICAgICBhd2FpdCBwcm94eS5jYWxsKHRoaXMuY2xlYW5VcCk7XG4gICAgfVxuXG59XG4iXX0=