package org.skywalking.apm.agent.core.context;
import org.junit.After;
import org.junit.Assert;
import org.junit.Test;
import org.skywalking.apm.trace.Span;
import org.skywalking.apm.trace.TraceId.DistributedTraceId;
import org.skywalking.apm.trace.TraceId.PropagatedTraceId;
import org.skywalking.apm.trace.TraceSegment;
import org.skywalking.apm.trace.tag.Tags;
import java.util.LinkedList;
import java.util.List;
/**
* Created by wusheng on 2017/2/19.
*/
public class TracerContextTestCase {
@Test
public void testSpanLifeCycle() {
TracerContext context = new TracerContext();
Span span = context.createSpan("/serviceA", false);
Assert.assertEquals(span, context.activeSpan());
TracerContext.ListenerManager.add(TestTracerContextListener.INSTANCE);
final TraceSegment[] finishedSegmentCarrier = TestTracerContextListener.INSTANCE.finishedSegmentCarrier;
context.stopSpan(span);
Assert.assertNotNull(finishedSegmentCarrier[0]);
Assert.assertEquals(1, finishedSegmentCarrier[0].getSpans().size());
Assert.assertEquals(span, finishedSegmentCarrier[0].getSpans().get(0));
}
@Test
public void testChildOfSpan() {
TracerContext context = new TracerContext();
Span serviceSpan = context.createSpan("/serviceA", false);
Span dbSpan = context.createSpan("db/preparedStatement/execute", false);
Assert.assertEquals(dbSpan, context.activeSpan());
TracerContext.ListenerManager.add(TestTracerContextListener.INSTANCE);
final TraceSegment[] finishedSegmentCarrier = TestTracerContextListener.INSTANCE.finishedSegmentCarrier;
try {
context.stopSpan(serviceSpan);
} catch (Throwable t) {
Assert.assertTrue(t instanceof IllegalStateException);
}
context.stopSpan(dbSpan);
context.stopSpan(serviceSpan);
Assert.assertNotNull(finishedSegmentCarrier[0]);
Assert.assertEquals(2, finishedSegmentCarrier[0].getSpans().size());
Assert.assertEquals(dbSpan, finishedSegmentCarrier[0].getSpans().get(0));
}
@Test
public void testInject() {
TracerContext context = new TracerContext();
Span serviceSpan = context.createSpan("/serviceA", false);
Span dbSpan = context.createSpan("db/preparedStatement/execute", false);
Tags.PEER_HOST.set(dbSpan, "127.0.0.1");
Tags.PEER_PORT.set(dbSpan, 8080);
ContextCarrier carrier = new ContextCarrier();
context.inject(carrier);
Assert.assertEquals("127.0.0.1:8080", carrier.getPeerHost());
Assert.assertEquals(1, carrier.getSpanId());
}
@Test
public void testExtract() {
ContextCarrier carrier = new ContextCarrier();
carrier.setTraceSegmentId("trace_id_1");
carrier.setSpanId(5);
carrier.setApplicationCode("REMOTE_APP");
carrier.setPeerHost("10.2.3.16:8080");
List<DistributedTraceId> ids = new LinkedList<DistributedTraceId>();
ids.add(new PropagatedTraceId("Trace.global.id.123"));
carrier.setDistributedTraceIds(ids);
Assert.assertTrue(carrier.isValid());
TracerContext context = new TracerContext();
context.extract(carrier);
Span span = context.createSpan("/serviceC", false);
TracerContext.ListenerManager.add(TestTracerContextListener.INSTANCE);
final TraceSegment[] finishedSegmentCarrier = TestTracerContextListener.INSTANCE.finishedSegmentCarrier;
context.stopSpan(span);
Assert.assertEquals("trace_id_1", finishedSegmentCarrier[0].getRefs().get(0).getTraceSegmentId());
Assert.assertEquals(5, finishedSegmentCarrier[0].getRefs().get(0).getSpanId());
}
@After
public void reset() {
TracerContext.ListenerManager.remove(TestTracerContextListener.INSTANCE);
}
}