package org.jvalue.ods.admin.monitoring;
import com.codahale.metrics.Clock;
import com.codahale.metrics.Metric;
import com.codahale.metrics.MetricFilter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Reservoir;
import com.codahale.metrics.Timer;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Map;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;
import mockit.Expectations;
import mockit.Mocked;
import mockit.Verifications;
import mockit.integration.junit4.JMockit;
@RunWith(JMockit.class)
public class PauseableTimerTest {
@Mocked Timer anyTimer;
@Mocked MetricRegistry registry;
@Test
public void testRegularTimer() throws Exception {
PauseableTimer timer = PauseableTimer.createTimer(registry, "someName");
Assert.assertNotNull(timer.getTimer());
PauseableTimer.Context context = timer.createContext();
context.resume();
Thread.sleep(100);
context.stop();
new Verifications() {{
long time;
Timer timer = new Timer((Reservoir) any, (Clock) any);
timer.update(time = withCapture(), TimeUnit.NANOSECONDS);
Assert.assertTrue(time > 0);
}};
}
@Test
public void testPauseableTimer() throws Exception {
PauseableTimer timer = PauseableTimer.createTimer(registry, "someName");
PauseableTimer.Context context = timer.createContext();
context.resume();
context.pause();
Thread.sleep(100);
context.resume();
context.stop();
new Verifications() {{
long time;
Timer timer = new Timer((Reservoir) any, (Clock) any);
timer.update(time = withCapture(), TimeUnit.NANOSECONDS);
Assert.assertTrue(time > 0);
Assert.assertTrue(time < 100 * 1000);
}};
}
@Test
public void testTimerCaching() {
final String name = "someName";
final Map<String, Metric> timers = new TreeMap<>();
new Expectations() {{
registry.getTimers((MetricFilter) any);
result = timers;
}};
PauseableTimer timer = PauseableTimer.createTimer(registry, name);
timers.put(name, timer.getTimer());
timer = PauseableTimer.createTimer(registry, name);
new Verifications() {{
registry.register(name, (Metric) any);
times = 1;
}};
}
}