diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/ApolloDataSourceFactoryBeanTests.java b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/ApolloDataSourceFactoryBeanTests.java new file mode 100644 index 000000000..bc210f2f8 --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/ApolloDataSourceFactoryBeanTests.java @@ -0,0 +1,71 @@ +/* + * 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.alibaba.sentinel.datasource; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import org.junit.Test; +import org.springframework.cloud.alibaba.sentinel.datasource.converter.JsonConverter; +import org.springframework.cloud.alibaba.sentinel.datasource.factorybean.ApolloDataSourceFactoryBean; + +import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.csp.sentinel.datasource.apollo.ApolloDataSource; + +/** + * @author Jim + */ +public class ApolloDataSourceFactoryBeanTests { + + private String flowRuleKey = "sentinel"; + private String namespace = "namespace"; + private String defaultFlowValue = "{}"; + + @Test + public void testApolloFactoryBean() throws Exception { + ApolloDataSourceFactoryBean factoryBean = spy(new ApolloDataSourceFactoryBean()); + + Converter converter = mock(JsonConverter.class); + + factoryBean.setDefaultFlowRuleValue(defaultFlowValue); + factoryBean.setFlowRulesKey(flowRuleKey); + factoryBean.setNamespaceName(namespace); + factoryBean.setConverter(converter); + + ApolloDataSource apolloDataSource = mock(ApolloDataSource.class); + + when(apolloDataSource.readSource()).thenReturn("{}"); + doReturn(apolloDataSource).when(factoryBean).getObject(); + + assertEquals("ApolloDataSourceFactoryBean getObject error", apolloDataSource, + factoryBean.getObject()); + assertEquals("ApolloDataSource read source value was wrong", "{}", + factoryBean.getObject().readSource()); + assertEquals("ApolloDataSource converter was wrong", converter, + factoryBean.getConverter()); + assertEquals("ApolloDataSourceFactoryBean flowRuleKey was wrong", flowRuleKey, + factoryBean.getFlowRulesKey()); + assertEquals("ApolloDataSourceFactoryBean namespace was wrong", namespace, + factoryBean.getNamespaceName()); + assertEquals("ApolloDataSourceFactoryBean defaultFlowValue was wrong", + defaultFlowValue, factoryBean.getDefaultFlowRuleValue()); + } + +} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/DataSourcePropertiesConfigurationTests.java b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/DataSourcePropertiesConfigurationTests.java new file mode 100644 index 000000000..4845d4862 --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/DataSourcePropertiesConfigurationTests.java @@ -0,0 +1,230 @@ +/* + * 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.alibaba.sentinel.datasource; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import org.junit.Test; +import org.springframework.cloud.alibaba.sentinel.datasource.config.ApolloDataSourceProperties; +import org.springframework.cloud.alibaba.sentinel.datasource.config.DataSourcePropertiesConfiguration; +import org.springframework.cloud.alibaba.sentinel.datasource.config.FileDataSourceProperties; +import org.springframework.cloud.alibaba.sentinel.datasource.config.NacosDataSourceProperties; +import org.springframework.cloud.alibaba.sentinel.datasource.config.ZookeeperDataSourceProperties; + +/** + * @author Jim + */ +public class DataSourcePropertiesConfigurationTests { + + @Test + public void testFileAttr() { + DataSourcePropertiesConfiguration dataSourcePropertiesConfiguration = new DataSourcePropertiesConfiguration(); + assertEquals("DataSourcePropertiesConfiguration valid field size was wrong", 0, + dataSourcePropertiesConfiguration.getValidField().size()); + assertNull("DataSourcePropertiesConfiguration valid properties was not null", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + + FileDataSourceProperties fileDataSourceProperties = buildFileProperties(); + + dataSourcePropertiesConfiguration.setFile(fileDataSourceProperties); + + assertEquals( + "DataSourcePropertiesConfiguration valid field size was wrong after set file attribute", + 1, dataSourcePropertiesConfiguration.getValidField().size()); + assertNotNull( + "DataSourcePropertiesConfiguration file properties was null after set file attribute", + dataSourcePropertiesConfiguration.getFile()); + assertNotNull( + "DataSourcePropertiesConfiguration valid properties was null after set file attribute", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + } + + @Test + public void testNacosAttr() { + DataSourcePropertiesConfiguration dataSourcePropertiesConfiguration = new DataSourcePropertiesConfiguration(); + assertEquals("DataSourcePropertiesConfiguration valid field size was wrong", 0, + dataSourcePropertiesConfiguration.getValidField().size()); + assertNull("DataSourcePropertiesConfiguration valid properties was not null", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + + NacosDataSourceProperties nacosDataSourceProperties = buildNacosProperties(); + + dataSourcePropertiesConfiguration.setNacos(nacosDataSourceProperties); + + assertEquals( + "DataSourcePropertiesConfiguration valid field size was wrong after set nacos attribute", + 1, dataSourcePropertiesConfiguration.getValidField().size()); + assertNotNull( + "DataSourcePropertiesConfiguration nacos properties was null after set nacos attribute", + dataSourcePropertiesConfiguration.getNacos()); + assertNotNull( + "DataSourcePropertiesConfiguration valid properties was null after set nacos attribute", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + } + + @Test + public void testZKAttr() { + DataSourcePropertiesConfiguration dataSourcePropertiesConfiguration = new DataSourcePropertiesConfiguration(); + assertEquals("DataSourcePropertiesConfiguration valid field size was wrong", 0, + dataSourcePropertiesConfiguration.getValidField().size()); + assertNull("DataSourcePropertiesConfiguration valid properties was not null", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + + ZookeeperDataSourceProperties zookeeperDataSourceProperties = buildZKProperties(); + + dataSourcePropertiesConfiguration.setZk(zookeeperDataSourceProperties); + + assertEquals( + "DataSourcePropertiesConfiguration valid field size was wrong after set zk attribute", + 1, dataSourcePropertiesConfiguration.getValidField().size()); + assertNotNull( + "DataSourcePropertiesConfiguration zk properties was null after set zk attribute", + dataSourcePropertiesConfiguration.getZk()); + assertNotNull( + "DataSourcePropertiesConfiguration valid properties was null after set zk attribute", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + } + + @Test + public void testApolloAttr() { + DataSourcePropertiesConfiguration dataSourcePropertiesConfiguration = new DataSourcePropertiesConfiguration(); + assertEquals("DataSourcePropertiesConfiguration valid field size was wrong", 0, + dataSourcePropertiesConfiguration.getValidField().size()); + assertNull("DataSourcePropertiesConfiguration valid properties was not null", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + + ApolloDataSourceProperties apolloDataSourceProperties = buildApolloProperties(); + + dataSourcePropertiesConfiguration.setApollo(apolloDataSourceProperties); + + assertEquals( + "DataSourcePropertiesConfiguration valid field size was wrong after set apollo attribute", + 1, dataSourcePropertiesConfiguration.getValidField().size()); + assertNotNull( + "DataSourcePropertiesConfiguration apollo properties was null after set apollo attribute", + dataSourcePropertiesConfiguration.getApollo()); + assertNotNull( + "DataSourcePropertiesConfiguration valid properties was null after set apollo attribute", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + } + + @Test + public void testMultiAttr() { + DataSourcePropertiesConfiguration dataSourcePropertiesConfiguration = new DataSourcePropertiesConfiguration(); + assertEquals("DataSourcePropertiesConfiguration valid field size was wrong", 0, + dataSourcePropertiesConfiguration.getValidField().size()); + assertNull("DataSourcePropertiesConfiguration valid properties was not null", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + + FileDataSourceProperties fileDataSourceProperties = buildFileProperties(); + NacosDataSourceProperties nacosDataSourceProperties = buildNacosProperties(); + + dataSourcePropertiesConfiguration.setFile(fileDataSourceProperties); + dataSourcePropertiesConfiguration.setNacos(nacosDataSourceProperties); + + assertEquals( + "DataSourcePropertiesConfiguration valid field size was wrong after set file and nacos attribute", + 2, dataSourcePropertiesConfiguration.getValidField().size()); + assertNull( + "DataSourcePropertiesConfiguration valid properties was not null after set file and nacos attribute", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + } + + @Test + public void testFileConstructor() { + DataSourcePropertiesConfiguration dataSourcePropertiesConfiguration = new DataSourcePropertiesConfiguration( + buildFileProperties()); + assertEquals( + "DataSourcePropertiesConfiguration file constructor valid field size was wrong", + 1, dataSourcePropertiesConfiguration.getValidField().size()); + assertNotNull( + "DataSourcePropertiesConfiguration file constructor valid properties was null", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + } + + @Test + public void testNacosConstructor() { + DataSourcePropertiesConfiguration dataSourcePropertiesConfiguration = new DataSourcePropertiesConfiguration( + buildNacosProperties()); + assertEquals( + "DataSourcePropertiesConfiguration nacos constructor valid field size was wrong", + 1, dataSourcePropertiesConfiguration.getValidField().size()); + assertNotNull( + "DataSourcePropertiesConfiguration nacos constructor valid properties was null", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + } + + @Test + public void testApolloConstructor() { + DataSourcePropertiesConfiguration dataSourcePropertiesConfiguration = new DataSourcePropertiesConfiguration( + buildApolloProperties()); + assertEquals( + "DataSourcePropertiesConfiguration apollo constructor valid field size was wrong", + 1, dataSourcePropertiesConfiguration.getValidField().size()); + assertNotNull( + "DataSourcePropertiesConfiguration apollo constructor valid properties was null", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + } + + @Test + public void testZKConstructor() { + DataSourcePropertiesConfiguration dataSourcePropertiesConfiguration = new DataSourcePropertiesConfiguration( + buildZKProperties()); + assertEquals( + "DataSourcePropertiesConfiguration zk constructor valid field size was wrong", + 1, dataSourcePropertiesConfiguration.getValidField().size()); + assertNotNull( + "DataSourcePropertiesConfiguration zk constructor valid properties was null", + dataSourcePropertiesConfiguration.getValidDataSourceProperties()); + } + + private FileDataSourceProperties buildFileProperties() { + FileDataSourceProperties fileDataSourceProperties = new FileDataSourceProperties(); + + fileDataSourceProperties.setFile("/tmp/test.json"); + fileDataSourceProperties.setBufSize(1024); + fileDataSourceProperties.setRecommendRefreshMs(2000); + return fileDataSourceProperties; + } + + private NacosDataSourceProperties buildNacosProperties() { + NacosDataSourceProperties nacosDataSourceProperties = new NacosDataSourceProperties(); + nacosDataSourceProperties.setServerAddr("127.0.0.1:8848"); + nacosDataSourceProperties.setDataId("sentinel"); + nacosDataSourceProperties.setGroupId("custom-group"); + return nacosDataSourceProperties; + } + + private ApolloDataSourceProperties buildApolloProperties() { + ApolloDataSourceProperties apolloDataSourceProperties = new ApolloDataSourceProperties(); + apolloDataSourceProperties.setFlowRulesKey("test-key"); + apolloDataSourceProperties.setDefaultFlowRuleValue("dft-val"); + apolloDataSourceProperties.setNamespaceName("namespace"); + return apolloDataSourceProperties; + } + + private ZookeeperDataSourceProperties buildZKProperties() { + ZookeeperDataSourceProperties zookeeperDataSourceProperties = new ZookeeperDataSourceProperties(); + + zookeeperDataSourceProperties.setServerAddr("localhost:2181"); + zookeeperDataSourceProperties.setPath("/path"); + return zookeeperDataSourceProperties; + } + +} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/DataSourcePropertiesTests.java b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/DataSourcePropertiesTests.java new file mode 100644 index 000000000..e96373c8a --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/DataSourcePropertiesTests.java @@ -0,0 +1,180 @@ +/* + * 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.alibaba.sentinel.datasource; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import java.io.IOException; +import java.util.List; + +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.type.TypeReference; +import org.junit.Test; +import org.springframework.cloud.alibaba.sentinel.datasource.config.ApolloDataSourceProperties; +import org.springframework.cloud.alibaba.sentinel.datasource.config.FileDataSourceProperties; +import org.springframework.cloud.alibaba.sentinel.datasource.config.ZookeeperDataSourceProperties; +import org.springframework.cloud.alibaba.sentinel.datasource.factorybean.ApolloDataSourceFactoryBean; +import org.springframework.cloud.alibaba.sentinel.datasource.factorybean.FileRefreshableDataSourceFactoryBean; +import org.springframework.cloud.alibaba.sentinel.datasource.factorybean.ZookeeperDataSourceFactoryBean; +import org.springframework.util.ResourceUtils; +import org.springframework.util.StringUtils; + +import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; + +/** + * @author Jim + */ +public class DataSourcePropertiesTests { + + @Test + public void testApollo() { + ApolloDataSourceProperties apolloDataSourceProperties = new ApolloDataSourceProperties(); + apolloDataSourceProperties.setFlowRulesKey("test-key"); + apolloDataSourceProperties.setDefaultFlowRuleValue("dft-val"); + apolloDataSourceProperties.setNamespaceName("namespace"); + apolloDataSourceProperties.setRuleType(RuleType.DEGRADE); + assertEquals("Apollo flow rule key was wrong", "test-key", + apolloDataSourceProperties.getFlowRulesKey()); + assertEquals("Apollo namespace was wrong", "namespace", + apolloDataSourceProperties.getNamespaceName()); + assertEquals("Apollo default data type was wrong", "json", + apolloDataSourceProperties.getDataType()); + assertEquals("Apollo rule type was wrong", RuleType.DEGRADE, + apolloDataSourceProperties.getRuleType()); + assertEquals("Apollo default flow value was wrong", "dft-val", + apolloDataSourceProperties.getDefaultFlowRuleValue()); + assertEquals("Apollo factory bean was wrong", + ApolloDataSourceFactoryBean.class.getName(), + apolloDataSourceProperties.getFactoryBeanName()); + assertNull("Apollo converterClass was not null", + apolloDataSourceProperties.getConverterClass()); + } + + @Test + public void testZK() { + ZookeeperDataSourceProperties zookeeperDataSourceProperties = new ZookeeperDataSourceProperties(); + + zookeeperDataSourceProperties.setServerAddr("localhost:2181"); + zookeeperDataSourceProperties.setGroupId("groupId"); + zookeeperDataSourceProperties.setDataId("dataId"); + zookeeperDataSourceProperties.setPath("/path"); + zookeeperDataSourceProperties.setConverterClass("test.ConverterClass"); + zookeeperDataSourceProperties.setRuleType(RuleType.AUTHORITY); + + assertEquals("ZK serverAddr was wrong", "localhost:2181", + zookeeperDataSourceProperties.getServerAddr()); + assertEquals("ZK groupId was wrong", "groupId", + zookeeperDataSourceProperties.getGroupId()); + assertEquals("ZK dataId was wrong", "dataId", + zookeeperDataSourceProperties.getDataId()); + assertEquals("ZK path was wrong", "/path", + zookeeperDataSourceProperties.getPath()); + assertEquals("ZK factory bean was wrong", + ZookeeperDataSourceFactoryBean.class.getName(), + zookeeperDataSourceProperties.getFactoryBeanName()); + assertEquals("ZK custom converter class was wrong", "test.ConverterClass", + zookeeperDataSourceProperties.getConverterClass()); + assertEquals("ZK rule type was wrong", RuleType.AUTHORITY, + zookeeperDataSourceProperties.getRuleType()); + } + + @Test + public void testFileDefaultValue() { + FileDataSourceProperties fileDataSourceProperties = new FileDataSourceProperties(); + + fileDataSourceProperties.setFile("/tmp/test.json"); + fileDataSourceProperties.setRuleType(RuleType.PARAM_FLOW); + + assertEquals("File path was wrong", "/tmp/test.json", + fileDataSourceProperties.getFile()); + assertEquals("File charset was wrong", "utf-8", + fileDataSourceProperties.getCharset()); + assertEquals("File refresh time was wrong", 3000L, + fileDataSourceProperties.getRecommendRefreshMs()); + assertEquals("File buf size was wrong", 1024 * 1024, + fileDataSourceProperties.getBufSize()); + assertEquals("File factory bean was wrong", + FileRefreshableDataSourceFactoryBean.class.getName(), + fileDataSourceProperties.getFactoryBeanName()); + assertEquals("File rule type was wrong", RuleType.PARAM_FLOW, + fileDataSourceProperties.getRuleType()); + } + + @Test + public void testFileCustomValue() { + FileDataSourceProperties fileDataSourceProperties = new FileDataSourceProperties(); + + fileDataSourceProperties.setFile("/tmp/test.json"); + fileDataSourceProperties.setBufSize(1024); + fileDataSourceProperties.setRecommendRefreshMs(2000); + fileDataSourceProperties.setCharset("ISO8859-1"); + + assertEquals("File path was wrong", "/tmp/test.json", + fileDataSourceProperties.getFile()); + assertEquals("File charset was wrong", "ISO8859-1", + fileDataSourceProperties.getCharset()); + assertEquals("File refresh time was wrong", 2000L, + fileDataSourceProperties.getRecommendRefreshMs()); + assertEquals("File buf size was wrong", 1024, + fileDataSourceProperties.getBufSize()); + } + + @Test(expected = RuntimeException.class) + public void testFileException() { + FileDataSourceProperties fileDataSourceProperties = new FileDataSourceProperties(); + fileDataSourceProperties.setFile("classpath: 1.json"); + fileDataSourceProperties.preCheck("test-ds"); + } + + @Test + public void testPostRegister() throws Exception { + FileDataSourceProperties fileDataSourceProperties = new FileDataSourceProperties(); + + fileDataSourceProperties.setFile("classpath: flowrule.json"); + fileDataSourceProperties.setRuleType(RuleType.FLOW); + + FileRefreshableDataSource fileRefreshableDataSource = new FileRefreshableDataSource( + ResourceUtils + .getFile(StringUtils + .trimAllWhitespace(fileDataSourceProperties.getFile())) + .getAbsolutePath(), + new Converter>() { + ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public List convert(String source) { + try { + return objectMapper.readValue(source, + new TypeReference>() { + }); + } + catch (IOException e) { + // ignore + } + return null; + } + }); + fileDataSourceProperties.postRegister(fileRefreshableDataSource); + assertEquals("DataSourceProperties postRegister error", + fileRefreshableDataSource.loadConfig(), FlowRuleManager.getRules()); + } + +} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/FileRefreshableDataSourceFactoryBeanTests.java b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/FileRefreshableDataSourceFactoryBeanTests.java new file mode 100644 index 000000000..58b877755 --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/FileRefreshableDataSourceFactoryBeanTests.java @@ -0,0 +1,109 @@ +/* + * 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.alibaba.sentinel.datasource; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.List; + +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.type.TypeReference; +import org.junit.Test; +import org.springframework.cloud.alibaba.sentinel.datasource.factorybean.FileRefreshableDataSourceFactoryBean; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.ResourceUtils; + +import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; + +/** + * @author Jim + */ +public class FileRefreshableDataSourceFactoryBeanTests { + + @Test + public void testFile() throws Exception { + AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext( + TestConfig.class); + assertNotNull("FileRefreshableDataSourceFactoryBean was not created", + annotationConfigApplicationContext.getBean("fileBean")); + FileRefreshableDataSource fileRefreshableDataSource = annotationConfigApplicationContext + .getBean("fileBean", FileRefreshableDataSource.class); + assertEquals("FileRefreshableDataSourceFactoryBean flow rule size was wrong", 1, + ((List) fileRefreshableDataSource.loadConfig()).size()); + FileRefreshableDataSourceFactoryBean factoryBean = annotationConfigApplicationContext + .getBean("&fileBean", FileRefreshableDataSourceFactoryBean.class); + assertEquals("FileRefreshableDataSourceFactoryBean buf size was wrong", 1024, + factoryBean.getBufSize()); + assertEquals("FileRefreshableDataSourceFactoryBean charset was wrong", "utf-8", + factoryBean.getCharset()); + assertEquals("FileRefreshableDataSourceFactoryBean recommendRefreshMs was wrong", + 2000, factoryBean.getRecommendRefreshMs()); + assertNotNull("FileRefreshableDataSourceFactoryBean file was null", + factoryBean.getFile()); + assertNotNull("FileRefreshableDataSourceFactoryBean converter was null", + factoryBean.getConverter()); + } + + @Configuration + public static class TestConfig { + + @Bean + public FileRefreshableDataSourceFactoryBean fileBean() { + FileRefreshableDataSourceFactoryBean factoryBean = new FileRefreshableDataSourceFactoryBean(); + factoryBean.setBufSize(1024); + factoryBean.setCharset("utf-8"); + factoryBean.setRecommendRefreshMs(2000); + try { + factoryBean.setFile(ResourceUtils.getFile("classpath:flowrule.json") + .getAbsolutePath()); + } + catch (FileNotFoundException e) { + // ignore + } + factoryBean.setConverter(buildConverter()); + return factoryBean; + } + + private Converter buildConverter() { + return new Converter>() { + ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public List convert(String source) { + try { + return objectMapper.readValue(source, + new TypeReference>() { + }); + } + catch (IOException e) { + // ignore + } + return null; + } + }; + } + + } + +} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourceFactoryBeanTests.java b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourceFactoryBeanTests.java new file mode 100644 index 000000000..e724278cc --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourceFactoryBeanTests.java @@ -0,0 +1,115 @@ +/* + * 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.alibaba.sentinel.datasource; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import org.junit.Test; +import org.springframework.cloud.alibaba.sentinel.datasource.converter.SentinelConverter; +import org.springframework.cloud.alibaba.sentinel.datasource.factorybean.NacosDataSourceFactoryBean; + +import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource; + +/** + * @author Jim + */ +public class NacosDataSourceFactoryBeanTests { + + private String dataId = "sentinel"; + private String groupId = "DEFAULT_GROUP"; + private String serverAddr = "localhost:8848"; + private String accessKey = "ak"; + private String secretKey = "sk"; + private String endpoint = "endpoint"; + private String namespace = "namespace"; + + @Test + public void testNacosFactoryBeanServerAddr() throws Exception { + NacosDataSourceFactoryBean factoryBean = spy(new NacosDataSourceFactoryBean()); + + Converter converter = mock(SentinelConverter.class); + + factoryBean.setDataId(dataId); + factoryBean.setGroupId(groupId); + factoryBean.setServerAddr(serverAddr); + factoryBean.setConverter(converter); + + NacosDataSource nacosDataSource = mock(NacosDataSource.class); + + doReturn(nacosDataSource).when(factoryBean).getObject(); + when(nacosDataSource.readSource()).thenReturn("{}"); + + assertEquals("NacosDataSourceFactoryBean getObject was wrong", nacosDataSource, + factoryBean.getObject()); + assertEquals("NacosDataSource read source value was wrong", "{}", + factoryBean.getObject().readSource()); + assertEquals("NacosDataSource converter was wrong", converter, + factoryBean.getConverter()); + assertEquals("NacosDataSourceFactoryBean dataId was wrong", dataId, + factoryBean.getDataId()); + assertEquals("NacosDataSourceFactoryBean groupId was wrong", groupId, + factoryBean.getGroupId()); + assertEquals("NacosDataSourceFactoryBean serverAddr was wrong", serverAddr, + factoryBean.getServerAddr()); + } + + @Test + public void testNacosFactoryBeanProperties() throws Exception { + NacosDataSourceFactoryBean factoryBean = spy(new NacosDataSourceFactoryBean()); + + Converter converter = mock(SentinelConverter.class); + + factoryBean.setDataId(dataId); + factoryBean.setGroupId(groupId); + factoryBean.setAccessKey(accessKey); + factoryBean.setSecretKey(secretKey); + factoryBean.setEndpoint(endpoint); + factoryBean.setNamespace(namespace); + factoryBean.setConverter(converter); + + NacosDataSource nacosDataSource = mock(NacosDataSource.class); + + doReturn(nacosDataSource).when(factoryBean).getObject(); + when(nacosDataSource.readSource()).thenReturn("{}"); + + assertEquals("NacosDataSourceFactoryBean getObject was wrong", nacosDataSource, + factoryBean.getObject()); + assertEquals("NacosDataSource read source value was wrong", "{}", + factoryBean.getObject().readSource()); + assertEquals("NacosDataSource converter was wrong", converter, + factoryBean.getConverter()); + assertEquals("NacosDataSourceFactoryBean dataId was wrong", dataId, + factoryBean.getDataId()); + assertEquals("NacosDataSourceFactoryBean groupId was wrong", groupId, + factoryBean.getGroupId()); + assertEquals("NacosDataSourceFactoryBean namespace was wrong", namespace, + factoryBean.getNamespace()); + assertEquals("NacosDataSourceFactoryBean endpoint was wrong", endpoint, + factoryBean.getEndpoint()); + assertEquals("NacosDataSourceFactoryBean ak was wrong", accessKey, + factoryBean.getAccessKey()); + assertEquals("NacosDataSourceFactoryBean sk was wrong", secretKey, + factoryBean.getSecretKey()); + + } + +} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourcePropertiesTests.java b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourcePropertiesTests.java new file mode 100644 index 000000000..51f3a1f71 --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourcePropertiesTests.java @@ -0,0 +1,140 @@ +/* + * 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.alibaba.sentinel.datasource; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Test; +import org.springframework.cloud.alibaba.sentinel.datasource.config.NacosDataSourceProperties; +import org.springframework.cloud.alibaba.sentinel.datasource.factorybean.NacosDataSourceFactoryBean; + +/** + * @author Jim + */ +public class NacosDataSourcePropertiesTests { + + @Test + public void testNacosWithAddr() { + NacosDataSourceProperties nacosDataSourceProperties = new NacosDataSourceProperties(); + nacosDataSourceProperties.setServerAddr("127.0.0.1:8848"); + nacosDataSourceProperties.setRuleType(RuleType.FLOW); + nacosDataSourceProperties.setDataId("sentinel"); + nacosDataSourceProperties.setGroupId("custom-group"); + nacosDataSourceProperties.setDataType("xml"); + + assertEquals("Nacos groupId was wrong", "custom-group", + nacosDataSourceProperties.getGroupId()); + assertEquals("Nacos dataId was wrong", "sentinel", + nacosDataSourceProperties.getDataId()); + assertEquals("Nacos default data type was wrong", "xml", + nacosDataSourceProperties.getDataType()); + assertEquals("Nacos rule type was wrong", RuleType.FLOW, + nacosDataSourceProperties.getRuleType()); + assertEquals("Nacos default factory bean was wrong", + NacosDataSourceFactoryBean.class.getName(), + nacosDataSourceProperties.getFactoryBeanName()); + } + + @Test + public void testNacosWithProperties() { + NacosDataSourceProperties nacosDataSourceProperties = new NacosDataSourceProperties(); + nacosDataSourceProperties.setAccessKey("ak"); + nacosDataSourceProperties.setSecretKey("sk"); + nacosDataSourceProperties.setEndpoint("endpoint"); + nacosDataSourceProperties.setNamespace("namespace"); + nacosDataSourceProperties.setRuleType(RuleType.SYSTEM); + + assertEquals("Nacos ak was wrong", "ak", + nacosDataSourceProperties.getAccessKey()); + assertEquals("Nacos sk was wrong", "sk", + nacosDataSourceProperties.getSecretKey()); + assertEquals("Nacos endpoint was wrong", "endpoint", + nacosDataSourceProperties.getEndpoint()); + assertEquals("Nacos namespace was wrong", "namespace", + nacosDataSourceProperties.getNamespace()); + assertEquals("Nacos rule type was wrong", RuleType.SYSTEM, + nacosDataSourceProperties.getRuleType()); + } + + @Test + public void testNacosWithEDASAndWithoutSystemProperties() { + NacosDataSourceProperties nacosDataSourceProperties = NacosDataSourceProperties + .buildByEDAS(RuleType.DEGRADE.getName()); + assertEquals("Nacos groupId was wrong", "nacos-sentinel", + nacosDataSourceProperties.getGroupId()); + assertEquals("Nacos dataId was wrong", "null-" + RuleType.DEGRADE.getName(), + nacosDataSourceProperties.getDataId()); + assertEquals("Nacos default data type was wrong", "json", + nacosDataSourceProperties.getDataType()); + assertEquals("Nacos rule type was wrong", RuleType.DEGRADE, + nacosDataSourceProperties.getRuleType()); + assertNull("Nacos ak was not null", nacosDataSourceProperties.getAccessKey()); + assertNull("Nacos sk was not null", nacosDataSourceProperties.getSecretKey()); + assertNull("Nacos endpoint was not null", + nacosDataSourceProperties.getEndpoint()); + assertNull("Nacos namespace was not null", + nacosDataSourceProperties.getNamespace()); + assertNull("Nacos serverAddr was not null", + nacosDataSourceProperties.getServerAddr()); + } + + @Test + public void testNacosWithEDASDegradeAndWithoutSystemProperties() { + NacosDataSourceProperties nacosDataSourceProperties = NacosDataSourceProperties + .buildDegradeByEDAS(); + assertEquals("Nacos groupId was wrong", "nacos-sentinel", + nacosDataSourceProperties.getGroupId()); + assertEquals("Nacos dataId was wrong", "null-" + RuleType.DEGRADE.getName(), + nacosDataSourceProperties.getDataId()); + assertEquals("Nacos default data type was wrong", "json", + nacosDataSourceProperties.getDataType()); + assertEquals("Nacos rule type was wrong", RuleType.DEGRADE, + nacosDataSourceProperties.getRuleType()); + assertNull("Nacos ak was not null", nacosDataSourceProperties.getAccessKey()); + assertNull("Nacos sk was not null", nacosDataSourceProperties.getSecretKey()); + assertNull("Nacos endpoint was not null", + nacosDataSourceProperties.getEndpoint()); + assertNull("Nacos namespace was not null", + nacosDataSourceProperties.getNamespace()); + assertNull("Nacos serverAddr was not null", + nacosDataSourceProperties.getServerAddr()); + } + + @Test + public void testNacosWithEDASFlowAndWithoutSystemProperties() { + NacosDataSourceProperties nacosDataSourceProperties = NacosDataSourceProperties + .buildFlowByEDAS(); + assertEquals("Nacos groupId was wrong", "nacos-sentinel", + nacosDataSourceProperties.getGroupId()); + assertEquals("Nacos dataId was wrong", "null-" + RuleType.FLOW.getName(), + nacosDataSourceProperties.getDataId()); + assertEquals("Nacos default data type was wrong", "json", + nacosDataSourceProperties.getDataType()); + assertEquals("Nacos rule type was wrong", RuleType.FLOW, + nacosDataSourceProperties.getRuleType()); + assertNull("Nacos ak was not null", nacosDataSourceProperties.getAccessKey()); + assertNull("Nacos sk was not null", nacosDataSourceProperties.getSecretKey()); + assertNull("Nacos endpoint was not null", + nacosDataSourceProperties.getEndpoint()); + assertNull("Nacos namespace was not null", + nacosDataSourceProperties.getNamespace()); + assertNull("Nacos serverAddr was not null", + nacosDataSourceProperties.getServerAddr()); + } + +} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourcePropertiesWithSystemPropertiesTests.java b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourcePropertiesWithSystemPropertiesTests.java new file mode 100644 index 000000000..7537f3b8b --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/NacosDataSourcePropertiesWithSystemPropertiesTests.java @@ -0,0 +1,151 @@ +/* + * 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.alibaba.sentinel.datasource; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +import org.junit.Test; +import org.springframework.cloud.alibaba.sentinel.datasource.config.NacosDataSourceProperties; + +/** + * @author Jim + */ +public class NacosDataSourcePropertiesWithSystemPropertiesTests { + + @Test + public void testNacosWithSystemProperties() { + setSystemProperties(); + + NacosDataSourceProperties nacosDataSourceProperties = new NacosDataSourceProperties(); + nacosDataSourceProperties.setServerAddr("127.0.0.1:8848"); + nacosDataSourceProperties.setGroupId("custom-group"); + nacosDataSourceProperties.setDataId("sentinel"); + nacosDataSourceProperties.preCheck("test-ds"); + + assertEquals("Nacos groupId was wrong", "custom-group", + nacosDataSourceProperties.getGroupId()); + assertEquals("Nacos dataId was wrong", "sentinel", + nacosDataSourceProperties.getDataId()); + assertEquals("Nacos default data type was wrong", "json", + nacosDataSourceProperties.getDataType()); + assertEquals("Nacos ak was wrong", "ak", + nacosDataSourceProperties.getAccessKey()); + assertEquals("Nacos sk was wrong", "sk", + nacosDataSourceProperties.getSecretKey()); + assertEquals("Nacos endpoint was wrong", "endpoint", + nacosDataSourceProperties.getEndpoint()); + assertEquals("Nacos namespace was wrong", "namespace", + nacosDataSourceProperties.getNamespace()); + assertNull("Nacos serverAddr was not null", + nacosDataSourceProperties.getServerAddr()); + + } + + @Test + public void testNacosWithEDASAndSystemProperties() { + setSystemProperties(); + + NacosDataSourceProperties nacosDataSourceProperties = NacosDataSourceProperties + .buildByEDAS(RuleType.FLOW.getName()); + + assertEquals("Nacos groupId was wrong", "nacos-sentinel", + nacosDataSourceProperties.getGroupId()); + assertEquals("Nacos dataId was wrong", "project-name-" + RuleType.FLOW.getName(), + nacosDataSourceProperties.getDataId()); + assertEquals("Nacos default data type was wrong", "json", + nacosDataSourceProperties.getDataType()); + assertEquals("Nacos rule type was wrong", RuleType.FLOW, + nacosDataSourceProperties.getRuleType()); + assertEquals("Nacos ak was wrong", "ak", + nacosDataSourceProperties.getAccessKey()); + assertEquals("Nacos sk was wrong", "sk", + nacosDataSourceProperties.getSecretKey()); + assertEquals("Nacos endpoint was wrong", "endpoint", + nacosDataSourceProperties.getEndpoint()); + assertEquals("Nacos namespace was wrong", "namespace", + nacosDataSourceProperties.getNamespace()); + assertNull("Nacos serverAddr was not null", + nacosDataSourceProperties.getServerAddr()); + + } + + @Test + public void testNacosWithEDASDegradeAndSystemProperties() { + setSystemProperties(); + + NacosDataSourceProperties nacosDataSourceProperties = NacosDataSourceProperties + .buildDegradeByEDAS(); + assertEquals("Nacos groupId was wrong", "nacos-sentinel", + nacosDataSourceProperties.getGroupId()); + assertEquals("Nacos dataId was wrong", + "project-name-" + RuleType.DEGRADE.getName(), + nacosDataSourceProperties.getDataId()); + assertEquals("Nacos default data type was wrong", "json", + nacosDataSourceProperties.getDataType()); + assertEquals("Nacos rule type was wrong", RuleType.DEGRADE, + nacosDataSourceProperties.getRuleType()); + assertEquals("Nacos ak was wrong", "ak", + nacosDataSourceProperties.getAccessKey()); + assertEquals("Nacos sk was wrong", "sk", + nacosDataSourceProperties.getSecretKey()); + assertEquals("Nacos endpoint was wrong", "endpoint", + nacosDataSourceProperties.getEndpoint()); + assertEquals("Nacos namespace was wrong", "namespace", + nacosDataSourceProperties.getNamespace()); + assertNull("Nacos serverAddr was not null", + nacosDataSourceProperties.getServerAddr()); + + } + + @Test + public void testNacosWithEDASFlowAndSystemProperties() { + setSystemProperties(); + + NacosDataSourceProperties nacosDataSourceProperties = NacosDataSourceProperties + .buildFlowByEDAS(); + assertEquals("Nacos groupId was wrong", "nacos-sentinel", + nacosDataSourceProperties.getGroupId()); + assertEquals("Nacos dataId was wrong", "project-name-" + RuleType.FLOW.getName(), + nacosDataSourceProperties.getDataId()); + assertEquals("Nacos default data type was wrong", "json", + nacosDataSourceProperties.getDataType()); + assertEquals("Nacos rule type was wrong", RuleType.FLOW, + nacosDataSourceProperties.getRuleType()); + assertEquals("Nacos ak was wrong", "ak", + nacosDataSourceProperties.getAccessKey()); + assertEquals("Nacos sk was wrong", "sk", + nacosDataSourceProperties.getSecretKey()); + assertEquals("Nacos endpoint was wrong", "endpoint", + nacosDataSourceProperties.getEndpoint()); + assertEquals("Nacos namespace was wrong", "namespace", + nacosDataSourceProperties.getNamespace()); + assertNull("Nacos serverAddr was not null", + nacosDataSourceProperties.getServerAddr()); + } + + private void setSystemProperties() { + System.setProperty(SentinelDataSourceConstants.NACOS_DATASOURCE_ENDPOINT, + "endpoint"); + System.setProperty(SentinelDataSourceConstants.NACOS_DATASOURCE_NAMESPACE, + "namespace"); + System.setProperty(SentinelDataSourceConstants.NACOS_DATASOURCE_AK, "ak"); + System.setProperty(SentinelDataSourceConstants.NACOS_DATASOURCE_SK, "sk"); + System.setProperty(SentinelDataSourceConstants.PROJECT_NAME, "project-name"); + } + +} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/RuleTypeTests.java b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/RuleTypeTests.java new file mode 100644 index 000000000..a540ab864 --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/RuleTypeTests.java @@ -0,0 +1,87 @@ +/* + * 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.alibaba.sentinel.datasource; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import com.alibaba.csp.sentinel.slots.block.AbstractRule; +import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule; +import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; +import com.alibaba.csp.sentinel.slots.system.SystemRule; + +/** + * @author Jim + */ +public class RuleTypeTests { + + @Test + public void testGetByName() { + assertFalse("empty str rule name was not null", + RuleType.getByName("").isPresent()); + assertFalse("test rule name was not null", + RuleType.getByName("test").isPresent()); + assertFalse("param_flow rule name was not null", + RuleType.getByName("param_flow").isPresent()); + assertFalse("param rule name was not null", + RuleType.getByName("param").isPresent()); + assertFalse("FLOW rule name was not null", + RuleType.getByName("FLOW").isPresent()); + assertTrue("flow rule name was null", RuleType.getByName("flow").isPresent()); + assertTrue("degrade rule name was null", + RuleType.getByName("degrade").isPresent()); + assertTrue("param-flow rule name was null", + RuleType.getByName("param-flow").isPresent()); + assertTrue("system rule name was null", RuleType.getByName("system").isPresent()); + assertTrue("authority rule name was null", + RuleType.getByName("authority").isPresent()); + assertEquals("flow rule name was not equals RuleType.FLOW", RuleType.FLOW, + RuleType.getByName("flow").get()); + assertEquals("flow rule name was not equals RuleType.DEGRADE", RuleType.DEGRADE, + RuleType.getByName("degrade").get()); + assertEquals("flow rule name was not equals RuleType.PARAM_FLOW", + RuleType.PARAM_FLOW, RuleType.getByName("param-flow").get()); + assertEquals("flow rule name was not equals RuleType.SYSTEM", RuleType.SYSTEM, + RuleType.getByName("system").get()); + assertEquals("flow rule name was not equals RuleType.AUTHORITY", + RuleType.AUTHORITY, RuleType.getByName("authority").get()); + } + + @Test + public void testGetByClass() { + assertFalse("Object.class type type was not null", + RuleType.getByClass(Object.class).isPresent()); + assertFalse("AbstractRule.class rule type was not null", + RuleType.getByClass(AbstractRule.class).isPresent()); + assertTrue("FlowRule.class rule type was null", + RuleType.getByClass(FlowRule.class).isPresent()); + assertTrue("DegradeRule.class rule type was null", + RuleType.getByClass(DegradeRule.class).isPresent()); + assertTrue("ParamFlowRule.class rule type was null", + RuleType.getByClass(ParamFlowRule.class).isPresent()); + assertTrue("SystemRule.class rule type was null", + RuleType.getByClass(SystemRule.class).isPresent()); + assertTrue("AuthorityRule.class rule type was null", + RuleType.getByClass(AuthorityRule.class).isPresent()); + } + +} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/SentinelConverterTests.java b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/SentinelConverterTests.java new file mode 100644 index 000000000..c6ae7a671 --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/SentinelConverterTests.java @@ -0,0 +1,131 @@ +/* + * 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.alibaba.sentinel.datasource; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.List; + +import org.apache.commons.io.FileUtils; +import org.junit.Test; +import org.springframework.cloud.alibaba.sentinel.datasource.converter.JsonConverter; +import org.springframework.cloud.alibaba.sentinel.datasource.converter.XmlConverter; +import org.springframework.util.ResourceUtils; +import org.springframework.util.StringUtils; + +import com.alibaba.csp.sentinel.slots.block.RuleConstant; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; + +/** + * @author Jim + */ +public class SentinelConverterTests { + + private ObjectMapper objectMapper = new ObjectMapper(); + + private XmlMapper xmlMapper = new XmlMapper(); + + @Test + public void testJsonConverter() { + JsonConverter jsonConverter = new JsonConverter(objectMapper, FlowRule.class); + List flowRules = jsonConverter + .convert(readFileContent("classpath: flowrule.json")); + assertEquals("json converter flow rule size was wrong", 1, flowRules.size()); + assertEquals("json converter flow rule resource name was wrong", "resource", + flowRules.get(0).getResource()); + assertEquals("json converter flow rule limit app was wrong", "default", + flowRules.get(0).getLimitApp()); + assertEquals("json converter flow rule count was wrong", "1.0", + String.valueOf(flowRules.get(0).getCount())); + assertEquals("json converter flow rule control behavior was wrong", + RuleConstant.CONTROL_BEHAVIOR_DEFAULT, + flowRules.get(0).getControlBehavior()); + assertEquals("json converter flow rule strategy was wrong", + RuleConstant.STRATEGY_DIRECT, flowRules.get(0).getStrategy()); + assertEquals("json converter flow rule grade was wrong", + RuleConstant.FLOW_GRADE_QPS, flowRules.get(0).getGrade()); + } + + @Test + public void testConverterEmptyContent() { + JsonConverter jsonConverter = new JsonConverter(objectMapper, FlowRule.class); + List flowRules = jsonConverter.convert(""); + assertEquals("json converter flow rule size was not empty", 0, flowRules.size()); + } + + @Test(expected = RuntimeException.class) + public void testConverterErrorFormat() { + JsonConverter jsonConverter = new JsonConverter(objectMapper, FlowRule.class); + jsonConverter.convert(readFileContent("classpath: flowrule-errorformat.json")); + } + + @Test(expected = RuntimeException.class) + public void testConverterErrorContent() { + JsonConverter jsonConverter = new JsonConverter(objectMapper, FlowRule.class); + jsonConverter.convert(readFileContent("classpath: flowrule-errorcontent.json")); + } + + @Test + public void testXmlConverter() { + XmlConverter jsonConverter = new XmlConverter(xmlMapper, FlowRule.class); + List flowRules = jsonConverter + .convert(readFileContent("classpath: flowrule.xml")); + assertEquals("xml converter flow rule size was wrong", 2, flowRules.size()); + assertEquals("xml converter flow rule1 resource name was wrong", "resource", + flowRules.get(0).getResource()); + assertEquals("xml converter flow rule2 limit app was wrong", "default", + flowRules.get(0).getLimitApp()); + assertEquals("xml converter flow rule1 count was wrong", "1.0", + String.valueOf(flowRules.get(0).getCount())); + assertEquals("xml converter flow rule1 control behavior was wrong", + RuleConstant.CONTROL_BEHAVIOR_DEFAULT, + flowRules.get(0).getControlBehavior()); + assertEquals("xml converter flow rule1 strategy was wrong", + RuleConstant.STRATEGY_DIRECT, flowRules.get(0).getStrategy()); + assertEquals("xml converter flow rule1 grade was wrong", + RuleConstant.FLOW_GRADE_QPS, flowRules.get(0).getGrade()); + + assertEquals("xml converter flow rule2 resource name was wrong", "test", + flowRules.get(1).getResource()); + assertEquals("xml converter flow rule2 limit app was wrong", "default", + flowRules.get(1).getLimitApp()); + assertEquals("xml converter flow rule2 count was wrong", "1.0", + String.valueOf(flowRules.get(1).getCount())); + assertEquals("xml converter flow rule2 control behavior was wrong", + RuleConstant.CONTROL_BEHAVIOR_DEFAULT, + flowRules.get(1).getControlBehavior()); + assertEquals("xml converter flow rule2 strategy was wrong", + RuleConstant.STRATEGY_DIRECT, flowRules.get(1).getStrategy()); + assertEquals("xml converter flow rule2 grade was wrong", + RuleConstant.FLOW_GRADE_QPS, flowRules.get(1).getGrade()); + } + + private String readFileContent(String file) { + try { + return FileUtils.readFileToString( + ResourceUtils.getFile(StringUtils.trimAllWhitespace(file))); + } + catch (IOException e) { + return ""; + } + } + +} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/ZookeeperDataSourceFactoryBeanTests.java b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/ZookeeperDataSourceFactoryBeanTests.java new file mode 100644 index 000000000..df7158cee --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/java/org/springframework/cloud/alibaba/sentinel/datasource/ZookeeperDataSourceFactoryBeanTests.java @@ -0,0 +1,102 @@ +/* + * 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.alibaba.sentinel.datasource; + +import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.when; + +import org.junit.Test; +import org.springframework.cloud.alibaba.sentinel.datasource.converter.XmlConverter; +import org.springframework.cloud.alibaba.sentinel.datasource.factorybean.ZookeeperDataSourceFactoryBean; + +import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.csp.sentinel.datasource.zookeeper.ZookeeperDataSource; + +/** + * @author Jim + */ +public class ZookeeperDataSourceFactoryBeanTests { + + private String dataId = "dataId"; + private String groupId = "groupId"; + private String serverAddr = "localhost:2181"; + + private String path = "/sentinel"; + + @Test + public void testZKWithoutPathFactoryBean() throws Exception { + ZookeeperDataSourceFactoryBean factoryBean = spy( + ZookeeperDataSourceFactoryBean.class); + + Converter converter = mock(XmlConverter.class); + + ZookeeperDataSource zookeeperDataSource = mock(ZookeeperDataSource.class); + + factoryBean.setConverter(converter); + factoryBean.setDataId(dataId); + factoryBean.setGroupId(groupId); + factoryBean.setServerAddr(serverAddr); + + when(zookeeperDataSource.readSource()).thenReturn("{}"); + doReturn(zookeeperDataSource).when(factoryBean).getObject(); + + assertEquals("ZookeeperDataSource getObject was wrong", zookeeperDataSource, + factoryBean.getObject()); + assertEquals("ZookeeperDataSource read source value was wrong", "{}", + factoryBean.getObject().readSource()); + assertEquals("ZookeeperDataSourceFactoryBean dataId was wrong", dataId, + factoryBean.getDataId()); + assertEquals("ZookeeperDataSourceFactoryBean converter was wrong", converter, + factoryBean.getConverter()); + assertEquals("ZookeeperDataSourceFactoryBean groupId was wrong", groupId, + factoryBean.getGroupId()); + assertEquals("ZookeeperDataSourceFactoryBean serverAddr was wrong", serverAddr, + factoryBean.getServerAddr()); + } + + @Test + public void testZKWithPathFactoryBean() throws Exception { + ZookeeperDataSourceFactoryBean factoryBean = spy( + ZookeeperDataSourceFactoryBean.class); + + Converter converter = mock(XmlConverter.class); + + ZookeeperDataSource zookeeperDataSource = mock(ZookeeperDataSource.class); + + factoryBean.setConverter(converter); + factoryBean.setPath(path); + factoryBean.setServerAddr(serverAddr); + + when(zookeeperDataSource.readSource()).thenReturn("{}"); + doReturn(zookeeperDataSource).when(factoryBean).getObject(); + + assertEquals("ZookeeperDataSource value was wrong", zookeeperDataSource, + factoryBean.getObject()); + assertEquals("ZookeeperDataSource read source value was wrong", "{}", + factoryBean.getObject().readSource()); + assertEquals("ZookeeperDataSourceFactoryBean converter was wrong", converter, + factoryBean.getConverter()); + assertEquals("ZookeeperDataSourceFactoryBean path was wrong", path, + factoryBean.getPath()); + assertEquals("ZookeeperDataSourceFactoryBean serverAddr was wrong", serverAddr, + factoryBean.getServerAddr()); + } + +} diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule-errorcontent.json b/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule-errorcontent.json new file mode 100644 index 000000000..7bf60e61e --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule-errorcontent.json @@ -0,0 +1,11 @@ +[ + { + "test": 1, + "controlBehavior": 0, + "count": 1, + "grade": 1, + "limitApp": "default", + "strategy": 0 + } +] + diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule-errorformat.json b/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule-errorformat.json new file mode 100644 index 000000000..48c738b65 --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule-errorformat.json @@ -0,0 +1,10 @@ +[ + { + "resource": "resource", + "controlBehavior": 0, + "count": 1, + "grade": 1, + "limitApp": "default", + "strategy": 0 + }== +] diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule.json b/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule.json new file mode 100644 index 000000000..0f8fbe2b0 --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule.json @@ -0,0 +1,10 @@ +[ + { + "resource": "resource", + "controlBehavior": 0, + "count": 1, + "grade": 1, + "limitApp": "default", + "strategy": 0 + } +] diff --git a/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule.xml b/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule.xml new file mode 100644 index 000000000..7f1926d3e --- /dev/null +++ b/spring-cloud-alibaba-sentinel-datasource/src/test/resources/flowrule.xml @@ -0,0 +1,21 @@ + + + + resource + 0 + 1 + 1 + default + 0 + + + test + 0 + 1 + 1 + default + 0 + + + +