From 34e6f7542123bcea844c93f8dbc4f7f7822ab889 Mon Sep 17 00:00:00 2001 From: flystar32 Date: Thu, 28 Feb 2019 14:21:42 +0800 Subject: [PATCH] add ACM test case --- spring-cloud-alicloud-acm/pom.xml | 14 ++ .../DiamondConnectionFailureAnalyzer.java | 40 ---- .../DiamondConnectionFailureException.java | 52 ----- .../main/resources/META-INF/spring.factories | 5 +- .../alicloud/acm/AcmConfigurationTests.java | 191 ++++++++++++++++++ .../acm/AcmGroupConfigurationTest.java | 105 ++++++++++ .../acm/endpoint/AcmEndpointTests.java | 152 ++++++++++++++ .../context/acm/AcmIntegrationProperties.java | 4 + 8 files changed, 467 insertions(+), 96 deletions(-) delete mode 100644 spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureAnalyzer.java delete mode 100644 spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureException.java create mode 100644 spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java create mode 100644 spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java create mode 100644 spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java diff --git a/spring-cloud-alicloud-acm/pom.xml b/spring-cloud-alicloud-acm/pom.xml index 045812b35..5212fdd16 100644 --- a/spring-cloud-alicloud-acm/pom.xml +++ b/spring-cloud-alicloud-acm/pom.xml @@ -67,6 +67,20 @@ spring-boot-starter-test test + + + org.powermock + powermock-module-junit4 + 2.0.0 + test + + + org.powermock + powermock-api-mockito2 + 2.0.0 + test + + diff --git a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureAnalyzer.java b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureAnalyzer.java deleted file mode 100644 index 64d56be39..000000000 --- a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureAnalyzer.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.alicloud.acm.diagnostics.analyzer; - -import org.springframework.boot.diagnostics.AbstractFailureAnalyzer; -import org.springframework.boot.diagnostics.FailureAnalysis; - -/** - * A {@code FailureAnalyzer} that performs analysis of failures caused by a - * {@code DiamondConnectionFailureException}. - * - * @author juven.xuxb, 07/11/2016. - */ -public class DiamondConnectionFailureAnalyzer - extends AbstractFailureAnalyzer { - - @Override - protected FailureAnalysis analyze(Throwable rootFailure, - DiamondConnectionFailureException cause) { - return new FailureAnalysis( - "Application failed to connect to Diamond, unable to access http://" - + cause.getDomain() + ":" + cause.getPort() - + "/diamond-server/diamond", - "config the right endpoint", cause); - } -} diff --git a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureException.java b/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureException.java deleted file mode 100644 index a1b10abf6..000000000 --- a/spring-cloud-alicloud-acm/src/main/java/org/springframework/cloud/alicloud/acm/diagnostics/analyzer/DiamondConnectionFailureException.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2018 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.cloud.alicloud.acm.diagnostics.analyzer; - -/** - * A {@code DiamondConnectionFailureException} is thrown when the application fails to - * connect to Diamond Server. - * - * @author juven.xuxb, 07/11/2016. - */ -public class DiamondConnectionFailureException extends RuntimeException { - - private final String domain; - - private final String port; - - public DiamondConnectionFailureException(String domain, String port, String message) { - super(message); - this.domain = domain; - this.port = port; - } - - public DiamondConnectionFailureException(String domain, String port, String message, - Throwable cause) { - super(message, cause); - this.domain = domain; - this.port = port; - } - - String getDomain() { - return domain; - } - - String getPort() { - return port; - } - -} diff --git a/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories b/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories index 4f39095fe..b5708d188 100644 --- a/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-alicloud-acm/src/main/resources/META-INF/spring.factories @@ -3,7 +3,4 @@ org.springframework.cloud.alicloud.acm.bootstrap.AcmPropertySourceLocator org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.alicloud.acm.AcmAutoConfiguration,\ -org.springframework.cloud.alicloud.acm.endpoint.AcmEndpointAutoConfiguration - -org.springframework.boot.diagnostics.FailureAnalyzer=\ -org.springframework.cloud.alicloud.acm.diagnostics.analyzer.DiamondConnectionFailureAnalyzer \ No newline at end of file +org.springframework.cloud.alicloud.acm.endpoint.AcmEndpointAutoConfiguration \ No newline at end of file diff --git a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java new file mode 100644 index 000000000..ea6a4bdbf --- /dev/null +++ b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmConfigurationTests.java @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.alicloud.acm; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +import com.alibaba.edas.acm.ConfigService; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.api.support.MethodProxy; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.alicloud.acm.bootstrap.AcmPropertySourceLocator; +import org.springframework.cloud.alicloud.acm.endpoint.AcmEndpointAutoConfiguration; +import org.springframework.cloud.alicloud.context.acm.AcmContextBootstrapConfiguration; +import org.springframework.cloud.alicloud.context.acm.AcmIntegrationProperties; +import org.springframework.cloud.alicloud.context.acm.AcmProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * @author xiaojing + */ + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(SpringRunner.class) +@PrepareForTest({ ConfigService.class }) +@SpringBootTest(classes = AcmConfigurationTests.TestConfig.class, properties = { + "spring.application.name=test-name", "spring.profiles.active=dev,test", + "spring.cloud.alicloud.acm.server-list=127.0.0.1", + "spring.cloud.alicloud.acm.server-port=8848", + "spring.cloud.alicloud.acm.endpoint=test-endpoint", + "spring.cloud.alicloud.acm.namespace=test-namespace", + "spring.cloud.alicloud.acm.timeout=1000", + "spring.cloud.alicloud.acm.group=test-group", + "spring.cloud.alicloud.acm.refresh-enabled=false", + "spring.cloud.alicloud.acm.file-extension=properties" }, webEnvironment = NONE) +public class AcmConfigurationTests { + + static { + + try { + + Method method = PowerMockito.method(ConfigService.class, "getConfig", + String.class, String.class, long.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + + if ("test-name.properties".equals(args[0]) + && "test-group".equals(args[1])) { + return "user.name=hello\nuser.age=12"; + } + + if ("test-name-dev.properties".equals(args[0]) + && "test-group".equals(args[1])) { + return "user.name=dev"; + } + return ""; + } + }); + + } + catch (Exception ignore) { + ignore.printStackTrace(); + + } + } + + @Autowired + private Environment environment; + + @Autowired + private AcmPropertySourceLocator locator; + + @Autowired + private AcmIntegrationProperties integrationProperties; + + @Autowired + private AcmProperties properties; + + @Test + public void contextLoads() throws Exception { + + assertNotNull("AcmPropertySourceLocator was not created", locator); + assertNotNull("AcmProperties was not created", properties); + assertNotNull("AcmIntegrationProperties was not created", integrationProperties); + + checkoutAcmServerAddr(); + checkoutAcmServerPort(); + checkoutAcmEndpoint(); + checkoutAcmNamespace(); + checkoutAcmGroup(); + checkoutAcmFileExtension(); + checkoutAcmTimeout(); + checkoutAcmProfiles(); + checkoutAcmRefreshEnabled(); + checkoutDataLoad(); + } + + private void checkoutAcmServerAddr() { + assertEquals("AcmProperties server address is wrong", "127.0.0.1", + properties.getServerList()); + + } + + private void checkoutAcmServerPort() { + assertEquals("AcmProperties server port is wrong", "8848", + properties.getServerPort()); + + } + + private void checkoutAcmEndpoint() { + assertEquals("AcmProperties endpoint is wrong", "test-endpoint", + properties.getEndpoint()); + + } + + private void checkoutAcmNamespace() { + assertEquals("AcmProperties namespace is wrong", "test-namespace", + properties.getNamespace()); + + } + + private void checkoutAcmGroup() { + assertEquals("AcmProperties' group is wrong", "test-group", + properties.getGroup()); + } + + private void checkoutAcmFileExtension() { + assertEquals("AcmProperties' file extension is wrong", "properties", + properties.getFileExtension()); + } + + private void checkoutAcmTimeout() { + assertEquals("AcmProperties' timeout is wrong", 1000, properties.getTimeout()); + } + + private void checkoutAcmRefreshEnabled() { + assertEquals("AcmProperties' refresh enabled is wrong", false, + properties.isRefreshEnabled()); + } + + private void checkoutAcmProfiles() { + assertArrayEquals("AcmProperties' profiles is wrong", + new String[] { "dev", "test" }, + integrationProperties.getActiveProfiles()); + } + + private void checkoutDataLoad() { + Assert.assertEquals(environment.getProperty("user.name"), "dev"); + Assert.assertEquals(environment.getProperty("user.age"), "12"); + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ AcmEndpointAutoConfiguration.class, + AcmAutoConfiguration.class, AcmContextBootstrapConfiguration.class }) + public static class TestConfig { + } +} diff --git a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java new file mode 100644 index 000000000..2e8076aba --- /dev/null +++ b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/AcmGroupConfigurationTest.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.alicloud.acm; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +import com.alibaba.edas.acm.ConfigService; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.api.support.MethodProxy; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.alicloud.acm.endpoint.AcmEndpointAutoConfiguration; +import org.springframework.cloud.alicloud.context.acm.AcmContextBootstrapConfiguration; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; + +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + +/** + * @author xiaojing + */ + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(SpringRunner.class) +@PrepareForTest({ ConfigService.class }) +@SpringBootTest(classes = AcmGroupConfigurationTest.TestConfig.class, properties = { + "spring.application.name=test-name", "spring.application.group=com.test.hello", + "spring.cloud.alicloud.acm.server-list=127.0.0.1", + "spring.cloud.alicloud.acm.server-port=8080", + "spring.cloud.alicloud.acm.timeout=1000", + "spring.cloud.alicloud.acm.group=test-group" }, webEnvironment = NONE) +public class AcmGroupConfigurationTest { + + static { + + try { + Method method = PowerMockito.method(ConfigService.class, "getConfig", + String.class, String.class, long.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + if ("com.test:application.properties".equals(args[0]) + && "test-group".equals(args[1])) { + return "com.test.value=com.test"; + } + if ("com.test.hello:application.properties".equals(args[0]) + && "test-group".equals(args[1])) { + return "com.test.hello.value=com.test.hello"; + } + return ""; + } + }); + + } + catch (Exception ignore) { + ignore.printStackTrace(); + + } + } + + @Autowired + private Environment environment; + + @Test + public void contextLoads() throws Exception { + + Assert.assertEquals(environment.getProperty("com.test.value"), "com.test"); + Assert.assertEquals(environment.getProperty("com.test.hello.value"), + "com.test.hello"); + + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ AcmEndpointAutoConfiguration.class, + AcmAutoConfiguration.class, AcmContextBootstrapConfiguration.class }) + public static class TestConfig { + } +} diff --git a/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java new file mode 100644 index 000000000..dcef7f487 --- /dev/null +++ b/spring-cloud-alicloud-acm/src/test/java/org/springframework/cloud/alicloud/acm/endpoint/AcmEndpointTests.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.alicloud.acm.endpoint; + +import static org.junit.Assert.assertEquals; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.api.support.MethodProxy; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.powermock.modules.junit4.PowerMockRunnerDelegate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.health.Health.Builder; +import org.springframework.boot.actuate.health.HealthIndicator; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.ImportAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.alicloud.acm.AcmAutoConfiguration; +import org.springframework.cloud.alicloud.acm.AcmPropertySourceRepository; +import org.springframework.cloud.alicloud.acm.bootstrap.AcmPropertySourceLocator; +import org.springframework.cloud.alicloud.acm.refresh.AcmRefreshHistory; +import org.springframework.cloud.alicloud.context.acm.AcmContextBootstrapConfiguration; +import org.springframework.cloud.alicloud.context.acm.AcmIntegrationProperties; +import org.springframework.cloud.alicloud.context.acm.AcmProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import org.springframework.test.context.junit4.SpringRunner; + +import com.alibaba.edas.acm.ConfigService; + +/** + * @author xiaojing + */ + +@RunWith(PowerMockRunner.class) +@PowerMockRunnerDelegate(SpringRunner.class) +@PrepareForTest({ ConfigService.class }) +@SpringBootTest(classes = AcmEndpointTests.TestConfig.class, properties = { + "spring.application.name=test-name", + "spring.cloud.alicloud.acm.server-list=127.0.0.1", + "spring.cloud.alicloud.acm.server-port=8848", + "spring.cloud.alicloud.acm.file-extension=properties" }, webEnvironment = NONE) +public class AcmEndpointTests { + + static { + + try { + + Method method = PowerMockito.method(ConfigService.class, "getConfig", + String.class, String.class, long.class); + MethodProxy.proxy(method, new InvocationHandler() { + @Override + public Object invoke(Object proxy, Method method, Object[] args) + throws Throwable { + + if ("test-name.properties".equals(args[0]) + && "DEFAULT_GROUP".equals(args[1])) { + return "user.name=hello\nuser.age=12"; + } + return ""; + } + }); + + } + catch (Exception ignore) { + ignore.printStackTrace(); + + } + } + + @Autowired + private AcmProperties properties; + + @Autowired + private AcmRefreshHistory refreshHistory; + + @Autowired + private AcmPropertySourceRepository propertySourceRepository; + + @Autowired + private AcmPropertySourceRepository acmPropertySourceRepository; + + @Test + public void contextLoads() throws Exception { + + checkoutEndpoint(); + checkoutAcmHealthIndicator(); + + } + + private void checkoutAcmHealthIndicator() { + try { + Builder builder = new Builder(); + + AcmHealthIndicator healthIndicator = new AcmHealthIndicator(properties, + acmPropertySourceRepository); + healthIndicator.doHealthCheck(builder); + + Builder builder1 = new Builder(); + List dataIds = new ArrayList<>(); + dataIds.add("test-name.properties"); + builder1.up().withDetail("dataIds", dataIds); + + Assert.assertTrue(builder.build().equals(builder1.build())); + + } + catch (Exception ignoreE) { + + } + + } + + private void checkoutEndpoint() throws Exception { + AcmEndpoint acmEndpoint = new AcmEndpoint(properties, refreshHistory, + propertySourceRepository); + Map map = acmEndpoint.invoke(); + assertEquals(map.get("config"), properties); + assertEquals(((Map) map.get("runtime")).get("refreshHistory"), + refreshHistory.getRecords()); + } + + @Configuration + @EnableAutoConfiguration + @ImportAutoConfiguration({ AcmEndpointAutoConfiguration.class, + AcmAutoConfiguration.class, AcmContextBootstrapConfiguration.class }) + public static class TestConfig { + } +} diff --git a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java index 8491ef129..55c073b9b 100644 --- a/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java +++ b/spring-cloud-alicloud-context/src/main/java/org/springframework/cloud/alicloud/context/acm/AcmIntegrationProperties.java @@ -88,6 +88,10 @@ public class AcmIntegrationProperties { this.activeProfiles = activeProfiles; } + public String[] getActiveProfiles() { + return activeProfiles; + } + public void setAcmProperties(AcmProperties acmProperties) { this.acmProperties = acmProperties; }