diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java index 18f383106bd..a9ae2e6a582 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java @@ -3,6 +3,7 @@ import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME; import datadog.trace.api.Config; +import datadog.trace.api.DDTags; import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric; import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; import datadog.trace.api.civisibility.telemetry.tag.EventType; @@ -72,6 +73,8 @@ public AbstractTestModule( span.setTag(Tags.TEST_MODULE_ID, span.getSpanId()); span.setTag(Tags.TEST_SESSION_ID, span.getTraceId()); + span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); + // setting status to skip initially, // as we do not know in advance whether the module will have any children span.setTag(Tags.TEST_STATUS, TestStatus.skip); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java index 90681d6a02e..55b9a675dd8 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java @@ -4,6 +4,7 @@ import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME; import datadog.trace.api.Config; +import datadog.trace.api.DDTags; import datadog.trace.api.DDTraceId; import datadog.trace.api.IdGenerationStrategy; import datadog.trace.api.civisibility.CIConstants; @@ -97,6 +98,8 @@ public AbstractTestSession( span.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_TEST_SESSION); span.setTag(Tags.TEST_SESSION_ID, span.getTraceId()); + span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); + // setting status to skip initially, // as we do not know in advance whether the session will have any children span.setTag(Tags.TEST_STATUS, TestStatus.skip); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java index 65dcfbfa04d..52a8f479990 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java @@ -5,6 +5,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import datadog.trace.api.Config; +import datadog.trace.api.DDTags; import datadog.trace.api.DDTraceId; import datadog.trace.api.civisibility.CIConstants; import datadog.trace.api.civisibility.DDTest; @@ -124,6 +125,8 @@ public TestImpl( span.setTag(Tags.TEST_MODULE_ID, moduleSpanContext.getSpanId()); span.setTag(Tags.TEST_SESSION_ID, moduleSpanContext.getTraceId()); + span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); + span.setTag(Tags.TEST_STATUS, TestStatus.pass); if (testClass != null && !testClass.getName().equals(testSuiteName)) { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java index 024f77f0b4d..e2681daace9 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java @@ -5,6 +5,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import datadog.trace.api.Config; +import datadog.trace.api.DDTags; import datadog.trace.api.civisibility.DDTestSuite; import datadog.trace.api.civisibility.coverage.CoverageStore; import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric; @@ -113,6 +114,8 @@ public TestSuiteImpl( span.setTag(Tags.TEST_MODULE_ID, moduleSpanContext.getSpanId()); span.setTag(Tags.TEST_SESSION_ID, moduleSpanContext.getTraceId()); + span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); + // setting status to skip initially, // as we do not know in advance whether the suite will have any children span.setTag(Tags.TEST_STATUS, TestStatus.skip); diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy index 6b7cf95617b..9c4580d5bdd 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy @@ -3,6 +3,7 @@ package datadog.trace.civisibility.domain import datadog.trace.agent.test.asserts.ListWriterAssert import datadog.trace.api.Config import datadog.trace.api.DDSpanTypes +import datadog.trace.api.DDTags import datadog.trace.api.DDTraceId import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.api.civisibility.coverage.CoverageProbes @@ -20,7 +21,7 @@ import datadog.trace.civisibility.test.ExecutionResults import datadog.trace.civisibility.utils.SpanUtils class TestImplTest extends SpanWriterTest { - def "test span is generated"() { + def "test span is generated and tags populated"() { setup: def test = givenATest() @@ -33,6 +34,9 @@ class TestImplTest extends SpanWriterTest { span(0) { parent() spanType DDSpanTypes.TEST + tags(false) { + "$DDTags.TEST_IS_USER_PROVIDED_SERVICE" true + } } } }) @@ -84,8 +88,7 @@ class TestImplTest extends SpanWriterTest { 0 * coverageStore.report(_, _, _) } - private TestImpl givenATest( - CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { + private TestImpl givenATest(CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { def traceId = Stub(DDTraceId) traceId.toLong() >> 123 @@ -95,8 +98,10 @@ class TestImplTest extends SpanWriterTest { moduleSpanContext.getTraceId() >> traceId def suiteId = 789 + def config = Spy(Config.get()) + config.isServiceNameSetByUser() >> true + def testFramework = TestFrameworkInstrumentation.OTHER - def config = Config.get() def metricCollector = Stub(CiVisibilityMetricCollectorImpl) def executionResults = Stub(ExecutionResults) def testDecorator = new TestDecoratorImpl("component", "session-name", "test-command", [:]) diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy index 2acfcc0dc79..1ebbf52d95b 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy @@ -3,6 +3,7 @@ package datadog.trace.civisibility.domain import datadog.trace.agent.test.asserts.ListWriterAssert import datadog.trace.api.Config import datadog.trace.api.DDSpanTypes +import datadog.trace.api.DDTags import datadog.trace.api.DDTraceId import datadog.trace.api.civisibility.coverage.CoverageStore import datadog.trace.api.civisibility.coverage.NoOpCoverageStore @@ -34,6 +35,7 @@ class TestSuiteImplTest extends SpanWriterTest { "$Tags.TEST_CODEOWNERS" "[\"@global-owner1\",\"@global-owner2\"]" "$Tags.TEST_SOURCE_START" 10 "$Tags.TEST_SOURCE_END" 20 + "$DDTags.TEST_IS_USER_PROVIDED_SERVICE" true } } } @@ -42,8 +44,7 @@ class TestSuiteImplTest extends SpanWriterTest { private static final class MyClass {} - private TestSuiteImpl givenATestSuite( - CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { + private TestSuiteImpl givenATestSuite(CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { def traceId = Stub(DDTraceId) traceId.toLong() >> 123 @@ -51,8 +52,10 @@ class TestSuiteImplTest extends SpanWriterTest { moduleSpanContext.getSpanId() >> 456 moduleSpanContext.getTraceId() >> traceId + def config = Spy(Config.get()) + config.isServiceNameSetByUser() >> true + def testFramework = TestFrameworkInstrumentation.OTHER - def config = Config.get() def metricCollector = Stub(CiVisibilityMetricCollectorImpl) def executionResults = Stub(ExecutionResults) def testDecorator = new TestDecoratorImpl("component", "session-name", "test-command", [:]) diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy index 4daf9dc7c44..b11ec288cf9 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy @@ -1,6 +1,9 @@ package datadog.trace.civisibility.domain.headless +import datadog.trace.agent.test.asserts.ListWriterAssert import datadog.trace.api.Config +import datadog.trace.api.DDSpanTypes +import datadog.trace.api.DDTags import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.api.civisibility.config.TestSourceData import datadog.trace.api.civisibility.coverage.CoverageStore @@ -10,14 +13,58 @@ import datadog.trace.civisibility.codeowners.Codeowners import datadog.trace.civisibility.config.EarlyFlakeDetectionSettings import datadog.trace.civisibility.config.ExecutionSettings import datadog.trace.civisibility.decorator.TestDecorator +import datadog.trace.civisibility.domain.SpanWriterTest import datadog.trace.civisibility.source.LinesResolver import datadog.trace.civisibility.source.SourcePathResolver import datadog.trace.civisibility.test.ExecutionStrategy -import datadog.trace.test.util.DDSpecification -class HeadlessTestModuleTest extends DDSpecification { +class HeadlessTestModuleTest extends SpanWriterTest { + def "test module span is created and tags populated"() { + setup: + def headlessTestModule = givenAHeadlessTestModule() + + when: + headlessTestModule.end(null) + + then: + ListWriterAssert.assertTraces(TEST_WRITER, 1, false, { + trace(1) { + span(0) { + spanType DDSpanTypes.TEST_MODULE_END + tags(false) { + "$DDTags.TEST_IS_USER_PROVIDED_SERVICE" true + } + } + } + }) + } def "test total retries limit is applied across test cases"() { + given: + def headlessTestModule = givenAHeadlessTestModule() + + when: + def retryPolicy1 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-1", null), TestSourceData.UNKNOWN) + + then: + retryPolicy1.retry(false, 1L) // 2nd test execution, 1st retry globally + !retryPolicy1.retry(false, 1L) // asking for 3rd test execution - local limit reached + + when: + def retryPolicy2 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-2", null), TestSourceData.UNKNOWN) + + then: + retryPolicy2.retry(false, 1L) // 2nd test execution, 2nd retry globally (since previous test was retried too) + !retryPolicy2.retry(false, 1L) // asking for 3rd test execution - local limit reached + + when: + def retryPolicy3 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-3", null), TestSourceData.UNKNOWN) + + then: + !retryPolicy3.retry(false, 1L) // asking for 3rd retry globally - global limit reached + } + + private HeadlessTestModule givenAHeadlessTestModule() { def executionSettings = Stub(ExecutionSettings) executionSettings.getEarlyFlakeDetectionSettings() >> EarlyFlakeDetectionSettings.DEFAULT executionSettings.isFlakyTestRetriesEnabled() >> true @@ -28,11 +75,11 @@ class HeadlessTestModuleTest extends DDSpecification { // this counts all executions of a test case (first attempt is counted too) config.getCiVisibilityTotalFlakyRetryCount() >> 2 // this counts retries across all tests (first attempt is not a retry, so it is not counted) + config.isServiceNameSetByUser() >> true def executionStrategy = new ExecutionStrategy(config, executionSettings, Stub(SourcePathResolver), Stub(LinesResolver)) - given: - def headlessTestModule = new HeadlessTestModule( + new HeadlessTestModule( Stub(AgentSpanContext), "test-module", null, @@ -46,27 +93,5 @@ class HeadlessTestModuleTest extends DDSpecification { executionStrategy, (span) -> { } ) - - when: - def retryPolicy1 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-1", null), TestSourceData.UNKNOWN) - - then: - retryPolicy1.retry(false, 1L) // 2nd test execution, 1st retry globally - !retryPolicy1.retry(false, 1L) // asking for 3rd test execution - local limit reached - - when: - def retryPolicy2 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-2", null), TestSourceData.UNKNOWN) - - then: - retryPolicy2.retry(false, 1L) // 2nd test execution, 2nd retry globally (since previous test was retried too) - !retryPolicy2.retry(false, 1L) // asking for 3rd test execution - local limit reached - - when: - def retryPolicy3 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-3", null), TestSourceData.UNKNOWN) - - then: - !retryPolicy3.retry(false, 1L) // asking for 3rd retry globally - global limit reached } - - } diff --git a/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java b/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java index 49dc624feb2..4f4ae6813c3 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java @@ -58,6 +58,7 @@ public class DDTags { public static final String LIBRARY_VERSION_TAG_KEY = "library_version"; public static final String CI_ENV_VARS = "_dd.ci.env_vars"; public static final String CI_ITR_TESTS_SKIPPED = "_dd.ci.itr.tests_skipped"; + public static final String TEST_IS_USER_PROVIDED_SERVICE = "_dd.test.is_user_provided_service"; public static final String MEASURED = "_dd.measured"; public static final String PID_TAG = "process_id"; public static final String SCHEMA_VERSION_TAG_KEY = "_dd.trace_span_attribute_schema"; diff --git a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java index b2ed0bffebf..3e6a4ce3ab5 100644 --- a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java +++ b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java @@ -7,6 +7,7 @@ import datadog.communication.serialization.GrowableBuffer; import datadog.communication.serialization.Writable; import datadog.communication.serialization.msgpack.MsgPackWriter; +import datadog.trace.api.DDTags; import datadog.trace.api.DDTraceId; import datadog.trace.api.civisibility.CiVisibilityWellKnownTags; import datadog.trace.api.civisibility.InstrumentationBridge; @@ -41,6 +42,8 @@ public class CiTestCycleMapperV1 implements RemoteMapper { Tags.TEST_SESSION_ID.getBytes(StandardCharsets.UTF_8); private static final byte[] TEST_MODULE_ID = Tags.TEST_MODULE_ID.getBytes(StandardCharsets.UTF_8); private static final byte[] TEST_SUITE_ID = Tags.TEST_SUITE_ID.getBytes(StandardCharsets.UTF_8); + private static final byte[] TEST_IS_USER_PROVIDED_SERVICE = + DDTags.TEST_IS_USER_PROVIDED_SERVICE.getBytes(StandardCharsets.UTF_8); private static final byte[] ITR_CORRELATION_ID = Tags.ITR_CORRELATION_ID.getBytes(StandardCharsets.UTF_8); @@ -89,6 +92,9 @@ public void map(List> trace, Writable writable) { Number testSuiteId = span.getTag(Tags.TEST_SUITE_ID); span.removeTag(Tags.TEST_SUITE_ID); + Boolean testIsUserProvidedService = span.getTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE); + span.removeTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE); + String itrCorrelationId = span.getTag(Tags.ITR_CORRELATION_ID); span.removeTag(Tags.ITR_CORRELATION_ID); @@ -102,6 +108,9 @@ public void map(List> trace, Writable writable) { if (testSuiteId != null) { topLevelTagsCount++; } + if (testIsUserProvidedService != null) { + topLevelTagsCount++; + } if (itrCorrelationId != null) { topLevelTagsCount++; } @@ -193,6 +202,10 @@ public void map(List> trace, Writable writable) { writable.writeUTF8(TEST_SUITE_ID); writable.writeObject(testSuiteId, null); } + if (testIsUserProvidedService != null) { + writable.writeUTF8(TEST_IS_USER_PROVIDED_SERVICE); + writable.writeObject(testIsUserProvidedService, null); + } if (itrCorrelationId != null) { writable.writeUTF8(ITR_CORRELATION_ID); writable.writeObjectString(itrCorrelationId, null); diff --git a/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy index 0e209201158..6716522253e 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper import datadog.communication.serialization.ByteBufferConsumer import datadog.communication.serialization.FlushingBuffer import datadog.communication.serialization.msgpack.MsgPackWriter +import datadog.trace.api.DDTags import datadog.trace.api.DDTraceId import datadog.trace.api.civisibility.CiVisibilityWellKnownTags import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes @@ -89,19 +90,20 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { 100 << 10 | 1000 | false } - def "verify test_suite_id, test_module_id, and test_session_id are written as top level tags in test event"() { + def "verify test_suite_id, test_module_id, test_session_id, and _dd.test.is_user_provided_service are written as top level tags in test event"() { setup: def span = generateRandomSpan(InternalSpanTypes.TEST, [ - (Tags.TEST_SESSION_ID): DDTraceId.from(123), - (Tags.TEST_MODULE_ID) : 456, - (Tags.TEST_SUITE_ID) : 789 + (Tags.TEST_SESSION_ID) : DDTraceId.from(123), + (Tags.TEST_MODULE_ID) : 456, + (Tags.TEST_SUITE_ID) : 789, + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): true, ]) when: Map deserializedSpan = whenASpanIsWritten(span) then: - verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789) + verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789, true) def spanContent = (Map) deserializedSpan.get("content") assert spanContent.containsKey("trace_id") @@ -112,16 +114,17 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { def "verify test_suite_end event is written correctly"() { setup: def span = generateRandomSpan(InternalSpanTypes.TEST_SUITE_END, [ - (Tags.TEST_SESSION_ID): DDTraceId.from(123), - (Tags.TEST_MODULE_ID) : 456, - (Tags.TEST_SUITE_ID) : 789 + (Tags.TEST_SESSION_ID) : DDTraceId.from(123), + (Tags.TEST_MODULE_ID) : 456, + (Tags.TEST_SUITE_ID) : 789, + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): true, ]) when: Map deserializedSpan = whenASpanIsWritten(span) then: - verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789) + verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789, true) def spanContent = (Map) deserializedSpan.get("content") assert !spanContent.containsKey("trace_id") @@ -132,15 +135,16 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { def "verify test_module_end event is written correctly"() { setup: def span = generateRandomSpan(InternalSpanTypes.TEST_MODULE_END, [ - (Tags.TEST_SESSION_ID): DDTraceId.from(123), - (Tags.TEST_MODULE_ID) : 456, + (Tags.TEST_SESSION_ID) : DDTraceId.from(123), + (Tags.TEST_MODULE_ID) : 456, + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): true, ]) when: Map deserializedSpan = whenASpanIsWritten(span) then: - verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, null) + verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, null, true) def spanContent = (Map) deserializedSpan.get("content") assert !spanContent.containsKey("trace_id") @@ -148,7 +152,7 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { assert !spanContent.containsKey("parent_id") } - private static void verifyTopLevelTags(Map deserializedSpan, DDTraceId testSessionId, Long testModuleId, Long testSuiteId) { + private static void verifyTopLevelTags(Map deserializedSpan, DDTraceId testSessionId, Long testModuleId, Long testSuiteId, Boolean testIsUserProvidedService) { Map deserializedSpanContent = (Map) deserializedSpan.get("content") Map deserializedMetrics = (Map) deserializedSpanContent.get("metrics") Map deserializedMeta = (Map) deserializedSpanContent.get("meta") @@ -171,13 +175,21 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { assert !deserializedSpanContent.containsKey(Tags.TEST_SUITE_ID) } + if (testIsUserProvidedService != null) { + assert deserializedSpanContent.get(DDTags.TEST_IS_USER_PROVIDED_SERVICE) == testIsUserProvidedService + } else { + assert !deserializedSpanContent.containsKey(DDTags.TEST_IS_USER_PROVIDED_SERVICE) + } + assert !deserializedMetrics.containsKey(Tags.TEST_SESSION_ID) assert !deserializedMetrics.containsKey(Tags.TEST_MODULE_ID) assert !deserializedMetrics.containsKey(Tags.TEST_SUITE_ID) + assert !deserializedMetrics.containsKey(DDTags.TEST_IS_USER_PROVIDED_SERVICE) assert !deserializedMeta.containsKey(Tags.TEST_SESSION_ID) assert !deserializedMeta.containsKey(Tags.TEST_MODULE_ID) assert !deserializedMeta.containsKey(Tags.TEST_SUITE_ID) + assert !deserializedMeta.containsKey(DDTags.TEST_IS_USER_PROVIDED_SERVICE) } private static Map whenASpanIsWritten(TraceGenerator.PojoSpan span) {