Skip to content

Commit

Permalink
address comments: decodeCompressedNodes reject in case of error + cat…
Browse files Browse the repository at this point in the history
…ch error on run load
  • Loading branch information
radcheb committed Oct 13, 2020
1 parent 8491c5c commit 5b46a4d
Show file tree
Hide file tree
Showing 5 changed files with 41 additions and 20 deletions.
9 changes: 5 additions & 4 deletions frontend/src/lib/Utils.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,10 +276,11 @@ describe('Utils', () => {
expect(decodeCompressedNodes(compressedNodes)).resolves.toEqual({ node1: { id: 'node1' } });
});

it('return undefined if failed to decompress', async () => {
let compressedNodes =
'I4sIAAAAAAACE6tWystPSS1WslKIrlbKS8xNBbLAQoZKOgpKmSlArmFtbC0A+U7xAicAAAA=';
expect(decodeCompressedNodes(compressedNodes)).resolves.toEqual(undefined);
it('raise exception if failed to decompress data', async () => {
let compressedNodes = 'I4sIAAAAAAACE6tWystPSS1WslKIrlxNBbLAQoZKOgpKmSlArmFtbC0A+U7xAicAAAA=';
await expect(decodeCompressedNodes(compressedNodes)).rejects.toEqual(
'failed to gunzip data Error: incorrect header check',
);
});
});
});
16 changes: 6 additions & 10 deletions frontend/src/lib/Utils.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -361,21 +361,17 @@ export function buildQuery(queriesMap: { [key: string]: string | number | undefi
}

export async function decodeCompressedNodes(compressedNodes: string): Promise<object> {
return new Promise<object>(resolve => {
return new Promise<object>((resolve, reject) => {
const compressedBuffer = Buffer.from(compressedNodes, 'base64');
zlib.gunzip(compressedBuffer, (error, result: Buffer) => {
if (error) {
logger.error('failed to gunzip data ', error);
resolve(undefined);
const gz_error_msg = `failed to gunzip data ${error}`;
logger.error(gz_error_msg);
reject(gz_error_msg);
} else {
const nodesStr = result.toString('utf8');
try {
const nodes = JSON.parse(nodesStr);
resolve(nodes);
} catch (err) {
logger.error(`Failed to parse nodes json string: ${nodesStr}`, err);
resolve(undefined);
}
const nodes = JSON.parse(nodesStr);
resolve(nodes);
}
});
});
Expand Down
22 changes: 20 additions & 2 deletions frontend/src/pages/RunDetails.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -664,9 +664,9 @@ describe('RunDetails', () => {
await getRunSpy;
await TestUtils.flushPromises();

jest.useRealTimers()
jest.useRealTimers();
await new Promise(resolve => setTimeout(resolve, 500));
jest.useFakeTimers()
jest.useFakeTimers();

expect(getByTestId('graph')).toMatchInlineSnapshot(`
<pre
Expand All @@ -679,6 +679,24 @@ describe('RunDetails', () => {
`);
});

it('shows a empty workflow graph if compressedNodes corrupt', async () => {
testRun.pipeline_runtime!.workflow_manifest = JSON.stringify({
...WORKFLOW_TEMPLATE,
status: { compressedNodes: 'Y29ycnVwdF9kYXRh' },
});

const { getByTestId } = render(<RunDetails {...generateProps()} />);

await getRunSpy;
await TestUtils.flushPromises();

jest.useRealTimers();
await new Promise(resolve => setTimeout(resolve, 500));
jest.useFakeTimers();

expect(tree).toMatchSnapshot('');
});

it('opens side panel when graph node is clicked', async () => {
testRun.pipeline_runtime!.workflow_manifest = JSON.stringify({
status: { nodes: { node1: { id: 'node1' } } },
Expand Down
12 changes: 8 additions & 4 deletions frontend/src/pages/RunDetails.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -677,10 +677,14 @@ class RunDetails extends Page<RunDetailsInternalProps, RunDetailsState> {
!jsonWorkflow.status.nodes &&
jsonWorkflow.status.compressedNodes
) {
jsonWorkflow.status.nodes = await decodeCompressedNodes(
jsonWorkflow.status.compressedNodes,
);
delete jsonWorkflow.status.compressedNodes;
try {
jsonWorkflow.status.nodes = await decodeCompressedNodes(
jsonWorkflow.status.compressedNodes,
);
delete jsonWorkflow.status.compressedNodes;
} catch (err) {
console.error(`Failed to decode compressedNodes: ${err}`);
}
}
const workflow = jsonWorkflow as Workflow;

Expand Down
2 changes: 2 additions & 0 deletions frontend/src/pages/__snapshots__/RunDetails.test.tsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -1138,6 +1138,8 @@ exports[`RunDetails renders an empty run 1`] = `
</div>
`;

exports[`RunDetails shows a empty workflow graph if compressedNodes corrupt 1`] = `""`;

exports[`RunDetails shows failure run status in page title 1`] = `
<div
className="flex"
Expand Down

0 comments on commit 5b46a4d

Please sign in to comment.