testcafe
Version:
Automated browser testing for the modern web development stack.
176 lines • 22.8 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = require("lodash");
const test_run_controller_1 = __importDefault(require("./test-run-controller"));
const controller_1 = __importDefault(require("./controller"));
const runner_1 = __importDefault(require("../runner"));
const bootstrapper_1 = __importDefault(require("./bootstrapper"));
const parse_file_list_1 = __importDefault(require("../utils/parse-file-list"));
const runtime_1 = require("../errors/runtime");
const types_1 = require("../errors/types");
class LiveModeRunner extends runner_1.default {
constructor({ proxy, browserConnectionGateway, configuration }) {
super({ proxy, browserConnectionGateway, configuration });
this.stopping = false;
this.runnerTaskPromise = null;
this.stopInfiniteWaiting = lodash_1.noop;
this.rejectInfiniteWaiting = lodash_1.noop;
this.assets = null;
this.testRunController = new test_run_controller_1.default();
this.controller = this._createController();
this.embeddingOptions({
TestRunCtor: this.testRunController.TestRunCtor,
assets: [],
});
this.controller = this._createController();
this.configurationCache = null;
}
runTests(isFirstRun = false) {
let runError = null;
return this._finishPreviousTestRuns()
.then(() => {
return this._validateRunnableConfiguration(isFirstRun);
})
.then(() => {
const expectedTestCount = this.configurationCache.tests.length;
this.testRunController.setExpectedTestCount(expectedTestCount);
})
.then(() => {
this._resetBeforeRun();
this.bootstrapper.restoreMessageBusListeners();
this.runnerTaskPromise = this._prepareAndRunTask(this.opts);
return this.runnerTaskPromise;
})
.catch(err => {
this.setBootstrappingError(null);
runError = err;
})
.then(() => {
this.runnerTaskPromise = null;
this.controller.onTestRunDone(runError);
});
}
_validateRunOptions() {
return super._validateRunOptions()
.catch(err => {
this.rejectInfiniteWaiting(err);
});
}
_createRunnableConfiguration() {
if (this.configurationCache)
return Promise.resolve(this.configurationCache);
return super._createRunnableConfiguration()
.then(configuration => {
this.configurationCache = configuration;
return configuration;
})
.catch(err => {
this.rejectInfiniteWaiting(err);
});
}
setBootstrappingError(err) {
this.bootstrappingError = err;
}
run(options) {
this.configurationCache = null;
if (this._running)
throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotRunLiveModeRunnerMultipleTimes);
this._running = this._waitUntilExit()
.then(() => {
return this._dispose();
})
.then(() => {
delete this._running;
});
this._options = Object.assign({}, this._options, options);
this._setConfigurationOptions()
.then(() => this._setBootstrapperOptions())
.then(() => (0, parse_file_list_1.default)(this.bootstrapper.sources, process.cwd()))
.then(files => {
return this.controller.init(files);
})
.then(() => this._createRunnableConfiguration())
.then(() => this.runTests(true));
return this._running;
}
suspend() {
if (!this.runnerTaskPromise)
return Promise.resolve();
this.stopping = true;
this.testRunController.stop();
this.runnerTaskPromise.cancel();
return this.testRunController.allTestsCompletePromise
.then(() => {
this.stopping = false;
this.controller.onTestRunDone();
});
}
stop() {
return super.stop()
.then(() => {
return this.controller.exit();
});
}
exit() {
if (this.runnerTaskPromise)
this.runnerTaskPromise.cancel();
return Promise.resolve()
.then(() => this.stopInfiniteWaiting())
.then(() => this._running);
}
async _finishPreviousTestRuns() {
var _a;
if (!((_a = this.configurationCache) === null || _a === void 0 ? void 0 : _a.tests))
return;
this.testRunController.run();
}
_validateRunnableConfiguration(isFirstRun) {
if (isFirstRun) {
if (this.bootstrappingError)
return Promise.reject(this.bootstrappingError);
else if (!this.configurationCache) {
// NOTE: Such errors handled in process.on('unhandledRejection') handler.
return Promise.reject(null);
}
return Promise.resolve();
}
return this.bootstrapper._getTests()
.then(tests => {
this.configurationCache.tests = tests;
return this.bootstrappingError ? Promise.reject(this.bootstrappingError) : Promise.resolve();
});
}
_createTask(tests, browserConnectionGroups, proxy, opts) {
opts.live = true;
return super._createTask(tests, browserConnectionGroups, proxy, opts, this.warningLog);
}
_createBootstrapper(browserConnectionGateway, messageBus) {
return new bootstrapper_1.default(this, browserConnectionGateway, messageBus);
}
_createController() {
return new controller_1.default(this);
}
_waitUntilExit() {
return new Promise((resolve, reject) => {
this.stopInfiniteWaiting = resolve;
this.rejectInfiniteWaiting = reject;
});
}
_disposeAssets(browserSet, reporters, testedApp) {
this.assets = { browserSet, reporters, testedApp };
return Promise.resolve();
}
_dispose() {
this.controller.dispose();
if (!this.assets)
return Promise.resolve();
const { browserSet, reporters, testedApp } = this.assets;
return super._disposeAssets(browserSet, reporters, testedApp);
}
}
exports.default = LiveModeRunner;
module.exports = exports.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGl2ZS90ZXN0LXJ1bm5lci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLG1DQUE4QjtBQUM5QixnRkFBOEQ7QUFDOUQsOERBQThDO0FBQzlDLHVEQUErQjtBQUMvQixrRUFBa0Q7QUFDbEQsK0VBQXFEO0FBQ3JELCtDQUFpRDtBQUNqRCwyQ0FBaUQ7QUFFakQsTUFBTSxjQUFlLFNBQVEsZ0JBQU07SUFDL0IsWUFBYSxFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxhQUFhLEVBQUU7UUFDM0QsS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLHdCQUF3QixFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7UUFFMUQsSUFBSSxDQUFDLFFBQVEsR0FBZ0IsS0FBSyxDQUFDO1FBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBTyxJQUFJLENBQUM7UUFDbEMsSUFBSSxDQUFDLG1CQUFtQixHQUFLLGFBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMscUJBQXFCLEdBQUcsYUFBSSxDQUFDO1FBRWxDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRW5CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLDZCQUF5QixFQUFFLENBQUM7UUFDekQsSUFBSSxDQUFDLFVBQVUsR0FBVSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUdsRCxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDbEIsV0FBVyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXO1lBQy9DLE1BQU0sRUFBTyxFQUFFO1NBQ2xCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLEdBQVcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDbkQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztJQUNuQyxDQUFDO0lBRUQsUUFBUSxDQUFFLFVBQVUsR0FBRyxLQUFLO1FBQ3hC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QUU3QixNQUFNLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRXpELE9BQU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7Q0FDSjtBQUVELGtCQUFlLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG5vb3AgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IExpdmVNb2RlVGVzdFJ1bkNvbnRyb2xsZXIgZnJvbSAnLi90ZXN0LXJ1bi1jb250cm9sbGVyJztcbmltcG9ydCBMaXZlTW9kZUNvbnRyb2xsZXIgZnJvbSAnLi9jb250cm9sbGVyJztcbmltcG9ydCBSdW5uZXIgZnJvbSAnLi4vcnVubmVyJztcbmltcG9ydCBMaXZlTW9kZUJvb3RzdHJhcHBlciBmcm9tICcuL2Jvb3RzdHJhcHBlcic7XG5pbXBvcnQgcGFyc2VGaWxlTGlzdCBmcm9tICcuLi91dGlscy9wYXJzZS1maWxlLWxpc3QnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuLi9lcnJvcnMvdHlwZXMnO1xuXG5jbGFzcyBMaXZlTW9kZVJ1bm5lciBleHRlbmRzIFJ1bm5lciB7XG4gICAgY29uc3RydWN0b3IgKHsgcHJveHksIGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSwgY29uZmlndXJhdGlvbiB9KSB7XG4gICAgICAgIHN1cGVyKHsgcHJveHksIGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSwgY29uZmlndXJhdGlvbiB9KTtcblxuICAgICAgICB0aGlzLnN0b3BwaW5nICAgICAgICAgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJ1bm5lclRhc2tQcm9taXNlICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RvcEluZmluaXRlV2FpdGluZyAgID0gbm9vcDtcbiAgICAgICAgdGhpcy5yZWplY3RJbmZpbml0ZVdhaXRpbmcgPSBub29wO1xuXG4gICAgICAgIHRoaXMuYXNzZXRzID0gbnVsbDtcblxuICAgICAgICB0aGlzLnRlc3RSdW5Db250cm9sbGVyID0gbmV3IExpdmVNb2RlVGVzdFJ1bkNvbnRyb2xsZXIoKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVyICAgICAgICA9IHRoaXMuX2NyZWF0ZUNvbnRyb2xsZXIoKTtcblxuXG4gICAgICAgIHRoaXMuZW1iZWRkaW5nT3B0aW9ucyh7XG4gICAgICAgICAgICBUZXN0UnVuQ3RvcjogdGhpcy50ZXN0UnVuQ29udHJvbGxlci5UZXN0UnVuQ3RvcixcbiAgICAgICAgICAgIGFzc2V0czogICAgICBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlciAgICAgICAgID0gdGhpcy5fY3JlYXRlQ29udHJvbGxlcigpO1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25DYWNoZSA9IG51bGw7XG4gICAgfVxuXG4gICAgcnVuVGVzdHMgKGlzRmlyc3RSdW4gPSBmYWxzZSkge1xuICAgICAgICBsZXQgcnVuRXJyb3IgPSBudWxsO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9maW5pc2hQcmV2aW91c1Rlc3RSdW5zKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24oaXNGaXJzdFJ1bik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVGVzdENvdW50ID0gdGhpcy5jb25maWd1cmF0aW9uQ2FjaGUudGVzdHMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50ZXN0UnVuQ29udHJvbGxlci5zZXRFeHBlY3RlZFRlc3RDb3VudChleHBlY3RlZFRlc3RDb3VudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2V0QmVmb3JlUnVuKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ib290c3RyYXBwZXIucmVzdG9yZU1lc3NhZ2VCdXNMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bm5lclRhc2tQcm9taXNlID0gdGhpcy5fcHJlcGFyZUFuZFJ1blRhc2sodGhpcy5vcHRzKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJ1bm5lclRhc2tQcm9taXNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Qm9vdHN0cmFwcGluZ0Vycm9yKG51bGwpO1xuXG4gICAgICAgICAgICAgICAgcnVuRXJyb3IgPSBlcnI7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucnVubmVyVGFza1Byb21pc2UgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm9uVGVzdFJ1bkRvbmUocnVuRXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX3ZhbGlkYXRlUnVuT3B0aW9ucyAoKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5fdmFsaWRhdGVSdW5PcHRpb25zKClcbiAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVqZWN0SW5maW5pdGVXYWl0aW5nKGVycik7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfY3JlYXRlUnVubmFibGVDb25maWd1cmF0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbkNhY2hlKVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmNvbmZpZ3VyYXRpb25DYWNoZSk7XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLl9jcmVhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24oKVxuICAgICAgICAgICAgLnRoZW4oY29uZmlndXJhdGlvbiA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uQ2FjaGUgPSBjb25maWd1cmF0aW9uO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWplY3RJbmZpbml0ZVdhaXRpbmcoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEJvb3RzdHJhcHBpbmdFcnJvciAoZXJyKSB7XG4gICAgICAgIHRoaXMuYm9vdHN0cmFwcGluZ0Vycm9yID0gZXJyO1xuICAgIH1cblxuICAgIHJ1biAob3B0aW9ucykge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25DYWNoZSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRoaXMuX3J1bm5pbmcpXG4gICAgICAgICAgICB0aHJvdyBuZXcgR2VuZXJhbEVycm9yKFJVTlRJTUVfRVJST1JTLmNhbm5vdFJ1bkxpdmVNb2RlUnVubmVyTXVsdGlwbGVUaW1lcyk7XG5cbiAgICAgICAgdGhpcy5fcnVubmluZyA9IHRoaXMuX3dhaXRVbnRpbEV4aXQoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaXNwb3NlKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ydW5uaW5nO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX29wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMuX3NldENvbmZpZ3VyYXRpb25PcHRpb25zKClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuX3NldEJvb3RzdHJhcHBlck9wdGlvbnMoKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHBhcnNlRmlsZUxpc3QodGhpcy5ib290c3RyYXBwZXIuc291cmNlcywgcHJvY2Vzcy5jd2QoKSkpXG4gICAgICAgICAgICAudGhlbihmaWxlcyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5pbml0KGZpbGVzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLl9jcmVhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24oKSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMucnVuVGVzdHModHJ1ZSkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLl9ydW5uaW5nO1xuICAgIH1cblxuICAgIHN1c3BlbmQgKCkge1xuICAgICAgICBpZiAoIXRoaXMucnVubmVyVGFza1Byb21pc2UpXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgdGhpcy5zdG9wcGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMudGVzdFJ1bkNvbnRyb2xsZXIuc3RvcCgpO1xuICAgICAgICB0aGlzLnJ1bm5lclRhc2tQcm9taXNlLmNhbmNlbCgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RSdW5Db250cm9sbGVyLmFsbFRlc3RzQ29tcGxldGVQcm9taXNlXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wcGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLm9uVGVzdFJ1bkRvbmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0b3AgKCkge1xuICAgICAgICByZXR1cm4gc3VwZXIuc3RvcCgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbGxlci5leGl0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBleGl0ICgpIHtcbiAgICAgICAgaWYgKHRoaXMucnVubmVyVGFza1Byb21pc2UpXG4gICAgICAgICAgICB0aGlzLnJ1bm5lclRhc2tQcm9taXNlLmNhbmNlbCgpO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5zdG9wSW5maW5pdGVXYWl0aW5nKCkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLl9ydW5uaW5nKTtcbiAgICB9XG5cbiAgICBhc3luYyBfZmluaXNoUHJldmlvdXNUZXN0UnVucyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb25maWd1cmF0aW9uQ2FjaGU/LnRlc3RzKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy50ZXN0UnVuQ29udHJvbGxlci5ydW4oKTtcbiAgICB9XG5cbiAgICBfdmFsaWRhdGVSdW5uYWJsZUNvbmZpZ3VyYXRpb24gKGlzRmlyc3RSdW4pIHtcbiAgICAgICAgaWYgKGlzRmlyc3RSdW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJvb3RzdHJhcHBpbmdFcnJvcilcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5ib290c3RyYXBwaW5nRXJyb3IpO1xuXG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5jb25maWd1cmF0aW9uQ2FjaGUpIHtcbiAgICAgICAgICAgICAgICAvLyBOT1RFOiBTdWNoIGVycm9ycyBoYW5kbGVkIGluIHByb2Nlc3Mub24oJ3VuaGFuZGxlZFJlamVjdGlvbicpIGhhbmRsZXIuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG51bGwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5ib290c3RyYXBwZXIuX2dldFRlc3RzKClcbiAgICAgICAgICAgIC50aGVuKHRlc3RzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25DYWNoZS50ZXN0cyA9IHRlc3RzO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYm9vdHN0cmFwcGluZ0Vycm9yID8gUHJvbWlzZS5yZWplY3QodGhpcy5ib290c3RyYXBwaW5nRXJyb3IpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfY3JlYXRlVGFzayAodGVzdHMsIGJyb3dzZXJDb25uZWN0aW9uR3JvdXBzLCBwcm94eSwgb3B0cykge1xuICAgICAgICBvcHRzLmxpdmUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBzdXBlci5fY3JlYXRlVGFzayh0ZXN0cywgYnJvd3NlckNvbm5lY3Rpb25Hcm91cHMsIHByb3h5LCBvcHRzLCB0aGlzLndhcm5pbmdMb2cpO1xuICAgIH1cblxuICAgIF9jcmVhdGVCb290c3RyYXBwZXIgKGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSwgbWVzc2FnZUJ1cykge1xuICAgICAgICByZXR1cm4gbmV3IExpdmVNb2RlQm9vdHN0cmFwcGVyKHRoaXMsIGJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSwgbWVzc2FnZUJ1cyk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNvbnRyb2xsZXIgKCkge1xuICAgICAgICByZXR1cm4gbmV3IExpdmVNb2RlQ29udHJvbGxlcih0aGlzKTtcbiAgICB9XG5cbiAgICBfd2FpdFVudGlsRXhpdCAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnN0b3BJbmZpbml0ZVdhaXRpbmcgICA9IHJlc29sdmU7XG4gICAgICAgICAgICB0aGlzLnJlamVjdEluZmluaXRlV2FpdGluZyA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2Rpc3Bvc2VBc3NldHMgKGJyb3dzZXJTZXQsIHJlcG9ydGVycywgdGVzdGVkQXBwKSB7XG4gICAgICAgIHRoaXMuYXNzZXRzID0geyBicm93c2VyU2V0LCByZXBvcnRlcnMsIHRlc3RlZEFwcCB9O1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBfZGlzcG9zZSAoKSB7XG4gICAgICAgIHRoaXMuY29udHJvbGxlci5kaXNwb3NlKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmFzc2V0cylcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICBjb25zdCB7IGJyb3dzZXJTZXQsIHJlcG9ydGVycywgdGVzdGVkQXBwIH0gPSB0aGlzLmFzc2V0cztcblxuICAgICAgICByZXR1cm4gc3VwZXIuX2Rpc3Bvc2VBc3NldHMoYnJvd3NlclNldCwgcmVwb3J0ZXJzLCB0ZXN0ZWRBcHApO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGl2ZU1vZGVSdW5uZXI7XG4iXX0=