Skip to content

Commit 1465e46

Browse files
juan-fernandeziunanua
authored andcommitted
[ci-visibility] Update ITR tags (#2767)
1 parent 1333d03 commit 1465e46

File tree

5 files changed

+79
-44
lines changed

5 files changed

+79
-44
lines changed

integration-tests/ci-visibility.spec.js

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ const { FakeCiVisIntake } = require('./ci-visibility-intake')
1717
const {
1818
TEST_SESSION_CODE_COVERAGE_ENABLED,
1919
TEST_SESSION_ITR_SKIPPING_ENABLED,
20+
TEST_MODULE_CODE_COVERAGE_ENABLED,
21+
TEST_MODULE_ITR_SKIPPING_ENABLED,
2022
TEST_ITR_TESTS_SKIPPED
2123
} = require('../packages/dd-trace/src/plugins/util/test')
2224

@@ -227,7 +229,7 @@ testFrameworks.forEach(({
227229
assert.propertyVal(packfileRequest.headers, 'dd-api-key', '1')
228230

229231
const eventTypes = eventsRequest.payload.events.map(event => event.type)
230-
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_session_end'])
232+
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_module_end', 'test_session_end'])
231233
const numSuites = eventTypes.reduce(
232234
(acc, type) => type === 'test_suite_end' ? acc + 1 : acc, 0
233235
)
@@ -276,7 +278,7 @@ testFrameworks.forEach(({
276278
assert.exists(coveragePayload.content.coverages[0].test_suite_id)
277279

278280
const eventTypes = eventsRequest.payload.events.map(event => event.type)
279-
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_session_end'])
281+
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_module_end', 'test_session_end'])
280282
const numSuites = eventTypes.reduce(
281283
(acc, type) => type === 'test_suite_end' ? acc + 1 : acc, 0
282284
)
@@ -307,11 +309,15 @@ testFrameworks.forEach(({
307309
receiver.assertPayloadReceived(({ headers, payload }) => {
308310
assert.propertyVal(headers, 'dd-api-key', '1')
309311
const eventTypes = payload.events.map(event => event.type)
310-
assert.includeMembers(eventTypes, ['test', 'test_session_end', 'test_suite_end'])
312+
assert.includeMembers(eventTypes, ['test', 'test_session_end', 'test_module_end', 'test_suite_end'])
311313
const testSession = payload.events.find(event => event.type === 'test_session_end').content
312314
assert.propertyVal(testSession.meta, TEST_ITR_TESTS_SKIPPED, 'false')
313315
assert.propertyVal(testSession.meta, TEST_SESSION_CODE_COVERAGE_ENABLED, 'false')
314316
assert.propertyVal(testSession.meta, TEST_SESSION_ITR_SKIPPING_ENABLED, 'false')
317+
const testModule = payload.events.find(event => event.type === 'test_module_end').content
318+
assert.propertyVal(testModule.meta, TEST_ITR_TESTS_SKIPPED, 'false')
319+
assert.propertyVal(testModule.meta, TEST_MODULE_CODE_COVERAGE_ENABLED, 'false')
320+
assert.propertyVal(testModule.meta, TEST_MODULE_ITR_SKIPPING_ENABLED, 'false')
315321
}, ({ url }) => url === '/api/v2/citestcycle').then(() => done()).catch(done)
316322

317323
childProcess = exec(
@@ -354,7 +360,7 @@ testFrameworks.forEach(({
354360
event.content.resource === 'ci-visibility/test/ci-visibility-test.js.ci visibility can report tests'
355361
)
356362
assert.notExists(skippedTest)
357-
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_session_end'])
363+
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_module_end', 'test_session_end'])
358364
const numSuites = eventTypes.reduce(
359365
(acc, type) => type === 'test_suite_end' ? acc + 1 : acc, 0
360366
)
@@ -363,6 +369,10 @@ testFrameworks.forEach(({
363369
assert.propertyVal(testSession.meta, TEST_ITR_TESTS_SKIPPED, 'true')
364370
assert.propertyVal(testSession.meta, TEST_SESSION_CODE_COVERAGE_ENABLED, 'true')
365371
assert.propertyVal(testSession.meta, TEST_SESSION_ITR_SKIPPING_ENABLED, 'true')
372+
const testModule = eventsRequest.payload.events.find(event => event.type === 'test_module_end').content
373+
assert.propertyVal(testModule.meta, TEST_ITR_TESTS_SKIPPED, 'true')
374+
assert.propertyVal(testModule.meta, TEST_MODULE_CODE_COVERAGE_ENABLED, 'true')
375+
assert.propertyVal(testModule.meta, TEST_MODULE_ITR_SKIPPING_ENABLED, 'true')
366376
done()
367377
}).catch(done)
368378

@@ -394,7 +404,7 @@ testFrameworks.forEach(({
394404
assert.propertyVal(headers, 'dd-api-key', '1')
395405
const eventTypes = payload.events.map(event => event.type)
396406
// because they are not skipped
397-
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_session_end'])
407+
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_module_end', 'test_session_end'])
398408
const numSuites = eventTypes.reduce(
399409
(acc, type) => type === 'test_suite_end' ? acc + 1 : acc, 0
400410
)
@@ -403,6 +413,10 @@ testFrameworks.forEach(({
403413
assert.propertyVal(testSession.meta, TEST_ITR_TESTS_SKIPPED, 'false')
404414
assert.propertyVal(testSession.meta, TEST_SESSION_CODE_COVERAGE_ENABLED, 'true')
405415
assert.propertyVal(testSession.meta, TEST_SESSION_ITR_SKIPPING_ENABLED, 'true')
416+
const testModule = payload.events.find(event => event.type === 'test_module_end').content
417+
assert.propertyVal(testModule.meta, TEST_ITR_TESTS_SKIPPED, 'false')
418+
assert.propertyVal(testModule.meta, TEST_MODULE_CODE_COVERAGE_ENABLED, 'true')
419+
assert.propertyVal(testModule.meta, TEST_MODULE_ITR_SKIPPING_ENABLED, 'true')
406420
}, ({ url }) => url === '/api/v2/citestcycle').then(() => done()).catch(done)
407421

408422
childProcess = exec(
@@ -436,7 +450,7 @@ testFrameworks.forEach(({
436450
assert.propertyVal(headers, 'dd-api-key', '1')
437451
const eventTypes = payload.events.map(event => event.type)
438452
// because they are not skipped
439-
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_session_end'])
453+
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_module_end', 'test_session_end'])
440454
const numSuites = eventTypes.reduce(
441455
(acc, type) => type === 'test_suite_end' ? acc + 1 : acc, 0
442456
)
@@ -520,7 +534,7 @@ testFrameworks.forEach(({
520534
assert.propertyVal(packfileRequest.headers, 'x-datadog-evp-subdomain', 'api')
521535

522536
const eventTypes = eventsRequest.payload.events.map(event => event.type)
523-
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_session_end'])
537+
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_module_end', 'test_session_end'])
524538
const numSuites = eventTypes.reduce(
525539
(acc, type) => type === 'test_suite_end' ? acc + 1 : acc, 0
526540
)
@@ -570,7 +584,7 @@ testFrameworks.forEach(({
570584
assert.exists(coveragePayload.content.coverages[0].test_suite_id)
571585

572586
const eventTypes = eventsRequest.payload.events.map(event => event.type)
573-
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_session_end'])
587+
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_module_end', 'test_session_end'])
574588
const numSuites = eventTypes.reduce(
575589
(acc, type) => type === 'test_suite_end' ? acc + 1 : acc, 0
576590
)
@@ -602,7 +616,7 @@ testFrameworks.forEach(({
602616
assert.notProperty(headers, 'dd-api-key')
603617
assert.propertyVal(headers, 'x-datadog-evp-subdomain', 'citestcycle-intake')
604618
const eventTypes = payload.events.map(event => event.type)
605-
assert.includeMembers(eventTypes, ['test', 'test_session_end', 'test_suite_end'])
619+
assert.includeMembers(eventTypes, ['test', 'test_session_end', 'test_module_end', 'test_suite_end'])
606620
}, ({ url }) => url === '/evp_proxy/v2/api/v2/citestcycle').then(() => done()).catch(done)
607621

608622
childProcess = exec(
@@ -651,7 +665,7 @@ testFrameworks.forEach(({
651665
event.content.resource === 'ci-visibility/test/ci-visibility-test.js.ci visibility can report tests'
652666
)
653667
assert.notExists(skippedTest)
654-
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_session_end'])
668+
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_module_end', 'test_session_end'])
655669
const numSuites = eventTypes.reduce(
656670
(acc, type) => type === 'test_suite_end' ? acc + 1 : acc, 0
657671
)
@@ -679,7 +693,7 @@ testFrameworks.forEach(({
679693
assert.propertyVal(headers, 'x-datadog-evp-subdomain', 'citestcycle-intake')
680694
const eventTypes = payload.events.map(event => event.type)
681695
// because they are not skipped
682-
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_session_end'])
696+
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_module_end', 'test_session_end'])
683697
const numSuites = eventTypes.reduce(
684698
(acc, type) => type === 'test_suite_end' ? acc + 1 : acc, 0
685699
)
@@ -715,7 +729,7 @@ testFrameworks.forEach(({
715729
assert.propertyVal(headers, 'x-datadog-evp-subdomain', 'citestcycle-intake')
716730
const eventTypes = payload.events.map(event => event.type)
717731
// because they are not skipped
718-
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_session_end'])
732+
assert.includeMembers(eventTypes, ['test', 'test_suite_end', 'test_module_end', 'test_session_end'])
719733
const numSuites = eventTypes.reduce(
720734
(acc, type) => type === 'test_suite_end' ? acc + 1 : acc, 0
721735
)

packages/datadog-plugin-jest/src/index.js

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,13 @@ const {
1010
getTestSessionCommonTags,
1111
getTestModuleCommonTags,
1212
getTestSuiteCommonTags,
13+
addIntelligentTestRunnerSpanTags,
1314
TEST_PARAMETERS,
1415
getCodeOwnersFileEntries,
1516
TEST_SESSION_ID,
1617
TEST_MODULE_ID,
1718
TEST_SUITE_ID,
1819
TEST_COMMAND,
19-
TEST_ITR_TESTS_SKIPPED,
20-
TEST_SESSION_CODE_COVERAGE_ENABLED,
21-
TEST_SESSION_ITR_SKIPPING_ENABLED,
22-
TEST_CODE_COVERAGE_LINES_TOTAL,
2320
TEST_BUNDLE
2421
} = require('../../dd-trace/src/plugins/util/test')
2522
const { COMPONENT } = require('../../dd-trace/src/constants')
@@ -83,14 +80,14 @@ class JestPlugin extends CiPlugin {
8380
testCodeCoverageLinesTotal
8481
}) => {
8582
this.testSessionSpan.setTag(TEST_STATUS, status)
86-
this.testSessionSpan.setTag(TEST_ITR_TESTS_SKIPPED, isSuitesSkipped ? 'true' : 'false')
87-
this.testSessionSpan.setTag(TEST_SESSION_ITR_SKIPPING_ENABLED, isSuitesSkippingEnabled ? 'true' : 'false')
88-
this.testSessionSpan.setTag(TEST_SESSION_CODE_COVERAGE_ENABLED, isCodeCoverageEnabled ? 'true' : 'false')
89-
90-
if (testCodeCoverageLinesTotal !== undefined) {
91-
this.testSessionSpan.setTag(TEST_CODE_COVERAGE_LINES_TOTAL, testCodeCoverageLinesTotal)
92-
}
9383
this.testModuleSpan.setTag(TEST_STATUS, status)
84+
85+
addIntelligentTestRunnerSpanTags(
86+
this.testSessionSpan,
87+
this.testModuleSpan,
88+
{ isSuitesSkipped, isSuitesSkippingEnabled, isCodeCoverageEnabled, testCodeCoverageLinesTotal }
89+
)
90+
9491
this.testModuleSpan.finish()
9592
this.testSessionSpan.finish()
9693
finishAllTraceSpans(this.testSessionSpan)

packages/datadog-plugin-jest/test/circus.spec.js

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ const {
2323
TEST_COMMAND,
2424
TEST_SUITE_ID,
2525
TEST_SESSION_ID,
26-
TEST_MODULE_ID
26+
TEST_MODULE_ID,
27+
TEST_BUNDLE
2728
} = require('../../dd-trace/src/plugins/util/test')
2829

2930
const { version: ddTraceVersion } = require('../../../package.json')
@@ -324,11 +325,6 @@ describe('Plugin', function () {
324325
status: 'pass',
325326
spanResourceMatch: /^test_session/
326327
},
327-
{
328-
type: 'test_module_end',
329-
status: 'pass',
330-
spanResourceMatch: /^test_module/
331-
},
332328
{
333329
type: 'test_suite_end',
334330
status: 'pass',
@@ -356,21 +352,21 @@ describe('Plugin', function () {
356352
const span = events.find(event => event.type === type).content
357353
expect(span.meta[TEST_STATUS]).to.equal(status)
358354
expect(span.meta[COMPONENT]).to.equal('jest')
359-
if (type === 'test_session_end') {
355+
if (type === 'test_session_end') { // session and module come in the same payload
360356
expect(span.meta[TEST_COMMAND]).not.to.equal(undefined)
361357
expect(span[TEST_SUITE_ID]).to.equal(undefined)
362358
expect(span[TEST_MODULE_ID]).to.equal(undefined)
363359
expect(span[TEST_SESSION_ID]).not.to.equal(undefined)
364-
}
365-
if (type === 'test_module_id') {
366-
expect(span.meta[TEST_COMMAND]).not.to.equal(undefined)
367-
expect(span[TEST_SUITE_ID]).to.equal(undefined)
368-
expect(span[TEST_SESSION_ID]).not.to.equal(undefined)
369-
expect(span[TEST_MODULE_ID]).not.to.equal(undefined)
360+
const testModuleSpan = events.find(event => event.type === 'test_module_end').content
361+
expect(testModuleSpan[TEST_SUITE_ID]).to.equal(undefined)
362+
expect(testModuleSpan[TEST_MODULE_ID]).not.to.equal(undefined)
363+
expect(testModuleSpan[TEST_SESSION_ID]).not.to.equal(undefined)
364+
expect(testModuleSpan.meta[TEST_BUNDLE]).not.to.equal(undefined)
370365
}
371366
if (type === 'test_suite_end') {
372367
expect(span.meta[TEST_SUITE]).to.equal(suite)
373368
expect(span.meta[TEST_COMMAND]).not.to.equal(undefined)
369+
expect(span.meta[TEST_BUNDLE]).not.to.equal(undefined)
374370
expect(span[TEST_SUITE_ID]).not.to.equal(undefined)
375371
expect(span[TEST_SESSION_ID]).not.to.equal(undefined)
376372
expect(span[TEST_MODULE_ID]).not.to.equal(undefined)
@@ -379,6 +375,7 @@ describe('Plugin', function () {
379375
expect(span.meta[TEST_SUITE]).to.equal(suite)
380376
expect(span.meta[TEST_NAME]).to.equal(name)
381377
expect(span.meta[TEST_COMMAND]).not.to.equal(undefined)
378+
expect(span.meta[TEST_BUNDLE]).not.to.equal(undefined)
382379
expect(span[TEST_SUITE_ID]).not.to.equal(undefined)
383380
expect(span[TEST_SESSION_ID]).not.to.equal(undefined)
384381
expect(span[TEST_MODULE_ID]).not.to.equal(undefined)

packages/datadog-plugin-mocha/src/index.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@ const {
1313
getTestSessionCommonTags,
1414
getTestModuleCommonTags,
1515
getTestSuiteCommonTags,
16+
addIntelligentTestRunnerSpanTags,
1617
TEST_SUITE_ID,
1718
TEST_SESSION_ID,
1819
TEST_MODULE_ID,
1920
TEST_BUNDLE,
20-
TEST_COMMAND,
21-
TEST_ITR_TESTS_SKIPPED,
22-
TEST_SESSION_CODE_COVERAGE_ENABLED,
23-
TEST_SESSION_ITR_SKIPPING_ENABLED
21+
TEST_COMMAND
2422
} = require('../../dd-trace/src/plugins/util/test')
2523
const { COMPONENT } = require('../../dd-trace/src/constants')
2624

@@ -156,11 +154,14 @@ class MochaPlugin extends CiPlugin {
156154
if (this.testSessionSpan) {
157155
const { isSuitesSkippingEnabled, isCodeCoverageEnabled } = this.itrConfig || {}
158156
this.testSessionSpan.setTag(TEST_STATUS, status)
159-
this.testSessionSpan.setTag(TEST_ITR_TESTS_SKIPPED, isSuitesSkipped ? 'true' : 'false')
160-
this.testSessionSpan.setTag(TEST_SESSION_ITR_SKIPPING_ENABLED, isSuitesSkippingEnabled ? 'true' : 'false')
161-
this.testSessionSpan.setTag(TEST_SESSION_CODE_COVERAGE_ENABLED, isCodeCoverageEnabled ? 'true' : 'false')
162-
163157
this.testModuleSpan.setTag(TEST_STATUS, status)
158+
159+
addIntelligentTestRunnerSpanTags(
160+
this.testSessionSpan,
161+
this.testModuleSpan,
162+
{ isSuitesSkipped, isSuitesSkippingEnabled, isCodeCoverageEnabled }
163+
)
164+
164165
this.testModuleSpan.finish()
165166
this.testSessionSpan.finish()
166167
finishAllTraceSpans(this.testSessionSpan)

packages/dd-trace/src/plugins/util/test.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ const JEST_TEST_RUNNER = 'test.jest.test_runner'
5050
const TEST_ITR_TESTS_SKIPPED = '_dd.ci.itr.tests_skipped'
5151
const TEST_SESSION_ITR_SKIPPING_ENABLED = 'test_session.itr.tests_skipping.enabled'
5252
const TEST_SESSION_CODE_COVERAGE_ENABLED = 'test_session.code_coverage.enabled'
53+
const TEST_MODULE_ITR_SKIPPING_ENABLED = 'test_module.itr.tests_skipping.enabled'
54+
const TEST_MODULE_CODE_COVERAGE_ENABLED = 'test_module.code_coverage.enabled'
5355

5456
const TEST_CODE_COVERAGE_LINES_TOTAL = 'test.codecov_lines_total'
5557

@@ -84,9 +86,13 @@ module.exports = {
8486
TEST_MODULE_ID,
8587
TEST_SUITE_ID,
8688
TEST_ITR_TESTS_SKIPPED,
89+
TEST_BUNDLE,
8790
TEST_SESSION_ITR_SKIPPING_ENABLED,
8891
TEST_SESSION_CODE_COVERAGE_ENABLED,
92+
TEST_MODULE_ITR_SKIPPING_ENABLED,
93+
TEST_MODULE_CODE_COVERAGE_ENABLED,
8994
TEST_CODE_COVERAGE_LINES_TOTAL,
95+
addIntelligentTestRunnerSpanTags,
9096
getCoveredFilenamesFromCoverage,
9197
resetCoverage,
9298
mergeCoverage,
@@ -282,6 +288,26 @@ function getTestSuiteCommonTags (command, testFrameworkVersion, testSuite) {
282288
}
283289
}
284290

291+
function addIntelligentTestRunnerSpanTags (
292+
testSessionSpan,
293+
testModuleSpan,
294+
{ isSuitesSkipped, isSuitesSkippingEnabled, isCodeCoverageEnabled, testCodeCoverageLinesTotal }
295+
) {
296+
testSessionSpan.setTag(TEST_ITR_TESTS_SKIPPED, isSuitesSkipped ? 'true' : 'false')
297+
testSessionSpan.setTag(TEST_SESSION_ITR_SKIPPING_ENABLED, isSuitesSkippingEnabled ? 'true' : 'false')
298+
testSessionSpan.setTag(TEST_SESSION_CODE_COVERAGE_ENABLED, isCodeCoverageEnabled ? 'true' : 'false')
299+
300+
testModuleSpan.setTag(TEST_ITR_TESTS_SKIPPED, isSuitesSkipped ? 'true' : 'false')
301+
testModuleSpan.setTag(TEST_MODULE_ITR_SKIPPING_ENABLED, isSuitesSkippingEnabled ? 'true' : 'false')
302+
testModuleSpan.setTag(TEST_MODULE_CODE_COVERAGE_ENABLED, isCodeCoverageEnabled ? 'true' : 'false')
303+
304+
// If suites have been skipped we don't want to report the total coverage, as it will be wrong
305+
if (testCodeCoverageLinesTotal !== undefined && !isSuitesSkipped) {
306+
testSessionSpan.setTag(TEST_CODE_COVERAGE_LINES_TOTAL, testCodeCoverageLinesTotal)
307+
testModuleSpan.setTag(TEST_CODE_COVERAGE_LINES_TOTAL, testCodeCoverageLinesTotal)
308+
}
309+
}
310+
285311
function getCoveredFilenamesFromCoverage (coverage) {
286312
const coverageMap = istanbul.createCoverageMap(coverage)
287313

0 commit comments

Comments
 (0)