Skip to content

Commit

Permalink
Add unit test for route module (apache#3073)
Browse files Browse the repository at this point in the history
* For apache#3047, Refactor TableBroadcastRoutingEngineTest

* For apache#3047, Add some unit test for exception

* For checkstyle
  • Loading branch information
KomachiSion authored and terrymanu committed Sep 20, 2019
1 parent fabf6e6 commit b7a2f37
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,54 +19,108 @@

import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;
import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;
import org.apache.shardingsphere.core.optimize.sharding.statement.ShardingTransparentOptimizedStatement;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.optimize.api.segment.Tables;
import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement;
import org.apache.shardingsphere.core.parse.sql.segment.ddl.index.IndexSegment;
import org.apache.shardingsphere.core.parse.sql.segment.generic.TableSegment;
import org.apache.shardingsphere.core.parse.sql.statement.ddl.CreateIndexStatement;
import org.apache.shardingsphere.core.parse.sql.statement.ddl.DDLStatement;
import org.apache.shardingsphere.core.parse.sql.statement.ddl.DropIndexStatement;
import org.apache.shardingsphere.core.route.type.RoutingResult;
import org.apache.shardingsphere.core.route.type.RoutingUnit;
import org.apache.shardingsphere.core.route.type.TableUnit;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;

import java.util.Arrays;
import java.util.Iterator;

import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import com.google.common.collect.Lists;

@RunWith(MockitoJUnitRunner.class)
public final class TableBroadcastRoutingEngineTest {

private ShardingRule shardingRule;
@Mock
private OptimizedStatement optimizedStatement;

@Mock
private Tables tables;

@Mock
private TableMetas tableMetas;

@Mock
private TableMetaData tableMetaData;

private TableBroadcastRoutingEngine tableBroadcastRoutingEngine;

@Before
public void setEngineContext() {
public void setUp() {
TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration("t_order", "ds${0..1}.t_order_${0..2}");
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig);
shardingRule = new ShardingRule(shardingRuleConfig, Arrays.asList("ds0", "ds1"));
ShardingRule shardingRule = new ShardingRule(shardingRuleConfig, Arrays.asList("ds0", "ds1"));
when(optimizedStatement.getTables()).thenReturn(tables);
when(tables.getTableNames()).thenReturn(Lists.newArrayList("t_order"));
when(tableMetas.getAllTableNames()).thenReturn(Lists.newArrayList("t_order"));
when(tableMetas.get("t_order")).thenReturn(tableMetaData);
when(tableMetaData.containsIndex("index_name")).thenReturn(true);
tableBroadcastRoutingEngine = new TableBroadcastRoutingEngine(shardingRule, tableMetas, optimizedStatement);
}

@Test
public void assertRoutingResultForDDLStatement() {
assertThat(createDDLStatementRoutingResult(), instanceOf(RoutingResult.class));
public void assertRouteForNormalDDL() {
DDLStatement ddlStatement = mock(DDLStatement.class);
when(optimizedStatement.getSQLStatement()).thenReturn(ddlStatement);
RoutingResult actual = tableBroadcastRoutingEngine.route();
assertRoutingResult(actual);
}

@Test
public void assertIsSingleRoutingForDDLStatement() {
assertFalse(createDDLStatementRoutingResult().isSingleRouting());
@Test(expected = IllegalStateException.class)
public void assertRouteForNonExistDropIndex() {
DropIndexStatement indexStatement = mock(DropIndexStatement.class);
IndexSegment indexSegment = mock(IndexSegment.class);
when(indexSegment.getName()).thenReturn("no_index");
when(indexStatement.getIndexes()).thenReturn(Lists.newArrayList(indexSegment));
when(optimizedStatement.getSQLStatement()).thenReturn(indexStatement);
tableBroadcastRoutingEngine.route();
}

@Test
public void assertTableUnitsForDDLStatement() {
RoutingResult routingResult = createDDLStatementRoutingResult();
assertThat(routingResult.getRoutingUnits().size(), is(6));
public void assertRouteForDropIndex() {
DropIndexStatement indexStatement = mock(DropIndexStatement.class);
IndexSegment indexSegment = mock(IndexSegment.class);
when(indexSegment.getName()).thenReturn("index_name");
when(indexStatement.getIndexes()).thenReturn(Lists.newArrayList(indexSegment));
when(optimizedStatement.getSQLStatement()).thenReturn(indexStatement);
RoutingResult actual = tableBroadcastRoutingEngine.route();
assertRoutingResult(actual);
}

private void assertRoutingResult(final RoutingResult actual) {
assertThat(actual.getDataSourceNames().size(), is(2));
assertThat(actual.getRoutingUnits().size(), is(6));
Iterator<RoutingUnit> routingUnitIterator = actual.getRoutingUnits().iterator();
assertRoutingUnit(routingUnitIterator.next(), "ds0", "t_order_0");
assertRoutingUnit(routingUnitIterator.next(), "ds0", "t_order_1");
assertRoutingUnit(routingUnitIterator.next(), "ds0", "t_order_2");
assertRoutingUnit(routingUnitIterator.next(), "ds1", "t_order_0");
assertRoutingUnit(routingUnitIterator.next(), "ds1", "t_order_1");
assertRoutingUnit(routingUnitIterator.next(), "ds1", "t_order_2");
}

private RoutingResult createDDLStatementRoutingResult() {
CreateIndexStatement createIndexStatement = new CreateIndexStatement();
createIndexStatement.getAllSQLSegments().add(new TableSegment(0, 0, "t_order"));
createIndexStatement.setIndex(new IndexSegment(0, 0, "t_order_index"));
return new TableBroadcastRoutingEngine(shardingRule, null, new ShardingTransparentOptimizedStatement(createIndexStatement)).route();
private void assertRoutingUnit(final RoutingUnit routingUnit, final String dataSourceName, final String actualTableName) {
assertThat(routingUnit.getDataSourceName(), is(dataSourceName));
assertThat(routingUnit.getTableUnits().size(), is(1));
assertThat(routingUnit.getTableUnits().get(0), is(new TableUnit("t_order", actualTableName)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

package org.apache.shardingsphere.core.route.type.complex;

import org.apache.shardingsphere.core.exception.ShardingException;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.groupby.GroupBy;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.SelectItem;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.SelectItems;
Expand Down Expand Up @@ -78,4 +79,10 @@ public void assertRoutingForShardingTableJoinBroadcastTable() {
assertThat(tableUnitList.get(0).getTableUnits().get(0).getActualTableName(), is("t_order_1"));
assertThat(tableUnitList.get(0).getTableUnits().get(0).getLogicTableName(), is("t_order"));
}

@Test(expected = ShardingException.class)
public void assertRoutingForNonLogicTable() {
ComplexRoutingEngine complexRoutingEngine = new ComplexRoutingEngine(null, Collections.<String>emptyList(), null, createShardingConditions("t_order"));
complexRoutingEngine.route();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public final class DefaultDatabaseRoutingEngineTest {
private DefaultDatabaseRoutingEngine defaultDatabaseRoutingEngine;

@Before
public void setEngineContext() {
public void setUp() {
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.setDefaultDataSourceName("ds_0");
ShardingRule shardingRule = new ShardingRule(shardingRuleConfig, Arrays.asList("ds_0", "ds_1"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public final class DatabaseHintRoutingEngineTest {
private DatabaseHintRoutingEngine databaseHintRoutingEngine;

@Before
public void setEngineContext() {
public void setUp() {
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(new TableRuleConfiguration("t_order", "ds_${0..1}.t_order"));
shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new HintShardingStrategyConfiguration(new HintShardingAlgorithmFixture()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
package org.apache.shardingsphere.core.route.type.standard;

import org.apache.shardingsphere.api.hint.HintManager;
import org.apache.shardingsphere.core.exception.ShardingException;
import org.apache.shardingsphere.core.optimize.api.segment.Tables;
import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.groupby.GroupBy;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.SelectItem;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.SelectItems;
Expand All @@ -26,6 +29,7 @@
import org.apache.shardingsphere.core.optimize.sharding.segment.select.pagination.Pagination;
import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingSelectOptimizedStatement;
import org.apache.shardingsphere.core.parse.sql.segment.generic.TableSegment;
import org.apache.shardingsphere.core.parse.sql.statement.dml.InsertStatement;
import org.apache.shardingsphere.core.parse.sql.statement.dml.SelectStatement;
import org.apache.shardingsphere.core.route.fixture.AbstractRoutingEngineTest;
import org.apache.shardingsphere.core.route.router.sharding.condition.ShardingCondition;
Expand All @@ -43,6 +47,8 @@
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

public final class StandardRoutingEngineTest extends AbstractRoutingEngineTest {

Expand All @@ -51,6 +57,17 @@ public void tearDown() {
HintManager.clear();
}

@Test(expected = ShardingException.class)
public void assertRouteByUnsupported() {
OptimizedStatement optimizedStatement = mock(OptimizedStatement.class);
when(optimizedStatement.getSQLStatement()).thenReturn(new InsertStatement());
Tables tables = mock(Tables.class);
when(tables.isSingleTable()).thenReturn(false);
when(optimizedStatement.getTables()).thenReturn(tables);
StandardRoutingEngine standardRoutingEngine = new StandardRoutingEngine(null, null, optimizedStatement, null);
standardRoutingEngine.route();
}

@Test
public void assertRouteByNonConditions() {
StandardRoutingEngine standardRoutingEngine = createStandardRoutingEngine(createBasedShardingRule(), "t_order", new ShardingConditions(Collections.<ShardingCondition>emptyList()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public final class UnicastRoutingEngineTest {
private ShardingRule shardingRule;

@Before
public void setEngineContext() {
public void setUp() {
ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
shardingRuleConfig.getTableRuleConfigs().add(new TableRuleConfiguration("t_order", "ds${0..1}.t_order_${0..2}"));
shardingRuleConfig.getBroadcastTables().add("t_config");
Expand Down

0 comments on commit b7a2f37

Please sign in to comment.