@aws-cdk/integ-runner
Version:
CDK Integration Testing Tool
188 lines • 23.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.integTestWorker = integTestWorker;
exports.watchTestWorker = watchTestWorker;
exports.snapshotTestWorker = snapshotTestWorker;
const workerpool = require("workerpool");
const runner_1 = require("../../runner");
const integration_tests_1 = require("../../runner/integration-tests");
const common_1 = require("../common");
/**
* Runs a single integration test batch request.
* If the test does not have an existing snapshot,
* this will first generate a snapshot and then execute
* the integration tests.
*
* If the tests succeed it will then save the snapshot
*/
async function integTestWorker(request) {
const failures = [];
const verbosity = request.verbosity ?? 0;
for (const testInfo of request.tests) {
const test = new integration_tests_1.IntegTest({
...testInfo,
watch: request.watch,
}); // Hydrate from data
const start = Date.now();
try {
const runner = new runner_1.IntegTestRunner({
test,
profile: request.profile,
region: request.region,
env: {
CDK_DOCKER: process.env.CDK_DOCKER ?? 'docker',
},
showOutput: verbosity >= 2,
}, testInfo.destructiveChanges);
const tests = await runner.actualTests();
if (!tests || Object.keys(tests).length === 0) {
throw new Error(`No tests defined for ${runner.testName}`);
}
for (const testCaseName of Object.keys(tests)) {
try {
const results = await runner.runIntegTestCase({
testCaseName,
clean: request.clean,
dryRun: request.dryRun,
updateWorkflow: request.updateWorkflow,
verbosity,
});
if (results && Object.values(results).some(result => result.status === 'fail')) {
failures.push(testInfo);
workerpool.workerEmit({
reason: common_1.DiagnosticReason.ASSERTION_FAILED,
testName: `${runner.testName}-${testCaseName} (${request.profile}/${request.region})`,
message: (0, common_1.formatAssertionResults)(results),
duration: (Date.now() - start) / 1000,
});
}
else {
workerpool.workerEmit({
reason: common_1.DiagnosticReason.TEST_SUCCESS,
testName: `${runner.testName}-${testCaseName}`,
message: results ? (0, common_1.formatAssertionResults)(results) : 'NO ASSERTIONS',
duration: (Date.now() - start) / 1000,
});
}
}
catch (e) {
failures.push(testInfo);
workerpool.workerEmit({
reason: common_1.DiagnosticReason.TEST_FAILED,
testName: `${runner.testName}-${testCaseName} (${request.profile}/${request.region})`,
message: `Integration test failed: ${(0, common_1.formatError)(e)}`,
duration: (Date.now() - start) / 1000,
});
}
}
}
catch (e) {
failures.push(testInfo);
workerpool.workerEmit({
reason: common_1.DiagnosticReason.TEST_ERROR,
testName: `${testInfo.fileName} (${request.profile}/${request.region})`,
message: `Error during integration test: ${(0, common_1.formatError)(e)}`,
duration: (Date.now() - start) / 1000,
});
}
}
return failures;
}
async function watchTestWorker(options) {
const verbosity = options.verbosity ?? 0;
const test = new integration_tests_1.IntegTest(options);
const runner = new runner_1.IntegTestRunner({
test,
profile: options.profile,
region: options.region,
env: {
CDK_DOCKER: process.env.CDK_DOCKER ?? 'docker',
},
showOutput: verbosity >= 2,
});
runner.createCdkContextJson();
const tests = await runner.actualTests();
if (!tests || Object.keys(tests).length === 0) {
throw new Error(`No tests defined for ${runner.testName}`);
}
for (const testCaseName of Object.keys(tests)) {
await runner.watchIntegTest({
testCaseName,
verbosity,
});
}
}
/**
* Runs a single snapshot test batch request.
* For each integration test this will check to see
* if there is an existing snapshot, and if there is will
* check if there are any changes
*/
async function snapshotTestWorker(testInfo, options = {}) {
const failedTests = new Array();
const start = Date.now();
const test = new integration_tests_1.IntegTest(testInfo); // Hydrate the data record again
const timer = setTimeout(() => {
workerpool.workerEmit({
reason: common_1.DiagnosticReason.TEST_WARNING,
testName: test.testName,
message: 'Test is taking a very long time',
duration: (Date.now() - start) / 1000,
});
}, 60_000);
try {
const runner = new runner_1.IntegSnapshotRunner({
test,
showOutput: options.verbose ?? false,
});
if (!runner.hasSnapshot()) {
workerpool.workerEmit({
reason: common_1.DiagnosticReason.NO_SNAPSHOT,
testName: test.testName,
message: 'No Snapshot',
duration: (Date.now() - start) / 1000,
});
failedTests.push(test.info);
}
else {
const { diagnostics, destructiveChanges } = await runner.testSnapshot(options);
if (diagnostics.length > 0) {
diagnostics.forEach(diagnostic => workerpool.workerEmit({
...diagnostic,
duration: (Date.now() - start) / 1000,
}));
failedTests.push({
...test.info,
destructiveChanges,
});
}
else {
workerpool.workerEmit({
reason: common_1.DiagnosticReason.SNAPSHOT_SUCCESS,
testName: test.testName,
message: 'Success',
duration: (Date.now() - start) / 1000,
});
}
}
}
catch (e) {
failedTests.push(test.info);
workerpool.workerEmit({
message: (0, common_1.formatError)(e),
testName: test.testName,
reason: common_1.DiagnosticReason.SNAPSHOT_ERROR,
duration: (Date.now() - start) / 1000,
});
}
finally {
clearTimeout(timer);
}
return failedTests;
}
workerpool.worker({
snapshotTestWorker,
integTestWorker,
watchTestWorker,
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmFjdF93b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJleHRyYWN0X3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWlCQSwwQ0EwRUM7QUFFRCwwQ0F3QkM7QUFRRCxnREE0REM7QUF6TEQseUNBQXlDO0FBQ3pDLHlDQUFvRTtBQUVwRSxzRUFBMkQ7QUFFM0Qsc0NBQWtGO0FBSWxGOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQThCO0lBQ2xFLE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7SUFDckMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7SUFFekMsS0FBSyxNQUFNLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSw2QkFBUyxDQUFDO1lBQ3pCLEdBQUcsUUFBUTtZQUNYLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztTQUNyQixDQUFDLENBQUMsQ0FBQyxvQkFBb0I7UUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksd0JBQWUsQ0FBQztnQkFDakMsSUFBSTtnQkFDSixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87Z0JBQ3hCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtnQkFDdEIsR0FBRyxFQUFFO29CQUNILFVBQVUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxRQUFRO2lCQUMvQztnQkFDRCxVQUFVLEVBQUUsU0FBUyxJQUFJLENBQUM7YUFDM0IsRUFBRSxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUVoQyxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUV6QyxJQUFJLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxJ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QUUsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJO1NBQ3hCLENBQUMsQ0FBQztJQUNuQixDQUFDO1lBQVMsQ0FBQztRQUNULFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDaEIsa0JBQWtCO0lBQ2xCLGVBQWU7SUFDZixlQUFlO0NBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHdvcmtlcnBvb2wgZnJvbSAnd29ya2VycG9vbCc7XG5pbXBvcnQgeyBJbnRlZ1NuYXBzaG90UnVubmVyLCBJbnRlZ1Rlc3RSdW5uZXIgfSBmcm9tICcuLi8uLi9ydW5uZXInO1xuaW1wb3J0IHR5cGUgeyBJbnRlZ1Rlc3RJbmZvIH0gZnJvbSAnLi4vLi4vcnVubmVyL2ludGVncmF0aW9uLXRlc3RzJztcbmltcG9ydCB7IEludGVnVGVzdCB9IGZyb20gJy4uLy4uL3J1bm5lci9pbnRlZ3JhdGlvbi10ZXN0cyc7XG5pbXBvcnQgdHlwZSB7IEludGVnVGVzdFdvcmtlckNvbmZpZywgU25hcHNob3RWZXJpZmljYXRpb25PcHRpb25zLCBEaWFnbm9zdGljIH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7IERpYWdub3N0aWNSZWFzb24sIGZvcm1hdEFzc2VydGlvblJlc3VsdHMsIGZvcm1hdEVycm9yIH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB0eXBlIHsgSW50ZWdUZXN0QmF0Y2hSZXF1ZXN0IH0gZnJvbSAnLi4vaW50ZWctdGVzdC13b3JrZXInO1xuaW1wb3J0IHR5cGUgeyBJbnRlZ1dhdGNoT3B0aW9ucyB9IGZyb20gJy4uL2ludGVnLXdhdGNoLXdvcmtlcic7XG5cbi8qKlxuICogUnVucyBhIHNpbmdsZSBpbnRlZ3JhdGlvbiB0ZXN0IGJhdGNoIHJlcXVlc3QuXG4gKiBJZiB0aGUgdGVzdCBkb2VzIG5vdCBoYXZlIGFuIGV4aXN0aW5nIHNuYXBzaG90LFxuICogdGhpcyB3aWxsIGZpcnN0IGdlbmVyYXRlIGEgc25hcHNob3QgYW5kIHRoZW4gZXhlY3V0ZVxuICogdGhlIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIElmIHRoZSB0ZXN0cyBzdWNjZWVkIGl0IHdpbGwgdGhlbiBzYXZlIHRoZSBzbmFwc2hvdFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW50ZWdUZXN0V29ya2VyKHJlcXVlc3Q6IEludGVnVGVzdEJhdGNoUmVxdWVzdCk6IFByb21pc2U8SW50ZWdUZXN0V29ya2VyQ29uZmlnW10+IHtcbiAgY29uc3QgZmFpbHVyZXM6IEludGVnVGVzdEluZm9bXSA9IFtdO1xuICBjb25zdCB2ZXJib3NpdHkgPSByZXF1ZXN0LnZlcmJvc2l0eSA/PyAwO1xuXG4gIGZvciAoY29uc3QgdGVzdEluZm8gb2YgcmVxdWVzdC50ZXN0cykge1xuICAgIGNvbnN0IHRlc3QgPSBuZXcgSW50ZWdUZXN0KHtcbiAgICAgIC4uLnRlc3RJbmZvLFxuICAgICAgd2F0Y2g6IHJlcXVlc3Qud2F0Y2gsXG4gICAgfSk7IC8vIEh5ZHJhdGUgZnJvbSBkYXRhXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBJbnRlZ1Rlc3RSdW5uZXIoe1xuICAgICAgICB0ZXN0LFxuICAgICAgICBwcm9maWxlOiByZXF1ZXN0LnByb2ZpbGUsXG4gICAgICAgIHJlZ2lvbjogcmVxdWVzdC5yZWdpb24sXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIENES19ET0NLRVI6IHByb2Nlc3MuZW52LkNES19ET0NLRVIgPz8gJ2RvY2tlcicsXG4gICAgICAgIH0sXG4gICAgICAgIHNob3dPdXRwdXQ6IHZlcmJvc2l0eSA+PSAyLFxuICAgICAgfSwgdGVzdEluZm8uZGVzdHJ1Y3RpdmVDaGFuZ2VzKTtcblxuICAgICAgY29uc3QgdGVzdHMgPSBhd2FpdCBydW5uZXIuYWN0dWFsVGVzdHMoKTtcblxuICAgICAgaWYgKCF0ZXN0cyB8fCBPYmplY3Qua2V5cyh0ZXN0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdGVzdHMgZGVmaW5lZCBmb3IgJHtydW5uZXIudGVzdE5hbWV9YCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHRlc3RDYXNlTmFtZSBvZiBPYmplY3Qua2V5cyh0ZXN0cykpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcnVubmVyLnJ1bkludGVnVGVzdENhc2Uoe1xuICAgICAgICAgICAgdGVzdENhc2VOYW1lLFxuICAgICAgICAgICAgY2xlYW46IHJlcXVlc3QuY2xlYW4sXG4gICAgICAgICAgICBkcnlSdW46IHJlcXVlc3QuZHJ5UnVuLFxuICAgICAgICAgICAgdXBkYXRlV29ya2Zsb3c6IHJlcXVlc3QudXBkYXRlV29ya2Zsb3csXG4gICAgICAgICAgICB2ZXJib3NpdHksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKHJlc3VsdHMgJiYgT2JqZWN0LnZhbHVlcyhyZXN1bHRzKS5zb21lKHJlc3VsdCA9PiByZXN1bHQuc3RhdHVzID09PSAnZmFpbCcpKSB7XG4gICAgICAgICAgICBmYWlsdXJlcy5wdXNoKHRlc3RJbmZvKTtcbiAgICAgICAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5BU1NFUlRJT05fRkFJTEVELFxuICAgICAgICAgICAgICB0ZXN0TmFtZTogYCR7cnVubmVyLnRlc3ROYW1lfS0ke3Rlc3RDYXNlTmFtZX0gKCR7cmVxdWVzdC5wcm9maWxlfS8ke3JlcXVlc3QucmVnaW9ufSlgLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBmb3JtYXRBc3NlcnRpb25SZXN1bHRzKHJlc3VsdHMpLFxuICAgICAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5URVNUX1NVQ0NFU1MsXG4gICAgICAgICAgICAgIHRlc3ROYW1lOiBgJHtydW5uZXIudGVzdE5hbWV9LSR7dGVzdENhc2VOYW1lfWAsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdHMgPyBmb3JtYXRBc3NlcnRpb25SZXN1bHRzKHJlc3VsdHMpIDogJ05PIEFTU0VSVElPTlMnLFxuICAgICAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZmFpbHVyZXMucHVzaCh0ZXN0SW5mbyk7XG4gICAgICAgICAgd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5URVNUX0ZBSUxFRCxcbiAgICAgICAgICAgIHRlc3ROYW1lOiBgJHtydW5uZXIudGVzdE5hbWV9LSR7dGVzdENhc2VOYW1lfSAoJHtyZXF1ZXN0LnByb2ZpbGV9LyR7cmVxdWVzdC5yZWdpb259KWAsXG4gICAgICAgICAgICBtZXNzYWdlOiBgSW50ZWdyYXRpb24gdGVzdCBmYWlsZWQ6ICR7Zm9ybWF0RXJyb3IoZSl9YCxcbiAgICAgICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBmYWlsdXJlcy5wdXNoKHRlc3RJbmZvKTtcbiAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5URVNUX0VSUk9SLFxuICAgICAgICB0ZXN0TmFtZTogYCR7dGVzdEluZm8uZmlsZU5hbWV9ICgke3JlcXVlc3QucHJvZmlsZX0vJHtyZXF1ZXN0LnJlZ2lvbn0pYCxcbiAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBpbnRlZ3JhdGlvbiB0ZXN0OiAke2Zvcm1hdEVycm9yKGUpfWAsXG4gICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFpbHVyZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YXRjaFRlc3RXb3JrZXIob3B0aW9uczogSW50ZWdXYXRjaE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdmVyYm9zaXR5ID0gb3B0aW9ucy52ZXJib3NpdHkgPz8gMDtcbiAgY29uc3QgdGVzdCA9IG5ldyBJbnRlZ1Rlc3Qob3B0aW9ucyk7XG4gIGNvbnN0IHJ1bm5lciA9IG5ldyBJbnRlZ1Rlc3RSdW5uZXIoe1xuICAgIHRlc3QsXG4gICAgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlLFxuICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgZW52OiB7XG4gICAgICBDREtfRE9DS0VSOiBwcm9jZXNzLmVudi5DREtfRE9DS0VSID8/ICdkb2NrZXInLFxuICAgIH0sXG4gICAgc2hvd091dHB1dDogdmVyYm9zaXR5ID49IDIsXG4gIH0pO1xuICBydW5uZXIuY3JlYXRlQ2RrQ29udGV4dEpzb24oKTtcbiAgY29uc3QgdGVzdHMgPSBhd2FpdCBydW5uZXIuYWN0dWFsVGVzdHMoKTtcblxuICBpZiAoIXRlc3RzIHx8IE9iamVjdC5rZXlzKHRlc3RzKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRlc3RzIGRlZmluZWQgZm9yICR7cnVubmVyLnRlc3ROYW1lfWApO1xuICB9XG4gIGZvciAoY29uc3QgdGVzdENhc2VOYW1lIG9mIE9iamVjdC5rZXlzKHRlc3RzKSkge1xuICAgIGF3YWl0IHJ1bm5lci53YXRjaEludGVnVGVzdCh7XG4gICAgICB0ZXN0Q2FzZU5hbWUsXG4gICAgICB2ZXJib3NpdHksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGEgc2luZ2xlIHNuYXBzaG90IHRlc3QgYmF0Y2ggcmVxdWVzdC5cbiAqIEZvciBlYWNoIGludGVncmF0aW9uIHRlc3QgdGhpcyB3aWxsIGNoZWNrIHRvIHNlZVxuICogaWYgdGhlcmUgaXMgYW4gZXhpc3Rpbmcgc25hcHNob3QsIGFuZCBpZiB0aGVyZSBpcyB3aWxsXG4gKiBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNuYXBzaG90VGVzdFdvcmtlcih0ZXN0SW5mbzogSW50ZWdUZXN0SW5mbywgb3B0aW9uczogU25hcHNob3RWZXJpZmljYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPEludGVnVGVzdFdvcmtlckNvbmZpZ1tdPiB7XG4gIGNvbnN0IGZhaWxlZFRlc3RzID0gbmV3IEFycmF5PEludGVnVGVzdFdvcmtlckNvbmZpZz4oKTtcbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBjb25zdCB0ZXN0ID0gbmV3IEludGVnVGVzdCh0ZXN0SW5mbyk7IC8vIEh5ZHJhdGUgdGhlIGRhdGEgcmVjb3JkIGFnYWluXG5cbiAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlRFU1RfV0FSTklORyxcbiAgICAgIHRlc3ROYW1lOiB0ZXN0LnRlc3ROYW1lLFxuICAgICAgbWVzc2FnZTogJ1Rlc3QgaXMgdGFraW5nIGEgdmVyeSBsb25nIHRpbWUnLFxuICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICB9KTtcbiAgfSwgNjBfMDAwKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHJ1bm5lciA9IG5ldyBJbnRlZ1NuYXBzaG90UnVubmVyKHtcbiAgICAgIHRlc3QsXG4gICAgICBzaG93T3V0cHV0OiBvcHRpb25zLnZlcmJvc2UgPz8gZmFsc2UsXG4gICAgfSk7XG4gICAgaWYgKCFydW5uZXIuaGFzU25hcHNob3QoKSkge1xuICAgICAgd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLk5PX1NOQVBTSE9ULFxuICAgICAgICB0ZXN0TmFtZTogdGVzdC50ZXN0TmFtZSxcbiAgICAgICAgbWVzc2FnZTogJ05vIFNuYXBzaG90JyxcbiAgICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICAgIH0pO1xuICAgICAgZmFpbGVkVGVzdHMucHVzaCh0ZXN0LmluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IGRpYWdub3N0aWNzLCBkZXN0cnVjdGl2ZUNoYW5nZXMgfSA9IGF3YWl0IHJ1bm5lci50ZXN0U25hcHNob3Qob3B0aW9ucyk7XG4gICAgICBpZiAoZGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgICAgICBkaWFnbm9zdGljcy5mb3JFYWNoKGRpYWdub3N0aWMgPT4gd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgICAgICAuLi5kaWFnbm9zdGljLFxuICAgICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICAgIH0gYXMgRGlhZ25vc3RpYykpO1xuICAgICAgICBmYWlsZWRUZXN0cy5wdXNoKHtcbiAgICAgICAgICAuLi50ZXN0LmluZm8sXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX1NVQ0NFU1MsXG4gICAgICAgICAgdGVzdE5hbWU6IHRlc3QudGVzdE5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogJ1N1Y2Nlc3MnLFxuICAgICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICAgIH0gYXMgRGlhZ25vc3RpYyk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICBmYWlsZWRUZXN0cy5wdXNoKHRlc3QuaW5mbyk7XG4gICAgd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgIG1lc3NhZ2U6IGZvcm1hdEVycm9yKGUpLFxuICAgICAgdGVzdE5hbWU6IHRlc3QudGVzdE5hbWUsXG4gICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfRVJST1IsXG4gICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgIH0gYXMgRGlhZ25vc3RpYyk7XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfVxuXG4gIHJldHVybiBmYWlsZWRUZXN0cztcbn1cblxud29ya2VycG9vbC53b3JrZXIoe1xuICBzbmFwc2hvdFRlc3RXb3JrZXIsXG4gIGludGVnVGVzdFdvcmtlcixcbiAgd2F0Y2hUZXN0V29ya2VyLFxufSk7XG4iXX0=