GovernanceSpringBootRegistryShardingTest.java 9.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */

18
package org.apache.shardingsphere.spring.boot.governance.type;
19

20
import lombok.SneakyThrows;
21
import org.apache.commons.dbcp2.BasicDataSource;
22
import org.apache.shardingsphere.driver.governance.internal.datasource.GovernanceShardingSphereDataSource;
23
import org.apache.shardingsphere.infra.config.properties.ConfigurationPropertyKey;
L
Liang Zhang 已提交
24
import org.apache.shardingsphere.infra.context.metadata.MetaDataContexts;
25
import org.apache.shardingsphere.infra.datanode.DataNode;
26 27
import org.apache.shardingsphere.sharding.rule.ShardingRule;
import org.apache.shardingsphere.sharding.rule.TableRule;
28 29
import org.apache.shardingsphere.spring.boot.governance.registry.TestGovernanceRepository;
import org.apache.shardingsphere.spring.boot.governance.util.EmbedTestingServer;
30 31 32 33 34 35 36 37
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

38 39
import javax.annotation.Resource;
import javax.sql.DataSource;
L
Liang Zhang 已提交
40
import java.io.IOException;
41
import java.lang.reflect.Field;
L
Liang Zhang 已提交
42
import java.net.URISyntaxException;
43 44 45
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Collectors;
46

47 48 49
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
50 51

@RunWith(SpringJUnit4ClassRunner.class)
52
@SpringBootTest(classes = GovernanceSpringBootRegistryShardingTest.class)
53 54
@SpringBootApplication
@ActiveProfiles("registry")
55
public class GovernanceSpringBootRegistryShardingTest {
56
    
57 58 59 60
    private static final String SHARDING_DATABASES_FILE = "yaml/sharding-databases.yaml";
    
    private static final String SHARDING_RULE_FILE = "yaml/sharding-rule.yaml";
    
61 62 63 64 65 66
    @Resource
    private DataSource dataSource;
    
    @BeforeClass
    public static void init() {
        EmbedTestingServer.start();
67 68
        String shardingDatabases = readYAML(SHARDING_DATABASES_FILE);
        String shardingRule = readYAML(SHARDING_RULE_FILE);
69
        TestGovernanceRepository repository = new TestGovernanceRepository();
70 71
        repository.persist("/metadata/logic_db/datasource", shardingDatabases);
        repository.persist("/metadata/logic_db/rule", shardingRule);
L
Liang Zhang 已提交
72
        repository.persist("/props", ConfigurationPropertyKey.EXECUTOR_SIZE.getKey() + ": '100'\n" + ConfigurationPropertyKey.SQL_SHOW.getKey() + ": 'true'\n");
73
        repository.persist("/states/datanodes", "");
74 75 76
    }
    
    @Test
77
    public void assertWithShardingSphereDataSource() {
78
        assertTrue(dataSource instanceof GovernanceShardingSphereDataSource);
L
Liang Zhang 已提交
79 80
        MetaDataContexts metaDataContexts = getFieldValue("metaDataContexts", GovernanceShardingSphereDataSource.class, dataSource);
        for (DataSource each : metaDataContexts.getDefaultMetaData().getResource().getDataSources().values()) {
81 82
            assertThat(((BasicDataSource) each).getMaxTotal(), is(16));
        }
L
Liang Zhang 已提交
83 84
        assertTrue(metaDataContexts.getProps().<Boolean>getValue(ConfigurationPropertyKey.SQL_SHOW));
        assertTrue(metaDataContexts.getProps().getValue(ConfigurationPropertyKey.SQL_SHOW));
85 86 87
    }
    
    @Test
88
    public void assertWithShardingSphereDataSourceNames() {
L
Liang Zhang 已提交
89 90
        MetaDataContexts metaDataContexts = getFieldValue("metaDataContexts", GovernanceShardingSphereDataSource.class, dataSource);
        ShardingRule shardingRule = (ShardingRule) metaDataContexts.getDefaultMetaData().getRuleMetaData().getRules().iterator().next();
91 92 93
        assertThat(shardingRule.getDataSourceNames().size(), is(2));
        assertTrue(shardingRule.getDataSourceNames().contains("ds_0"));
        assertTrue(shardingRule.getDataSourceNames().contains("ds_1"));
94 95 96 97
    }
    
