336 lines
27 KiB
JavaScript

'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _bluebird = require('bluebird');
var _bluebird2 = _interopRequireDefault(_bluebird);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
var _createClass2 = require('babel-runtime/helpers/createClass');
var _createClass3 = _interopRequireDefault(_createClass2);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _helpers = require('./helpers');
var _attachment_manager = require('./attachment_manager');
var _attachment_manager2 = _interopRequireDefault(_attachment_manager);
var _status = require('../status');
var _status2 = _interopRequireDefault(_status);
var _step_runner = require('./step_runner');
var _step_runner2 = _interopRequireDefault(_step_runner);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var TestCaseRunner = function () {
function TestCaseRunner(_ref) {
var _this = this;
var eventBroadcaster = _ref.eventBroadcaster,
skip = _ref.skip,
testCase = _ref.testCase,
supportCodeLibrary = _ref.supportCodeLibrary,
worldParameters = _ref.worldParameters;
(0, _classCallCheck3.default)(this, TestCaseRunner);
var attachmentManager = new _attachment_manager2.default(function (_ref2) {
var data = _ref2.data,
media = _ref2.media;
_this.emit('test-step-attachment', {
index: _this.testStepIndex,
data: data,
media: media
});
});
this.eventBroadcaster = eventBroadcaster;
this.skip = skip;
this.testCase = testCase;
this.supportCodeLibrary = supportCodeLibrary;
this.world = new supportCodeLibrary.World({
attach: attachmentManager.create.bind(attachmentManager),
parameters: worldParameters
});
this.beforeHookDefinitions = this.getBeforeHookDefinitions();
this.afterHookDefinitions = this.getAfterHookDefinitions();
this.testStepIndex = 0;
this.result = {
duration: 0,
status: this.skip ? _status2.default.SKIPPED : _status2.default.PASSED
};
this.testCaseSourceLocation = {
uri: this.testCase.uri,
line: this.testCase.pickle.locations[0].line
};
}
(0, _createClass3.default)(TestCaseRunner, [{
key: 'emit',
value: function emit(name, data) {
var eventData = (0, _extends3.default)({}, data);
if (_lodash2.default.startsWith(name, 'test-case')) {
eventData.sourceLocation = this.testCaseSourceLocation;
} else {
eventData.testCase = { sourceLocation: this.testCaseSourceLocation };
}
this.eventBroadcaster.emit(name, eventData);
}
}, {
key: 'emitPrepared',
value: function emitPrepared() {
var _this2 = this;
var steps = [];
this.beforeHookDefinitions.forEach(function (definition) {
var actionLocation = { uri: definition.uri, line: definition.line };
steps.push({ actionLocation: actionLocation });
});
this.testCase.pickle.steps.forEach(function (step) {
var actionLocations = _this2.getStepDefinitions(step).map(function (definition) {
return {
uri: definition.uri,
line: definition.line
};
});
var sourceLocation = {
uri: _this2.testCase.uri,
line: _lodash2.default.last(step.locations).line
};
var data = { sourceLocation: sourceLocation };
if (actionLocations.length === 1) {
data.actionLocation = actionLocations[0];
}
steps.push(data);
});
this.afterHookDefinitions.forEach(function (definition) {
var actionLocation = { uri: definition.uri, line: definition.line };
steps.push({ actionLocation: actionLocation });
});
this.emit('test-case-prepared', { steps: steps });
}
}, {
key: 'getAfterHookDefinitions',
value: function getAfterHookDefinitions() {
var _this3 = this;
return this.supportCodeLibrary.afterTestCaseHookDefinitions.filter(function (hookDefinition) {
return hookDefinition.appliesToTestCase(_this3.testCase);
});
}
}, {
key: 'getBeforeHookDefinitions',
value: function getBeforeHookDefinitions() {
var _this4 = this;
return this.supportCodeLibrary.beforeTestCaseHookDefinitions.filter(function (hookDefinition) {
return hookDefinition.appliesToTestCase(_this4.testCase);
});
}
}, {
key: 'getStepDefinitions',
value: function getStepDefinitions(step) {
var _this5 = this;
return this.supportCodeLibrary.stepDefinitions.filter(function (stepDefinition) {
return stepDefinition.matchesStepName({
stepName: step.text,
parameterTypeRegistry: _this5.supportCodeLibrary.parameterTypeRegistry
});
});
}
}, {
key: 'invokeStep',
value: function invokeStep(step, stepDefinition, hookParameter) {
return _step_runner2.default.run({
defaultTimeout: this.supportCodeLibrary.defaultTimeout,
hookParameter: hookParameter,
parameterTypeRegistry: this.supportCodeLibrary.parameterTypeRegistry,
step: step,
stepDefinition: stepDefinition,
world: this.world
});
}
}, {
key: 'isSkippingSteps',
value: function isSkippingSteps() {
return this.result.status !== _status2.default.PASSED;
}
}, {
key: 'shouldUpdateStatus',
value: function shouldUpdateStatus(testStepResult) {
switch (testStepResult.status) {
case _status2.default.FAILED:
case _status2.default.AMBIGUOUS:
return this.result.status !== _status2.default.FAILED || this.result.status !== _status2.default.AMBIGUOUS;
default:
return this.result.status === _status2.default.PASSED || this.result.status === _status2.default.SKIPPED;
}
}
}, {
key: 'aroundTestStep',
value: function () {
var _ref3 = (0, _bluebird.coroutine)(function* (runStepFn) {
this.emit('test-step-started', { index: this.testStepIndex });
var testStepResult = yield runStepFn();
if (testStepResult.duration) {
this.result.duration += testStepResult.duration;
}
if (this.shouldUpdateStatus(testStepResult)) {
this.result.status = testStepResult.status;
}
if (testStepResult.exception) {
this.result.exception = testStepResult.exception;
}
this.emit('test-step-finished', {
index: this.testStepIndex,
result: testStepResult
});
this.testStepIndex += 1;
});
function aroundTestStep(_x) {
return _ref3.apply(this, arguments);
}
return aroundTestStep;
}()
}, {
key: 'run',
value: function () {
var _ref4 = (0, _bluebird.coroutine)(function* () {
this.emitPrepared();
this.emit('test-case-started', {});
yield this.runHooks(this.beforeHookDefinitions, {
sourceLocation: this.testCaseSourceLocation,
pickle: this.testCase.pickle
});
yield this.runSteps();
yield this.runHooks(this.afterHookDefinitions, {
sourceLocation: this.testCaseSourceLocation,
pickle: this.testCase.pickle,
result: this.result
});
this.emit('test-case-finished', { result: this.result });
return this.result;
});
function run() {
return _ref4.apply(this, arguments);
}
return run;
}()
}, {
key: 'runHook',
value: function () {
var _ref5 = (0, _bluebird.coroutine)(function* (hookDefinition, hookParameter) {
if (this.skip) {
return { status: _status2.default.SKIPPED };
}
return this.invokeStep(null, hookDefinition, hookParameter);
});
function runHook(_x2, _x3) {
return _ref5.apply(this, arguments);
}
return runHook;
}()
}, {
key: 'runHooks',
value: function () {
var _ref6 = (0, _bluebird.coroutine)(function* (hookDefinitions, hookParameter) {
var _this6 = this;
yield _bluebird2.default.each(hookDefinitions, function () {
var _ref7 = (0, _bluebird.coroutine)(function* (hookDefinition) {
yield _this6.aroundTestStep(function () {
return _this6.runHook(hookDefinition, hookParameter);
});
});
return function (_x6) {
return _ref7.apply(this, arguments);
};
}());
});
function runHooks(_x4, _x5) {
return _ref6.apply(this, arguments);
}
return runHooks;
}()
}, {
key: 'runStep',
value: function () {
var _ref8 = (0, _bluebird.coroutine)(function* (step) {
var stepDefinitions = this.getStepDefinitions(step);
if (stepDefinitions.length === 0) {
return { status: _status2.default.UNDEFINED };
} else if (stepDefinitions.length > 1) {
return {
exception: (0, _helpers.getAmbiguousStepException)(stepDefinitions),
status: _status2.default.AMBIGUOUS
};
} else if (this.isSkippingSteps()) {
return { status: _status2.default.SKIPPED };
}
return this.invokeStep(step, stepDefinitions[0]);
});
function runStep(_x7) {
return _ref8.apply(this, arguments);
}
return runStep;
}()
}, {
key: 'runSteps',
value: function () {
var _ref9 = (0, _bluebird.coroutine)(function* () {
var _this7 = this;
yield _bluebird2.default.each(this.testCase.pickle.steps, function () {
var _ref10 = (0, _bluebird.coroutine)(function* (step) {
yield _this7.aroundTestStep(function () {
return _this7.runStep(step);
});
});
return function (_x8) {
return _ref10.apply(this, arguments);
};
}());
});
function runSteps() {
return _ref9.apply(this, arguments);
}
return runSteps;
}()
}]);
return TestCaseRunner;
}();
exports.default = TestCaseRunner;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL3Rlc3RfY2FzZV9ydW5uZXIuanMiXSwibmFtZXMiOlsiVGVzdENhc2VSdW5uZXIiLCJldmVudEJyb2FkY2FzdGVyIiwic2tpcCIsInRlc3RDYXNlIiwic3VwcG9ydENvZGVMaWJyYXJ5Iiwid29ybGRQYXJhbWV0ZXJzIiwiYXR0YWNobWVudE1hbmFnZXIiLCJkYXRhIiwibWVkaWEiLCJlbWl0IiwiaW5kZXgiLCJ0ZXN0U3RlcEluZGV4Iiwid29ybGQiLCJXb3JsZCIsImF0dGFjaCIsImNyZWF0ZSIsInBhcmFtZXRlcnMiLCJiZWZvcmVIb29rRGVmaW5pdGlvbnMiLCJnZXRCZWZvcmVIb29rRGVmaW5pdGlvbnMiLCJhZnRlckhvb2tEZWZpbml0aW9ucyIsImdldEFmdGVySG9va0RlZmluaXRpb25zIiwicmVzdWx0IiwiZHVyYXRpb24iLCJzdGF0dXMiLCJTS0lQUEVEIiwiUEFTU0VEIiwidGVzdENhc2VTb3VyY2VMb2NhdGlvbiIsInVyaSIsImxpbmUiLCJwaWNrbGUiLCJsb2NhdGlvbnMiLCJuYW1lIiwiZXZlbnREYXRhIiwic3RhcnRzV2l0aCIsInNvdXJjZUxvY2F0aW9uIiwic3RlcHMiLCJmb3JFYWNoIiwiYWN0aW9uTG9jYXRpb24iLCJkZWZpbml0aW9uIiwicHVzaCIsImFjdGlvbkxvY2F0aW9ucyIsImdldFN0ZXBEZWZpbml0aW9ucyIsInN0ZXAiLCJtYXAiLCJsYXN0IiwibGVuZ3RoIiwiYWZ0ZXJUZXN0Q2FzZUhvb2tEZWZpbml0aW9ucyIsImZpbHRlciIsImhvb2tEZWZpbml0aW9uIiwiYXBwbGllc1RvVGVzdENhc2UiLCJiZWZvcmVUZXN0Q2FzZUhvb2tEZWZpbml0aW9ucyIsInN0ZXBEZWZpbml0aW9ucyIsInN0ZXBEZWZpbml0aW9uIiwibWF0Y2hlc1N0ZXBOYW1lIiwic3RlcE5hbWUiLCJ0ZXh0IiwicGFyYW1ldGVyVHlwZVJlZ2lzdHJ5IiwiaG9va1BhcmFtZXRlciIsInJ1biIsImRlZmF1bHRUaW1lb3V0IiwidGVzdFN0ZXBSZXN1bHQiLCJGQUlMRUQiLCJBTUJJR1VPVVMiLCJydW5TdGVwRm4iLCJzaG91bGRVcGRhdGVTdGF0dXMiLCJleGNlcHRpb24iLCJlbWl0UHJlcGFyZWQiLCJydW5Ib29rcyIsInJ1blN0ZXBzIiwiaW52b2tlU3RlcCIsImhvb2tEZWZpbml0aW9ucyIsImVhY2giLCJhcm91bmRUZXN0U3RlcCIsInJ1bkhvb2siLCJVTkRFRklORUQiLCJpc1NraXBwaW5nU3RlcHMiLCJydW5TdGVwIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7QUFDQTs7OztBQUVBOzs7O0FBQ0E7Ozs7OztJQUVxQkEsYztBQUNuQixnQ0FNRztBQUFBOztBQUFBLFFBTERDLGdCQUtDLFFBTERBLGdCQUtDO0FBQUEsUUFKREMsSUFJQyxRQUpEQSxJQUlDO0FBQUEsUUFIREMsUUFHQyxRQUhEQSxRQUdDO0FBQUEsUUFGREMsa0JBRUMsUUFGREEsa0JBRUM7QUFBQSxRQUREQyxlQUNDLFFBRERBLGVBQ0M7QUFBQTs7QUFDRCxRQUFNQyxvQkFBb0IsaUNBQXNCLGlCQUFxQjtBQUFBLFVBQWxCQyxJQUFrQixTQUFsQkEsSUFBa0I7QUFBQSxVQUFaQyxLQUFZLFNBQVpBLEtBQVk7O0FBQ25FLFlBQUtDLElBQUwsQ0FBVSxzQkFBVixFQUFrQztBQUNoQ0MsZUFBTyxNQUFLQyxhQURvQjtBQUVoQ0osa0JBRmdDO0FBR2hDQztBQUhnQyxPQUFsQztBQUtELEtBTnlCLENBQTFCO0FBT0EsU0FBS1AsZ0JBQUwsR0FBd0JBLGdCQUF4QjtBQUNBLFNBQUtDLElBQUwsR0FBWUEsSUFBWjtBQUNBLFNBQUtDLFFBQUwsR0FBZ0JBLFFBQWhCO0FBQ0EsU0FBS0Msa0JBQUwsR0FBMEJBLGtCQUExQjtBQUNBLFNBQUtRLEtBQUwsR0FBYSxJQUFJUixtQkFBbUJTLEtBQXZCLENBQTZCO0FBQ3hDQyxjQUFVUixrQkFBa0JTLE1BQTVCLE1BQVVULGlCQUFWLENBRHdDO0FBRXhDVSxrQkFBWVg7QUFG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LENBQXRCLENBQVA7QUFDRCxPOzs7Ozs7Ozs7Ozt3REFFZ0I7QUFBQTs7QUFDZixjQUFNLG1CQUFRb0IsSUFBUixDQUFhLEtBQUtwRSxRQUFMLENBQWMwQixNQUFkLENBQXFCTSxLQUFsQztBQUFBLGdEQUF5QyxXQUFNTyxJQUFOLEVBQWM7QUFDM0Qsa0JBQU0sT0FBSzhCLGNBQUwsQ0FBb0I7QUFBQSxxQkFBTSxPQUFLSSxPQUFMLENBQWFsQyxJQUFiLENBQU47QUFBQSxhQUFwQixDQUFOO0FBQ0QsV0FGSzs7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFOO0FBR0QsTzs7Ozs7Ozs7Ozs7O2tCQXBNa0IxQyxjIiwiZmlsZSI6InRlc3RfY2FzZV9ydW5uZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5pbXBvcnQgeyBnZXRBbWJpZ3VvdXNTdGVwRXhjZXB0aW9uIH0gZnJvbSAnLi9oZWxwZXJzJ1xuaW1wb3J0IEF0dGFjaG1lbnRNYW5hZ2VyIGZyb20gJy4vYXR0YWNobWVudF9tYW5hZ2VyJ1xuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnXG5pbXBvcnQgU3RhdHVzIGZyb20gJy4uL3N0YXR1cydcbmltcG9ydCBTdGVwUnVubmVyIGZyb20gJy4vc3RlcF9ydW5uZXInXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RDYXNlUnVubmVyIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGV2ZW50QnJvYWRjYXN0ZXIsXG4gICAgc2tpcCxcbiAgICB0ZXN0Q2FzZSxcbiAgICBzdXBwb3J0Q29kZUxpYnJhcnksXG4gICAgd29ybGRQYXJhbWV0ZXJzLFxuICB9KSB7XG4gICAgY29uc3QgYXR0YWNobWVudE1hbmFnZXIgPSBuZXcgQXR0YWNobWVudE1hbmFnZXIoKHsgZGF0YSwgbWVkaWEgfSkgPT4ge1xuICAgICAgdGhpcy5lbWl0KCd0ZXN0LXN0ZXAtYXR0YWNobWVudCcsIHtcbiAgICAgICAgaW5kZXg6IHRoaXMudGVzdFN0ZXBJbmRleCxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgbWVkaWEsXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5ldmVudEJyb2FkY2FzdGVyID0gZXZlbnRCcm9hZGNhc3RlclxuICAgIHRoaXMuc2tpcCA9IHNraXBcbiAgICB0aGlzLnRlc3RDYXNlID0gdGVzdENhc2VcbiAgICB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeSA9IHN1cHBvcnRDb2RlTGlicmFyeVxuICAgIHRoaXMud29ybGQgPSBuZXcgc3VwcG9ydENvZGVMaWJyYXJ5LldvcmxkKHtcbiAgICAgIGF0dGFjaDogOjphdHRhY2htZW50TWFuYWdlci5jcmVhdGUsXG4gICAgICBwYXJhbWV0ZXJzOiB3b3JsZFBhcmFtZXRlcnMsXG4gICAgfSlcbiAgICB0aGlzLmJlZm9yZUhvb2tEZWZpbml0aW9ucyA9IHRoaXMuZ2V0QmVmb3JlSG9va0RlZmluaXRpb25zKClcbiAgICB0aGlzLmFmdGVySG9va0RlZmluaXRpb25zID0gdGhpcy5nZXRBZnRlckhvb2tEZWZpbml0aW9ucygpXG4gICAgdGhpcy50ZXN0U3RlcEluZGV4ID0gMFxuICAgIHRoaXMucmVzdWx0ID0ge1xuICAgICAgZHVyYXRpb246IDAsXG4gICAgICBzdGF0dXM6IHRoaXMuc2tpcCA/IFN0YXR1cy5TS0lQUEVEIDogU3RhdHVzLlBBU1NFRCxcbiAgICB9XG4gICAgdGhpcy50ZXN0Q2FzZVNvdXJjZUxvY2F0aW9uID0ge1xuICAgICAgdXJpOiB0aGlzLnRlc3RDYXNlLnVyaSxcbiAgICAgIGxpbmU6IHRoaXMudGVzdENhc2UucGlja2xlLmxvY2F0aW9uc1swXS5saW5lLFxuICAgIH1cbiAgfVxuXG4gIGVtaXQobmFtZSwgZGF0YSkge1xuICAgIGNvbnN0IGV2ZW50RGF0YSA9IHsgLi4uZGF0YSB9XG4gICAgaWYgKF8uc3RhcnRzV2l0aChuYW1lLCAndGVzdC1jYXNlJykpIHtcbiAgICAgIGV2ZW50RGF0YS5zb3VyY2VMb2NhdGlvbiA9IHRoaXMudGVzdENhc2VTb3VyY2VMb2NhdGlvblxuICAgIH0gZWxzZSB7XG4gICAgICBldmVudERhdGEudGVzdENhc2UgPSB7IHNvdXJjZUxvY2F0aW9uOiB0aGlzLnRlc3RDYXNlU291cmNlTG9jYXRpb24gfVxuICAgIH1cbiAgICB0aGlzLmV2ZW50QnJvYWRjYXN0ZXIuZW1pdChuYW1lLCBldmVudERhdGEpXG4gIH1cblxuICBlbWl0UHJlcGFyZWQoKSB7XG4gICAgY29uc3Qgc3RlcHMgPSBbXVxuICAgIHRoaXMuYmVmb3JlSG9va0RlZmluaXRpb25zLmZvckVhY2goZGVmaW5pdGlvbiA9PiB7XG4gICAgICBjb25zdCBhY3Rpb25Mb2NhdGlvbiA9IHsgdXJpOiBkZWZpbml0aW9uLnVyaSwgbGluZTogZGVmaW5pdGlvbi5saW5lIH1cbiAgICAgIHN0ZXBzLnB1c2goeyBhY3Rpb25Mb2NhdGlvbiB9KVxuICAgIH0pXG4gICAgdGhpcy50ZXN0Q2FzZS5waWNrbGUuc3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbkxvY2F0aW9ucyA9IHRoaXMuZ2V0U3RlcERlZmluaXRpb25zKHN0ZXApLm1hcChkZWZpbml0aW9uID0+ICh7XG4gICAgICAgIHVyaTogZGVmaW5pdGlvbi51cmksXG4gICAgICAgIGxpbmU6IGRlZmluaXRpb24ubGluZSxcbiAgICAgIH0pKVxuICAgICAgY29uc3Qgc291cmNlTG9jYXRpb24gPSB7XG4gICAgICAgIHVyaTogdGhpcy50ZXN0Q2FzZS51cmksXG4gICAgICAgIGxpbmU6IF8ubGFzdChzdGVwLmxvY2F0aW9ucykubGluZSxcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSB7IHNvdXJjZUxvY2F0aW9uIH1cbiAgICAgIGlmIChhY3Rpb25Mb2NhdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGRhdGEuYWN0aW9uTG9jYXRpb24gPSBhY3Rpb25Mb2NhdGlvbnNbMF1cbiAgICAgIH1cbiAgICAgIHN0ZXBzLnB1c2goZGF0YSlcbiAgICB9KVxuICAgIHRoaXMuYWZ0ZXJIb29rRGVmaW5pdGlvbnMuZm9yRWFjaChkZWZpbml0aW9uID0+IHtcbiAgICAgIGNvbnN0IGFjdGlvbkxvY2F0aW9uID0geyB1cmk6IGRlZmluaXRpb24udXJpLCBsaW5lOiBkZWZpbml0aW9uLmxpbmUgfVxuICAgICAgc3RlcHMucHVzaCh7IGFjdGlvbkxvY2F0aW9uIH0pXG4gICAgfSlcbiAgICB0aGlzLmVtaXQoJ3Rlc3QtY2FzZS1wcmVwYXJlZCcsIHsgc3RlcHMgfSlcbiAgfVxuXG4gIGdldEFmdGVySG9va0RlZmluaXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeS5hZnRlclRlc3RDYXNlSG9va0RlZmluaXRpb25zLmZpbHRlcihcbiAgICAgIGhvb2tEZWZpbml0aW9uID0+IGhvb2tEZWZpbml0aW9uLmFwcGxpZXNUb1Rlc3RDYXNlKHRoaXMudGVzdENhc2UpXG4gICAgKVxuICB9XG5cbiAgZ2V0QmVmb3JlSG9va0RlZmluaXRpb25zKCkge1xuICAgIHJldHVybiB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeS5iZWZvcmVUZXN0Q2FzZUhvb2tEZWZpbml0aW9ucy5maWx0ZXIoXG4gICAgICBob29rRGVmaW5pdGlvbiA9PiBob29rRGVmaW5pdGlvbi5hcHBsaWVzVG9UZXN0Q2FzZSh0aGlzLnRlc3RDYXNlKVxuICAgIClcbiAgfVxuXG4gIGdldFN0ZXBEZWZpbml0aW9ucyhzdGVwKSB7XG4gICAgcmV0dXJuIHRoaXMuc3VwcG9ydENvZGVMaWJyYXJ5LnN0ZXBEZWZpbml0aW9ucy5maWx0ZXIoc3RlcERlZmluaXRpb24gPT5cbiAgICAgIHN0ZXBEZWZpbml0aW9uLm1hdGNoZXNTdGVwTmFtZSh7XG4gICAgICAgIHN0ZXBOYW1lOiBzdGVwLnRleHQsXG4gICAgICAgIHBhcmFtZXRlclR5cGVSZWdpc3RyeTogdGhpcy5zdXBwb3J0Q29kZUxpYnJhcnkucGFyYW1ldGVyVHlwZVJlZ2lzdHJ5LFxuICAgICAgfSlcbiAgICApXG4gIH1cblxuICBpbnZva2VTdGVwKHN0ZXAsIHN0ZXBEZWZpbml0aW9uLCBob29rUGFyYW1ldGVyKSB7XG4gICAgcmV0dXJuIFN0ZXBSdW5uZXIucnVuKHtcbiAgICAgIGRlZmF1bHRUaW1lb3V0OiB0aGlzLnN1cHBvcnRDb2RlTGlicmFyeS5kZWZhdWx0VGltZW91dCxcbiAgICAgIGhvb2tQYXJhbWV0ZXIsXG4gICAgICBwYXJhbWV0ZXJUeXBlUmVnaXN0cnk6IHRoaXMuc3VwcG9ydENvZGVMaWJyYXJ5LnBhcmFtZXRlclR5cGVSZWdpc3RyeSxcbiAgICAgIHN0ZXAsXG4gICAgICBzdGVwRGVmaW5pdGlvbixcbiAgICAgIHdvcmxkOiB0aGlzLndvcmxkLFxuICAgIH0pXG4gIH1cblxuICBpc1NraXBwaW5nU3RlcHMoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzdWx0LnN0YXR1cyAhPT0gU3RhdHVzLlBBU1NFRFxuICB9XG5cbiAgc2hvdWxkVXBkYXRlU3RhdHVzKHRlc3RTdGVwUmVzdWx0KSB7XG4gICAgc3dpdGNoICh0ZXN0U3RlcFJlc3VsdC5zdGF0dXMpIHtcbiAgICAgIGNhc2UgU3RhdHVzLkZBSUxFRDpcbiAgICAgIGNhc2UgU3RhdHVzLkFNQklHVU9VUzpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLnJlc3VsdC5zdGF0dXMgIT09IFN0YXR1cy5GQUlMRUQgfHxcbiAgICAgICAgICB0aGlzLnJlc3VsdC5zdGF0dXMgIT09IFN0YXR1cy5BTUJJR1VPVVNcbiAgICAgICAgKVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICB0aGlzLnJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5QQVNTRUQgfHxcbiAgICAgICAgICB0aGlzLnJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5TS0lQUEVEXG4gICAgICAgIClcbiAgICB9XG4gIH1cblxuICBhc3luYyBhcm91bmRUZXN0U3RlcChydW5TdGVwRm4pIHtcbiAgICB0aGlzLmVtaXQoJ3Rlc3Qtc3RlcC1zdGFydGVkJywgeyBpbmRleDogdGhpcy50ZXN0U3RlcEluZGV4IH0pXG4gICAgY29uc3QgdGVzdFN0ZXBSZXN1bHQgPSBhd2FpdCBydW5TdGVwRm4oKVxuICAgIGlmICh0ZXN0U3RlcFJlc3VsdC5kdXJhdGlvbikge1xuICAgICAgdGhpcy5yZXN1bHQuZHVyYXRpb24gKz0gdGVzdFN0ZXBSZXN1bHQuZHVyYXRpb25cbiAgICB9XG4gICAgaWYgKHRoaXMuc2hvdWxkVXBkYXRlU3RhdHVzKHRlc3RTdGVwUmVzdWx0KSkge1xuICAgICAgdGhpcy5yZXN1bHQuc3RhdHVzID0gdGVzdFN0ZXBSZXN1bHQuc3RhdHVzXG4gICAgfVxuICAgIGlmICh0ZXN0U3RlcFJlc3VsdC5leGNlcHRpb24pIHtcbiAgICAgIHRoaXMucmVzdWx0LmV4Y2VwdGlvbiA9IHRlc3RTdGVwUmVzdWx0LmV4Y2VwdGlvblxuICAgIH1cbiAgICB0aGlzLmVtaXQoJ3Rlc3Qtc3RlcC1maW5pc2hlZCcsIHtcbiAgICAgIGluZGV4OiB0aGlzLnRlc3RTdGVwSW5kZXgsXG4gICAgICByZXN1bHQ6IHRlc3RTdGVwUmVzdWx0LFxuICAgIH0pXG4gICAgdGhpcy50ZXN0U3RlcEluZGV4ICs9IDFcbiAgfVxuXG4gIGFzeW5jIHJ1bigpIHtcbiAgICB0aGlzLmVtaXRQcmVwYXJlZCgpXG4gICAgdGhpcy5lbWl0KCd0ZXN0LWNhc2Utc3RhcnRlZCcsIHt9KVxuICAgIGF3YWl0IHRoaXMucnVuSG9va3ModGhpcy5iZWZvcmVIb29rRGVmaW5pdGlvbnMsIHtcbiAgICAgIHNvdXJjZUxvY2F0aW9uOiB0aGlzLnRlc3RDYXNlU291cmNlTG9jYXRpb24sXG4gICAgICBwaWNrbGU6IHRoaXMudGVzdENhc2UucGlja2xlLFxuICAgIH0pXG4gICAgYXdhaXQgdGhpcy5ydW5TdGVwcygpXG4gICAgYXdhaXQgdGhpcy5ydW5Ib29rcyh0aGlzLmFmdGVySG9va0RlZmluaXRpb25zLCB7XG4gICAgICBzb3VyY2VMb2NhdGlvbjogdGhpcy50ZXN0Q2FzZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgcGlja2xlOiB0aGlzLnRlc3RDYXNlLnBpY2tsZSxcbiAgICAgIHJlc3VsdDogdGhpcy5yZXN1bHQsXG4gICAgfSlcbiAgICB0aGlzLmVtaXQoJ3Rlc3QtY2FzZS1maW5pc2hlZCcsIHsgcmVzdWx0OiB0aGlzLnJlc3VsdCB9KVxuICAgIHJldHVybiB0aGlzLnJlc3VsdFxuICB9XG5cbiAgYXN5bmMgcnVuSG9vayhob29rRGVmaW5pdGlvbiwgaG9va1BhcmFtZXRlcikge1xuICAgIGlmICh0aGlzLnNraXApIHtcbiAgICAgIHJldHVybiB7IHN0YXR1czogU3RhdHVzLlNLSVBQRUQgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbnZva2VTdGVwKG51bGwsIGhvb2tEZWZpbml0aW9uLCBob29rUGFyYW1ldGVyKVxuICB9XG5cbiAgYXN5bmMgcnVuSG9va3MoaG9va0RlZmluaXRpb25zLCBob29rUGFyYW1ldGVyKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5lYWNoKGhvb2tEZWZpbml0aW9ucywgYXN5bmMgaG9va0RlZmluaXRpb24gPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hcm91bmRUZXN0U3RlcCgoKSA9PlxuICAgICAgICB0aGlzLnJ1bkhvb2soaG9va0RlZmluaXRpb24sIGhvb2tQYXJhbWV0ZXIpXG4gICAgICApXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIHJ1blN0ZXAoc3RlcCkge1xuICAgIGNvbnN0IHN0ZXBEZWZpbml0aW9ucyA9IHRoaXMuZ2V0U3RlcERlZmluaXRpb25zKHN0ZXApXG4gICAgaWYgKHN0ZXBEZWZpbml0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB7IHN0YXR1czogU3RhdHVzLlVOREVGSU5FRCB9XG4gICAgfSBlbHNlIGlmIChzdGVwRGVmaW5pdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXhjZXB0aW9uOiBnZXRBbWJpZ3VvdXNTdGVwRXhjZXB0aW9uKHN0ZXBEZWZpbml0aW9ucyksXG4gICAgICAgIHN0YXR1czogU3RhdHVzLkFNQklHVU9VUyxcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNTa2lwcGluZ1N0ZXBzKCkpIHtcbiAgICAgIHJldHVybiB7IHN0YXR1czogU3RhdHVzLlNLSVBQRUQgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbnZva2VTdGVwKHN0ZXAsIHN0ZXBEZWZpbml0aW9uc1swXSlcbiAgfVxuXG4gIGFzeW5jIHJ1blN0ZXBzKCkge1xuICAgIGF3YWl0IFByb21pc2UuZWFjaCh0aGlzLnRlc3RDYXNlLnBpY2tsZS5zdGVwcywgYXN5bmMgc3RlcCA9PiB7XG4gICAgICBhd2FpdCB0aGlzLmFyb3VuZFRlc3RTdGVwKCgpID0+IHRoaXMucnVuU3RlcChzdGVwKSlcbiAgICB9KVxuICB9XG59XG4iXX0=