package org.sef4j.callstack;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.sef4j.callstack.CallStackElt.StackPopper;
import org.sef4j.callstack.handlers.SinglePerfStatsUpdaterCallStackHandler;
import org.sef4j.callstack.stats.PerfStats;
import org.sef4j.callstack.stats.ThreadTimeUtils;
import org.sef4j.callstack.stats.ThreadTimeUtilsTest;
public class CallStackEltTest {
private static final long PREC_MILLIS = 50;
private static final String CNAME = CallStackEltTest.class.getName();
@Test
public void testAddRootCallStackHandler() {
// Prepare
PerfStats perfStats = new PerfStats();
CallStackPushPopHandler handler = new SinglePerfStatsUpdaterCallStackHandler(perfStats);
CallStackPushPopHandler handler2 = new SinglePerfStatsUpdaterCallStackHandler(perfStats);
CallStack currCallStack = LocalCallStack.get();
CallStackElt currCallStackElt = currCallStack.curr();
List<CallStackPushPopHandler> handlersBefore = currCallStackElt.getPushPopHandlers();
// Perform
currCallStackElt.addRootCallStackHandler(handler);
// Post-check
List<CallStackPushPopHandler> handlers2 = currCallStackElt.getPushPopHandlers();
Assert.assertEquals(handlersBefore.size()+1, handlers2.size());
Assert.assertSame(handler, handlers2.get(handlers2.size()-1));
// Prepare
// Perform
currCallStackElt.addRootCallStackHandler(handler2);
// Post-check
List<CallStackPushPopHandler> handlers3 = currCallStackElt.getPushPopHandlers();
Assert.assertEquals(handlersBefore.size()+2, handlers3.size());
Assert.assertSame(handler2, handlers3.get(handlers3.size()-1));
// Prepare
// Perform
currCallStackElt.removeRootCallStackHandler(handler);
// Post-check
List<CallStackPushPopHandler> handlers4 = currCallStackElt.getPushPopHandlers();
Assert.assertEquals(handlersBefore.size()+1, handlers4.size());
// Prepare
// Perform
currCallStackElt.removeRootCallStackHandler(handler2);
// Post-check
List<CallStackPushPopHandler> handlers5 = currCallStackElt.getPushPopHandlers();
Assert.assertEquals(handlersBefore.size(), handlers5.size());
}
@Test
public void testRemoveRootCallStackHandler() {
// cf testAddRootCallStackHandler()
}
@Test
public void testPushPop_sleep_perfStats() throws Exception {
// Prepare
PerfStats perfStats = new PerfStats();
CallStackPushPopHandler handler = new SinglePerfStatsUpdaterCallStackHandler(perfStats);
CallStack currCallStack = LocalCallStack.get();
currCallStack.curr().addRootCallStackHandler(handler);
long threadSleepMillis = 50;
// Perform
StackPopper toPop = LocalCallStack.meth(CNAME, "test").push();
try {
Thread.sleep(threadSleepMillis);
} finally {
toPop.close();
}
// Post-check
long actualElapsedMillis = ThreadTimeUtils.approxMillisToMillis(perfStats.getElapsedTimeStats().cumulatedSum());
ThreadTimeUtilsTest.assertApproxEquals(threadSleepMillis,
actualElapsedMillis, PREC_MILLIS);
long actualThreadUserMillis = ThreadTimeUtils.approxMillisToMillis(perfStats.getThreadUserTimeStats().cumulatedSum());
ThreadTimeUtilsTest.assertApproxEquals(0,
actualThreadUserMillis, PREC_MILLIS);
long actualThreadCpuMillis = ThreadTimeUtils.approxMillisToMillis(perfStats.getThreadCpuTimeStats().cumulatedSum());
ThreadTimeUtilsTest.assertApproxEquals(0,
actualThreadCpuMillis, PREC_MILLIS);
}
@Test
public void testPushPop_cpu_perfStats() throws Exception {
// Prepare
PerfStats perfStats = new PerfStats();
CallStackPushPopHandler handler = new SinglePerfStatsUpdaterCallStackHandler(perfStats);
CallStack currCallStack = LocalCallStack.get();
currCallStack.curr().addRootCallStackHandler(handler);
// calibrate cpu loop for ~50 ms
long cpuLoopMillis = 100;
long cpuLoopCount = ThreadCpuTstUtils.cpuLoopCountForMillis(cpuLoopMillis);
// Perform
StackPopper toPop = LocalCallStack.meth(CNAME, "test").push();
try {
ThreadCpuTstUtils.cpuLoop(cpuLoopCount);
} finally {
toPop.close();
}
// Post-check
long actualElapsedMillis = ThreadTimeUtils.approxMillisToMillis(perfStats.getElapsedTimeStats().cumulatedSum());
long actualThreadUserMillis = ThreadTimeUtils.approxMillisToMillis(perfStats.getThreadUserTimeStats().cumulatedSum());
long actualThreadCpuMillis = ThreadTimeUtils.approxMillisToMillis(perfStats.getThreadCpuTimeStats().cumulatedSum());
long expectedLoopMillis = cpuLoopMillis + 3;
ThreadTimeUtilsTest.assertApproxEquals(expectedLoopMillis,
actualElapsedMillis, PREC_MILLIS);
ThreadTimeUtilsTest.assertApproxEquals(expectedLoopMillis,
actualThreadUserMillis, PREC_MILLIS);
ThreadTimeUtilsTest.assertApproxEquals(expectedLoopMillis,
actualThreadCpuMillis, PREC_MILLIS);
}
}