@aws-cdk/integ-runner
Version:
CDK Integration Testing Tool
101 lines • 14.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.runIntegrationTests = runIntegrationTests;
exports.runIntegrationTestsInParallel = runIntegrationTestsInParallel;
const common_1 = require("./common");
const logger = require("../logger");
const utils_1 = require("../utils");
/**
* Run Integration tests.
*/
async function runIntegrationTests(options) {
logger.highlight('\nRunning integration tests for failed tests...\n');
logger.print('Running in parallel across %sregions: %s', options.profiles ? `profiles ${options.profiles.join(', ')} and ` : '', options.regions.join(', '));
const totalTests = options.tests.length;
const responses = await runIntegrationTestsInParallel(options);
logger.highlight('\nTest Results: \n');
(0, common_1.printSummary)(totalTests, responses.failedTests.length);
return {
success: responses.failedTests.length === 0,
metrics: responses.metrics,
};
}
/**
* Returns a list of AccountWorkers based on the list of regions and profiles
* given to the CLI.
*/
function getAccountWorkers(regions, profiles) {
const workers = [];
function pushWorker(profile) {
for (const region of regions) {
workers.push({
region,
profile,
});
}
}
if (profiles && profiles.length > 0) {
for (const profile of profiles ?? []) {
pushWorker(profile);
}
}
else {
pushWorker();
}
return workers;
}
/**
* Runs a set of integration tests in parallel across a list of AWS regions.
* Only a single test can be run at a time in a given region. Once a region
* is done running a test, the next test will be pulled from the queue
*/
async function runIntegrationTestsInParallel(options) {
const queue = options.tests;
const results = {
metrics: [],
failedTests: [],
};
const accountWorkers = getAccountWorkers(options.regions, options.profiles);
async function runTest(worker) {
const start = Date.now();
const tests = {};
do {
const test = queue.pop();
if (!test)
break;
const testStart = Date.now();
logger.highlight(`Running test ${test.fileName} in ${worker.profile ? worker.profile + '/' : ''}${worker.region}`);
const response = await options.pool.exec('integTestWorker', [{
watch: options.watch,
region: worker.region,
profile: worker.profile,
tests: [test],
clean: options.clean,
dryRun: options.dryRun,
verbosity: options.verbosity,
updateWorkflow: options.updateWorkflow,
proxy: options.proxy,
caBundlePath: options.caBundlePath,
}], {
on: common_1.printResults,
});
results.failedTests.push(...(0, utils_1.flatten)(response));
tests[test.fileName] = (Date.now() - testStart) / 1000;
} while (queue.length > 0);
const metrics = {
region: worker.region,
profile: worker.profile,
duration: (Date.now() - start) / 1000,
tests,
};
if (Object.keys(tests).length > 0) {
results.metrics.push(metrics);
}
}
const workers = accountWorkers.map((worker) => runTest(worker));
// Workers are their own concurrency limits
// eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
await Promise.all(workers);
return results;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWctdGVzdC13b3JrZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnRlZy10ZXN0LXdvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQStDQSxrREFlQztBQWlERCxzRUFvREM7QUFqS0QscUNBQXNEO0FBQ3RELG9DQUFvQztBQUVwQyxvQ0FBbUM7QUF1Q25DOztHQUVHO0FBQ0ksS0FBSyxVQUFVLG1CQUFtQixDQUFDLE9BQTRCO0lBQ3BFLE1BQU0sQ0FBQyxTQUFTLENBQUMsbURBQW1ELENBQUMsQ0FBQztJQUN0RSxNQUFNLENBQUMsS0FBSyxDQUNWLDBDQUEwQyxFQUMxQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUEsQ0FBQyxDQUFDLEVBQUUsRUFDckUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUV4QyxNQUFNLFNBQVMsR0FBRyxNQUFNLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9ELE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN2QyxJQUFBLHFCQUFZLEVBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsT0FBTztRQUNMLE9BQU8sRUFBRSxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQzNDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTztLQUMzQixDQUFDO0FBQ0osQ0FBQztBQW9CRDs7O0dBR0c7QUFDSCxTQUFTLGlCQUFpQixDQUFDLE9BQWlCLEVBQUUsUUFBbUI7SUFDL0QsTUFBTSxPQUFPLEdBQW9CLEVBQUUsQ0FBQztJQUNwQyxTQUFTLFVBQVUsQ0FBQyxPQUFnQjtRQUNsQyxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1gsTUFBTTtnQkFDTixPQUFPO2FBQ1IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BDLEtBQUssTUFBTSxPQUFPLElBQUksUUFBUSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3JDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixVQUFVLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSw2QkFBNkIsQ0FDakQsT0FBNEI7SUFFNUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM1QixNQUFNLE9BQU8sR0FBdUI7UUFDbEMsT0FBTyxFQUFFLEVBQUU7UUFDWCxXQUFXLEVBQUUsRUFBRTtLQUNoQixDQUFDO0lBQ0YsTUFBTSxjQUFjLEdBQW9CLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTdGLEtBQUssVUFBVSxPQUFPLENBQUMsTUFBcUI7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFtQyxFQUFFLENBQUM7UUFDakQsR0FBRyxDQUFDO1lBQ0YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxJQUFJO2dCQUFFLE1BQU07WUFDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxRQUFRLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNuSCxNQUFNLFFBQVEsR0FBc0IsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUM5RSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7b0JBQ3BCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtvQkFDckIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO29CQUN2QixLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO29CQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07b0JBQ3RCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDNUIsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjO29CQUN0QyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7b0JBQ3BCLFlBQVksRUFBRSxPQUFPLENBQUMsWUFBWTtpQkFDbkMsQ0FBQyxFQUFFO2dCQUNGLEVBQUUsRUFBRSxxQkFBWTthQUNqQixDQUFDLENBQUM7WUFFSCxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUEsZUFBTyxFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDL0MsS0FBSyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDekQsQ0FBQyxRQUFRLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzNCLE1BQU0sT0FBTyxHQUF1QjtZQUNsQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJO1lBQ3JDLEtBQUs7U0FDTixDQUFDO1FBQ0YsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLDJDQUEyQztJQUMzQyx3RUFBd0U7SUFDeEUsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzNCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIHdvcmtlcnBvb2wgZnJvbSAnd29ya2VycG9vbCc7XG5pbXBvcnQgdHlwZSB7IEludGVnQmF0Y2hSZXNwb25zZSwgSW50ZWdUZXN0T3B0aW9ucywgSW50ZWdSdW5uZXJNZXRyaWNzIH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgcHJpbnRSZXN1bHRzLCBwcmludFN1bW1hcnkgfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB0eXBlIHsgSW50ZWdUZXN0SW5mbyB9IGZyb20gJy4uL3J1bm5lci9pbnRlZ3JhdGlvbi10ZXN0cyc7XG5pbXBvcnQgeyBmbGF0dGVuIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGFuIGludGVncmF0aW9uIHRlc3QgYmF0Y2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlZ1Rlc3RCYXRjaFJlcXVlc3QgZXh0ZW5kcyBJbnRlZ1Rlc3RPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBBV1MgcmVnaW9uIHRvIHJ1biB0aGlzIGJhdGNoIGluXG4gICAqL1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFXUyBwcm9maWxlIHRvIHVzZSB3aGVuIHJ1bm5pbmcgdGhpcyB0ZXN0XG4gICAqL1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHJ1bm5pbmcgYWxsIGludGVncmF0aW9uIHRlc3RzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdUZXN0UnVuT3B0aW9ucyBleHRlbmRzIEludGVnVGVzdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHJlZ2lvbnMgdG8gcnVuIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0cyBhY3Jvc3MuXG4gICAqIFRoaXMgYWxsb3dzIHRoZSBydW5uZXIgdG8gcnVuIGludGVncmF0aW9uIHRlc3RzIGluIHBhcmFsbGVsXG4gICAqL1xuICByZWFkb25seSByZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiBBV1MgcHJvZmlsZXMuIFRoaXMgd2lsbCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYHJlZ2lvbnNgXG4gICAqIHRvIHJ1biB0ZXN0cyBpbiBwYXJhbGxlbCBhY3Jvc3MgYWNjb3VudHMgKyByZWdpb25zXG4gICAqL1xuICByZWFkb25seSBwcm9maWxlcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya2VycG9vbCB0byB1c2VcbiAgICovXG4gIHJlYWRvbmx5IHBvb2w6IHdvcmtlcnBvb2wuV29ya2VyUG9vbDtcbn1cblxuLyoqXG4gKiBSdW4gSW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5JbnRlZ3JhdGlvblRlc3RzKG9wdGlvbnM6IEludGVnVGVzdFJ1bk9wdGlvbnMpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgbWV0cmljczogSW50ZWdSdW5uZXJNZXRyaWNzW10gfT4ge1xuICBsb2dnZXIuaGlnaGxpZ2h0KCdcXG5SdW5uaW5nIGludGVncmF0aW9uIHRlc3RzIGZvciBmYWlsZWQgdGVzdHMuLi5cXG4nKTtcbiAgbG9nZ2VyLnByaW50KFxuICAgICdSdW5uaW5nIGluIHBhcmFsbGVsIGFjcm9zcyAlc3JlZ2lvbnM6ICVzJyxcbiAgICBvcHRpb25zLnByb2ZpbGVzID8gYHByb2ZpbGVzICR7b3B0aW9ucy5wcm9maWxlcy5qb2luKCcsICcpfSBhbmQgYDogJycsXG4gICAgb3B0aW9ucy5yZWdpb25zLmpvaW4oJywgJykpO1xuICBjb25zdCB0b3RhbFRlc3RzID0gb3B0aW9ucy50ZXN0cy5sZW5ndGg7XG5cbiAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgcnVuSW50ZWdyYXRpb25UZXN0c0luUGFyYWxsZWwob3B0aW9ucyk7XG4gIGxvZ2dlci5oaWdobGlnaHQoJ1xcblRlc3QgUmVzdWx0czogXFxuJyk7XG4gIHByaW50U3VtbWFyeSh0b3RhbFRlc3RzLCByZXNwb25zZXMuZmFpbGVkVGVzdHMubGVuZ3RoKTtcbiAgcmV0dXJuIHtcbiAgICBzdWNjZXNzOiByZXNwb25zZXMuZmFpbGVkVGVzdHMubGVuZ3RoID09PSAwLFxuICAgIG1ldHJpY3M6IHJlc3BvbnNlcy5tZXRyaWNzLFxuICB9O1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB3b3JrZXIgZm9yIGEgc2luZ2xlIGFjY291bnQgKyByZWdpb25cbiAqL1xuaW50ZXJmYWNlIEFjY291bnRXb3JrZXIge1xuICAvKipcbiAgICogVGhlIHJlZ2lvbiB0aGUgd29ya2VyIHNob3VsZCBydW4gaW5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIHByb2ZpbGUgdGhhdCB0aGUgd29ya2VyIHNob3VsZCB1c2VcbiAgICogVGhpcyB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgJy0tcHJvZmlsZScgb3B0aW9uIHRvIHRoZSBDREsgQ0xJXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGVmYXVsdCBwcm9maWxlXG4gICAqL1xuICByZWFkb25seSBwcm9maWxlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBsaXN0IG9mIEFjY291bnRXb3JrZXJzIGJhc2VkIG9uIHRoZSBsaXN0IG9mIHJlZ2lvbnMgYW5kIHByb2ZpbGVzXG4gKiBnaXZlbiB0byB0aGUgQ0xJLlxuICovXG5mdW5jdGlvbiBnZXRBY2NvdW50V29ya2VycyhyZWdpb25zOiBzdHJpbmdbXSwgcHJvZmlsZXM/OiBzdHJpbmdbXSk6IEFjY291bnRXb3JrZXJbXSB7XG4gIGNvbnN0IHdvcmtlcnM6IEFjY291bnRXb3JrZXJbXSA9IFtdO1xuICBmdW5jdGlvbiBwdXNoV29ya2VyKHByb2ZpbGU/OiBzdHJpbmcpIHtcbiAgICBmb3IgKGNvbnN0IHJlZ2lvbiBvZiByZWdpb25zKSB7XG4gICAgICB3b3JrZXJzLnB1c2goe1xuICAgICAgICByZWdpb24sXG4gICAgICAgIHByb2ZpbGUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb2ZpbGVzICYmIHByb2ZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IgKGNvbnN0IHByb2ZpbGUgb2YgcHJvZmlsZXMgPz8gW10pIHtcbiAgICAgIHB1c2hXb3JrZXIocHJvZmlsZSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHB1c2hXb3JrZXIoKTtcbiAgfVxuICByZXR1cm4gd29ya2Vycztcbn1cblxuLyoqXG4gKiBSdW5zIGEgc2V0IG9mIGludGVncmF0aW9uIHRlc3RzIGluIHBhcmFsbGVsIGFjcm9zcyBhIGxpc3Qgb2YgQVdTIHJlZ2lvbnMuXG4gKiBPbmx5IGEgc2luZ2xlIHRlc3QgY2FuIGJlIHJ1biBhdCBhIHRpbWUgaW4gYSBnaXZlbiByZWdpb24uIE9uY2UgYSByZWdpb25cbiAqIGlzIGRvbmUgcnVubmluZyBhIHRlc3QsIHRoZSBuZXh0IHRlc3Qgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgcXVldWVcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkludGVncmF0aW9uVGVzdHNJblBhcmFsbGVsKFxuICBvcHRpb25zOiBJbnRlZ1Rlc3RSdW5PcHRpb25zLFxuKTogUHJvbWlzZTxJbnRlZ0JhdGNoUmVzcG9uc2U+IHtcbiAgY29uc3QgcXVldWUgPSBvcHRpb25zLnRlc3RzO1xuICBjb25zdCByZXN1bHRzOiBJbnRlZ0JhdGNoUmVzcG9uc2UgPSB7XG4gICAgbWV0cmljczogW10sXG4gICAgZmFpbGVkVGVzdHM6IFtdLFxuICB9O1xuICBjb25zdCBhY2NvdW50V29ya2VyczogQWNjb3VudFdvcmtlcltdID0gZ2V0QWNjb3VudFdvcmtlcnMob3B0aW9ucy5yZWdpb25zLCBvcHRpb25zLnByb2ZpbGVzKTtcblxuICBhc3luYyBmdW5jdGlvbiBydW5UZXN0KHdvcmtlcjogQWNjb3VudFdvcmtlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCB0ZXN0czogeyBbdGVzdE5hbWU6IHN0cmluZ106IG51bWJlciB9ID0ge307XG4gICAgZG8ge1xuICAgICAgY29uc3QgdGVzdCA9IHF1ZXVlLnBvcCgpO1xuICAgICAgaWYgKCF0ZXN0KSBicmVhaztcbiAgICAgIGNvbnN0IHRlc3RTdGFydCA9IERhdGUubm93KCk7XG4gICAgICBsb2dnZXIuaGlnaGxpZ2h0KGBSdW5uaW5nIHRlc3QgJHt0ZXN0LmZpbGVOYW1lfSBpbiAke3dvcmtlci5wcm9maWxlID8gd29ya2VyLnByb2ZpbGUgKyAnLycgOiAnJ30ke3dvcmtlci5yZWdpb259YCk7XG4gICAgICBjb25zdCByZXNwb25zZTogSW50ZWdUZXN0SW5mb1tdW10gPSBhd2FpdCBvcHRpb25zLnBvb2wuZXhlYygnaW50ZWdUZXN0V29ya2VyJywgW3tcbiAgICAgICAgd2F0Y2g6IG9wdGlvbnMud2F0Y2gsXG4gICAgICAgIHJlZ2lvbjogd29ya2VyLnJlZ2lvbixcbiAgICAgICAgcHJvZmlsZTogd29ya2VyLnByb2ZpbGUsXG4gICAgICAgIHRlc3RzOiBbdGVzdF0sXG4gICAgICAgIGNsZWFuOiBvcHRpb25zLmNsZWFuLFxuICAgICAgICBkcnlSdW46IG9wdGlvbnMuZHJ5UnVuLFxuICAgICAgICB2ZXJib3NpdHk6IG9wdGlvbnMudmVyYm9zaXR5LFxuICAgICAgICB1cGRhdGVXb3JrZmxvdzogb3B0aW9ucy51cGRhdGVXb3JrZmxvdyxcbiAgICAgICAgcHJveHk6IG9wdGlvbnMucHJveHksXG4gICAgICAgIGNhQnVuZGxlUGF0aDogb3B0aW9ucy5jYUJ1bmRsZVBhdGgsXG4gICAgICB9XSwge1xuICAgICAgICBvbjogcHJpbnRSZXN1bHRzLFxuICAgICAgfSk7XG5cbiAgICAgIHJlc3VsdHMuZmFpbGVkVGVzdHMucHVzaCguLi5mbGF0dGVuKHJlc3BvbnNlKSk7XG4gICAgICB0ZXN0c1t0ZXN0LmZpbGVOYW1lXSA9IChEYXRlLm5vdygpIC0gdGVzdFN0YXJ0KSAvIDEwMDA7XG4gICAgfSB3aGlsZSAocXVldWUubGVuZ3RoID4gMCk7XG4gICAgY29uc3QgbWV0cmljczogSW50ZWdSdW5uZXJNZXRyaWNzID0ge1xuICAgICAgcmVnaW9uOiB3b3JrZXIucmVnaW9uLFxuICAgICAgcHJvZmlsZTogd29ya2VyLnByb2ZpbGUsXG4gICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgdGVzdHMsXG4gICAgfTtcbiAgICBpZiAoT2JqZWN0LmtleXModGVzdHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3VsdHMubWV0cmljcy5wdXNoKG1ldHJpY3MpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHdvcmtlcnMgPSBhY2NvdW50V29ya2Vycy5tYXAoKHdvcmtlcikgPT4gcnVuVGVzdCh3b3JrZXIpKTtcbiAgLy8gV29ya2VycyBhcmUgdGhlaXIgb3duIGNvbmN1cnJlbmN5IGxpbWl0c1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGNka2xhYnMvcHJvbWlzZWFsbC1uby11bmJvdW5kZWQtcGFyYWxsZWxpc21cbiAgYXdhaXQgUHJvbWlzZS5hbGwod29ya2Vycyk7XG4gIHJldHVybiByZXN1bHRzO1xufVxuIl19