    @Test
    public void assertWithTableRules() {
L
Liang Zhang 已提交
98 99
        MetaDataContexts metaDataContexts = getFieldValue("metaDataContexts", GovernanceShardingSphereDataSource.class, dataSource);
        ShardingRule shardingRule = (ShardingRule) metaDataContexts.getDefaultMetaData().getRuleMetaData().getRules().iterator().next();
100 101 102 103 104 105 106 107
        assertThat(shardingRule.getTableRules().size(), is(2));
        TableRule orderRule = shardingRule.getTableRule("t_order");
        assertThat(orderRule.getLogicTable(), is("t_order"));
        assertThat(orderRule.getActualDataNodes().size(), is(4));
        assertTrue(orderRule.getActualDataNodes().contains(new DataNode("ds_0", "t_order_0")));
        assertTrue(orderRule.getActualDataNodes().contains(new DataNode("ds_0", "t_order_1")));
        assertTrue(orderRule.getActualDataNodes().contains(new DataNode("ds_1", "t_order_0")));
        assertTrue(orderRule.getActualDataNodes().contains(new DataNode("ds_1", "t_order_1")));
108 109
        assertTrue(orderRule.getGenerateKeyColumn().isPresent());
        assertThat(orderRule.getGenerateKeyColumn().get(), is("order_id"));
110 111 112 113 114 115 116
        TableRule itemRule = shardingRule.getTableRule("t_order_item");
        assertThat(itemRule.getLogicTable(), is("t_order_item"));
        assertThat(itemRule.getActualDataNodes().size(), is(4));
        assertTrue(itemRule.getActualDataNodes().contains(new DataNode("ds_0", "t_order_item_0")));
        assertTrue(itemRule.getActualDataNodes().contains(new DataNode("ds_0", "t_order_item_1")));
        assertTrue(itemRule.getActualDataNodes().contains(new DataNode("ds_1", "t_order_item_0")));
        assertTrue(itemRule.getActualDataNodes().contains(new DataNode("ds_1", "t_order_item_1")));
117 118
        assertTrue(itemRule.getGenerateKeyColumn().isPresent());
        assertThat(itemRule.getGenerateKeyColumn().get(), is("order_item_id"));
119 120 121 122
    }
    
    @Test
    public void assertWithBindingTableRules() {
L
Liang Zhang 已提交
123 124
        MetaDataContexts metaDataContexts = getFieldValue("metaDataContexts", GovernanceShardingSphereDataSource.class, dataSource);
        ShardingRule shardingRule = (ShardingRule) metaDataContexts.getDefaultMetaData().getRuleMetaData().getRules().iterator().next();
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
        assertThat(shardingRule.getBindingTableRules().size(), is(2));
        TableRule orderRule = shardingRule.getTableRule("t_order");
        assertThat(orderRule.getLogicTable(), is("t_order"));
        assertThat(orderRule.getActualDataNodes().size(), is(4));
        assertTrue(orderRule.getActualDataNodes().contains(new DataNode("ds_0", "t_order_0")));
        assertTrue(orderRule.getActualDataNodes().contains(new DataNode("ds_0", "t_order_1")));
        assertTrue(orderRule.getActualDataNodes().contains(new DataNode("ds_1", "t_order_0")));
        assertTrue(orderRule.getActualDataNodes().contains(new DataNode("ds_1", "t_order_1")));
        TableRule itemRule = shardingRule.getTableRule("t_order_item");
        assertThat(itemRule.getLogicTable(), is("t_order_item"));
        assertThat(itemRule.getActualDataNodes().size(), is(4));
        assertTrue(itemRule.getActualDataNodes().contains(new DataNode("ds_0", "t_order_item_0")));
        assertTrue(itemRule.getActualDataNodes().contains(new DataNode("ds_0", "t_order_item_1")));
        assertTrue(itemRule.getActualDataNodes().contains(new DataNode("ds_1", "t_order_item_0")));
        assertTrue(itemRule.getActualDataNodes().contains(new DataNode("ds_1", "t_order_item_1")));
140 141 142 143
        assertTrue(itemRule.getGenerateKeyColumn().isPresent());
        assertThat(itemRule.getGenerateKeyColumn().get(), is("order_item_id"));
        assertTrue(orderRule.getGenerateKeyColumn().isPresent());
        assertThat(orderRule.getGenerateKeyColumn().get(), is("order_id"));
144 145 146 147 148
        
    }
    
    @Test
    public void assertWithBroadcastTables() {
L
Liang Zhang 已提交
149 150
        MetaDataContexts metaDataContexts = getFieldValue("metaDataContexts", GovernanceShardingSphereDataSource.class, dataSource);
        ShardingRule shardingRule = (ShardingRule) metaDataContexts.getDefaultMetaData().getRuleMetaData().getRules().iterator().next();
151 152 153 154 155
        assertThat(shardingRule.getBroadcastTables().size(), is(1));
        assertThat(shardingRule.getBroadcastTables().iterator().next(), is("t_config"));
    }
    
    @SuppressWarnings("unchecked")
156
    @SneakyThrows(ReflectiveOperationException.class)
157 158 159 160 161
    private <T> T getFieldValue(final String fieldName, final Class<?> fieldClass, final Object target) {
        Field field = fieldClass.getDeclaredField(fieldName);
        field.setAccessible(true);
        return (T) field.get(target);
    }
162
    
L
Liang Zhang 已提交
163
    @SneakyThrows({URISyntaxException.class, IOException.class})
164 165 166
    private static String readYAML(final String yamlFile) {
        return Files.readAllLines(Paths.get(ClassLoader.getSystemResource(yamlFile).toURI())).stream().map(each -> each + System.lineSeparator()).collect(Collectors.joining());
    }
167
}