package rocks.inspectit.agent.java.sdk.opentracing.internal.propagation;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.testng.annotations.Test;
import io.opentracing.propagation.TextMap;
import rocks.inspectit.agent.java.sdk.opentracing.internal.constants.PropagationConstants;
import rocks.inspectit.agent.java.sdk.opentracing.internal.impl.SpanContextImpl;
import rocks.inspectit.agent.java.sdk.opentracing.internal.util.ConversionUtils;
import rocks.inspectit.shared.all.testbase.TestBase;
/**
* @author Ivan Senic
*
*/
@SuppressWarnings("PMD")
public class UrlEncodingPropagatorTest extends TestBase {
@InjectMocks
UrlEncodingPropagator propagator;
@Mock
TextMap carrier;
public static class Inject extends UrlEncodingPropagatorTest {
@Test
public void ids() {
SpanContextImpl context = SpanContextImpl.build();
propagator.inject(context, carrier);
verify(carrier).put(PropagationConstants.SPAN_ID, ConversionUtils.toHexString(context.getId()));
verify(carrier).put(PropagationConstants.TRACE_ID, ConversionUtils.toHexString(context.getTraceId()));
verifyNoMoreInteractions(carrier);
}
@Test
public void baggage() {
SpanContextImpl context = SpanContextImpl.build();
context.setBaggageItem("key", "value with spaces");
propagator.inject(context, carrier);
verify(carrier).put(PropagationConstants.INSPECTIT_BAGGAGE_PREFIX + "key", "value+with+spaces");
}
@Test
public void nullContext() {
propagator.inject(null, carrier);
verifyZeroInteractions(carrier);
}
}
public static class Extract extends UrlEncodingPropagatorTest {
@Test
public void ids() {
Map<String, String> map = new HashMap<String, String>();
map.put(PropagationConstants.SPAN_ID, ConversionUtils.toHexString(1L));
map.put(PropagationConstants.TRACE_ID, ConversionUtils.toHexString(2L));
when(carrier.iterator()).thenReturn(map.entrySet().iterator());
SpanContextImpl context = propagator.extract(carrier);
assertThat(context.getId(), is(1L));
assertThat(context.getTraceId(), is(2L));
assertThat(context.baggageItems().iterator().hasNext(), is(false));
}
@Test
public void idsWrong() {
Map<String, String> map = new HashMap<String, String>();
map.put(PropagationConstants.SPAN_ID, "whatever");
map.put(PropagationConstants.TRACE_ID, "whatever");
when(carrier.iterator()).thenReturn(map.entrySet().iterator());
SpanContextImpl context = propagator.extract(carrier);
assertThat(context, is(nullValue()));
}
@Test
public void onlySpanid() {
Map<String, String> map = new HashMap<String, String>();
map.put(PropagationConstants.SPAN_ID, ConversionUtils.toHexString(1L));
when(carrier.iterator()).thenReturn(map.entrySet().iterator());
SpanContextImpl context = propagator.extract(carrier);
assertThat(context, is(nullValue()));
}
@Test
public void onlyTraceId() {
Map<String, String> map = new HashMap<String, String>();
map.put(PropagationConstants.TRACE_ID, ConversionUtils.toHexString(2L));
when(carrier.iterator()).thenReturn(map.entrySet().iterator());
SpanContextImpl context = propagator.extract(carrier);
assertThat(context, is(nullValue()));
}
@Test
public void idsAndBaggage() {
Map<String, String> map = new HashMap<String, String>();
map.put(PropagationConstants.SPAN_ID, ConversionUtils.toHexString(1L));
map.put(PropagationConstants.TRACE_ID, ConversionUtils.toHexString(2L));
map.put(PropagationConstants.INSPECTIT_BAGGAGE_PREFIX + "key", "value+with+spaces");
when(carrier.iterator()).thenReturn(map.entrySet().iterator());
SpanContextImpl context = propagator.extract(carrier);
assertThat(context.getId(), is(1L));
assertThat(context.getTraceId(), is(2L));
Entry<String, String> entry = context.baggageItems().iterator().next();
assertThat(entry.getKey(), is("key"));
assertThat(entry.getValue(), is("value with spaces"));
}
@Test
public void idsAndNotOurBaggage() {
Map<String, String> map = new HashMap<String, String>();
map.put(PropagationConstants.SPAN_ID, ConversionUtils.toHexString(1L));
map.put(PropagationConstants.TRACE_ID, ConversionUtils.toHexString(2L));
map.put("somekey", "value");
when(carrier.iterator()).thenReturn(map.entrySet().iterator());
SpanContextImpl context = propagator.extract(carrier);
assertThat(context.getId(), is(1L));
assertThat(context.getTraceId(), is(2L));
assertThat(context.baggageItems().iterator().hasNext(), is(false));
}
@Test
public void carrierProvidesNullIterator() {
when(carrier.iterator()).thenReturn(null);
SpanContextImpl context = propagator.extract(carrier);
assertThat(context, is(nullValue()));
}
}
}