Skip to content

Commit 64e4f41

Browse files
authored
chore: fix aws-lambda-nodejs test flakiness (#26448)
Uses a fake file system in `aws-lambda-nodejs` tests to avoid intermittent test failures when attempting to access the real file system. ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent 3fc914a commit 64e4f41

29 files changed

+123
-265
lines changed

packages/aws-cdk-lib/aws-lambda-nodejs/test/.no-packagejson-validator

Whitespace-only changes.

packages/aws-cdk-lib/aws-lambda-nodejs/test/__snapshots__/bundling.test.js.snap

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
exports[`esbuild bundling with esbuild options 1`] = `
44
""use strict";
55
(() => {
6-
// aws-lambda-nodejs/test/integ-handlers/define.ts
6+
// aws-lambda-nodejs/test/handlers/define.ts
77
function handler() {
88
return [
99
"VALUE",

packages/aws-cdk-lib/aws-lambda-nodejs/test/bundling.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ test('esbuild bundling with esbuild options', () => {
241241
});
242242

243243
// Make sure that the define instructions are working as expected with the esbuild CLI
244-
const bundleProcess = util.exec('bash', ['-c', `npx esbuild --bundle ${`${__dirname}/integ-handlers/define.ts`} ${defineInstructions}`]);
244+
const bundleProcess = util.exec('bash', ['-c', `npx esbuild --bundle ${`${__dirname}/handlers/define.ts`} ${defineInstructions}`]);
245245
expect(bundleProcess.stdout.toString()).toMatchSnapshot();
246246
});
247247

packages/aws-cdk-lib/aws-lambda-nodejs/test/function.test.handler1.ts

-1
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/function.test.handler2.js

-1
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/function.test.handler3.mjs

-1
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/function.test.handler4.mts

-1
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/function.test.handler5.cts

-1
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/function.test.handler6.cjs

-1
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/function.test.ts

+37-9
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import * as fs from 'fs';
2-
import * as path from 'path';
1+
import { bockfs } from '@aws-cdk/cdk-build-tools';
32
import { Template, Match } from '../../assertions';
43
import { Vpc } from '../../aws-ec2';
54
import { CodeConfig, Runtime } from '../../aws-lambda';
@@ -25,12 +24,45 @@ jest.mock('../lib/bundling', () => {
2524
};
2625
});
2726

27+
const mockCallsites = jest.fn();
28+
jest.mock('../lib/util', () => ({
29+
...jest.requireActual('../lib/util'),
30+
callsites: () => mockCallsites(),
31+
}));
32+
2833
let stack: Stack;
2934
beforeEach(() => {
3035
stack = new Stack();
3136
jest.clearAllMocks();
3237
});
3338

39+
// We MUST use a fake file system here.
40+
// Using the real filesystem causes the tests to be flaky and fail at random.
41+
// This way we are guaranteed to have the fake files setup on each test run.
42+
bockfs({
43+
'/home/project/package.json': '{}',
44+
'/home/project/package-lock.json': '{}',
45+
'/home/project/handler.tsx': '// nothing',
46+
'/home/project/function.test.handler1.ts': '// nothing',
47+
'/home/project/function.test.handler2.js': '// nothing',
48+
'/home/project/function.test.handler3.mjs': '// nothing',
49+
'/home/project/function.test.handler4.mts': '// nothing',
50+
'/home/project/function.test.handler5.cts': '// nothing',
51+
'/home/project/function.test.handler6.cjs': '// nothing',
52+
'/home/project/aws-lambda-nodejs/lib/index.ts': '// nothing',
53+
});
54+
const bockPath = bockfs.workingDirectory('/home/project');
55+
56+
// pretend the calling file is in a fake file path
57+
mockCallsites.mockImplementation(() => [
58+
{ getFunctionName: () => 'NodejsFunction' },
59+
{ getFileName: () => bockPath`function.test.ts` },
60+
]);
61+
62+
afterAll(() => {
63+
bockfs.restore();
64+
});
65+
3466
test('NodejsFunction with .ts handler', () => {
3567
// WHEN
3668
new NodejsFunction(stack, 'handler1');
@@ -151,15 +183,11 @@ test('throws when entry is not js/ts', () => {
151183
});
152184

153185
test('accepts tsx', () => {
154-
const entry = path.join(__dirname, 'handler.tsx');
155-
156-
fs.symlinkSync(path.join(__dirname, 'function.test.handler1.ts'), entry);
186+
const entry = bockPath`handler.tsx`;
157187

158188
expect(() => new NodejsFunction(stack, 'Fn', {
159189
entry,
160190
})).not.toThrow();
161-
162-
fs.unlinkSync(entry);
163191
});
164192

165193
test('throws when entry does not exist', () => {
@@ -196,7 +224,7 @@ test('resolves depsLockFilePath to an absolute path', () => {
196224
});
197225

198226
expect(Bundling.bundle).toHaveBeenCalledWith(expect.objectContaining({
199-
depsLockFilePath: expect.stringMatching(/aws-cdk-lib\/package.json$/),
227+
depsLockFilePath: bockPath`/home/project/package.json`,
200228
}));
201229
});
202230

@@ -207,7 +235,7 @@ test('resolves entry to an absolute path', () => {
207235
});
208236

209237
expect(Bundling.bundle).toHaveBeenCalledWith(expect.objectContaining({
210-
entry: expect.stringMatching(/aws-cdk-lib\/aws-lambda-nodejs\/lib\/index.ts$/),
238+
entry: bockPath`/home/project/aws-lambda-nodejs/lib/index.ts`,
211239
}));
212240
});
213241

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/define.ts renamed to packages/aws-cdk-lib/aws-lambda-nodejs/test/handlers/define.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@ export function handler() {
55
process.env.NUMBER,
66
process.env.STRING,
77
];
8-
}
8+
}

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/dependencies-sdk-v3.ts

-8
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/dependencies.ts

-10
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/esm.ts

-6
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/js-handler.js

-5
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/pnpm/dependencies-pnpm.ts

-6
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/pnpm/pnpm-lock.yaml

-70
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/ts-decorator-handler.ts

-22
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/ts-handler.ts

-5
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/ts-web-handler.ts

-12
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/ts-web-run.sh

-11
This file was deleted.

packages/aws-cdk-lib/aws-lambda-nodejs/test/integ-handlers/util.ts

-7
This file was deleted.

0 commit comments

Comments
 (0)