package org.sef4j.callstack.stats;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Assert;
import org.junit.Test;
public class PerfStatsTest {
private PerfStats sut = new PerfStats();
@Test
public void testAddPending() {
// Prepare
long startTime1 = 123L;
// Perform
sut.addPending(startTime1);
// Post-check
Assert.assertEquals(1, sut.getPendingCount());
Assert.assertEquals(startTime1, sut.getPendingSumStartTime());
// Prepare
long startTime2 = 456L;
// Perform
sut.addPending(startTime2);
// Post-check
Assert.assertEquals(2, sut.getPendingCount());
Assert.assertEquals(startTime1 + startTime2, sut.getPendingSumStartTime());
}
@Test
public void testRemovePending() {
// Prepare
long startTime1 = 123L;
// Perform
sut.addPending(startTime1);
// Post-check
Assert.assertEquals(1, sut.getPendingCount());
Assert.assertEquals(startTime1, sut.getPendingSumStartTime());
// Perform
sut.removePending(startTime1);
// Post-check
Assert.assertEquals(0, sut.getPendingCount());
Assert.assertEquals(0, sut.getPendingSumStartTime());
// Prepare
long startTime2 = 456L;
// Perform
sut.addPending(startTime1);
sut.addPending(startTime2);
sut.removePending(startTime2);
// Post-check
Assert.assertEquals(1, sut.getPendingCount());
Assert.assertEquals(startTime1, sut.getPendingSumStartTime());
}
public void testIncrAndRemovePending() {
// Prepare
long startTime = 123, threadUserStartTime = 100, threadCpuStartTime = 80;
long elapsedTime = 3, elapsedThreadUserTime = 2, elapsedThreadCpuTime = 1;
long endTime = startTime + elapsedTime;
long threadUserEndTime = threadUserStartTime + elapsedThreadUserTime;
long threadCpuEndTime = threadUserStartTime + elapsedThreadCpuTime;
// Perform
sut.addPending(startTime);
sut.incrAndRemovePending(startTime, threadUserStartTime, threadCpuStartTime,
endTime, threadUserEndTime, threadCpuEndTime);
// Post-check
Assert.assertEquals(0, sut.getPendingCount());
Assert.assertEquals(0, sut.getPendingSumStartTime());
BasicTimeStatsSlotInfo statElapsed1 = sut.getElapsedTimeStats().getSlotInfoCopyAt(1);
BasicTimeStatsSlotInfo statElapsedThreadUser1 = sut.getThreadUserTimeStats().getSlotInfoCopyAt(1);
BasicTimeStatsSlotInfo statElapsedThreadCpu1 = sut.getThreadCpuTimeStats().getSlotInfoCopyAt(1);
Assert.assertEquals(1, statElapsed1.getCount());
Assert.assertEquals(elapsedTime, statElapsed1.getSum());
Assert.assertEquals(1, statElapsedThreadUser1.getCount());
Assert.assertEquals(elapsedThreadUserTime, statElapsedThreadUser1.getSum());
Assert.assertEquals(1, statElapsedThreadCpu1.getCount());
Assert.assertEquals(elapsedThreadCpuTime, statElapsedThreadCpu1.getSum());
}
public void testIncr() {
// Prepare
long elapsedTime = 3, elapsedThreadUserTime = 2, elapsedThreadCpuTime = 1;
// Perform
sut.incr(elapsedTime, elapsedThreadUserTime, elapsedThreadCpuTime);
// Post-check
Assert.assertEquals(0, sut.getPendingCount());
Assert.assertEquals(0, sut.getPendingSumStartTime());
BasicTimeStatsSlotInfo statElapsed1 = sut.getElapsedTimeStats().getSlotInfoCopyAt(1);
BasicTimeStatsSlotInfo statElapsedThreadUser1 = sut.getThreadUserTimeStats().getSlotInfoCopyAt(1);
BasicTimeStatsSlotInfo statElapsedThreadCpu1 = sut.getThreadCpuTimeStats().getSlotInfoCopyAt(1);
Assert.assertEquals(1, statElapsed1.getCount());
Assert.assertEquals(elapsedTime, statElapsed1.getSum());
Assert.assertEquals(1, statElapsedThreadUser1.getCount());
Assert.assertEquals(elapsedThreadUserTime, statElapsedThreadUser1.getSum());
Assert.assertEquals(1, statElapsedThreadCpu1.getCount());
Assert.assertEquals(elapsedThreadCpuTime, statElapsedThreadCpu1.getSum());
}
@Test
public void testMultithreaded() {
// Prepare
final int threadCount = 10;
final int repeatCount = 1000;
final int elapsedTime = 1, elapsedThreadUserTime = 2, elapsedThreadCpuTime = 3;
final PerfStats stats = new PerfStats();
final AtomicInteger remainingCount = new AtomicInteger();
Runnable runnable = new Runnable() {
public void run() {
for (int i = 0; i < repeatCount; i++) {
stats.incr(elapsedTime, elapsedThreadUserTime, elapsedThreadCpuTime);
}
remainingCount.decrementAndGet();
}
};
// Perform
for(int i = 0; i < threadCount; i++) {
remainingCount.incrementAndGet();
new Thread(runnable).start();
}
while(true) {
if (0 == remainingCount.get()) {
break;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
// Post-check
BasicTimeStatsSlotInfo elapsedStats1 = stats.getElapsedTimeStats().getSlotInfoCopyAt(1);
BasicTimeStatsSlotInfo elapsedStatsThreadUser1 = stats.getThreadUserTimeStats().getSlotInfoCopyAt(1);
BasicTimeStatsSlotInfo elapsedStatsThreadCpu1 = stats.getThreadCpuTimeStats().getSlotInfoCopyAt(1);
Assert.assertEquals(threadCount*repeatCount*elapsedTime, elapsedStats1.getSum());
Assert.assertEquals(threadCount*repeatCount*elapsedThreadUserTime, elapsedStatsThreadUser1.getSum());
Assert.assertEquals(threadCount*repeatCount*elapsedThreadCpuTime, elapsedStatsThreadCpu1.getSum());
}
}