UNPKG

@browserstack/testcafe

Version:

Automated browser testing for the modern web development stack.

89 lines 13.6 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = __importDefault(require("fs")); const compiler_1 = __importDefault(require("../../compiler")); const test_run_proxy_1 = __importDefault(require("./test-run-proxy")); const test_structure_1 = require("./test-structure"); const io_1 = require("./io"); const proxy_1 = require("../utils/ipc/proxy"); const transport_1 = require("../utils/ipc/transport"); const source_map_support_1 = __importDefault(require("source-map-support")); const protocol_1 = require("./protocol"); source_map_support_1.default.install({ hookRequire: true, handleUncaughtExceptions: false, environment: 'node' }); class CompilerService { constructor() { const input = fs_1.default.createReadStream('', { fd: io_1.SERVICE_INPUT_FD }); const output = fs_1.default.createWriteStream('', { fd: io_1.SERVICE_OUTPUT_FD }); this.proxy = new proxy_1.IPCProxy(new transport_1.ServiceTransport(input, output, io_1.SERVICE_SYNC_FD)); this.state = { testRuns: {}, fixtureCtxs: {}, units: {} }; this._setupRoutes(); this.ready(); } _getFixtureCtx({ id }) { const unit = this.state.units[id]; const fixtureId = test_structure_1.isTest(unit) ? unit.fixture.id : unit.id; if (!this.state.fixtureCtxs[fixtureId]) this.state.fixtureCtxs[fixtureId] = Object.create(null); return this.state.fixtureCtxs[fixtureId]; } _getContext(args) { const { testRunId } = args; const fixtureCtx = this._getFixtureCtx(args); if (!testRunId) return fixtureCtx; if (!this.state.testRuns[testRunId]) this.state.testRuns[testRunId] = new test_run_proxy_1.default(this, testRunId, fixtureCtx); return this.state.testRuns[testRunId]; } _setupRoutes() { this.proxy.register(this.getTests, this); this.proxy.register(this.runTest, this); this.proxy.register(this.cleanUp, this); } _getFunction(unit, functionName) { if (test_structure_1.isTest(unit) && protocol_1.isTestFunctionProperty(functionName)) return unit[functionName]; if (test_structure_1.isFixture(unit) && protocol_1.isFixtureFunctionProperty(functionName)) return unit[functionName]; throw new Error(); } async ready() { this.proxy.call(this.ready); } async cleanUp() { await compiler_1.default.cleanUp(); } async getTests({ sourceList, compilerOptions }) { const compiler = new compiler_1.default(sourceList, compilerOptions); const tests = await compiler.getTests(); const units = test_structure_1.flatten(tests); Object.assign(this.state.units, units); return test_structure_1.serialize(units); } async runTest(args) { const { id, functionName } = args; const unit = this.state.units[id]; const context = this._getContext(args); const functionObject = this._getFunction(unit, functionName); if (!functionObject) throw new Error(); return await functionObject(context); } async executeAction({ id, apiMethodName, command, callsite }) { return this.proxy.call(this.executeAction, { id, apiMethodName, command, callsite }); } } exports.default = new CompilerService(); module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9jb21waWxlci9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLDhEQUFzQztBQUN0QyxzRUFBNEM7QUFFNUMscURBSzBCO0FBRTFCLDZCQUE0RTtBQUM1RSw4Q0FBOEM7QUFDOUMsc0RBQTBEO0FBQzFELDRFQUFrRDtBQUVsRCx5Q0FLb0I7QUFHcEIsNEJBQWdCLENBQUMsT0FBTyxDQUFDO0lBQ3JCLFdBQVcsRUFBZSxJQUFJO0lBQzlCLHdCQUF3QixFQUFFLEtBQUs7SUFDL0IsV0FBVyxFQUFlLE1BQU07Q0FDbkMsQ0FBQyxDQUFDO0FBUUgsTUFBTSxlQUFlO0lBSWpCO1FBQ0ksTUFBTSxLQUFLLEdBQUksWUFBRSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxxQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDakUsTUFBTSxNQUFNLEdBQUcsWUFBRSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxzQkFBaUIsRUFBRSxDQUFDLENBQUM7UUFFbkUsSUFBSSxDQUFDLEtBQUssR0FBTSxJQUFJLGdCQUFRLENBQUMsSUFBSSw0QkFBZ0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLG9CQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ25GLElBQUksQ0FBQyxLQUFLLEdBQU07WUFDWixRQUFRLEVBQUssRUFBRTtZQUNmLFdBQVcsRUFBRSxFQUFFO1lBQ2YsS0FBSyxFQUFRLEVBQUU7U0FDbEIsQ0FBQztRQUVGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVPLGNBQWMsQ0FBRSxFQUFFLEVBQUUsRUFBb0I7UUFDNUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxL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QUFDO1FBRWxDLE1BQU0sSUFBSSxHQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFN0QsSUFBSSxDQUFDLGNBQWM7WUFDZixNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7UUFFdEIsT0FBTyxNQUFNLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWEsQ0FBRSxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBMkI7UUFDekYsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN6RixDQUFDO0NBQ0o7QUFFRCxrQkFBZSxJQUFJLGVBQWUsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ2ZzJztcbmltcG9ydCBDb21waWxlciBmcm9tICcuLi8uLi9jb21waWxlcic7XG5pbXBvcnQgVGVzdFJ1blByb3h5IGZyb20gJy4vdGVzdC1ydW4tcHJveHknO1xuXG5pbXBvcnQge1xuICAgIGZsYXR0ZW4gYXMgZmxhdHRlblRlc3RTdHJ1Y3R1cmUsIGlzRml4dHVyZSxcbiAgICBpc1Rlc3QsXG4gICAgc2VyaWFsaXplIGFzIHNlcmlhbGl6ZVRlc3RTdHJ1Y3R1cmUsIFVuaXQsXG4gICAgVW5pdHNcbn0gZnJvbSAnLi90ZXN0LXN0cnVjdHVyZSc7XG5cbmltcG9ydCB7IFNFUlZJQ0VfSU5QVVRfRkQsIFNFUlZJQ0VfT1VUUFVUX0ZELCBTRVJWSUNFX1NZTkNfRkQgfSBmcm9tICcuL2lvJztcbmltcG9ydCB7IElQQ1Byb3h5IH0gZnJvbSAnLi4vdXRpbHMvaXBjL3Byb3h5JztcbmltcG9ydCB7IFNlcnZpY2VUcmFuc3BvcnQgfSBmcm9tICcuLi91dGlscy9pcGMvdHJhbnNwb3J0JztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5cbmltcG9ydCB7XG4gICAgQ29tcGlsZXJQcm90b2NvbCxcbiAgICBFeGVjdXRlQ29tbWFuZEFyZ3VtZW50cywgRnVuY3Rpb25Qcm9wZXJ0aWVzLCBpc0ZpeHR1cmVGdW5jdGlvblByb3BlcnR5LFxuICAgIGlzVGVzdEZ1bmN0aW9uUHJvcGVydHksXG4gICAgUnVuVGVzdEFyZ3VtZW50c1xufSBmcm9tICcuL3Byb3RvY29sJztcbmltcG9ydCB7IENvbXBpbGVyQXJndW1lbnRzIH0gZnJvbSAnLi4vLi4vY29tcGlsZXIvaW50ZXJmYWNlcyc7XG5cbnNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7XG4gICAgaG9va1JlcXVpcmU6ICAgICAgICAgICAgICB0cnVlLFxuICAgIGhhbmRsZVVuY2F1Z2h0RXhjZXB0aW9uczogZmFsc2UsXG4gICAgZW52aXJvbm1lbnQ6ICAgICAgICAgICAgICAnbm9kZSdcbn0pO1xuXG5pbnRlcmZhY2UgU2VydmljZVN0YXRlIHtcbiAgICB0ZXN0UnVuczogeyBbaWQ6IHN0cmluZ106IFRlc3RSdW5Qcm94eSB9O1xuICAgIGZpeHR1cmVDdHhzOiB7IFtpZDogc3RyaW5nXTogb2JqZWN0IH07XG4gICAgdW5pdHM6IFVuaXRzO1xufVxuXG5jbGFzcyBDb21waWxlclNlcnZpY2UgaW1wbGVtZW50cyBDb21waWxlclByb3RvY29sIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3h5OiBJUENQcm94eTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlOiBTZXJ2aWNlU3RhdGU7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBjb25zdCBpbnB1dCAgPSBmcy5jcmVhdGVSZWFkU3RyZWFtKCcnLCB7IGZkOiBTRVJWSUNFX0lOUFVUX0ZEIH0pO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSBmcy5jcmVhdGVXcml0ZVN0cmVhbSgnJywgeyBmZDogU0VSVklDRV9PVVRQVVRfRkQgfSk7XG5cbiAgICAgICAgdGhpcy5wcm94eSAgICA9IG5ldyBJUENQcm94eShuZXcgU2VydmljZVRyYW5zcG9ydChpbnB1dCwgb3V0cHV0LCBTRVJWSUNFX1NZTkNfRkQpKTtcbiAgICAgICAgdGhpcy5zdGF0ZSAgICA9IHtcbiAgICAgICAgICAgIHRlc3RSdW5zOiAgICB7fSxcbiAgICAgICAgICAgIGZpeHR1cmVDdHhzOiB7fSxcbiAgICAgICAgICAgIHVuaXRzOiAgICAgICB7fVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX3NldHVwUm91dGVzKCk7XG4gICAgICAgIHRoaXMucmVhZHkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRGaXh0dXJlQ3R4ICh7IGlkIH06IFJ1blRlc3RBcmd1bWVudHMpOiB1bmtub3duIHtcbiAgICAgICAgY29uc3QgdW5pdCA9IHRoaXMuc3RhdGUudW5pdHNbaWRdO1xuXG4gICAgICAgIGNvbnN0IGZpeHR1cmVJZCA9IGlzVGVzdCh1bml0KSA/IHVuaXQuZml4dHVyZS5pZCA6IHVuaXQuaWQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmZpeHR1cmVDdHhzW2ZpeHR1cmVJZF0pXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmZpeHR1cmVDdHhzW2ZpeHR1cmVJZF0gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmZpeHR1cmVDdHhzW2ZpeHR1cmVJZF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0Q29udGV4dCAoYXJnczogUnVuVGVzdEFyZ3VtZW50cyk6IHVua25vd24ge1xuICAgICAgICBjb25zdCB7IHRlc3RSdW5JZCB9ID0gYXJncztcbiAgICAgICAgY29uc3QgZml4dHVyZUN0eCAgICAgICAgPSB0aGlzLl9nZXRGaXh0dXJlQ3R4KGFyZ3MpO1xuXG4gICAgICAgIGlmICghdGVzdFJ1bklkKVxuICAgICAgICAgICAgcmV0dXJuIGZpeHR1cmVDdHg7XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnRlc3RSdW5zW3Rlc3RSdW5JZF0pXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnRlc3RSdW5zW3Rlc3RSdW5JZF0gPSBuZXcgVGVzdFJ1blByb3h5KHRoaXMsIHRlc3RSdW5JZCwgZml4dHVyZUN0eCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudGVzdFJ1bnNbdGVzdFJ1bklkXTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXR1cFJvdXRlcyAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJveHkucmVnaXN0ZXIodGhpcy5nZXRUZXN0cywgdGhpcyk7XG4gICAgICAgIHRoaXMucHJveHkucmVnaXN0ZXIodGhpcy5ydW5UZXN0LCB0aGlzKTtcbiAgICAgICAgdGhpcy5wcm94eS5yZWdpc3Rlcih0aGlzLmNsZWFuVXAsIHRoaXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldEZ1bmN0aW9uICh1bml0OiBVbml0LCBmdW5jdGlvbk5hbWU6IEZ1bmN0aW9uUHJvcGVydGllcyk6IEZ1bmN0aW9ufG51bGwge1xuICAgICAgICBpZiAoaXNUZXN0KHVuaXQpICYmIGlzVGVzdEZ1bmN0aW9uUHJvcGVydHkoZnVuY3Rpb25OYW1lKSlcbiAgICAgICAgICAgIHJldHVybiB1bml0W2Z1bmN0aW9uTmFtZV07XG5cbiAgICAgICAgaWYgKGlzRml4dHVyZSh1bml0KSAmJiBpc0ZpeHR1cmVGdW5jdGlvblByb3BlcnR5KGZ1bmN0aW9uTmFtZSkpXG4gICAgICAgICAgICByZXR1cm4gdW5pdFtmdW5jdGlvbk5hbWVdO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyByZWFkeSAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucHJveHkuY2FsbCh0aGlzLnJlYWR5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgY2xlYW5VcCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IENvbXBpbGVyLmNsZWFuVXAoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZ2V0VGVzdHMgKHsgc291cmNlTGlzdCwgY29tcGlsZXJPcHRpb25zIH06IENvbXBpbGVyQXJndW1lbnRzKTogUHJvbWlzZTxVbml0cz4ge1xuICAgICAgICBjb25zdCBjb21waWxlciA9IG5ldyBDb21waWxlcihzb3VyY2VMaXN0LCBjb21waWxlck9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IHRlc3RzID0gYXdhaXQgY29tcGlsZXIuZ2V0VGVzdHMoKTtcbiAgICAgICAgY29uc3QgdW5pdHMgPSBmbGF0dGVuVGVzdFN0cnVjdHVyZSh0ZXN0cyk7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnN0YXRlLnVuaXRzLCB1bml0cyk7XG5cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZVRlc3RTdHJ1Y3R1cmUodW5pdHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBydW5UZXN0IChhcmdzOiBSdW5UZXN0QXJndW1lbnRzKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgICAgIGNvbnN0IHsgaWQsIGZ1bmN0aW9uTmFtZSB9ID0gYXJncztcblxuICAgICAgICBjb25zdCB1bml0ICAgID0gdGhpcy5zdGF0ZS51bml0c1tpZF07XG4gICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9nZXRDb250ZXh0KGFyZ3MpO1xuXG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uT2JqZWN0ID0gdGhpcy5fZ2V0RnVuY3Rpb24odW5pdCwgZnVuY3Rpb25OYW1lKTtcblxuICAgICAgICBpZiAoIWZ1bmN0aW9uT2JqZWN0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IGZ1bmN0aW9uT2JqZWN0KGNvbnRleHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBleGVjdXRlQWN0aW9uICh7IGlkLCBhcGlNZXRob2ROYW1lLCBjb21tYW5kLCBjYWxsc2l0ZSB9OiBFeGVjdXRlQ29tbWFuZEFyZ3VtZW50cyk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm94eS5jYWxsKHRoaXMuZXhlY3V0ZUFjdGlvbiwgeyBpZCwgYXBpTWV0aG9kTmFtZSwgY29tbWFuZCwgY2FsbHNpdGUgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgQ29tcGlsZXJTZXJ2aWNlKCk7XG4iXX0=