From 487fab890d0c4ac91ea1b78c2b3d4c7bdbc00b38 Mon Sep 17 00:00:00 2001 From: Stuart McCulloch Date: Mon, 29 Jun 2026 21:18:35 +0100 Subject: [PATCH] Extend W3CTraceParentTest coverage and migrate it to Java --- .../api/propagation/W3CTraceParentTest.groovy | 32 ------- .../api/propagation/W3CTraceParentTest.java | 91 +++++++++++++++++++ 2 files changed, 91 insertions(+), 32 deletions(-) delete mode 100644 internal-api/src/test/groovy/datadog/trace/api/propagation/W3CTraceParentTest.groovy create mode 100644 internal-api/src/test/java/datadog/trace/api/propagation/W3CTraceParentTest.java diff --git a/internal-api/src/test/groovy/datadog/trace/api/propagation/W3CTraceParentTest.groovy b/internal-api/src/test/groovy/datadog/trace/api/propagation/W3CTraceParentTest.groovy deleted file mode 100644 index 739354dc27f..00000000000 --- a/internal-api/src/test/groovy/datadog/trace/api/propagation/W3CTraceParentTest.groovy +++ /dev/null @@ -1,32 +0,0 @@ -package datadog.trace.api.propagation - -import datadog.trace.api.DDTraceId -import datadog.trace.test.util.DDSpecification - -class W3CTraceParentTest extends DDSpecification { - - def "build produces correct format with isSampled=#isSampled"() { - when: - def result = W3CTraceParent.from(traceId, spanId, isSampled) - - then: - result == expected - - where: - traceId | spanId | isSampled | expected - DDTraceId.from(1) | 2 | true | "00-00000000000000000000000000000001-0000000000000002-01" - DDTraceId.from(1) | 2 | false | "00-00000000000000000000000000000001-0000000000000002-00" - DDTraceId.from(1) | 2 | true | "00-00000000000000000000000000000001-0000000000000002-01" - DDTraceId.fromHex("0af7651916cd43dd8448eb211c80319c") | 0x00f067aa0ba902b7L | true | "00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01" - DDTraceId.from(Long.MAX_VALUE) | Long.MAX_VALUE | true | "00-00000000000000007fffffffffffffff-7fffffffffffffff-01" - } - - def "build matches W3C traceparent format"() { - when: - def result = W3CTraceParent.from(DDTraceId.from(123456789L), 987654321L, true) - - then: - // W3C format: version-traceId(32 hex)-spanId(16 hex)-flags(2 hex) - result ==~ /00-[0-9a-f]{32}-[0-9a-f]{16}-(00|01)/ - } -} diff --git a/internal-api/src/test/java/datadog/trace/api/propagation/W3CTraceParentTest.java b/internal-api/src/test/java/datadog/trace/api/propagation/W3CTraceParentTest.java new file mode 100644 index 00000000000..6a600cc9244 --- /dev/null +++ b/internal-api/src/test/java/datadog/trace/api/propagation/W3CTraceParentTest.java @@ -0,0 +1,91 @@ +package datadog.trace.api.propagation; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.params.provider.Arguments.arguments; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import datadog.trace.api.DDTraceId; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; +import java.util.stream.Stream; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public class W3CTraceParentTest { + + @ParameterizedTest(name = "{0}") + @MethodSource("buildProducesCorrectFormatArguments") + void buildProducesCorrectFormat( + String scenario, DDTraceId traceId, long spanId, boolean isSampled, String expected) { + assertEquals(expected, W3CTraceParent.from(traceId, spanId, isSampled)); + } + + static Stream buildProducesCorrectFormatArguments() { + return Stream.of( + arguments( + "sampled", + DDTraceId.from(1), + 2L, + true, + "00-00000000000000000000000000000001-0000000000000002-01"), + arguments( + "not sampled", + DDTraceId.from(1), + 2L, + false, + "00-00000000000000000000000000000001-0000000000000002-00"), + arguments( + "W3C example", + DDTraceId.fromHex("0af7651916cd43dd8448eb211c80319c"), + 0x00f067aa0ba902b7L, + true, + "00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01"), + arguments( + "Long.MAX_VALUE ids", + DDTraceId.from(Long.MAX_VALUE), + Long.MAX_VALUE, + true, + "00-00000000000000007fffffffffffffff-7fffffffffffffff-01")); + } + + @Test + void buildMatchesW3CTraceparentFormat() { + // W3C format: version-traceId(32 hex)-spanId(16 hex)-flags(2 hex) + String result = W3CTraceParent.from(DDTraceId.from(123456789L), 987654321L, true); + assertTrue(result.matches("00-[0-9a-f]{32}-[0-9a-f]{16}-(00|01)")); + } + + @Test + void buildFromSpanSampled() { + AgentSpan span = mock(AgentSpan.class); + AgentSpanContext context = mock(AgentSpanContext.class); + DDTraceId traceId = DDTraceId.fromHex("0af7651916cd43dd8448eb211c80319c"); + long spanId = 0x00f067aa0ba902b7L; + + when(span.getTraceId()).thenReturn(traceId); + when(span.getSpanId()).thenReturn(spanId); + when(span.spanContext()).thenReturn(context); + when(context.getSamplingPriority()).thenReturn(1); + + assertEquals( + "00-0af7651916cd43dd8448eb211c80319c-00f067aa0ba902b7-01", W3CTraceParent.from(span)); + } + + @Test + void buildFromSpanNotSampled() { + AgentSpan span = mock(AgentSpan.class); + AgentSpanContext context = mock(AgentSpanContext.class); + + when(span.getTraceId()).thenReturn(DDTraceId.from(1)); + when(span.getSpanId()).thenReturn(2L); + when(span.spanContext()).thenReturn(context); + when(context.getSamplingPriority()).thenReturn(0); + + assertEquals( + "00-00000000000000000000000000000001-0000000000000002-00", W3CTraceParent.from(span)); + } +}