336 lines
27 KiB
JavaScript
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=
|