aws-cdk
Version:
CDK Toolkit, the command line tool for CDK apps
448 lines • 75.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const work_graph_1 = require("../lib/util/work-graph");
const work_graph_types_1 = require("../lib/util/work-graph-types");
const DUMMY = 'DUMMY';
const sleep = async (duration) => new Promise((resolve) => setTimeout(() => resolve(), duration));
// Not great to have actual sleeps in the tests, but they mostly just exist to give the async workflow
// a chance to start new tasks.
const SLOW = 200;
/**
* Repurposing unused stack attributes to create specific test scenarios
* - stack.name = deployment duration
* - stack.displayName = error message
*/
describe('WorkGraph', () => {
const actionedAssets = [];
const callbacks = {
deployStack: async (x) => {
const errorMessage = x.stack.displayName;
const timeout = Number(x.stack.stackName) || 0;
await sleep(timeout);
// Special case for testing NestedCloudAssemblyArtifacts
if (errorMessage && !errorMessage.startsWith('Nested')) {
throw Error(errorMessage);
}
actionedAssets.push(x.id);
},
buildAsset: async (x) => {
const errorMessage = x.parentStack.displayName;
const timeout = Number(x.parentStack.stackName) || 0;
await sleep(timeout);
if (errorMessage) {
throw Error(errorMessage);
}
actionedAssets.push(x.id);
},
publishAsset: async (x) => {
const errorMessage = x.parentStack.displayName;
const timeout = Number(x.parentStack.stackName) || 0;
await sleep(timeout);
if (errorMessage) {
throw Error(errorMessage);
}
actionedAssets.push(x.id);
},
};
beforeEach(() => {
actionedAssets.splice(0);
});
// Success
test.each([
// Concurrency 1
{ scenario: 'No Stacks', concurrency: 1, toDeploy: [], expected: [] },
{ scenario: 'A', concurrency: 1, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }]), expected: ['A'] },
{ scenario: 'A, B', concurrency: 1, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }, { id: 'B', type: 'stack' }]), expected: ['A', 'B'] },
{ scenario: 'A -> B', concurrency: 1, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }, { id: 'B', type: 'stack', stackDependencies: ['A'] }]), expected: ['A', 'B'] },
{ scenario: '[unsorted] A -> B', concurrency: 1, toDeploy: createArtifacts([{ id: 'B', type: 'stack', stackDependencies: ['A'] }, { id: 'A', type: 'stack' }]), expected: ['A', 'B'] },
{ scenario: 'A -> B -> C', concurrency: 1, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }, { id: 'B', type: 'stack', stackDependencies: ['A'] }, { id: 'C', type: 'stack', stackDependencies: ['B'] }]), expected: ['A', 'B', 'C'] },
{ scenario: 'A -> B, A -> C', concurrency: 1, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }, { id: 'B', type: 'stack', stackDependencies: ['A'] }, { id: 'C', type: 'stack', stackDependencies: ['A'] }]), expected: ['A', 'B', 'C'] },
{
scenario: 'A (slow), B',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', name: SLOW },
{ id: 'B', type: 'stack' },
]),
expected: ['A', 'B'],
},
{
scenario: 'A -> B, C -> D',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack' },
{ id: 'B', type: 'stack', stackDependencies: ['A'] },
{ id: 'C', type: 'stack' },
{ id: 'D', type: 'stack', stackDependencies: ['C'] },
]),
expected: ['A', 'C', 'B', 'D'],
},
{
scenario: 'A (slow) -> B, C -> D',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', name: SLOW },
{ id: 'B', type: 'stack', stackDependencies: ['A'] },
{ id: 'C', type: 'stack' },
{ id: 'D', type: 'stack', stackDependencies: ['C'] },
]),
expected: ['A', 'C', 'B', 'D'],
},
// With Assets
{
scenario: 'A -> a',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', assetDependencies: ['a'] },
{ id: 'a', type: 'asset' },
]),
expected: ['a-build', 'a-publish', 'A'],
},
{
scenario: 'A -> [a, B]',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', stackDependencies: ['B'], assetDependencies: ['a'] },
{ id: 'B', type: 'stack' },
{ id: 'a', type: 'asset', name: SLOW },
]),
expected: ['B', 'a-build', 'a-publish', 'A'],
},
{
scenario: 'A -> a, B -> b',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', assetDependencies: ['a'] },
{ id: 'B', type: 'stack', assetDependencies: ['b'] },
{ id: 'a', type: 'asset' },
{ id: 'b', type: 'asset' },
]),
expected: ['a-build', 'b-build', 'a-publish', 'b-publish', 'A', 'B'],
},
{
scenario: 'A, B -> b -> A',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack' },
{ id: 'B', type: 'stack', assetDependencies: ['b'] },
{ id: 'b', type: 'asset', stackDependencies: ['A'] },
]),
expected: ['A', 'b-build', 'b-publish', 'B'],
},
// Concurrency 2
{ scenario: 'No Stacks', concurrency: 2, toDeploy: [], expected: [] },
{ scenario: 'A', concurrency: 2, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }]), expected: ['A'] },
{ scenario: 'A, B', concurrency: 2, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }, { id: 'B', type: 'stack' }]), expected: ['A', 'B'] },
{ scenario: 'A -> B', concurrency: 2, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }, { id: 'B', type: 'stack', stackDependencies: ['A'] }]), expected: ['A', 'B'] },
{ scenario: '[unsorted] A -> B', concurrency: 2, toDeploy: createArtifacts([{ id: 'B', type: 'stack', stackDependencies: ['A'] }, { id: 'A', type: 'stack' }]), expected: ['A', 'B'] },
{ scenario: 'A -> B -> C', concurrency: 2, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }, { id: 'B', type: 'stack', stackDependencies: ['A'] }, { id: 'C', type: 'stack', stackDependencies: ['B'] }]), expected: ['A', 'B', 'C'] },
{ scenario: 'A -> B, A -> C', concurrency: 2, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }, { id: 'B', type: 'stack', stackDependencies: ['A'] }, { id: 'C', type: 'stack', stackDependencies: ['A'] }]), expected: ['A', 'B', 'C'] },
{
scenario: 'A, B',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', name: SLOW },
{ id: 'B', type: 'stack' },
]),
expected: ['B', 'A'],
},
{
scenario: 'A -> B, C -> D',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack' },
{ id: 'B', type: 'stack', stackDependencies: ['A'] },
{ id: 'C', type: 'stack' },
{ id: 'D', type: 'stack', stackDependencies: ['C'] },
]),
expected: ['A', 'C', 'B', 'D'],
},
{
scenario: 'A (slow) -> B, C -> D',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', name: SLOW },
{ id: 'B', type: 'stack', stackDependencies: ['A'] },
{ id: 'C', type: 'stack' },
{ id: 'D', type: 'stack', stackDependencies: ['C'] },
]),
expected: ['C', 'D', 'A', 'B'],
},
{
scenario: 'A -> B, A not selected',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'B', type: 'stack', stackDependencies: ['A'] },
]),
expected: ['B'],
},
// With Assets
{
scenario: 'A -> a',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', assetDependencies: ['a'] },
{ id: 'a', type: 'asset' },
]),
expected: ['a-build', 'a-publish', 'A'],
},
{
scenario: 'A -> [a, B]',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', stackDependencies: ['B'], assetDependencies: ['a'] },
{ id: 'B', type: 'stack', name: SLOW },
{ id: 'a', type: 'asset' },
]),
expected: ['a-build', 'a-publish', 'B', 'A'],
},
{
scenario: 'A -> a, B -> b',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', assetDependencies: ['a'] },
{ id: 'B', type: 'stack', assetDependencies: ['b'] },
{ id: 'a', type: 'asset' },
{ id: 'b', type: 'asset' },
]),
expected: ['a-build', 'b-build', 'a-publish', 'b-publish', 'A', 'B'],
},
{
scenario: 'A, B -> b -> A',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack' },
{ id: 'B', type: 'stack', assetDependencies: ['b'] },
{ id: 'b', type: 'asset', stackDependencies: ['A'] },
]),
expected: ['A', 'b-build', 'b-publish', 'B'],
},
{
scenario: 'A, B -> [b, c], b -> A',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', name: SLOW },
{ id: 'B', type: 'stack', assetDependencies: ['b', 'c'] },
{ id: 'b', type: 'asset', stackDependencies: ['A'] },
{ id: 'c', type: 'asset' },
]),
expected: ['c-build', 'c-publish', 'A', 'b-build', 'b-publish', 'B'],
},
])('Success - Concurrency: $concurrency - $scenario', async ({ concurrency, expected, toDeploy }) => {
const graph = new work_graph_1.WorkGraph();
addTestArtifactsToGraph(toDeploy, graph);
await graph.doParallel(concurrency, callbacks);
expect(actionedAssets).toStrictEqual(expected);
});
test('can remove unnecessary assets', async () => {
const graph = new work_graph_1.WorkGraph();
addTestArtifactsToGraph([
{ id: 'a', type: 'asset' },
{ id: 'b', type: 'asset' },
{ id: 'A', type: 'stack', assetDependencies: ['a', 'b'] },
], graph);
// Remove 'b' from the graph
await graph.removeUnnecessaryAssets(node => Promise.resolve(node.id.startsWith('b')));
await graph.doParallel(1, callbacks);
// We expect to only see 'a' and 'A'
expect(actionedAssets).toEqual(['a-build', 'a-publish', 'A']);
});
// Failure Concurrency
test.each([
// Concurrency 1
{ scenario: 'A (error)', concurrency: 1, toDeploy: createArtifacts([{ id: 'A', type: 'stack', displayName: 'A' }]), expectedError: 'A', expected: [] },
{ scenario: 'A (error), B', concurrency: 1, toDeploy: createArtifacts([{ id: 'A', type: 'stack', displayName: 'A' }, { id: 'B', type: 'stack' }]), expectedError: 'A', expected: [] },
{ scenario: 'A, B (error)', concurrency: 1, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }, { id: 'B', type: 'stack', displayName: 'B' }]), expectedError: 'B', expected: ['A'] },
{ scenario: 'A (error) -> B', concurrency: 1, toDeploy: createArtifacts([{ id: 'A', type: 'stack', displayName: 'A' }, { id: 'B', type: 'stack', stackDependencies: ['A'] }]), expectedError: 'A', expected: [] },
{ scenario: '[unsorted] A (error) -> B', concurrency: 1, toDeploy: createArtifacts([{ id: 'B', type: 'stack', stackDependencies: ['A'] }, { id: 'A', type: 'stack', displayName: 'A' }]), expectedError: 'A', expected: [] },
{
scenario: 'A (error) -> B, C -> D',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', displayName: 'A' },
{ id: 'B', type: 'stack', stackDependencies: ['A'] },
{ id: 'C', type: 'stack' },
{ id: 'D', type: 'stack', stackDependencies: ['C'] },
]),
expectedError: 'A',
expected: [],
},
{
scenario: 'A -> B, C (error) -> D',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack' },
{ id: 'B', type: 'stack', stackDependencies: ['A'] },
{ id: 'C', type: 'stack', displayName: 'C', name: SLOW },
{ id: 'D', type: 'stack', stackDependencies: ['C'] },
]),
expectedError: 'C',
expected: ['A'],
},
// With assets
{
scenario: 'A -> b (asset build error)',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', assetDependencies: ['b'] },
{ id: 'b', type: 'asset', displayName: 'build-b' },
]),
expectedError: 'build-b',
expected: [],
},
{
scenario: 'A -> b (asset publish error)',
concurrency: 1,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', assetDependencies: ['b'] },
{ id: 'b', type: 'asset', displayName: 'publish-b' },
]),
expectedError: 'publish-b',
expected: ['b-build'],
},
// Concurrency 2
{ scenario: 'A (error)', concurrency: 2, toDeploy: createArtifacts([{ id: 'A', type: 'stack', displayName: 'A' }]), expectedError: 'A', expected: [] },
{ scenario: 'A (error), B', concurrency: 2, toDeploy: createArtifacts([{ id: 'A', type: 'stack', displayName: 'A' }, { id: 'B', type: 'stack' }]), expectedError: 'A', expected: ['B'] },
{ scenario: 'A, B (error)', concurrency: 2, toDeploy: createArtifacts([{ id: 'A', type: 'stack' }, { id: 'B', type: 'stack', displayName: 'B' }]), expectedError: 'B', expected: ['A'] },
{ scenario: 'A (error) -> B', concurrency: 2, toDeploy: createArtifacts([{ id: 'A', type: 'stack', displayName: 'A' }, { id: 'B', type: 'stack', stackDependencies: ['A'] }]), expectedError: 'A', expected: [] },
{ scenario: '[unsorted] A (error) -> B', concurrency: 2, toDeploy: createArtifacts([{ id: 'B', type: 'stack', stackDependencies: ['A'] }, { id: 'A', type: 'stack', displayName: 'A' }]), expectedError: 'A', expected: [] },
{
scenario: 'A (error) -> B, C -> D',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', displayName: 'A' },
{ id: 'B', type: 'stack', stackDependencies: ['A'] },
{ id: 'C', type: 'stack' },
{ id: 'D', type: 'stack', stackDependencies: ['C'] },
]),
expectedError: 'A',
expected: ['C'],
},
{
scenario: 'A -> B, C (error) -> D',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack' },
{ id: 'B', type: 'stack', stackDependencies: ['A'] },
{ id: 'C', type: 'stack', displayName: 'C', name: SLOW },
{ id: 'D', type: 'stack', stackDependencies: ['C'] },
]),
expectedError: 'C',
expected: ['A', 'B'],
},
// With assets
{
scenario: 'A -> b (asset build error), C',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', assetDependencies: ['b'] },
{ id: 'b', type: 'asset', displayName: 'build-b' },
{ id: 'C', type: 'stack' },
]),
expectedError: 'build-b',
expected: ['C'],
},
{
scenario: 'A -> b (asset publish error), C',
concurrency: 2,
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', assetDependencies: ['b'] },
{ id: 'b', type: 'asset', displayName: 'publish-b' },
{ id: 'C', type: 'stack' },
]),
expectedError: 'publish-b',
expected: ['b-build', 'C'],
},
])('Failure - Concurrency: $concurrency - $scenario', async ({ concurrency, expectedError, toDeploy, expected }) => {
const graph = new work_graph_1.WorkGraph();
addTestArtifactsToGraph(toDeploy, graph);
await expect(graph.doParallel(concurrency, callbacks)).rejects.toThrowError(expectedError);
expect(actionedAssets).toStrictEqual(expected);
});
// Failure Graph Circular Dependencies
test.each([
{
scenario: 'A -> A',
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', stackDependencies: ['A'] },
]),
expectedError: 'A -> A',
},
{
scenario: 'A -> B, B -> A',
toDeploy: createArtifacts([
{ id: 'A', type: 'stack', stackDependencies: ['B'] },
{ id: 'B', type: 'stack', stackDependencies: ['A'] },
]),
expectedError: 'A -> B -> A',
},
{
scenario: 'A, B -> C, C -> D, D -> B',
toDeploy: createArtifacts([
{ id: 'A', type: 'stack' },
{ id: 'B', type: 'stack', stackDependencies: ['C'] },
{ id: 'C', type: 'stack', stackDependencies: ['D'] },
{ id: 'D', type: 'stack', stackDependencies: ['B'] },
]),
expectedError: 'B -> C -> D -> B',
},
])('Failure - Graph Circular Dependencies - $scenario', async ({ toDeploy, expectedError }) => {
const graph = new work_graph_1.WorkGraph();
addTestArtifactsToGraph(toDeploy, graph);
await expect(graph.doParallel(1, callbacks)).rejects.toThrowError(new RegExp(`Unable to make progress.*${expectedError}`));
});
});
function createArtifacts(artifacts) {
return artifacts;
}
function addTestArtifactsToGraph(toDeploy, graph) {
for (const node of toDeploy) {
switch (node.type) {
case 'stack':
graph.addNodes({
type: 'stack',
id: node.id,
deploymentState: work_graph_types_1.DeploymentState.PENDING,
stack: {
// We're smuggling information here so that the set of callbacks can do some appropriate action
stackName: node.name,
displayName: node.displayName, // Used to smuggle exception triggers
},
dependencies: new Set([...node.stackDependencies ?? [], ...(node.assetDependencies ?? []).map(x => `${x}-publish`)]),
});
break;
case 'asset':
graph.addNodes({
type: 'asset-build',
id: `${node.id}-build`,
deploymentState: work_graph_types_1.DeploymentState.PENDING,
asset: DUMMY,
assetManifest: DUMMY,
assetManifestArtifact: DUMMY,
parentStack: {
// We're smuggling information here so that the set of callbacks can do some appropriate action
stackName: node.name,
displayName: node.displayName?.includes('build') ? node.displayName : undefined, // Used to smuggle exception triggers
},
dependencies: new Set([...node.stackDependencies ?? [], ...(node.assetDependencies ?? []).map(x => `${x}-publish`)]),
});
graph.addNodes({
type: 'asset-publish',
id: `${node.id}-publish`,
deploymentState: work_graph_types_1.DeploymentState.PENDING,
asset: DUMMY,
assetManifest: DUMMY,
assetManifestArtifact: DUMMY,
parentStack: {
// We're smuggling information here so that the set of callbacks can do some appropriate action
stackName: node.name,
displayName: node.displayName?.includes('publish') ? node.displayName : undefined, // Used to smuggle exception triggers
},
dependencies: new Set([`${node.id}-build`]),
});
break;
}
}
graph.removeUnavailableDependencies();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yay1ncmFwaC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid29yay1ncmFwaC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsdURBQW1EO0FBQ25ELG1FQUE0RztBQUU1RyxNQUFNLEtBQUssR0FBUSxPQUFPLENBQUM7QUFFM0IsTUFBTSxLQUFLLEdBQUcsS0FBSyxFQUFFLFFBQWdCLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUVoSCxzR0FBc0c7QUFDdEcsK0JBQStCO0FBQy9CLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQztBQUVqQjs7OztHQUlHO0FBQ0gsUUFBUSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUU7SUFDekIsTUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO0lBQ3BDLE1BQU0sU0FBUyxHQUFHO1FBQ2hCLFdBQVcsRUFBRSxLQUFLLEVBQUUsQ0FBWSxFQUFFLEVBQUU7WUFDbEMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7WUFDekMsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBRS9DLE1BQU0sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXJCLHdEQUF3RDtZQUN4RCxJQUFJLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3RELE1BQU0sS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzNCO1lBRUQsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELFVBQVUsRUFBRSxLQUFLLEVBQUMsQ0FBaUIsRUFBRSxF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O3FCQUNsSDtvQkFDUixZQUFZLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUM1QyxDQUFDLENBQUM7Z0JBQ0gsTUFBTTtTQUNUO0tBQ0Y7SUFDRCxLQUFLLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV29ya0dyYXBoIH0gZnJvbSAnLi4vbGliL3V0aWwvd29yay1ncmFwaCc7XG5pbXBvcnQgeyBBc3NldEJ1aWxkTm9kZSwgQXNzZXRQdWJsaXNoTm9kZSwgRGVwbG95bWVudFN0YXRlLCBTdGFja05vZGUgfSBmcm9tICcuLi9saWIvdXRpbC93b3JrLWdyYXBoLXR5cGVzJztcblxuY29uc3QgRFVNTVk6IGFueSA9ICdEVU1NWSc7XG5cbmNvbnN0IHNsZWVwID0gYXN5bmMgKGR1cmF0aW9uOiBudW1iZXIpID0+IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgZHVyYXRpb24pKTtcblxuLy8gTm90IGdyZWF0IHRvIGhhdmUgYWN0dWFsIHNsZWVwcyBpbiB0aGUgdGVzdHMsIGJ1dCB0aGV5IG1vc3RseSBqdXN0IGV4aXN0IHRvIGdpdmUgdGhlIGFzeW5jIHdvcmtmbG93XG4vLyBhIGNoYW5jZSB0byBzdGFydCBuZXcgdGFza3MuXG5jb25zdCBTTE9XID0gMjAwO1xuXG4vKipcbiAqIFJlcHVycG9zaW5nIHVudXNlZCBzdGFjayBhdHRyaWJ1dGVzIHRvIGNyZWF0ZSBzcGVjaWZpYyB0ZXN0IH