Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
671 changes: 671 additions & 0 deletions documents/xa/XA_INTEGRATION_TEST_COVERAGE_ANALYSIS.md

Large diffs are not rendered by default.

536 changes: 536 additions & 0 deletions documents/xa/XA_TEST_IMPLEMENTATION_GUIDE.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import openjproxy.jdbc.testutil.TestDBUtils;
import openjproxy.jdbc.testutil.TestDBUtils.ConnectionResult;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
Expand All @@ -26,6 +28,7 @@ public class BlobIntegrationTest {
private static boolean isMariaDBTestEnabled;
private static boolean isOracleTestEnabled;
private String tableName;
private ConnectionResult connectionResult;
private Connection conn;

@BeforeAll
Expand All @@ -36,7 +39,7 @@ public static void checkTestConfiguration() {
isOracleTestEnabled = Boolean.parseBoolean(System.getProperty("enableOracleTests", "false"));
}

public void setUp(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
public void setUp(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {

this.tableName = "blob_test_blob";
if (url.toLowerCase().contains("mysql")) {
Expand All @@ -53,13 +56,17 @@ public void setUp(String driverClass, String url, String user, String pwd) throw
this.tableName += "_h2";
}
Class.forName(driverClass);
this.conn = DriverManager.getConnection(url, user, pwd);
connectionResult = TestDBUtils.createConnection(url, user, pwd, isXA);
this.conn = connectionResult.getConnection();

// Keep autocommit=true initially for DDL operations (CREATE/DROP TABLE)
// Will be set to false later for DML operations
}

@ParameterizedTest
@CsvFileSource(resources = "/h2_mysql_mariadb_oracle_connections.csv")
public void createAndReadingBLOBsSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
this.setUp(driverClass, url, user, pwd);
public void createAndReadingBLOBsSuccessful(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException, IOException {
this.setUp(driverClass, url, user, pwd, isXA);
System.out.println("Testing for url -> " + url);

try {
Expand All @@ -76,6 +83,14 @@ public void createAndReadingBLOBsSuccessful(String driverClass, String url, Stri
")"
);

// After DDL is complete, set autocommit to false for transaction control
if (!isXA) {
conn.setAutoCommit(false);
}

// Start XA transaction after DDL is complete (must be called AFTER DDL to avoid MySQL/MariaDB XAER_RMFAIL)
connectionResult.startXATransactionIfNeeded();

PreparedStatement psInsert = conn.prepareStatement(
" insert into " + tableName + " (val_blob, val_blob2, val_blob3) values (?, ?, ?)"
);
Expand Down Expand Up @@ -127,13 +142,13 @@ public void createAndReadingBLOBsSuccessful(String driverClass, String url, Stri

resultSet.close();
psSelect.close();
conn.close();
connectionResult.close();
}

@ParameterizedTest
@CsvFileSource(resources = "/h2_mysql_mariadb_oracle_connections.csv")
public void creatingAndReadingLargeBLOBsSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, IOException, ClassNotFoundException {
this.setUp(driverClass, url, user, pwd);
public void creatingAndReadingLargeBLOBsSuccessful(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, IOException, ClassNotFoundException {
this.setUp(driverClass, url, user, pwd, isXA);
System.out.println("Testing for url -> " + url);

try {
Expand All @@ -148,6 +163,14 @@ public void creatingAndReadingLargeBLOBsSuccessful(String driverClass, String ur
")"
);

// After DDL is complete, set autocommit to false for transaction control
if (!isXA) {
conn.setAutoCommit(false);
}

// Start XA transaction after DDL is complete (must be called AFTER DDL to avoid MySQL/MariaDB XAER_RMFAIL)
connectionResult.startXATransactionIfNeeded();

PreparedStatement psInsert = conn.prepareStatement(
"insert into " + tableName + " (val_blob) values (?)"
);
Expand Down Expand Up @@ -179,7 +202,7 @@ public void creatingAndReadingLargeBLOBsSuccessful(String driverClass, String ur

resultSet.close();
psSelect.close();
conn.close();
connectionResult.close();
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package openjproxy.jdbc;

import openjproxy.jdbc.testutil.TestDBUtils;
import openjproxy.jdbc.testutil.TestDBUtils.ConnectionResult;
import org.junit.Assert;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
Expand All @@ -18,6 +19,7 @@ public class MySQLDatabaseMetaDataExtensiveTests {

private static boolean isMySQLTestEnabled;
private static boolean isMariaDBTestEnabled;
private static ConnectionResult connectionResult;
private static Connection connection;

@BeforeAll
Expand All @@ -26,22 +28,30 @@ public static void checkTestConfiguration() {
isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
}

public void setUp(String driverClass, String url, String user, String password) throws Exception {
public void setUp(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
assumeFalse(!isMySQLTestEnabled, "MySQL tests are not enabled");
assumeFalse(!isMariaDBTestEnabled, "MariaDB tests are not enabled");
connection = DriverManager.getConnection(url, user, password);
connectionResult = TestDBUtils.createConnection(url, user, password, isXA);
connection = connectionResult.getConnection();

// For non-XA connections, set autocommit to false for transaction control
if (!isXA) {
connection.setAutoCommit(false);
}
TestDBUtils.createBasicTestTable(connection, "mysql_db_metadata_test", TestDBUtils.SqlSyntax.MYSQL, true);
}

@AfterAll
public static void teardown() throws Exception {
TestDBUtils.closeQuietly(connection);
if (connectionResult != null) {
connectionResult.close();
}
}

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testBasicDatabaseMetaDataProperties(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testBasicDatabaseMetaDataProperties(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// Basic database properties
Expand All @@ -68,8 +78,8 @@ public void testBasicDatabaseMetaDataProperties(String driverClass, String url,

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testSupportFeatures(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testSupportFeatures(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// MySQL typically supports these features
Expand Down Expand Up @@ -98,8 +108,8 @@ public void testSupportFeatures(String driverClass, String url, String user, Str

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testIdentifierProperties(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testIdentifierProperties(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// MySQL identifier properties
Expand All @@ -119,8 +129,8 @@ public void testIdentifierProperties(String driverClass, String url, String user

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testTransactionSupport(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testTransactionSupport(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// Transaction isolation levels
Expand All @@ -137,8 +147,8 @@ public void testTransactionSupport(String driverClass, String url, String user,

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testFunctionSupport(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testFunctionSupport(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// Function lists should not be null
Expand All @@ -160,8 +170,8 @@ public void testFunctionSupport(String driverClass, String url, String user, Str

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testResultSetSupport(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testResultSetSupport(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// ResultSet type support
Expand All @@ -181,8 +191,8 @@ public void testResultSetSupport(String driverClass, String url, String user, St

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testGetTables(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testGetTables(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// Test getTables method
Expand All @@ -204,8 +214,8 @@ public void testGetTables(String driverClass, String url, String user, String pa

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testGetColumns(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testGetColumns(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// Test getColumns method
Expand All @@ -231,8 +241,8 @@ public void testGetColumns(String driverClass, String url, String user, String p

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testGetPrimaryKeys(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testGetPrimaryKeys(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// Test getPrimaryKeys method
Expand All @@ -255,8 +265,8 @@ public void testGetPrimaryKeys(String driverClass, String url, String user, Stri

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testGetTypeInfo(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testGetTypeInfo(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// Test getTypeInfo method
Expand All @@ -280,8 +290,8 @@ public void testGetTypeInfo(String driverClass, String url, String user, String

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testMySQLSpecificMetaData(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testMySQLSpecificMetaData(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// MySQL specific features
Expand All @@ -308,8 +318,8 @@ public void testMySQLSpecificMetaData(String driverClass, String url, String use

@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
public void testLimitsAndSizes(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
public void testLimitsAndSizes(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
this.setUp(driverClass, url, user, password, isXA);
DatabaseMetaData meta = connection.getMetaData();

// Test various limits - these should return reasonable values or 0 if unlimited
Expand Down
Loading
Loading