Handle nulls in noop / multi (#2939)

* Handle nulls in noop / multi

* Remove old file
This commit is contained in:
Anuraag Agrawal 2021-05-07 12:49:39 +09:00 committed by GitHub
parent bd6cfd85fb
commit 0b8131c79e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 81 additions and 29 deletions

View File

@ -45,6 +45,9 @@ final class MultiTextMapPropagator implements TextMapPropagator {
@Override
public <C> void inject(Context context, @Nullable C carrier, TextMapSetter<C> setter) {
if (context == null || setter == null) {
return;
}
for (TextMapPropagator textPropagator : textPropagators) {
textPropagator.inject(context, carrier, setter);
}
@ -52,6 +55,12 @@ final class MultiTextMapPropagator implements TextMapPropagator {
@Override
public <C> Context extract(Context context, @Nullable C carrier, TextMapGetter<C> getter) {
if (context == null) {
return Context.root();
}
if (getter == null) {
return context;
}
for (TextMapPropagator textPropagator : textPropagators) {
context = textPropagator.extract(context, carrier, getter);
}

View File

@ -27,6 +27,9 @@ final class NoopTextMapPropagator implements TextMapPropagator {
@Override
public <C> Context extract(Context context, @Nullable C carrier, TextMapGetter<C> getter) {
if (context == null) {
return Context.root();
}
return context;
}
}

View File

@ -12,9 +12,12 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.ContextKey;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
@ -26,6 +29,8 @@ import org.mockito.junit.jupiter.MockitoExtension;
@ExtendWith(MockitoExtension.class)
class MultiTextMapPropagatorTest {
private static final ContextKey<String> KEY = ContextKey.named("key");
@Mock private TextMapPropagator propagator1;
@Mock private TextMapPropagator propagator2;
@Mock private TextMapPropagator propagator3;
@ -93,19 +98,6 @@ class MultiTextMapPropagatorTest {
verify(propagator3).inject(context, carrier, setter);
}
@Test
void inject_nullContextAllDelegated() {
Map<String, String> carrier = new HashMap<>();
Context context = null;
TextMapSetter<Map<String, String>> setter = Map::put;
TextMapPropagator prop = new MultiTextMapPropagator(propagator1, propagator2, propagator3);
prop.inject(context, carrier, setter);
verify(propagator1).inject(context, carrier, setter);
verify(propagator2).inject(context, carrier, setter);
verify(propagator3).inject(context, carrier, setter);
}
@Test
void extract_noPropagators() {
Map<String, String> carrier = new HashMap<>();
@ -147,14 +139,33 @@ class MultiTextMapPropagatorTest {
@Test
void extract_nullContext() {
Map<String, String> carrier = new HashMap<>();
Context context = null;
when(propagator1.extract(context, carrier, getter)).thenReturn(context);
when(propagator2.extract(context, carrier, getter)).thenReturn(context);
assertThat(
new MultiTextMapPropagator(propagator1, propagator2)
.extract(null, Collections.emptyMap(), getter))
.isSameAs(Context.root());
}
TextMapPropagator prop = new MultiTextMapPropagator(propagator1, propagator2);
Context result = prop.extract(context, carrier, getter);
@Test
void extract_nullGetter() {
Context context = Context.current().with(KEY, "treasure");
assertThat(
new MultiTextMapPropagator(propagator1, propagator2)
.extract(context, Collections.emptyMap(), null))
.isSameAs(context);
}
assertThat(result).isSameAs(context);
@Test
void inject_nullContext() {
Map<String, String> carrier = new LinkedHashMap<>();
new MultiTextMapPropagator(propagator1, propagator2).inject(null, carrier, Map::put);
assertThat(carrier).isEmpty();
}
@Test
void inject_nullSetter() {
Map<String, String> carrier = new LinkedHashMap<>();
Context context = Context.current().with(KEY, "treasure");
new MultiTextMapPropagator(propagator1, propagator2).inject(context, carrier, null);
assertThat(carrier).isEmpty();
}
}

View File

@ -8,12 +8,18 @@ package io.opentelemetry.context.propagation;
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.ContextKey;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.annotation.Nullable;
import org.junit.jupiter.api.Test;
class NoopTextMapPropagatorTest {
private static final ContextKey<String> KEY = ContextKey.named("key");
@Test
void noopFields() {
assertThat(TextMapPropagator.noop().fields()).isEmpty();
@ -23,28 +29,51 @@ class NoopTextMapPropagatorTest {
void extract_contextUnchanged() {
Context input = Context.current();
Context result =
TextMapPropagator.noop().extract(input, new HashMap<>(), new HashMapTextMapGetter());
TextMapPropagator.noop().extract(input, new HashMap<>(), MapTextMapGetter.INSTANCE);
assertThat(result).isSameAs(input);
}
@Test
void extract_nullContext() {
Context input = null;
Context result =
TextMapPropagator.noop().extract(input, new HashMap<>(), new HashMapTextMapGetter());
assertThat(result).isSameAs(input);
assertThat(
TextMapPropagator.noop()
.extract(null, Collections.emptyMap(), MapTextMapGetter.INSTANCE))
.isSameAs(Context.root());
}
private static class HashMapTextMapGetter
implements TextMapGetter<HashMap<? extends Object, ? extends Object>> {
@Test
void extract_nullGetter() {
Context context = Context.current().with(KEY, "treasure");
assertThat(TextMapPropagator.noop().extract(context, Collections.emptyMap(), null))
.isSameAs(context);
}
@Test
void inject_nullContext() {
Map<String, String> carrier = new LinkedHashMap<>();
TextMapPropagator.noop().inject(null, carrier, Map::put);
assertThat(carrier).isEmpty();
}
@Test
void inject_nullSetter() {
Map<String, String> carrier = new LinkedHashMap<>();
Context context = Context.current().with(KEY, "treasure");
TextMapPropagator.noop().inject(context, carrier, null);
assertThat(carrier).isEmpty();
}
enum MapTextMapGetter implements TextMapGetter<Map<? extends Object, ? extends Object>> {
INSTANCE;
@Override
public Iterable<String> keys(HashMap<?, ?> carrier) {
public Iterable<String> keys(Map<?, ?> carrier) {
return null;
}
@Nullable
@Override
public String get(@Nullable HashMap<?, ?> carrier, String key) {
public String get(@Nullable Map<?, ?> carrier, String key) {
return null;
}
}