package io.pcp.parfait;
import org.junit.Test;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
public class MonitorableRegistryTest {
@Test(expected = UnsupportedOperationException.class)
public void registerWithDuplicateNameThrowsException() {
MonitorableRegistry registry = newRegistry();
Monitorable<?> dummy = new DummyMonitorable("foo");
registry.register(dummy);
Monitorable<?> dummy2 = new DummyMonitorable("foo");
registry.register(dummy2);
}
@Test
public void willReusePreviouslyRegisteredMetricInstead() {
MonitorableRegistry registry = newRegistry();
Monitorable<?> dummy = new DummyMonitorable("foo");
registry.register(dummy);
Monitorable<?> dummy2 = new DummyMonitorable("foo");
Object reusedHopefully = registry.registerOrReuse(dummy2);
assertSame("Should have returned the same object reference from the first registration, instead brought back " + reusedHopefully, dummy, reusedHopefully);
}
@Test
public void getMonitorablesOnNewRegistryReturnsEmptyCollection() {
MonitorableRegistry registry = newRegistry();
assertTrue(registry.getMonitorables().isEmpty());
}
@Test
public void getMonitorablesReturnsRegisteredMonitorable() {
MonitorableRegistry registry = newRegistry();
Monitorable<?> dummy = new DummyMonitorable("foo");
registry.register(dummy);
assertTrue(registry.getMonitorables().contains(dummy));
}
@Test
public void getNamedInstanceReturnsExistingIfPresent() {
MonitorableRegistry registry1 = MonitorableRegistry.getNamedInstance("xxx");
MonitorableRegistry registry2 = MonitorableRegistry.getNamedInstance("xxx");
assertSame(registry1, registry2);
}
@Test
public void registryNotifiesOfChangeAfterNewRegistration(){
final MonitorableRegistry monitorableRegistry = new MonitorableRegistry();
final MonitorableRegistryListenerTester monitorableRegistryListener = new MonitorableRegistryListenerTester();
monitorableRegistry.addRegistryListener(monitorableRegistryListener);
final DummyMonitorable dummyMonitorable = new DummyMonitorable("foo");
final DummyMonitorable dummyMonitorable2 = new DummyMonitorable("bar");
monitorableRegistry.register(dummyMonitorable);
assertTrue("Should have notified of new Monitorable added", monitorableRegistryListener.monitorablesAdded == 1);
monitorableRegistry.register(dummyMonitorable2);
assertTrue("Should have notified of second new Monitorable added", monitorableRegistryListener.monitorablesAdded == 2);
}
private MonitorableRegistry newRegistry() {
return new MonitorableRegistry();
}
private static class MonitorableRegistryListenerTester implements MonitorableRegistryListener {
private int monitorablesAdded = 0;
@Override
public void monitorableAdded(Monitorable<?> monitorable){
monitorablesAdded++;
}
}
}