提交 3542f7bf 编写于 作者: L liu ze jian

assert-sharding-database-only-with-hint-for-dml-test (test refactoring)

上级 ac572d7e
......@@ -26,6 +26,7 @@ import javax.xml.bind.JAXBException;
import io.shardingjdbc.core.constant.DatabaseType;
import io.shardingjdbc.dbtest.config.bean.*;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
......@@ -90,18 +91,28 @@ public class StartTest {
try {
for (String each : paths) {
AssertsDefinition assertsDefinition = AnalyzeConfig.analyze(each);
InItCreateSchema.addDatabase(assertsDefinition.getBaseConfig());
if (StringUtils.isNotBlank(assertsDefinition.getBaseConfig())) {
String[] dbs = StringUtils.split(assertsDefinition.getBaseConfig());
for (String db : dbs) {
InItCreateSchema.addDatabase(db);
}
} else {
String[] dbs = new String[]{"db", "dbtbl", "jdbc", "master", "master_only", "nullable", "slave", "slave_only", "tbl"};
for (String db : dbs) {
InItCreateSchema.addDatabase(db);
}
}
List<AssertDQLDefinition> assertDQLs = assertsDefinition.getAssertDQL();
collateData(RESULT_ASSERT, each, assertDQLs);
List<AssertDMLDefinition> assertDMLs = assertsDefinition.getAssertDML();
collateData(RESULT_ASSERT, each, assertDMLs);
List<AssertDDLDefinition> assertDDLs = assertsDefinition.getAssertDDL();
collateData(RESULT_ASSERT, each, assertDDLs);
AssertEngine.addAssertDefinition(each, assertsDefinition);
}
} catch (JAXBException | IOException e) {
......
......@@ -36,6 +36,7 @@ import io.shardingjdbc.dbtest.init.InItCreateSchema;
import io.shardingjdbc.test.sql.SQLCasesLoader;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.dbcp2.BasicDataSource;
import org.junit.Assert;
import org.xml.sax.SAXException;
......@@ -57,7 +58,7 @@ public class AssertEngine {
@Getter
@Setter
private static volatile boolean clean ;
private static volatile boolean clean;
static {
initialized = Boolean.valueOf(StartTest.getString("initialized", "false"));
......@@ -87,18 +88,16 @@ public class AssertEngine {
String rootPath = path.substring(0, path.lastIndexOf(File.separator) + 1);
assertsDefinition.setPath(rootPath);
DataSource dataSource = null;
try {
String msg = "The file path " + path + ", under which id is " + id;
DataSource dataSource = getDataSource(PathUtil.getPath(assertsDefinition.getShardingRuleConfig(), rootPath));
dataSource = getDataSource(PathUtil.getPath(assertsDefinition.getShardingRuleConfig(), rootPath));
ShardingContext shardingContext = getShardingContext((ShardingDataSource) dataSource);
Map<String, DataSource> dataSourceMaps = shardingContext.getDataSourceMap();
List<String> dbs = new ArrayList<>();
for (String s : dataSourceMaps.keySet()) {
dbs.add(s);
}
List<String> dbs = new ArrayList<>(dataSourceMaps.keySet());
// dql run
dqlRun(path, id, assertsDefinition, rootPath, msg, dataSource, dataSourceMaps, dbs);
......@@ -111,6 +110,10 @@ public class AssertEngine {
} catch (NoSuchFieldException | IllegalAccessException | ParseException | XPathExpressionException | SQLException | ParserConfigurationException | SAXException | IOException e) {
throw new DbTestException(e);
} finally {
if (dataSource != null) {
((ShardingDataSource) dataSource).close();
}
}
return true;
}
......@@ -205,12 +208,12 @@ public class AssertEngine {
try {
initTableData(dataSourceMaps, sqls, mapDatasetDefinition);
try (Connection con = dataSource.getConnection();) {
boolean actual = DatabaseUtil.updateUsePreparedStatementToExecute(con, rootsql,
int actual = DatabaseUtil.updateUsePreparedStatementToExecute(con, rootsql,
anAssert.getParameters());
String expectedDataFile = PathUtil.getPath(anAssert.getExpectedDataFile(), rootPath);
DatasetDefinition checkDataset = AnalyzeDataset.analyze(new File(expectedDataFile));
Assert.assertEquals(msg + " Update error", false, actual);
Assert.assertEquals("Update row number error", anAssert.getExpectedUpdate().intValue(), actual);
String checksql = anAssert.getExpectedSql();
checksql = SQLCasesLoader.getInstance().getSQL(checksql);
......@@ -296,12 +299,12 @@ public class AssertEngine {
try {
initTableData(dataSourceMaps, sqls, mapDatasetDefinition);
try (Connection con = dataSource.getConnection();) {
boolean actual = DatabaseUtil.updateUseStatementToExecute(con, rootsql, anAssert.getParameters());
int actual = DatabaseUtil.updateUseStatementToExecute(con, rootsql, anAssert.getParameters());
String expectedDataFile = PathUtil.getPath(anAssert.getExpectedDataFile(), rootPath);
DatasetDefinition checkDataset = AnalyzeDataset.analyze(new File(expectedDataFile));
Assert.assertEquals("Update error", false, actual);
Assert.assertEquals("Update row number error", anAssert.getExpectedUpdate().intValue(), actual);
String checksql = anAssert.getExpectedSql();
checksql = SQLCasesLoader.getInstance().getSQL(checksql);
......@@ -362,7 +365,7 @@ public class AssertEngine {
private static void doUpdateUseStatementToExecuteUpdateDDL(final String rootPath, final DataSource dataSource, final AssertDDLDefinition anAssert, final String rootsql, final String msg) throws SQLException, ParseException, IOException, SAXException, ParserConfigurationException, XPathExpressionException {
try {
try (Connection con = dataSource.getConnection()) {
ParametersDefinition parametersDefinition = new ParametersDefinition();
parametersDefinition.setNewParameter(Arrays.asList(anAssert.getParameter()));
......@@ -493,6 +496,21 @@ public class AssertEngine {
return ShardingDataSourceFactory.createDataSource(new File(path));
}
public static void main(String[] args) throws IOException, SQLException {
BasicDataSource result = new BasicDataSource();
result.setDriverClassName(com.mysql.jdbc.Driver.class.getName());
result.setUrl("jdbc:mysql://db.mysql:3306/mysql");
result.setUsername("test");
result.setPassword("test");
Map dataSourceHashMap = new HashMap<String, DataSource>();
dataSourceHashMap.put("db_0",result);
System.out.println(getDataSource(dataSourceHashMap,"E:\\repository\\GitHubMe\\sharding-jdbc2\\sharding-jdbc-core\\src\\test\\resources\\asserts\\assert-sharding-database-only-with-hint-for-dml-test\\config\\test-dbtbl.yaml"));
}
public static DataSource getDataSource(final Map<String, DataSource> dataSourceMap, final String path) throws IOException, SQLException {
return ShardingDataSourceFactory.createDataSource(dataSourceMap, new File(path));
}
......
......@@ -189,7 +189,8 @@ public class DatabaseUtil {
int result = 0;
try (Statement pstmt = conn.createStatement()) {
for (ParameterDefinition parameterDefinition : parameter) {
String newSql = sqlStatement(sql, parameterDefinition.getValues());
String newSql = sqlReplaceStatement(sql, parameterDefinition.getValueReplaces());
newSql = sqlStatement(newSql, parameterDefinition.getValues());
result = result + pstmt.executeUpdate(newSql);
}
}
......@@ -241,6 +242,51 @@ public class DatabaseUtil {
return result;
}
/**
* Processing statement sql.
*
* @param sql sql
* @param parameter parameter
* @return sql
*/
private static String sqlReplaceStatement(final String sql, final List<ParameterValueDefinition> parameter) {
if (parameter == null) {
return sql;
}
String result = sql;
for (ParameterValueDefinition parameterDefinition : parameter) {
String type = parameterDefinition.getType();
String datacol = parameterDefinition.getValue();
switch (type) {
case "byte":
case "short":
case "int":
case "long":
case "float":
case "double":
result = Pattern.compile("#s", Pattern.LITERAL).matcher(result)
.replaceFirst(Matcher.quoteReplacement(datacol.toString()));
break;
case "boolean":
result = Pattern.compile("#s", Pattern.LITERAL).matcher(result)
.replaceFirst(Matcher.quoteReplacement(Boolean.valueOf(datacol).toString()));
break;
case "Date":
throw new DbTestException("Date type not supported for the time being");
case "String":
result = Pattern.compile("#s", Pattern.LITERAL).matcher(result)
.replaceFirst(Matcher.quoteReplacement("'" + datacol + "'"));
break;
default:
result = Pattern.compile("#s", Pattern.LITERAL).matcher(result)
.replaceFirst(Matcher.quoteReplacement("'" + datacol + "'"));
break;
}
}
return result;
}
/**
* Use Statement Test data update.
*
......@@ -250,18 +296,20 @@ public class DatabaseUtil {
* @return Implementation results
* @throws SQLException SQL executes exceptions
*/
public static boolean updateUseStatementToExecute(final Connection conn, final String sql,
final ParametersDefinition parameters) throws SQLException {
public static int updateUseStatementToExecute(final Connection conn, final String sql,
final ParametersDefinition parameters) throws SQLException {
List<ParameterDefinition> parameter = parameters.getParameter();
int result = 0;
try (Statement pstmt = conn.createStatement()) {
for (ParameterDefinition parameterDefinition : parameter) {
String newSql = sqlStatement(sql, parameterDefinition.getValues());
String newSql = sqlReplaceStatement(sql, parameterDefinition.getValueReplaces());
newSql = sqlStatement(newSql, parameterDefinition.getValues());
if (!pstmt.execute(newSql)) {
return false;
result = result + pstmt.getUpdateCount();
}
}
}
return true;
return result;
}
/**
......@@ -278,9 +326,10 @@ public class DatabaseUtil {
final ParametersDefinition parameters) throws SQLException, ParseException {
List<ParameterDefinition> parameter = parameters.getParameter();
int result = 0;
String newSql = sql.replaceAll("\\%s", "?");
try (PreparedStatement pstmt = conn.prepareStatement(newSql)) {
for (ParameterDefinition parameterDefinition : parameter) {
for (ParameterDefinition parameterDefinition : parameter) {
String newSql = sql.replaceAll("\\%s", "?");
newSql = sqlReplaceStatement(newSql, parameterDefinition.getValueReplaces());
try (PreparedStatement pstmt = conn.prepareStatement(newSql)) {
sqlPreparedStatement(parameterDefinition.getValues(), pstmt);
result = result + pstmt.executeUpdate();
}
......@@ -298,19 +347,23 @@ public class DatabaseUtil {
* @throws SQLException SQL executes exceptions
* @throws ParseException ParseException
*/
public static boolean updateUsePreparedStatementToExecute(final Connection conn, final String sql,
final ParametersDefinition parameters) throws SQLException, ParseException {
public static int updateUsePreparedStatementToExecute(final Connection conn, final String sql,
final ParametersDefinition parameters) throws SQLException, ParseException {
List<ParameterDefinition> parameter = parameters.getParameter();
String newSql = sql.replaceAll("\\%s", "?");
try (PreparedStatement pstmt = conn.prepareStatement(newSql)) {
for (ParameterDefinition parameterDefinition : parameter) {
int result = 0;
for (ParameterDefinition parameterDefinition : parameter) {
String newSql = sql.replaceAll("\\%s", "?");
newSql = sqlReplaceStatement(newSql, parameterDefinition.getValueReplaces());
try (PreparedStatement pstmt = conn.prepareStatement(newSql)) {
sqlPreparedStatement(parameterDefinition.getValues(), pstmt);
if (!pstmt.execute()) {
return false;
result = result + pstmt.getUpdateCount();
}
}
}
return true;
return result;
}
/**
......@@ -326,7 +379,8 @@ public class DatabaseUtil {
public static DatasetDatabase selectUsePreparedStatement(final Connection conn, final String sql,
final ParameterDefinition parameters) throws SQLException, ParseException {
List<ParameterValueDefinition> parameter = parameters.getValues();
String newSql = sql.replaceAll("\\%s", "?");
String newSql = sqlReplaceStatement(sql, parameters.getValueReplaces());
newSql = newSql.replaceAll("\\%s", "?");
try (PreparedStatement pstmt = conn.prepareStatement(newSql)) {
sqlPreparedStatement(parameter, pstmt);
try (ResultSet resultSet = pstmt.executeQuery()) {
......@@ -348,7 +402,8 @@ public class DatabaseUtil {
public static DatasetDatabase selectUsePreparedStatementToExecuteSelect(final Connection conn, final String sql,
final ParameterDefinition parameters) throws SQLException, ParseException {
List<ParameterValueDefinition> parameter = parameters.getValues();
String newSql = sql.replaceAll("\\%s", "?");
String newSql = sqlReplaceStatement(sql, parameters.getValueReplaces());
newSql = newSql.replaceAll("\\%s", "?");
try (PreparedStatement pstmt = conn.prepareStatement(newSql)) {
sqlPreparedStatement(parameter, pstmt);
boolean flag = pstmt.execute();
......@@ -442,8 +497,9 @@ public class DatabaseUtil {
public static DatasetDatabase selectUseStatement(final Connection conn, final String sql,
final ParameterDefinition parameters) throws SQLException {
List<ParameterValueDefinition> parameter = parameters.getValues();
String newSql = sqlReplaceStatement(sql, parameters.getValueReplaces());
try (Statement pstmt = conn.createStatement()) {
String newSql = sqlStatement(sql, parameter);
newSql = sqlStatement(newSql, parameter);
try (ResultSet resultSet = pstmt.executeQuery(newSql)) {
return useStatementBackResultSet(resultSet);
}
......@@ -462,8 +518,9 @@ public class DatabaseUtil {
public static DatasetDatabase selectUseStatementToExecuteSelect(final Connection conn, final String sql,
final ParameterDefinition parameters) throws SQLException {
List<ParameterValueDefinition> parameter = parameters.getValues();
String newSql = sqlReplaceStatement(sql, parameters.getValueReplaces());
try (Statement pstmt = conn.createStatement()) {
String newSql = sqlStatement(sql, parameter);
newSql = sqlStatement(newSql, parameter);
try (ResultSet resultSet = pstmt.executeQuery(newSql)) {
return useStatementBackResultSet(resultSet);
}
......
......@@ -24,6 +24,7 @@ import javax.xml.bind.annotation.XmlElement;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
@Getter
......@@ -31,9 +32,9 @@ import java.util.List;
public class ParameterDefinition {
@XmlElement(name = "value")
private List<ParameterValueDefinition> values;
private List<ParameterValueDefinition> values = new ArrayList<>();
@XmlElement(name = "valueReplace")
private List<ParameterValueDefinition> valueReplaces = new ArrayList<>();
}
......@@ -7,5 +7,13 @@
</metadata>
<dataset>
<data order_id="1" user_id="1" status="insert"/>
<data order_id="2" user_id="2" status="insert"/>
<data order_id="3" user_id="3" status="insert"/>
<data order_id="4" user_id="4" status="insert"/>
<data order_id="5" user_id="5" status="insert"/>
<data order_id="6" user_id="6" status="insert"/>
<data order_id="7" user_id="7" status="insert"/>
<data order_id="8" user_id="8" status="insert"/>
<data order_id="9" user_id="9" status="insert"/>
</dataset>
</init>
\ No newline at end of file
<init>
<metadata>
<table name="data">
<cloumn name="order_id" type="int" />
<cloumn name="user_id" type="int" />
</table>
</metadata>
<dataset>
<data order_id="2" user_id="2" status="insert"/>
</dataset>
</init>
\ No newline at end of file
<init>
<metadata>
<table name="data">
<cloumn name="order_id" type="int" />
<cloumn name="user_id" type="int" />
</table>
</metadata>
<dataset>
<data order_id="3" user_id="3" status="insert"/>
</dataset>
</init>
\ No newline at end of file
<init>
<metadata>
<table name="data">
<cloumn name="order_id" type="int" />
<cloumn name="user_id" type="int" />
</table>
</metadata>
<dataset>
<data order_id="4" user_id="4" status="insert"/>
</dataset>
</init>
\ No newline at end of file
<init>
<metadata>
<table name="data">
<cloumn name="order_id" type="int" />
<cloumn name="user_id" type="int" />
</table>
</metadata>
<dataset>
<data order_id="5" user_id="5" status="insert"/>
</dataset>
</init>
\ No newline at end of file
<init>
<metadata>
<table name="data">
<cloumn name="order_id" type="int" />
<cloumn name="user_id" type="int" />
</table>
</metadata>
<dataset>
<data order_id="6" user_id="6" status="insert"/>
</dataset>
</init>
\ No newline at end of file
<init>
<metadata>
<table name="data">
<cloumn name="order_id" type="int" />
<cloumn name="user_id" type="int" />
</table>
</metadata>
<dataset>
<data order_id="7" user_id="7" status="insert"/>
</dataset>
</init>
\ No newline at end of file
<init>
<metadata>
<table name="data">
<cloumn name="order_id" type="int" />
<cloumn name="user_id" type="int" />
</table>
</metadata>
<dataset>
<data order_id="8" user_id="8" status="insert"/>
</dataset>
</init>
\ No newline at end of file
<init>
<metadata>
<table name="data">
<cloumn name="order_id" type="int" />
<cloumn name="user_id" type="int" />
</table>
</metadata>
<dataset>
<data order_id="9" user_id="9" status="insert"/>
</dataset>
</init>
\ No newline at end of file
<init>
<metadata>
<table name="data">
<cloumn name="order_id" type="int" />
<cloumn name="user_id" type="int" />
</table>
</metadata>
<dataset>
<data order_id="1000" user_id="10" status="updated" />
<data order_id="1001" user_id="10" status="updated" />
<data order_id="2000" user_id="20" status="updated" />
<data order_id="2001" user_id="20" status="updated" />
<data order_id="1100" user_id="11" status="updated" />
<data order_id="1101" user_id="11" status="updated" />
<data order_id="2100" user_id="21" status="updated" />
<data order_id="2101" user_id="21" status="updated" />
<data order_id="1200" user_id="12" status="updated" />
<data order_id="1201" user_id="12" status="updated" />
<data order_id="2200" user_id="22" status="updated" />
<data order_id="2201" user_id="22" status="updated" />
<data order_id="1300" user_id="13" status="updated" />
<data order_id="1301" user_id="13" status="updated" />
<data order_id="2300" user_id="23" status="updated" />
<data order_id="2301" user_id="23" status="updated" />
<data order_id="1400" user_id="14" status="updated" />
<data order_id="1401" user_id="14" status="updated" />
<data order_id="2400" user_id="24" status="updated" />
<data order_id="2401" user_id="24" status="updated" />
<data order_id="1500" user_id="15" status="updated" />
<data order_id="1501" user_id="15" status="updated" />
<data order_id="2500" user_id="25" status="updated" />
<data order_id="2501" user_id="25" status="updated" />
<data order_id="1600" user_id="16" status="updated" />
<data order_id="1601" user_id="16" status="updated" />
<data order_id="2600" user_id="26" status="updated" />
<data order_id="2601" user_id="26" status="updated" />
<data order_id="1700" user_id="17" status="updated" />
<data order_id="1701" user_id="17" status="updated" />
<data order_id="2700" user_id="27" status="updated" />
<data order_id="2701" user_id="27" status="updated" />
<data order_id="1800" user_id="18" status="updated" />
<data order_id="1801" user_id="18" status="updated" />
<data order_id="2800" user_id="28" status="updated" />
<data order_id="2801" user_id="28" status="updated" />
<data order_id="1900" user_id="19" status="updated" />
<data order_id="1901" user_id="19" status="updated" />
<data order_id="2900" user_id="29" status="updated" />
<data order_id="2901" user_id="29" status="updated" />
</dataset>
</init>
\ No newline at end of file
......@@ -2,4 +2,7 @@
<sql-cases>
<sql-case id="assertDeleteWithShardingValue" value="DELETE FROM t_order WHERE order_id = %s AND user_id = %s AND status=%s" />
<sql-case id="assertDeleteWithoutShardingValue" value="DELETE FROM t_order WHERE status=%s" />
<sql-case id="assertDeleteWithoutAlias" value="DELETE FROM t_order WHERE order_id = %s AND user_id = %s AND status = %s" />
</sql-cases>
......@@ -7,6 +7,7 @@
<sql-case id="assertInsertOrderWithAllPlaceholders" value="INSERT INTO t_order (order_id, user_id, status) VALUES (%s, %s, %s)" />
<sql-case id="assertInsertWithoutPlaceholder" value="INSERT INTO t_order (order_id, user_id, status) VALUES (%s, %s, 'insert')"/>
<sql-case id="assertInsertWithPartialPlaceholders" value="INSERT INTO t_order (order_id, user_id, status) VALUES (#s, #s, %s)"/>
</sql-cases>
......@@ -2,4 +2,6 @@
<sql-cases>
<sql-case id="assertUpdateWithAlias" value="UPDATE t_order AS o SET o.status = %s WHERE o.order_id = %s AND o.user_id = %s" db-types="MySQL,H2"/>
<sql-case id="assertUpdateWithoutAlias" value="UPDATE t_order SET status = %s WHERE order_id = %s AND user_id = %s" />
</sql-cases>
......@@ -19,4 +19,7 @@
<sql-case 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" />
<sql-case 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" />
<sql-case id="assertSelectAliasWithKeyword" value="SELECT length.item_id password FROM t_order_item length where length.item_id = %s " db-types="MySQL,H2,SQLServer,Oracle" />
<sql-case id="assertSelectEqualsWithSingleTableExpected" value="SELECT * FROM t_order WHERE user_id in (%s,%s,%s,%s,%s,%s,%s,%s,%s) AND order_id in (%s,%s,%s,%s,%s,%s,%s,%s,%s)" />
<sql-case id="assertSelectUpdateWithoutAliasExpected" value="SELECT * FROM t_order WHERE user_id in (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s) AND order_id in (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)" />
</sql-cases>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册