提交 36b0a6f2 编写于 作者: H haocao

New integrate sql test framework 17th version.

上级 8fcbcb08
......@@ -24,10 +24,10 @@ import org.junit.runners.Suite.SuiteClasses;
@RunWith(Suite.class)
@SuiteClasses({
ShardingDatabaseOnlyTest.class,
ShardingTableOnlyTest.class
// ShardingMasterSlaveTest.class,
// ShardingDatabaseAndTableTest.class,
// ShardingDatabaseAndTableDynamicTest.class
ShardingTableOnlyTest.class,
ShardingMasterSlaveTest.class,
ShardingDatabaseAndTableTest.class,
ShardingDatabaseAndTableDynamicTest.class
})
public class AllSqlAssertTests {
}
/*
* Copyright 1999-2015 dangdang.com.
* <p>
* 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.
* </p>
*/
package com.dangdang.ddframe.rdb.common.sql;
import com.dangdang.ddframe.rdb.common.jaxb.SqlShardingRule;
import com.dangdang.ddframe.rdb.common.sql.base.AbstractSqlAssertTest;
import com.dangdang.ddframe.rdb.common.sql.common.ShardingTestStrategy;
import com.dangdang.ddframe.rdb.integrate.fixture.MultipleKeysModuloDatabaseShardingAlgorithm;
import com.dangdang.ddframe.rdb.sharding.api.rule.BindingTableRule;
import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule;
import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;
import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule;
import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy;
import com.dangdang.ddframe.rdb.sharding.api.strategy.table.NoneTableShardingAlgorithm;
import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy;
import com.dangdang.ddframe.rdb.sharding.constant.DatabaseType;
import com.dangdang.ddframe.rdb.sharding.jdbc.core.datasource.ShardingDataSource;
import org.junit.AfterClass;
import org.junit.Ignore;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@RunWith(Parameterized.class)
@Ignore
public class NullableShardingTableOnlyTest extends AbstractSqlAssertTest {
private static boolean isShutdown;
private static Map<DatabaseType, ShardingDataSource> shardingDataSources = new HashMap<>();
public NullableShardingTableOnlyTest(final String testCaseName, final String sql, final Set<DatabaseType> types, final List<SqlShardingRule> sqlShardingRules) {
super(testCaseName, sql, types, sqlShardingRules);
}
@Override
protected ShardingTestStrategy getShardingStrategy() {
return ShardingTestStrategy.nullable;
}
@Override
protected List<String> getDataSetFiles() {
return Arrays.asList(
"integrate/dataset/nullable/init/nullable_0.xml",
"integrate/dataset/nullable/init/nullable_1.xml",
"integrate/dataset/nullable/init/nullable_2.xml",
"integrate/dataset/nullable/init/nullable_3.xml",
"integrate/dataset/nullable/init/nullable_4.xml",
"integrate/dataset/nullable/init/nullable_5.xml",
"integrate/dataset/nullable/init/nullable_6.xml",
"integrate/dataset/nullable/init/nullable_7.xml",
"integrate/dataset/nullable/init/nullable_8.xml",
"integrate/dataset/nullable/init/nullable_9.xml");
}
@Override
protected final Map<DatabaseType, ShardingDataSource> getShardingDataSources() {
if (!shardingDataSources.isEmpty() && !isShutdown) {
return shardingDataSources;
}
isShutdown = false;
Map<DatabaseType, Map<String, DataSource>> dataSourceMap = createDataSourceMap();
for (Map.Entry<DatabaseType, Map<String, DataSource>> each : dataSourceMap.entrySet()) {
DataSourceRule dataSourceRule = new DataSourceRule(each.getValue());
TableRule orderTableRule = TableRule.builder("t_order").dataSourceRule(dataSourceRule).build();
ShardingRule shardingRule = ShardingRule.builder().dataSourceRule(dataSourceRule).tableRules(Collections.singletonList(orderTableRule))
.bindingTableRules(Collections.singletonList(new BindingTableRule(Collections.singletonList(orderTableRule))))
.databaseShardingStrategy(new DatabaseShardingStrategy(Collections.singletonList("user_id"), new MultipleKeysModuloDatabaseShardingAlgorithm()))
.tableShardingStrategy(new TableShardingStrategy(Collections.singletonList("order_id"), new NoneTableShardingAlgorithm())).build();
shardingDataSources.put(each.getKey(), new ShardingDataSource(shardingRule));
}
return shardingDataSources;
}
@AfterClass
public static void clear() {
isShutdown = true;
if (!shardingDataSources.isEmpty()) {
for (ShardingDataSource each : shardingDataSources.values()) {
each.close();
}
}
}
}
......@@ -101,7 +101,6 @@ public class ShardingDatabaseOnlyTest extends AbstractSqlAssertTest {
isShutdown = true;
if (!shardingDataSources.isEmpty()) {
for (ShardingDataSource each : shardingDataSources.values()) {
System.out.println("close");
each.close();
}
}
......
......@@ -29,8 +29,10 @@ import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule;
import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy;
import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy;
import com.dangdang.ddframe.rdb.sharding.constant.DatabaseType;
import com.dangdang.ddframe.rdb.sharding.hint.HintManagerHolder;
import com.dangdang.ddframe.rdb.sharding.jdbc.core.datasource.MasterSlaveDataSource;
import com.dangdang.ddframe.rdb.sharding.jdbc.core.datasource.ShardingDataSource;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Ignore;
import org.junit.runner.RunWith;
......@@ -159,6 +161,12 @@ public class ShardingMasterSlaveTest extends AbstractSqlAssertTest {
return shardingDataSources;
}
@After
public final void clearFlag() {
HintManagerHolder.clear();
MasterSlaveDataSource.resetDMLFlag();
}
@AfterClass
public static void clear() {
isShutdown = true;
......
......@@ -17,9 +17,8 @@
package com.dangdang.ddframe.rdb.common.sql.base;
import com.dangdang.ddframe.rdb.common.jaxb.SqlAssert;
import com.dangdang.ddframe.rdb.common.jaxb.SqlAsserts;
import com.dangdang.ddframe.rdb.common.sql.common.DatabaseTestMode;
import com.dangdang.ddframe.rdb.common.sql.common.SQLAssertUtil;
import com.dangdang.ddframe.rdb.integrate.AbstractDBUnitTest;
import com.dangdang.ddframe.rdb.integrate.util.DataBaseEnvironment;
import com.dangdang.ddframe.rdb.integrate.util.ShardingJdbcDatabaseTester;
......@@ -29,45 +28,36 @@ import org.dbunit.IDatabaseTester;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.dbunit.operation.DatabaseOperation;
import org.h2.tools.RunScript;
import org.junit.Before;
import org.junit.runners.Parameterized;
import javax.sql.DataSource;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.dangdang.ddframe.rdb.common.sql.common.DatabaseTestMode.Local;
import static com.dangdang.ddframe.rdb.sharding.constant.DatabaseType.H2;
import static com.dangdang.ddframe.rdb.sharding.constant.DatabaseType.Oracle;
public abstract class AbstractBaseSqlTest {
private static final Map<DatabaseType, Map<String, DataSource>> DATA_SOURCES = new HashMap<>();
private static final DatabaseTestMode CURRENT_TEST_MODE = DatabaseTestMode.TEST;
private static final DatabaseTestMode CURRENT_DB_TYPE = Local;
private final Map<DatabaseType, Map<String, DataSource>> databaseTypeMap = new HashMap<>();
static {
createSchema();
}
private static void createSchema() {
for (DatabaseType each : CURRENT_DB_TYPE.databaseTypes()) {
if (H2 == each) {
for (DatabaseType each : CURRENT_TEST_MODE.databaseTypes()) {
if (DatabaseType.H2 == each) {
createSchema(each);
}
}
......@@ -79,13 +69,13 @@ public abstract class AbstractBaseSqlTest {
for (int i = 0; i < 10; i++) {
for (String database : Arrays.asList("db", "dbtbl", "nullable", "master", "slave")) {
conn = initialConnection(database + "_" + i, dbType);
// RunScript.execute(conn, new InputStreamReader(AbstractDBUnitTest.class.getClassLoader().getResourceAsStream("integrate/schema/table/" + database + ".sql")));
RunScript.execute(conn, new InputStreamReader(AbstractDBUnitTest.class.getClassLoader().getResourceAsStream("integrate/schema/table/" + database + ".sql")));
conn.close();
}
}
String database = "tbl";
conn = initialConnection(database, dbType);
// RunScript.execute(conn, new InputStreamReader(AbstractDBUnitTest.class.getClassLoader().getResourceAsStream("integrate/schema/table/tbl.sql")));
// RunScript.execute(conn, new InputStreamReader(AbstractDBUnitTest.class.getClassLoader().getResourceAsStream("integrate/schema/table/tbl.sql")));
conn.close();
} catch (final SQLException ex) {
ex.printStackTrace();
......@@ -94,7 +84,7 @@ public abstract class AbstractBaseSqlTest {
@Before
public final void importDataSet() throws Exception {
for (DatabaseType databaseType : CURRENT_DB_TYPE.databaseTypes()) {
for (DatabaseType databaseType : CURRENT_TEST_MODE.databaseTypes()) {
DataBaseEnvironment dbEnv = new DataBaseEnvironment(databaseType);
for (String each : getDataSetFiles()) {
InputStream is = AbstractDBUnitTest.class.getClassLoader().getResourceAsStream(each);
......@@ -113,11 +103,11 @@ public abstract class AbstractBaseSqlTest {
protected final Map<DatabaseType, Map<String, DataSource>> createDataSourceMap() {
for (String each : getDataSetFiles()) {
String dbName = getDatabaseName(each);
for (DatabaseType type : CURRENT_DB_TYPE.databaseTypes()) {
for (DatabaseType type : CURRENT_TEST_MODE.databaseTypes()) {
createDataSources(dbName, type);
}
}
return DATA_SOURCES;
return databaseTypeMap;
}
private static Connection initialConnection(final String dbName, final DatabaseType type) throws SQLException {
......@@ -132,18 +122,18 @@ public abstract class AbstractBaseSqlTest {
result.setUsername(dbEnv.getUsername());
result.setPassword(dbEnv.getPassword());
result.setMaxActive(1000);
if (Oracle == dbEnv.getDatabaseType()) {
if (DatabaseType.Oracle == dbEnv.getDatabaseType()) {
result.setConnectionInitSqls(Collections.singleton("ALTER SESSION SET CURRENT_SCHEMA = " + dbName));
}
return result;
}
private static void createDataSources(final String dbName, final DatabaseType type) {
private void createDataSources(final String dbName, final DatabaseType type) {
String dataSource = "dataSource_" + dbName;
Map<String, DataSource> dataSourceMap = DATA_SOURCES.get(type);
Map<String, DataSource> dataSourceMap = databaseTypeMap.get(type);
if (null == dataSourceMap) {
dataSourceMap = new HashMap<>();
DATA_SOURCES.put(type, dataSourceMap);
databaseTypeMap.put(type, dataSourceMap);
}
BasicDataSource result = buildDataSource(dbName, type);
dataSourceMap.put(dataSource, result);
......@@ -159,57 +149,8 @@ public abstract class AbstractBaseSqlTest {
@Parameterized.Parameters(name = "{0}")
public static Collection<Object[]> dataParameters() {
Collection<Object[]> result = new ArrayList<>();
URL url = AbstractSqlAssertTest.class.getClassLoader().getResource("integrate/assert");
if (null == url) {
return Collections.emptyList();
}
File filePath = new File(url.getPath());
if (!filePath.exists()) {
return Collections.emptyList();
}
File[] files = filePath.listFiles();
if (null == files) {
return Collections.emptyList();
}
for (File each : files) {
result.addAll(dataParameters(each));
}
return result;
}
private static Collection<Object[]> dataParameters(final File file) {
SqlAsserts asserts = loadSqlAsserts(file);
Object[][] result = new Object[asserts.getSqlAsserts().size()][1];
for (int i = 0; i < asserts.getSqlAsserts().size(); i++) {
result[i] = getDataParameter(asserts.getSqlAsserts().get(i));
}
return Arrays.asList(result);
return SQLAssertUtil.getDataParameters("integrate/assert");
}
private static SqlAsserts loadSqlAsserts(final File file) {
try {
return (SqlAsserts) JAXBContext.newInstance(SqlAsserts.class).createUnmarshaller().unmarshal(file);
} catch (final JAXBException ex) {
throw new RuntimeException(ex);
}
}
private static Object[] getDataParameter(final SqlAssert sqlAssert) {
final Object[] result = new Object[4];
result[0] = sqlAssert.getId();
result[1] = sqlAssert.getSql();
if (null == sqlAssert.getTypes()) {
result[2] = Collections.emptySet();
} else {
Set<DatabaseType> types = new HashSet<>();
for (String each : sqlAssert.getTypes().split(",")) {
types.add(DatabaseType.valueOf(each));
}
result[2] = types;
}
result[3] = sqlAssert.getSqlShardingRules();
return result;
}
}
......@@ -27,6 +27,7 @@ import com.dangdang.ddframe.rdb.sharding.constant.SQLType;
import com.dangdang.ddframe.rdb.sharding.jdbc.core.datasource.ShardingDataSource;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import org.dbunit.DatabaseUnitException;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.ITable;
import org.dbunit.dataset.ITableIterator;
......@@ -34,6 +35,7 @@ import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
import org.junit.Test;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.sql.Connection;
import java.sql.PreparedStatement;
......@@ -44,7 +46,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.dangdang.ddframe.rdb.common.sql.common.ShardingTestStrategy.masterslave;
import static com.dangdang.ddframe.rdb.integrate.util.SqlPlaceholderUtil.replacePreparedStatement;
import static com.dangdang.ddframe.rdb.integrate.util.SqlPlaceholderUtil.replaceStatement;
import static org.dbunit.Assertion.assertEquals;
......@@ -68,20 +69,20 @@ public abstract class AbstractSqlAssertTest extends AbstractBaseSqlTest {
protected abstract Map<DatabaseType, ShardingDataSource> getShardingDataSources();
@Test
public void assertWithPreparedStatement() throws Exception {
public void assertWithPreparedStatement() {
execute(true);
}
@Test
public void assertWithStatement() throws Exception {
public void assertWithStatement() {
execute(false);
}
private void execute(final boolean isPreparedStatement) throws Exception {
private void execute(final boolean isPreparedStatement) {
for (Map.Entry<DatabaseType, ShardingDataSource> each : getShardingDataSources().entrySet()) {
if (types.size() == 0 || types.contains(each.getKey())) {
if (types.isEmpty() || types.contains(each.getKey())) {
try {
executeAndAssertSql(isPreparedStatement, each.getValue());
executeAndAssertSQL(isPreparedStatement, each.getValue());
//CHECKSTYLE:OFF
} catch (final Exception ex) {
//CHECKSTYLE:ON
......@@ -94,22 +95,24 @@ public abstract class AbstractSqlAssertTest extends AbstractBaseSqlTest {
}
}
private void executeAndAssertSql(final boolean isPreparedStatement, final ShardingDataSource shardingDataSource) throws Exception {
private void executeAndAssertSQL(final boolean isPreparedStatement, final ShardingDataSource shardingDataSource) throws MalformedURLException, SQLException, DatabaseUnitException {
for (SqlShardingRule sqlShardingRule : shardingRules) {
if (needAssert(sqlShardingRule)) {
for (SqlAssertData each : sqlShardingRule.getData()) {
String expected = each.getExpected() == null ? "integrate/dataset/EmptyTable.xml"
: String.format("integrate/dataset/%s/expect/" + each.getExpected(), getShardingStrategy().name(), getShardingStrategy().name());
URL url = AbstractSqlAssertTest.class.getClassLoader().getResource(expected);
if (null == url) {
throw new Exception("Wrong expected file:" + expected);
}
File expectedDataSetFile = new File(url.getPath());
if (sql.toUpperCase().startsWith("SELECT")) {
assertSelectSql(isPreparedStatement, shardingDataSource, each, expectedDataSetFile);
} else {
assertDmlSql(isPreparedStatement, shardingDataSource, each, expectedDataSetFile);
}
if (!needAssert(sqlShardingRule)) {
continue;
}
for (SqlAssertData each : sqlShardingRule.getData()) {
// TODO DML和DQL保持一直,去掉DML中XML名称里面的placeholder
String expected = null == each.getExpected() ? "integrate/dataset/EmptyTable.xml"
: String.format("integrate/dataset/%s/expect/" + each.getExpected(), getShardingStrategy().name(), getShardingStrategy().name());
URL url = AbstractSqlAssertTest.class.getClassLoader().getResource(expected);
if (null == url) {
throw new RuntimeException("Wrong expected file:" + expected);
}
File expectedDataSetFile = new File(url.getPath());
if (sql.toUpperCase().startsWith("SELECT")) {
assertSelectSql(isPreparedStatement, shardingDataSource, each, expectedDataSetFile);
} else {
assertDmlSql(isPreparedStatement, shardingDataSource, each, expectedDataSetFile);
}
}
}
......@@ -128,7 +131,8 @@ public abstract class AbstractSqlAssertTest extends AbstractBaseSqlTest {
return false;
}
private void assertSelectSql(final boolean isPreparedStatement, final ShardingDataSource shardingDataSource, final SqlAssertData data, final File expectedDataSetFile) throws Exception {
private void assertSelectSql(final boolean isPreparedStatement, final ShardingDataSource shardingDataSource, final SqlAssertData data, final File expectedDataSetFile)
throws MalformedURLException, SQLException, DatabaseUnitException {
if (isPreparedStatement) {
executeQueryWithPreparedStatement(shardingDataSource, getParameters(data), expectedDataSetFile);
} else {
......@@ -136,23 +140,23 @@ public abstract class AbstractSqlAssertTest extends AbstractBaseSqlTest {
}
}
private void assertDmlSql(final boolean isPreparedStatement, final ShardingDataSource shardingDataSource, final SqlAssertData data, final File expectedDataSetFile) throws Exception {
private void assertDmlSql(final boolean isPreparedStatement, final ShardingDataSource shardingDataSource, final SqlAssertData data, final File expectedDataSetFile)
throws MalformedURLException, SQLException, DatabaseUnitException {
if (isPreparedStatement) {
executeWithPreparedStatement(shardingDataSource, getParameters(data));
} else {
executeWithStatement(shardingDataSource, getParameters(data));
}
String dataSourceName = getDataSourceName(data.getExpected());
SQLType sqlType = getSqlType();
try (Connection conn = shardingDataSource.getConnection().getConnection(dataSourceName, sqlType)) {
try (Connection conn = shardingDataSource.getConnection().getConnection(getDataSourceName(data.getExpected()), getSqlType())) {
assertResult(conn, expectedDataSetFile);
}
}
private SQLType getSqlType() {
return masterslave == getShardingStrategy() ? SQLType.INSERT : SQLType.SELECT;
return ShardingTestStrategy.masterslave == getShardingStrategy() ? SQLType.INSERT : SQLType.SELECT;
}
// TODO 标准化文件名
private String getDataSourceName(final String expected) {
String result = String.format(expected.split("/")[1].split(".xml")[0], getShardingStrategy().name());
if (!result.contains("_")) {
......@@ -176,14 +180,7 @@ public abstract class AbstractSqlAssertTest extends AbstractBaseSqlTest {
private void executeWithPreparedStatement(final ShardingDataSource dataSource, final List<String> parameters) throws SQLException {
try (Connection connection = dataSource.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement(replacePreparedStatement(sql))) {
int index = 1;
for (String each : parameters) {
if (each.contains("'")) {
preparedStatement.setString(index++, each.replace("'", ""));
} else {
preparedStatement.setInt(index++, Integer.valueOf(each));
}
}
setParameters(preparedStatement, parameters);
preparedStatement.execute();
}
}
......@@ -194,18 +191,12 @@ public abstract class AbstractSqlAssertTest extends AbstractBaseSqlTest {
statement.execute(replaceStatement(sql, parameters.toArray()));
}
}
private void executeQueryWithPreparedStatement(final ShardingDataSource dataSource, final List<String> parameters, final File file) throws Exception {
private void executeQueryWithPreparedStatement(final ShardingDataSource dataSource, final List<String> parameters, final File file)
throws MalformedURLException, SQLException, DatabaseUnitException {
try (Connection conn = dataSource.getConnection();
PreparedStatement preparedStatement = conn.prepareStatement(replacePreparedStatement(sql))) {
int index = 1;
for (String param : parameters) {
if (param.contains("'")) {
preparedStatement.setString(index++, param.replace("'", ""));
} else {
preparedStatement.setInt(index++, Integer.valueOf(param));
}
}
setParameters(preparedStatement, parameters);
ITableIterator expectedTableIterator = new FlatXmlDataSetBuilder().build(file).iterator();
while (expectedTableIterator.next()) {
ITable expectedTable = expectedTableIterator.getTable();
......@@ -217,8 +208,19 @@ public abstract class AbstractSqlAssertTest extends AbstractBaseSqlTest {
}
}
}
private void executeQueryWithStatement(final ShardingDataSource dataSource, final List<String> parameters, final File file) throws Exception {
private void setParameters(final PreparedStatement preparedStatement, final List<String> parameters) throws SQLException {
int index = 1;
for (String each : parameters) {
if (each.contains("'")) {
preparedStatement.setString(index++, each.replace("'", ""));
} else {
preparedStatement.setInt(index++, Integer.valueOf(each));
}
}
}
private void executeQueryWithStatement(final ShardingDataSource dataSource, final List<String> parameters, final File file) throws MalformedURLException, SQLException, DatabaseUnitException {
try (Connection conn = dataSource.getConnection()) {
String querySql = replaceStatement(sql, parameters.toArray());
ITableIterator expectedTableIterator = new FlatXmlDataSetBuilder().build(file).iterator();
......@@ -233,7 +235,7 @@ public abstract class AbstractSqlAssertTest extends AbstractBaseSqlTest {
}
}
private void assertResult(final Connection connection, final File file) throws Exception {
private void assertResult(final Connection connection, final File file) throws MalformedURLException, SQLException, DatabaseUnitException {
ITableIterator expectedTableIterator = new FlatXmlDataSetBuilder().build(file).iterator();
try (Connection conn = connection) {
while (expectedTableIterator.next()) {
......@@ -249,7 +251,7 @@ public abstract class AbstractSqlAssertTest extends AbstractBaseSqlTest {
private String getStatus(final File file) {
if (sql.toUpperCase().startsWith("DELETE")) {
return masterslave == getShardingStrategy() ? "init_master" : "init";
return ShardingTestStrategy.masterslave == getShardingStrategy() ? "init_master" : "init";
}
return file.getParentFile().getName();
}
......
......@@ -24,22 +24,20 @@ import java.util.ArrayList;
import java.util.List;
import static com.dangdang.ddframe.rdb.sharding.constant.DatabaseType.H2;
import static com.dangdang.ddframe.rdb.sharding.constant.DatabaseType.MySQL;
import static com.dangdang.ddframe.rdb.sharding.constant.DatabaseType.PostgreSQL;
public enum DatabaseTestMode {
All, Local, Test;
ALL, LOCAL, TEST;
public List<DatabaseType> databaseTypes() {
List<DatabaseType> result = new ArrayList<>();
if (All == this) {
if (ALL == this) {
return Lists.newArrayList(DatabaseType.values());
} else if (Local == this) {
result.add(MySQL);
// result.add(PostgreSQL);
// result.add(Oracle);
// result.add(SQLServer);
} else if (Test == this) {
} else if (LOCAL == this) {
// result.add(MySQL);
result.add(PostgreSQL);
} else if (TEST == this) {
result.add(H2);
}
return result;
......
package com.dangdang.ddframe.rdb.common.sql.common;
import com.dangdang.ddframe.rdb.common.jaxb.SqlAssert;
import com.dangdang.ddframe.rdb.common.jaxb.SqlAsserts;
import com.dangdang.ddframe.rdb.common.sql.base.AbstractSqlAssertTest;
import com.dangdang.ddframe.rdb.sharding.constant.DatabaseType;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class SQLAssertUtil {
public static Collection<Object[]> getDataParameters(final String assertFilePath) {
Collection<Object[]> result = new ArrayList<>();
URL url = AbstractSqlAssertTest.class.getClassLoader().getResource(assertFilePath);
if (null == url) {
return Collections.emptyList();
}
File filePath = new File(url.getPath());
if (!filePath.exists()) {
return Collections.emptyList();
}
File[] files = filePath.listFiles();
if (null == files) {
return Collections.emptyList();
}
for (File each : files) {
result.addAll(dataParameters(each));
}
return result;
}
private static Collection<Object[]> dataParameters(final File file) {
SqlAsserts asserts = loadSqlAsserts(file);
Object[][] result = new Object[asserts.getSqlAsserts().size()][1];
for (int i = 0; i < asserts.getSqlAsserts().size(); i++) {
result[i] = getDataParameter(asserts.getSqlAsserts().get(i));
}
return Arrays.asList(result);
}
private static SqlAsserts loadSqlAsserts(final File file) {
try {
return (SqlAsserts) JAXBContext.newInstance(SqlAsserts.class).createUnmarshaller().unmarshal(file);
} catch (final JAXBException ex) {
throw new RuntimeException(ex);
}
}
private static Object[] getDataParameter(final SqlAssert sqlAssert) {
final Object[] result = new Object[4];
result[0] = sqlAssert.getId();
result[1] = sqlAssert.getSql();
if (null == sqlAssert.getTypes()) {
result[2] = Collections.emptySet();
} else {
Set<DatabaseType> types = new HashSet<>();
for (String each : sqlAssert.getTypes().split(",")) {
types.add(DatabaseType.valueOf(each));
}
result[2] = types;
}
result[3] = sqlAssert.getSqlShardingRules();
return result;
}
}
......@@ -18,5 +18,6 @@
package com.dangdang.ddframe.rdb.common.sql.common;
public enum ShardingTestStrategy {
tbl, db, dbtbl, masterslave
tbl, db, dbtbl, masterslave, nullable
}
......@@ -54,7 +54,7 @@ import static org.dbunit.Assertion.assertEquals;
public abstract class AbstractDBUnitTest {
protected static final DatabaseType CURRENT_DB_TYPE = H2;
protected static final DatabaseType CURRENT_DB_TYPE = MySQL;
@Getter(AccessLevel.PROTECTED)
private static DatabaseTestSQL databaseTestSQL;
......@@ -84,7 +84,7 @@ public abstract class AbstractDBUnitTest {
}
}
conn = createDataSource("tbl").getConnection();
RunScript.execute(conn, new InputStreamReader(AbstractDBUnitTest.class.getClassLoader().getResourceAsStream("integrate/schema/table/tbl.sql")));
// RunScript.execute(conn, new InputStreamReader(AbstractDBUnitTest.class.getClassLoader().getResourceAsStream("integrate/schema/table/tbl.sql")));
conn.close();
} catch (final SQLException ex) {
ex.printStackTrace();
......
......@@ -111,12 +111,15 @@
</sharding-rule>
</sql>
<sql id="assertSelectPagingWithOffset" value="SELECT i.* FROM t_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id WHERE o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s ORDER BY i.item_id DESC OFFSET %s" type="PostgreSQL">
<sharding-rule value="tbl,db">
<sharding-rule value="tbl">
<data parameter="10,19,1000,1909,18" expected="select/postgresql/SelectPagingWithOffsetSql.xml" />
</sharding-rule>
<sharding-rule value="masterslave,dbtbl">
<data parameter="10,19,1000,1909,38" expected="select/postgresql/SelectPagingWithOffsetSql.xml" />
</sharding-rule>
<sharding-rule value="db">
<data parameter="10,19,1000,1909,6" expected="select/postgresql/SelectPagingWithOffsetSql.xml" />
</sharding-rule>
</sql>
<sql id="assertSelectPagingWithRowCount" value="SELECT i.* FROM t_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id WHERE o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s ORDER BY i.item_id DESC LIMIT %s" type="MySQL,H2,PostgreSQL">
<sharding-rule>
......@@ -153,4 +156,16 @@
<data parameter="10,19,1000,1909,4,2" expected="select/oracle/SelectPagingWithOffsetAndRowCountSql.xml" />
</sharding-rule>
</sql>
<sql id="assertSelectCountWithBindingTable" value="SELECT COUNT(*) AS items_count FROM t_order o, t_order_item i WHERE o.user_id = i.user_id AND o.order_id = i.order_id AND o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s">
<sharding-rule>
<data parameter="10,11,1000,1909" expected="select_aggregate/SelectCountWithBindingTable_0.xml" />
<data parameter="1,9,1000,1909" expected="select_aggregate/SelectCountWithBindingTable_1.xml" />
</sharding-rule>
</sql>
<sql id="assertSelectCountWithBindingTableWithJoin" value="SELECT COUNT(*) AS items_count FROM t_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id WHERE o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s">
<sharding-rule>
<data parameter="10,11,1000,1909" expected="select_aggregate/SelectCountWithBindingTable_0.xml" />
<data parameter="1,9,1000,1909" expected="select_aggregate/SelectCountWithBindingTable_1.xml" />
</sharding-rule>
</sql>
</sqls>
......@@ -25,16 +25,4 @@
<data expected="select_aggregate/SelectAVG.xml" />
</sharding-rule>
</sql>
<sql id="assertSelectCountWithBindingTable" value="SELECT COUNT(*) AS items_count FROM t_order o, t_order_item i WHERE o.user_id = i.user_id AND o.order_id = i.order_id AND o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s">
<sharding-rule>
<data parameter="10,11,1000,1909" expected="select_aggregate/SelectCountWithBindingTable_0.xml" />
<data parameter="1,9,1000,1909" expected="select_aggregate/SelectCountWithBindingTable_1.xml" />
</sharding-rule>
</sql>
<sql id="assertSelectCountWithBindingTableWithJoin" value="SELECT COUNT(*) AS items_count FROM t_order o JOIN t_order_item i ON o.user_id = i.user_id AND o.order_id = i.order_id WHERE o.user_id IN (%s, %s) AND o.order_id BETWEEN %s AND %s">
<sharding-rule>
<data parameter="10,11,1000,1909" expected="select_aggregate/SelectCountWithBindingTable_0.xml" />
<data parameter="1,9,1000,1909" expected="select_aggregate/SelectCountWithBindingTable_1.xml" />
</sharding-rule>
</sql>
</sqls>
<dataset>
<t_order_item ORDER_BY_DERIVED_0="190002" item_id="190002" order_id="1900" user_id="19" status="init" />
<t_order_item ORDER_BY_DERIVED_0="190001" item_id="190001" order_id="1900" user_id="19" status="init" />
</dataset>
<dataset>
<t_order_item item_id="100002" order_by_derived_0="100002" order_id="1000" user_id="10" status="init" />
<t_order_item item_id="100001" order_by_derived_0="100001" order_id="1000" user_id="10" status="init" />
<t_order_item item_id="100000" order_by_derived_0="100000" order_id="1000" user_id="10" status="init" />
</dataset>
<dataset>
<t_order user_id_avg="19.5" AVG_DERIVED_COUNT_0="40" AVG_DERIVED_SUM_0="780" />
</dataset>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册