Skip to content

Commit 99aba5a

Browse files
[test optimization][SDTEST-3004] Upload code coverage reports automatically (#7335)
1 parent b42c5f3 commit 99aba5a

File tree

23 files changed

+853
-9
lines changed

23 files changed

+853
-9
lines changed

integration-tests/ci-visibility-intake.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ const DEFAULT_SETTINGS = {
2727
test_management: {
2828
enabled: false
2929
},
30-
impacted_tests_enabled: false
30+
impacted_tests_enabled: false,
31+
coverage_report_upload_enabled: false
3132
}
3233

3334
const DEFAULT_SUITES_TO_SKIP = []
@@ -175,6 +176,30 @@ class FakeCiVisIntake extends FakeAgent {
175176
})
176177
})
177178

179+
// Coverage report upload endpoint - one file per request
180+
app.post([
181+
'/api/v2/cicovreprt',
182+
'/evp_proxy/:version/api/v2/cicovreprt'
183+
], upload.any(), (req, res) => {
184+
res.status(200).send('OK')
185+
186+
const coverageFile = req.files.find(f => f.fieldname === 'coverage')
187+
const eventFile = req.files.find(f => f.fieldname === 'event')
188+
189+
this.emit('message', {
190+
headers: req.headers,
191+
coverageFile: coverageFile && {
192+
name: coverageFile.fieldname,
193+
content: zlib.gunzipSync(coverageFile.buffer).toString('utf8')
194+
},
195+
eventFile: eventFile && {
196+
name: eventFile.fieldname,
197+
content: JSON.parse(eventFile.buffer.toString('utf8'))
198+
},
199+
url: req.url
200+
})
201+
})
202+
178203
app.post([
179204
'/api/v2/libraries/tests/services/setting',
180205
'/evp_proxy/:version/api/v2/libraries/tests/services/setting'

integration-tests/ci-visibility/run-jest.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ if (process.env.COLLECT_COVERAGE_FROM) {
3737
options.collectCoverageFrom = process.env.COLLECT_COVERAGE_FROM.split(',')
3838
}
3939

40+
if (process.env.COVERAGE_REPORTERS) {
41+
options.coverageReporters = process.env.COVERAGE_REPORTERS.split(',')
42+
}
43+
4044
if (process.env.DO_NOT_INJECT_GLOBALS) {
4145
options.injectGlobals = false
4246
}

integration-tests/cucumber/cucumber.spec.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ const {
6464
TEST_HAS_FAILED_ALL_RETRIES,
6565
TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
6666
TEST_RETRY_REASON_TYPES,
67+
GIT_COMMIT_SHA,
68+
GIT_REPOSITORY_URL,
6769
TEST_IS_MODIFIED,
6870
DD_CAPABILITIES_IMPACTED_TESTS,
6971
TEST_FRAMEWORK,
@@ -3014,4 +3016,81 @@ describe(`cucumber@${version} commonJS`, () => {
30143016
})
30153017
})
30163018
})
3019+
3020+
context('coverage report upload', () => {
3021+
const gitCommitSha = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
3022+
const gitRepositoryUrl = 'https://github.com/datadog/test-repo.git'
3023+
3024+
it('uploads coverage report when coverage_report_upload_enabled is true', async () => {
3025+
receiver.setSettings({
3026+
coverage_report_upload_enabled: true
3027+
})
3028+
3029+
const coverageReportPromise = receiver
3030+
.gatherPayloadsMaxTimeout(({ url }) => url === '/api/v2/cicovreprt', (payloads) => {
3031+
assert.strictEqual(payloads.length, 1)
3032+
3033+
const coverageReport = payloads[0]
3034+
3035+
assert.ok(coverageReport.headers['content-type'].includes('multipart/form-data'))
3036+
3037+
assert.strictEqual(coverageReport.coverageFile.name, 'coverage')
3038+
assert.ok(coverageReport.coverageFile.content.includes('SF:')) // LCOV format
3039+
3040+
assert.strictEqual(coverageReport.eventFile.name, 'event')
3041+
assert.strictEqual(coverageReport.eventFile.content.type, 'coverage_report')
3042+
assert.strictEqual(coverageReport.eventFile.content.format, 'lcov')
3043+
assert.strictEqual(coverageReport.eventFile.content[GIT_COMMIT_SHA], gitCommitSha)
3044+
assert.strictEqual(coverageReport.eventFile.content[GIT_REPOSITORY_URL], gitRepositoryUrl)
3045+
})
3046+
3047+
const runTestsWithLcovCoverageCommand = `./node_modules/nyc/bin/nyc.js -r=lcov ${runTestsCommand}`
3048+
3049+
childProcess = exec(
3050+
runTestsWithLcovCoverageCommand,
3051+
{
3052+
cwd,
3053+
env: {
3054+
...getCiVisAgentlessConfig(receiver.port),
3055+
DD_GIT_COMMIT_SHA: gitCommitSha,
3056+
DD_GIT_REPOSITORY_URL: gitRepositoryUrl
3057+
}
3058+
}
3059+
)
3060+
3061+
await Promise.all([
3062+
coverageReportPromise,
3063+
once(childProcess, 'exit')
3064+
])
3065+
})
3066+
3067+
it('does not upload coverage report when coverage_report_upload_enabled is false', async () => {
3068+
receiver.setSettings({
3069+
coverage_report_upload_enabled: false
3070+
})
3071+
3072+
let coverageReportUploaded = false
3073+
receiver.assertPayloadReceived(() => {
3074+
coverageReportUploaded = true
3075+
}, ({ url }) => url === '/api/v2/cicovreprt')
3076+
3077+
const runTestsWithLcovCoverageCommand = `./node_modules/nyc/bin/nyc.js -r=lcov -r=text-summary ${runTestsCommand}`
3078+
3079+
childProcess = exec(
3080+
runTestsWithLcovCoverageCommand,
3081+
{
3082+
cwd,
3083+
env: {
3084+
...getCiVisAgentlessConfig(receiver.port),
3085+
DD_GIT_COMMIT_SHA: gitCommitSha,
3086+
DD_GIT_REPOSITORY_URL: gitRepositoryUrl
3087+
}
3088+
}
3089+
)
3090+
3091+
await once(childProcess, 'exit')
3092+
3093+
assert.strictEqual(coverageReportUploaded, false, 'coverage report should not be uploaded')
3094+
})
3095+
})
30173096
})

