Skip to content

Commit 531abc0

Browse files
author
Anuraag Agrawal
authored
Fix more tracestate testsuite cases. (open-telemetry#3120)
1 parent 5bad869 commit 531abc0

5 files changed

Lines changed: 31 additions & 9 deletions

File tree

api/all/src/main/java/io/opentelemetry/api/trace/ArrayBasedTraceStateBuilder.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,9 @@ private static boolean isKeyValid(@Nullable String key) {
126126
if (i > MAX_TENANT_ID_SIZE) {
127127
return false;
128128
}
129-
// vendor id (the part to the right of the '@' sign) must be 13 characters or less
130-
if (key.length() - i > MAX_VENDOR_ID_SIZE) {
129+
// vendor id (the part to the right of the '@' sign) must be 1-13 characters long
130+
int remainingKeyChars = key.length() - i - 1;
131+
if (remainingKeyChars > MAX_VENDOR_ID_SIZE || remainingKeyChars == 0) {
131132
return false;
132133
}
133134
}

api/all/src/main/java/io/opentelemetry/api/trace/propagation/W3CTraceContextPropagator.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,11 @@ private static TraceState extractTraceState(String traceStateHeader) {
245245
checkArgument(index != -1, "Invalid TraceState list-member format.");
246246
traceStateBuilder.put(listMember.substring(0, index), listMember.substring(index + 1));
247247
}
248-
return traceStateBuilder.build();
248+
TraceState traceState = traceStateBuilder.build();
249+
if (traceState.size() != listMembers.length) {
250+
// Validation failure, drop the tracestate
251+
return TraceState.getDefault();
252+
}
253+
return traceState;
249254
}
250255
}

api/all/src/test/java/io/opentelemetry/api/trace/propagation/W3CTraceContextPropagatorTest.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import java.util.Map;
2525
import javax.annotation.Nullable;
2626
import org.junit.jupiter.api.Test;
27+
import org.junit.jupiter.params.ParameterizedTest;
28+
import org.junit.jupiter.params.provider.ValueSource;
2729

2830
/** Unit tests for {@link W3CTraceContextPropagator}. */
2931
class W3CTraceContextPropagatorTest {
@@ -448,10 +450,7 @@ void extract_InvalidTracestate_EmptyValue() {
448450
w3cTraceContextPropagator.extract(Context.current(), invalidHeaders, getter)))
449451
.isEqualTo(
450452
SpanContext.createFromRemoteParent(
451-
TRACE_ID_BASE16,
452-
SPAN_ID_BASE16,
453-
TraceFlags.getSampled(),
454-
TraceState.builder().put("test", "test").build()));
453+
TRACE_ID_BASE16, SPAN_ID_BASE16, TraceFlags.getSampled(), TraceState.getDefault()));
455454
}
456455

457456
@Test
@@ -545,4 +544,18 @@ void extract_nullGetter() {
545544
assertThat(w3cTraceContextPropagator.extract(context, Collections.emptyMap(), null))
546545
.isSameAs(context);
547546
}
547+
548+
// Tests transplanted from the w3c test suite
549+
550+
@ParameterizedTest
551+
@ValueSource(
552+
strings = {"foo@=1,bar=2", "@foo=1,bar=2", "foo@@bar=1,bar=2", "foo@bar@baz=1,bar=2"})
553+
void test_tracestate_key_illegal_vendor_format(String traceState) {
554+
Map<String, String> invalidHeaders = new HashMap<>();
555+
invalidHeaders.put(W3CTraceContextPropagator.TRACE_PARENT, TRACEPARENT_HEADER_SAMPLED);
556+
invalidHeaders.put(W3CTraceContextPropagator.TRACE_STATE, traceState);
557+
Context context =
558+
W3CTraceContextPropagator.getInstance().extract(Context.root(), invalidHeaders, getter);
559+
assertThat(Span.fromContext(context).getSpanContext().getTraceState().get("bar")).isNull();
560+
}
548561
}

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ subprojects {
319319
add(TEST_COMPILE_ONLY_CONFIGURATION_NAME, "com.google.code.findbugs:jsr305")
320320

321321
add(TEST_IMPLEMENTATION_CONFIGURATION_NAME, "org.junit.jupiter:junit-jupiter-api")
322+
add(TEST_IMPLEMENTATION_CONFIGURATION_NAME, "org.junit.jupiter:junit-jupiter-params")
322323
add(TEST_IMPLEMENTATION_CONFIGURATION_NAME, "nl.jqno.equalsverifier:equalsverifier")
323324
add(TEST_IMPLEMENTATION_CONFIGURATION_NAME, "org.mockito:mockito-core")
324325
add(TEST_IMPLEMENTATION_CONFIGURATION_NAME, "org.mockito:mockito-junit-jupiter")

integration-tests/tracecontext/src/main/java/io/opentelemetry/Application.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import io.opentelemetry.context.propagation.ContextPropagators;
2626
import io.opentelemetry.context.propagation.TextMapGetter;
2727
import io.opentelemetry.context.propagation.TextMapSetter;
28+
import io.opentelemetry.sdk.OpenTelemetrySdk;
2829
import java.util.List;
2930
import java.util.logging.Level;
3031
import java.util.logging.Logger;
@@ -39,8 +40,9 @@ public final class Application {
3940

4041
static {
4142
openTelemetry =
42-
OpenTelemetry.propagating(
43-
ContextPropagators.create(W3CTraceContextPropagator.getInstance()));
43+
OpenTelemetrySdk.builder()
44+
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
45+
.build();
4446
}
4547

4648
private enum ArmeriaGetter implements TextMapGetter<RequestHeaders> {

0 commit comments

Comments
 (0)