Info endpoint

See gh-3492
This commit is contained in:
Meang Akira Tanaka
2015-07-14 19:42:34 +02:00
committed by Stephane Nicoll
parent 0f820afa86
commit 8bebe6dea9
15 changed files with 786 additions and 55 deletions

View File

@@ -37,6 +37,7 @@ import org.springframework.boot.actuate.endpoint.RequestMappingEndpoint;
import org.springframework.boot.actuate.endpoint.ShutdownEndpoint;
import org.springframework.boot.actuate.endpoint.TraceEndpoint;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.metrics.Metric;
import org.springframework.boot.autoconfigure.condition.ConditionEvaluationReport;
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
@@ -59,6 +60,8 @@ import static org.assertj.core.api.Assertions.assertThat;
* @author Christian Dupuis
* @author Stephane Nicoll
* @author Eddú Meléndez
* @author Meang Akira Tanaka
*
*/
public class EndpointAutoConfigurationTests {
@@ -143,6 +146,7 @@ public class EndpointAutoConfigurationTests {
EnvironmentTestUtils.addEnvironment(this.context, "info.foo:bar");
this.context.register(ProjectInfoAutoConfiguration.class, EndpointAutoConfiguration.class);
this.context.refresh();
InfoEndpoint endpoint = this.context.getBean(InfoEndpoint.class);
assertThat(endpoint).isNotNull();
assertThat(endpoint.invoke().get("git")).isNotNull();

View File

@@ -16,10 +16,14 @@
package org.springframework.boot.actuate.endpoint;
import java.util.Collections;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
import java.util.Map;
import org.junit.Test;
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoProvider;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -31,6 +35,7 @@ import static org.assertj.core.api.Assertions.assertThat;
*
* @author Phillip Webb
* @author Dave Syer
* @author Meang Akira Tanaka
*/
public class InfoEndpointTests extends AbstractEndpointTests<InfoEndpoint> {
@@ -40,7 +45,15 @@ public class InfoEndpointTests extends AbstractEndpointTests<InfoEndpoint> {
@Test
public void invoke() throws Exception {
assertThat(getEndpointBean().invoke().get("a")).isEqualTo("b");
Info actual = ((Info) getEndpointBean().invoke().get("environment"));
assertThat(actual.get("key1"), equalTo((Object) "value1"));
}
@Test
public void invoke_HasProvider_GetProviderInfo() throws Exception {
@SuppressWarnings("unchecked")
Map<String, Object> actual = ((Map<String, Object>) getEndpointBean().invoke().get("infoProvider"));
assertThat(actual.get("key1"), equalTo((Object) "value1"));
}
@Configuration
@@ -48,9 +61,29 @@ public class InfoEndpointTests extends AbstractEndpointTests<InfoEndpoint> {
public static class Config {
@Bean
public InfoEndpoint endpoint() {
return new InfoEndpoint(Collections.singletonMap("a", "b"));
public InfoProvider infoProvider() {
return new InfoProvider() {
@Override
public String name() {
return "environment";
}
@Override
public Info provide() {
Info result = new Info();
result.put("key1", "value1");
return result;
}
};
}
@Bean
public InfoEndpoint endpoint(Map<String, InfoProvider> infoProviders) {
return new InfoEndpoint(infoProviders);
}
}
}

View File

@@ -0,0 +1,115 @@
package org.springframework.boot.actuate.endpoint.mvc;
import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.util.Map;
import org.elasticsearch.common.collect.Maps;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.ManagementServerPropertiesAutoConfiguration;
import org.springframework.boot.actuate.endpoint.InfoEndpoint;
import org.springframework.boot.actuate.endpoint.mvc.InfoMvcEndpointTests.TestConfiguration;
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoProvider;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
import org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration;
import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
/**
* Tests for {@link InfoMvcEndpointTests}
*
* @author Meang Akira Tanaka
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { TestConfiguration.class })
@WebAppConfiguration
@TestPropertySource(properties = {"info.app.name=MyService"})
public class InfoMvcEndpointTests {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setUp() {
this.context.getBean(InfoEndpoint.class).setEnabled(true);
this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
@Test
public void home() throws Exception {
this.mvc.perform(get("/info")).andExpect(status().isOk())
.andExpect(content().string(containsString("\"beanName2\":{\"key22\":\"value22\",\"key21\":\"value21\"},\"beanName1\":{\"key12\":\"value12\",\"key11\":\"value11\"}")));
}
@Import({ JacksonAutoConfiguration.class,
HttpMessageConvertersAutoConfiguration.class,
EndpointWebMvcAutoConfiguration.class,
WebMvcAutoConfiguration.class,
ManagementServerPropertiesAutoConfiguration.class })
@Configuration
public static class TestConfiguration {
private Map<String, InfoProvider> infoProviders = Maps.newHashMap();
public TestConfiguration() {
InfoProvider infoProvider1 = new InfoProvider() {
@Override
public Info provide() {
Info result = new Info();
result.put("key11", "value11");
result.put("key12", "value12");
return result;
}
@Override
public String name() {
return "beanName1";
}
};
infoProviders.put("beanName1", infoProvider1);
InfoProvider infoProvider2 = new InfoProvider() {
@Override
public Info provide() {
Info result = new Info();
result.put("key21", "value21");
result.put("key22", "value22");
return result;
}
@Override
public String name() {
return "beanName2";
}
};
infoProviders.put("beanName2", infoProvider2);
}
@Bean
public InfoEndpoint endpoint() {
return new InfoEndpoint(infoProviders);
}
}
}

View File

@@ -0,0 +1,75 @@
package org.springframework.boot.actuate.endpoint.mvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.util.HashMap;
import java.util.Map;
import org.elasticsearch.common.collect.Maps;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.ManagementServerPropertiesAutoConfiguration;
import org.springframework.boot.actuate.endpoint.InfoEndpoint;
import org.springframework.boot.actuate.endpoint.mvc.InfoMvcEndpointWithoutAnyInfoProvidersTests.TestConfiguration;
import org.springframework.boot.actuate.info.InfoProvider;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
import org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration;
import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
/**
* Tests for {@link InfoMvcEndpointWithoutAnyInfoProvidersTests}
*
* @author Meang Akira Tanaka
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { TestConfiguration.class })
@WebAppConfiguration
public class InfoMvcEndpointWithoutAnyInfoProvidersTests {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setUp() {
this.context.getBean(InfoEndpoint.class).setEnabled(true);
this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
@Test
public void home() throws Exception {
this.mvc.perform(get("/info")).andExpect(status().isOk());
}
@Import({ JacksonAutoConfiguration.class,
HttpMessageConvertersAutoConfiguration.class,
EndpointWebMvcAutoConfiguration.class,
WebMvcAutoConfiguration.class,
ManagementServerPropertiesAutoConfiguration.class })
@Configuration
public static class TestConfiguration {
private Map<String, InfoProvider> infoProviders = Maps.newHashMap();
@Bean
public InfoEndpoint endpoint() {
return new InfoEndpoint(infoProviders);
}
}
}

View File

@@ -0,0 +1,64 @@
package org.springframework.boot.actuate.info;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import java.util.Properties;
import org.junit.Test;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.core.env.StandardEnvironment;
public class EnvironmentInfoProviderTest {
@Test
public void provide_HasTwoRelevantEntries_ShowOnlyRelevantEntries() throws Exception {
String expectedAppName = "my app name";
String expectedLanguage = "da-DK";
Properties properties = new Properties();
properties.setProperty("info.app", expectedAppName);
properties.setProperty("info.lang", expectedLanguage);
properties.setProperty("logging.path", "notExpected");
PropertySource<?> propertySource = new PropertiesPropertySource("mysettings", properties);
StandardEnvironment environment = new StandardEnvironment();
environment.getPropertySources().addLast(propertySource);
EnvironmentInfoProvider environmentInfoProvider = new EnvironmentInfoProvider(environment);
Info actual = environmentInfoProvider.provide();
assertThat(actual.getDetails().size(), is(equalTo(2)));
assertThat((String) actual.get("app"), is(equalTo(expectedAppName)));
assertThat((String) actual.get("lang"), is(equalTo(expectedLanguage)));
}
@Test
public void provide_HasNoRelevantEntries_NoEntries() throws Exception {
Properties properties = new Properties();
properties.setProperty("logging.path", "notExpected");
PropertySource<?> propertySource = new PropertiesPropertySource("mysettings", properties);
StandardEnvironment environment = new StandardEnvironment();
environment.getPropertySources().addLast(propertySource);
EnvironmentInfoProvider environmentInfoProvider = new EnvironmentInfoProvider(environment);
Info actual = environmentInfoProvider.provide();
assertThat(actual.getDetails().size(), is(equalTo(0)));
}
@Test
public void provide_HasNoEntries_NoEntries() throws Exception {
EnvironmentInfoProvider environmentInfoProvider = new EnvironmentInfoProvider(new StandardEnvironment());
Info actual = environmentInfoProvider.provide();
assertThat(actual.getDetails().size(), is(equalTo(0)));
}
}

View File

@@ -0,0 +1,98 @@
package org.springframework.boot.actuate.info;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.nullValue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Test;
import org.springframework.boot.actuate.info.ScmGitPropertiesInfoProvider.GitInfo.Commit;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.Resource;
public class ScmGitPropertiesInfoProviderTest {
@Test
public void provide_HasBadFormatButExists_EmptyInfoReturned() throws Exception {
Resource resource = new ByteArrayResource("GARBAGE".getBytes());
ScmGitPropertiesInfoProvider scmGitPropertiesInfoProvider = new ScmGitPropertiesInfoProvider(resource);
Info actual = scmGitPropertiesInfoProvider.provide();
assertThat(actual, is(not(nullValue())));
assertThat((String) actual.get("branch"), is(nullValue()));
Commit actualCommit = (Commit) actual.get("commit");
assertThat(actualCommit, is(not(nullValue())));
assertThat(actualCommit.getId(), is(equalTo("")));
assertThat(actualCommit.getTime(), is(nullValue()));
}
@Test
public void provide_HasValidFormat_ExpectedDataReturned() throws Exception {
String gitProperties = "git.commit.id.abbrev=e02a4f3\r\n"
+ "git.commit.user.email=dsyer@vmware.com\r\n"
+ "git.commit.message.full=Update Spring\r\n"
+ "git.commit.id=e02a4f3b6f452cdbf6dd311f1362679eb4c31ced\r\n"
+ "git.commit.message.short=Update Spring\r\n"
+ "git.commit.user.name=Dave Syer\r\n"
+ "git.build.user.name=Dave Syer\r\n"
+ "git.build.user.email=dsyer@vmware.com\r\n"
+ "git.branch=develop\r\n"
+ "git.commit.time=2013-04-24T08\\:42\\:13+0100\r\n"
+ "git.build.time=2013-05-23T09\\:26\\:42+0100\r\n";
Resource resource = new ByteArrayResource(gitProperties.getBytes());
ScmGitPropertiesInfoProvider scmGitPropertiesInfoProvider = new ScmGitPropertiesInfoProvider(resource);
Info actual = scmGitPropertiesInfoProvider.provide();
assertThat(actual, is(not(nullValue())));
assertThat((String) actual.get("branch"), is(equalTo("develop")));
Commit actualCommit = (Commit) actual.get("commit");
assertThat(actualCommit, is(not(nullValue())));
assertThat(actualCommit.getId(), is(equalTo("e02a4f3")));
assertThat(actualCommit.getTime(), is(equalTo("2013-04-24T08:42:13+0100")));
}
@Test
public void provide_HasValidFormatButMissingCommitTime_ExpectedDataReturnedWithoutCommitTime() throws Exception {
String gitProperties = "git.commit.id.abbrev=e02a4f3\r\n"
+ "git.commit.user.email=dsyer@vmware.com\r\n"
+ "git.commit.message.full=Update Spring\r\n"
+ "git.commit.id=e02a4f3b6f452cdbf6dd311f1362679eb4c31ced\r\n"
+ "git.commit.message.short=Update Spring\r\n"
+ "git.commit.user.name=Dave Syer\r\n"
+ "git.build.user.name=Dave Syer\r\n"
+ "git.build.user.email=dsyer@vmware.com\r\n"
+ "git.branch=develop\r\n"
+ "git.build.time=2013-05-23T09\\:26\\:42+0100\r\n";
Resource resource = new ByteArrayResource(gitProperties.getBytes());
ScmGitPropertiesInfoProvider scmGitPropertiesInfoProvider = new ScmGitPropertiesInfoProvider(resource);
Info actual = scmGitPropertiesInfoProvider.provide();
assertThat(actual, is(not(nullValue())));
assertThat((String) actual.get("branch"), is(equalTo("develop")));
Commit actualCommit = (Commit) actual.get("commit");
assertThat(actualCommit, is(not(nullValue())));
assertThat(actualCommit.getId(), is(equalTo("e02a4f3")));
assertThat(actualCommit.getTime(), is(nullValue()));
}
@Test
public void provide_DoesNotExists_NullReturned() throws Exception {
Resource resource = mock(Resource.class);
when(resource.exists())
.thenReturn(false);
ScmGitPropertiesInfoProvider scmGitPropertiesInfoProvider = new ScmGitPropertiesInfoProvider(resource);
Info actual = scmGitPropertiesInfoProvider.provide();
assertThat(actual, is(nullValue()));
}
}