Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test(core): merge all package test reports #6261

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
2 changes: 1 addition & 1 deletion buildspec/linuxE2ETests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ phases:
commands:
- export HOME=/home/codebuild-user
# Ignore failure until throttling issues are fixed.
- xvfb-run npm run testE2E
- xvfb-run npm run testE2E; npm run mergeReports -- "$?"
- VCS_COMMIT_ID="${CODEBUILD_RESOLVED_SOURCE_VERSION}"
- CI_BUILD_URL=$(echo $CODEBUILD_BUILD_URL | sed 's/#/%23/g')
- CI_BUILD_ID="${CODEBUILD_BUILD_ID}"
Expand Down
2 changes: 1 addition & 1 deletion buildspec/linuxIntegrationTests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ phases:
build:
commands:
- export HOME=/home/codebuild-user
- xvfb-run npm run testInteg
- xvfb-run npm run testInteg; npm run mergeReports -- "$?"
- VCS_COMMIT_ID="${CODEBUILD_RESOLVED_SOURCE_VERSION}"
- CI_BUILD_URL=$(echo $CODEBUILD_BUILD_URL | sed 's/#/%23/g')
- CI_BUILD_ID="${CODEBUILD_BUILD_ID}"
Expand Down
2 changes: 1 addition & 1 deletion buildspec/linuxTests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ phases:
# Ensure that "foo | run_and_report" fails correctly.
set -o pipefail
. buildspec/shared/common.sh
2>&1 xvfb-run npm test --silent | run_and_report 2 \
2>&1 xvfb-run npm test --silent; npm run mergeReports -- "$?" | run_and_report 2 \
'rejected promise not handled' \
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Based on a local test of this command:

2>&1 echo aaa; echo bbb | grep x

I suspect the above ; may not correctly pipe all the output from npm test to run_and_report as intended.

To confirm that the piping to run_and_report is still working correctly, can you try temporarily changing this search patter to something that always outputs, like:

Suggested change
'rejected promise not handled' \
'deleteTestTempDirs' \

then CI should fail.

If it doesn't, we can fix the issue by changing the pipeline to something like (note: whitespace near the braces is required):

 { 2>&1 xvfb-run npm test --silent; npm run mergeReports -- "$?"; } | run_and_report 2 \

'This typically indicates a bug. Read https://developer.mozilla.org/docs/Web/JavaScript/Guide/Using_promises#error_handling'
}
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@
"lintfix": "eslint -c .eslintrc.js --ignore-path .gitignore --ignore-pattern '**/*.json' --ignore-pattern '**/*.gen.ts' --ignore-pattern '**/types/*.d.ts' --ignore-pattern '**/src/testFixtures/**' --ignore-pattern '**/resources/js/graphStateMachine.js' --fix --ext .ts packages plugins",
"clean": "npm run clean -w packages/ -w plugins/",
"reset": "npm run clean && ts-node ./scripts/clean.ts node_modules && npm install",
"generateNonCodeFiles": "npm run generateNonCodeFiles -w packages/ --if-present"
"generateNonCodeFiles": "npm run generateNonCodeFiles -w packages/ --if-present",
"mergeReports": "ts-node ./scripts/mergeReports.ts"
},
"devDependencies": {
"@aws-toolkits/telemetry": "^1.0.289",
Expand Down
3 changes: 2 additions & 1 deletion packages/core/src/test/testRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ export async function runTests(
}

const root = getRoot()
const outputFile = path.resolve(root, '../../', '.test-reports', 'report.xml')
// output the report to the individual package
const outputFile = path.resolve(root, '.test-reports', 'report.xml')
const colorOutput = !process.env['AWS_TOOLKIT_TEST_NO_COLOR']

// Create the mocha test
Expand Down
71 changes: 71 additions & 0 deletions scripts/mergeReports.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*!
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/

import * as fs from 'fs'
import * as path from 'path'
import * as xml2js from 'xml2js'

/**
* Merge all of the packages/ test reports into a single directory
*/
async function mergeReports() {
console.log('Merging test reports')

const packagesDir = path.join(__dirname, '..', 'packages')

// Get all packages/* directories
const packageDirs = fs.readdirSync(packagesDir).map((dir) => path.join(packagesDir, dir))

// Find report.xml files in .test-reports subdirectories
const testReports = packageDirs
.map((dir) => path.join(dir, '.test-reports', 'report.xml'))
.filter((file) => fs.existsSync(file))

const mergedReport = {
testsuites: {
testsuite: [],
},
}

// Collect all test reports into a single merged test report object
for (const file of testReports) {
const content = fs.readFileSync(file)
const result: { testsuites: { testsuite: [] } } = await xml2js.parseStringPromise(content)
if (result.testsuites && result.testsuites.testsuite) {
mergedReport.testsuites.testsuite.push(...result.testsuites.testsuite)
}
}

const builder = new xml2js.Builder()
const xml = builder.buildObject(mergedReport)

/**
* Create the new test reports directory and write the test report
*/
const reportsDir = path.join(__dirname, '..', '.test-reports')

// Create reports directory if it doesn't exist
if (!fs.existsSync(reportsDir)) {
fs.mkdirSync(reportsDir, { recursive: true })
}

fs.writeFileSync(path.join(reportsDir, 'report.xml'), xml)

const exitCodeArg = process.argv[2]
if (exitCodeArg) {
/**
* Retrieves the exit code from the previous test run execution.
*
* This allows us to:
* 1. Merge and upload test reports regardless of the test execution status
* 2. Preserve the original test run exit code
* 3. Report the test status back to CI
*/
const exitCode = parseInt(exitCodeArg || '0', 10)
process.exit(exitCode)
}
}

mergeReports()
Loading