package org.skywalking.apm.sniffer.mock.context;
import org.junit.Assert;
import org.skywalking.apm.agent.core.context.TracerContext;
import org.skywalking.apm.agent.core.context.TracerContextListener;
import org.skywalking.apm.trace.TraceSegment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* This is mock tracer context listener, which should be added by calling {@link TracerContext.ListenerManager#add(TracerContextListener)}.
* This mock listener will hold all finished trace, which all are generated by {@link TracerContext#finish()}.
* <p>
* Created by wusheng on 2017/2/20.
*/
public class MockTracerContextListener implements TracerContextListener {
private List<TraceSegment> finishedTraceSegments = Collections.synchronizedList(new ArrayList<TraceSegment>());
@Override
public void afterFinished(TraceSegment traceSegment) {
finishedTraceSegments.add(traceSegment);
}
/**
* Assert all finished {@link #finishedTraceSegments} match the given size.
*
* @param size the give size.
*/
public void assertSize(int size) {
Assert.assertEquals(size, finishedTraceSegments.size());
}
/**
* Assert the given index is a valid index of {@link #finishedTraceSegments}
*
* @param index the given index.
*/
public void assertValidIndex(int index) {
Assert.assertTrue(index < finishedTraceSegments.size());
}
/**
* Assert the {@link TraceSegment} at the given index of {@link #finishedTraceSegments},
* and run the given {@link SegmentAssert#call(TraceSegment)} to assert.
*
* @param index the given index.
* @param segmentAssert the given assert.
*/
public void assertTraceSegment(int index, SegmentAssert segmentAssert) {
assertValidIndex(index);
segmentAssert.call(finishedTraceSegments.get(index));
}
/**
* Clear all hold data.
*/
public void clear() {
finishedTraceSegments.clear();
}
/**
* Get {@link TraceSegment} of the given index.
*
* @param index
* @return
*/
public TraceSegment getFinished(int index) {
assertSize(index + 1);
return finishedTraceSegments.get(index);
}
}