@aws-cdk/integ-runner
Version:
CDK Integration Testing Tool
191 lines • 24 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({
engine: request.engine,
test,
profile: request.profile,
env: {
AWS_REGION: request.region,
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({
engine: options.engine,
test,
profile: options.profile,
env: {
AWS_REGION: options.region,
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.SNAPSHOT_ERROR,
testName: test.testName,
message: 'Test is taking a very long time',
duration: (Date.now() - start) / 1000,
});
}, 60000);
try {
const runner = new runner_1.IntegSnapshotRunner({
engine: options.engine,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0cmFjdF93b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJleHRyYWN0X3dvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWlCQSwwQ0EyRUM7QUFFRCwwQ0F5QkM7QUFRRCxnREE2REM7QUE1TEQseUNBQXlDO0FBQ3pDLHlDQUFvRTtBQUVwRSxzRUFBMkQ7QUFFM0Qsc0NBQWtGO0FBSWxGOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsZUFBZSxDQUFDLE9BQThCO0lBQ2xFLE1BQU0sUUFBUSxHQUFvQixFQUFFLENBQUM7SUFDckMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUM7SUFFekMsS0FBSyxNQUFNLFFBQVEsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSw2QkFBUyxDQUFDO1lBQ3pCLEdBQUcsUUFBUTtZQUNYLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztTQUNyQixDQUFDLENBQUMsQ0FBQyxvQkFBb0I7UUFDeEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLElBQUksd0JBQWUsQ0FBQztnQkFDakMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUN0QixJQUFJO2dCQUNKLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztnQkFDeEIsR0FBRyxFQUFFO29CQUNILFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTTtvQkFDMUIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxJQUFJLFFBQVE7aUJBQy9DO2dCQUNELFVBQVUsRUFBRSxTQUFTLElBQUksQ0FBQzthQUMzQixFQUFFLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBRWhDLE1BQU0sS0FBSyxHQUFHLE1BQU0sTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBRXpD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QVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixNQUFNLEVBQUUseUJBQWdCLENBQUMsY0FBYztZQUN2QyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSTtTQUN4QixDQUFDLENBQUM7SUFDbkIsQ0FBQztZQUFTLENBQUM7UUFDVCxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQ2hCLGtCQUFrQjtJQUNsQixlQUFlO0lBQ2YsZUFBZTtDQUNoQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyB3b3JrZXJwb29sIGZyb20gJ3dvcmtlcnBvb2wnO1xuaW1wb3J0IHsgSW50ZWdTbmFwc2hvdFJ1bm5lciwgSW50ZWdUZXN0UnVubmVyIH0gZnJvbSAnLi4vLi4vcnVubmVyJztcbmltcG9ydCB0eXBlIHsgSW50ZWdUZXN0SW5mbyB9IGZyb20gJy4uLy4uL3J1bm5lci9pbnRlZ3JhdGlvbi10ZXN0cyc7XG5pbXBvcnQgeyBJbnRlZ1Rlc3QgfSBmcm9tICcuLi8uLi9ydW5uZXIvaW50ZWdyYXRpb24tdGVzdHMnO1xuaW1wb3J0IHR5cGUgeyBJbnRlZ1Rlc3RXb3JrZXJDb25maWcsIFNuYXBzaG90VmVyaWZpY2F0aW9uT3B0aW9ucywgRGlhZ25vc3RpYyB9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgeyBEaWFnbm9zdGljUmVhc29uLCBmb3JtYXRBc3NlcnRpb25SZXN1bHRzLCBmb3JtYXRFcnJvciB9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQgdHlwZSB7IEludGVnVGVzdEJhdGNoUmVxdWVzdCB9IGZyb20gJy4uL2ludGVnLXRlc3Qtd29ya2VyJztcbmltcG9ydCB0eXBlIHsgSW50ZWdXYXRjaE9wdGlvbnMgfSBmcm9tICcuLi9pbnRlZy13YXRjaC13b3JrZXInO1xuXG4vKipcbiAqIFJ1bnMgYSBzaW5nbGUgaW50ZWdyYXRpb24gdGVzdCBiYXRjaCByZXF1ZXN0LlxuICogSWYgdGhlIHRlc3QgZG9lcyBub3QgaGF2ZSBhbiBleGlzdGluZyBzbmFwc2hvdCxcbiAqIHRoaXMgd2lsbCBmaXJzdCBnZW5lcmF0ZSBhIHNuYXBzaG90IGFuZCB0aGVuIGV4ZWN1dGVcbiAqIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0cy5cbiAqXG4gKiBJZiB0aGUgdGVzdHMgc3VjY2VlZCBpdCB3aWxsIHRoZW4gc2F2ZSB0aGUgc25hcHNob3RcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGludGVnVGVzdFdvcmtlcihyZXF1ZXN0OiBJbnRlZ1Rlc3RCYXRjaFJlcXVlc3QpOiBQcm9taXNlPEludGVnVGVzdFdvcmtlckNvbmZpZ1tdPiB7XG4gIGNvbnN0IGZhaWx1cmVzOiBJbnRlZ1Rlc3RJbmZvW10gPSBbXTtcbiAgY29uc3QgdmVyYm9zaXR5ID0gcmVxdWVzdC52ZXJib3NpdHkgPz8gMDtcblxuICBmb3IgKGNvbnN0IHRlc3RJbmZvIG9mIHJlcXVlc3QudGVzdHMpIHtcbiAgICBjb25zdCB0ZXN0ID0gbmV3IEludGVnVGVzdCh7XG4gICAgICAuLi50ZXN0SW5mbyxcbiAgICAgIHdhdGNoOiByZXF1ZXN0LndhdGNoLFxuICAgIH0pOyAvLyBIeWRyYXRlIGZyb20gZGF0YVxuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBydW5uZXIgPSBuZXcgSW50ZWdUZXN0UnVubmVyKHtcbiAgICAgICAgZW5naW5lOiByZXF1ZXN0LmVuZ2luZSxcbiAgICAgICAgdGVzdCxcbiAgICAgICAgcHJvZmlsZTogcmVxdWVzdC5wcm9maWxlLFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICBBV1NfUkVHSU9OOiByZXF1ZXN0LnJlZ2lvbixcbiAgICAgICAgICBDREtfRE9DS0VSOiBwcm9jZXNzLmVudi5DREtfRE9DS0VSID8/ICdkb2NrZXInLFxuICAgICAgICB9LFxuICAgICAgICBzaG93T3V0cHV0OiB2ZXJib3NpdHkgPj0gMixcbiAgICAgIH0sIHRlc3RJbmZvLmRlc3RydWN0aXZlQ2hhbmdlcyk7XG5cbiAgICAgIGNvbnN0IHRlc3RzID0gYXdhaXQgcnVubmVyLmFjdHVhbFRlc3RzKCk7XG5cbiAgICAgIGlmICghdGVzdHMgfHwgT2JqZWN0LmtleXModGVzdHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRlc3RzIGRlZmluZWQgZm9yICR7cnVubmVyLnRlc3ROYW1lfWApO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB0ZXN0Q2FzZU5hbWUgb2YgT2JqZWN0LmtleXModGVzdHMpKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHJ1bm5lci5ydW5JbnRlZ1Rlc3RDYXNlKHtcbiAgICAgICAgICAgIHRlc3RDYXNlTmFtZSxcbiAgICAgICAgICAgIGNsZWFuOiByZXF1ZXN0LmNsZWFuLFxuICAgICAgICAgICAgZHJ5UnVuOiByZXF1ZXN0LmRyeVJ1bixcbiAgICAgICAgICAgIHVwZGF0ZVdvcmtmbG93OiByZXF1ZXN0LnVwZGF0ZVdvcmtmbG93LFxuICAgICAgICAgICAgdmVyYm9zaXR5LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZXN1bHRzICYmIE9iamVjdC52YWx1ZXMocmVzdWx0cykuc29tZShyZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ2ZhaWwnKSkge1xuICAgICAgICAgICAgZmFpbHVyZXMucHVzaCh0ZXN0SW5mbyk7XG4gICAgICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uQVNTRVJUSU9OX0ZBSUxFRCxcbiAgICAgICAgICAgICAgdGVzdE5hbWU6IGAke3J1bm5lci50ZXN0TmFtZX0tJHt0ZXN0Q2FzZU5hbWV9ICgke3JlcXVlc3QucHJvZmlsZX0vJHtyZXF1ZXN0LnJlZ2lvbn0pYCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0QXNzZXJ0aW9uUmVzdWx0cyhyZXN1bHRzKSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uVEVTVF9TVUNDRVNTLFxuICAgICAgICAgICAgICB0ZXN0TmFtZTogYCR7cnVubmVyLnRlc3ROYW1lfS0ke3Rlc3RDYXNlTmFtZX1gLFxuICAgICAgICAgICAgICBtZXNzYWdlOiByZXN1bHRzID8gZm9ybWF0QXNzZXJ0aW9uUmVzdWx0cyhyZXN1bHRzKSA6ICdOTyBBU1NFUlRJT05TJyxcbiAgICAgICAgICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGZhaWx1cmVzLnB1c2godGVzdEluZm8pO1xuICAgICAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uVEVTVF9GQUlMRUQsXG4gICAgICAgICAgICB0ZXN0TmFtZTogYCR7cnVubmVyLnRlc3ROYW1lfS0ke3Rlc3RDYXNlTmFtZX0gKCR7cmVxdWVzdC5wcm9maWxlfS8ke3JlcXVlc3QucmVnaW9ufSlgLFxuICAgICAgICAgICAgbWVzc2FnZTogYEludGVncmF0aW9uIHRlc3QgZmFpbGVkOiAke2Zvcm1hdEVycm9yKGUpfWAsXG4gICAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZmFpbHVyZXMucHVzaCh0ZXN0SW5mbyk7XG4gICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uVEVTVF9FUlJPUixcbiAgICAgICAgdGVzdE5hbWU6IGAke3Rlc3RJbmZvLmZpbGVOYW1lfSAoJHtyZXF1ZXN0LnByb2ZpbGV9LyR7cmVxdWVzdC5yZWdpb259KWAsXG4gICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgaW50ZWdyYXRpb24gdGVzdDogJHtmb3JtYXRFcnJvcihlKX1gLFxuICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhaWx1cmVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2F0Y2hUZXN0V29ya2VyKG9wdGlvbnM6IEludGVnV2F0Y2hPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHZlcmJvc2l0eSA9IG9wdGlvbnMudmVyYm9zaXR5ID8/IDA7XG4gIGNvbnN0IHRlc3QgPSBuZXcgSW50ZWdUZXN0KG9wdGlvbnMpO1xuICBjb25zdCBydW5uZXIgPSBuZXcgSW50ZWdUZXN0UnVubmVyKHtcbiAgICBlbmdpbmU6IG9wdGlvbnMuZW5naW5lLFxuICAgIHRlc3QsXG4gICAgcHJvZmlsZTogb3B0aW9ucy5wcm9maWxlLFxuICAgIGVudjoge1xuICAgICAgQVdTX1JFR0lPTjogb3B0aW9ucy5yZWdpb24sXG4gICAgICBDREtfRE9DS0VSOiBwcm9jZXNzLmVudi5DREtfRE9DS0VSID8/ICdkb2NrZXInLFxuICAgIH0sXG4gICAgc2hvd091dHB1dDogdmVyYm9zaXR5ID49IDIsXG4gIH0pO1xuICBydW5uZXIuY3JlYXRlQ2RrQ29udGV4dEpzb24oKTtcbiAgY29uc3QgdGVzdHMgPSBhd2FpdCBydW5uZXIuYWN0dWFsVGVzdHMoKTtcblxuICBpZiAoIXRlc3RzIHx8IE9iamVjdC5rZXlzKHRlc3RzKS5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHRlc3RzIGRlZmluZWQgZm9yICR7cnVubmVyLnRlc3ROYW1lfWApO1xuICB9XG4gIGZvciAoY29uc3QgdGVzdENhc2VOYW1lIG9mIE9iamVjdC5rZXlzKHRlc3RzKSkge1xuICAgIGF3YWl0IHJ1bm5lci53YXRjaEludGVnVGVzdCh7XG4gICAgICB0ZXN0Q2FzZU5hbWUsXG4gICAgICB2ZXJib3NpdHksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW5zIGEgc2luZ2xlIHNuYXBzaG90IHRlc3QgYmF0Y2ggcmVxdWVzdC5cbiAqIEZvciBlYWNoIGludGVncmF0aW9uIHRlc3QgdGhpcyB3aWxsIGNoZWNrIHRvIHNlZVxuICogaWYgdGhlcmUgaXMgYW4gZXhpc3Rpbmcgc25hcHNob3QsIGFuZCBpZiB0aGVyZSBpcyB3aWxsXG4gKiBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNuYXBzaG90VGVzdFdvcmtlcih0ZXN0SW5mbzogSW50ZWdUZXN0SW5mbywgb3B0aW9uczogU25hcHNob3RWZXJpZmljYXRpb25PcHRpb25zID0ge30pOiBQcm9taXNlPEludGVnVGVzdFdvcmtlckNvbmZpZ1tdPiB7XG4gIGNvbnN0IGZhaWxlZFRlc3RzID0gbmV3IEFycmF5PEludGVnVGVzdFdvcmtlckNvbmZpZz4oKTtcbiAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBjb25zdCB0ZXN0ID0gbmV3IEludGVnVGVzdCh0ZXN0SW5mbyk7IC8vIEh5ZHJhdGUgdGhlIGRhdGEgcmVjb3JkIGFnYWluXG5cbiAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX0VSUk9SLFxuICAgICAgdGVzdE5hbWU6IHRlc3QudGVzdE5hbWUsXG4gICAgICBtZXNzYWdlOiAnVGVzdCBpcyB0YWtpbmcgYSB2ZXJ5IGxvbmcgdGltZScsXG4gICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgIH0pO1xuICB9LCA2MF8wMDApO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcnVubmVyID0gbmV3IEludGVnU25hcHNob3RSdW5uZXIoe1xuICAgICAgZW5naW5lOiBvcHRpb25zLmVuZ2luZSxcbiAgICAgIHRlc3QsXG4gICAgICBzaG93T3V0cHV0OiBvcHRpb25zLnZlcmJvc2UgPz8gZmFsc2UsXG4gICAgfSk7XG4gICAgaWYgKCFydW5uZXIuaGFzU25hcHNob3QoKSkge1xuICAgICAgd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLk5PX1NOQVBTSE9ULFxuICAgICAgICB0ZXN0TmFtZTogdGVzdC50ZXN0TmFtZSxcbiAgICAgICAgbWVzc2FnZTogJ05vIFNuYXBzaG90JyxcbiAgICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICAgIH0pO1xuICAgICAgZmFpbGVkVGVzdHMucHVzaCh0ZXN0LmluZm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IGRpYWdub3N0aWNzLCBkZXN0cnVjdGl2ZUNoYW5nZXMgfSA9IGF3YWl0IHJ1bm5lci50ZXN0U25hcHNob3Qob3B0aW9ucyk7XG4gICAgICBpZiAoZGlhZ25vc3RpY3MubGVuZ3RoID4gMCkge1xuICAgICAgICBkaWFnbm9zdGljcy5mb3JFYWNoKGRpYWdub3N0aWMgPT4gd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgICAgICAuLi5kaWFnbm9zdGljLFxuICAgICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICAgIH0gYXMgRGlhZ25vc3RpYykpO1xuICAgICAgICBmYWlsZWRUZXN0cy5wdXNoKHtcbiAgICAgICAgICAuLi50ZXN0LmluZm8sXG4gICAgICAgICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX1NVQ0NFU1MsXG4gICAgICAgICAgdGVzdE5hbWU6IHRlc3QudGVzdE5hbWUsXG4gICAgICAgICAgbWVzc2FnZTogJ1N1Y2Nlc3MnLFxuICAgICAgICAgIGR1cmF0aW9uOiAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDAsXG4gICAgICAgIH0gYXMgRGlhZ25vc3RpYyk7XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICBmYWlsZWRUZXN0cy5wdXNoKHRlc3QuaW5mbyk7XG4gICAgd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgIG1lc3NhZ2U6IGZvcm1hdEVycm9yKGUpLFxuICAgICAgdGVzdE5hbWU6IHRlc3QudGVzdE5hbWUsXG4gICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfRVJST1IsXG4gICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgIH0gYXMgRGlhZ25vc3RpYyk7XG4gIH0gZmluYWxseSB7XG4gICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgfVxuXG4gIHJldHVybiBmYWlsZWRUZXN0cztcbn1cblxud29ya2VycG9vbC53b3JrZXIoe1xuICBzbmFwc2hvdFRlc3RXb3JrZXIsXG4gIGludGVnVGVzdFdvcmtlcixcbiAgd2F0Y2hUZXN0V29ya2VyLFxufSk7XG4iXX0=