package com.bazaarvoice.ostrich.metrics; import com.codahale.metrics.Gauge; import com.codahale.metrics.Metric; import com.codahale.metrics.MetricRegistry; import org.junit.After; import org.junit.Test; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; public class ClassMetricsTest { private final MetricRegistry _registry = new MetricRegistry(); private final Metrics.ClassMetrics _metrics = Metrics.forClass(_registry, Service.class); @After public void teardown() { _metrics.close(); } @Test(expected = NullPointerException.class) public void testNullRegistry() { Metrics.forClass(null, Service.class); } @Test(expected = NullPointerException.class) public void testNullDomain() { Metrics.forClass(_registry, null); } @Test public void testNamesWithDifferentServiceNames() { String name1 = _metrics.name("serviceName1", "name"); String name2 = _metrics.name("serviceName2", "name"); assertNotEquals(name1, name2); } @Test public void testNamesWithIdenticalServiceNames() { String name1 = _metrics.name("serviceName", "name"); String name2 = _metrics.name("serviceName", "name"); assertEquals(name1, name2); } @Test(expected = NullPointerException.class) public void testNullGauge() { _metrics.gauge("serviceName", "name", null); } @SuppressWarnings("unchecked") @Test(expected = NullPointerException.class) public void testNewGaugeNullServiceName() { _metrics.gauge(null, "name", mock(Gauge.class)); } @SuppressWarnings("unchecked") @Test(expected = IllegalArgumentException.class) public void testNewGaugeEmptyServiceName() { _metrics.gauge("", "name", mock(Gauge.class)); } @SuppressWarnings("unchecked") @Test(expected = NullPointerException.class) public void testNewGaugeNullName() { _metrics.gauge("serviceName", null, mock(Gauge.class)); } @SuppressWarnings("unchecked") @Test(expected = IllegalArgumentException.class) public void testNewGaugeEmptyName() { _metrics.gauge("serviceName", "", mock(Gauge.class)); } @SuppressWarnings("unchecked") @Test public void testNewGauge() { _metrics.gauge("serviceName", "name", mock(Gauge.class)); assertRegistered("serviceName", "name"); } @Test(expected = NullPointerException.class) public void testNewCounterNullServiceName() { _metrics.counter(null, "name"); } @Test(expected = NullPointerException.class) public void testNewCounterNullName() { _metrics.counter("serviceName", null); } @Test(expected = IllegalArgumentException.class) public void testNewCounterEmptyServiceName() { _metrics.counter("", "name"); } @Test(expected = IllegalArgumentException.class) public void testNewCounterEmptyName() { _metrics.counter("serviceName", ""); } @Test public void testNewCounter() { _metrics.counter("serviceName", "name"); assertRegistered("serviceName", "name"); } @Test(expected = NullPointerException.class) public void testNewHistogramNullServiceName() { _metrics.histogram(null, "name"); } @Test(expected = NullPointerException.class) public void testNewHistogramNullName() { _metrics.histogram("serviceName", null); } @Test(expected = IllegalArgumentException.class) public void testNewHistogramEmptyServiceName() { _metrics.histogram("", "name"); } @Test(expected = IllegalArgumentException.class) public void testNewHistogramEmptyName() { _metrics.histogram("serviceName", ""); } @Test public void testNewHistogram() { _metrics.histogram("serviceName", "name"); assertRegistered("serviceName", "name"); } @Test(expected = NullPointerException.class) public void testNewMeterNullServiceName() { _metrics.meter(null, "name"); } @Test(expected = NullPointerException.class) public void testNewMeterNullName() { _metrics.meter("serviceName", null); } @Test(expected = IllegalArgumentException.class) public void testNewMeterEmptyServiceName() { _metrics.meter("", "name"); } @Test(expected = IllegalArgumentException.class) public void testNewMeterEmptyName() { _metrics.meter("serviceName", ""); } @Test public void testNewMeter() { _metrics.meter("serviceName", "name"); assertRegistered("serviceName", "name"); } @Test(expected = NullPointerException.class) public void testNewTimerNullServiceName() { _metrics.timer(null, "name"); } @Test(expected = NullPointerException.class) public void testNewTimerNullName() { _metrics.timer("serviceName", null); } @Test(expected = IllegalArgumentException.class) public void testNewTimerEmptyServiceName() { _metrics.timer("", "name"); } @Test(expected = IllegalArgumentException.class) public void testNewTimerEmptyName() { _metrics.timer("serviceName", ""); } @Test public void testNewTimer() { _metrics.timer("serviceName", "name"); assertRegistered("serviceName", "name"); } @Test public void testCloseUnregisters() { _metrics.counter("serviceName", "name"); assertRegistered("serviceName", "name"); _metrics.close(); assertNotRegistered("serviceName", "name"); } @Test public void testPathologicalServiceName() { // ,=:*? and newline are invalid characters in a JMX ObjectName. Backslash and quote need to be escaped. String serviceName = "\"\\,:=?*\n"; _metrics.name(serviceName, "name"); } @Test public void testPathologicalName() { // ,=:*? and newline are invalid characters in a JMX ObjectName. Backslash and quote need to be escaped. String name = "\"\\,:=?*\n"; _metrics.name("serviceName", name); } private void assertRegistered(String serviceName, String name) { String metricName = _metrics.name(serviceName, name); Metric metric = _registry.getMetrics().get(metricName); assertNotNull(metric); } private void assertNotRegistered(String serviceName, String name) { String metricName = _metrics.name(serviceName, name); Metric metric = _registry.getMetrics().get(metricName); assertNull(metric); } private static <T> void assertNotEquals(T a, T b) { assertThat(a, not(equalTo(b))); } // Dummy class for testing. private static class Service {} }