package rocks.inspectit.agent.java.tracing.core;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyString;
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.Collections;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import io.opentracing.References;
import io.opentracing.propagation.Format;
import io.opentracing.propagation.TextMap;
import io.opentracing.tag.Tags;
import rocks.inspectit.agent.java.sdk.opentracing.internal.impl.SpanBuilderImpl;
import rocks.inspectit.agent.java.sdk.opentracing.internal.impl.SpanContextImpl;
import rocks.inspectit.agent.java.sdk.opentracing.internal.impl.SpanImpl;
import rocks.inspectit.agent.java.sdk.opentracing.internal.impl.TracerImpl;
import rocks.inspectit.agent.java.tracing.core.adapter.ClientRequestAdapter;
import rocks.inspectit.agent.java.tracing.core.adapter.ResponseAdapter;
import rocks.inspectit.shared.all.testbase.TestBase;
import rocks.inspectit.shared.all.tracing.constants.ExtraTags;
import rocks.inspectit.shared.all.tracing.data.PropagationType;
/**
* @author Ivan Senic
*
*/
@SuppressWarnings("PMD")
public class ClientInterceptorTest extends TestBase {
@InjectMocks
ClientInterceptor interceptor;
@Mock
TracerImpl tracer;
@Mock
SpanImpl span;
public static class HandleRequest extends ClientInterceptorTest {
@Mock
SpanBuilderImpl spanBuilder;
@Mock
SpanContextImpl context;
@Mock
ClientRequestAdapter<TextMap> requestAdapter;
@Mock
TextMap carrier;
@BeforeMethod
public void setup() {
when(requestAdapter.getFormat()).thenReturn(Format.Builtin.TEXT_MAP);
when(requestAdapter.getCarrier()).thenReturn(carrier);
when(tracer.buildSpan(anyString(), anyString(), anyBoolean())).thenReturn(spanBuilder);
when(spanBuilder.start()).thenReturn(span);
when(span.context()).thenReturn(context);
}
@Test
public void happyPath() {
when(requestAdapter.startClientSpan()).thenReturn(true);
when(requestAdapter.getTags()).thenReturn(Collections.<String, String> singletonMap(Tags.HTTP_URL.getKey(), "value"));
when(requestAdapter.getPropagationType()).thenReturn(PropagationType.HTTP);
when(requestAdapter.getReferenceType()).thenReturn(References.CHILD_OF);
SpanImpl result = interceptor.handleRequest(requestAdapter);
assertThat(result, is(span));
verify(tracer).buildSpan(null, References.CHILD_OF, true);
verify(tracer).inject(context, Format.Builtin.TEXT_MAP, carrier);
verify(spanBuilder).doNotReport();
verify(spanBuilder).withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT);
verify(spanBuilder).withTag(ExtraTags.PROPAGATION_TYPE, PropagationType.HTTP.toString());
verify(spanBuilder).withTag(Tags.HTTP_URL.getKey(), "value");
verify(spanBuilder).start();
verify(span).context();
verifyNoMoreInteractions(tracer, spanBuilder, span);
verifyZeroInteractions(context);
}
@Test
public void spanShouldNotStart() {
when(requestAdapter.startClientSpan()).thenReturn(false);
SpanImpl result = interceptor.handleRequest(requestAdapter);
assertThat(result, is(nullValue()));
}
@Test
public void tagsNull() {
when(requestAdapter.startClientSpan()).thenReturn(true);
when(requestAdapter.getTags()).thenReturn(null);
when(requestAdapter.getPropagationType()).thenReturn(PropagationType.HTTP);
when(requestAdapter.getReferenceType()).thenReturn(References.CHILD_OF);
SpanImpl result = interceptor.handleRequest(requestAdapter);
assertThat(result, is(span));
verify(tracer).buildSpan(null, References.CHILD_OF, true);
verify(tracer).inject(context, Format.Builtin.TEXT_MAP, carrier);
verify(spanBuilder).doNotReport();
verify(spanBuilder).withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT);
verify(spanBuilder).withTag(ExtraTags.PROPAGATION_TYPE, PropagationType.HTTP.toString());
verify(spanBuilder).start();
verify(span).context();
verifyNoMoreInteractions(tracer, spanBuilder, span);
verifyZeroInteractions(context);
}
@Test
public void propagationNull() {
when(requestAdapter.startClientSpan()).thenReturn(true);
when(requestAdapter.getPropagationType()).thenReturn(null);
when(requestAdapter.getReferenceType()).thenReturn(References.CHILD_OF);
SpanImpl result = interceptor.handleRequest(requestAdapter);
assertThat(result, is(span));
verify(tracer).buildSpan(null, References.CHILD_OF, true);
verify(tracer).inject(context, Format.Builtin.TEXT_MAP, carrier);
verify(spanBuilder).doNotReport();
verify(spanBuilder).withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_CLIENT);
verify(spanBuilder).start();
verify(span).context();
verifyNoMoreInteractions(tracer, spanBuilder, span);
verifyZeroInteractions(context);
}
}
public static class HandleResponse extends ClientInterceptorTest {
@Mock
ResponseAdapter responseAdapter;
@Test
public void happyPath() {
when(responseAdapter.getTags()).thenReturn(Collections.<String, String> singletonMap(Tags.HTTP_STATUS.getKey(), "200"));
SpanImpl result = interceptor.handleResponse(span, responseAdapter);
assertThat(result, is(span));
verify(span).setTag(Tags.HTTP_STATUS.getKey(), "200");
verify(span).finish();
verifyNoMoreInteractions(span);
verifyZeroInteractions(tracer);
}
@Test
public void noRequestHandled() {
SpanImpl result = interceptor.handleResponse(null, responseAdapter);
assertThat(result, is(nullValue()));
verifyZeroInteractions(tracer, span);
}
@Test
public void tagsNull() {
when(responseAdapter.getTags()).thenReturn(null);
interceptor.handleResponse(span, responseAdapter);
verify(span).finish();
verifyNoMoreInteractions(span);
verifyZeroInteractions(tracer);
}
}
}