Skip to content

Commit

Permalink
Merge branch 'main' into merge-back/2.171.0
Browse files Browse the repository at this point in the history
iliapolo authored Nov 25, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
2 parents 4957967 + c5f895e commit 323dd4f
Showing 11 changed files with 164 additions and 44 deletions.
4 changes: 2 additions & 2 deletions packages/@aws-cdk/cloudformation-diff/package.json
Original file line number Diff line number Diff line change
@@ -23,8 +23,8 @@
},
"license": "Apache-2.0",
"dependencies": {
"@aws-cdk/aws-service-spec": "^0.1.34",
"@aws-cdk/service-spec-types": "^0.0.101",
"@aws-cdk/aws-service-spec": "^0.1.35",
"@aws-cdk/service-spec-types": "^0.0.102",
"chalk": "^4",
"diff": "^5.2.0",
"fast-deep-equal": "^3.1.3",
2 changes: 1 addition & 1 deletion packages/@aws-cdk/integ-runner/package.json
Original file line number Diff line number Diff line change
@@ -74,7 +74,7 @@
"@aws-cdk/cloud-assembly-schema": "^38.0.0",
"@aws-cdk/cloudformation-diff": "0.0.0",
"@aws-cdk/cx-api": "0.0.0",
"@aws-cdk/aws-service-spec": "^0.1.34",
"@aws-cdk/aws-service-spec": "^0.1.35",
"cdk-assets": "3.0.0-rc.32",
"@aws-cdk/cdk-cli-wrapper": "0.0.0",
"aws-cdk": "0.0.0",
2 changes: 1 addition & 1 deletion packages/aws-cdk-lib/package.json
Original file line number Diff line number Diff line change
@@ -136,7 +136,7 @@
"mime-types": "^2.1.35"
},
"devDependencies": {
"@aws-cdk/aws-service-spec": "^0.1.34",
"@aws-cdk/aws-service-spec": "^0.1.35",
"@aws-cdk/cdk-build-tools": "0.0.0",
"@aws-cdk/custom-resource-handlers": "0.0.0",
"@aws-cdk/pkglint": "0.0.0",
3 changes: 1 addition & 2 deletions packages/aws-cdk/jest.config.js
Original file line number Diff line number Diff line change
@@ -20,6 +20,5 @@ module.exports = {

// We have many tests here that commonly time out
testTimeout: 30_000,
// These tests are too chatty. Shush.
silent: true,
setupFilesAfterEnv: ["<rootDir>/test/jest-setup-after-env.ts"],
};
10 changes: 3 additions & 7 deletions packages/aws-cdk/lib/init.ts
Original file line number Diff line number Diff line change
@@ -324,13 +324,9 @@ async function initializeProject(
if (migrate) {
await template.addMigrateContext(workDir);
}
if (await fs.pathExists('README.md')) {
const readme = await fs.readFile('README.md', { encoding: 'utf-8' });
// Save the logs!
// Without this statement, the readme of the CLI is printed in every init test
if (!readme.startsWith('# AWS CDK Toolkit')) {
print(chalk.green(readme));
}
if (await fs.pathExists(`${workDir}/README.md`)) {
const readme = await fs.readFile(`${workDir}/README.md`, { encoding: 'utf-8' });
print(chalk.green(readme));
}

if (!generateOnly) {
18 changes: 18 additions & 0 deletions packages/aws-cdk/test/diff.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import { Writable } from 'stream';
import { StringDecoder } from 'string_decoder';
import * as cxschema from '@aws-cdk/cloud-assembly-schema';
@@ -12,6 +14,22 @@ import { CdkToolkit } from '../lib/cdk-toolkit';
let cloudExecutable: MockCloudExecutable;
let cloudFormation: jest.Mocked<Deployments>;
let toolkit: CdkToolkit;
let oldDir: string;
let tmpDir: string;

beforeAll(() => {
// The toolkit writes and checks for temporary files in the current directory,
// so run these tests in a tempdir so they don't interfere with each other
// and other tests.
oldDir = process.cwd();
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'aws-cdk-test'));
process.chdir(tmpDir);
});

afterAll(() => {
process.chdir(oldDir);
fs.rmSync(tmpDir, { recursive: true, force: true });
});

describe('fixed template', () => {
const templatePath = 'oldTemplate.json';
27 changes: 26 additions & 1 deletion packages/aws-cdk/test/init.test.ts
Original file line number Diff line number Diff line change
@@ -2,7 +2,7 @@ import * as os from 'os';
import * as path from 'path';
import * as cxapi from '@aws-cdk/cx-api';
import * as fs from 'fs-extra';
import { availableInitTemplates, cliInit } from '../lib/init';
import { availableInitLanguages, availableInitTemplates, cliInit, printAvailableTemplates } from '../lib/init';

describe('constructs version', () => {
cliTest('create a TypeScript library project', async (workDir) => {
@@ -17,6 +17,21 @@ describe('constructs version', () => {
expect(await fs.pathExists(path.join(workDir, 'lib'))).toBeTruthy();
});

cliTest('asking for a nonexistent template fails', async (workDir) => {
await expect(cliInit({
type: 'banana',
language: 'typescript',
workDir,
})).rejects.toThrow(/Unknown init template/);
});

cliTest('asking for a template but no language prints and throws', async (workDir) => {
await expect(cliInit({
type: 'app',
workDir,
})).rejects.toThrow(/No language/);
});

cliTest('create a TypeScript app project', async (workDir) => {
await cliInit({
type: 'app',
@@ -237,6 +252,16 @@ test('when no version number is present (e.g., local development), the v2 templa
expect((await availableInitTemplates()).length).toBeGreaterThan(0);
});

test('check available init languages', async () => {
const langs = await availableInitLanguages();
expect(langs.length).toBeGreaterThan(0);
expect(langs).toContain('typescript');
});

test('exercise printing available templates', async () => {
await printAvailableTemplates();
});

function cliTest(name: string, handler: (dir: string) => void | Promise<any>): void {
test(name, () => withTempDir(handler));
}
85 changes: 85 additions & 0 deletions packages/aws-cdk/test/jest-setup-after-env.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import * as fs from 'fs';
import * as os from 'os';
import * as path from 'path';
import { isPromise } from 'util/types';

/**
* Global test setup for Jest tests
*
* It's easy to accidentally write tests that interfere with each other by
* writing files to disk in the "current directory". To prevent this, the global
* test setup creates a directory in the temporary directory and chmods it to
* being non-writable. That way, whenever a test tries to write to the current
* directory, it will produce an error and we'll be able to find and fix the
* test.
*
* If you see `EACCES: permission denied`, you have a test that creates files
* in the current directory, and you should be sure to do it in a temporary
* directory that you clean up afterwards.
*
* ## Alternate approach
*
* I tried an approach where I would automatically try to create and clean up
* temp directories for every test, but it was introducing too many conflicts
* with existing test behavior (around specific ordering of temp directory
* creation and cleanup tasks that are already present) in many places that I
* didn't want to go and chase down.
*
*/

let tmpDir: string;
let oldDir: string;

beforeAll(() => {
tmpDir = path.join(os.tmpdir(), 'cdk-nonwritable-on-purpose');
fs.mkdirSync(tmpDir, { recursive: true });
fs.chmodSync(tmpDir, 0o500);
oldDir = process.cwd();
process.chdir(tmpDir);
tmpDir = process.cwd(); // This will have resolved symlinks
});

const reverseAfterAll: Array<jest.ProvidesHookCallback> = [];

/**
* We need a cleanup here
*
* 99% of the time, Jest runs the tests in a subprocess and this isn't
* necessary because we would have `chdir`ed in the subprocess.
*
* But sometimes we ask Jest with `-i` to run the tests in the main process,
* or if you only ask for a single test suite Jest runs the tests in the main
* process, and then we `chdir`ed the main process away.
*
* Jest will then try to write the `coverage` directory to the readonly directory,
* and fail. Chdir back to the original dir.
*
* If the test file has an `afterAll()` hook it installed as well, we need to run
* it before our cleanup, otherwise the wrong thing will happen (by default,
* all `afterAll()`s run in call order, but they should be run in reverse).
*/
afterAll(async () => {
for (const aft of reverseAfterAll.reverse()) {
await new Promise<void>((resolve, reject) => {
const response = aft(resolve as any);
if (isPromise(response)) {
response.then(() => { return resolve(); }, reject);
} else {
resolve();
}
});
}

// eslint-disable-next-line no-console
process.stderr.write(`${process.cwd()}, ${tmpDir}\n`);
if (process.cwd() === tmpDir) {
// eslint-disable-next-line no-console
process.stderr.write('chmod\n');
process.chdir(oldDir);
}
});

// Patch afterAll to make later-provided afterAll's run before us (in reverse order even).
afterAll = (after: jest.ProvidesHookCallback) => {
reverseAfterAll.push(after);
};
23 changes: 10 additions & 13 deletions packages/aws-cdk/test/notices.test.ts
Original file line number Diff line number Diff line change
@@ -455,23 +455,20 @@ describe(CachedDataSource, () => {
});

test('retrieves data from the delegate when the file cannot be read', async () => {
const debugSpy = jest.spyOn(logging, 'debug');
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'cdk-test'));
try {
const debugSpy = jest.spyOn(logging, 'debug');

if (fs.existsSync('does-not-exist.json')) {
fs.unlinkSync('does-not-exist.json');
}

const dataSource = dataSourceWithDelegateReturning(freshData, 'does-not-exist.json');
const dataSource = dataSourceWithDelegateReturning(freshData, `${tmpDir}/does-not-exist.json`);

const notices = await dataSource.fetch();

expect(notices).toEqual(freshData);
expect(debugSpy).not.toHaveBeenCalled();
const notices = await dataSource.fetch();

debugSpy.mockRestore();
expect(notices).toEqual(freshData);
expect(debugSpy).not.toHaveBeenCalled();

if (fs.existsSync('does-not-exist.json')) {
fs.unlinkSync('does-not-exist.json');
debugSpy.mockRestore();
} finally {
fs.rmSync(tmpDir, { recursive: true, force: true });
}
});

6 changes: 3 additions & 3 deletions tools/@aws-cdk/spec2cdk/package.json
Original file line number Diff line number Diff line change
@@ -32,9 +32,9 @@
},
"license": "Apache-2.0",
"dependencies": {
"@aws-cdk/aws-service-spec": "^0.1.34",
"@aws-cdk/service-spec-importers": "^0.0.56",
"@aws-cdk/service-spec-types": "^0.0.101",
"@aws-cdk/aws-service-spec": "^0.1.35",
"@aws-cdk/service-spec-importers": "^0.0.57",
"@aws-cdk/service-spec-types": "^0.0.102",
"@cdklabs/tskb": "^0.0.3",
"@cdklabs/typewriter": "^0.0.3",
"camelcase": "^6",
28 changes: 14 additions & 14 deletions yarn.lock
Original file line number Diff line number Diff line change
@@ -63,12 +63,12 @@
resolved "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz#6d3c7860354d4856a7e75375f2f0ecab313b4989"
integrity sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A==

"@aws-cdk/aws-service-spec@^0.1.34":
version "0.1.34"
resolved "https://registry.npmjs.org/@aws-cdk/aws-service-spec/-/aws-service-spec-0.1.34.tgz#4940a67be44e97ab31cd3511b293f51492c99f22"
integrity sha512-bVsNLud3H573UOAqMo16g/kXtFrA755X1ipH++VLuOK5GI4qDpM1tU3/O4UO8JF7n7AA4/fsd7luUCKuydd9cQ==
"@aws-cdk/aws-service-spec@^0.1.35":
version "0.1.35"
resolved "https://registry.npmjs.org/@aws-cdk/aws-service-spec/-/aws-service-spec-0.1.35.tgz#2358c86d446a84fc31104510b4bf060aa8854866"
integrity sha512-1LcfP/mQZflEgup6VOq1qBw56GLoju8EcgGR+K5CDwsHHPybPvBxlwZUU+Ny8A7gFWi9pvm8Jdd79lz9ihmNPw==
dependencies:
"@aws-cdk/service-spec-types" "^0.0.101"
"@aws-cdk/service-spec-types" "^0.0.102"
"@cdklabs/tskb" "^0.0.3"

"@aws-cdk/cloud-assembly-schema@^38.0.0", "@aws-cdk/cloud-assembly-schema@^38.0.1":
@@ -106,12 +106,12 @@
resolved "https://registry.npmjs.org/@aws-cdk/lambda-layer-kubectl-v31/-/lambda-layer-kubectl-v31-2.0.0.tgz#d87799d7d0d5dad77af45281a36942e4b7996b6b"
integrity sha512-8JI0sMDbqCubOyt1TbQFEwicYok9KYSrNSfzREgjGJcoPy17/Kd0gbe44ATyLMfjae7dExUhhwKMhr6GK7Hmrw==

"@aws-cdk/service-spec-importers@^0.0.56":
version "0.0.56"
resolved "https://registry.npmjs.org/@aws-cdk/service-spec-importers/-/service-spec-importers-0.0.56.tgz#9a29608d5f484d3f3d3c7e039c239c47a53becb3"
integrity sha512-UwB31NyiIoBKIeWW+oDQ2jUxkA3NQdL8F5PpaRerCDomIK8FG7xw4/eeFtdTIlINBuosh2NcN6nKbXQ3Xnoy1g==
"@aws-cdk/service-spec-importers@^0.0.57":
version "0.0.57"
resolved "https://registry.npmjs.org/@aws-cdk/service-spec-importers/-/service-spec-importers-0.0.57.tgz#d4c6021e7477bae4f86f0db8f2d85cabcb6a2840"
integrity sha512-7i5ZUFHNeLvvJo9bWVn9HQC5y+kka+sNgtAc1apzqx1IeL0TW/11ZQiWCav+uIhs60xnZZHgeT+iSgpMyApBCw==
dependencies:
"@aws-cdk/service-spec-types" "^0.0.101"
"@aws-cdk/service-spec-types" "^0.0.102"
"@cdklabs/tskb" "^0.0.3"
ajv "^6"
canonicalize "^2.0.0"
@@ -122,10 +122,10 @@
glob "^8"
sort-json "^2.0.1"

"@aws-cdk/service-spec-types@^0.0.101":
version "0.0.101"
resolved "https://registry.npmjs.org/@aws-cdk/service-spec-types/-/service-spec-types-0.0.101.tgz#ce480d59b4eaa4ba29c78a9c53071a00966b87e1"
integrity sha512-a2e5dU1srewZJXSk0gR3McEE52v9pEB6u6IeozjsD9wmjFAVB+ggMFGYv5EQxhuq5/LQpo5enrlyVHZQnW1sZQ==
"@aws-cdk/service-spec-types@^0.0.102":
version "0.0.102"
resolved "https://registry.npmjs.org/@aws-cdk/service-spec-types/-/service-spec-types-0.0.102.tgz#1a7554556a4890c6ccfe62b7d15c4f9297c11e3d"
integrity sha512-CL9hyaPB4C4mcMinkO56uRHFlgtuy57LlpzQv3Qc3Z9FIElK8KG76GDD1SCy+FE/7B13EpIVJmJFRCvjJvyNng==
dependencies:
"@cdklabs/tskb" "^0.0.3"

0 comments on commit 323dd4f

Please sign in to comment.