package netflix.adminresources; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.netflix.config.ConfigurationManager; import com.netflix.karyon.server.eureka.HealthCheckInvocationStrategy; import com.netflix.karyon.server.eureka.SyncHealthCheckInvocationStrategy; import com.netflix.karyon.spi.HealthCheckHandler; import org.apache.commons.configuration.AbstractConfiguration; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import javax.ws.rs.core.Response; import static org.junit.Assert.assertEquals; import netflix.admin.AdminConfigImpl; public class HealthCheckResourceTest { private AdminResourcesContainer container; @After public void tearDown() throws Exception { final AbstractConfiguration configInst = ConfigurationManager.getConfigInstance(); configInst.clearProperty(AdminConfigImpl.CONTAINER_LISTEN_PORT); if (container != null) { container.shutdown(); } } @Before public void init() { System.setProperty(AdminConfigImpl.CONTAINER_LISTEN_PORT, "0"); System.setProperty(AdminConfigImpl.NETFLIX_ADMIN_RESOURCE_CONTEXT, "/jr"); } @Test public void goodHealth() throws Exception { checkHealth(goodHealthHandler(), Response.Status.OK.getStatusCode()); } @Test public void badHealth() throws Exception { checkHealth(badHealthHandler(), Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()); } private void checkHealth(HealthCheckHandler healthCheckHandler, int respStatus) throws Exception { final AdminResourcesContainer adminResourcesContainer = buildAdminResourcesContainer(healthCheckHandler); adminResourcesContainer.init(); final int adminPort = adminResourcesContainer.getServerPort(); HttpClient client = new DefaultHttpClient(); HttpGet healthGet = new HttpGet(String.format("http://localhost:%d/jr/v2/healthcheck", adminPort)); HttpResponse response = client.execute(healthGet); assertEquals("admin resource health check resource failed.", respStatus, response.getStatusLine().getStatusCode()); adminResourcesContainer.shutdown(); } private AdminResourcesContainer buildAdminResourcesContainer(final HealthCheckHandler healthCheckHandler) throws Exception { final Injector appInjector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { bind(HealthCheckHandler.class).toInstance(healthCheckHandler); bind(HealthCheckInvocationStrategy.class).to(SyncHealthCheckInvocationStrategy.class); } }); return appInjector.getInstance(AdminResourcesContainer.class); } private HealthCheckHandler goodHealthHandler() { return new HealthCheckHandler() { @Override public int getStatus() { return Response.Status.OK.getStatusCode(); } }; } private HealthCheckHandler badHealthHandler() { return new HealthCheckHandler() { @Override public int getStatus() { return Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(); } }; } }