/* * Copyright 1999-2015 dangdang.com. *
* 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 io.shardingjdbc.core.rule; import io.shardingjdbc.core.api.config.ShardingRuleConfiguration; import io.shardingjdbc.core.api.config.TableRuleConfiguration; import io.shardingjdbc.core.api.config.strategy.NoneShardingStrategyConfiguration; import io.shardingjdbc.core.api.config.strategy.ShardingStrategyConfiguration; import io.shardingjdbc.core.api.config.strategy.StandardShardingStrategyConfiguration; import io.shardingjdbc.core.api.algorithm.fixture.TestPreciseShardingAlgorithm; import io.shardingjdbc.core.parsing.parser.context.condition.Column; import io.shardingjdbc.core.routing.strategy.none.NoneShardingStrategy; import org.junit.Test; import javax.sql.DataSource; import java.sql.SQLException; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; public final class ShardingRuleTest { @Test public void assertShardingRuleWithoutStrategy() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfig(); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertTrue(actual.getDefaultDatabaseShardingStrategy().getShardingColumns().isEmpty()); assertTrue(actual.getDefaultTableShardingStrategy().getShardingColumns().isEmpty()); } @Test public void assertShardingRuleWithBindingTableRuleWithoutStrategy() throws SQLException { ShardingRule actual = createShardingRule(); assertTrue(actual.getDefaultDatabaseShardingStrategy().getShardingColumns().isEmpty()); assertTrue(actual.getDefaultTableShardingStrategy().getShardingColumns().isEmpty()); } @Test public void assertShardingRuleWithDatabaseStrategy() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfig(); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new NoneShardingStrategyConfiguration()); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertTrue(actual.getDefaultDatabaseShardingStrategy().getShardingColumns().isEmpty()); assertTrue(actual.getDefaultTableShardingStrategy().getShardingColumns().isEmpty()); } @Test public void assertShardingRuleWithTableStrategy() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfig(); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); shardingRuleConfig.setDefaultTableShardingStrategyConfig(new NoneShardingStrategyConfiguration()); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertTrue(actual.getDefaultDatabaseShardingStrategy().getShardingColumns().isEmpty()); assertTrue(actual.getDefaultDatabaseShardingStrategy().getShardingColumns().isEmpty()); } @Test public void assertShardingRuleWithoutBindingTableRule() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfig(); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new NoneShardingStrategyConfiguration()); shardingRuleConfig.setDefaultTableShardingStrategyConfig(new NoneShardingStrategyConfiguration()); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertTrue(actual.getDefaultDatabaseShardingStrategy().getShardingColumns().isEmpty()); assertTrue(actual.getDefaultDatabaseShardingStrategy().getShardingColumns().isEmpty()); } @Test public void assertFindTableRule() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfig(); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new NoneShardingStrategyConfiguration()); shardingRuleConfig.setDefaultTableShardingStrategyConfig(new NoneShardingStrategyConfiguration()); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertTrue(actual.tryFindTableRule("logicTable").isPresent()); assertFalse(actual.tryFindTableRule("null").isPresent()); } @Test public void assertGetDatabaseShardingStrategyFromTableRule() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfigWithDatabaseShardingStrategy(new NoneShardingStrategyConfiguration()); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertThat(actual.getDatabaseShardingStrategy(actual.getTableRule("logicTable")), instanceOf(NoneShardingStrategy.class)); } @Test public void assertGetDatabaseShardingStrategyFromDefault() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfig(); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new NoneShardingStrategyConfiguration()); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertThat(actual.getDatabaseShardingStrategy(actual.getTableRule("logicTable")), instanceOf(NoneShardingStrategy.class)); } @Test public void assertGetDatabaseShardingStrategyForNullValue() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfig(); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(null); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertNotNull(actual.getDatabaseShardingStrategy(actual.getTableRule("logicTable"))); } @Test public void assertGetTableShardingStrategyFromTableRule() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfigWithTableShardingStrategy(new NoneShardingStrategyConfiguration()); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertThat(actual.getDatabaseShardingStrategy(actual.getTableRule("logicTable")), instanceOf(NoneShardingStrategy.class)); } @Test public void assertGetTableShardingStrategyFromDefault() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfig(); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new NoneShardingStrategyConfiguration()); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertThat(actual.getTableShardingStrategy(actual.getTableRule("logicTable")), instanceOf(NoneShardingStrategy.class)); } @Test public void assertGetTableShardingStrategyForNullValue() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfig(); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new NoneShardingStrategyConfiguration()); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertNotNull(actual.getTableShardingStrategy(actual.getTableRule("logicTable"))); } @Test public void assertGetBindingTableRuleForNotConfig() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfig(); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertFalse(actual.findBindingTableRule("logicTable").isPresent()); } @Test public void assertGetBindingTableRuleForNotFound() throws SQLException { assertFalse(createShardingRule().findBindingTableRule("newTable").isPresent()); } @Test public void assertGetBindingTableRuleForFound() throws SQLException { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); TableRuleConfiguration tableRuleConfig = createTableRuleConfig(); TableRuleConfiguration subTableRuleConfig = createSubTableRuleConfig(); shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig); shardingRuleConfig.getTableRuleConfigs().add(subTableRuleConfig); shardingRuleConfig.getBindingTableGroups().add(createTableRuleConfig().getLogicTable() + "," + createSubTableRuleConfig().getLogicTable()); ShardingRule actual = shardingRuleConfig.build(createDataSourceMap()); assertThat(actual.findBindingTableRule("logicTable").get().getTableRules().size(), is(2)); } @Test public void assertFilterAllBindingTablesWhenLogicTablesIsEmpty() throws SQLException { assertThat(createShardingRule().filterAllBindingTables(Collections.