package de.codecentric.boot.admin.registration; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.net.InetAddress; import java.net.UnknownHostException; import org.junit.Before; import org.junit.Test; import org.springframework.boot.SpringApplication; import org.springframework.boot.actuate.autoconfigure.ManagementServerProperties; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.embedded.Ssl; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.mock.env.MockEnvironment; import org.springframework.web.context.ConfigurableWebApplicationContext; import de.codecentric.boot.admin.client.config.AdminClientProperties; import de.codecentric.boot.admin.client.registration.Application; import de.codecentric.boot.admin.client.registration.DefaultApplicationFactory; public class DefaultApplicationFactoryTest { private AdminClientProperties client = new AdminClientProperties(); private ServerProperties server = new ServerProperties(); private ManagementServerProperties management = new ManagementServerProperties(); private DefaultApplicationFactory factory = new DefaultApplicationFactory(client, management, server, "/health"); @Before public void setup() { client.setName("test"); } @Test public void test_mgmtPortPath() { management.setContextPath("/admin"); DefaultApplicationFactory factory = new DefaultApplicationFactory(client, management, server, "/alive"); publishApplicationReadyEvent(factory, 8080, 8081); Application app = factory.createApplication(); assertThat(app.getManagementUrl(), is("http://" + getHostname() + ":8081/admin")); assertThat(app.getHealthUrl(), is("http://" + getHostname() + ":8081/admin/alive")); assertThat(app.getServiceUrl(), is("http://" + getHostname() + ":8080")); } @Test public void test_contextPath_mgmtPath() { server.setContextPath("app"); management.setContextPath("/admin"); publishApplicationReadyEvent(factory, 8080, null); Application app = factory.createApplication(); assertThat(app.getManagementUrl(), is("http://" + getHostname() + ":8080/app/admin")); assertThat(app.getHealthUrl(), is("http://" + getHostname() + ":8080/app/admin/health")); assertThat(app.getServiceUrl(), is("http://" + getHostname() + ":8080/app")); } @Test public void test_contextPath_mgmtPortPath() { server.setContextPath("app"); management.setContextPath("/admin"); publishApplicationReadyEvent(factory, 8080, 8081); Application app = factory.createApplication(); assertThat(app.getManagementUrl(), is("http://" + getHostname() + ":8081/admin")); assertThat(app.getHealthUrl(), is("http://" + getHostname() + ":8081/admin/health")); assertThat(app.getServiceUrl(), is("http://" + getHostname() + ":8080/app")); } @Test public void test_contextPath() { server.setContextPath("app"); publishApplicationReadyEvent(factory, 80, null); Application app = factory.createApplication(); assertThat(app.getManagementUrl(), is("http://" + getHostname() + ":80/app")); assertThat(app.getHealthUrl(), is("http://" + getHostname() + ":80/app/health")); assertThat(app.getServiceUrl(), is("http://" + getHostname() + ":80/app")); } @Test public void test_servletPath() { server.setServletPath("app"); server.setContextPath("srv"); publishApplicationReadyEvent(factory, 80, null); Application app = factory.createApplication(); assertThat(app.getManagementUrl(), is("http://" + getHostname() + ":80/srv/app")); assertThat(app.getHealthUrl(), is("http://" + getHostname() + ":80/srv/app/health")); assertThat(app.getServiceUrl(), is("http://" + getHostname() + ":80/srv")); } @Test public void test_default() { publishApplicationReadyEvent(factory, 8080, null); Application app = factory.createApplication(); assertThat(app.getManagementUrl(), is("http://" + getHostname() + ":8080")); assertThat(app.getHealthUrl(), is("http://" + getHostname() + ":8080/health")); assertThat(app.getServiceUrl(), is("http://" + getHostname() + ":8080")); } @Test public void test_ssl() { server.setSsl(new Ssl()); server.getSsl().setEnabled(true); publishApplicationReadyEvent(factory, 8080, null); Application app = factory.createApplication(); assertThat(app.getManagementUrl(), is("https://" + getHostname() + ":8080")); assertThat(app.getHealthUrl(), is("https://" + getHostname() + ":8080/health")); assertThat(app.getServiceUrl(), is("https://" + getHostname() + ":8080")); } @Test public void test_ssl_managment() { management.setSsl(new Ssl()); management.getSsl().setEnabled(true); publishApplicationReadyEvent(factory, 8080, 9090); Application app = factory.createApplication(); assertThat(app.getManagementUrl(), is("https://" + getHostname() + ":9090")); assertThat(app.getHealthUrl(), is("https://" + getHostname() + ":9090/health")); assertThat(app.getServiceUrl(), is("http://" + getHostname() + ":8080")); } @Test public void test_preferIpAddress_serveraddress_missing() { client.setPreferIp(true); publishApplicationReadyEvent(factory, 8080, null); Application app = factory.createApplication(); assertTrue(app.getServiceUrl() .matches("http://\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}:8080")); } @Test public void test_preferIpAddress_managementaddress_missing() { client.setPreferIp(true); publishApplicationReadyEvent(factory, 8080, 8081); Application app = factory.createApplication(); assertTrue(app.getManagementUrl() .matches("http://\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}\\.\\d{0,3}:8081")); } @Test public void test_preferIpAddress() throws UnknownHostException { client.setPreferIp(true); server.setAddress(InetAddress.getByName("127.0.0.1")); management.setAddress(InetAddress.getByName("127.0.0.2")); publishApplicationReadyEvent(factory, 8080, 8081); Application app = factory.createApplication(); assertThat(app.getManagementUrl(), is("http://127.0.0.2:8081")); assertThat(app.getHealthUrl(), is("http://127.0.0.2:8081/health")); assertThat(app.getServiceUrl(), is("http://127.0.0.1:8080")); } @Test public void test_allcustom() { client.setHealthUrl("http://health"); client.setManagementUrl("http://management"); client.setServiceUrl("http://service"); Application app = factory.createApplication(); assertThat(app.getServiceUrl(), is("http://service")); assertThat(app.getManagementUrl(), is("http://management")); assertThat(app.getHealthUrl(), is("http://health")); } @Test public void test_missingports() { try { factory.createApplication(); fail("IllegalStateException expected"); } catch (IllegalStateException ex) { assertThat(ex.getMessage(), containsString("serviceUrl")); } } private String getHostname() { try { return InetAddress.getLocalHost().getCanonicalHostName(); } catch (UnknownHostException e) { throw new IllegalStateException(e); } } private void publishApplicationReadyEvent(DefaultApplicationFactory factory, Integer serverport, Integer managementport) { MockEnvironment env = new MockEnvironment(); if (serverport != null) { env.setProperty("local.server.port", serverport.toString()); } if (managementport != null) { env.setProperty("local.management.port", managementport.toString()); } ConfigurableWebApplicationContext context = mock(ConfigurableWebApplicationContext.class); when(context.getEnvironment()).thenReturn(env); factory.onApplicationReady( new ApplicationReadyEvent(mock(SpringApplication.class), new String[] {}, context)); } }