// Copyright (c) 2006 Dustin Sallings <dustin@spy.net>
package net.spy.stat;
import java.util.concurrent.Callable;
import junit.framework.TestCase;
import net.spy.test.SyncThread;
public class StatTest extends TestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
Stats.setInstance(null);
}
@Override
protected void tearDown() throws Exception {
Stats.setInstance(null);
super.tearDown();
}
public void testBumRushSingletonian() throws Throwable {
int n=SyncThread.getDistinctResultCount(50, new Callable<Stats>() {
public Stats call() throws Exception {
return Stats.getInstance();
}});
assertEquals(1, n);
}
public void testBumRushStatFetch() throws Throwable {
int n=SyncThread.getDistinctResultCount(50, new Callable<Stat>() {
public Stat call() throws Exception {
return Stats.getCounterStat("x");
}});
assertEquals(1, n);
}
public void testCounterStat() {
CounterStat cs=new CounterStat();
cs.setName("st.test");
assertEquals(0, cs.getCount());
assertEquals("0", cs.getStat());
assertEquals("st.test=0", String.valueOf(cs));
cs.setValue(100);
assertEquals(100, cs.getCount());
assertEquals("100", cs.getStat());
assertEquals("st.test=100", String.valueOf(cs));
cs.increment();
assertEquals(101, cs.getCount());
assertEquals("101", cs.getStat());
assertEquals("st.test=101", String.valueOf(cs));
cs.increment(3);
assertEquals(104, cs.getCount());
assertEquals("104", cs.getStat());
assertEquals("st.test=104", String.valueOf(cs));
cs.increment(-3);
assertEquals(101, cs.getCount());
assertEquals("101", cs.getStat());
assertEquals("st.test=101", String.valueOf(cs));
}
private void assertComputingStat(ComputingStat cs, long count, double sum,
double min, double avg, double davg, double max, double stddev) {
assertEquals(count, cs.getCount());
assertEquals(sum, cs.getSum());
assertEquals(min, cs.getMin());
assertEquals(avg, cs.getMean());
assertEquals(davg, cs.getDecayAvg());
assertEquals(max, cs.getMax());
if(Double.isNaN(stddev)) {
assertEquals(stddev, cs.getStddev());
} else {
assertEquals(stddev, cs.getStddev(), 0.0001);
}
}
public void testComputingStat() {
ComputingStat cs=new ComputingStat();
cs.setName("st.test2");
assertComputingStat(cs, 0, 0, Double.NaN, Double.NaN,
Double.NaN, Double.NaN, Double.NaN);
assertEquals("st.test2=compstat: count=0 sum=0.000000 min=NaN "
+ "avg=NaN davg=NaN max=NaN stddev=NaN", cs.toString());
cs.add(1);
cs.add(2);
cs.add(3);
cs.add(4);
assertComputingStat(cs, 4, 10d, 1d, 2.5d, 2.2d, 4d, 1.290994d);
assertEquals("st.test2=compstat: count=4 sum=10.000000 min=1.000000 "
+ "avg=2.500000 davg=2.200000 max=4.000000 stddev=1.290994",
cs.toString());
// clear it and do it again
cs.clear();
assertComputingStat(cs, 0, 0, Double.NaN, Double.NaN,
Double.NaN, Double.NaN, Double.NaN);
// Going to do this one in the other direction, which changes the
// the decaying average
cs.add(4);
cs.add(2);
cs.add(3);
cs.add(1);
assertComputingStat(cs, 4, 10d, 1d, 2.5d, 2.8d, 4d, 1.290994d);
assertEquals("st.test2=compstat: count=4 sum=10.000000 min=1.000000 "
+ "avg=2.500000 davg=2.800000 max=4.000000 stddev=1.290994",
cs.toString());
}
public void testStats() {
CounterStat cs=Stats.getCounterStat("st.test1");
assertEquals("st.test1", cs.getName());
assertEquals("st.test1=0", String.valueOf(cs));
assertSame(cs, Stats.getStat("st.test1"));
assertSame(cs, Stats.getInstance().getStats().get("st.test1"));
// Can't instantiate broken stats.
try {
Stat x = Stats.getStat("st.broken1", BrokenStat1.class);
fail("Expected exception, got " + x);
} catch(Exception e) {
assertEquals("Couldn't create a " + BrokenStat1.class,
e.getMessage());
assertEquals(Exception.class, e.getCause().getClass());
assertEquals("Can't instantiate me", e.getCause().getMessage());
}
try {
Stat x = Stats.getStat("st.broken2", BrokenStat2.class);
fail("Expected exception, got " + x);
} catch(Exception e) {
assertEquals("Couldn't create a " + BrokenStat2.class,
e.getMessage());
assertSame(IllegalAccessException.class, e.getCause().getClass());
}
try {
Stat x = Stats.getStat("st.broken3", BrokenStat3.class);
fail("Expected exception, got " + x);
} catch(Exception e) {
assertEquals("Objection!", e.getMessage());
assertEquals(IllegalArgumentException.class, e.getClass());
}
// None of that should be there.
assertNull(Stats.getStat("st.broken1"));
assertNull(Stats.getStat("st.broken2"));
assertNull(Stats.getStat("st.string"));
try {
ComputingStat comp=Stats.getComputingStat("st.test1");
fail("Expected failure to get counter stat as comp stat, got "
+ comp);
} catch(AssertionError e) {
assertEquals("st.test1=0 is not an instance of "
+ ComputingStat.class, e.getMessage());
}
ComputingStat comp=Stats.getComputingStat("compstat.test1");
assertNotNull(comp);
assertSame(comp, Stats.getComputingStat("compstat.test1"));
}
public static class BrokenStat1 extends Stat {
public BrokenStat1() throws Exception{
super();
throw new Exception("Can't instantiate me");
}
@Override
public String getStat() {
return(getClass().getName());
}
}
private static class BrokenStat2 extends Stat {
@Override
public String getStat() {
return(getClass().getName());
}
}
public static class BrokenStat3 extends Stat {
public BrokenStat3() throws Exception{
super();
throw new IllegalArgumentException("Objection!");
}
@Override
public String getStat() {
return(getClass().getName());
}
}
}