integration-tests/jest/jest.spec.js

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ const {
7373
TEST_SESSION_ID,
7474
TEST_MODULE,
7575
TEST_COMMAND,
76+
GIT_COMMIT_SHA,
77+
GIT_REPOSITORY_URL
7678
} = require('../../packages/dd-trace/src/plugins/util/test')
7779
const { DD_HOST_CPU_COUNT } = require('../../packages/dd-trace/src/plugins/util/env')
7880
const { ERROR_MESSAGE, ERROR_TYPE, ORIGIN_KEY, COMPONENT } = require('../../packages/dd-trace/src/constants')
@@ -5585,4 +5587,83 @@ describe(`jest@${JEST_VERSION} commonJS`, () => {
55855587
assert.doesNotMatch(testOutput, /Cannot find module/)
55865588
assert.match(testOutput, /6 passed/)
55875589
})
5590+
5591+
context('coverage report upload', () => {
5592+
const gitCommitSha = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
5593+
const gitRepositoryUrl = 'https://github.com/datadog/test-repo.git'
5594+
5595+
it('uploads coverage report when coverage_report_upload_enabled is true', async () => {
5596+
receiver.setSettings({
5597+
coverage_report_upload_enabled: true
5598+
})
5599+
5600+
const coverageReportPromise = receiver
5601+
.gatherPayloadsMaxTimeout(({ url }) => url === '/api/v2/cicovreprt', (payloads) => {
5602+
assert.strictEqual(payloads.length, 1)
5603+
5604+
const coverageReport = payloads[0]
5605+
5606+
assert.ok(coverageReport.headers['content-type'].includes('multipart/form-data'))
5607+
5608+
assert.strictEqual(coverageReport.coverageFile.name, 'coverage')
5609+
assert.ok(coverageReport.coverageFile.content.includes('SF:')) // LCOV format
5610+
5611+
assert.strictEqual(coverageReport.eventFile.name, 'event')
5612+
assert.strictEqual(coverageReport.eventFile.content.type, 'coverage_report')
5613+
assert.strictEqual(coverageReport.eventFile.content.format, 'lcov')
5614+
assert.strictEqual(coverageReport.eventFile.content[GIT_COMMIT_SHA], gitCommitSha)
5615+
assert.strictEqual(coverageReport.eventFile.content[GIT_REPOSITORY_URL], gitRepositoryUrl)
5616+
})
5617+
5618+
childProcess = exec(
5619+
runTestsCommand,
5620+
{
5621+
cwd,
5622+
env: {
5623+
...getCiVisAgentlessConfig(receiver.port),
5624+
ENABLE_CODE_COVERAGE: 'true',
5625+
COVERAGE_REPORTERS: 'lcov',
5626+
COLLECT_COVERAGE_FROM: 'ci-visibility/test/*.js',
5627+
DD_GIT_COMMIT_SHA: gitCommitSha,
5628+
DD_GIT_REPOSITORY_URL: gitRepositoryUrl
5629+
}
5630+
}
5631+
)
5632+
5633+
await Promise.all([
5634+
coverageReportPromise,
5635+
once(childProcess, 'exit')
5636+
])
5637+
})
5638+
5639+
it('does not upload coverage report when coverage_report_upload_enabled is false', async () => {
5640+
receiver.setSettings({
5641+
coverage_report_upload_enabled: false
5642+
})
5643+
5644+
let coverageReportUploaded = false
5645+
receiver.assertPayloadReceived(() => {
5646+
coverageReportUploaded = true
5647+
}, ({ url }) => url === '/api/v2/cicovreprt')
5648+
5649+
childProcess = exec(
5650+
runTestsCommand,
5651+
{
5652+
cwd,
5653+
env: {
5654+
...getCiVisAgentlessConfig(receiver.port),
5655+
ENABLE_CODE_COVERAGE: 'true',
5656+
COVERAGE_REPORTERS: 'lcov',
5657+
COLLECT_COVERAGE_FROM: 'ci-visibility/test/*.js',
5658+
DD_GIT_COMMIT_SHA: gitCommitSha,
5659+
DD_GIT_REPOSITORY_URL: gitRepositoryUrl
5660+
}
5661+
}
5662+
)
5663+
5664+
await once(childProcess, 'exit')
5665+
5666+
assert.strictEqual(coverageReportUploaded, false, 'coverage report should not be uploaded')
5667+
})
5668+
})
55885669
})

