package io.dropwizard.metrics.health; import org.junit.Before; import org.junit.Test; import io.dropwizard.metrics.health.HealthCheck; import io.dropwizard.metrics.health.HealthCheckRegistry; import java.util.Map; import java.util.NoSuchElementException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class HealthCheckRegistryTest { private final HealthCheckRegistry registry = new HealthCheckRegistry(); private final HealthCheck hc1 = mock(HealthCheck.class); private final HealthCheck hc2 = mock(HealthCheck.class); private final HealthCheck.Result r1 = mock(HealthCheck.Result.class); private final HealthCheck.Result r2 = mock(HealthCheck.Result.class); @Before public void setUp() throws Exception { when(hc1.execute()).thenReturn(r1); when(hc2.execute()).thenReturn(r2); registry.register("hc1", hc1); registry.register("hc2", hc2); } @Test public void runsRegisteredHealthChecks() throws Exception { final Map<String, HealthCheck.Result> results = registry.runHealthChecks(); assertThat(results) .contains(entry("hc1", r1)); assertThat(results) .contains(entry("hc2", r2)); } @Test public void runsRegisteredHealthChecksInParallel() throws Exception { final ExecutorService executor = Executors.newFixedThreadPool(10); final Map<String, HealthCheck.Result> results = registry.runHealthChecks(executor); executor.shutdown(); executor.awaitTermination(1, TimeUnit.SECONDS); assertThat(results) .contains(entry("hc1", r1)); assertThat(results) .contains(entry("hc2", r2)); } @Test public void removesRegisteredHealthChecks() throws Exception { registry.unregister("hc1"); final Map<String, HealthCheck.Result> results = registry.runHealthChecks(); assertThat(results) .doesNotContainKey("hc1"); assertThat(results) .containsKey("hc2"); } @Test public void hasASetOfHealthCheckNames() throws Exception { assertThat(registry.getNames()) .containsOnly("hc1", "hc2"); } @Test public void runsHealthChecksByName() throws Exception { assertThat(registry.runHealthCheck("hc1")) .isEqualTo(r1); } @Test public void doesNotRunNonexistentHealthChecks() throws Exception { try { registry.runHealthCheck("what"); failBecauseExceptionWasNotThrown(NoSuchElementException.class); } catch (NoSuchElementException e) { assertThat(e.getMessage()) .isEqualTo("No health check named what exists"); } } }