package com.yammer.telemetry.tracing; import com.google.common.base.Optional; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.math.BigInteger; import java.util.EmptyStackException; import static org.junit.Assert.*; public class SpanContextTest { private final SpanContext context = new SpanContext(); @Before public void setup() { SpanHelper.setSampler(Sampling.OFF); } @After public void teardown() { SpanHelper.setSampler(Sampling.ON); } @Test public void testCurrentItemsAbsentWhenWhenNoSpanStarted() { assertFalse(context.currentSpan().isPresent()); assertFalse(context.currentTraceId().isPresent()); assertFalse(context.currentSpanId().isPresent()); assertEquals(TraceLevel.OFF, context.currentTraceLevel()); } @Test public void testCurrentItemsAbsentWhenDisabledSpanStarted() { context.startSpan(new DisabledSpan()); assertTrue(context.currentSpan().isPresent()); assertFalse(context.currentTraceId().isPresent()); assertFalse(context.currentSpanId().isPresent()); assertEquals(TraceLevel.OFF, context.currentTraceLevel()); } @Test public void testCurrentItemsPresentWhenEnabledSpanStarted() { context.startSpan(new EnabledSpan(BigInteger.ONE, BigInteger.TEN, Optional.<BigInteger>absent(), "span", TraceLevel.INHERIT)); assertTrue(context.currentSpan().isPresent()); assertTrue(context.currentTraceId().isPresent()); assertTrue(context.currentSpanId().isPresent()); assertEquals(TraceLevel.INHERIT, context.currentTraceLevel()); } @Test(expected = EmptyStackException.class) public void testEndingUnknownSpanRaisesEmptyStackException() { context.startSpan(new EnabledSpan(BigInteger.ZERO, BigInteger.ONE, Optional.<BigInteger>absent(), "known", TraceLevel.INHERIT)); context.endSpan(new EnabledSpan(BigInteger.ONE, BigInteger.TEN, Optional.<BigInteger>absent(), "unknown", TraceLevel.INHERIT)); } @Test(expected = EmptyStackException.class) public void testEndingSpanWhenNonePresentRaisesEmptyStackException() { context.endSpan(new EnabledSpan(BigInteger.ONE, BigInteger.TEN, Optional.<BigInteger>absent(), "unknown", TraceLevel.INHERIT)); } @Test public void testEndingKnownSpan() { EnabledSpan knownSpan = new EnabledSpan(BigInteger.ZERO, BigInteger.ONE, Optional.<BigInteger>absent(), "known", TraceLevel.INHERIT); context.startSpan(knownSpan); context.endSpan(knownSpan); assertTrue(context.captureSpans().isEmpty()); } @Test public void testEndingChildSpanBeforeParentSpanBothEnabled() { Span parent = new EnabledSpan(BigInteger.ONE, BigInteger.ZERO, Optional.<BigInteger>absent(), "parent", TraceLevel.ON); Span child = new EnabledSpan(BigInteger.ONE, BigInteger.TEN, Optional.of(BigInteger.ZERO), "child", TraceLevel.INHERIT); context.startSpan(parent); context.startSpan(child); context.endSpan(child); assertFalse(context.captureSpans().isEmpty()); context.endSpan(parent); assertTrue(context.captureSpans().isEmpty()); } @Test(expected = EmptyStackException.class) public void testEndingParentSpanBeforeChildSpanBothEnabled() { Span parent = new EnabledSpan(BigInteger.ONE, BigInteger.ZERO, Optional.<BigInteger>absent(), "parent", TraceLevel.ON); Span child = new EnabledSpan(BigInteger.ONE, BigInteger.TEN, Optional.of(BigInteger.ZERO), "child", TraceLevel.INHERIT); context.startSpan(parent); context.startSpan(child); context.endSpan(parent); assertTrue(context.captureSpans().isEmpty()); context.endSpan(child); } @Test public void testEndingChildSpanBeforeParentSpanBothDisabled() { Span parent = new DisabledSpan(); Span child = new DisabledSpan(); context.startSpan(parent); context.startSpan(child); context.endSpan(child); assertFalse(context.captureSpans().isEmpty()); context.endSpan(parent); assertTrue(context.captureSpans().isEmpty()); } @Test(expected = EmptyStackException.class) public void testEndingParentSpanBeforeChildSpanBothDisabled() { Span parent = new DisabledSpan(); Span child = new DisabledSpan(); context.startSpan(parent); context.startSpan(child); context.endSpan(parent); assertTrue(context.captureSpans().isEmpty()); context.endSpan(child); } @Test public void testEndingChildSpanBeforeParentSpanParentEnabled() { Span parent = new EnabledSpan(BigInteger.ONE, BigInteger.ZERO, Optional.<BigInteger>absent(), "parent", TraceLevel.ON); Span child = new DisabledSpan(); context.startSpan(parent); context.startSpan(child); context.endSpan(child); assertFalse(context.captureSpans().isEmpty()); context.endSpan(parent); assertTrue(context.captureSpans().isEmpty()); } @Test(expected = EmptyStackException.class) public void testEndingParentSpanBeforeChildSpanParentEnabled() { Span parent = new EnabledSpan(BigInteger.ONE, BigInteger.ZERO, Optional.<BigInteger>absent(), "parent", TraceLevel.ON); Span child = new DisabledSpan(); context.startSpan(parent); context.startSpan(child); context.endSpan(parent); assertTrue(context.captureSpans().isEmpty()); context.endSpan(child); } @Test public void testEndingChildSpanBeforeParentSpanChildEnabled() { Span parent = new DisabledSpan(); Span child = new EnabledSpan(BigInteger.ONE, BigInteger.TEN, Optional.of(BigInteger.ZERO), "child", TraceLevel.INHERIT); context.startSpan(parent); context.startSpan(child); context.endSpan(child); assertFalse(context.captureSpans().isEmpty()); context.endSpan(parent); assertTrue(context.captureSpans().isEmpty()); } @Test(expected = EmptyStackException.class) public void testEndingParentSpanBeforeChildSpanChildEnabled() { Span parent = new DisabledSpan(); Span child = new EnabledSpan(BigInteger.ONE, BigInteger.TEN, Optional.of(BigInteger.ZERO), "child", TraceLevel.INHERIT); context.startSpan(parent); context.startSpan(child); context.endSpan(parent); assertTrue(context.captureSpans().isEmpty()); context.endSpan(child); } }