package org.sef4j.callstack.stats; import org.junit.Assert; import org.junit.Test; public class BasicTimeStatsLogHistogramTest { BasicTimeStatsLogHistogram sut = new BasicTimeStatsLogHistogram(); @Test public void testPerfTimeStats() { BasicTimeStatsSlotInfo[] slotInfos = sut.getSlotInfoCopy(); assertEquals(-9223372036854775807L, 0, 0, 0, slotInfos[0]); assertEquals(1, 31, 0, 0, slotInfos[1]); assertEquals(32, 63, 0, 0, slotInfos[2]); assertEquals(64, 127, 0, 0, slotInfos[3]); assertEquals(128, 255, 0, 0, slotInfos[4]); assertEquals(256, 511, 0, 0, slotInfos[5]); assertEquals(512, 1023, 0, 0, slotInfos[6]); assertEquals(1024, 2047, 0, 0, slotInfos[7]); assertEquals(2048, 4095, 0, 0, slotInfos[8]); assertEquals(4096, 9223372036854775807L, 0, 0, slotInfos[9]); } @Test public void testValueToSlotIndex() { // test slot[0] // Prepare BasicTimeStatsSlotInfo[] slotInfos = sut.getSlotInfoCopy(); // Perform sut.incr(0); // Post-check BasicTimeStatsSlotInfo slotCopy0 = sut.getSlotInfoCopyAt(0); assertEquals(Long.MIN_VALUE+1, 0, 1, 0, slotCopy0); // foreach slotIndex * (Prepare,Perform,Post-check) for(int slotIndex = 1; slotIndex < slotInfos.length-1; slotIndex++) { long from = slotInfos[slotIndex].getFrom(); long to = slotInfos[slotIndex].getTo(); BasicTimeStatsSlotInfo prevSlotCopy = sut.getSlotInfoCopyAt(slotIndex); for (long i = from; i < to; i++) { // Perform sut.incr(i); // Post-check BasicTimeStatsSlotInfo slotCopy = sut.getSlotInfoCopyAt(slotIndex); assertEquals(from, to, prevSlotCopy.getCount() + 1, prevSlotCopy.getSum() + i, slotCopy); prevSlotCopy = slotCopy; } } // test slot[SLOT_LEN] // Prepare long bigValue = 10000; // Perform sut.incr(bigValue); // Post-check BasicTimeStatsSlotInfo slotCopyLast = sut.getSlotInfoCopyAt(slotInfos.length-1); assertEquals(4096, Long.MAX_VALUE, 1, bigValue, slotCopyLast); } @Test public void testIncr() { // Prepare int add = 0; // Perform sut.incr(add); // Post-check int index = BasicTimeStatsLogHistogram.valueToSlotIndex(add); BasicTimeStatsSlotInfo[] copy = sut.getSlotInfoCopy(); Assert.assertEquals(1, copy[index].getCount()); Assert.assertEquals(add, copy[index].getSum()); // Prepare add = 20; // Perform sut.incr(add); // Post-check index = BasicTimeStatsLogHistogram.valueToSlotIndex(add); copy = sut.getSlotInfoCopy(); Assert.assertEquals(1, copy[index].getCount()); Assert.assertEquals(add, copy[index].getSum()); // Prepare // Perform sut.incr(add); // Post-check copy = sut.getSlotInfoCopy(); Assert.assertEquals(2, copy[index].getCount()); Assert.assertEquals(2*add, copy[index].getSum()); } @Test public void test_1_to_1000() { BasicTimeStatsLogHistogram sut = new BasicTimeStatsLogHistogram(); for(int i = 0; i < 10000; i++) { sut.incr(i); } BasicTimeStatsSlotInfo[] slotInfo = sut.getSlotInfoCopy(); Assert.assertEquals(1, slotInfo[0].getCount()); Assert.assertEquals(31, slotInfo[1].getCount()); // [1, 31] Assert.assertEquals(16.0, slotInfo[1].average(), 1e-6); Assert.assertEquals(32, slotInfo[2].getCount()); // [32,63] Assert.assertEquals((32+63)*.5, slotInfo[2].average(), 1e-6); Assert.assertEquals(64, slotInfo[3].getCount()); // 64, 127 Assert.assertEquals(128, slotInfo[4].getCount()); Assert.assertEquals(256, slotInfo[5].getCount()); // [256, 511] Assert.assertEquals(512, slotInfo[6].getCount()); // [512, 1024] for (int i = 0; i < slotInfo.length; i++) { BasicTimeStatsSlotInfo s = slotInfo[i]; double avg = ((double) s.getSum()) / s.getCount(); System.out.println("[" + s.getFrom() + " , " + s.getTo() + "] : " + s.getCount() + "x ~" + avg); } } @Test public void testGetSlotInfoCopy() { // Prepare // Perform // Post-check BasicTimeStatsSlotInfo[] slotInfos = sut.getSlotInfoCopy(); int len = slotInfos.length; for(int i = 0; i < len; i++) { BasicTimeStatsSlotInfo s = slotInfos[i]; Assert.assertEquals(0, s.getCount()); Assert.assertEquals(0, s.getSum()); // System.out.println("[" + s.getFrom() + "-" + s.getTo() + "] count:" + s.getCount() + ", sum:" + s.getSum() ); } assertEquals(-9223372036854775807L, 0, 0, 0, slotInfos[0]); assertEquals(1 , 31, 0, 0, slotInfos[1]); assertEquals(32 , 63, 0, 0, slotInfos[2]); assertEquals(64 , 127, 0, 0, slotInfos[3]); assertEquals(128 , 255, 0, 0, slotInfos[4]); assertEquals(256 , 511, 0, 0, slotInfos[5]); assertEquals(512 , 1023, 0, 0, slotInfos[6]); assertEquals(1024 , 2047, 0, 0, slotInfos[7]); assertEquals(2048 , 4095, 0, 0, slotInfos[8]); assertEquals(4096 , 9223372036854775807L, 0, 0, slotInfos[9]); } private static void assertEquals(long expectedFrom, long expectedTo, int expectedCount, long expectedSum, BasicTimeStatsSlotInfo actual) { Assert.assertEquals(expectedFrom, actual.getFrom()); Assert.assertEquals(expectedTo, actual.getTo()); Assert.assertEquals(expectedCount, actual.getCount()); Assert.assertEquals(expectedSum, actual.getSum()); } @Test public void testGetSlotInfoCopyAt() { // Prepare // Perform sut.incr(1); sut.incr(1); // Post-check BasicTimeStatsSlotInfo s = sut.getSlotInfoCopyAt(1); Assert.assertEquals(2, s.getCount()); Assert.assertEquals(2, s.getSum()); } }