package rocks.inspectit.agent.java.sdk.opentracing.internal.impl; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasEntry; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.mockito.Mockito.atLeastOnce; 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 org.mockito.InjectMocks; import org.mockito.Mock; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import io.opentracing.tag.Tags; import rocks.inspectit.agent.java.sdk.opentracing.Timer; import rocks.inspectit.shared.all.testbase.TestBase; /** * @author Ivan Senic * */ @SuppressWarnings("PMD") public class SpanImplTest extends TestBase { @InjectMocks SpanImpl span; @Mock Timer timer; @Mock TracerImpl tracer; @BeforeMethod public void init() { when(tracer.getTimer()).thenReturn(timer); } public static class Start extends SpanImplTest { @Test public void happyPath() { long startTime = 1442l; span.start(startTime, 0); assertThat(span.getStartTimeMicros(), is(startTime)); verify(tracer).spanStarted(span); verifyNoMoreInteractions(tracer); verifyZeroInteractions(timer); } @Test(expectedExceptions = IllegalArgumentException.class) public void startTimeNotProvided() { span.start(0, 0); } } public static class Finish extends SpanImplTest { @Test public void noNanos() { long startTime = System.currentTimeMillis(); long endTime = startTime + 1223l; when(timer.getCurrentTimeMicroseconds()).thenReturn(endTime); span.start(startTime, 0); span.finish(); assertThat(span.getStartTimeMicros(), is(startTime)); assertThat(span.getDuration(), is((double) endTime - startTime)); verify(tracer).spanStarted(span); verify(tracer).spanEnded(span); verify(tracer, atLeastOnce()).getTimer(); verify(timer).getCurrentTimeMicroseconds(); verifyNoMoreInteractions(tracer, timer); } @Test public void noNanosExplicit() { long startTime = System.currentTimeMillis(); long endTime = startTime + 1223l; span.start(startTime, 0); span.finish(endTime); assertThat(span.getStartTimeMicros(), is(startTime)); assertThat(span.getDuration(), is((double) endTime - startTime)); verify(tracer).spanStarted(span); verify(tracer).spanEnded(span); verifyNoMoreInteractions(tracer); verifyZeroInteractions(timer); } @Test public void nanos() { long startTime = System.currentTimeMillis(); long startTimeNanos = System.nanoTime(); long endTimeNanos = startTimeNanos + 22546l; when(timer.getCurrentNanoTime()).thenReturn(endTimeNanos); span.start(startTime, startTimeNanos); span.finish(); assertThat(span.getStartTimeMicros(), is(startTime)); assertThat(span.getDuration(), is((endTimeNanos - startTimeNanos) / 1000.d)); verify(tracer).spanStarted(span); verify(tracer).spanEnded(span); verify(tracer, atLeastOnce()).getTimer(); verify(timer).getCurrentNanoTime(); verifyNoMoreInteractions(tracer, timer); } @Test public void nanosExplicit() { long startTime = System.currentTimeMillis(); long endTime = startTime + 1223l; span.start(startTime, 5467); span.finish(endTime); assertThat(span.getStartTimeMicros(), is(startTime)); assertThat(span.getDuration(), is((double) endTime - startTime)); verify(tracer).spanStarted(span); verify(tracer).spanEnded(span); verifyNoMoreInteractions(tracer); verifyZeroInteractions(timer); } } public static class Close extends SpanImplTest { @Test public void noNanos() { long startTime = System.currentTimeMillis(); long endTime = startTime + 1223l; when(timer.getCurrentTimeMicroseconds()).thenReturn(endTime); span.start(startTime, 0); span.close(); assertThat(span.getStartTimeMicros(), is(startTime)); assertThat(span.getDuration(), is((double) endTime - startTime)); verify(tracer).spanStarted(span); verify(tracer).spanEnded(span); verify(tracer, atLeastOnce()).getTimer(); verify(timer).getCurrentTimeMicroseconds(); verifyNoMoreInteractions(tracer, timer); } @Test public void nanos() { long startTime = System.currentTimeMillis(); long startTimeNanos = System.nanoTime(); long endTimeNanos = startTimeNanos + 22546l; when(timer.getCurrentNanoTime()).thenReturn(endTimeNanos); span.start(startTime, startTimeNanos); span.close(); assertThat(span.getStartTimeMicros(), is(startTime)); assertThat(span.getDuration(), is((endTimeNanos - startTimeNanos) / 1000.d)); verify(tracer).spanStarted(span); verify(tracer).spanEnded(span); verify(tracer, atLeastOnce()).getTimer(); verify(timer).getCurrentNanoTime(); verifyNoMoreInteractions(tracer, timer); } } public static class SetTag extends SpanImplTest { @Test public void booleanTag() { span.setTag("key", false); assertThat(span.getTags().size(), is(1)); assertThat(span.getTags(), hasEntry("key", String.valueOf(false))); } @Test public void numberTag() { span.setTag("key", 5l); assertThat(span.getTags().size(), is(1)); assertThat(span.getTags(), hasEntry("key", String.valueOf(5L))); } @Test public void stringTag() { span.setTag("key", "value"); assertThat(span.getTags().size(), is(1)); assertThat(span.getTags(), hasEntry("key", "value")); } } public static class Context extends SpanImplTest { @Test public void setContext() { SpanContextImpl spanContext = SpanContextImpl.build(); span.setSpanContext(spanContext); SpanContextImpl context = span.context(); assertThat(context, is(spanContext)); } } public static class SetBaggageItem extends SpanImplTest { @Test public void happyPath() { SpanContextImpl spanContext = SpanContextImpl.build(); span.setSpanContext(spanContext); span.setBaggageItem("key", "value"); assertThat(span.context().getBaggageItem("key"), is("value")); } @Test public void contextNull() { span.setBaggageItem("key", "value"); } } public static class GetBaggageItem extends SpanImplTest { @Test public void contextNull() { String baggageItem = span.getBaggageItem("key"); assertThat(baggageItem, is(nullValue())); } } public static class IsClient extends SpanImplTest { @Test public void specified() { Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); boolean client = span.isClient(); assertThat(client, is(true)); } @Test public void notSpecified() { boolean client = span.isClient(); assertThat(client, is(false)); } @Test public void notClient() { Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER); boolean client = span.isClient(); assertThat(client, is(false)); } } public static class IsServer extends SpanImplTest { @Test public void specified() { Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_SERVER); boolean server = span.isServer(); assertThat(server, is(true)); } @Test public void notSpecified() { boolean server = span.isServer(); assertThat(server, is(true)); } @Test public void notClient() { Tags.SPAN_KIND.set(span, Tags.SPAN_KIND_CLIENT); boolean server = span.isServer(); assertThat(server, is(false)); } } public static class Log extends SpanImplTest { @Test public void onlyPayload() { long time = 3444l; when(timer.getCurrentTimeMicroseconds()).thenReturn(time); String payload = "sent"; span.log(payload); // not impemneted, ignored verifyNoMoreInteractions(timer, tracer); } @Test public void payloadNull() { long time = 3444l; when(timer.getCurrentTimeMicroseconds()).thenReturn(time); span.log((String) null); // not impemneted, ignored verifyNoMoreInteractions(timer, tracer); } @SuppressWarnings("deprecation") @Test public void nameAndPayload() { long time = 3444l; when(timer.getCurrentTimeMicroseconds()).thenReturn(time); String payload = "sent"; String eventName = "myEventName"; span.log(eventName, payload); // not impemneted, ignored verifyNoMoreInteractions(timer, tracer); } @Test public void asMap() { long time = 3444l; when(timer.getCurrentTimeMicroseconds()).thenReturn(time); Map<String, Object> map = new HashMap<String, Object>(); map.put("e1", "p1"); map.put("e2", false); map.put("e3", 12d); span.log(map); // not impemneted, ignored verifyNoMoreInteractions(timer, tracer); } @Test public void asMapNull() { Map<String, String> m = null; span.log(1L, m); // not impemneted, ignored verifyNoMoreInteractions(timer, tracer); } @Test public void onlyPayloadWithTime() { long time = 3444l; String payload = "sent"; span.log(time, payload); // not impemneted, ignored verifyNoMoreInteractions(timer, tracer); } @SuppressWarnings("deprecation") @Test public void nameAndPayloadWithTime() { long time = 3444l; String payload = "sent"; String eventName = "myEventName"; span.log(time, eventName, payload); // not impemneted, ignored verifyNoMoreInteractions(timer, tracer); } @Test public void asMapWihtTime() { long time = 3444l; when(timer.getCurrentTimeMicroseconds()).thenReturn(time); Map<String, Object> map = new HashMap<String, Object>(); map.put("e1", "p1"); map.put("e2", false); map.put("e3", 12d); span.log(time, map); // not impemneted, ignored verifyNoMoreInteractions(timer, tracer); } } }