package rocks.inspectit.agent.java.tracing.core.transformer; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.nullValue; import static org.mockito.Mockito.when; import java.util.Collections; import org.mockito.Mock; import org.testng.annotations.Test; import io.opentracing.References; import io.opentracing.tag.Tags; import rocks.inspectit.agent.java.sdk.opentracing.internal.impl.SpanContextImpl; import rocks.inspectit.agent.java.sdk.opentracing.internal.impl.SpanImpl; import rocks.inspectit.shared.all.testbase.TestBase; import rocks.inspectit.shared.all.tracing.constants.ExtraTags; import rocks.inspectit.shared.all.tracing.data.AbstractSpan; import rocks.inspectit.shared.all.tracing.data.ClientSpan; import rocks.inspectit.shared.all.tracing.data.PropagationType; import rocks.inspectit.shared.all.tracing.data.ServerSpan; import rocks.inspectit.shared.all.tracing.data.SpanIdent; /** * @author Ivan Senic * */ @SuppressWarnings("PMD") public class SpanTransformerTest extends TestBase { public static class TransformSpan extends SpanTransformerTest { @Mock SpanImpl spanImpl; @Test public void spanNull() { AbstractSpan span = SpanTransformer.transformSpan(null); assertThat(span, is(nullValue())); } @Test public void contextNull() { when(spanImpl.context()).thenReturn(null); AbstractSpan span = SpanTransformer.transformSpan(spanImpl); assertThat(span, is(nullValue())); } @Test public void ident() { when(spanImpl.context()).thenReturn(new SpanContextImpl(1, 2, 3, null, Collections.<String, String> emptyMap())); AbstractSpan span = SpanTransformer.transformSpan(spanImpl); SpanIdent spanIdent = span.getSpanIdent(); assertThat(spanIdent.getId(), is(1L)); assertThat(spanIdent.getTraceId(), is(2L)); assertThat(spanIdent.getParentId(), is(3L)); } @Test public void client() { when(spanImpl.context()).thenReturn(SpanContextImpl.build()); when(spanImpl.isClient()).thenReturn(true); AbstractSpan span = SpanTransformer.transformSpan(spanImpl); assertThat(span, is(instanceOf(ClientSpan.class))); } @Test public void server() { when(spanImpl.context()).thenReturn(SpanContextImpl.build()); when(spanImpl.isClient()).thenReturn(false); AbstractSpan span = SpanTransformer.transformSpan(spanImpl); assertThat(span, is(instanceOf(ServerSpan.class))); } @Test public void reference() { when(spanImpl.context()).thenReturn(SpanContextImpl.build(SpanContextImpl.build(), References.FOLLOWS_FROM, Collections.<String, String> emptyMap())); when(spanImpl.isClient()).thenReturn(false); AbstractSpan span = SpanTransformer.transformSpan(spanImpl); assertThat(span.getReferenceType(), is(References.FOLLOWS_FROM)); } @Test public void propagation() { when(spanImpl.context()).thenReturn(SpanContextImpl.build()); when(spanImpl.getTags()).thenReturn(Collections.singletonMap(ExtraTags.PROPAGATION_TYPE, PropagationType.JMS.toString())); AbstractSpan span = SpanTransformer.transformSpan(spanImpl); assertThat(span.getPropagationType(), is(PropagationType.JMS)); assertThat(span.getTags().size(), is(0)); } @Test public void tag() { when(spanImpl.context()).thenReturn(SpanContextImpl.build()); when(spanImpl.getTags()).thenReturn(Collections.singletonMap("key", "value")); AbstractSpan span = SpanTransformer.transformSpan(spanImpl); assertThat(span.getTags().size(), is(1)); assertThat(span.getTags(), hasEntry("key", "value")); } @Test public void spanKindIgnored() { when(spanImpl.context()).thenReturn(SpanContextImpl.build()); when(spanImpl.getTags()).thenReturn(Collections.singletonMap(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER)); AbstractSpan span = SpanTransformer.transformSpan(spanImpl); assertThat(span.getTags().size(), is(0)); } @Test public void time() { long micros = 123456L; when(spanImpl.context()).thenReturn(SpanContextImpl.build()); when(spanImpl.getStartTimeMicros()).thenReturn(micros); AbstractSpan span = SpanTransformer.transformSpan(spanImpl); assertThat(span.getTimeStamp(), is(not(nullValue()))); assertThat(span.getTimeStamp().getTime(), is(123L)); } @Test public void duration() { double durationMicros = 123456.8856d; when(spanImpl.context()).thenReturn(SpanContextImpl.build()); when(spanImpl.getDuration()).thenReturn(durationMicros); AbstractSpan span = SpanTransformer.transformSpan(spanImpl); assertThat(span.getTimeStamp(), is(not(nullValue()))); assertThat(span.getDuration(), is(durationMicros / 1000.d)); } @Test public void transformerInterface() { when(spanImpl.context()).thenReturn(new SpanContextImpl(1, 2, 3, null, Collections.<String, String> emptyMap())); AbstractSpan span = SpanTransformer.INSTANCE.transform(spanImpl); SpanIdent spanIdent = span.getSpanIdent(); assertThat(spanIdent.getId(), is(1L)); assertThat(spanIdent.getTraceId(), is(2L)); assertThat(spanIdent.getParentId(), is(3L)); } @Test(expectedExceptions = IllegalArgumentException.class) public void transformerInterfaceWrongClass() { SpanTransformer.INSTANCE.transform("some string"); } } }