integration-tests/mocha/mocha.spec.js

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ const {
6262
TEST_HAS_FAILED_ALL_RETRIES,
6363
TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
6464
TEST_RETRY_REASON_TYPES,
65+
GIT_COMMIT_SHA,
66+
GIT_REPOSITORY_URL,
6567
TEST_IS_MODIFIED,
6668
CI_APP_ORIGIN,
6769
TEST_FRAMEWORK_VERSION,
@@ -4575,4 +4577,81 @@ describe(`mocha@${MOCHA_VERSION}`, function () {
45754577
])
45764578
})
45774579
})
4580+
4581+
context('coverage report upload', () => {
4582+
const gitCommitSha = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
4583+
const gitRepositoryUrl = 'https://github.com/datadog/test-repo.git'
4584+
4585+
it('uploads coverage report when coverage_report_upload_enabled is true', async () => {
4586+
receiver.setSettings({
4587+
coverage_report_upload_enabled: true
4588+
})
4589+
4590+
const coverageReportPromise = receiver
4591+
.gatherPayloadsMaxTimeout(({ url }) => url === '/api/v2/cicovreprt', (payloads) => {
4592+
assert.strictEqual(payloads.length, 1)
4593+
4594+
const coverageReport = payloads[0]
4595+
4596+
assert.ok(coverageReport.headers['content-type'].includes('multipart/form-data'))
4597+
4598+
assert.strictEqual(coverageReport.coverageFile.name, 'coverage')
4599+
assert.ok(coverageReport.coverageFile.content.includes('SF:')) // LCOV format
4600+
4601+
assert.strictEqual(coverageReport.eventFile.name, 'event')
4602+
assert.strictEqual(coverageReport.eventFile.content.type, 'coverage_report')
4603+
assert.strictEqual(coverageReport.eventFile.content.format, 'lcov')
4604+
assert.strictEqual(coverageReport.eventFile.content[GIT_COMMIT_SHA], gitCommitSha)
4605+
assert.strictEqual(coverageReport.eventFile.content[GIT_REPOSITORY_URL], gitRepositoryUrl)
4606+
})
4607+
4608+
const runTestsWithLcovCoverageCommand = `./node_modules/nyc/bin/nyc.js -r=lcov ${runTestsCommand}`
4609+
4610+
childProcess = exec(
4611+
runTestsWithLcovCoverageCommand,
4612+
{
4613+
cwd,
4614+
env: {
4615+
...getCiVisAgentlessConfig(receiver.port),
4616+
DD_GIT_COMMIT_SHA: gitCommitSha,
4617+
DD_GIT_REPOSITORY_URL: gitRepositoryUrl
4618+
}
4619+
}
4620+
)
4621+
4622+
await Promise.all([
4623+
coverageReportPromise,
4624+
once(childProcess, 'exit')
4625+
])
4626+
})
4627+
4628+
it('does not upload coverage report when coverage_report_upload_enabled is false', async () => {
4629+
receiver.setSettings({
4630+
coverage_report_upload_enabled: false
4631+
})
4632+
4633+
let coverageReportUploaded = false
4634+
receiver.assertPayloadReceived(() => {
4635+
coverageReportUploaded = true
4636+
}, ({ url }) => url === '/api/v2/cicovreprt')
4637+
4638+
const runTestsWithLcovCoverageCommand = `./node_modules/nyc/bin/nyc.js -r=lcov -r=text-summary ${runTestsCommand}`
4639+
4640+
childProcess = exec(
4641+
runTestsWithLcovCoverageCommand,
4642+
{
4643+
cwd,
4644+
env: {
4645+
...getCiVisAgentlessConfig(receiver.port),
4646+
DD_GIT_COMMIT_SHA: gitCommitSha,
4647+
DD_GIT_REPOSITORY_URL: gitRepositoryUrl
4648+
}
4649+
}
4650+
)
4651+
4652+
await once(childProcess, 'exit')
4653+
4654+
assert.strictEqual(coverageReportUploaded, false, 'coverage report should not be uploaded')
4655+
})
4656+
})
45784657
})

integration-tests/vitest.config.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ if (process.env.COVERAGE_PROVIDER) {
1313
config.test.coverage = {
1414
provider: process.env.COVERAGE_PROVIDER || 'v8',
1515
include: ['ci-visibility/vitest-tests/**'],
16-
reporter: ['text-summary']
16+
reporter: ['text-summary', 'lcov']
1717
}
1818
}
1919

0 commit comments

Comments
 (0)