diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BinaryStreamIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BinaryStreamIntegrationTest.java
index 2f61b4924..f6b1b2bf8 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BinaryStreamIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BinaryStreamIntegrationTest.java
@@ -2,8 +2,10 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -15,6 +17,8 @@
import java.sql.SQLException;
import java.sql.Statement;
+import openjproxy.jdbc.testutil.Db2ConnectionProvider;
+
import static openjproxy.helpers.SqlHelper.executeUpdate;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
@@ -22,6 +26,7 @@
* DB2-specific binary stream integration tests.
* Tests DB2-specific binary data types (VARBINARY, BLOB) and stream handling.
*/
+@EnabledIf("openjproxy.jdbc.testutil.Db2TestContainer#isEnabled")
public class Db2BinaryStreamIntegrationTest {
private static boolean isTestDisabled;
@@ -32,7 +37,7 @@ public static void setup() {
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void createAndReadingBinaryStreamSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
assumeFalse(isTestDisabled, "Skipping DB2 tests");
@@ -98,7 +103,7 @@ public void createAndReadingBinaryStreamSuccessful(String driverClass, String ur
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void createAndReadingLargeBinaryStreamSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
assumeFalse(isTestDisabled, "Skipping DB2 tests");
@@ -148,7 +153,7 @@ public void createAndReadingLargeBinaryStreamSuccessful(String driverClass, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2SpecificBinaryHandling(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
assumeFalse(isTestDisabled, "Skipping DB2 tests");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BlobIntegrationTest.java
index 39a1be879..21467020b 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BlobIntegrationTest.java
@@ -2,8 +2,10 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.Db2ConnectionProvider;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -23,6 +25,7 @@
* DB2-specific BLOB integration tests.
* Tests DB2 BLOB functionality and performance.
*/
+@EnabledIf("openjproxy.jdbc.testutil.Db2TestContainer#isEnabled")
public class Db2BlobIntegrationTest {
private static boolean isTestDisabled;
@@ -58,7 +61,7 @@ public void setUp(String driverClass, String url, String user, String pwd) throw
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2BlobCreationAndRetrieval(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
setUp(driverClass, url, user, pwd);
@@ -102,7 +105,7 @@ public void testDb2BlobCreationAndRetrieval(String driverClass, String url, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2BlobPerformance(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
setUp(driverClass, url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ConnectionExtensiveTests.java
index 73a7131c4..679e701fd 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ConnectionExtensiveTests.java
@@ -3,8 +3,10 @@
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.Db2ConnectionProvider;
import openjproxy.jdbc.testutil.TestDBUtils;
import java.sql.Connection;
@@ -23,19 +25,20 @@
* These tests verify that OJP can properly handle DB2-specific SQL syntax and data types.
*/
@Slf4j
+@EnabledIf("openjproxy.jdbc.testutil.Db2TestContainer#isEnabled")
public class Db2ConnectionExtensiveTests {
- private static boolean isDb2TestEnabled;
+ private static boolean isTestDisabled;
@BeforeAll
public static void setup() {
- isDb2TestEnabled = Boolean.parseBoolean(System.getProperty("enableDb2Tests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableDb2Tests", "false"));
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2BasicConnection(String driverClass, String url, String user, String pwd) throws SQLException {
- Assumptions.assumeFalse(!isDb2TestEnabled, "Skipping DB2 tests");
+ Assumptions.assumeFalse(isTestDisabled, "DB2 tests are disabled");
log.info("Testing DB2 connection with URL: {}", url);
@@ -79,9 +82,9 @@ public void testDb2BasicConnection(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2DataTypes(String driverClass, String url, String user, String pwd) throws SQLException {
- Assumptions.assumeFalse(!isDb2TestEnabled, "Skipping DB2 tests");
+ Assumptions.assumeFalse(isTestDisabled, "DB2 tests are disabled");
log.info("Testing DB2 data types with URL: {}", url);
@@ -134,9 +137,9 @@ public void testDb2DataTypes(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2BooleanHandling(String driverClass, String url, String user, String pwd) throws SQLException {
- Assumptions.assumeFalse(!isDb2TestEnabled, "Skipping DB2 tests");
+ Assumptions.assumeFalse(isTestDisabled, "DB2 tests are disabled");
log.info("Testing DB2 boolean handling with URL: {}", url);
@@ -184,9 +187,9 @@ public void testDb2BooleanHandling(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2NullVsEmptyString(String driverClass, String url, String user, String pwd) throws SQLException {
- Assumptions.assumeFalse(!isDb2TestEnabled, "Skipping DB2 tests");
+ Assumptions.assumeFalse(isTestDisabled, "DB2 tests are disabled");
log.info("Testing DB2 NULL vs empty string handling with URL: {}", url);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2DatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2DatabaseMetaDataExtensiveTests.java
index 2b6f813a8..6d7d53286 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2DatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2DatabaseMetaDataExtensiveTests.java
@@ -3,8 +3,10 @@
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -14,6 +16,8 @@
import java.sql.Statement;
import java.sql.Types;
+import openjproxy.jdbc.testutil.Db2ConnectionProvider;
+
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
@@ -21,6 +25,7 @@
* DB2-specific DatabaseMetaData tests.
* Tests DB2-specific metadata functionality and behavior.
*/
+@EnabledIf("openjproxy.jdbc.testutil.Db2TestContainer#isEnabled")
public class Db2DatabaseMetaDataExtensiveTests {
private static boolean isTestDisabled;
@@ -77,7 +82,7 @@ public void tearDown() throws SQLException {
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2DatabaseInfo(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -106,7 +111,7 @@ public void testDb2DatabaseInfo(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2TableMetaData(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -125,7 +130,7 @@ public void testDb2TableMetaData(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2ColumnMetaData(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -191,7 +196,7 @@ public void testDb2ColumnMetaData(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2PrimaryKeyMetaData(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -210,7 +215,7 @@ public void testDb2PrimaryKeyMetaData(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2IndexMetaData(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -244,7 +249,7 @@ public void testDb2IndexMetaData(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2DatabaseCapabilities(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -272,7 +277,7 @@ public void testDb2DatabaseCapabilities(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2SqlKeywords(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2MultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2MultipleTypesIntegrationTest.java
index 4b64bd4a6..db2bfc9cd 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2MultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2MultipleTypesIntegrationTest.java
@@ -1,10 +1,13 @@
package openjproxy.jdbc;
import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.Db2ConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
@@ -22,6 +25,7 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.Db2TestContainer#isEnabled")
public class Db2MultipleTypesIntegrationTest {
private static boolean isTestDisabled;
@@ -32,7 +36,7 @@ public static void checkTestConfiguration() {
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void typesCoverageTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, ParseException, UnsupportedEncodingException {
assumeFalse(isTestDisabled, "DB2 tests are disabled");
@@ -130,7 +134,7 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2SpecificTypes(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "DB2 tests are disabled");
@@ -184,7 +188,7 @@ public void testDb2SpecificTypes(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2NumericTypes(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "DB2 tests are disabled");
@@ -251,7 +255,7 @@ public void testDb2NumericTypes(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2DateTimeTypes(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "DB2 tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2PreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2PreparedStatementExtensiveTests.java
index 7f448c0e3..577c35226 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2PreparedStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2PreparedStatementExtensiveTests.java
@@ -2,8 +2,10 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.Db2ConnectionProvider;
import java.math.BigDecimal;
import java.sql.Connection;
@@ -21,6 +23,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.Db2TestContainer#isEnabled")
public class Db2PreparedStatementExtensiveTests {
private static boolean isTestDisabled;
@@ -81,7 +84,7 @@ public void tearDown() throws SQLException {
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2PreparedStatementBasicOperations(String driverClass, String url, String user, String password) throws Exception {
setUp(driverClass, url, user, password);
@@ -134,7 +137,7 @@ public void testDb2PreparedStatementBasicOperations(String driverClass, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2PreparedStatementDataTypes(String driverClass, String url, String user, String password) throws Exception {
setUp(driverClass, url, user, password);
@@ -169,7 +172,7 @@ public void testDb2PreparedStatementDataTypes(String driverClass, String url, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2PreparedStatementNullHandling(String driverClass, String url, String user, String password) throws Exception {
setUp(driverClass, url, user, password);
@@ -205,7 +208,7 @@ public void testDb2PreparedStatementNullHandling(String driverClass, String url,
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2PreparedStatementBatch(String driverClass, String url, String user, String password) throws Exception {
setUp(driverClass, url, user, password);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java
index cf950b421..53438edeb 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java
@@ -2,14 +2,18 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
+import openjproxy.jdbc.testutil.Db2ConnectionProvider;
+
import static openjproxy.helpers.SqlHelper.executeUpdate;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
@@ -17,6 +21,7 @@
* DB2-specific multiple blocks of data integration tests.
* Tests DB2 pagination and large result set handling.
*/
+@EnabledIf("openjproxy.jdbc.testutil.Db2TestContainer#isEnabled")
public class Db2ReadMultipleBlocksOfDataIntegrationTest {
private static boolean isTestDisabled;
@@ -27,7 +32,7 @@ public static void checkTestConfiguration() {
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connections_with_record_counts.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping DB2 tests");
@@ -79,7 +84,7 @@ public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driv
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2LargeDataSetPagination(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping DB2 tests");
@@ -144,7 +149,7 @@ public void testDb2LargeDataSetPagination(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2ResultSetScrolling(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping DB2 tests");
@@ -207,7 +212,7 @@ public void testDb2ResultSetScrolling(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2MultipleDataTypes(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping DB2 tests");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetMetaDataExtensiveTests.java
index a63ad4a5a..ebbbbd89c 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetMetaDataExtensiveTests.java
@@ -3,15 +3,20 @@
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.nio.charset.StandardCharsets;
import java.sql.*;
+import openjproxy.jdbc.testutil.Db2ConnectionProvider;
+
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.Db2TestContainer#isEnabled")
public class Db2ResultSetMetaDataExtensiveTests {
private static boolean isTestDisabled;
@@ -87,7 +92,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testAllResultSetMetaDataMethods(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -233,7 +238,7 @@ public void testAllResultSetMetaDataMethods(String driverClass, String url, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2SpecificDataTypes(String driverClass, String url, String user, String password) throws SQLException {
assumeFalse(isTestDisabled, "DB2 tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetTest.java
index 518d3fedb..8a239817f 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetTest.java
@@ -3,8 +3,10 @@
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -14,6 +16,8 @@
import java.sql.Statement;
import java.sql.Types;
+import openjproxy.jdbc.testutil.Db2ConnectionProvider;
+
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -25,6 +29,7 @@
* DB2-specific ResultSet tests.
* Tests DB2-specific ResultSet behavior and data type handling.
*/
+@EnabledIf("openjproxy.jdbc.testutil.Db2TestContainer#isEnabled")
public class Db2ResultSetTest {
private Connection connection;
@@ -97,7 +102,7 @@ public void tearDown() throws SQLException {
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2ResultSetNavigation(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -156,7 +161,7 @@ public void testDb2ResultSetNavigation(String driverClass, String url, String us
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2ResultSetDataTypes(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -185,7 +190,7 @@ public void testDb2ResultSetDataTypes(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2ResultSetMetaData(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -213,7 +218,7 @@ public void testDb2ResultSetMetaData(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2ResultSetConcurrency(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -229,7 +234,7 @@ public void testDb2ResultSetConcurrency(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2ResultSetWarnings(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2SavepointTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2SavepointTests.java
index 13f809dec..9be181c77 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2SavepointTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2SavepointTests.java
@@ -3,8 +3,10 @@
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -13,9 +15,12 @@
import java.sql.Savepoint;
import java.sql.Statement;
+import openjproxy.jdbc.testutil.Db2ConnectionProvider;
+
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.Db2TestContainer#isEnabled")
public class Db2SavepointTests {
private static boolean isTestDisabled;
@@ -67,7 +72,7 @@ public void tearDown() throws SQLException {
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2SavepointBasicOperations(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -111,7 +116,7 @@ public void testDb2SavepointBasicOperations(String driverClass, String url, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2MultipleSavepoints(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -159,7 +164,7 @@ public void testDb2MultipleSavepoints(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2SavepointRelease(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -190,7 +195,7 @@ public void testDb2SavepointRelease(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2UnnamedSavepoint(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -220,7 +225,7 @@ public void testDb2UnnamedSavepoint(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2SavepointWithCommit(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2StatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2StatementExtensiveTests.java
index 64b976f75..e8fd5a46f 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2StatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2StatementExtensiveTests.java
@@ -1,11 +1,14 @@
package openjproxy.jdbc;
import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.Db2ConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -23,6 +26,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.Db2TestContainer#isEnabled")
public class Db2StatementExtensiveTests {
private static boolean isTestDisabled;
@@ -56,7 +60,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testExecuteQuery(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ResultSet rs = statement.executeQuery("SELECT * FROM DB2INST1.db2_statement_test");
@@ -66,7 +70,7 @@ public void testExecuteQuery(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testExecuteUpdate(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int rows = statement.executeUpdate("UPDATE DB2INST1.db2_statement_test SET name = 'Updated Alice' WHERE id = 1");
@@ -79,7 +83,7 @@ public void testExecuteUpdate(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testClose(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
assertFalse(statement.isClosed());
@@ -88,7 +92,7 @@ public void testClose(String driverClass, String url, String user, String passwo
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testMaxFieldSize(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getMaxFieldSize();
@@ -99,7 +103,7 @@ public void testMaxFieldSize(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testExecuteAfterCloseThrows(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.close();
@@ -109,7 +113,7 @@ public void testExecuteAfterCloseThrows(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testMaxRows(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setMaxRows(1);
@@ -121,7 +125,7 @@ public void testMaxRows(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testEscapeProcessing(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Should not throw
@@ -130,7 +134,7 @@ public void testEscapeProcessing(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testQueryTimeout(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setQueryTimeout(5);
@@ -138,7 +142,7 @@ public void testQueryTimeout(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testCancel(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Should not throw
@@ -146,7 +150,7 @@ public void testCancel(String driverClass, String url, String user, String passw
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testWarnings(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.clearWarnings();
@@ -154,7 +158,7 @@ public void testWarnings(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testSetCursorName(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// DB2 supports named cursors
@@ -162,7 +166,7 @@ public void testSetCursorName(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testExecute(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
boolean isResultSet = statement.execute("SELECT * FROM DB2INST1.db2_statement_test");
@@ -178,7 +182,7 @@ public void testExecute(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testGetMoreResults(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.execute("SELECT * FROM DB2INST1.db2_statement_test");
@@ -187,7 +191,7 @@ public void testGetMoreResults(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testFetchDirection(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getFetchDirection();
@@ -197,7 +201,7 @@ public void testFetchDirection(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testFetchSize(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getFetchSize();
@@ -207,7 +211,7 @@ public void testFetchSize(String driverClass, String url, String user, String pa
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testResultSetConcurrencyAndType(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int concurrency = statement.getResultSetConcurrency();
@@ -217,7 +221,7 @@ public void testResultSetConcurrencyAndType(String driverClass, String url, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testBatchExecution(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.addBatch("INSERT INTO DB2INST1.db2_statement_test (id, name) VALUES (3, 'Charlie')");
@@ -232,7 +236,7 @@ public void testBatchExecution(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testClearBatch(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.addBatch("INSERT INTO DB2INST1.db2_statement_test (id, name) VALUES (5, 'Eve')");
@@ -242,14 +246,14 @@ public void testClearBatch(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testGetConnection(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
assertSame(connection, statement.getConnection());
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testGetMoreResultsWithCurrent(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.execute("SELECT * FROM DB2INST1.db2_statement_test");
@@ -257,7 +261,7 @@ public void testGetMoreResultsWithCurrent(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testGeneratedKeys(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
TestDBUtils.createAutoIncrementTestTable(connection, "test_auto_keys", TestDBUtils.SqlSyntax.DB2);
@@ -272,7 +276,7 @@ public void testGeneratedKeys(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testExecuteUpdateVariants(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -292,7 +296,7 @@ public void testExecuteUpdateVariants(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testExecuteVariants(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
TestDBUtils.createAutoIncrementTestTable(connection, "test_exec", TestDBUtils.SqlSyntax.DB2);
@@ -311,7 +315,7 @@ public void testExecuteVariants(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testGetResultSetHoldability(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int holdability = statement.getResultSetHoldability();
@@ -319,7 +323,7 @@ public void testGetResultSetHoldability(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testPoolable(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setPoolable(true);
@@ -332,7 +336,7 @@ public void testPoolable(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testCloseOnCompletion(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.closeOnCompletion();
@@ -340,7 +344,7 @@ public void testCloseOnCompletion(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testLargeMethodsDefault(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.getFetchDirection();
@@ -359,7 +363,7 @@ public void testLargeMethodsDefault(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testEnquoteLiteral(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
String quoted = statement.enquoteLiteral("foo'bar");
@@ -367,7 +371,7 @@ public void testEnquoteLiteral(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testEnquoteIdentifier(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// DB2 quotes identifiers to preserve case sensitivity
@@ -378,7 +382,7 @@ public void testEnquoteIdentifier(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testIsSimpleIdentifier(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// DB2 has specific rules for simple identifiers
@@ -392,7 +396,7 @@ public void testIsSimpleIdentifier(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testEnquoteNCharLiteral(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
String quoted = statement.enquoteNCharLiteral("foo'bar");
@@ -400,7 +404,7 @@ public void testEnquoteNCharLiteral(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/db2_connection.csv")
+ @ArgumentsSource(Db2ConnectionProvider.class)
public void testDb2SpecificFeatures(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionProvider.java
new file mode 100644
index 000000000..fcd55a39d
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionProvider.java
@@ -0,0 +1,36 @@
+package openjproxy.jdbc.testutil;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+import java.util.stream.Stream;
+
+/**
+ * Provides DB2 connection parameters for parameterized tests.
+ * This provider returns connection details from the DB2 TestContainer when DB2 tests are enabled.
+ * When DB2 tests are disabled, it returns an empty stream to skip test execution.
+ */
+public class Db2ConnectionProvider implements ArgumentsProvider {
+
+ @Override
+ public Stream extends Arguments> provideArguments(ExtensionContext context) {
+ // Return empty stream if DB2 tests are disabled - prevents test execution
+ if (!Db2TestContainer.isEnabled()) {
+ return Stream.empty();
+ }
+
+ // Get connection parameters from the DB2 TestContainer
+ String driverClass = "org.openjproxy.jdbc.Driver";
+ String jdbcUrl = Db2TestContainer.getJdbcUrl();
+ String username = Db2TestContainer.getUsername();
+ String password = Db2TestContainer.getPassword();
+
+ // Wrap the DB2 container URL with OJP driver URL
+ String ojpUrl = "jdbc:ojp[localhost:1059]_db2://" + jdbcUrl.substring("jdbc:db2://".length());
+
+ return Stream.of(
+ Arguments.of(driverClass, ojpUrl, username, password)
+ );
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2TestContainer.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2TestContainer.java
new file mode 100644
index 000000000..2dbdd7b0a
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2TestContainer.java
@@ -0,0 +1,93 @@
+package openjproxy.jdbc.testutil;
+
+import org.testcontainers.containers.Db2Container;
+
+/**
+ * Singleton DB2 test container for all DB2 integration tests.
+ * This ensures that all tests share the same DB2 instance to improve test performance
+ * and reduce resource usage.
+ */
+public class Db2TestContainer {
+
+ // DB2 Docker image version
+ private static final String DB2_IMAGE = "icr.io/db2_community/db2:11.5.9.0";
+
+ private static Db2Container container;
+ private static boolean isStarted = false;
+ private static boolean shutdownHookRegistered = false;
+
+ /**
+ * Gets or creates the shared DB2 test container instance.
+ * The container is automatically started on first access.
+ *
+ * @return the shared Db2Container instance
+ */
+ public static synchronized Db2Container getInstance() {
+ if (container == null) {
+ container = new Db2Container(DB2_IMAGE)
+ .acceptLicense();
+ }
+
+ if (!isStarted) {
+ container.start();
+ isStarted = true;
+
+ // Add shutdown hook to stop container when JVM exits
+ if (!shutdownHookRegistered) {
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ if (container != null && container.isRunning()) {
+ container.stop();
+ }
+ }));
+ shutdownHookRegistered = true;
+ }
+ }
+
+ return container;
+ }
+
+ /**
+ * Gets the JDBC URL for connecting to the test container.
+ *
+ * @return JDBC URL string
+ */
+ public static String getJdbcUrl() {
+ return getInstance().getJdbcUrl();
+ }
+
+ /**
+ * Gets the username for connecting to the test container.
+ *
+ * @return username string
+ */
+ public static String getUsername() {
+ return getInstance().getUsername();
+ }
+
+ /**
+ * Gets the password for connecting to the test container.
+ *
+ * @return password string
+ */
+ public static String getPassword() {
+ return getInstance().getPassword();
+ }
+
+ /**
+ * Gets the database name for connecting to the test container.
+ *
+ * @return database name string
+ */
+ public static String getDatabaseName() {
+ return getInstance().getDatabaseName();
+ }
+
+ /**
+ * Checks if DB2 tests are enabled via system property.
+ *
+ * @return true if DB2 tests should run
+ */
+ public static boolean isEnabled() {
+ return Boolean.parseBoolean(System.getProperty("enableDb2Tests", "false"));
+ }
+}
From 41635c7c1d37927ed2450945fad9465b07c655f3 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 4 Dec 2025 14:59:37 +0000
Subject: [PATCH 03/49] Fix DB2 test issues identified in code review
- Created Db2ConnectionWithRecordCountsProvider for tests with record count parameters
- Updated Db2ReadMultipleBlocksOfDataIntegrationTest to use correct provider
- Fixed import grouping in Db2PreparedStatementExtensiveTests
- All 100 test source files now compile successfully
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../Db2PreparedStatementExtensiveTests.java | 1 +
...adMultipleBlocksOfDataIntegrationTest.java | 3 +-
...Db2ConnectionWithRecordCountsProvider.java | 40 +++++++++++++++++++
3 files changed, 43 insertions(+), 1 deletion(-)
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2PreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2PreparedStatementExtensiveTests.java
index 577c35226..bd41d0664 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2PreparedStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2PreparedStatementExtensiveTests.java
@@ -5,6 +5,7 @@
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
+
import openjproxy.jdbc.testutil.Db2ConnectionProvider;
import java.math.BigDecimal;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java
index 53438edeb..748d665c2 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java
@@ -13,6 +13,7 @@
import java.sql.SQLException;
import openjproxy.jdbc.testutil.Db2ConnectionProvider;
+import openjproxy.jdbc.testutil.Db2ConnectionWithRecordCountsProvider;
import static openjproxy.helpers.SqlHelper.executeUpdate;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
@@ -32,7 +33,7 @@ public static void checkTestConfiguration() {
}
@ParameterizedTest
- @ArgumentsSource(Db2ConnectionProvider.class)
+ @ArgumentsSource(Db2ConnectionWithRecordCountsProvider.class)
public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping DB2 tests");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java
new file mode 100644
index 000000000..93ed6bf9e
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java
@@ -0,0 +1,40 @@
+package openjproxy.jdbc.testutil;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+import java.util.stream.Stream;
+
+/**
+ * Provides DB2 connection parameters with record counts for parameterized tests.
+ * This provider returns connection details from the DB2 TestContainer when DB2 tests are enabled,
+ * along with various record counts for testing pagination and large result sets.
+ * When DB2 tests are disabled, it returns an empty stream to skip test execution.
+ */
+public class Db2ConnectionWithRecordCountsProvider implements ArgumentsProvider {
+
+ // Record counts to test various scenarios
+ private static final int[] RECORD_COUNTS = {1, 99, 100, 101, 1000, 10000};
+
+ @Override
+ public Stream extends Arguments> provideArguments(ExtensionContext context) {
+ // Return empty stream if DB2 tests are disabled - prevents test execution
+ if (!Db2TestContainer.isEnabled()) {
+ return Stream.empty();
+ }
+
+ // Get connection parameters from the DB2 TestContainer
+ String driverClass = "org.openjproxy.jdbc.Driver";
+ String jdbcUrl = Db2TestContainer.getJdbcUrl();
+ String username = Db2TestContainer.getUsername();
+ String password = Db2TestContainer.getPassword();
+
+ // Wrap the DB2 container URL with OJP driver URL
+ String ojpUrl = "jdbc:ojp[localhost:1059]_db2://" + jdbcUrl.substring("jdbc:db2://".length());
+
+ // Return arguments for each record count
+ return Stream.of(RECORD_COUNTS)
+ .map(count -> Arguments.of(count, driverClass, ojpUrl, username, password));
+ }
+}
From 97cb01a9add4848d623b9bee56f681c3874e7b64 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 4 Dec 2025 15:02:28 +0000
Subject: [PATCH 04/49] Improve DB2 connection providers to follow SQL Server
pattern
- Updated Db2ConnectionProvider with more robust URL construction
- Updated Db2ConnectionWithRecordCountsProvider with same improvements
- Added support for ojp.proxy.host and ojp.proxy.port system properties
- Improved JDBC URL prefix handling for better safety
- Ensured getInstance() is called to initialize container before use
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../jdbc/testutil/Db2ConnectionProvider.java | 25 ++++++++++++++++---
...Db2ConnectionWithRecordCountsProvider.java | 25 ++++++++++++++++---
2 files changed, 44 insertions(+), 6 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionProvider.java
index fcd55a39d..0015275a0 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionProvider.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionProvider.java
@@ -13,6 +13,14 @@
*/
public class Db2ConnectionProvider implements ArgumentsProvider {
+ // JDBC URL prefix to be removed when building OJP URL
+ private static final String JDBC_PREFIX = "jdbc:";
+
+ // OJP proxy server configuration - can be overridden via system property
+ private static final String OJP_PROXY_HOST = System.getProperty("ojp.proxy.host", "localhost");
+ private static final String OJP_PROXY_PORT = System.getProperty("ojp.proxy.port", "1059");
+ private static final String OJP_PROXY_ADDRESS = OJP_PROXY_HOST + ":" + OJP_PROXY_PORT;
+
@Override
public Stream extends Arguments> provideArguments(ExtensionContext context) {
// Return empty stream if DB2 tests are disabled - prevents test execution
@@ -20,14 +28,25 @@ public Stream extends Arguments> provideArguments(ExtensionContext context) {
return Stream.empty();
}
+ // Initialize and start the TestContainer
+ Db2TestContainer.getInstance();
+
// Get connection parameters from the DB2 TestContainer
String driverClass = "org.openjproxy.jdbc.Driver";
- String jdbcUrl = Db2TestContainer.getJdbcUrl();
+ String containerJdbcUrl = Db2TestContainer.getJdbcUrl();
String username = Db2TestContainer.getUsername();
String password = Db2TestContainer.getPassword();
- // Wrap the DB2 container URL with OJP driver URL
- String ojpUrl = "jdbc:ojp[localhost:1059]_db2://" + jdbcUrl.substring("jdbc:db2://".length());
+ // Build OJP JDBC URL from the container URL
+ // TestContainer URL format: jdbc:db2://localhost:RANDOM_PORT/test
+ // We need to extract the connection string and wrap it with OJP format
+ // OJP format: jdbc:ojp[localhost:1059]_db2://...
+
+ // Remove "jdbc:" prefix and add OJP wrapper
+ String urlWithoutPrefix = containerJdbcUrl.startsWith(JDBC_PREFIX)
+ ? containerJdbcUrl.substring(JDBC_PREFIX.length())
+ : containerJdbcUrl;
+ String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
return Stream.of(
Arguments.of(driverClass, ojpUrl, username, password)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java
index 93ed6bf9e..d48e03aac 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java
@@ -14,6 +14,14 @@
*/
public class Db2ConnectionWithRecordCountsProvider implements ArgumentsProvider {
+ // JDBC URL prefix to be removed when building OJP URL
+ private static final String JDBC_PREFIX = "jdbc:";
+
+ // OJP proxy server configuration - can be overridden via system property
+ private static final String OJP_PROXY_HOST = System.getProperty("ojp.proxy.host", "localhost");
+ private static final String OJP_PROXY_PORT = System.getProperty("ojp.proxy.port", "1059");
+ private static final String OJP_PROXY_ADDRESS = OJP_PROXY_HOST + ":" + OJP_PROXY_PORT;
+
// Record counts to test various scenarios
private static final int[] RECORD_COUNTS = {1, 99, 100, 101, 1000, 10000};
@@ -24,14 +32,25 @@ public Stream extends Arguments> provideArguments(ExtensionContext context) {
return Stream.empty();
}
+ // Initialize and start the TestContainer
+ Db2TestContainer.getInstance();
+
// Get connection parameters from the DB2 TestContainer
String driverClass = "org.openjproxy.jdbc.Driver";
- String jdbcUrl = Db2TestContainer.getJdbcUrl();
+ String containerJdbcUrl = Db2TestContainer.getJdbcUrl();
String username = Db2TestContainer.getUsername();
String password = Db2TestContainer.getPassword();
- // Wrap the DB2 container URL with OJP driver URL
- String ojpUrl = "jdbc:ojp[localhost:1059]_db2://" + jdbcUrl.substring("jdbc:db2://".length());
+ // Build OJP JDBC URL from the container URL
+ // TestContainer URL format: jdbc:db2://localhost:RANDOM_PORT/test
+ // We need to extract the connection string and wrap it with OJP format
+ // OJP format: jdbc:ojp[localhost:1059]_db2://...
+
+ // Remove "jdbc:" prefix and add OJP wrapper
+ String urlWithoutPrefix = containerJdbcUrl.startsWith(JDBC_PREFIX)
+ ? containerJdbcUrl.substring(JDBC_PREFIX.length())
+ : containerJdbcUrl;
+ String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
// Return arguments for each record count
return Stream.of(RECORD_COUNTS)
From 2fecf8ce48b7ab37ad2b46fbe9b1294b6e4735a7 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 4 Dec 2025 15:04:26 +0000
Subject: [PATCH 05/49] Clean up unused imports and fix thread safety in
Db2TestContainer
- Removed unused CsvFileSource imports from all DB2 test classes
- Made shutdownHookRegistered volatile for thread safety
- Added double-checked locking for shutdown hook registration
- Enhanced JavaDoc to document singleton pattern and thread safety
- All code review issues resolved
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../jdbc/Db2BinaryStreamIntegrationTest.java | 1 -
.../Db2DatabaseMetaDataExtensiveTests.java | 1 -
.../jdbc/Db2MultipleTypesIntegrationTest.java | 1 -
...adMultipleBlocksOfDataIntegrationTest.java | 1 -
.../Db2ResultSetMetaDataExtensiveTests.java | 1 -
.../openjproxy/jdbc/Db2ResultSetTest.java | 1 -
.../openjproxy/jdbc/Db2SavepointTests.java | 1 -
.../jdbc/Db2StatementExtensiveTests.java | 1 -
.../jdbc/testutil/Db2TestContainer.java | 27 ++++++++++++-------
9 files changed, 17 insertions(+), 18 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BinaryStreamIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BinaryStreamIntegrationTest.java
index f6b1b2bf8..aa613adcc 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BinaryStreamIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2BinaryStreamIntegrationTest.java
@@ -4,7 +4,6 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.io.ByteArrayInputStream;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2DatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2DatabaseMetaDataExtensiveTests.java
index 6d7d53286..a93870759 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2DatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2DatabaseMetaDataExtensiveTests.java
@@ -5,7 +5,6 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2MultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2MultipleTypesIntegrationTest.java
index db2bfc9cd..c69dfe8fa 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2MultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2MultipleTypesIntegrationTest.java
@@ -6,7 +6,6 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.io.UnsupportedEncodingException;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java
index 748d665c2..582320e9c 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ReadMultipleBlocksOfDataIntegrationTest.java
@@ -4,7 +4,6 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetMetaDataExtensiveTests.java
index ebbbbd89c..33c0ccaf8 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetMetaDataExtensiveTests.java
@@ -5,7 +5,6 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.nio.charset.StandardCharsets;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetTest.java
index 8a239817f..d1755e218 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2ResultSetTest.java
@@ -5,7 +5,6 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2SavepointTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2SavepointTests.java
index 9be181c77..20fd48c1e 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2SavepointTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2SavepointTests.java
@@ -5,7 +5,6 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2StatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2StatementExtensiveTests.java
index e8fd5a46f..194b165ee 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2StatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/Db2StatementExtensiveTests.java
@@ -7,7 +7,6 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2TestContainer.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2TestContainer.java
index 2dbdd7b0a..b2ffc6eaf 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2TestContainer.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2TestContainer.java
@@ -6,6 +6,9 @@
* Singleton DB2 test container for all DB2 integration tests.
* This ensures that all tests share the same DB2 instance to improve test performance
* and reduce resource usage.
+ *
+ * Thread-safe singleton implementation using synchronized methods to ensure
+ * only one container instance is created across multiple test threads.
*/
public class Db2TestContainer {
@@ -14,7 +17,7 @@ public class Db2TestContainer {
private static Db2Container container;
private static boolean isStarted = false;
- private static boolean shutdownHookRegistered = false;
+ private static volatile boolean shutdownHookRegistered = false;
/**
* Gets or creates the shared DB2 test container instance.
@@ -31,15 +34,19 @@ public static synchronized Db2Container getInstance() {
if (!isStarted) {
container.start();
isStarted = true;
-
- // Add shutdown hook to stop container when JVM exits
- if (!shutdownHookRegistered) {
- Runtime.getRuntime().addShutdownHook(new Thread(() -> {
- if (container != null && container.isRunning()) {
- container.stop();
- }
- }));
- shutdownHookRegistered = true;
+ }
+
+ // Add shutdown hook to stop container when JVM exits (thread-safe check)
+ if (!shutdownHookRegistered) {
+ synchronized (Db2TestContainer.class) {
+ if (!shutdownHookRegistered) {
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ if (container != null && container.isRunning()) {
+ container.stop();
+ }
+ }));
+ shutdownHookRegistered = true;
+ }
}
}
From cc1f76a79da1f6785e894783199a711a2924b00d Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 4 Dec 2025 20:23:48 +0000
Subject: [PATCH 06/49] Initial plan
From 8b9b27b54dc422ecdd451c3f4caaf44883db587f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 4 Dec 2025 20:30:43 +0000
Subject: [PATCH 07/49] Migrate Oracle tests to use TestContainers
- Add oracle-xe TestContainers dependency to pom.xml
- Create OracleTestContainer singleton class with XA permissions
- Create OracleConnectionProvider for parameterized tests
- Update all Oracle test files to use ArgumentsProvider
- Update oracle-testing.yml to remove services section
- Tests now use TestContainers for Oracle database lifecycle
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.github/workflows/oracle-testing.yml | 86 +++--------
ojp-jdbc-driver/pom.xml | 9 ++
.../OracleBinaryStreamIntegrationTest.java | 10 +-
.../jdbc/OracleBlobIntegrationTest.java | 15 +-
.../jdbc/OracleConnectionExtensiveTests.java | 10 +-
.../OracleDatabaseMetaDataExtensiveTests.java | 6 +-
.../OracleMultipleTypesIntegrationTest.java | 10 +-
...OraclePreparedStatementExtensiveTests.java | 26 ++--
...adMultipleBlocksOfDataIntegrationTest.java | 10 +-
...OracleResultSetMetaDataExtensiveTests.java | 6 +-
.../openjproxy/jdbc/OracleResultSetTest.java | 24 ++--
.../openjproxy/jdbc/OracleSavepointTests.java | 16 ++-
.../jdbc/OracleStatementExtensiveTests.java | 68 ++++-----
.../jdbc/OracleXAIntegrationTest.java | 15 +-
.../testutil/OracleConnectionProvider.java | 56 ++++++++
.../jdbc/testutil/OracleTestContainer.java | 134 ++++++++++++++++++
16 files changed, 336 insertions(+), 165 deletions(-)
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionProvider.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java
diff --git a/.github/workflows/oracle-testing.yml b/.github/workflows/oracle-testing.yml
index 3eabf0d93..5943d4cfe 100644
--- a/.github/workflows/oracle-testing.yml
+++ b/.github/workflows/oracle-testing.yml
@@ -1,17 +1,18 @@
-# This workflow runs Oracle Database tests autonomously without requiring Oracle JDBC drivers in the repository.
-# It dynamically adds the Oracle JDBC driver during CI execution and runs Oracle-specific tests.
-name: Oracle Database Testing
+# This workflow runs only Oracle integration tests using TestContainers.
+# It disables all other database integration tests to focus on Oracle testing.
+# TestContainers automatically manages the Oracle container lifecycle.
+name: Oracle Integration Tests
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
- workflow_dispatch: # Allows manual triggering
+ workflow_dispatch: # Allow manual triggering
jobs:
- oracle-test:
- name: Oracle Tests (JDK ${{ matrix.java-version }})
+ oracle-tests:
+ name: Oracle Integration Tests
runs-on: ubuntu-latest
permissions:
@@ -22,74 +23,12 @@ jobs:
matrix:
java-version: [ 11, 17, 21, 22 ]
- services:
- oracle:
- image: gvenzl/oracle-xe:21-full
- env:
- ORACLE_PASSWORD: testpassword
- APP_USER: testuser
- APP_USER_PASSWORD: testpassword
- options: >-
- --name ojp-oracle
- --health-cmd "echo 'SELECT 1 FROM DUAL;' | sqlplus -s system/testpassword@localhost/XEPDB1"
- --health-interval 20s
- --health-timeout 10s
- --health-retries 10
- ports:
- - 1521:1521
-
steps:
-
- name: Git checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- - name: Grant XA permissions to Oracle test user
- run: |
- # Wait a bit for Oracle to be fully ready
- sleep 5
-
- # Grant XA permissions to testuser
- echo "=== Granting XA permissions to testuser ==="
-
- docker exec ojp-oracle sqlplus -s system/testpassword@localhost/XEPDB1 <<'EOF'
- SET ECHO ON
- SET FEEDBACK ON
- SET SERVEROUTPUT ON
- WHENEVER SQLERROR EXIT SQL.SQLCODE
-
- -- Grant XA_RECOVER_ADMIN role (Oracle 12c+) for XA transaction recovery
- -- This role includes necessary privileges for XA operations
- GRANT XA_RECOVER_ADMIN TO testuser;
-
- -- XA transaction permissions (additional grants for completeness)
- GRANT SELECT ON sys.dba_pending_transactions TO testuser;
- GRANT SELECT ON sys.pending_trans$ TO testuser;
- GRANT SELECT ON sys.dba_2pc_pending TO testuser;
- GRANT SELECT ON sys.dba_2pc_neighbors TO testuser;
- GRANT EXECUTE ON sys.dbms_xa TO testuser;
- GRANT EXECUTE ON sys.dbms_system TO testuser;
- GRANT FORCE ANY TRANSACTION TO testuser;
-
- -- Verify grants
- SELECT 'XA permissions granted successfully' AS status FROM dual;
-
- -- Show granted privileges and roles
- SELECT granted_role, grantee FROM dba_role_privs WHERE grantee = 'TESTUSER' ORDER BY granted_role;
- SELECT privilege, grantee FROM dba_sys_privs WHERE grantee = 'TESTUSER' ORDER BY privilege;
- SELECT owner, table_name, privilege, grantee FROM dba_tab_privs WHERE grantee = 'TESTUSER' ORDER BY owner, table_name;
-
- EXIT;
- EOF
-
- if [ $? -ne 0 ]; then
- echo "ERROR: Failed to grant XA permissions!"
- exit 1
- fi
-
- echo "=== XA permissions granted successfully ==="
-
- name: Add Oracle JDBC Driver to ojp-server
run: |
# Create temporary file with Oracle JDBC dependency
@@ -143,8 +82,15 @@ jobs:
- name: Build (ojp-jdbc-driver) with JDK ${{ matrix.java-version }}
run: mvn clean install -pl ojp-jdbc-driver -am -DskipTests -Dgpg.skip=true
- - name: Test (ojp-jdbc-driver) with Oracle enabled
- run: mvn test -pl ojp-jdbc-driver -Dgpg.skip=true -DenableOracleTests -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests -DdisableCockroachDBTests
+ - name: Run Oracle Integration Tests
+ run: |
+ mvn test -pl ojp-jdbc-driver -Dgpg.skip=true \
+ -DenableOracleTests=true \
+ -DdisablePostgresTests=true \
+ -DdisableMySQLTests=true \
+ -DdisableMariaDBTests=true \
+ -DdisableCockroachDBTests=true \
+ -Dtest="Oracle*"
- name: Show ojp-server.log
if: always() # ensures it runs even if previous steps fail
diff --git a/ojp-jdbc-driver/pom.xml b/ojp-jdbc-driver/pom.xml
index 4578458fb..317b9bad0 100644
--- a/ojp-jdbc-driver/pom.xml
+++ b/ojp-jdbc-driver/pom.xml
@@ -124,6 +124,15 @@
test
+
+
+
+ org.testcontainers
+ oracle-xe
+ 1.20.4
+ test
+
+
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java
index 015968e57..0c3bc6a4a 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java
@@ -3,7 +3,8 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -21,6 +22,7 @@
* Oracle-specific binary stream integration tests.
* Tests Oracle-specific binary data types (RAW, BLOB) and stream handling.
*/
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OracleBinaryStreamIntegrationTest {
private static boolean isTestDisabled;
@@ -31,7 +33,7 @@ public static void setup() {
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void createAndReadingBinaryStreamSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
assumeFalse(isTestDisabled, "Skipping Oracle tests");
@@ -92,7 +94,7 @@ public void createAndReadingBinaryStreamSuccessful(String driverClass, String ur
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void createAndReadingLargeBinaryStreamSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
assumeFalse(isTestDisabled, "Skipping Oracle tests");
@@ -142,7 +144,7 @@ public void createAndReadingLargeBinaryStreamSuccessful(String driverClass, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleSpecificBinaryHandling(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
assumeFalse(isTestDisabled, "Skipping Oracle tests");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBlobIntegrationTest.java
index f7692773c..f60498a33 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBlobIntegrationTest.java
@@ -2,8 +2,10 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -22,6 +24,7 @@
* Oracle-specific BLOB integration tests.
* Tests Oracle BLOB functionality and performance.
*/
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OracleBlobIntegrationTest {
private static boolean isTestDisabled;
@@ -52,7 +55,7 @@ public void setUp(String driverClass, String url, String user, String pwd) throw
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleBlobCreationAndRetrieval(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
setUp(driverClass, url, user, pwd);
@@ -94,7 +97,7 @@ public void testOracleBlobCreationAndRetrieval(String driverClass, String url, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleLargeBlobHandling(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
setUp(driverClass, url, user, pwd);
@@ -142,7 +145,7 @@ public void testOracleLargeBlobHandling(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleBlobBinaryStream(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
setUp(driverClass, url, user, pwd);
@@ -190,7 +193,7 @@ public void testOracleBlobBinaryStream(String driverClass, String url, String us
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleBlobUpdate(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
setUp(driverClass, url, user, pwd);
@@ -237,7 +240,7 @@ public void testOracleBlobUpdate(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleEmptyAndNullBlob(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
setUp(driverClass, url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java
index a699b7762..f97e9ec99 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java
@@ -4,7 +4,8 @@
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import openjproxy.jdbc.testutil.TestDBUtils;
import java.sql.Connection;
@@ -21,6 +22,7 @@
* These tests verify that OJP can properly handle Oracle-specific SQL syntax and data types.
*/
@Slf4j
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OracleConnectionExtensiveTests {
private static boolean isOracleTestEnabled;
@@ -31,7 +33,7 @@ public static void setup() {
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleBasicConnection(String driverClass, String url, String user, String pwd) throws SQLException {
Assumptions.assumeFalse(!isOracleTestEnabled, "Skipping Oracle tests");
@@ -67,7 +69,7 @@ public void testOracleBasicConnection(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleDataTypes(String driverClass, String url, String user, String pwd) throws SQLException {
Assumptions.assumeFalse(!isOracleTestEnabled, "Skipping Oracle tests");
@@ -104,7 +106,7 @@ public void testOracleDataTypes(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleAutoIncrementSequence(String driverClass, String url, String user, String pwd) throws SQLException {
Assumptions.assumeFalse(!isOracleTestEnabled, "Skipping Oracle tests");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java
index ecfaff7c9..fa99b1b12 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java
@@ -3,12 +3,14 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.*;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OracleDatabaseMetaDataExtensiveTests {
private static boolean isTestDisabled;
@@ -32,7 +34,7 @@ public static void teardown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void allDatabaseMetaDataMethodsShouldWorkAndBeAsserted(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java
index 0f8938c3e..aaad1307b 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java
@@ -4,7 +4,8 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.math.BigDecimal;
import java.sql.Connection;
@@ -19,6 +20,7 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OracleMultipleTypesIntegrationTest {
private static boolean isTestDisabled;
@@ -29,7 +31,7 @@ public static void checkTestConfiguration() {
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void typesCoverageTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, ParseException {
assumeFalse(isTestDisabled, "Oracle tests are disabled");
@@ -136,7 +138,7 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleSpecificTypes(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Oracle tests are disabled");
@@ -191,7 +193,7 @@ public void testOracleSpecificTypes(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleNumberTypes(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Oracle tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java
index 23798c05f..7cde35b2f 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java
@@ -4,7 +4,8 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.io.ByteArrayInputStream;
import java.io.StringReader;
@@ -29,6 +30,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OraclePreparedStatementExtensiveTests {
private static boolean isTestDisabled;
@@ -66,7 +68,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testBasicParameterSetting(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO oracle_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -91,7 +93,7 @@ public void testBasicParameterSetting(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testNullParameterHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO oracle_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -119,7 +121,7 @@ public void testNullParameterHandling(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testNumericParameterTypes(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -147,7 +149,7 @@ public void testNumericParameterTypes(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testDateTimeParameterTypes(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO oracle_prepared_stmt_test (id, name, dt) VALUES (?, ?, ?)");
@@ -172,7 +174,7 @@ public void testDateTimeParameterTypes(String driverClass, String url, String us
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testLargeObjectHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO oracle_prepared_stmt_test (id, name, data, info) VALUES (?, ?, ?, ?)");
@@ -202,7 +204,7 @@ public void testLargeObjectHandling(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testStreamHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO oracle_prepared_stmt_test (id, name, data, info) VALUES (?, ?, ?, ?)");
@@ -222,7 +224,7 @@ public void testStreamHandling(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testParameterMetaData(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO oracle_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -236,7 +238,7 @@ public void testParameterMetaData(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testBatchOperations(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO oracle_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -264,7 +266,7 @@ public void testBatchOperations(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testResultSetHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -294,7 +296,7 @@ public void testResultSetHandling(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleSpecificTypes(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -338,7 +340,7 @@ public void testOracleSpecificTypes(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testErrorHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO oracle_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java
index d3d515350..225feec6a 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java
@@ -3,7 +3,8 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -17,6 +18,7 @@
* Oracle-specific multiple blocks of data integration tests.
* Tests Oracle pagination and large result set handling.
*/
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OracleReadMultipleBlocksOfDataIntegrationTest {
private static boolean isTestDisabled;
@@ -74,7 +76,7 @@ public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driv
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleLargeDataSetPagination(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping Oracle tests");
@@ -139,7 +141,7 @@ public void testOracleLargeDataSetPagination(String driverClass, String url, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleResultSetScrolling(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping Oracle tests");
@@ -202,7 +204,7 @@ public void testOracleResultSetScrolling(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleMultipleDataTypes(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping Oracle tests");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java
index c4669ef74..9dfaaadd6 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java
@@ -4,13 +4,15 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OracleResultSetMetaDataExtensiveTests {
private static boolean isTestDisabled;
@@ -56,7 +58,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testAllResultSetMetaDataMethods(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java
index cc8d59c25..b0ed40fa9 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java
@@ -4,7 +4,8 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -24,6 +25,7 @@
* Oracle-specific ResultSet tests.
* Tests Oracle-specific ResultSet behavior and data type handling.
*/
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OracleResultSetTest {
private Connection connection;
@@ -86,7 +88,7 @@ public void tearDown() throws SQLException {
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleNavigationMethods(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
assertTrue(resultSet.next()); // Row 1
@@ -101,7 +103,7 @@ public void testOracleNavigationMethods(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleDataRetrievalMethods(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
resultSet.next();
@@ -115,7 +117,7 @@ public void testOracleDataRetrievalMethods(String driverClass, String url, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleGetMethodsByColumnIndex(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
resultSet.next();
@@ -128,7 +130,7 @@ public void testOracleGetMethodsByColumnIndex(String driverClass, String url, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleNullHandling(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
statement.execute("INSERT INTO oracle_resultset_test_table (id, name, age, salary, active, created_at) " +
@@ -142,7 +144,7 @@ public void testOracleNullHandling(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleCursorPositionMethods(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
assertTrue(resultSet.first());
@@ -156,7 +158,7 @@ public void testOracleCursorPositionMethods(String driverClass, String url, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleWarnings(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
SQLWarning warning = resultSet.getWarnings();
@@ -165,7 +167,7 @@ public void testOracleWarnings(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleAdvancedNavigation(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
resultSet.absolute(2); // Move to the second row
@@ -179,7 +181,7 @@ public void testOracleAdvancedNavigation(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleSpecificDataTypes(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -220,7 +222,7 @@ public void testOracleSpecificDataTypes(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleResultSetMetadata(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -245,7 +247,7 @@ public void testOracleResultSetMetadata(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleRowCounting(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java
index 3dab4f6c1..ad80fc42c 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java
@@ -4,7 +4,8 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -16,6 +17,7 @@
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OracleSavepointTests {
private static boolean isTestDisabled;
@@ -53,7 +55,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testUnnamedSavepoint(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -72,7 +74,7 @@ public void testUnnamedSavepoint(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testNamedSavepoint(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -93,7 +95,7 @@ public void testNamedSavepoint(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testMultipleSavepoints(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -123,7 +125,7 @@ public void testMultipleSavepoints(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testReleaseSavepoint(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -146,7 +148,7 @@ public void testReleaseSavepoint(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testSavepointAfterCommit(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -169,7 +171,7 @@ public void testSavepointAfterCommit(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testSavepointMetadata(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java
index f848302ec..32144edc0 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java
@@ -5,7 +5,8 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -23,6 +24,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OracleStatementExtensiveTests {
private static boolean isTestDisabled;
@@ -50,7 +52,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testExecuteQuery(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ResultSet rs = statement.executeQuery("SELECT * FROM oracle_statement_test");
@@ -60,7 +62,7 @@ public void testExecuteQuery(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testExecuteUpdate(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int rows = statement.executeUpdate("UPDATE oracle_statement_test SET name = 'Updated Alice' WHERE id = 1");
@@ -73,7 +75,7 @@ public void testExecuteUpdate(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testClose(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
assertFalse(statement.isClosed());
@@ -82,7 +84,7 @@ public void testClose(String driverClass, String url, String user, String passwo
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testMaxFieldSize(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getMaxFieldSize();
@@ -93,7 +95,7 @@ public void testMaxFieldSize(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testExecuteAfterCloseThrows(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.close();
@@ -103,7 +105,7 @@ public void testExecuteAfterCloseThrows(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testMaxRows(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setMaxRows(1);
@@ -115,7 +117,7 @@ public void testMaxRows(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testEscapeProcessing(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Should not throw
@@ -124,7 +126,7 @@ public void testEscapeProcessing(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testQueryTimeout(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setQueryTimeout(5);
@@ -132,7 +134,7 @@ public void testQueryTimeout(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testCancel(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Should not throw
@@ -140,7 +142,7 @@ public void testCancel(String driverClass, String url, String user, String passw
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testWarnings(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.clearWarnings();
@@ -148,7 +150,7 @@ public void testWarnings(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testSetCursorName(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Some Oracle versions supports named cursors; the one used for tests does not.
@@ -156,7 +158,7 @@ public void testSetCursorName(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testExecute(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
boolean isResultSet = statement.execute("SELECT * FROM oracle_statement_test");
@@ -172,7 +174,7 @@ public void testExecute(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testGetMoreResults(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.execute("SELECT * FROM oracle_statement_test");
@@ -181,7 +183,7 @@ public void testGetMoreResults(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testFetchDirection(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getFetchDirection();
@@ -191,7 +193,7 @@ public void testFetchDirection(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testFetchSize(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getFetchSize();
@@ -201,7 +203,7 @@ public void testFetchSize(String driverClass, String url, String user, String pa
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testResultSetConcurrencyAndType(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int concurrency = statement.getResultSetConcurrency();
@@ -211,7 +213,7 @@ public void testResultSetConcurrencyAndType(String driverClass, String url, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testBatchExecution(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.addBatch("INSERT INTO oracle_statement_test (id, name) VALUES (3, 'Charlie')");
@@ -226,7 +228,7 @@ public void testBatchExecution(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testClearBatch(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.addBatch("INSERT INTO oracle_statement_test (id, name) VALUES (5, 'Eve')");
@@ -236,14 +238,14 @@ public void testClearBatch(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testGetConnection(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
assertSame(connection, statement.getConnection());
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testGetMoreResultsWithCurrent(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.execute("SELECT * FROM oracle_statement_test");
@@ -251,7 +253,7 @@ public void testGetMoreResultsWithCurrent(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testGeneratedKeys(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
TestDBUtils.createAutoIncrementTestTable(connection, "test_auto_keys", TestDBUtils.SqlSyntax.ORACLE);
@@ -266,7 +268,7 @@ public void testGeneratedKeys(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testExecuteUpdateVariants(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -286,7 +288,7 @@ public void testExecuteUpdateVariants(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testExecuteVariants(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
TestDBUtils.createAutoIncrementTestTable(connection, "test_exec", TestDBUtils.SqlSyntax.ORACLE);
@@ -305,7 +307,7 @@ public void testExecuteVariants(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testGetResultSetHoldability(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int holdability = statement.getResultSetHoldability();
@@ -313,7 +315,7 @@ public void testGetResultSetHoldability(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testPoolable(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setPoolable(true);
@@ -326,7 +328,7 @@ public void testPoolable(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testCloseOnCompletion(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.closeOnCompletion();
@@ -334,7 +336,7 @@ public void testCloseOnCompletion(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testLargeMethodsDefault(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.getFetchDirection();
@@ -353,7 +355,7 @@ public void testLargeMethodsDefault(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testEnquoteLiteral(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
String quoted = statement.enquoteLiteral("foo'bar");
@@ -361,7 +363,7 @@ public void testEnquoteLiteral(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testEnquoteIdentifier(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Oracle quotes identifiers to preserve case sensitivity
@@ -372,7 +374,7 @@ public void testEnquoteIdentifier(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testIsSimpleIdentifier(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Oracle has specific rules for simple identifiers
@@ -386,7 +388,7 @@ public void testIsSimpleIdentifier(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testEnquoteNCharLiteral(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
String quoted = statement.enquoteNCharLiteral("foo'bar");
@@ -394,7 +396,7 @@ public void testEnquoteNCharLiteral(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testOracleSpecificFeatures(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleXAIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleXAIntegrationTest.java
index a6984e0ba..69d4a454f 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleXAIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleXAIntegrationTest.java
@@ -1,11 +1,13 @@
package openjproxy.jdbc;
import lombok.extern.slf4j.Slf4j;
+import openjproxy.jdbc.testutil.OracleConnectionProvider;
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import org.openjproxy.jdbc.xa.OjpXADataSource;
import javax.sql.XAConnection;
@@ -28,6 +30,7 @@
* 3. The client-side code updated to use integrated StatementService
*/
@Slf4j
+@EnabledIf("openjproxy.jdbc.testutil.OracleTestContainer#isEnabled")
public class OracleXAIntegrationTest {
private static boolean isTestDisabled;
@@ -70,7 +73,7 @@ public void tearDown() {
* Test basic XA connection creation and closure.
*/
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_xa_connection.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testXAConnectionBasics(String driverClass, String url, String user, String password) throws Exception {
setUp(driverClass, url, user, password);
@@ -92,7 +95,7 @@ public void testXAConnectionBasics(String driverClass, String url, String user,
* This tests: xaStart -> executeUpdate -> xaEnd -> xaPrepare -> xaCommit
*/
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_xa_connection.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testXATransactionWithCRUD(String driverClass, String url, String user, String password)
throws Exception {
setUp(driverClass, url, user, password);
@@ -172,7 +175,7 @@ public void testXATransactionWithCRUD(String driverClass, String url, String use
* Test XA transaction rollback.
*/
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_xa_connection.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testXATransactionRollback(String driverClass, String url, String user, String password)
throws Exception {
setUp(driverClass, url, user, password);
@@ -235,7 +238,7 @@ public void testXATransactionRollback(String driverClass, String url, String use
* Test transaction timeout functionality.
*/
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_xa_connection.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testXATransactionTimeout(String driverClass, String url, String user, String password)
throws Exception {
setUp(driverClass, url, user, password);
@@ -251,7 +254,7 @@ public void testXATransactionTimeout(String driverClass, String url, String user
* Test one-phase commit optimization.
*/
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_xa_connection.csv")
+ @ArgumentsSource(OracleConnectionProvider.class)
public void testXAOnePhaseCommit(String driverClass, String url, String user, String password) throws Exception {
setUp(driverClass, url, user, password);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionProvider.java
new file mode 100644
index 000000000..0b52cc2ee
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionProvider.java
@@ -0,0 +1,56 @@
+package openjproxy.jdbc.testutil;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+import java.util.stream.Stream;
+
+/**
+ * Custom ArgumentsProvider for Oracle integration tests.
+ * Provides connection details from TestContainers when Oracle tests are enabled.
+ * This allows tests to use TestContainers instead of external Oracle instances.
+ */
+public class OracleConnectionProvider implements ArgumentsProvider {
+
+ // JDBC URL prefix to be removed when building OJP URL
+ private static final String JDBC_PREFIX = "jdbc:";
+
+ // OJP proxy server configuration - can be overridden via system property
+ private static final String OJP_PROXY_HOST = System.getProperty("ojp.proxy.host", "localhost");
+ private static final String OJP_PROXY_PORT = System.getProperty("ojp.proxy.port", "1059");
+ private static final String OJP_PROXY_ADDRESS = OJP_PROXY_HOST + ":" + OJP_PROXY_PORT;
+
+ @Override
+ public Stream extends Arguments> provideArguments(ExtensionContext context) {
+ if (!OracleTestContainer.isEnabled()) {
+ // Return empty stream when tests are disabled
+ return Stream.empty();
+ }
+
+ // Initialize and start the TestContainer
+ OracleTestContainer.getInstance();
+
+ // Get connection details from the TestContainer
+ String containerJdbcUrl = OracleTestContainer.getJdbcUrl();
+ String username = OracleTestContainer.getUsername();
+ String password = OracleTestContainer.getPassword();
+
+ // Build OJP JDBC URL from the container URL
+ // TestContainer URL format: jdbc:oracle:thin:@localhost:RANDOM_PORT/XEPDB1
+ // We need to extract the connection string and wrap it with OJP format
+ // OJP format: jdbc:ojp[localhost:1059]_oracle:thin:@...
+ String driverClass = "org.openjproxy.jdbc.Driver";
+
+ // Remove "jdbc:" prefix and add OJP wrapper
+ String urlWithoutPrefix = containerJdbcUrl.startsWith(JDBC_PREFIX)
+ ? containerJdbcUrl.substring(JDBC_PREFIX.length())
+ : containerJdbcUrl;
+ String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
+
+ // Return a single set of arguments with the TestContainer connection details
+ return Stream.of(
+ Arguments.of(driverClass, ojpUrl, username, password)
+ );
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java
new file mode 100644
index 000000000..316b2d809
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java
@@ -0,0 +1,134 @@
+package openjproxy.jdbc.testutil;
+
+import org.testcontainers.containers.OracleContainer;
+import org.testcontainers.utility.DockerImageName;
+
+/**
+ * Singleton Oracle test container for all Oracle integration tests.
+ * This ensures that all tests share the same Oracle instance to improve test performance
+ * and reduce resource usage.
+ */
+public class OracleTestContainer {
+
+ // Oracle Docker image version (using gvenzl/oracle-xe for compatibility)
+ private static final String ORACLE_IMAGE = "gvenzl/oracle-xe:21-full";
+ private static final String TEST_PASSWORD = "testpassword";
+ private static final String TEST_USERNAME = "testuser";
+
+ private static OracleContainer container;
+ private static boolean isStarted = false;
+ private static boolean shutdownHookRegistered = false;
+
+ /**
+ * Gets or creates the shared Oracle test container instance.
+ * The container is automatically started on first access.
+ *
+ * @return the shared OracleContainer instance
+ */
+ public static synchronized OracleContainer getInstance() {
+ if (container == null) {
+ container = new OracleContainer(DockerImageName.parse(ORACLE_IMAGE))
+ .withDatabaseName("XEPDB1")
+ .withUsername(TEST_USERNAME)
+ .withPassword(TEST_PASSWORD);
+ }
+
+ if (!isStarted) {
+ container.start();
+ isStarted = true;
+
+ // Grant XA permissions to the test user
+ try {
+ grantXAPermissions();
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to grant XA permissions to Oracle test user", e);
+ }
+
+ // Add shutdown hook to stop container when JVM exits
+ if (!shutdownHookRegistered) {
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ if (container != null && container.isRunning()) {
+ container.stop();
+ }
+ }));
+ shutdownHookRegistered = true;
+ }
+ }
+
+ return container;
+ }
+
+ /**
+ * Grants XA permissions to the test user.
+ * This is required for XA transaction tests.
+ */
+ private static void grantXAPermissions() throws Exception {
+ // Execute SQL commands to grant XA permissions
+ String sqlCommands =
+ "GRANT XA_RECOVER_ADMIN TO " + TEST_USERNAME + ";\n" +
+ "GRANT SELECT ON sys.dba_pending_transactions TO " + TEST_USERNAME + ";\n" +
+ "GRANT SELECT ON sys.pending_trans$ TO " + TEST_USERNAME + ";\n" +
+ "GRANT SELECT ON sys.dba_2pc_pending TO " + TEST_USERNAME + ";\n" +
+ "GRANT SELECT ON sys.dba_2pc_neighbors TO " + TEST_USERNAME + ";\n" +
+ "GRANT EXECUTE ON sys.dbms_xa TO " + TEST_USERNAME + ";\n" +
+ "GRANT EXECUTE ON sys.dbms_system TO " + TEST_USERNAME + ";\n" +
+ "GRANT FORCE ANY TRANSACTION TO " + TEST_USERNAME + ";";
+
+ // Execute the grants using container.execInContainer
+ org.testcontainers.containers.Container.ExecResult result = container.execInContainer(
+ "sqlplus", "-s", "system/" + TEST_PASSWORD + "@" + container.getDatabaseName(),
+ "/bin/bash", "-c", "echo \"" + sqlCommands + "\" | sqlplus -s system/" + TEST_PASSWORD + "@" + container.getDatabaseName()
+ );
+
+ if (result.getExitCode() != 0) {
+ System.err.println("Failed to grant XA permissions. Output: " + result.getStdout());
+ System.err.println("Error: " + result.getStderr());
+ // Don't throw exception - XA tests may fail but other tests can still run
+ }
+ }
+
+ /**
+ * Gets the JDBC URL for connecting to the test container.
+ *
+ * @return JDBC URL string
+ */
+ public static String getJdbcUrl() {
+ return getInstance().getJdbcUrl();
+ }
+
+ /**
+ * Gets the username for connecting to the test container.
+ *
+ * @return username string
+ */
+ public static String getUsername() {
+ return getInstance().getUsername();
+ }
+
+ /**
+ * Gets the password for connecting to the test container.
+ *
+ * @return password string
+ */
+ public static String getPassword() {
+ return getInstance().getPassword();
+ }
+
+ /**
+ * Gets the database name (service name) for the test container.
+ *
+ * @return database name string
+ */
+ public static String getDatabaseName() {
+ return getInstance().getDatabaseName();
+ }
+
+ /**
+ * Checks if Oracle tests are enabled via system property.
+ *
+ * @return true if Oracle tests should run
+ */
+ public static boolean isEnabled() {
+ return Boolean.parseBoolean(System.getProperty("enableOracleTests", "false"));
+ }
+}
From 80dc2a9f11ab9c874063e3af2fc134b6afb8981a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 4 Dec 2025 20:34:49 +0000
Subject: [PATCH 08/49] Fix compilation errors and complete Oracle
TestContainers migration
- Add missing EnabledIf imports to all Oracle test files
- Create OracleConnectionWithRecordCountsProvider for special tests
- Update OracleReadMultipleBlocksOfDataIntegrationTest
- Remove oracle_connections.csv and oracle_xa_connection.csv files
- Build successful with no compilation errors
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../OracleBinaryStreamIntegrationTest.java | 3 ++
.../jdbc/OracleConnectionExtensiveTests.java | 4 ++
.../OracleDatabaseMetaDataExtensiveTests.java | 3 ++
.../OracleMultipleTypesIntegrationTest.java | 3 ++
...OraclePreparedStatementExtensiveTests.java | 4 ++
...adMultipleBlocksOfDataIntegrationTest.java | 4 +-
...OracleResultSetMetaDataExtensiveTests.java | 4 ++
.../openjproxy/jdbc/OracleResultSetTest.java | 4 ++
.../openjproxy/jdbc/OracleSavepointTests.java | 4 ++
.../jdbc/OracleStatementExtensiveTests.java | 4 ++
...cleConnectionWithRecordCountsProvider.java | 54 +++++++++++++++++++
.../src/test/resources/oracle_connections.csv | 1 -
.../test/resources/oracle_xa_connection.csv | 2 -
13 files changed, 90 insertions(+), 4 deletions(-)
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionWithRecordCountsProvider.java
delete mode 100644 ojp-jdbc-driver/src/test/resources/oracle_connections.csv
delete mode 100644 ojp-jdbc-driver/src/test/resources/oracle_xa_connection.csv
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java
index 0c3bc6a4a..0dca3c6a7 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java
@@ -2,8 +2,11 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
+import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.io.ByteArrayInputStream;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java
index f97e9ec99..352f2397c 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java
@@ -2,9 +2,13 @@
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Assumptions;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
+import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import openjproxy.jdbc.testutil.TestDBUtils;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java
index fa99b1b12..147d91da8 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java
@@ -2,8 +2,11 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
+import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.*;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java
index aaad1307b..4bf79d94b 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java
@@ -3,8 +3,11 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
+import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.math.BigDecimal;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java
index 7cde35b2f..66c685208 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java
@@ -2,9 +2,13 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
+import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.io.ByteArrayInputStream;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java
index 225feec6a..6e347405f 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java
@@ -2,9 +2,11 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
+import openjproxy.jdbc.testutil.OracleConnectionWithRecordCountsProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -29,7 +31,7 @@ public static void checkTestConfiguration() {
}
@ParameterizedTest
- @CsvFileSource(resources = "/oracle_connections_with_record_counts.csv")
+ @ArgumentsSource(OracleConnectionWithRecordCountsProvider.class)
public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping Oracle tests");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java
index 9dfaaadd6..2856ee602 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java
@@ -2,9 +2,13 @@
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
+import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.*;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java
index b0ed40fa9..1b9d29d07 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java
@@ -2,9 +2,13 @@
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
+import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.Connection;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java
index ad80fc42c..7fe08042d 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java
@@ -2,9 +2,13 @@
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
+import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.Connection;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java
index 32144edc0..bec3dae42 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java
@@ -3,9 +3,13 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.Assert;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
+import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.Connection;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionWithRecordCountsProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionWithRecordCountsProvider.java
new file mode 100644
index 000000000..ae1c77b84
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionWithRecordCountsProvider.java
@@ -0,0 +1,54 @@
+package openjproxy.jdbc.testutil;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+import java.util.stream.Stream;
+
+/**
+ * Custom ArgumentsProvider for Oracle integration tests that include record counts.
+ * Provides connection details from TestContainers along with various record counts for testing.
+ */
+public class OracleConnectionWithRecordCountsProvider implements ArgumentsProvider {
+
+ // JDBC URL prefix to be removed when building OJP URL
+ private static final String JDBC_PREFIX = "jdbc:";
+
+ // OJP proxy server configuration - can be overridden via system property
+ private static final String OJP_PROXY_HOST = System.getProperty("ojp.proxy.host", "localhost");
+ private static final String OJP_PROXY_PORT = System.getProperty("ojp.proxy.port", "1059");
+ private static final String OJP_PROXY_ADDRESS = OJP_PROXY_HOST + ":" + OJP_PROXY_PORT;
+
+ // Test record counts to iterate through
+ private static final int[] RECORD_COUNTS = {1, 99, 100, 101, 1000, 10000};
+
+ @Override
+ public Stream extends Arguments> provideArguments(ExtensionContext context) {
+ if (!OracleTestContainer.isEnabled()) {
+ // Return empty stream when tests are disabled
+ return Stream.empty();
+ }
+
+ // Initialize and start the TestContainer
+ OracleTestContainer.getInstance();
+
+ // Get connection details from the TestContainer
+ String containerJdbcUrl = OracleTestContainer.getJdbcUrl();
+ String username = OracleTestContainer.getUsername();
+ String password = OracleTestContainer.getPassword();
+
+ // Build OJP JDBC URL from the container URL
+ String driverClass = "org.openjproxy.jdbc.Driver";
+
+ // Remove "jdbc:" prefix and add OJP wrapper
+ String urlWithoutPrefix = containerJdbcUrl.startsWith(JDBC_PREFIX)
+ ? containerJdbcUrl.substring(JDBC_PREFIX.length())
+ : containerJdbcUrl;
+ String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
+
+ // Return arguments for each record count
+ return Stream.of(RECORD_COUNTS)
+ .map(count -> Arguments.of(count, driverClass, ojpUrl, username, password));
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/resources/oracle_connections.csv b/ojp-jdbc-driver/src/test/resources/oracle_connections.csv
deleted file mode 100644
index d124daff7..000000000
--- a/ojp-jdbc-driver/src/test/resources/oracle_connections.csv
+++ /dev/null
@@ -1 +0,0 @@
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_oracle:thin:@localhost:1521/XEPDB1,testuser,testpassword
diff --git a/ojp-jdbc-driver/src/test/resources/oracle_xa_connection.csv b/ojp-jdbc-driver/src/test/resources/oracle_xa_connection.csv
deleted file mode 100644
index d60d9179d..000000000
--- a/ojp-jdbc-driver/src/test/resources/oracle_xa_connection.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_oracle:thin:@localhost:1521/XEPDB1,testuser,testpassword
-
From 0c09eac6998d8db5d3cd7eed2c7a6907780c666f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 4 Dec 2025 20:35:47 +0000
Subject: [PATCH 09/49] Remove duplicate imports from Oracle test files
---
.../openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java | 4 +---
.../test/java/openjproxy/jdbc/OracleBlobIntegrationTest.java | 2 +-
.../java/openjproxy/jdbc/OracleConnectionExtensiveTests.java | 5 +----
.../jdbc/OracleDatabaseMetaDataExtensiveTests.java | 4 +---
.../openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java | 4 +---
.../jdbc/OraclePreparedStatementExtensiveTests.java | 5 +----
.../jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java | 2 +-
.../jdbc/OracleResultSetMetaDataExtensiveTests.java | 5 +----
.../src/test/java/openjproxy/jdbc/OracleResultSetTest.java | 5 +----
.../src/test/java/openjproxy/jdbc/OracleSavepointTests.java | 5 +----
.../java/openjproxy/jdbc/OracleStatementExtensiveTests.java | 5 +----
11 files changed, 11 insertions(+), 35 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java
index 0dca3c6a7..e28fc60b3 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBinaryStreamIntegrationTest.java
@@ -4,9 +4,7 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
-import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.io.ByteArrayInputStream;
@@ -205,4 +203,4 @@ public void testOracleSpecificBinaryHandling(String driverClass, String url, Str
psSelect.close();
conn.close();
}
-}
\ No newline at end of file
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBlobIntegrationTest.java
index f60498a33..274e019fa 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleBlobIntegrationTest.java
@@ -282,4 +282,4 @@ public void testOracleEmptyAndNullBlob(String driverClass, String url, String us
rs.close();
conn.close();
}
-}
\ No newline at end of file
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java
index 352f2397c..4fe31fe6d 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleConnectionExtensiveTests.java
@@ -4,11 +4,8 @@
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
-import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import openjproxy.jdbc.testutil.TestDBUtils;
@@ -141,4 +138,4 @@ public void testOracleAutoIncrementSequence(String driverClass, String url, Stri
}
}
}
-}
\ No newline at end of file
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java
index 147d91da8..8002b105e 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleDatabaseMetaDataExtensiveTests.java
@@ -4,9 +4,7 @@
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
-import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.*;
@@ -309,4 +307,4 @@ public void allDatabaseMetaDataMethodsShouldWorkAndBeAsserted(String driverClass
TestDBUtils.validateAllRows(rs);
}
}
-}
\ No newline at end of file
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java
index 4bf79d94b..1d1ed49d7 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleMultipleTypesIntegrationTest.java
@@ -5,9 +5,7 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
-import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.math.BigDecimal;
@@ -261,4 +259,4 @@ private static byte[] hexStringToByteArray(String hex) {
}
return data;
}
-}
\ No newline at end of file
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java
index 66c685208..398c9d606 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OraclePreparedStatementExtensiveTests.java
@@ -4,11 +4,8 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
-import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.io.ByteArrayInputStream;
@@ -361,4 +358,4 @@ public void testErrorHandling(String driverClass, String url, String user, Strin
// Don't set parameters 2 and 3
assertThrows(SQLException.class, () -> ps.executeUpdate());
}
-}
\ No newline at end of file
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java
index 6e347405f..f685bf1fe 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleReadMultipleBlocksOfDataIntegrationTest.java
@@ -267,4 +267,4 @@ public void testOracleMultipleDataTypes(String driverClass, String url, String u
psSelect.close();
conn.close();
}
-}
\ No newline at end of file
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java
index 2856ee602..ede876dbe 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetMetaDataExtensiveTests.java
@@ -4,11 +4,8 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
-import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.*;
@@ -205,4 +202,4 @@ public void testAllResultSetMetaDataMethods(String driverClass, String url, Stri
assertTrue(ageClassName.equals("java.math.BigDecimal") || ageClassName.equals("java.lang.Integer"));
assertEquals("java.math.BigDecimal", metaData.getColumnClassName(4));
}
-}
\ No newline at end of file
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java
index 1b9d29d07..85c56491b 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleResultSetTest.java
@@ -4,11 +4,8 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
-import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.Connection;
@@ -270,4 +267,4 @@ public void testOracleRowCounting(String driverClass, String url, String user, S
resultSet.last();
assertTrue(resultSet.getRow() >= 3);
}
-}
\ No newline at end of file
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java
index 7fe08042d..3481d9793 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleSavepointTests.java
@@ -4,11 +4,8 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
-import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.Connection;
@@ -197,4 +194,4 @@ public void testSavepointMetadata(String driverClass, String url, String user, S
connection.releaseSavepoint(unnamedSp);
connection.releaseSavepoint(namedSp);
}
-}
\ No newline at end of file
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java
index bec3dae42..f4d05385a 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/OracleStatementExtensiveTests.java
@@ -5,11 +5,8 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.provider.ArgumentsSource;
-import org.junit.jupiter.api.condition.EnabledIf;
import openjproxy.jdbc.testutil.OracleConnectionProvider;
import java.sql.Connection;
@@ -420,4 +417,4 @@ public void testOracleSpecificFeatures(String driverClass, String url, String us
// Clean up
statement.execute("DROP VIEW oracle_test_view");
}
-}
\ No newline at end of file
+}
From a4405698e201547e3cd3cde78ba45c95680a18be Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 4 Dec 2025 20:38:31 +0000
Subject: [PATCH 10/49] Address code review feedback
- Fix XA permissions script execution in OracleTestContainer
- Add proper logging using slf4j instead of System.err
- Improve SQL script construction with StringBuilder
- Fix comment in OracleConnectionProvider to match implementation
- Use proper bash command structure for execInContainer
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../testutil/OracleConnectionProvider.java | 4 +-
.../jdbc/testutil/OracleTestContainer.java | 40 ++++++++++++-------
2 files changed, 27 insertions(+), 17 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionProvider.java
index 0b52cc2ee..9772a2892 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionProvider.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionProvider.java
@@ -38,8 +38,8 @@ public Stream extends Arguments> provideArguments(ExtensionContext context) {
// Build OJP JDBC URL from the container URL
// TestContainer URL format: jdbc:oracle:thin:@localhost:RANDOM_PORT/XEPDB1
- // We need to extract the connection string and wrap it with OJP format
- // OJP format: jdbc:ojp[localhost:1059]_oracle:thin:@...
+ // OJP wraps this by removing 'jdbc:' and prepending 'jdbc:ojp[host:port]_'
+ // Result format: jdbc:ojp[localhost:1059]_oracle:thin:@localhost:RANDOM_PORT/XEPDB1
String driverClass = "org.openjproxy.jdbc.Driver";
// Remove "jdbc:" prefix and add OJP wrapper
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java
index 316b2d809..2d3fea9bd 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java
@@ -1,5 +1,6 @@
package openjproxy.jdbc.testutil;
+import lombok.extern.slf4j.Slf4j;
import org.testcontainers.containers.OracleContainer;
import org.testcontainers.utility.DockerImageName;
@@ -8,6 +9,7 @@
* This ensures that all tests share the same Oracle instance to improve test performance
* and reduce resource usage.
*/
+@Slf4j
public class OracleTestContainer {
// Oracle Docker image version (using gvenzl/oracle-xe for compatibility)
@@ -63,27 +65,35 @@ public static synchronized OracleContainer getInstance() {
* This is required for XA transaction tests.
*/
private static void grantXAPermissions() throws Exception {
- // Execute SQL commands to grant XA permissions
- String sqlCommands =
- "GRANT XA_RECOVER_ADMIN TO " + TEST_USERNAME + ";\n" +
- "GRANT SELECT ON sys.dba_pending_transactions TO " + TEST_USERNAME + ";\n" +
- "GRANT SELECT ON sys.pending_trans$ TO " + TEST_USERNAME + ";\n" +
- "GRANT SELECT ON sys.dba_2pc_pending TO " + TEST_USERNAME + ";\n" +
- "GRANT SELECT ON sys.dba_2pc_neighbors TO " + TEST_USERNAME + ";\n" +
- "GRANT EXECUTE ON sys.dbms_xa TO " + TEST_USERNAME + ";\n" +
- "GRANT EXECUTE ON sys.dbms_system TO " + TEST_USERNAME + ";\n" +
- "GRANT FORCE ANY TRANSACTION TO " + TEST_USERNAME + ";";
+ log.info("Granting XA permissions to Oracle test user: {}", TEST_USERNAME);
- // Execute the grants using container.execInContainer
+ // Build SQL script with all necessary grants
+ StringBuilder sqlScript = new StringBuilder();
+ sqlScript.append("WHENEVER SQLERROR EXIT SQL.SQLCODE\n");
+ sqlScript.append("GRANT XA_RECOVER_ADMIN TO ").append(TEST_USERNAME).append(";\n");
+ sqlScript.append("GRANT SELECT ON sys.dba_pending_transactions TO ").append(TEST_USERNAME).append(";\n");
+ sqlScript.append("GRANT SELECT ON sys.pending_trans$ TO ").append(TEST_USERNAME).append(";\n");
+ sqlScript.append("GRANT SELECT ON sys.dba_2pc_pending TO ").append(TEST_USERNAME).append(";\n");
+ sqlScript.append("GRANT SELECT ON sys.dba_2pc_neighbors TO ").append(TEST_USERNAME).append(";\n");
+ sqlScript.append("GRANT EXECUTE ON sys.dbms_xa TO ").append(TEST_USERNAME).append(";\n");
+ sqlScript.append("GRANT EXECUTE ON sys.dbms_system TO ").append(TEST_USERNAME).append(";\n");
+ sqlScript.append("GRANT FORCE ANY TRANSACTION TO ").append(TEST_USERNAME).append(";\n");
+ sqlScript.append("EXIT;\n");
+
+ // Execute the grants using bash to pipe SQL into sqlplus
org.testcontainers.containers.Container.ExecResult result = container.execInContainer(
- "sqlplus", "-s", "system/" + TEST_PASSWORD + "@" + container.getDatabaseName(),
- "/bin/bash", "-c", "echo \"" + sqlCommands + "\" | sqlplus -s system/" + TEST_PASSWORD + "@" + container.getDatabaseName()
+ "bash", "-c",
+ "echo \"" + sqlScript.toString().replace("\"", "\\\"") + "\" | sqlplus -s system/" +
+ TEST_PASSWORD + "@" + container.getDatabaseName()
);
if (result.getExitCode() != 0) {
- System.err.println("Failed to grant XA permissions. Output: " + result.getStdout());
- System.err.println("Error: " + result.getStderr());
+ log.warn("Failed to grant XA permissions. Exit code: {}", result.getExitCode());
+ log.warn("Output: {}", result.getStdout());
+ log.warn("Error: {}", result.getStderr());
// Don't throw exception - XA tests may fail but other tests can still run
+ } else {
+ log.info("Successfully granted XA permissions to {}", TEST_USERNAME);
}
}
From 3362b56776fa78317f3890622a1473ee8b321c7b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Thu, 4 Dec 2025 20:57:26 +0000
Subject: [PATCH 11/49] Fix Oracle TestContainer initialization - remove
withDatabaseName
The OracleContainer from TestContainers doesn't support setting a custom
database name. The database name is determined by the Oracle XE image and
cannot be overridden. Removing withDatabaseName() call to use default
configuration.
Fixes: IllegalArgumentException: Database name cannot be set to xepdb1
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../test/java/openjproxy/jdbc/testutil/OracleTestContainer.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java
index 2d3fea9bd..fa5ba6b19 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleTestContainer.java
@@ -30,7 +30,6 @@ public class OracleTestContainer {
public static synchronized OracleContainer getInstance() {
if (container == null) {
container = new OracleContainer(DockerImageName.parse(ORACLE_IMAGE))
- .withDatabaseName("XEPDB1")
.withUsername(TEST_USERNAME)
.withPassword(TEST_PASSWORD);
}
From bab15749485be44a5dc185a6c83f0b0af9d420cd Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 07:46:56 +0000
Subject: [PATCH 12/49] Fix OracleConnectionWithRecordCountsProvider to stream
individual ints
Changed from Stream.of(RECORD_COUNTS) to Arrays.stream(RECORD_COUNTS)
to properly iterate over individual integers instead of streaming the
array itself. Also changed .map() to .mapToObj() for proper conversion.
Fixes: ParameterResolutionException - No built-in converter for source
type int[] and target type int
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../testutil/OracleConnectionWithRecordCountsProvider.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionWithRecordCountsProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionWithRecordCountsProvider.java
index ae1c77b84..92dfc0a9b 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionWithRecordCountsProvider.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/OracleConnectionWithRecordCountsProvider.java
@@ -4,6 +4,7 @@
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
+import java.util.Arrays;
import java.util.stream.Stream;
/**
@@ -48,7 +49,7 @@ public Stream extends Arguments> provideArguments(ExtensionContext context) {
String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
// Return arguments for each record count
- return Stream.of(RECORD_COUNTS)
- .map(count -> Arguments.of(count, driverClass, ojpUrl, username, password));
+ return Arrays.stream(RECORD_COUNTS)
+ .mapToObj(count -> Arguments.of(count, driverClass, ojpUrl, username, password));
}
}
From b81be08b562f2ef756960e4dcc19b0e57fed069a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 07:48:38 +0000
Subject: [PATCH 13/49] Fix parameter resolution error in
Db2ConnectionWithRecordCountsProvider
Changed Stream.of(RECORD_COUNTS) to Arrays.stream(RECORD_COUNTS).mapToObj()
to properly iterate over individual int values instead of treating the entire
array as a single element. This fixes the ParameterResolutionException when
JUnit tries to convert int[] to int.
Fixes: multiplePagesOfRowsResultSetSuccessful test failure
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java
index d48e03aac..ae40afb61 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2ConnectionWithRecordCountsProvider.java
@@ -4,6 +4,7 @@
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
+import java.util.Arrays;
import java.util.stream.Stream;
/**
@@ -53,7 +54,7 @@ public Stream extends Arguments> provideArguments(ExtensionContext context) {
String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
// Return arguments for each record count
- return Stream.of(RECORD_COUNTS)
- .map(count -> Arguments.of(count, driverClass, ojpUrl, username, password));
+ return Arrays.stream(RECORD_COUNTS)
+ .mapToObj(count -> Arguments.of(count, driverClass, ojpUrl, username, password));
}
}
From e9b41c758b19bf9b71a62570c596af1ea591a424 Mon Sep 17 00:00:00 2001
From: rogerio
Date: Fri, 5 Dec 2025 07:51:09 +0000
Subject: [PATCH 14/49] Increase timeout to start DB2 to 2h.
---
.../test/java/openjproxy/jdbc/testutil/Db2TestContainer.java | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2TestContainer.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2TestContainer.java
index b2ffc6eaf..14e677bd3 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2TestContainer.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/Db2TestContainer.java
@@ -2,6 +2,8 @@
import org.testcontainers.containers.Db2Container;
+import java.time.Duration;
+
/**
* Singleton DB2 test container for all DB2 integration tests.
* This ensures that all tests share the same DB2 instance to improve test performance
@@ -28,7 +30,8 @@ public class Db2TestContainer {
public static synchronized Db2Container getInstance() {
if (container == null) {
container = new Db2Container(DB2_IMAGE)
- .acceptLicense();
+ .acceptLicense()
+ .withStartupTimeout(Duration.ofMinutes(120));;
}
if (!isStarted) {
From cb25256bc1c86cd43bdd6c610eb26ced5ea34ab1 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 08:55:09 +0000
Subject: [PATCH 15/49] Initial plan
From 511b9779f21057a3557a37d58df428581cbeb763 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 09:02:31 +0000
Subject: [PATCH 16/49] Make all badge images clickable LinkedIn certification
links
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../contributor-recognition-program.md | 50 +++++++++----------
1 file changed, 25 insertions(+), 25 deletions(-)
diff --git a/documents/contributor-badges/contributor-recognition-program.md b/documents/contributor-badges/contributor-recognition-program.md
index 175f90bfc..febb186d9 100644
--- a/documents/contributor-badges/contributor-recognition-program.md
+++ b/documents/contributor-badges/contributor-recognition-program.md
@@ -25,16 +25,16 @@ Each badge reflects **real impact** in code, testing, documentation, or communit
| Track | Entry Level | Intermediate | Advanced |
|-------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| **🔵 Code** | 
**OJP Contributor**
First meaningful PR merged (bug fix, refactor, or feature).
Engaged in code reviews and discussions. | 
**OJP Developer**
Multiple meaningful PRs (features, performance, refactors).
Consistently contributes to reviews and discussions. | 
**OJP Core Developer**
Owns or maintains significant areas of the codebase.
Trusted to review and guide contributions.
Active in roadmap or architectural discussions. |
-| **🟢 Testing & Quality** | 
**OJP Tester**
Reports and/or validates bugs, tests beta releases. | 
**OJP Quality Advocate**
Regularly adds tests and/or improves CI and performance insights. | 
**OJP Reliability Engineer**
Leads stress/chaos testing.
shapes reliability strategy. |
-| **🟣 Evangelism & Community** | 
**OJP Advocate**
First public contribution (blog, post, or talk). Consistently shares OJP tutorials or examples. | 
**OJP Evangelist**
Regularly writes articles, give talks, or publish videos or OJP content in other formats.
Actively participates in the OJP community. | 
**OJP Community Leader**
Organizes OJP-related events (meetups, webinars, mentoring, AMAs).
Builds collaborations and grows the community. |
-| **🟠 Documentation & Content** | 
**OJP Documenter**
Improves README, setup guides, or initial docs.
Contributes diagrams or examples for clarity. | 
**OJP Author**
Writes multiple guides, tutorials, or explanations.
Expands developer-facing content (FAQ, troubleshooting).
Content recognized as a community reference. | 
**OJP Knowledge Builder**
Maintains or significantly expands documentation.
Creates structured learning resources (series, video walkthroughs).
Recognized for shaping OJP’s learning experience. |
+| **🔵 Code** | 
**OJP Contributor**
First meaningful PR merged (bug fix, refactor, or feature).
Engaged in code reviews and discussions. | 
**OJP Developer**
Multiple meaningful PRs (features, performance, refactors).
Consistently contributes to reviews and discussions. | 
**OJP Core Developer**
Owns or maintains significant areas of the codebase.
Trusted to review and guide contributions.
Active in roadmap or architectural discussions. |
+| **🟢 Testing & Quality** | 
**OJP Tester**
Reports and/or validates bugs, tests beta releases. | 
**OJP Quality Advocate**
Regularly adds tests and/or improves CI and performance insights. | 
**OJP Reliability Engineer**
Leads stress/chaos testing.
shapes reliability strategy. |
+| **🟣 Evangelism & Community** | 
**OJP Advocate**
First public contribution (blog, post, or talk). Consistently shares OJP tutorials or examples. | 
**OJP Evangelist**
Regularly writes articles, give talks, or publish videos or OJP content in other formats.
Actively participates in the OJP community. | 
**OJP Community Leader**
Organizes OJP-related events (meetups, webinars, mentoring, AMAs).
Builds collaborations and grows the community. |
+| **🟠 Documentation & Content** | 
**OJP Documenter**
Improves README, setup guides, or initial docs.
Contributes diagrams or examples for clarity. | 
**OJP Author**
Writes multiple guides, tutorials, or explanations.
Expands developer-facing content (FAQ, troubleshooting).
Content recognized as a community reference. | 
**OJP Knowledge Builder**
Maintains or significantly expands documentation.
Creates structured learning resources (series, video walkthroughs).
Recognized for shaping OJP’s learning experience. |
---
## 🏆 OJP Champion
-
+
- Highest recognition across all tracks.
- Achieved by sustained, high-impact contributions in one or multiple tracks.
@@ -69,30 +69,30 @@ Each badge reflects **real impact** in code, testing, documentation, or communit
### Intermediate
| Name | Badge | Country of birth | Country of residency | Award date(s) | Indicated By | Awarded by |
|-------------------|--------------------------------------------------------------------------------------|------------------|----------------------|---------------|---------------|---------------|
-| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 24/11/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 24/11/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
### Entry Level
| Name | Badge | Country of birth | Country of residency | Award date(s) | Indicated By | Awarded by |
|---------------------------------------------------------------------------|--------------------------------------------------------------------------------------|------------------|----------------------|---------------|---------------|---------------|
-| [George Leon](https://www.linkedin.com/in/georgiosleon/) |
| Australia | Greece | 24/11/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Oussama Baccara](https://www.linkedin.com/in/oussama-baccara-64552a282/) |
| Tunisia | Tunisia | 30/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Ediel Queiroz](https://www.linkedin.com/in/ediel-queiroz/) |
| Brazil | Portugal | 30/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Gustavo Lima](https://www.linkedin.com/in/gvlima/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Vitor Araujo](https://www.linkedin.com/in/kvitorr/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Gustavo Lima](https://www.linkedin.com/in/gvlima/) |
| Brazil | Brazil | 16/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Ediel Queiroz](https://www.linkedin.com/in/ediel-queiroz/) |
| Brazil | Portugal | 16/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Alan Jesus](https://www.linkedin.com/in/asiilva/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Ingrid Adine ](https://www.linkedin.com/in/ingridadine/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Saulo Benedetti ](https://www.linkedin.com/in/saulobenedetti/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Alan Jesus](https://www.linkedin.com/in/asiilva/) |
| Brazil | Brazil | 22/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Vitor Araujo](https://www.linkedin.com/in/kvitorr/) |
| Brazil | Brazil | 15/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Diego Vagliati](https://github.com/ribossomo) |
| Brazil | Brazil | 05/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [George Leon](https://www.linkedin.com/in/georgiosleon/) |
| Australia | Greece | 24/11/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Oussama Baccara](https://www.linkedin.com/in/oussama-baccara-64552a282/) |
| Tunisia | Tunisia | 30/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Ediel Queiroz](https://www.linkedin.com/in/ediel-queiroz/) |
| Brazil | Portugal | 30/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Gustavo Lima](https://www.linkedin.com/in/gvlima/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Vitor Araujo](https://www.linkedin.com/in/kvitorr/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Gustavo Lima](https://www.linkedin.com/in/gvlima/) |
| Brazil | Brazil | 16/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Ediel Queiroz](https://www.linkedin.com/in/ediel-queiroz/) |
| Brazil | Portugal | 16/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Alan Jesus](https://www.linkedin.com/in/asiilva/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Ingrid Adine ](https://www.linkedin.com/in/ingridadine/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Saulo Benedetti ](https://www.linkedin.com/in/saulobenedetti/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Alan Jesus](https://www.linkedin.com/in/asiilva/) |
| Brazil | Brazil | 22/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Vitor Araujo](https://www.linkedin.com/in/kvitorr/) |
| Brazil | Brazil | 15/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Diego Vagliati](https://github.com/ribossomo) |
| Brazil | Brazil | 05/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
---
\ No newline at end of file
From 60facbd1c801ef3423e67c00bfcd21ae1bedd989 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 09:28:39 +0000
Subject: [PATCH 17/49] Add organizationId and update organizationName in
LinkedIn links
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../contributor-recognition-program.md | 50 +++++++++----------
1 file changed, 25 insertions(+), 25 deletions(-)
diff --git a/documents/contributor-badges/contributor-recognition-program.md b/documents/contributor-badges/contributor-recognition-program.md
index febb186d9..ccc93a819 100644
--- a/documents/contributor-badges/contributor-recognition-program.md
+++ b/documents/contributor-badges/contributor-recognition-program.md
@@ -25,16 +25,16 @@ Each badge reflects **real impact** in code, testing, documentation, or communit
| Track | Entry Level | Intermediate | Advanced |
|-------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| **🔵 Code** | 
**OJP Contributor**
First meaningful PR merged (bug fix, refactor, or feature).
Engaged in code reviews and discussions. | 
**OJP Developer**
Multiple meaningful PRs (features, performance, refactors).
Consistently contributes to reviews and discussions. | 
**OJP Core Developer**
Owns or maintains significant areas of the codebase.
Trusted to review and guide contributions.
Active in roadmap or architectural discussions. |
-| **🟢 Testing & Quality** | 
**OJP Tester**
Reports and/or validates bugs, tests beta releases. | 
**OJP Quality Advocate**
Regularly adds tests and/or improves CI and performance insights. | 
**OJP Reliability Engineer**
Leads stress/chaos testing.
shapes reliability strategy. |
-| **🟣 Evangelism & Community** | 
**OJP Advocate**
First public contribution (blog, post, or talk). Consistently shares OJP tutorials or examples. | 
**OJP Evangelist**
Regularly writes articles, give talks, or publish videos or OJP content in other formats.
Actively participates in the OJP community. | 
**OJP Community Leader**
Organizes OJP-related events (meetups, webinars, mentoring, AMAs).
Builds collaborations and grows the community. |
-| **🟠 Documentation & Content** | 
**OJP Documenter**
Improves README, setup guides, or initial docs.
Contributes diagrams or examples for clarity. | 
**OJP Author**
Writes multiple guides, tutorials, or explanations.
Expands developer-facing content (FAQ, troubleshooting).
Content recognized as a community reference. | 
**OJP Knowledge Builder**
Maintains or significantly expands documentation.
Creates structured learning resources (series, video walkthroughs).
Recognized for shaping OJP’s learning experience. |
+| **🔵 Code** | 
**OJP Contributor**
First meaningful PR merged (bug fix, refactor, or feature).
Engaged in code reviews and discussions. | 
**OJP Developer**
Multiple meaningful PRs (features, performance, refactors).
Consistently contributes to reviews and discussions. | 
**OJP Core Developer**
Owns or maintains significant areas of the codebase.
Trusted to review and guide contributions.
Active in roadmap or architectural discussions. |
+| **🟢 Testing & Quality** | 
**OJP Tester**
Reports and/or validates bugs, tests beta releases. | 
**OJP Quality Advocate**
Regularly adds tests and/or improves CI and performance insights. | 
**OJP Reliability Engineer**
Leads stress/chaos testing.
shapes reliability strategy. |
+| **🟣 Evangelism & Community** | 
**OJP Advocate**
First public contribution (blog, post, or talk). Consistently shares OJP tutorials or examples. | 
**OJP Evangelist**
Regularly writes articles, give talks, or publish videos or OJP content in other formats.
Actively participates in the OJP community. | 
**OJP Community Leader**
Organizes OJP-related events (meetups, webinars, mentoring, AMAs).
Builds collaborations and grows the community. |
+| **🟠 Documentation & Content** | 
**OJP Documenter**
Improves README, setup guides, or initial docs.
Contributes diagrams or examples for clarity. | 
**OJP Author**
Writes multiple guides, tutorials, or explanations.
Expands developer-facing content (FAQ, troubleshooting).
Content recognized as a community reference. | 
**OJP Knowledge Builder**
Maintains or significantly expands documentation.
Creates structured learning resources (series, video walkthroughs).
Recognized for shaping OJP’s learning experience. |
---
## 🏆 OJP Champion
-
+
- Highest recognition across all tracks.
- Achieved by sustained, high-impact contributions in one or multiple tracks.
@@ -69,30 +69,30 @@ Each badge reflects **real impact** in code, testing, documentation, or communit
### Intermediate
| Name | Badge | Country of birth | Country of residency | Award date(s) | Indicated By | Awarded by |
|-------------------|--------------------------------------------------------------------------------------|------------------|----------------------|---------------|---------------|---------------|
-| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 24/11/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 24/11/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
### Entry Level
| Name | Badge | Country of birth | Country of residency | Award date(s) | Indicated By | Awarded by |
|---------------------------------------------------------------------------|--------------------------------------------------------------------------------------|------------------|----------------------|---------------|---------------|---------------|
-| [George Leon](https://www.linkedin.com/in/georgiosleon/) |
| Australia | Greece | 24/11/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Oussama Baccara](https://www.linkedin.com/in/oussama-baccara-64552a282/) |
| Tunisia | Tunisia | 30/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Ediel Queiroz](https://www.linkedin.com/in/ediel-queiroz/) |
| Brazil | Portugal | 30/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Gustavo Lima](https://www.linkedin.com/in/gvlima/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Vitor Araujo](https://www.linkedin.com/in/kvitorr/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Gustavo Lima](https://www.linkedin.com/in/gvlima/) |
| Brazil | Brazil | 16/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Ediel Queiroz](https://www.linkedin.com/in/ediel-queiroz/) |
| Brazil | Portugal | 16/10/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Alan Jesus](https://www.linkedin.com/in/asiilva/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Ingrid Adine ](https://www.linkedin.com/in/ingridadine/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Saulo Benedetti ](https://www.linkedin.com/in/saulobenedetti/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Alan Jesus](https://www.linkedin.com/in/asiilva/) |
| Brazil | Brazil | 22/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Vitor Araujo](https://www.linkedin.com/in/kvitorr/) |
| Brazil | Brazil | 15/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Diego Vagliati](https://github.com/ribossomo) |
| Brazil | Brazil | 05/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
-| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [George Leon](https://www.linkedin.com/in/georgiosleon/) |
| Australia | Greece | 24/11/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Oussama Baccara](https://www.linkedin.com/in/oussama-baccara-64552a282/) |
| Tunisia | Tunisia | 30/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Ediel Queiroz](https://www.linkedin.com/in/ediel-queiroz/) |
| Brazil | Portugal | 30/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Gustavo Lima](https://www.linkedin.com/in/gvlima/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Jether Rodrigues](https://www.linkedin.com/in/jetherrodrigues/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Vitor Araujo](https://www.linkedin.com/in/kvitorr/) |
| Brazil | Brazil | 25/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Gustavo Lima](https://www.linkedin.com/in/gvlima/) |
| Brazil | Brazil | 16/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Ediel Queiroz](https://www.linkedin.com/in/ediel-queiroz/) |
| Brazil | Portugal | 16/10/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Alan Jesus](https://www.linkedin.com/in/asiilva/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Ingrid Adine ](https://www.linkedin.com/in/ingridadine/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Saulo Benedetti ](https://www.linkedin.com/in/saulobenedetti/) |
| Brazil | Brazil | 26/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Alan Jesus](https://www.linkedin.com/in/asiilva/) |
| Brazil | Brazil | 22/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Vitor Araujo](https://www.linkedin.com/in/kvitorr/) |
| Brazil | Brazil | 15/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Diego Vagliati](https://github.com/ribossomo) |
| Brazil | Brazil | 05/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
+| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
---
\ No newline at end of file
From 7638d41a18fe27052aa747e3ffd056b70b90a34b Mon Sep 17 00:00:00 2001
From: Rogerio Robetti
Date: Fri, 5 Dec 2025 12:02:09 +0000
Subject: [PATCH 18/49] Enhance contributor recognition program details
Added information about sharing badges on LinkedIn.
---
.../contributor-badges/contributor-recognition-program.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/documents/contributor-badges/contributor-recognition-program.md b/documents/contributor-badges/contributor-recognition-program.md
index ccc93a819..e9a337d96 100644
--- a/documents/contributor-badges/contributor-recognition-program.md
+++ b/documents/contributor-badges/contributor-recognition-program.md
@@ -19,6 +19,8 @@ When you are awarded a badge, it’s yours to use freely in **CVs, LinkedIn prof
Each badge reflects **real impact** in code, testing, documentation, or community growth — something to be proud of and share widely.
+Click on the badge images in the tables below to get a ready-made LinkedIn certification entry for easy sharing!
+
---
## 🎖️ Contributor Badges Overview
@@ -95,4 +97,4 @@ Each badge reflects **real impact** in code, testing, documentation, or communit
| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
| [Roger Floriano](https://github.com/petruki) |
| Brazil | Canada | 01/09/2025 | Rogerio Robetti | Rogerio Robetti |
----
\ No newline at end of file
+---
From 91dbaeba0f13c3b1dbbd0a1a98b3b67ac76b3280 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:12:11 +0000
Subject: [PATCH 19/49] Initial plan
From 0bbf7a1713f5346a7f1beca44319a4bd79bb0b0f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:12:18 +0000
Subject: [PATCH 20/49] Initial plan
From ba020d74246146cf84231a740cd3defc68903775 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:12:26 +0000
Subject: [PATCH 21/49] Initial plan
From df9dce5e9372ecb80b2c065e4463be0ef2ca18f7 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:19:01 +0000
Subject: [PATCH 22/49] Add MySQL TestContainer support and create dedicated
workflow
- Added MySQL JDBC driver and TestContainers MySQL dependencies to pom.xml
- Created MySQLTestContainer.java singleton container manager
- Created MySQLConnectionProvider.java ArgumentsProvider for parameterized tests
- Updated 6 MySQL test classes to use TestContainers with @EnabledIf and @ArgumentsSource
- Changed from disableMySQLTests to enableMySQLTests flag (default false)
- Removed obsolete mysql_mariadb_connection.csv file
- Created new mysql-testing.yml workflow for MySQL-specific tests
- Updated main.yml to remove MySQL service and explicitly disable MySQL tests
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.github/workflows/main.yml | 17 +---
.github/workflows/mysql-testing.yml | 77 +++++++++++++++
ojp-jdbc-driver/pom.xml | 18 ++++
.../MySQLDatabaseMetaDataExtensiveTests.java | 31 +++---
.../MySQLMariaDBConnectionExtensiveTests.java | 45 +++++----
.../MySQLMultipleTypesIntegrationTest.java | 11 ++-
.../MySQLPreparedStatementExtensiveTests.java | 35 +++----
.../MySQLSpecificFeaturesIntegrationTest.java | 16 ++--
.../jdbc/MySQLStatementExtensiveTests.java | 55 ++++++-----
.../testutil/MySQLConnectionProvider.java | 56 +++++++++++
.../jdbc/testutil/MySQLTestContainer.java | 95 +++++++++++++++++++
.../resources/mysql_mariadb_connection.csv | 2 -
12 files changed, 352 insertions(+), 106 deletions(-)
create mode 100644 .github/workflows/mysql-testing.yml
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MySQLConnectionProvider.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MySQLTestContainer.java
delete mode 100644 ojp-jdbc-driver/src/test/resources/mysql_mariadb_connection.csv
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 5de3ae78d..9ada37c61 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -36,21 +36,6 @@ jobs:
ports:
- 3307:3306
- mysql:
- image: mysql:8.0
- env:
- MYSQL_DATABASE: defaultdb
- MYSQL_USER: testuser
- MYSQL_PASSWORD: testpassword
- MYSQL_ROOT_PASSWORD: rootpassword
- options: >-
- --health-cmd "mysqladmin ping"
- --health-interval=10s
- --health-timeout=5s
- --health-retries=5
- ports:
- - 3306:3306
-
#TODO maybe put proprietary DBs in separated workflows, seem to be insufficient memory in github to run all at once
#oracle:
# image: gvenzl/oracle-xe:21-slim
@@ -171,7 +156,7 @@ jobs:
run: mvn clean install -pl ojp-jdbc-driver -am -DskipTests -Dgpg.skip=true
- name: Test (ojp-jdbc-driver)
- run: mvn test -pl ojp-jdbc-driver -Dgpg.skip=true
+ run: mvn test -pl ojp-jdbc-driver -Dgpg.skip=true -DenableMySQLTests=false
- name: Show ojp-server.log
if: always() # ensures it runs even if previous steps fail
diff --git a/.github/workflows/mysql-testing.yml b/.github/workflows/mysql-testing.yml
new file mode 100644
index 000000000..936248bad
--- /dev/null
+++ b/.github/workflows/mysql-testing.yml
@@ -0,0 +1,77 @@
+# This workflow runs only MySQL integration tests using TestContainers.
+# It disables all other database integration tests to focus on MySQL testing.
+# TestContainers automatically manages the MySQL container lifecycle.
+name: MySQL Integration Tests
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+ workflow_dispatch: # Allow manual triggering
+
+jobs:
+ mysql-tests:
+ name: MySQL Integration Tests
+ runs-on: ubuntu-latest
+
+ permissions:
+ contents: read
+
+ strategy:
+ fail-fast: false
+ matrix:
+ java-version: [ 11, 17, 21, 22 ]
+
+ steps:
+ - name: Git checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Set up JDK 22 for build
+ uses: actions/setup-java@v4
+ with:
+ java-version: 22
+ distribution: 'temurin'
+ cache: maven
+
+ - name: Build and Install (ojp-grpc-commons) with JDK 22
+ run: mvn clean install -pl ojp-grpc-commons -am -DskipTests -Dgpg.skip=true
+
+ - name: Test (ojp-grpc-commons) with JDK 22
+ run: mvn test -pl ojp-grpc-commons -Dgpg.skip=true
+
+ - name: Build (ojp-server) with JDK 22
+ run: mvn clean install -pl ojp-server -am -DskipTests -Dgpg.skip=true
+
+ - name: Test and Run (ojp-server)
+ run: |
+ nohup java -jar ojp-server/target/ojp-server-0.2.1-snapshot-shaded.jar > /tmp/ojp-server.log 2>&1 &
+ echo $! > /tmp/ojp-server.pid
+
+ - name: Wait for ojp-server to start
+ run: sleep 10
+
+ - name: Set up JDK ${{ matrix.java-version }} for ojp-jdbc-driver
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ matrix.java-version }}
+ distribution: 'temurin'
+ cache: maven
+
+ - name: Build (ojp-jdbc-driver) with JDK ${{ matrix.java-version }}
+ run: mvn clean install -pl ojp-jdbc-driver -am -DskipTests -Dgpg.skip=true
+
+ - name: Run MySQL Integration Tests
+ run: |
+ mvn test -pl ojp-jdbc-driver -Dgpg.skip=true \
+ -DenableMySQLTests=true \
+ -DdisablePostgresTests=true \
+ -DdisableMariaDBTests=true \
+ -DdisableCockroachDBTests=true \
+ -Dtest="MySQL*"
+
+ - name: Show ojp-server.log
+ if: always() # ensures it runs even if previous steps fail
+ run: cat /tmp/ojp-server.log || echo "/tmp/ojp-server.log not found"
diff --git a/ojp-jdbc-driver/pom.xml b/ojp-jdbc-driver/pom.xml
index 81b17baaf..3164bb88a 100644
--- a/ojp-jdbc-driver/pom.xml
+++ b/ojp-jdbc-driver/pom.xml
@@ -106,6 +106,24 @@
test
+
+
+
+ com.mysql
+ mysql-connector-j
+ 9.1.0
+ test
+
+
+
+
+
+ org.testcontainers
+ mysql
+ 1.20.4
+ test
+
+
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java
index 32183d468..4a4ca1680 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java
@@ -1,11 +1,13 @@
package openjproxy.jdbc;
import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MySQLConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -14,6 +16,7 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.MySQLTestContainer#isEnabled")
public class MySQLDatabaseMetaDataExtensiveTests {
private static boolean isMySQLTestDisabled;
@@ -22,7 +25,7 @@ public class MySQLDatabaseMetaDataExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
+ isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
}
@@ -39,7 +42,7 @@ public static void teardown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testBasicDatabaseMetaDataProperties(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -67,7 +70,7 @@ public void testBasicDatabaseMetaDataProperties(String driverClass, String url,
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testSupportFeatures(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -97,7 +100,7 @@ public void testSupportFeatures(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testIdentifierProperties(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -118,7 +121,7 @@ public void testIdentifierProperties(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testTransactionSupport(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -136,7 +139,7 @@ public void testTransactionSupport(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testFunctionSupport(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -159,7 +162,7 @@ public void testFunctionSupport(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testResultSetSupport(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -180,7 +183,7 @@ public void testResultSetSupport(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testGetTables(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -203,7 +206,7 @@ public void testGetTables(String driverClass, String url, String user, String pa
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testGetColumns(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -230,7 +233,7 @@ public void testGetColumns(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testGetPrimaryKeys(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -254,7 +257,7 @@ public void testGetPrimaryKeys(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testGetTypeInfo(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -279,7 +282,7 @@ public void testGetTypeInfo(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testMySQLSpecificMetaData(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -307,7 +310,7 @@ public void testMySQLSpecificMetaData(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testLimitsAndSizes(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
index 76cc05d0a..33e3d602a 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
@@ -2,11 +2,13 @@
import lombok.SneakyThrows;
import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MySQLConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.CallableStatement;
import java.sql.Connection;
@@ -24,6 +26,7 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.MySQLTestContainer#isEnabled")
public class MySQLMariaDBConnectionExtensiveTests {
private static boolean isMySQLTestDisabled;
@@ -32,7 +35,7 @@ public class MySQLMariaDBConnectionExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
+ isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
}
@@ -49,7 +52,7 @@ public void tearDown() throws SQLException {
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testCreateStatement(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -59,7 +62,7 @@ public void testCreateStatement(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testPrepareStatement(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -69,7 +72,7 @@ public void testPrepareStatement(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testPrepareCall(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -85,7 +88,7 @@ public void testPrepareCall(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testNativeSQL(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -96,7 +99,7 @@ public void testNativeSQL(String driverClass, String url, String user, String pa
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testAutoCommit(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -114,7 +117,7 @@ public void testAutoCommit(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testCommitAndRollback(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -129,7 +132,7 @@ public void testCommitAndRollback(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testIsClosed(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -140,7 +143,7 @@ public void testIsClosed(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testGetMetaData(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -156,7 +159,7 @@ public void testGetMetaData(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testReadOnly(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -177,7 +180,7 @@ public void testReadOnly(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testCatalog(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -192,7 +195,7 @@ public void testCatalog(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testTransactionIsolation(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -208,7 +211,7 @@ public void testTransactionIsolation(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testWarnings(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -221,7 +224,7 @@ public void testWarnings(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testCreateStatementWithParameters(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -235,7 +238,7 @@ public void testCreateStatementWithParameters(String driverClass, String url, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testPrepareStatementWithParameters(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -249,7 +252,7 @@ public void testPrepareStatementWithParameters(String driverClass, String url, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testHoldability(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -262,7 +265,7 @@ public void testHoldability(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testSavepoints(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -288,7 +291,7 @@ public void testSavepoints(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testClientInfo(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -305,7 +308,7 @@ public void testClientInfo(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testValid(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -319,7 +322,7 @@ public void testValid(String driverClass, String url, String user, String passwo
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testUnsupportedOperations(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java
index 64aa0d986..dfd683a12 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java
@@ -1,10 +1,12 @@
package openjproxy.jdbc;
import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MySQLConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.math.BigDecimal;
import java.sql.Connection;
@@ -19,6 +21,7 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.MySQLTestContainer#isEnabled")
public class MySQLMultipleTypesIntegrationTest {
private static boolean isMySQLTestDisabled;
@@ -26,12 +29,12 @@ public class MySQLMultipleTypesIntegrationTest {
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
+ isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void typesCoverageTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, ParseException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
@@ -119,7 +122,7 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void mysqlSpecificTypesTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java
index b39d773e5..59cc2501e 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java
@@ -1,12 +1,14 @@
package openjproxy.jdbc;
import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MySQLConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.io.ByteArrayInputStream;
import java.io.StringReader;
@@ -25,6 +27,7 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.MySQLTestContainer#isEnabled")
public class MySQLPreparedStatementExtensiveTests {
private static boolean isMySQLTestDisabled;
@@ -34,7 +37,7 @@ public class MySQLPreparedStatementExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
+ isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
}
@@ -65,7 +68,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testBasicParameterSetters(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -89,7 +92,7 @@ public void testBasicParameterSetters(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testNumericParameterSetters(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -118,7 +121,7 @@ public void testNumericParameterSetters(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testDateTimeParameterSetters(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -147,7 +150,7 @@ public void testDateTimeParameterSetters(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testBinaryParameterSetters(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -176,7 +179,7 @@ public void testBinaryParameterSetters(String driverClass, String url, String us
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testTextParameterSetters(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -204,7 +207,7 @@ public void testTextParameterSetters(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testNullParameterSetters(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -231,7 +234,7 @@ public void testNullParameterSetters(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testExecuteQuery(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -256,7 +259,7 @@ public void testExecuteQuery(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testExecuteUpdate(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -280,7 +283,7 @@ public void testExecuteUpdate(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testExecute(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -302,7 +305,7 @@ public void testExecute(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testBatch(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -340,7 +343,7 @@ public void testBatch(String driverClass, String url, String user, String passwo
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testClearParameters(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -356,7 +359,7 @@ public void testClearParameters(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testMetaData(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -370,7 +373,7 @@ public void testMetaData(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testParameterMetaData(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -387,7 +390,7 @@ public void testParameterMetaData(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testGeneratedKeys(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
index 3078720d0..99c649222 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
@@ -2,8 +2,9 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -17,6 +18,7 @@
* Tests for MySQL-specific functionality that is not covered by database-agnostic tests.
* Includes features like ON DUPLICATE KEY UPDATE, SELECT ... FOR UPDATE, SHOW commands, etc.
*/
+@EnabledIf("openjproxy.jdbc.testutil.MySQLTestContainer#isEnabled")
public class MySQLSpecificFeaturesIntegrationTest {
private static boolean isMySQLTestDisabled;
@@ -24,12 +26,12 @@ public class MySQLSpecificFeaturesIntegrationTest {
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
+ isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void onDuplicateKeyUpdateTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
@@ -74,7 +76,7 @@ public void onDuplicateKeyUpdateTestSuccessful(String driverClass, String url, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void selectForUpdateTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
@@ -126,7 +128,7 @@ public void selectForUpdateTestSuccessful(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void showTablesTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
@@ -163,7 +165,7 @@ public void showTablesTestSuccessful(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void autoIncrementAndLastInsertIdTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
@@ -216,7 +218,7 @@ public void autoIncrementAndLastInsertIdTestSuccessful(String driverClass, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void mysqlInformationSchemaTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java
index cfd354131..7cc30baed 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java
@@ -1,11 +1,13 @@
package openjproxy.jdbc;
+import openjproxy.jdbc.testutil.MySQLConnectionProvider;
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.Assert;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -15,6 +17,7 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.MySQLTestContainer#isEnabled")
public class MySQLStatementExtensiveTests {
private static boolean isMySQLTestDisabled;
@@ -24,7 +27,7 @@ public class MySQLStatementExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
+ isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
}
@@ -43,7 +46,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testExecuteQuery(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ResultSet rs = statement.executeQuery("SELECT * FROM mysql_statement_test");
@@ -53,7 +56,7 @@ public void testExecuteQuery(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testExecuteUpdate(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int rows = statement.executeUpdate("UPDATE mysql_statement_test SET name = 'Updated Alice' WHERE id = 1");
@@ -66,7 +69,7 @@ public void testExecuteUpdate(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testClose(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
Assert.assertFalse(statement.isClosed());
@@ -75,7 +78,7 @@ public void testClose(String driverClass, String url, String user, String passwo
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testMaxFieldSize(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getMaxFieldSize();
@@ -91,7 +94,7 @@ public void testMaxFieldSize(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testMaxRows(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
Assert.assertEquals(0, statement.getMaxRows());
@@ -102,7 +105,7 @@ public void testMaxRows(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testQueryTimeout(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
Assert.assertEquals(0, statement.getQueryTimeout());
@@ -113,7 +116,7 @@ public void testQueryTimeout(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testWarnings(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Initial warnings might be null
@@ -123,7 +126,7 @@ public void testWarnings(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testExecute(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
boolean hasResultSet = statement.execute("SELECT * FROM mysql_statement_test");
@@ -140,7 +143,7 @@ public void testExecute(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testGetResultSet(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.execute("SELECT * FROM mysql_statement_test");
@@ -150,7 +153,7 @@ public void testGetResultSet(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testGetUpdateCount(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.execute("UPDATE mysql_statement_test SET name = 'Test Update' WHERE id = 1");
@@ -161,7 +164,7 @@ public void testGetUpdateCount(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testGetMoreResults(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.execute("SELECT * FROM mysql_statement_test");
@@ -172,7 +175,7 @@ public void testGetMoreResults(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testFetchDirection(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
Assert.assertEquals(ResultSet.FETCH_FORWARD, statement.getFetchDirection());
@@ -181,7 +184,7 @@ public void testFetchDirection(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testFetchSize(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int originalFetchSize = statement.getFetchSize();
@@ -191,7 +194,7 @@ public void testFetchSize(String driverClass, String url, String user, String pa
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testResultSetConcurrency(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int concurrency = statement.getResultSetConcurrency();
@@ -199,7 +202,7 @@ public void testResultSetConcurrency(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testResultSetType(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int type = statement.getResultSetType();
@@ -209,7 +212,7 @@ public void testResultSetType(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testAddBatch(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.addBatch("INSERT INTO mysql_statement_test (id, name) VALUES (10, 'Batch1')");
@@ -223,14 +226,14 @@ public void testAddBatch(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testGetConnection(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
Assert.assertSame(connection, statement.getConnection());
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testGetGeneratedKeys(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -253,7 +256,7 @@ public void testGetGeneratedKeys(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testExecuteUpdateWithGeneratedKeys(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -278,7 +281,7 @@ public void testExecuteUpdateWithGeneratedKeys(String driverClass, String url, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testResultSetHoldability(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int holdability = statement.getResultSetHoldability();
@@ -287,7 +290,7 @@ public void testResultSetHoldability(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testCancel(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Test that cancel doesn't throw an exception
@@ -295,7 +298,7 @@ public void testCancel(String driverClass, String url, String user, String passw
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testEscapeProcessing(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setEscapeProcessing(true);
@@ -304,7 +307,7 @@ public void testEscapeProcessing(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testCursorName(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// MySQL may not support named cursors in all configurations
@@ -315,7 +318,7 @@ public void testCursorName(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MySQLConnectionProvider.class)
public void testPoolable(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
boolean poolable = statement.isPoolable();
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MySQLConnectionProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MySQLConnectionProvider.java
new file mode 100644
index 000000000..a25752c24
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MySQLConnectionProvider.java
@@ -0,0 +1,56 @@
+package openjproxy.jdbc.testutil;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+import java.util.stream.Stream;
+
+/**
+ * Custom ArgumentsProvider for MySQL integration tests.
+ * Provides connection details from TestContainers when MySQL tests are enabled.
+ * This allows tests to use TestContainers instead of external MySQL instances.
+ */
+public class MySQLConnectionProvider implements ArgumentsProvider {
+
+ // JDBC URL prefix to be removed when building OJP URL
+ private static final String JDBC_PREFIX = "jdbc:";
+
+ // OJP proxy server configuration - can be overridden via system property
+ private static final String OJP_PROXY_HOST = System.getProperty("ojp.proxy.host", "localhost");
+ private static final String OJP_PROXY_PORT = System.getProperty("ojp.proxy.port", "1059");
+ private static final String OJP_PROXY_ADDRESS = OJP_PROXY_HOST + ":" + OJP_PROXY_PORT;
+
+ @Override
+ public Stream extends Arguments> provideArguments(ExtensionContext context) {
+ if (!MySQLTestContainer.isEnabled()) {
+ // Return empty stream when tests are disabled
+ return Stream.empty();
+ }
+
+ // Initialize and start the TestContainer
+ MySQLTestContainer.getInstance();
+
+ // Get connection details from the TestContainer
+ String containerJdbcUrl = MySQLTestContainer.getJdbcUrl();
+ String username = MySQLTestContainer.getUsername();
+ String password = MySQLTestContainer.getPassword();
+
+ // Build OJP JDBC URL from the container URL
+ // TestContainer URL format: jdbc:mysql://localhost:RANDOM_PORT/defaultdb
+ // OJP wraps this by removing 'jdbc:' and prepending 'jdbc:ojp[host:port]_'
+ // Result format: jdbc:ojp[localhost:1059]_mysql://localhost:RANDOM_PORT/defaultdb
+ String driverClass = "org.openjproxy.jdbc.Driver";
+
+ // Remove "jdbc:" prefix and add OJP wrapper
+ String urlWithoutPrefix = containerJdbcUrl.startsWith(JDBC_PREFIX)
+ ? containerJdbcUrl.substring(JDBC_PREFIX.length())
+ : containerJdbcUrl;
+ String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
+
+ // Return a single set of arguments with the TestContainer connection details
+ return Stream.of(
+ Arguments.of(driverClass, ojpUrl, username, password)
+ );
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MySQLTestContainer.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MySQLTestContainer.java
new file mode 100644
index 000000000..d51b80f3d
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MySQLTestContainer.java
@@ -0,0 +1,95 @@
+package openjproxy.jdbc.testutil;
+
+import org.testcontainers.containers.MySQLContainer;
+
+/**
+ * Singleton MySQL test container for all MySQL integration tests.
+ * This ensures that all tests share the same MySQL instance to improve test performance
+ * and reduce resource usage.
+ */
+public class MySQLTestContainer {
+
+ // MySQL Docker image version
+ private static final String MYSQL_IMAGE = "mysql:8.0";
+
+ private static MySQLContainer> container;
+ private static boolean isStarted = false;
+ private static boolean shutdownHookRegistered = false;
+
+ /**
+ * Gets or creates the shared MySQL test container instance.
+ * The container is automatically started on first access.
+ *
+ * @return the shared MySQLContainer instance
+ */
+ public static synchronized MySQLContainer> getInstance() {
+ if (container == null) {
+ container = new MySQLContainer<>(MYSQL_IMAGE)
+ .withDatabaseName("defaultdb")
+ .withUsername("testuser")
+ .withPassword("testpassword");
+ }
+
+ if (!isStarted) {
+ container.start();
+ isStarted = true;
+
+ // Add shutdown hook to stop container when JVM exits
+ if (!shutdownHookRegistered) {
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ if (container != null && container.isRunning()) {
+ container.stop();
+ }
+ }));
+ shutdownHookRegistered = true;
+ }
+ }
+
+ return container;
+ }
+
+ /**
+ * Gets the JDBC URL for connecting to the test container.
+ *
+ * @return JDBC URL string
+ */
+ public static String getJdbcUrl() {
+ return getInstance().getJdbcUrl();
+ }
+
+ /**
+ * Gets the username for connecting to the test container.
+ *
+ * @return username string
+ */
+ public static String getUsername() {
+ return getInstance().getUsername();
+ }
+
+ /**
+ * Gets the password for connecting to the test container.
+ *
+ * @return password string
+ */
+ public static String getPassword() {
+ return getInstance().getPassword();
+ }
+
+ /**
+ * Gets the database name for the test container.
+ *
+ * @return database name string
+ */
+ public static String getDatabaseName() {
+ return getInstance().getDatabaseName();
+ }
+
+ /**
+ * Checks if MySQL tests are enabled via system property.
+ *
+ * @return true if MySQL tests should run
+ */
+ public static boolean isEnabled() {
+ return Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/resources/mysql_mariadb_connection.csv b/ojp-jdbc-driver/src/test/resources/mysql_mariadb_connection.csv
deleted file mode 100644
index 8bda7086d..000000000
--- a/ojp-jdbc-driver/src/test/resources/mysql_mariadb_connection.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mysql://localhost:3306/defaultdb,testuser,testpassword,false
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mariadb://localhost:3307/defaultdb,testuser,testpassword,false
\ No newline at end of file
From 4a04fc0009e44e53822927dcf397f67e882cc3be Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:19:31 +0000
Subject: [PATCH 23/49] Add PostgreSQL TestContainers support and create
postgres-testing workflow
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.github/workflows/main.yml | 21 +---
.github/workflows/postgres-testing.yml | 77 +++++++++++++
ojp-jdbc-driver/pom.xml | 9 ++
.../jdbc/BasicCrudIntegrationTest.java | 2 +-
.../jdbc/BinaryStreamIntegrationTest.java | 2 +-
.../jdbc/PostgresCallableStatementTests.java | 17 +--
.../PostgresConnectionExtensiveTests.java | 23 ++--
...ostgresDatabaseMetaDataExtensiveTests.java | 9 +-
.../jdbc/PostgresMiniStressTest.java | 8 +-
.../PostgresMultipleTypesIntegrationTest.java | 10 +-
...stgresPreparedStatementExtensiveTests.java | 27 ++---
.../jdbc/PostgresSavepointTests.java | 9 +-
.../PostgresSlowQuerySegregationTest.java | 8 +-
.../jdbc/PostgresStatementExtensiveTests.java | 69 ++++++------
.../jdbc/PostgresXAIntegrationTest.java | 16 +--
...adMultipleBlocksOfDataIntegrationTest.java | 60 ++++++++++-
.../java/openjproxy/jdbc/ResultSetTest.java | 2 +-
.../testutil/PostgresConnectionProvider.java | 56 ++++++++++
...resConnectionWithRecordCountsProvider.java | 59 ++++++++++
.../jdbc/testutil/PostgresTestContainer.java | 102 ++++++++++++++++++
20 files changed, 475 insertions(+), 111 deletions(-)
create mode 100644 .github/workflows/postgres-testing.yml
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionProvider.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionWithRecordCountsProvider.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresTestContainer.java
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 5de3ae78d..e6664e074 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -1,5 +1,6 @@
# This workflow builds and tests the project on pushes and pull requests to the main branch.
-# It uses a Postgres service for integration tests and skips the CI if the commit message contains '[skip ci]'.
+# It uses services for MySQL, MariaDB, and CockroachDB integration tests.
+# PostgreSQL tests are run in a separate workflow using TestContainers.
# The workflow result is reported in the Actions tab of the repository.
name: Main CI
@@ -120,22 +121,6 @@ jobs:
# Wait for CockroachDB to be ready
timeout 60 bash -c 'until curl -f http://localhost:8080/health?ready=1 2>/dev/null; do sleep 2; done'
- - name: Start Postgres
- run: |
- docker run --name ojp-postgres \
- -e POSTGRES_USER=testuser \
- -e POSTGRES_PASSWORD=testpassword \
- -e POSTGRES_DB=defaultdb \
- -p 5432:5432 \
- -d postgres:17 \
- -c max_prepared_transactions=100
-
- # Wait for Postgres to become ready (up to 60s)
- timeout 60 bash -c 'until docker exec ojp-postgres pg_isready -U testuser -d defaultdb -h 127.0.0.1; do sleep 2; done'
-
- # Verify setting (should print 100)
- PGPASSWORD=testpassword psql -h 127.0.0.1 -U testuser -d defaultdb -c "SHOW max_prepared_transactions;"
-
- name: Set up JDK 22 for build
uses: actions/setup-java@v4
with:
@@ -171,7 +156,7 @@ jobs:
run: mvn clean install -pl ojp-jdbc-driver -am -DskipTests -Dgpg.skip=true
- name: Test (ojp-jdbc-driver)
- run: mvn test -pl ojp-jdbc-driver -Dgpg.skip=true
+ run: mvn test -pl ojp-jdbc-driver -Dgpg.skip=true -DenablePostgresTests=false
- name: Show ojp-server.log
if: always() # ensures it runs even if previous steps fail
diff --git a/.github/workflows/postgres-testing.yml b/.github/workflows/postgres-testing.yml
new file mode 100644
index 000000000..d99d6e787
--- /dev/null
+++ b/.github/workflows/postgres-testing.yml
@@ -0,0 +1,77 @@
+# This workflow runs only PostgreSQL integration tests using TestContainers.
+# It disables all other database integration tests to focus on PostgreSQL testing.
+# TestContainers automatically manages the PostgreSQL container lifecycle.
+name: PostgreSQL Integration Tests
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+ workflow_dispatch: # Allow manual triggering
+
+jobs:
+ postgres-tests:
+ name: PostgreSQL Integration Tests
+ runs-on: ubuntu-latest
+
+ permissions:
+ contents: read
+
+ strategy:
+ fail-fast: false
+ matrix:
+ java-version: [ 11, 17, 21, 22 ]
+
+ steps:
+ - name: Git checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Set up JDK 22 for build
+ uses: actions/setup-java@v4
+ with:
+ java-version: 22
+ distribution: 'temurin'
+ cache: maven
+
+ - name: Build and Install (ojp-grpc-commons) with JDK 22
+ run: mvn clean install -pl ojp-grpc-commons -am -DskipTests -Dgpg.skip=true
+
+ - name: Test (ojp-grpc-commons) with JDK 22
+ run: mvn test -pl ojp-grpc-commons -Dgpg.skip=true
+
+ - name: Build (ojp-server) with JDK 22
+ run: mvn clean install -pl ojp-server -am -DskipTests -Dgpg.skip=true
+
+ - name: Test and Run (ojp-server)
+ run: |
+ nohup java -jar ojp-server/target/ojp-server-0.2.1-snapshot-shaded.jar > /tmp/ojp-server.log 2>&1 &
+ echo $! > /tmp/ojp-server.pid
+
+ - name: Wait for ojp-server to start
+ run: sleep 10
+
+ - name: Set up JDK ${{ matrix.java-version }} for ojp-jdbc-driver
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ matrix.java-version }}
+ distribution: 'temurin'
+ cache: maven
+
+ - name: Build (ojp-jdbc-driver) with JDK ${{ matrix.java-version }}
+ run: mvn clean install -pl ojp-jdbc-driver -am -DskipTests -Dgpg.skip=true
+
+ - name: Run PostgreSQL Integration Tests
+ run: |
+ mvn test -pl ojp-jdbc-driver -Dgpg.skip=true \
+ -DenablePostgresTests=true \
+ -DdisableMySQLTests=true \
+ -DdisableMariaDBTests=true \
+ -DdisableCockroachDBTests=true \
+ -Dtest="Postgres*"
+
+ - name: Show ojp-server.log
+ if: always() # ensures it runs even if previous steps fail
+ run: cat /tmp/ojp-server.log || echo "/tmp/ojp-server.log not found"
diff --git a/ojp-jdbc-driver/pom.xml b/ojp-jdbc-driver/pom.xml
index 81b17baaf..0f7ee213f 100644
--- a/ojp-jdbc-driver/pom.xml
+++ b/ojp-jdbc-driver/pom.xml
@@ -124,6 +124,15 @@
test
+
+
+
+ org.testcontainers
+ postgresql
+ 1.20.4
+ test
+
+
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
index c38a1af22..73d81ac7f 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
@@ -29,7 +29,7 @@ public class BasicCrudIntegrationTest {
@BeforeAll
public static void setup() {
- isPostgresTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isPostgresTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
isCockroachDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
index 8ea176b46..414e9ed30 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
@@ -23,7 +23,7 @@ public class BinaryStreamIntegrationTest {
@BeforeAll
public static void setup() {
- isPostgresTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isPostgresTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
@ParameterizedTest
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresCallableStatementTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresCallableStatementTests.java
index 0431ec0dd..14dbef73e 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresCallableStatementTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresCallableStatementTests.java
@@ -3,7 +3,9 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.PostgresConnectionProvider;
import java.math.BigDecimal;
import java.sql.CallableStatement;
@@ -28,6 +30,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.PostgresTestContainer#isEnabled")
public class PostgresCallableStatementTests {
private static boolean isTestDisabled;
@@ -37,7 +40,7 @@ public class PostgresCallableStatementTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
public void setUp(String driverClass, String url, String user, String password) throws Exception {
@@ -89,7 +92,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testExecuteProcedure(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
callableStatement = connection.prepareCall("CALL update_salary(?, ?, ?)");
@@ -119,7 +122,7 @@ public void testExecuteProcedure(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testDateTimeParameters(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
callableStatement = connection.prepareCall("CALL update_employee_dates(?, ?, ?, ?, ?, ?, ?)");
@@ -159,7 +162,7 @@ public void testDateTimeParameters(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testSetAndGetStringAndBoolean(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -189,7 +192,7 @@ public void testSetAndGetStringAndBoolean(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testSetObjectAndGetObject(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
callableStatement = connection.prepareCall("CALL update_salary(?, ?, ?)");
@@ -208,7 +211,7 @@ public void testSetObjectAndGetObject(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testInvalidParameterIndex(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// This test will intentionally fail due to an invalid parameter index
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresConnectionExtensiveTests.java
index 02f65f943..f4edf4864 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresConnectionExtensiveTests.java
@@ -2,11 +2,13 @@
import io.grpc.StatusRuntimeException;
import lombok.SneakyThrows;
+import openjproxy.jdbc.testutil.PostgresConnectionProvider;
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Array;
import java.sql.Blob;
@@ -36,6 +38,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.PostgresTestContainer#isEnabled")
public class PostgresConnectionExtensiveTests {
private static boolean isTestDisabled;
@@ -43,7 +46,7 @@ public class PostgresConnectionExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isTestDisabled = Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
@SneakyThrows
@@ -58,7 +61,7 @@ public void tearDown() throws SQLException {
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testConnectionProperties(String driverClass, String url, String user, String password) throws SQLException {
this.setUp(driverClass, url, user, password);
assertEquals(false, connection.isClosed());
@@ -68,7 +71,7 @@ public void testConnectionProperties(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testAutoCommitAndTransactionIsolation(String driverClass, String url, String user, String password) throws SQLException {
this.setUp(driverClass, url, user, password);
assertEquals(true, connection.getAutoCommit());
@@ -83,7 +86,7 @@ public void testAutoCommitAndTransactionIsolation(String driverClass, String url
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testCommitAndRollback(String driverClass, String url, String user, String password) throws SQLException {
this.setUp(driverClass, url, user, password);
@@ -107,7 +110,7 @@ public void testCommitAndRollback(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testSavepoints(String driverClass, String url, String user, String password) throws SQLException {
this.setUp(driverClass, url, user, password);
@@ -135,7 +138,7 @@ public void testSavepoints(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testConnectionMetadata(String driverClass, String url, String user, String password) throws SQLException {
this.setUp(driverClass, url, user, password);
DatabaseMetaData metaData = connection.getMetaData();
@@ -145,7 +148,7 @@ public void testConnectionMetadata(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testClientInfo(String driverClass, String url, String user, String password) throws SQLException {
this.setUp(driverClass, url, user, password);
// PostgreSQL supports client info
@@ -158,7 +161,7 @@ public void testClientInfo(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testClose(String driverClass, String url, String user, String password) throws SQLException {
this.setUp(driverClass, url, user, password);
assertEquals(false, connection.isClosed());
@@ -169,7 +172,7 @@ public void testClose(String driverClass, String url, String user, String passwo
// ---------- Additional tests for every Connection interface method ----------
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testAllConnectionMethods(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresDatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresDatabaseMetaDataExtensiveTests.java
index 8fd2e9f26..45651ae1d 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresDatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresDatabaseMetaDataExtensiveTests.java
@@ -3,12 +3,15 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.PostgresConnectionProvider;
import java.sql.*;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.PostgresTestContainer#isEnabled")
public class PostgresDatabaseMetaDataExtensiveTests {
private static boolean isTestDisabled;
@@ -16,7 +19,7 @@ public class PostgresDatabaseMetaDataExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
public void setUp(String driverClass, String url, String user, String password) throws Exception {
@@ -32,7 +35,7 @@ public static void teardown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void allDatabaseMetaDataMethodsShouldWorkAndBeAsserted(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMiniStressTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMiniStressTest.java
index 6521f5219..80b3b51df 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMiniStressTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMiniStressTest.java
@@ -5,7 +5,9 @@
import org.codehaus.plexus.util.ExceptionUtils;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.PostgresConnectionProvider;
import java.math.BigDecimal;
import java.sql.Connection;
@@ -37,7 +39,7 @@ public class PostgresMiniStressTest {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
@SneakyThrows
@@ -49,7 +51,7 @@ public void setUp() throws SQLException {
@SneakyThrows
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void runTests(String driverClass, String url, String user, String password) throws SQLException {
assumeFalse(isTestDisabled, "Postgres tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMultipleTypesIntegrationTest.java
index ea6a099df..dfe7a7d43 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMultipleTypesIntegrationTest.java
@@ -4,7 +4,9 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.PostgresConnectionProvider;
import java.math.BigDecimal;
import java.sql.Connection;
@@ -25,11 +27,11 @@ public class PostgresMultipleTypesIntegrationTest {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void typesCoverageTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, ParseException {
assumeFalse(isTestDisabled, "Postgres tests are disabled");
@@ -134,7 +136,7 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testPostgresSpecificTypes(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Postgres tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresPreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresPreparedStatementExtensiveTests.java
index 5826a21bc..1ada6d28a 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresPreparedStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresPreparedStatementExtensiveTests.java
@@ -4,7 +4,9 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.PostgresConnectionProvider;
import java.io.ByteArrayInputStream;
import java.io.StringReader;
@@ -29,6 +31,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.PostgresTestContainer#isEnabled")
public class PostgresPreparedStatementExtensiveTests {
private static boolean isTestDisabled;
@@ -38,7 +41,7 @@ public class PostgresPreparedStatementExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
public void setUp(String driverClass, String url, String user, String password) throws Exception {
@@ -66,7 +69,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testBasicParameterSetting(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO postgres_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -91,7 +94,7 @@ public void testBasicParameterSetting(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testNullParameterHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO postgres_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -119,7 +122,7 @@ public void testNullParameterHandling(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testNumericParameterTypes(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -147,7 +150,7 @@ public void testNumericParameterTypes(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testDateTimeParameterTypes(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO postgres_prepared_stmt_test (id, name, dt) VALUES (?, ?, ?)");
@@ -172,7 +175,7 @@ public void testDateTimeParameterTypes(String driverClass, String url, String us
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testLargeObjectHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO postgres_prepared_stmt_test (id, name, data, info) VALUES (?, ?, ?, ?)");
@@ -202,7 +205,7 @@ public void testLargeObjectHandling(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testStreamHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO postgres_prepared_stmt_test (id, name, data, info) VALUES (?, ?, ?, ?)");
@@ -222,7 +225,7 @@ public void testStreamHandling(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testParameterMetaData(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO postgres_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -235,7 +238,7 @@ public void testParameterMetaData(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testBatchOperations(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO postgres_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -263,7 +266,7 @@ public void testBatchOperations(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testResultSetHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -293,7 +296,7 @@ public void testResultSetHandling(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testErrorHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO postgres_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSavepointTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSavepointTests.java
index 54c9300ff..7fc88f261 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSavepointTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSavepointTests.java
@@ -4,7 +4,9 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.PostgresConnectionProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -16,6 +18,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.PostgresTestContainer#isEnabled")
public class PostgresSavepointTests {
private static boolean isTestDisabled;
@@ -23,7 +26,7 @@ public class PostgresSavepointTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
@SneakyThrows
@@ -46,7 +49,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testSavepoint(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
connection.createStatement().execute("INSERT INTO savepoint_test_table (id, name) VALUES (1, 'Alice')");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSlowQuerySegregationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSlowQuerySegregationTest.java
index c0560af0e..7e3412c17 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSlowQuerySegregationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSlowQuerySegregationTest.java
@@ -7,7 +7,9 @@
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.PostgresConnectionProvider;
import java.math.BigDecimal;
import java.sql.Connection;
@@ -38,7 +40,7 @@ public class PostgresSlowQuerySegregationTest {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
@SneakyThrows
@@ -50,7 +52,7 @@ public void setUp() throws SQLException {
@SneakyThrows
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void runTests(String driverClass, String url, String user, String password) throws SQLException {
assumeFalse(isTestDisabled, "Postgres tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresStatementExtensiveTests.java
index fb6e5ecc6..979df93ee 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresStatementExtensiveTests.java
@@ -4,7 +4,9 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.PostgresConnectionProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -22,6 +24,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.PostgresTestContainer#isEnabled")
public class PostgresStatementExtensiveTests {
private static boolean isTestDisabled;
@@ -31,7 +34,7 @@ public class PostgresStatementExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
public void setUp(String driverClass, String url, String user, String password) throws Exception {
@@ -49,7 +52,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testExecuteQuery(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ResultSet rs = statement.executeQuery("SELECT * FROM postgres_statement_test");
@@ -59,7 +62,7 @@ public void testExecuteQuery(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testExecuteUpdate(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int rows = statement.executeUpdate("UPDATE postgres_statement_test SET name = 'Updated Alice' WHERE id = 1");
@@ -72,7 +75,7 @@ public void testExecuteUpdate(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testClose(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
assertFalse(statement.isClosed());
@@ -81,7 +84,7 @@ public void testClose(String driverClass, String url, String user, String passwo
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testMaxFieldSize(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getMaxFieldSize();
@@ -92,7 +95,7 @@ public void testMaxFieldSize(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testExecuteAfterCloseThrows(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.close();
@@ -102,7 +105,7 @@ public void testExecuteAfterCloseThrows(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testMaxRows(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setMaxRows(1);
@@ -114,7 +117,7 @@ public void testMaxRows(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testEscapeProcessing(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Should not throw
@@ -123,7 +126,7 @@ public void testEscapeProcessing(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testQueryTimeout(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setQueryTimeout(5);
@@ -131,7 +134,7 @@ public void testQueryTimeout(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testCancel(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Should not throw
@@ -139,7 +142,7 @@ public void testCancel(String driverClass, String url, String user, String passw
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testWarnings(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.clearWarnings();
@@ -147,7 +150,7 @@ public void testWarnings(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testSetCursorName(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// No-op in most drivers; should not throw
@@ -155,7 +158,7 @@ public void testSetCursorName(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testExecute(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
boolean isResultSet = statement.execute("SELECT * FROM postgres_statement_test");
@@ -171,7 +174,7 @@ public void testExecute(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testGetMoreResults(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.execute("SELECT * FROM postgres_statement_test");
@@ -180,7 +183,7 @@ public void testGetMoreResults(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testFetchDirection(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getFetchDirection();
@@ -190,7 +193,7 @@ public void testFetchDirection(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testFetchSize(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getFetchSize();
@@ -200,7 +203,7 @@ public void testFetchSize(String driverClass, String url, String user, String pa
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testResultSetConcurrencyAndType(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int concurrency = statement.getResultSetConcurrency();
@@ -210,7 +213,7 @@ public void testResultSetConcurrencyAndType(String driverClass, String url, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testBatchExecution(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.addBatch("INSERT INTO postgres_statement_test (id, name) VALUES (3, 'Charlie')");
@@ -225,7 +228,7 @@ public void testBatchExecution(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testClearBatch(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.addBatch("INSERT INTO postgres_statement_test (id, name) VALUES (5, 'Eve')");
@@ -235,14 +238,14 @@ public void testClearBatch(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testGetConnection(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
assertSame(connection, statement.getConnection());
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testGetMoreResultsWithCurrent(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.execute("SELECT * FROM postgres_statement_test");
@@ -250,7 +253,7 @@ public void testGetMoreResultsWithCurrent(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testGeneratedKeys(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
TestDBUtils.createAutoIncrementTestTable(connection, "test_auto_keys", TestDBUtils.SqlSyntax.POSTGRES);
@@ -264,7 +267,7 @@ public void testGeneratedKeys(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testExecuteUpdateVariants(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -292,7 +295,7 @@ public void testExecuteUpdateVariants(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testExecuteVariants(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
TestDBUtils.createAutoIncrementTestTable(connection, "test_exec", TestDBUtils.SqlSyntax.POSTGRES);
@@ -312,7 +315,7 @@ public void testExecuteVariants(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testGetResultSetHoldability(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int holdability = statement.getResultSetHoldability();
@@ -320,7 +323,7 @@ public void testGetResultSetHoldability(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testPoolable(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setPoolable(true);
@@ -333,7 +336,7 @@ public void testPoolable(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testCloseOnCompletion(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.closeOnCompletion();
@@ -341,7 +344,7 @@ public void testCloseOnCompletion(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testLargeMethodsDefault(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.getFetchDirection();
@@ -363,7 +366,7 @@ public void testLargeMethodsDefault(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testEnquoteLiteral(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
String quoted = statement.enquoteLiteral("foo'bar");
@@ -371,7 +374,7 @@ public void testEnquoteLiteral(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testEnquoteIdentifier(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// PostgreSQL may not quote identifiers the same way as H2
@@ -382,7 +385,7 @@ public void testEnquoteIdentifier(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testIsSimpleIdentifier(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// PostgreSQL may have different rules for simple identifiers
@@ -397,7 +400,7 @@ public void testIsSimpleIdentifier(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testEnquoteNCharLiteral(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
String quoted = statement.enquoteNCharLiteral("foo'bar");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresXAIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresXAIntegrationTest.java
index bf2a5e5f2..e6c7659a1 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresXAIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresXAIntegrationTest.java
@@ -5,7 +5,9 @@
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.PostgresConnectionProvider;
import org.openjproxy.jdbc.xa.OjpXADataSource;
import javax.sql.XAConnection;
@@ -37,7 +39,7 @@ public class PostgresXAIntegrationTest {
@BeforeAll
public static void checkTestConfiguration() {
// Enable by default for testing
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
public void setUp(String driverClass, String url, String user, String password) throws SQLException {
@@ -70,7 +72,7 @@ public void tearDown() {
* Test basic XA connection creation and closure.
*/
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_xa_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testXAConnectionBasics(String driverClass, String url, String user, String password) throws Exception {
setUp(driverClass, url, user, password);
@@ -91,7 +93,7 @@ public void testXAConnectionBasics(String driverClass, String url, String user,
* This tests: xaStart -> executeUpdate -> xaEnd -> xaPrepare -> xaCommit
*/
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_xa_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testXATransactionWithCRUD(String driverClass, String url, String user, String password) throws Exception {
setUp(driverClass, url, user, password);
@@ -170,7 +172,7 @@ public void testXATransactionWithCRUD(String driverClass, String url, String use
* Test XA transaction rollback.
*/
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_xa_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testXATransactionRollback(String driverClass, String url, String user, String password) throws Exception {
setUp(driverClass, url, user, password);
@@ -232,7 +234,7 @@ public void testXATransactionRollback(String driverClass, String url, String use
* Test transaction timeout functionality.
*/
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_xa_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testXATransactionTimeout(String driverClass, String url, String user, String password) throws Exception {
setUp(driverClass, url, user, password);
@@ -255,7 +257,7 @@ public void testXATransactionTimeout(String driverClass, String url, String user
* Test one-phase commit optimization.
*/
@ParameterizedTest
- @CsvFileSource(resources = "/postgres_xa_connection.csv")
+ @ArgumentsSource(PostgresConnectionProvider.class)
public void testXAOnePhaseCommit(String driverClass, String url, String user, String password) throws Exception {
setUp(driverClass, url, user, password);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
index 9e0917b88..825fbcb30 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
@@ -3,7 +3,9 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import org.junit.jupiter.params.provider.CsvFileSource;
+import openjproxy.jdbc.testutil.PostgresConnectionWithRecordCountsProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -14,17 +16,19 @@
public class ReadMultipleBlocksOfDataIntegrationTest {
- private static boolean isPostgresTestDisabled;
+ private static boolean isPostgresTestEnabled;
@BeforeAll
public static void checkTestConfiguration() {
- isPostgresTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isPostgresTestEnabled = Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
+ // H2 tests - run by default
@ParameterizedTest
@CsvFileSource(resources = "/h2_postgres_connections_with_record_counts.csv")
public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
- if (isPostgresTestDisabled && url.contains("postgresql")) {
+ // Skip Postgres connections in this test - they're tested separately
+ if (url.contains("postgresql")) {
return;
}
Connection conn = DriverManager.getConnection(url, user, pwd);
@@ -37,13 +41,58 @@ public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driv
//Does not matter
}
- // Create table for H2/PostgreSQL
+ // Create table for H2
String createTableSql = "create table read_blocks_test_multi(" +
"id INT NOT NULL, " +
"title VARCHAR(50) NOT NULL)";
executeUpdate(conn, createTableSql);
- for (int i = 0; i < totalRecords; i++) { //TODO make this test parameterized with multiple parameters
+ for (int i = 0; i < totalRecords; i++) {
+ executeUpdate(conn,
+ "insert into read_blocks_test_multi (id, title) values (" + i + ", 'TITLE_" + i + "')"
+ );
+ }
+
+ java.sql.PreparedStatement psSelect = conn.prepareStatement("select * from read_blocks_test_multi order by id");
+ ResultSet resultSet = psSelect.executeQuery();
+
+ for (int i = 0; i < totalRecords; i++) {
+ resultSet.next();
+ int id = resultSet.getInt(1);
+ String title = resultSet.getString(2);
+ Assert.assertEquals(i, id);
+ Assert.assertEquals("TITLE_" + i, title);
+ }
+
+ executeUpdate(conn, "delete from read_blocks_test_multi");
+
+ ResultSet resultSetAfterDeletion = psSelect.executeQuery();
+ Assert.assertFalse(resultSetAfterDeletion.next());
+
+ conn.close();
+ }
+
+ // PostgreSQL tests using TestContainers - only run when enabled
+ @ParameterizedTest
+ @ArgumentsSource(PostgresConnectionWithRecordCountsProvider.class)
+ public void multiplePagesOfRowsResultSetSuccessfulPostgres(int totalRecords, String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
+ Connection conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing retrieving " + totalRecords + " records from PostgreSQL TestContainer url -> " + url);
+
+ try {
+ executeUpdate(conn, "drop table read_blocks_test_multi");
+ } catch (Exception e) {
+ //Does not matter
+ }
+
+ // Create table for PostgreSQL
+ String createTableSql = "create table read_blocks_test_multi(" +
+ "id INT NOT NULL, " +
+ "title VARCHAR(50) NOT NULL)";
+ executeUpdate(conn, createTableSql);
+
+ for (int i = 0; i < totalRecords; i++) {
executeUpdate(conn,
"insert into read_blocks_test_multi (id, title) values (" + i + ", 'TITLE_" + i + "')"
);
@@ -68,3 +117,4 @@ public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driv
conn.close();
}
}
+
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java
index ccde8de75..e4062c2bf 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java
@@ -30,7 +30,7 @@ public class ResultSetTest {
@BeforeAll
public static void checkTestConfiguration() {
- isPostgresTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
+ isPostgresTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
@SneakyThrows
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionProvider.java
new file mode 100644
index 000000000..0c5e55e82
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionProvider.java
@@ -0,0 +1,56 @@
+package openjproxy.jdbc.testutil;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+import java.util.stream.Stream;
+
+/**
+ * Custom ArgumentsProvider for PostgreSQL integration tests.
+ * Provides connection details from TestContainers when PostgreSQL tests are enabled.
+ * This allows tests to use TestContainers instead of external PostgreSQL instances.
+ */
+public class PostgresConnectionProvider implements ArgumentsProvider {
+
+ // JDBC URL prefix to be removed when building OJP URL
+ private static final String JDBC_PREFIX = "jdbc:";
+
+ // OJP proxy server configuration - can be overridden via system property
+ private static final String OJP_PROXY_HOST = System.getProperty("ojp.proxy.host", "localhost");
+ private static final String OJP_PROXY_PORT = System.getProperty("ojp.proxy.port", "1059");
+ private static final String OJP_PROXY_ADDRESS = OJP_PROXY_HOST + ":" + OJP_PROXY_PORT;
+
+ @Override
+ public Stream extends Arguments> provideArguments(ExtensionContext context) {
+ if (!PostgresTestContainer.isEnabled()) {
+ // Return empty stream when tests are disabled
+ return Stream.empty();
+ }
+
+ // Initialize and start the TestContainer
+ PostgresTestContainer.getInstance();
+
+ // Get connection details from the TestContainer
+ String containerJdbcUrl = PostgresTestContainer.getJdbcUrl();
+ String username = PostgresTestContainer.getUsername();
+ String password = PostgresTestContainer.getPassword();
+
+ // Build OJP JDBC URL from the container URL
+ // TestContainer URL format: jdbc:postgresql://localhost:RANDOM_PORT/defaultdb
+ // OJP wraps this by removing 'jdbc:' and prepending 'jdbc:ojp[host:port]_'
+ // Result format: jdbc:ojp[localhost:1059]_postgresql://localhost:RANDOM_PORT/defaultdb
+ String driverClass = "org.openjproxy.jdbc.Driver";
+
+ // Remove "jdbc:" prefix and add OJP wrapper
+ String urlWithoutPrefix = containerJdbcUrl.startsWith(JDBC_PREFIX)
+ ? containerJdbcUrl.substring(JDBC_PREFIX.length())
+ : containerJdbcUrl;
+ String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
+
+ // Return a single set of arguments with the TestContainer connection details
+ return Stream.of(
+ Arguments.of(driverClass, ojpUrl, username, password)
+ );
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionWithRecordCountsProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionWithRecordCountsProvider.java
new file mode 100644
index 000000000..72080d5e7
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionWithRecordCountsProvider.java
@@ -0,0 +1,59 @@
+package openjproxy.jdbc.testutil;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+import java.util.Arrays;
+import java.util.stream.Stream;
+
+/**
+ * Custom ArgumentsProvider for PostgreSQL integration tests that include record counts.
+ * Provides connection details from TestContainers along with various record counts for testing.
+ */
+public class PostgresConnectionWithRecordCountsProvider implements ArgumentsProvider {
+
+ // JDBC URL prefix to be removed when building OJP URL
+ private static final String JDBC_PREFIX = "jdbc:";
+
+ // OJP proxy server configuration - can be overridden via system property
+ private static final String OJP_PROXY_HOST = System.getProperty("ojp.proxy.host", "localhost");
+ private static final String OJP_PROXY_PORT = System.getProperty("ojp.proxy.port", "1059");
+ private static final String OJP_PROXY_ADDRESS = OJP_PROXY_HOST + ":" + OJP_PROXY_PORT;
+
+ // Test record counts to iterate through
+ private static final int[] RECORD_COUNTS = {1, 99, 100, 101, 1000, 10000};
+
+ @Override
+ public Stream extends Arguments> provideArguments(ExtensionContext context) {
+ if (!PostgresTestContainer.isEnabled()) {
+ // Return empty stream when tests are disabled
+ return Stream.empty();
+ }
+
+ // Initialize and start the TestContainer
+ PostgresTestContainer.getInstance();
+
+ // Get connection details from the TestContainer
+ String containerJdbcUrl = PostgresTestContainer.getJdbcUrl();
+ String username = PostgresTestContainer.getUsername();
+ String password = PostgresTestContainer.getPassword();
+
+ // Build OJP JDBC URL from the container URL
+ String driverClass = "org.openjproxy.jdbc.Driver";
+
+ // Remove "jdbc:" prefix and add OJP wrapper
+ String urlWithoutPrefix = containerJdbcUrl.startsWith(JDBC_PREFIX)
+ ? containerJdbcUrl.substring(JDBC_PREFIX.length())
+ : containerJdbcUrl;
+ String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
+
+ // Return arguments for each record count with the isXA boolean parameter
+ // The isXA parameter is kept for compatibility but is not actively used by the test
+ return Arrays.stream(RECORD_COUNTS)
+ .flatMap(count -> Stream.of(
+ Arguments.of(count, driverClass, ojpUrl, username, password, false),
+ Arguments.of(count, driverClass, ojpUrl, username, password, true)
+ ));
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresTestContainer.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresTestContainer.java
new file mode 100644
index 000000000..d21c18d02
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresTestContainer.java
@@ -0,0 +1,102 @@
+package openjproxy.jdbc.testutil;
+
+import lombok.extern.slf4j.Slf4j;
+import org.testcontainers.containers.PostgreSQLContainer;
+
+/**
+ * Singleton PostgreSQL test container for all PostgreSQL integration tests.
+ * This ensures that all tests share the same PostgreSQL instance to improve test performance
+ * and reduce resource usage.
+ */
+@Slf4j
+public class PostgresTestContainer {
+
+ // PostgreSQL Docker image version
+ private static final String POSTGRES_IMAGE = "postgres:17";
+ private static final String TEST_PASSWORD = "testpassword";
+ private static final String TEST_USERNAME = "testuser";
+ private static final String TEST_DATABASE = "defaultdb";
+
+ private static PostgreSQLContainer> container;
+ private static boolean isStarted = false;
+ private static boolean shutdownHookRegistered = false;
+
+ /**
+ * Gets or creates the shared PostgreSQL test container instance.
+ * The container is automatically started on first access.
+ *
+ * @return the shared PostgreSQLContainer instance
+ */
+ public static synchronized PostgreSQLContainer> getInstance() {
+ if (container == null) {
+ container = new PostgreSQLContainer<>(POSTGRES_IMAGE)
+ .withDatabaseName(TEST_DATABASE)
+ .withUsername(TEST_USERNAME)
+ .withPassword(TEST_PASSWORD)
+ .withCommand("postgres", "-c", "max_prepared_transactions=100");
+ }
+
+ if (!isStarted) {
+ container.start();
+ isStarted = true;
+ log.info("PostgreSQL TestContainer started successfully");
+
+ // Add shutdown hook to stop container when JVM exits
+ if (!shutdownHookRegistered) {
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ if (container != null && container.isRunning()) {
+ container.stop();
+ }
+ }));
+ shutdownHookRegistered = true;
+ }
+ }
+
+ return container;
+ }
+
+ /**
+ * Gets the JDBC URL for connecting to the test container.
+ *
+ * @return JDBC URL string
+ */
+ public static String getJdbcUrl() {
+ return getInstance().getJdbcUrl();
+ }
+
+ /**
+ * Gets the username for connecting to the test container.
+ *
+ * @return username string
+ */
+ public static String getUsername() {
+ return getInstance().getUsername();
+ }
+
+ /**
+ * Gets the password for connecting to the test container.
+ *
+ * @return password string
+ */
+ public static String getPassword() {
+ return getInstance().getPassword();
+ }
+
+ /**
+ * Gets the database name for the test container.
+ *
+ * @return database name string
+ */
+ public static String getDatabaseName() {
+ return getInstance().getDatabaseName();
+ }
+
+ /**
+ * Checks if PostgreSQL tests are enabled via system property.
+ *
+ * @return true if PostgreSQL tests should run
+ */
+ public static boolean isEnabled() {
+ return Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
+ }
+}
From 338c9d665401ca24c718dc1afdff66bc044e15f1 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:19:44 +0000
Subject: [PATCH 24/49] Add MariaDB TestContainer support and update tests
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.github/workflows/db2-testing.yml | 2 +-
.github/workflows/main.yml | 17 +-
.github/workflows/mariadb-testing.yml | 77 +++++++++
.github/workflows/oracle-testing.yml | 2 +-
.github/workflows/sqlserver-testing.yml | 2 +-
ojp-jdbc-driver/pom.xml | 18 ++
.../jdbc/BasicCrudIntegrationTest.java | 10 +-
.../openjproxy/jdbc/BlobIntegrationTest.java | 10 +-
.../MySQLDatabaseMetaDataExtensiveTests.java | 85 +++++-----
.../MySQLMariaDBConnectionExtensiveTests.java | 52 +++---
.../MySQLMultipleTypesIntegrationTest.java | 17 +-
.../MySQLPreparedStatementExtensiveTests.java | 97 +++++------
.../MySQLSpecificFeaturesIntegrationTest.java | 20 ++-
.../jdbc/MySQLStatementExtensiveTests.java | 157 +++++++++---------
.../testutil/MariaDBConnectionProvider.java | 57 +++++++
.../jdbc/testutil/MariaDBTestContainer.java | 103 ++++++++++++
16 files changed, 492 insertions(+), 234 deletions(-)
create mode 100644 .github/workflows/mariadb-testing.yml
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java
diff --git a/.github/workflows/db2-testing.yml b/.github/workflows/db2-testing.yml
index bbb9c5cdc..60b8b0ac2 100644
--- a/.github/workflows/db2-testing.yml
+++ b/.github/workflows/db2-testing.yml
@@ -88,7 +88,7 @@ jobs:
-DenableDb2Tests=true \
-DdisablePostgresTests=true \
-DdisableMySQLTests=true \
- -DdisableMariaDBTests=true \
+ -DenableMariaDBTests=false \
-DdisableCockroachDBTests=true \
-Dtest="Db2*"
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 5de3ae78d..5c939d6cc 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -21,21 +21,6 @@ jobs:
services:
- mariadb:
- image: mariadb:10.11
- env:
- MARIADB_DATABASE: defaultdb
- MARIADB_USER: testuser
- MARIADB_PASSWORD: testpassword
- MARIADB_ROOT_PASSWORD: rootpassword
- options: >-
- --health-cmd "mysqladmin ping -h localhost -u root -prootpassword"
- --health-interval=10s
- --health-timeout=5s
- --health-retries=5
- ports:
- - 3307:3306
-
mysql:
image: mysql:8.0
env:
@@ -171,7 +156,7 @@ jobs:
run: mvn clean install -pl ojp-jdbc-driver -am -DskipTests -Dgpg.skip=true
- name: Test (ojp-jdbc-driver)
- run: mvn test -pl ojp-jdbc-driver -Dgpg.skip=true
+ run: mvn test -pl ojp-jdbc-driver -Dgpg.skip=true -DenableMariaDBTests=false
- name: Show ojp-server.log
if: always() # ensures it runs even if previous steps fail
diff --git a/.github/workflows/mariadb-testing.yml b/.github/workflows/mariadb-testing.yml
new file mode 100644
index 000000000..dea8c62c0
--- /dev/null
+++ b/.github/workflows/mariadb-testing.yml
@@ -0,0 +1,77 @@
+# This workflow runs only MariaDB integration tests using TestContainers.
+# It disables all other database integration tests to focus on MariaDB testing.
+# TestContainers automatically manages the MariaDB container lifecycle.
+name: MariaDB Integration Tests
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+ workflow_dispatch: # Allow manual triggering
+
+jobs:
+ mariadb-tests:
+ name: MariaDB Integration Tests
+ runs-on: ubuntu-latest
+
+ permissions:
+ contents: read
+
+ strategy:
+ fail-fast: false
+ matrix:
+ java-version: [ 11, 17, 21, 22 ]
+
+ steps:
+ - name: Git checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Set up JDK 22 for build
+ uses: actions/setup-java@v4
+ with:
+ java-version: 22
+ distribution: 'temurin'
+ cache: maven
+
+ - name: Build and Install (ojp-grpc-commons) with JDK 22
+ run: mvn clean install -pl ojp-grpc-commons -am -DskipTests -Dgpg.skip=true
+
+ - name: Test (ojp-grpc-commons) with JDK 22
+ run: mvn test -pl ojp-grpc-commons -Dgpg.skip=true
+
+ - name: Build (ojp-server) with JDK 22
+ run: mvn clean install -pl ojp-server -am -DskipTests -Dgpg.skip=true
+
+ - name: Test and Run (ojp-server)
+ run: |
+ nohup java -jar ojp-server/target/ojp-server-0.2.1-snapshot-shaded.jar > /tmp/ojp-server.log 2>&1 &
+ echo $! > /tmp/ojp-server.pid
+
+ - name: Wait for ojp-server to start
+ run: sleep 10
+
+ - name: Set up JDK ${{ matrix.java-version }} for ojp-jdbc-driver
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ matrix.java-version }}
+ distribution: 'temurin'
+ cache: maven
+
+ - name: Build (ojp-jdbc-driver) with JDK ${{ matrix.java-version }}
+ run: mvn clean install -pl ojp-jdbc-driver -am -DskipTests -Dgpg.skip=true
+
+ - name: Run MariaDB Integration Tests
+ run: |
+ mvn test -pl ojp-jdbc-driver -Dgpg.skip=true \
+ -DenableMariaDBTests=true \
+ -DdisablePostgresTests=true \
+ -DdisableMySQLTests=true \
+ -DdisableCockroachDBTests=true \
+ -Dtest="*MariaDB*,Blob*,BasicCrud*"
+
+ - name: Show ojp-server.log
+ if: always() # ensures it runs even if previous steps fail
+ run: cat /tmp/ojp-server.log || echo "/tmp/ojp-server.log not found"
diff --git a/.github/workflows/oracle-testing.yml b/.github/workflows/oracle-testing.yml
index 5943d4cfe..f2f28a1bf 100644
--- a/.github/workflows/oracle-testing.yml
+++ b/.github/workflows/oracle-testing.yml
@@ -88,7 +88,7 @@ jobs:
-DenableOracleTests=true \
-DdisablePostgresTests=true \
-DdisableMySQLTests=true \
- -DdisableMariaDBTests=true \
+ -DenableMariaDBTests=false \
-DdisableCockroachDBTests=true \
-Dtest="Oracle*"
diff --git a/.github/workflows/sqlserver-testing.yml b/.github/workflows/sqlserver-testing.yml
index 25242ceef..e247b7127 100644
--- a/.github/workflows/sqlserver-testing.yml
+++ b/.github/workflows/sqlserver-testing.yml
@@ -88,7 +88,7 @@ jobs:
-DenableSqlServerTests=true \
-DdisablePostgresTests=true \
-DdisableMySQLTests=true \
- -DdisableMariaDBTests=true \
+ -DenableMariaDBTests=false \
-DdisableCockroachDBTests=true \
-Dtest="SQLServer*"
diff --git a/ojp-jdbc-driver/pom.xml b/ojp-jdbc-driver/pom.xml
index 81b17baaf..1ea03a6c8 100644
--- a/ojp-jdbc-driver/pom.xml
+++ b/ojp-jdbc-driver/pom.xml
@@ -152,6 +152,24 @@
test
+
+
+
+ org.mariadb.jdbc
+ mariadb-java-client
+ 3.5.1
+ test
+
+
+
+
+
+ org.testcontainers
+ mariadb
+ 1.20.4
+ test
+
+
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
index c38a1af22..820092aa0 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
@@ -20,7 +20,7 @@ public class BasicCrudIntegrationTest {
private static boolean isPostgresTestDisabled;
private static boolean isMySQLTestDisabled;
- private static boolean isMariaDBTestDisabled;
+ private static boolean isMariaDBTestEnabled;
private static boolean isCockroachDBTestDisabled;
private static boolean isOracleTestEnabled;
private static boolean isSqlServerTestEnabled;
@@ -31,7 +31,7 @@ public class BasicCrudIntegrationTest {
public static void setup() {
isPostgresTestDisabled = Boolean.parseBoolean(System.getProperty("disablePostgresTests", "false"));
isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
- isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
isCockroachDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
isOracleTestEnabled = Boolean.parseBoolean(System.getProperty("enableOracleTests", "false"));
isSqlServerTestEnabled = Boolean.parseBoolean(System.getProperty("enableSqlServerTests", "false"));
@@ -53,9 +53,9 @@ public void crudTestSuccessful(String driverClass, String url, String user, Stri
tablePrefix = "mysql_";
}
- // Skip MariaDB tests if disabled
- if (url.toLowerCase().contains("mariadb") && isMariaDBTestDisabled) {
- Assumptions.assumeFalse(true, "Skipping MariaDB tests");
+ // Skip MariaDB tests if not enabled
+ if (url.toLowerCase().contains("mariadb") && !isMariaDBTestEnabled) {
+ Assumptions.assumeFalse(true, "Skipping MariaDB tests - not enabled");
tablePrefix = "mariadb_";
}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
index ac46b5c0e..43967cbf0 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
@@ -2,9 +2,10 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -19,10 +20,11 @@
import static openjproxy.helpers.SqlHelper.executeUpdate;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class BlobIntegrationTest {
private static boolean isMySQLTestDisabled;
- private static boolean isMariaDBTestDisabled;
+ private static boolean isMariaDBTestEnabled;
private static boolean isOracleTestEnabled;
private String tableName;
private Connection conn;
@@ -30,7 +32,7 @@ public class BlobIntegrationTest {
@BeforeAll
public static void checkTestConfiguration() {
isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
- isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
isOracleTestEnabled = Boolean.parseBoolean(System.getProperty("enableOracleTests", "false"));
}
@@ -41,7 +43,7 @@ public void setUp(String driverClass, String url, String user, String pwd) throw
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
this.tableName += "_mysql";
} else if (url.toLowerCase().contains("mariadb")) {
- assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+ assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
this.tableName += "_mariadb";
} else if (url.toLowerCase().contains("oracle")) {
assumeFalse(!isOracleTestEnabled, "Oracle tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java
index 32183d468..9ed9cc213 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java
@@ -1,11 +1,13 @@
package openjproxy.jdbc;
import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
@@ -14,21 +16,22 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLDatabaseMetaDataExtensiveTests {
private static boolean isMySQLTestDisabled;
- private static boolean isMariaDBTestDisabled;
+ private static boolean isMariaDBTestEnabled;
private static Connection connection;
@BeforeAll
public static void checkTestConfiguration() {
isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
- isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ 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(isMySQLTestDisabled, "MySQL tests are disabled");
- assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+ assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
connection = DriverManager.getConnection(url, user, password);
TestDBUtils.createBasicTestTable(connection, "mysql_db_metadata_test", TestDBUtils.SqlSyntax.MYSQL, true);
}
@@ -39,9 +42,9 @@ public static void teardown() throws Exception {
}
@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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
@@ -67,9 +70,9 @@ 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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
@@ -97,9 +100,9 @@ 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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
@@ -118,9 +121,9 @@ 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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
@@ -136,9 +139,9 @@ 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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
@@ -159,9 +162,9 @@ 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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
@@ -180,9 +183,9 @@ 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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
@@ -203,9 +206,9 @@ 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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
@@ -230,9 +233,9 @@ 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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
@@ -254,9 +257,9 @@ 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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
@@ -279,9 +282,9 @@ 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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
@@ -307,9 +310,9 @@ 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);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
index 76cc05d0a..9e8c5ff95 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
@@ -1,12 +1,14 @@
package openjproxy.jdbc;
import lombok.SneakyThrows;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.Assert;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.CallableStatement;
import java.sql.Connection;
@@ -24,22 +26,22 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLMariaDBConnectionExtensiveTests {
private static boolean isMySQLTestDisabled;
- private static boolean isMariaDBTestDisabled;
+ private static boolean isMariaDBTestEnabled;
private Connection connection;
@BeforeAll
public static void checkTestConfiguration() {
isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
- isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
}
@SneakyThrows
- public void setUp(String driverClass, String url, String user, String password) throws SQLException {
+ public void setUp(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
- assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
connection = DriverManager.getConnection(url, user, password);
}
@@ -49,8 +51,8 @@ public void tearDown() throws SQLException {
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testCreateStatement(String driverClass, String url, String user, String password) throws SQLException {
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testCreateStatement(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
Statement statement = connection.createStatement();
@@ -60,7 +62,7 @@ public void testCreateStatement(String driverClass, String url, String user, Str
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testPrepareStatement(String driverClass, String url, String user, String password) throws SQLException {
+ public void testPrepareStatement(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
PreparedStatement preparedStatement = connection.prepareStatement("SELECT 1");
@@ -70,7 +72,7 @@ public void testPrepareStatement(String driverClass, String url, String user, St
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testPrepareCall(String driverClass, String url, String user, String password) throws SQLException {
+ public void testPrepareCall(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
// MySQL supports callable statements, though syntax may differ
@@ -86,7 +88,7 @@ public void testPrepareCall(String driverClass, String url, String user, String
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testNativeSQL(String driverClass, String url, String user, String password) throws SQLException {
+ public void testNativeSQL(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
String nativeSQL = connection.nativeSQL("SELECT {fn NOW()}");
@@ -97,7 +99,7 @@ public void testNativeSQL(String driverClass, String url, String user, String pa
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testAutoCommit(String driverClass, String url, String user, String password) throws SQLException {
+ public void testAutoCommit(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
// Test getting and setting auto-commit
@@ -115,7 +117,7 @@ public void testAutoCommit(String driverClass, String url, String user, String p
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testCommitAndRollback(String driverClass, String url, String user, String password) throws SQLException {
+ public void testCommitAndRollback(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
// Test commit and rollback operations
@@ -130,7 +132,7 @@ public void testCommitAndRollback(String driverClass, String url, String user, S
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testIsClosed(String driverClass, String url, String user, String password) throws SQLException {
+ public void testIsClosed(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
Assert.assertEquals(false, connection.isClosed());
@@ -141,7 +143,7 @@ public void testIsClosed(String driverClass, String url, String user, String pas
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testGetMetaData(String driverClass, String url, String user, String password) throws SQLException {
+ public void testGetMetaData(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
DatabaseMetaData metaData = connection.getMetaData();
@@ -157,7 +159,7 @@ public void testGetMetaData(String driverClass, String url, String user, String
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testReadOnly(String driverClass, String url, String user, String password) throws SQLException {
+ public void testReadOnly(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
// Test read-only mode
@@ -178,7 +180,7 @@ public void testReadOnly(String driverClass, String url, String user, String pas
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testCatalog(String driverClass, String url, String user, String password) throws SQLException {
+ public void testCatalog(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
String catalog = connection.getCatalog();
@@ -193,7 +195,7 @@ public void testCatalog(String driverClass, String url, String user, String pass
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testTransactionIsolation(String driverClass, String url, String user, String password) throws SQLException {
+ public void testTransactionIsolation(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
int isolationLevel = connection.getTransactionIsolation();
@@ -209,7 +211,7 @@ public void testTransactionIsolation(String driverClass, String url, String user
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testWarnings(String driverClass, String url, String user, String password) throws SQLException {
+ public void testWarnings(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
// Test warning operations
@@ -222,7 +224,7 @@ public void testWarnings(String driverClass, String url, String user, String pas
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testCreateStatementWithParameters(String driverClass, String url, String user, String password) throws SQLException {
+ public void testCreateStatementWithParameters(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
Statement statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
@@ -236,7 +238,7 @@ public void testCreateStatementWithParameters(String driverClass, String url, St
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testPrepareStatementWithParameters(String driverClass, String url, String user, String password) throws SQLException {
+ public void testPrepareStatementWithParameters(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
PreparedStatement ps = connection.prepareStatement("SELECT 1", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
@@ -250,7 +252,7 @@ public void testPrepareStatementWithParameters(String driverClass, String url, S
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testHoldability(String driverClass, String url, String user, String password) throws SQLException {
+ public void testHoldability(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
int holdability = connection.getHoldability();
@@ -263,7 +265,7 @@ public void testHoldability(String driverClass, String url, String user, String
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testSavepoints(String driverClass, String url, String user, String password) throws SQLException {
+ public void testSavepoints(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
connection.setAutoCommit(false);
@@ -289,7 +291,7 @@ public void testSavepoints(String driverClass, String url, String user, String p
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testClientInfo(String driverClass, String url, String user, String password) throws SQLException {
+ public void testClientInfo(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
Properties clientInfo = connection.getClientInfo();
@@ -306,7 +308,7 @@ public void testClientInfo(String driverClass, String url, String user, String p
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testValid(String driverClass, String url, String user, String password) throws SQLException {
+ public void testValid(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
boolean isValid = connection.isValid(5);
@@ -320,7 +322,7 @@ public void testValid(String driverClass, String url, String user, String passwo
@ParameterizedTest
@CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testUnsupportedOperations(String driverClass, String url, String user, String password) throws SQLException {
+ public void testUnsupportedOperations(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
setUp(driverClass, url, user, password);
// Test operations that might not be supported
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java
index 64aa0d986..f948eee82 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java
@@ -1,10 +1,12 @@
package openjproxy.jdbc;
import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.math.BigDecimal;
import java.sql.Connection;
@@ -19,22 +21,23 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLMultipleTypesIntegrationTest {
private static boolean isMySQLTestDisabled;
- private static boolean isMariaDBTestDisabled;
+ private static boolean isMariaDBTestEnabled;
@BeforeAll
public static void checkTestConfiguration() {
isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
- isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void typesCoverageTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, ParseException {
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void typesCoverageTestSuccessful(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException, ParseException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
- assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+ assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
Connection conn = DriverManager.getConnection(url, user, pwd);
@@ -119,7 +122,7 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void mysqlSpecificTypesTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java
index b39d773e5..2fdde9784 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java
@@ -1,12 +1,14 @@
package openjproxy.jdbc;
import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.io.ByteArrayInputStream;
import java.io.StringReader;
@@ -25,22 +27,23 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLPreparedStatementExtensiveTests {
private static boolean isMySQLTestDisabled;
- private static boolean isMariaDBTestDisabled;
+ private static boolean isMariaDBTestEnabled;
private Connection connection;
private PreparedStatement ps;
@BeforeAll
public static void checkTestConfiguration() {
isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
- isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ 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(isMySQLTestDisabled, "MySQL tests are disabled");
- assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+ assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
connection = DriverManager.getConnection(url, user, password);
Statement stmt = connection.createStatement();
@@ -65,9 +68,9 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testBasicParameterSetters(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testBasicParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -89,9 +92,9 @@ public void testBasicParameterSetters(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testNumericParameterSetters(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testNumericParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -118,9 +121,9 @@ public void testNumericParameterSetters(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testDateTimeParameterSetters(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testDateTimeParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, dt, tm, ts) VALUES (?, ?, ?, ?, ?)");
@@ -147,9 +150,9 @@ public void testDateTimeParameterSetters(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testBinaryParameterSetters(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testBinaryParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, data) VALUES (?, ?, ?)");
@@ -176,9 +179,9 @@ public void testBinaryParameterSetters(String driverClass, String url, String us
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testTextParameterSetters(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testTextParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, info) VALUES (?, ?, ?)");
@@ -204,9 +207,9 @@ public void testTextParameterSetters(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testNullParameterSetters(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testNullParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age, data, info) VALUES (?, ?, ?, ?, ?)");
@@ -231,9 +234,9 @@ public void testNullParameterSetters(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testExecuteQuery(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecuteQuery(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
// Insert test data
ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -256,9 +259,9 @@ public void testExecuteQuery(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testExecuteUpdate(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecuteUpdate(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
// Test INSERT
ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -280,9 +283,9 @@ public void testExecuteUpdate(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testExecute(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecute(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
// Test execute with query
ps = connection.prepareStatement("SELECT COUNT(*) FROM mysql_prepared_stmt_test");
@@ -302,9 +305,9 @@ public void testExecute(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testBatch(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testBatch(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -340,9 +343,9 @@ public void testBatch(String driverClass, String url, String user, String passwo
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testClearParameters(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testClearParameters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
ps.setInt(1, 90);
@@ -356,9 +359,9 @@ public void testClearParameters(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testMetaData(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testMetaData(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
ps = connection.prepareStatement("SELECT id, name, age FROM mysql_prepared_stmt_test WHERE id = ?");
ResultSetMetaData metaData = ps.getMetaData();
@@ -370,9 +373,9 @@ public void testMetaData(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testParameterMetaData(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testParameterMetaData(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
try {
@@ -387,9 +390,9 @@ public void testParameterMetaData(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testGeneratedKeys(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGeneratedKeys(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
// Create table with auto-increment
Statement stmt = connection.createStatement();
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
index 3078720d0..b1aede668 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
@@ -2,8 +2,9 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -17,22 +18,23 @@
* Tests for MySQL-specific functionality that is not covered by database-agnostic tests.
* Includes features like ON DUPLICATE KEY UPDATE, SELECT ... FOR UPDATE, SHOW commands, etc.
*/
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLSpecificFeaturesIntegrationTest {
private static boolean isMySQLTestDisabled;
- private static boolean isMariaDBTestDisabled;
+ private static boolean isMariaDBTestEnabled;
@BeforeAll
public static void checkTestConfiguration() {
isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
- isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void onDuplicateKeyUpdateTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
- assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+ assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
Connection conn = DriverManager.getConnection(url, user, pwd);
@@ -74,7 +76,7 @@ public void onDuplicateKeyUpdateTestSuccessful(String driverClass, String url, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void selectForUpdateTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
@@ -126,7 +128,7 @@ public void selectForUpdateTestSuccessful(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void showTablesTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
@@ -163,7 +165,7 @@ public void showTablesTestSuccessful(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void autoIncrementAndLastInsertIdTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
@@ -216,7 +218,7 @@ public void autoIncrementAndLastInsertIdTestSuccessful(String driverClass, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void mysqlInformationSchemaTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java
index cfd354131..a1a674992 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java
@@ -1,11 +1,13 @@
package openjproxy.jdbc;
import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -15,22 +17,23 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLStatementExtensiveTests {
private static boolean isMySQLTestDisabled;
- private static boolean isMariaDBTestDisabled;
+ private static boolean isMariaDBTestEnabled;
private Connection connection;
private Statement statement;
@BeforeAll
public static void checkTestConfiguration() {
isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
- isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ 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(isMySQLTestDisabled, "MySQL tests are disabled");
- assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+ assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
connection = DriverManager.getConnection(url, user, password);
statement = connection.createStatement();
@@ -43,9 +46,9 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testExecuteQuery(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecuteQuery(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
ResultSet rs = statement.executeQuery("SELECT * FROM mysql_statement_test");
Assert.assertNotNull(rs);
Assert.assertTrue(rs.next());
@@ -53,9 +56,9 @@ public void testExecuteQuery(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testExecuteUpdate(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecuteUpdate(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
int rows = statement.executeUpdate("UPDATE mysql_statement_test SET name = 'Updated Alice' WHERE id = 1");
Assert.assertEquals(1, rows);
@@ -66,18 +69,18 @@ public void testExecuteUpdate(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testClose(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testClose(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
Assert.assertFalse(statement.isClosed());
statement.close();
Assert.assertTrue(statement.isClosed());
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testMaxFieldSize(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testMaxFieldSize(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
int orig = statement.getMaxFieldSize();
if (url.toLowerCase().contains("mysql"))
Assert.assertTrue(orig > 0);
@@ -91,9 +94,9 @@ public void testMaxFieldSize(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testMaxRows(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testMaxRows(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
Assert.assertEquals(0, statement.getMaxRows());
statement.setMaxRows(10);
Assert.assertEquals(10, statement.getMaxRows());
@@ -102,9 +105,9 @@ public void testMaxRows(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testQueryTimeout(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testQueryTimeout(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
Assert.assertEquals(0, statement.getQueryTimeout());
statement.setQueryTimeout(30);
Assert.assertEquals(30, statement.getQueryTimeout());
@@ -113,9 +116,9 @@ public void testQueryTimeout(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testWarnings(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testWarnings(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
// Initial warnings might be null
statement.getWarnings();
statement.clearWarnings();
@@ -123,9 +126,9 @@ public void testWarnings(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testExecute(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecute(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
boolean hasResultSet = statement.execute("SELECT * FROM mysql_statement_test");
Assert.assertTrue(hasResultSet);
@@ -140,9 +143,9 @@ public void testExecute(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testGetResultSet(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGetResultSet(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
statement.execute("SELECT * FROM mysql_statement_test");
ResultSet rs = statement.getResultSet();
Assert.assertNotNull(rs);
@@ -150,9 +153,9 @@ public void testGetResultSet(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testGetUpdateCount(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGetUpdateCount(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
statement.execute("UPDATE mysql_statement_test SET name = 'Test Update' WHERE id = 1");
Assert.assertEquals(1, statement.getUpdateCount());
@@ -161,9 +164,9 @@ public void testGetUpdateCount(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testGetMoreResults(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGetMoreResults(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
statement.execute("SELECT * FROM mysql_statement_test");
if (url.toLowerCase().contains("mysql"))
Assert.assertFalse(statement.getMoreResults());
@@ -172,18 +175,18 @@ public void testGetMoreResults(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testFetchDirection(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testFetchDirection(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
Assert.assertEquals(ResultSet.FETCH_FORWARD, statement.getFetchDirection());
statement.setFetchDirection(ResultSet.FETCH_FORWARD);
Assert.assertEquals(ResultSet.FETCH_FORWARD, statement.getFetchDirection());
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testFetchSize(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testFetchSize(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
int originalFetchSize = statement.getFetchSize();
statement.setFetchSize(100);
Assert.assertEquals(100, statement.getFetchSize());
@@ -191,17 +194,17 @@ public void testFetchSize(String driverClass, String url, String user, String pa
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testResultSetConcurrency(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testResultSetConcurrency(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
int concurrency = statement.getResultSetConcurrency();
Assert.assertTrue(concurrency == ResultSet.CONCUR_READ_ONLY || concurrency == ResultSet.CONCUR_UPDATABLE);
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testResultSetType(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testResultSetType(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
int type = statement.getResultSetType();
Assert.assertTrue(type == ResultSet.TYPE_FORWARD_ONLY ||
type == ResultSet.TYPE_SCROLL_INSENSITIVE ||
@@ -209,9 +212,9 @@ public void testResultSetType(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testAddBatch(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testAddBatch(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
statement.addBatch("INSERT INTO mysql_statement_test (id, name) VALUES (10, 'Batch1')");
statement.addBatch("INSERT INTO mysql_statement_test (id, name) VALUES (11, 'Batch2')");
statement.clearBatch();
@@ -223,16 +226,16 @@ public void testAddBatch(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testGetConnection(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGetConnection(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
Assert.assertSame(connection, statement.getConnection());
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testGetGeneratedKeys(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGetGeneratedKeys(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
// Create table with auto-increment
try {
@@ -253,9 +256,9 @@ public void testGetGeneratedKeys(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testExecuteUpdateWithGeneratedKeys(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecuteUpdateWithGeneratedKeys(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
// Create table with auto-increment
try{
@@ -278,35 +281,35 @@ public void testExecuteUpdateWithGeneratedKeys(String driverClass, String url, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testResultSetHoldability(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testResultSetHoldability(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
int holdability = statement.getResultSetHoldability();
Assert.assertTrue(holdability == ResultSet.HOLD_CURSORS_OVER_COMMIT ||
holdability == ResultSet.CLOSE_CURSORS_AT_COMMIT);
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testCancel(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testCancel(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
// Test that cancel doesn't throw an exception
statement.cancel();
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testEscapeProcessing(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testEscapeProcessing(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
statement.setEscapeProcessing(true);
statement.setEscapeProcessing(false);
// Just verify these calls don't throw exceptions
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testCursorName(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testCursorName(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
// MySQL may not support named cursors in all configurations
if (url.toLowerCase().contains("mysql"))
statement.setCursorName("test_cursor");
@@ -315,9 +318,9 @@ public void testCursorName(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
- public void testPoolable(String driverClass, String url, String user, String password) throws Exception {
- this.setUp(driverClass, url, user, password);
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testPoolable(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
boolean poolable = statement.isPoolable();
statement.setPoolable(!poolable);
if (url.toLowerCase().contains("mysql"))
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java
new file mode 100644
index 000000000..86b360c72
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java
@@ -0,0 +1,57 @@
+package openjproxy.jdbc.testutil;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+import java.util.stream.Stream;
+
+/**
+ * Custom ArgumentsProvider for MariaDB integration tests.
+ * Provides connection details from TestContainers when MariaDB tests are enabled.
+ * This allows tests to use TestContainers instead of external MariaDB instances.
+ */
+public class MariaDBConnectionProvider implements ArgumentsProvider {
+
+ // JDBC URL prefix to be removed when building OJP URL
+ private static final String JDBC_PREFIX = "jdbc:";
+
+ // OJP proxy server configuration - can be overridden via system property
+ private static final String OJP_PROXY_HOST = System.getProperty("ojp.proxy.host", "localhost");
+ private static final String OJP_PROXY_PORT = System.getProperty("ojp.proxy.port", "1059");
+ private static final String OJP_PROXY_ADDRESS = OJP_PROXY_HOST + ":" + OJP_PROXY_PORT;
+
+ @Override
+ public Stream extends Arguments> provideArguments(ExtensionContext context) {
+ if (!MariaDBTestContainer.isEnabled()) {
+ // Return empty stream when tests are disabled
+ return Stream.empty();
+ }
+
+ // Initialize and start the TestContainer
+ MariaDBTestContainer.getInstance();
+
+ // Get connection details from the TestContainer
+ String containerJdbcUrl = MariaDBTestContainer.getJdbcUrl();
+ String username = MariaDBTestContainer.getUsername();
+ String password = MariaDBTestContainer.getPassword();
+
+ // Build OJP JDBC URL from the container URL
+ // TestContainer URL format: jdbc:mariadb://localhost:RANDOM_PORT/defaultdb
+ // OJP wraps this by removing 'jdbc:' and prepending 'jdbc:ojp[host:port]_'
+ // Result format: jdbc:ojp[localhost:1059]_mariadb://localhost:RANDOM_PORT/defaultdb
+ String driverClass = "org.openjproxy.jdbc.Driver";
+
+ // Remove "jdbc:" prefix and add OJP wrapper
+ String urlWithoutPrefix = containerJdbcUrl.startsWith(JDBC_PREFIX)
+ ? containerJdbcUrl.substring(JDBC_PREFIX.length())
+ : containerJdbcUrl;
+ String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
+
+ // Return a single set of arguments with the TestContainer connection details
+ // The fifth parameter (false) matches the CSV format which had a boolean flag
+ return Stream.of(
+ Arguments.of(driverClass, ojpUrl, username, password, false)
+ );
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java
new file mode 100644
index 000000000..8fa70690d
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java
@@ -0,0 +1,103 @@
+package openjproxy.jdbc.testutil;
+
+import lombok.extern.slf4j.Slf4j;
+import org.testcontainers.containers.MariaDBContainer;
+
+/**
+ * Singleton MariaDB test container for all MariaDB integration tests.
+ * This ensures that all tests share the same MariaDB instance to improve test performance
+ * and reduce resource usage.
+ */
+@Slf4j
+public class MariaDBTestContainer {
+
+ // MariaDB Docker image version
+ private static final String MARIADB_IMAGE = "mariadb:10.11";
+ private static final String TEST_DATABASE = "defaultdb";
+ private static final String TEST_USERNAME = "testuser";
+ private static final String TEST_PASSWORD = "testpassword";
+
+ private static MariaDBContainer> container;
+ private static boolean isStarted = false;
+ private static boolean shutdownHookRegistered = false;
+
+ /**
+ * Gets or creates the shared MariaDB test container instance.
+ * The container is automatically started on first access.
+ *
+ * @return the shared MariaDBContainer instance
+ */
+ public static synchronized MariaDBContainer> getInstance() {
+ if (container == null) {
+ container = new MariaDBContainer<>(MARIADB_IMAGE)
+ .withDatabaseName(TEST_DATABASE)
+ .withUsername(TEST_USERNAME)
+ .withPassword(TEST_PASSWORD);
+ }
+
+ if (!isStarted) {
+ log.info("Starting MariaDB TestContainer...");
+ container.start();
+ isStarted = true;
+ log.info("MariaDB TestContainer started successfully at: {}", container.getJdbcUrl());
+
+ // Add shutdown hook to stop container when JVM exits
+ if (!shutdownHookRegistered) {
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ if (container != null && container.isRunning()) {
+ log.info("Stopping MariaDB TestContainer...");
+ container.stop();
+ }
+ }));
+ shutdownHookRegistered = true;
+ }
+ }
+
+ return container;
+ }
+
+ /**
+ * Gets the JDBC URL for connecting to the test container.
+ *
+ * @return JDBC URL string
+ */
+ public static String getJdbcUrl() {
+ return getInstance().getJdbcUrl();
+ }
+
+ /**
+ * Gets the username for connecting to the test container.
+ *
+ * @return username string
+ */
+ public static String getUsername() {
+ return getInstance().getUsername();
+ }
+
+ /**
+ * Gets the password for connecting to the test container.
+ *
+ * @return password string
+ */
+ public static String getPassword() {
+ return getInstance().getPassword();
+ }
+
+ /**
+ * Gets the database name for the test container.
+ *
+ * @return database name string
+ */
+ public static String getDatabaseName() {
+ return getInstance().getDatabaseName();
+ }
+
+ /**
+ * Checks if MariaDB tests are enabled via system property.
+ *
+ * @return true if MariaDB tests should run
+ */
+ public static boolean isEnabled() {
+ return Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
+ }
+}
From 0fd807bc2df2cad0e1229a62bfc0a97a6dec1d55 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:21:44 +0000
Subject: [PATCH 25/49] Remove Postgres CSV files and fix compilation error
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../testutil/PostgresConnectionWithRecordCountsProvider.java | 1 +
ojp-jdbc-driver/src/test/resources/postgres_connection.csv | 1 -
ojp-jdbc-driver/src/test/resources/postgres_xa_connection.csv | 1 -
3 files changed, 1 insertion(+), 2 deletions(-)
delete mode 100644 ojp-jdbc-driver/src/test/resources/postgres_connection.csv
delete mode 100644 ojp-jdbc-driver/src/test/resources/postgres_xa_connection.csv
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionWithRecordCountsProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionWithRecordCountsProvider.java
index 72080d5e7..a570fafcd 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionWithRecordCountsProvider.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/PostgresConnectionWithRecordCountsProvider.java
@@ -51,6 +51,7 @@ public Stream extends Arguments> provideArguments(ExtensionContext context) {
// Return arguments for each record count with the isXA boolean parameter
// The isXA parameter is kept for compatibility but is not actively used by the test
return Arrays.stream(RECORD_COUNTS)
+ .boxed()
.flatMap(count -> Stream.of(
Arguments.of(count, driverClass, ojpUrl, username, password, false),
Arguments.of(count, driverClass, ojpUrl, username, password, true)
diff --git a/ojp-jdbc-driver/src/test/resources/postgres_connection.csv b/ojp-jdbc-driver/src/test/resources/postgres_connection.csv
deleted file mode 100644
index 43abe5cb7..000000000
--- a/ojp-jdbc-driver/src/test/resources/postgres_connection.csv
+++ /dev/null
@@ -1 +0,0 @@
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_postgresql://localhost:5432/defaultdb,testuser,testpassword,false
\ No newline at end of file
diff --git a/ojp-jdbc-driver/src/test/resources/postgres_xa_connection.csv b/ojp-jdbc-driver/src/test/resources/postgres_xa_connection.csv
deleted file mode 100644
index ca003e3f5..000000000
--- a/ojp-jdbc-driver/src/test/resources/postgres_xa_connection.csv
+++ /dev/null
@@ -1 +0,0 @@
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_postgresql://localhost:5432/defaultdb,testuser,testpassword
\ No newline at end of file
From 870697d166de9643a4bfba919bfa92250f4c3a30 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:22:21 +0000
Subject: [PATCH 26/49] Fix missing import in
MySQLSpecificFeaturesIntegrationTest
- Added missing MySQLConnectionProvider import
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
index 99c649222..92d2b059f 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
@@ -1,5 +1,6 @@
package openjproxy.jdbc;
+import openjproxy.jdbc.testutil.MySQLConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
From 1a38ec510d0618e99ab03d3684f887613c381423 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:23:37 +0000
Subject: [PATCH 27/49] Fix inverted flag logic in Postgres test files
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../java/openjproxy/jdbc/PostgresConnectionExtensiveTests.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresConnectionExtensiveTests.java
index f4edf4864..e6f299576 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresConnectionExtensiveTests.java
@@ -46,7 +46,7 @@ public class PostgresConnectionExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
@SneakyThrows
From 21477926f26deacd2aeff1928f0aad0d2b0d4baf Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:24:23 +0000
Subject: [PATCH 28/49] Fix test compilation issues
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../openjproxy/jdbc/BlobIntegrationTest.java | 6 +-
.../MySQLMariaDBConnectionExtensiveTests.java | 74 +++++++++----------
.../MySQLSpecificFeaturesIntegrationTest.java | 1 +
3 files changed, 40 insertions(+), 41 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
index 43967cbf0..38d1be790 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
@@ -2,10 +2,9 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.ArgumentsSource;
+import org.junit.jupiter.params.provider.CsvFileSource;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -20,7 +19,6 @@
import static openjproxy.helpers.SqlHelper.executeUpdate;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
-@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class BlobIntegrationTest {
private static boolean isMySQLTestDisabled;
@@ -43,7 +41,7 @@ public void setUp(String driverClass, String url, String user, String pwd) throw
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
this.tableName += "_mysql";
} else if (url.toLowerCase().contains("mariadb")) {
- assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
+ assumeFalse(!isMariaDBTestEnabled, "MariaDB tests are not enabled");
this.tableName += "_mariadb";
} else if (url.toLowerCase().contains("oracle")) {
assumeFalse(!isOracleTestEnabled, "Oracle tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
index 9e8c5ff95..86a0b753d 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
@@ -53,7 +53,7 @@ public void tearDown() throws SQLException {
@ParameterizedTest
@ArgumentsSource(MariaDBConnectionProvider.class)
public void testCreateStatement(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
Statement statement = connection.createStatement();
Assert.assertNotNull(statement);
@@ -61,9 +61,9 @@ public void testCreateStatement(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testPrepareStatement(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
PreparedStatement preparedStatement = connection.prepareStatement("SELECT 1");
Assert.assertNotNull(preparedStatement);
@@ -71,9 +71,9 @@ public void testPrepareStatement(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testPrepareCall(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
// MySQL supports callable statements, though syntax may differ
try {
@@ -87,9 +87,9 @@ public void testPrepareCall(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testNativeSQL(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
String nativeSQL = connection.nativeSQL("SELECT {fn NOW()}");
Assert.assertNotNull(nativeSQL);
@@ -98,9 +98,9 @@ public void testNativeSQL(String driverClass, String url, String user, String pa
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testAutoCommit(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
// Test getting and setting auto-commit
boolean originalAutoCommit = connection.getAutoCommit();
@@ -116,9 +116,9 @@ public void testAutoCommit(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testCommitAndRollback(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
// Test commit and rollback operations
connection.setAutoCommit(false);
@@ -131,9 +131,9 @@ public void testCommitAndRollback(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testIsClosed(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
Assert.assertEquals(false, connection.isClosed());
@@ -142,9 +142,9 @@ public void testIsClosed(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testGetMetaData(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
DatabaseMetaData metaData = connection.getMetaData();
Assert.assertNotNull(metaData);
@@ -158,9 +158,9 @@ public void testGetMetaData(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testReadOnly(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
// Test read-only mode
boolean originalReadOnly = connection.isReadOnly();
@@ -179,9 +179,9 @@ public void testReadOnly(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testCatalog(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
String catalog = connection.getCatalog();
// Catalog might be null or the database name
@@ -194,9 +194,9 @@ public void testCatalog(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testTransactionIsolation(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
int isolationLevel = connection.getTransactionIsolation();
Assert.assertTrue(isolationLevel >= Connection.TRANSACTION_NONE && isolationLevel <= Connection.TRANSACTION_SERIALIZABLE);
@@ -210,9 +210,9 @@ public void testTransactionIsolation(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testWarnings(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
// Test warning operations
SQLWarning warnings = connection.getWarnings();
@@ -223,9 +223,9 @@ public void testWarnings(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testCreateStatementWithParameters(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
Statement statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
Assert.assertNotNull(statement);
@@ -237,9 +237,9 @@ public void testCreateStatementWithParameters(String driverClass, String url, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testPrepareStatementWithParameters(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
PreparedStatement ps = connection.prepareStatement("SELECT 1", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
Assert.assertNotNull(ps);
@@ -251,9 +251,9 @@ public void testPrepareStatementWithParameters(String driverClass, String url, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testHoldability(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
int holdability = connection.getHoldability();
Assert.assertTrue(holdability == ResultSet.HOLD_CURSORS_OVER_COMMIT || holdability == ResultSet.CLOSE_CURSORS_AT_COMMIT);
@@ -264,9 +264,9 @@ public void testHoldability(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testSavepoints(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
connection.setAutoCommit(false);
@@ -290,9 +290,9 @@ public void testSavepoints(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testClientInfo(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
Properties clientInfo = connection.getClientInfo();
Assert.assertNotNull(clientInfo);
@@ -307,9 +307,9 @@ public void testClientInfo(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testValid(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
boolean isValid = connection.isValid(5);
Assert.assertTrue(isValid);
@@ -321,9 +321,9 @@ public void testValid(String driverClass, String url, String user, String passwo
}
@ParameterizedTest
- @CsvFileSource(resources = "/mysql_mariadb_connection.csv")
+ @ArgumentsSource(MariaDBConnectionProvider.class)
public void testUnsupportedOperations(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- setUp(driverClass, url, user, password);
+ setUp(driverClass, url, user, password, isXA);
// Test operations that might not be supported
Assert.assertThrows(SQLException.class, () -> {
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
index b1aede668..383b0c21a 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
@@ -5,6 +5,7 @@
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
import java.sql.Connection;
import java.sql.DriverManager;
From 1ba8e366e15e75b077c2942a4d386602b1493aaa Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:25:55 +0000
Subject: [PATCH 29/49] Remove CSV file and fix code review issues
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../jdbc/MySQLDatabaseMetaDataExtensiveTests.java | 4 ----
.../jdbc/MySQLMariaDBConnectionExtensiveTests.java | 3 ---
.../jdbc/MySQLMultipleTypesIntegrationTest.java | 5 -----
.../jdbc/MySQLPreparedStatementExtensiveTests.java | 4 ----
.../jdbc/MySQLSpecificFeaturesIntegrationTest.java | 8 --------
.../openjproxy/jdbc/MySQLStatementExtensiveTests.java | 4 ----
.../jdbc/testutil/MariaDBConnectionProvider.java | 3 ++-
.../src/test/resources/mysql_mariadb_connection.csv | 2 --
8 files changed, 2 insertions(+), 31 deletions(-)
delete mode 100644 ojp-jdbc-driver/src/test/resources/mysql_mariadb_connection.csv
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java
index 9ed9cc213..506f58af9 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLDatabaseMetaDataExtensiveTests.java
@@ -19,19 +19,15 @@
@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLDatabaseMetaDataExtensiveTests {
- private static boolean isMySQLTestDisabled;
private static boolean isMariaDBTestEnabled;
private static Connection connection;
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
}
public void setUp(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
- assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
- assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
connection = DriverManager.getConnection(url, user, password);
TestDBUtils.createBasicTestTable(connection, "mysql_db_metadata_test", TestDBUtils.SqlSyntax.MYSQL, true);
}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
index 86a0b753d..8a5c9d62c 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMariaDBConnectionExtensiveTests.java
@@ -29,19 +29,16 @@
@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLMariaDBConnectionExtensiveTests {
- private static boolean isMySQLTestDisabled;
private static boolean isMariaDBTestEnabled;
private Connection connection;
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
}
@SneakyThrows
public void setUp(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
- assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
connection = DriverManager.getConnection(url, user, password);
}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java
index f948eee82..e2f6d53ed 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLMultipleTypesIntegrationTest.java
@@ -24,20 +24,16 @@
@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLMultipleTypesIntegrationTest {
- private static boolean isMySQLTestDisabled;
private static boolean isMariaDBTestEnabled;
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
}
@ParameterizedTest
@ArgumentsSource(MariaDBConnectionProvider.class)
public void typesCoverageTestSuccessful(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException, ParseException {
- assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
- assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
Connection conn = DriverManager.getConnection(url, user, pwd);
@@ -124,7 +120,6 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
@ParameterizedTest
@ArgumentsSource(MariaDBConnectionProvider.class)
public void mysqlSpecificTypesTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
- assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
Connection conn = DriverManager.getConnection(url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java
index 2fdde9784..e26235a8d 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLPreparedStatementExtensiveTests.java
@@ -30,20 +30,16 @@
@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLPreparedStatementExtensiveTests {
- private static boolean isMySQLTestDisabled;
private static boolean isMariaDBTestEnabled;
private Connection connection;
private PreparedStatement ps;
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
}
public void setUp(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
- assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
- assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
connection = DriverManager.getConnection(url, user, password);
Statement stmt = connection.createStatement();
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
index 383b0c21a..9c4cff30c 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLSpecificFeaturesIntegrationTest.java
@@ -22,20 +22,16 @@
@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLSpecificFeaturesIntegrationTest {
- private static boolean isMySQLTestDisabled;
private static boolean isMariaDBTestEnabled;
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
}
@ParameterizedTest
@ArgumentsSource(MariaDBConnectionProvider.class)
public void onDuplicateKeyUpdateTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
- assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
- assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
Connection conn = DriverManager.getConnection(url, user, pwd);
@@ -79,7 +75,6 @@ public void onDuplicateKeyUpdateTestSuccessful(String driverClass, String url, S
@ParameterizedTest
@ArgumentsSource(MariaDBConnectionProvider.class)
public void selectForUpdateTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
- assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
Connection conn = DriverManager.getConnection(url, user, pwd);
@@ -131,7 +126,6 @@ public void selectForUpdateTestSuccessful(String driverClass, String url, String
@ParameterizedTest
@ArgumentsSource(MariaDBConnectionProvider.class)
public void showTablesTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
- assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
Connection conn = DriverManager.getConnection(url, user, pwd);
@@ -168,7 +162,6 @@ public void showTablesTestSuccessful(String driverClass, String url, String user
@ParameterizedTest
@ArgumentsSource(MariaDBConnectionProvider.class)
public void autoIncrementAndLastInsertIdTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
- assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
Connection conn = DriverManager.getConnection(url, user, pwd);
@@ -221,7 +214,6 @@ public void autoIncrementAndLastInsertIdTestSuccessful(String driverClass, Strin
@ParameterizedTest
@ArgumentsSource(MariaDBConnectionProvider.class)
public void mysqlInformationSchemaTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
- assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
Connection conn = DriverManager.getConnection(url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java
index a1a674992..8f8634e17 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MySQLStatementExtensiveTests.java
@@ -20,20 +20,16 @@
@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public class MySQLStatementExtensiveTests {
- private static boolean isMySQLTestDisabled;
private static boolean isMariaDBTestEnabled;
private Connection connection;
private Statement statement;
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
}
public void setUp(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
- assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
- assumeFalse(isMySQLTestDisabled, "MariaDB tests are disabled");
connection = DriverManager.getConnection(url, user, password);
statement = connection.createStatement();
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java
index 86b360c72..7706a8502 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java
@@ -49,7 +49,8 @@ public Stream extends Arguments> provideArguments(ExtensionContext context) {
String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
// Return a single set of arguments with the TestContainer connection details
- // The fifth parameter (false) matches the CSV format which had a boolean flag
+ // The fifth parameter (false) represents the isXA flag, indicating this is not an XA connection
+ // This matches the CSV format which had a boolean flag for XA configuration
return Stream.of(
Arguments.of(driverClass, ojpUrl, username, password, false)
);
diff --git a/ojp-jdbc-driver/src/test/resources/mysql_mariadb_connection.csv b/ojp-jdbc-driver/src/test/resources/mysql_mariadb_connection.csv
deleted file mode 100644
index 8bda7086d..000000000
--- a/ojp-jdbc-driver/src/test/resources/mysql_mariadb_connection.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mysql://localhost:3306/defaultdb,testuser,testpassword,false
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mariadb://localhost:3307/defaultdb,testuser,testpassword,false
\ No newline at end of file
From a20056b815b50d4e1c1ee08bfacc8d4a60ff5794 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 12:26:40 +0000
Subject: [PATCH 30/49] Improve comment explaining TestContainers usage for
Postgres tests
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../jdbc/ReadMultipleBlocksOfDataIntegrationTest.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
index 825fbcb30..eac7fb3ad 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
@@ -27,7 +27,8 @@ public static void checkTestConfiguration() {
@ParameterizedTest
@CsvFileSource(resources = "/h2_postgres_connections_with_record_counts.csv")
public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
- // Skip Postgres connections in this test - they're tested separately
+ // Skip Postgres connections in this test - they're tested separately using TestContainers
+ // See multiplePagesOfRowsResultSetSuccessfulPostgres() method below
if (url.contains("postgresql")) {
return;
}
From faa49a9a67cb1651d444f7c2a4eee4d39203546c Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 13:47:31 +0000
Subject: [PATCH 31/49] Add missing @EnabledIf annotations to Postgres test
classes
Fixed PostgresMiniStressTest, PostgresMultipleTypesIntegrationTest, PostgresSlowQuerySegregationTest, PostgresXAIntegrationTest, and ReadMultipleBlocksOfDataIntegrationTest#multiplePagesOfRowsResultSetSuccessfulPostgres to properly skip when enablePostgresTests=false. All Postgres tests now use @EnabledIf annotation to prevent execution when the flag is not enabled.
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../src/test/java/openjproxy/jdbc/PostgresMiniStressTest.java | 1 +
.../openjproxy/jdbc/PostgresMultipleTypesIntegrationTest.java | 1 +
.../java/openjproxy/jdbc/PostgresSlowQuerySegregationTest.java | 1 +
.../test/java/openjproxy/jdbc/PostgresXAIntegrationTest.java | 1 +
.../jdbc/ReadMultipleBlocksOfDataIntegrationTest.java | 2 ++
5 files changed, 6 insertions(+)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMiniStressTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMiniStressTest.java
index 80b3b51df..6a0eb83cf 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMiniStressTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMiniStressTest.java
@@ -28,6 +28,7 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
@Slf4j
+@EnabledIf("openjproxy.jdbc.testutil.PostgresTestContainer#isEnabled")
public class PostgresMiniStressTest {
private static final int THREADS = 10; // Number of worker threads
private static final int RAMPUP_MS = 10 * 1000; // 10 seconds Ramp-up window in milliseconds
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMultipleTypesIntegrationTest.java
index dfe7a7d43..4cf86d760 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresMultipleTypesIntegrationTest.java
@@ -21,6 +21,7 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.PostgresTestContainer#isEnabled")
public class PostgresMultipleTypesIntegrationTest {
private static boolean isTestDisabled;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSlowQuerySegregationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSlowQuerySegregationTest.java
index 7e3412c17..bec367053 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSlowQuerySegregationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresSlowQuerySegregationTest.java
@@ -28,6 +28,7 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
@Slf4j
+@EnabledIf("openjproxy.jdbc.testutil.PostgresTestContainer#isEnabled")
public class PostgresSlowQuerySegregationTest {
private static final int THREADS = 3; // Number of worker threads
private static final int RAMPUP_MS = 30 * 1000; // 30 seconds Ramp-up window in milliseconds
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresXAIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresXAIntegrationTest.java
index e6c7659a1..cf23da295 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresXAIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/PostgresXAIntegrationTest.java
@@ -30,6 +30,7 @@
* 3. The client-side code updated to use integrated StatementService
*/
@Slf4j
+@EnabledIf("openjproxy.jdbc.testutil.PostgresTestContainer#isEnabled")
public class PostgresXAIntegrationTest {
private static boolean isTestDisabled;
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
index eac7fb3ad..95dfc2c04 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
@@ -2,6 +2,7 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
import org.junit.jupiter.params.provider.CsvFileSource;
@@ -76,6 +77,7 @@ public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driv
// PostgreSQL tests using TestContainers - only run when enabled
@ParameterizedTest
@ArgumentsSource(PostgresConnectionWithRecordCountsProvider.class)
+ @EnabledIf("openjproxy.jdbc.testutil.PostgresTestContainer#isEnabled")
public void multiplePagesOfRowsResultSetSuccessfulPostgres(int totalRecords, String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
Connection conn = DriverManager.getConnection(url, user, pwd);
From e5ecd2fc8e63a72d1638ee2a50035c1b320dc35e Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 15:51:10 +0000
Subject: [PATCH 32/49] Fix MySQL test flag in BasicCrudIntegrationTest and
BlobIntegrationTest
Changed from disableMySQLTests to enableMySQLTests flag to match the workflow configuration and other MySQL test files. These two files were still using the old flag name, causing them to ignore the -DenableMySQLTests=false flag in main.yml and attempt to connect to MySQL when they should be skipped.
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java | 2 +-
.../src/test/java/openjproxy/jdbc/BlobIntegrationTest.java | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
index 73d81ac7f..b227eca4b 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
@@ -30,7 +30,7 @@ public class BasicCrudIntegrationTest {
@BeforeAll
public static void setup() {
isPostgresTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
+ isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
isCockroachDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
isOracleTestEnabled = Boolean.parseBoolean(System.getProperty("enableOracleTests", "false"));
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
index ac46b5c0e..761121aba 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
@@ -29,7 +29,7 @@ public class BlobIntegrationTest {
@BeforeAll
public static void checkTestConfiguration() {
- isMySQLTestDisabled = Boolean.parseBoolean(System.getProperty("disableMySQLTests", "false"));
+ isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
isOracleTestEnabled = Boolean.parseBoolean(System.getProperty("enableOracleTests", "false"));
}
From 1fb8c59cba9402515abe13918d86da99951497e9 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 16:32:08 +0000
Subject: [PATCH 33/49] Initial plan
From f1338d7355b8bfacd4640d6e0ac99fe50b21de01 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 16:41:46 +0000
Subject: [PATCH 34/49] Migrate CockroachDB tests to TestContainers and change
to enableCockroachDBTests flag
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.github/workflows/cockroachdb-testing.yml | 77 +++++++++
.github/workflows/db2-testing.yml | 2 +-
.github/workflows/main.yml | 12 +-
.github/workflows/mysql-testing.yml | 2 +-
.github/workflows/oracle-testing.yml | 2 +-
.github/workflows/postgres-testing.yml | 2 +-
.github/workflows/sqlserver-testing.yml | 2 +-
.../setup_and_testing_ojp_source.md | 8 +-
.../cockroachdb-testing-guide.md | 154 ++++++++++--------
.../jdbc/BasicCrudIntegrationTest.java | 2 +-
...ockroachDBBinaryStreamIntegrationTest.java | 13 +-
.../jdbc/CockroachDBBlobIntegrationTest.java | 15 +-
.../CockroachDBConnectionExtensiveTests.java | 21 ++-
...roachDBDatabaseMetaDataExtensiveTests.java | 18 +-
...ckroachDBMultipleTypesIntegrationTest.java | 11 +-
...oachDBPreparedStatementExtensiveTests.java | 33 ++--
...adMultipleBlocksOfDataIntegrationTest.java | 15 +-
...oachDBResultSetMetaDataExtensiveTests.java | 13 +-
.../jdbc/CockroachDBResultSetTest.java | 31 ++--
.../jdbc/CockroachDBSavepointTests.java | 23 +--
.../CockroachDBStatementExtensiveTests.java | 61 +++----
.../CockroachDBConnectionProvider.java | 56 +++++++
...hDBConnectionWithRecordCountsProvider.java | 55 +++++++
.../testutil/CockroachDBTestContainer.java | 105 ++++++++++++
.../test/resources/cockroachdb_connection.csv | 1 -
25 files changed, 537 insertions(+), 197 deletions(-)
create mode 100644 .github/workflows/cockroachdb-testing.yml
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBConnectionProvider.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBConnectionWithRecordCountsProvider.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBTestContainer.java
delete mode 100644 ojp-jdbc-driver/src/test/resources/cockroachdb_connection.csv
diff --git a/.github/workflows/cockroachdb-testing.yml b/.github/workflows/cockroachdb-testing.yml
new file mode 100644
index 000000000..a2c103c54
--- /dev/null
+++ b/.github/workflows/cockroachdb-testing.yml
@@ -0,0 +1,77 @@
+# This workflow runs only CockroachDB integration tests using TestContainers.
+# It disables all other database integration tests to focus on CockroachDB testing.
+# TestContainers automatically manages the CockroachDB container lifecycle.
+name: CockroachDB Integration Tests
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+ workflow_dispatch: # Allow manual triggering
+
+jobs:
+ cockroachdb-tests:
+ name: CockroachDB Integration Tests
+ runs-on: ubuntu-latest
+
+ permissions:
+ contents: read
+
+ strategy:
+ fail-fast: false
+ matrix:
+ java-version: [ 11, 17, 21, 22 ]
+
+ steps:
+ - name: Git checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Set up JDK 22 for build
+ uses: actions/setup-java@v4
+ with:
+ java-version: 22
+ distribution: 'temurin'
+ cache: maven
+
+ - name: Build and Install (ojp-grpc-commons) with JDK 22
+ run: mvn clean install -pl ojp-grpc-commons -am -DskipTests -Dgpg.skip=true
+
+ - name: Test (ojp-grpc-commons) with JDK 22
+ run: mvn test -pl ojp-grpc-commons -Dgpg.skip=true
+
+ - name: Build (ojp-server) with JDK 22
+ run: mvn clean install -pl ojp-server -am -DskipTests -Dgpg.skip=true
+
+ - name: Test and Run (ojp-server)
+ run: |
+ nohup java -jar ojp-server/target/ojp-server-0.2.1-snapshot-shaded.jar > /tmp/ojp-server.log 2>&1 &
+ echo $! > /tmp/ojp-server.pid
+
+ - name: Wait for ojp-server to start
+ run: sleep 10
+
+ - name: Set up JDK ${{ matrix.java-version }} for ojp-jdbc-driver
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ matrix.java-version }}
+ distribution: 'temurin'
+ cache: maven
+
+ - name: Build (ojp-jdbc-driver) with JDK ${{ matrix.java-version }}
+ run: mvn clean install -pl ojp-jdbc-driver -am -DskipTests -Dgpg.skip=true
+
+ - name: Run CockroachDB Integration Tests
+ run: |
+ mvn test -pl ojp-jdbc-driver -Dgpg.skip=true \
+ -DenableCockroachDBTests=true \
+ -DdisablePostgresTests=true \
+ -DdisableMySQLTests=true \
+ -DdisableMariaDBTests=true \
+ -Dtest="CockroachDB*"
+
+ - name: Show ojp-server.log
+ if: always() # ensures it runs even if previous steps fail
+ run: cat /tmp/ojp-server.log || echo "/tmp/ojp-server.log not found"
diff --git a/.github/workflows/db2-testing.yml b/.github/workflows/db2-testing.yml
index bbb9c5cdc..d79b7d0c7 100644
--- a/.github/workflows/db2-testing.yml
+++ b/.github/workflows/db2-testing.yml
@@ -89,7 +89,7 @@ jobs:
-DdisablePostgresTests=true \
-DdisableMySQLTests=true \
-DdisableMariaDBTests=true \
- -DdisableCockroachDBTests=true \
+ -DenableCockroachDBTests=false \
-Dtest="Db2*"
- name: Show ojp-server.log
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index c90f1d0e1..9e5056989 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -1,6 +1,6 @@
# This workflow builds and tests the project on pushes and pull requests to the main branch.
-# It uses services for MySQL, MariaDB, and CockroachDB integration tests.
-# PostgreSQL tests are run in a separate workflow using TestContainers.
+# It uses services for MySQL and MariaDB integration tests.
+# PostgreSQL, Oracle, SQL Server, DB2, and CockroachDB tests are run in separate workflows using TestContainers.
# The workflow result is reported in the Actions tab of the repository.
name: Main CI
@@ -100,12 +100,6 @@ jobs:
with:
fetch-depth: 0
- - name: Start CockroachDB
- run: |
- docker run --name ojp-cockroachdb -p 26257:26257 -p 8080:8080 -d cockroachdb/cockroach:v24.3.4 start-single-node --insecure
- # Wait for CockroachDB to be ready
- timeout 60 bash -c 'until curl -f http://localhost:8080/health?ready=1 2>/dev/null; do sleep 2; done'
-
- name: Set up JDK 22 for build
uses: actions/setup-java@v4
with:
@@ -141,7 +135,7 @@ jobs:
run: mvn clean install -pl ojp-jdbc-driver -am -DskipTests -Dgpg.skip=true
- name: Test (ojp-jdbc-driver)
- run: mvn test -pl ojp-jdbc-driver -Dgpg.skip=true -DenableMySQLTests=false -DenablePostgresTests=false
+ run: mvn test -pl ojp-jdbc-driver -Dgpg.skip=true -DenableMySQLTests=false -DenablePostgresTests=false -DenableCockroachDBTests=false
- name: Show ojp-server.log
if: always() # ensures it runs even if previous steps fail
diff --git a/.github/workflows/mysql-testing.yml b/.github/workflows/mysql-testing.yml
index 936248bad..bd1c3d23f 100644
--- a/.github/workflows/mysql-testing.yml
+++ b/.github/workflows/mysql-testing.yml
@@ -69,7 +69,7 @@ jobs:
-DenableMySQLTests=true \
-DdisablePostgresTests=true \
-DdisableMariaDBTests=true \
- -DdisableCockroachDBTests=true \
+ -DenableCockroachDBTests=false \
-Dtest="MySQL*"
- name: Show ojp-server.log
diff --git a/.github/workflows/oracle-testing.yml b/.github/workflows/oracle-testing.yml
index 5943d4cfe..f733393ee 100644
--- a/.github/workflows/oracle-testing.yml
+++ b/.github/workflows/oracle-testing.yml
@@ -89,7 +89,7 @@ jobs:
-DdisablePostgresTests=true \
-DdisableMySQLTests=true \
-DdisableMariaDBTests=true \
- -DdisableCockroachDBTests=true \
+ -DenableCockroachDBTests=false \
-Dtest="Oracle*"
- name: Show ojp-server.log
diff --git a/.github/workflows/postgres-testing.yml b/.github/workflows/postgres-testing.yml
index d99d6e787..ab8e426c5 100644
--- a/.github/workflows/postgres-testing.yml
+++ b/.github/workflows/postgres-testing.yml
@@ -69,7 +69,7 @@ jobs:
-DenablePostgresTests=true \
-DdisableMySQLTests=true \
-DdisableMariaDBTests=true \
- -DdisableCockroachDBTests=true \
+ -DenableCockroachDBTests=false \
-Dtest="Postgres*"
- name: Show ojp-server.log
diff --git a/.github/workflows/sqlserver-testing.yml b/.github/workflows/sqlserver-testing.yml
index 25242ceef..3c1e1bfbd 100644
--- a/.github/workflows/sqlserver-testing.yml
+++ b/.github/workflows/sqlserver-testing.yml
@@ -89,7 +89,7 @@ jobs:
-DdisablePostgresTests=true \
-DdisableMySQLTests=true \
-DdisableMariaDBTests=true \
- -DdisableCockroachDBTests=true \
+ -DenableCockroachDBTests=false \
-Dtest="SQLServer*"
- name: Show ojp-server.log
diff --git a/documents/code-contributions/setup_and_testing_ojp_source.md b/documents/code-contributions/setup_and_testing_ojp_source.md
index 157a96f04..cc2599cde 100644
--- a/documents/code-contributions/setup_and_testing_ojp_source.md
+++ b/documents/code-contributions/setup_and_testing_ojp_source.md
@@ -26,7 +26,7 @@
Navigate to the ojp-jdbc-driver folder first:
```bash
cd ojp-jdbc-driver
- mvn test -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests -DdisableCockroachDBTests -DdisablePostgresXATests
+ mvn test -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests -DenableCockroachDBTests=false -DdisablePostgresXATests
```
**Note:** With the disable flags only H2 integration tests will run, to run the full set of integration tests you have to run all the databases locally, follow the instructions at [Run Local Databases](../../documents/environment-setup/run-local-databases.md)
@@ -41,7 +41,7 @@ We have comprehensive JDBC integration tests with OJP for the following database
- DB2
- H2
-The free and open source databases (H2, Postgres, MySQL, MariaDB and CockroachDB) jdbc drivers are packed with OJP and have integration tests always running in our CI pipelines, for proprietary databases as Oracle and SQL Server see specific sections.
+The free and open source databases (H2, Postgres, MySQL, MariaDB and CockroachDB) jdbc drivers are packed with OJP. Integration tests for PostgreSQL, Oracle, SQL Server, DB2, and CockroachDB use TestContainers and run in dedicated CI workflows.
### Oracle Database Setup (Optional)
Oracle integration tests require the Oracle JDBC driver and due to licensing restrictions we do not pack it with OJP.
@@ -56,7 +56,7 @@ DB2 integration tests use the IBM JDBC driver which is not included in OJP depen
For detailed DB2 instructions, see [DB2 Testing Guide](../../documents/environment-setup/db2-testing-guide.md).
### CockroachDB Database Setup (Optional)
-CockroachDB integration tests use the PostgreSQL JDBC driver which is already included in OJP dependencies.
+CockroachDB integration tests use TestContainers which automatically manages the CockroachDB instance.
For detailed CockroachDB setup instructions, see [CockroachDB Testing Guide](../../documents/environment-setup/cockroachdb-testing-guide.md).
@@ -68,7 +68,7 @@ For detailed CockroachDB setup instructions, see [CockroachDB Testing Guide](../
### Test Options
- `-DdisablePostgresTests` - Skip PostgreSQL integration tests
-- `-DdisableCockroachDBTests` - Skip CockroachDB integration tests
+- `-DenableCockroachDBTests` - Enable CockroachDB integration tests (disabled by default, uses TestContainers)
- `-DenableOracleTests` - Enable Oracle integration tests (disabled by default, requires manual Oracle JDBC driver setup)
- `-DenableSqlServerTests` - Enable SQL Server integration tests (disabled by default)
diff --git a/documents/environment-setup/cockroachdb-testing-guide.md b/documents/environment-setup/cockroachdb-testing-guide.md
index 6a26d251c..ee7c58713 100644
--- a/documents/environment-setup/cockroachdb-testing-guide.md
+++ b/documents/environment-setup/cockroachdb-testing-guide.md
@@ -1,36 +1,22 @@
# CockroachDB Testing Guide
-This document explains how to set up and run CockroachDB tests with OJP.
+This document explains how to set up and run CockroachDB tests with OJP using TestContainers.
## Prerequisites
-1. **Docker** - Required to run CockroachDB locally
+1. **Docker** - Required for TestContainers to run CockroachDB containers
+2. **Java 11+** - Required for running the tests
+3. **Maven** - For building and testing
-## Setup Instructions
+## Running CockroachDB Tests
-### 1. Start CockroachDB
+CockroachDB tests now use TestContainers, which automatically manages the CockroachDB container lifecycle. No manual Docker setup is required.
-Use the official CockroachDB Docker image:
+### Running Tests Locally
-```bash
-docker run --name ojp-cockroachdb -p 26257:26257 -p 8080:8080 -d --rm cockroachdb/cockroach:v24.3.4 start-single-node --insecure
-```
-
-Wait for the database to fully start (usually takes less than a minute).
+#### 1. Start OJP Server
-### 2. Verify CockroachDB is Running
-
-Check the health endpoint:
-
-```bash
-curl http://localhost:8080/health?ready=1
-```
-
-Or access the admin UI at: http://localhost:8080
-
-### 3. Start OJP Server
-
-In a separate terminal:
+In a terminal:
```bash
cd ojp
@@ -39,49 +25,80 @@ mvn verify -pl ojp-server -Prun-ojp-server
Wait for the server to start (look for "Server started" in logs).
-### 4. Run CockroachDB Tests
+#### 2. Run CockroachDB Tests
In another terminal:
```bash
cd ojp
-mvn test -pl ojp-jdbc-driver -Dgpg.skip=true
+mvn test -pl ojp-jdbc-driver -DenableCockroachDBTests=true -Dgpg.skip=true
```
-The CockroachDB integration tests will run automatically along with H2, PostgreSQL, MySQL, and MariaDB tests.
+TestContainers will automatically:
+- Download the CockroachDB Docker image (if not already cached)
+- Start a CockroachDB container
+- Run the tests against the container
+- Stop and remove the container when tests complete
#### Running CockroachDB Tests in Isolation
-To run **only** CockroachDB integration tests, disable the other databases that are enabled by default:
+To run **only** CockroachDB integration tests, disable the other databases:
```bash
-mvn test -pl ojp-jdbc-driver -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests -Dgpg.skip=true
+mvn test -pl ojp-jdbc-driver \
+ -DenableCockroachDBTests=true \
+ -DdisablePostgresTests=true \
+ -DdisableMySQLTests=true \
+ -DdisableMariaDBTests=true \
+ -Dgpg.skip=true \
+ -Dtest="CockroachDB*"
```
-## Test Configuration Files
+## GitHub Actions Workflow
+
+CockroachDB tests run in their own dedicated workflow: `.github/workflows/cockroachdb-testing.yml`
-- `cockroachdb_connection.csv` - CockroachDB-only connection configuration
-- `h2_cockroachdb_connections.csv` - Combined H2 and CockroachDB configuration for mixed testing
-- `h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv` - Comprehensive configuration including CockroachDB
+This workflow:
+- Runs automatically on pushes and pull requests to main
+- Can be triggered manually via workflow_dispatch
+- Uses TestContainers to manage the CockroachDB instance
+- Tests against Java 11, 17, 21, and 22
-### Database Connection Details
+## Test Configuration
-- **URL**: `jdbc:ojp[localhost:1059]_postgresql://localhost:26257/defaultdb?sslmode=disable`
-- **User**: `root`
-- **Password**: (empty/none - insecure mode)
+### System Properties
+
+- **`enableCockroachDBTests`** - Set to `true` to run CockroachDB tests (default: `false`)
+- **`ojp.proxy.host`** - OJP proxy host (default: `localhost`)
+- **`ojp.proxy.port`** - OJP proxy port (default: `1059`)
+
+### TestContainer Configuration
+
+CockroachDB TestContainer settings are defined in:
+- `CockroachDBTestContainer.java` - Singleton container manager
+- `CockroachDBConnectionProvider.java` - Test parameterization provider
+- `CockroachDBConnectionWithRecordCountsProvider.java` - Performance test provider
+
+The TestContainer uses:
+- **Image**: `cockroachdb/cockroach:v24.3.4`
+- **Mode**: Single-node, insecure (for testing only)
+- **Username**: `root`
+- **Password**: (empty - insecure mode)
- **Database**: `defaultdb`
-- **Port**: `26257` (SQL port), `8080` (HTTP/Admin UI port)
+- **Port**: Randomly assigned by TestContainers
-Note: CockroachDB uses the PostgreSQL wire protocol, so the JDBC URL uses `postgresql://` but connects to CockroachDB on port 26257.
+Note: CockroachDB uses the PostgreSQL wire protocol, so the JDBC URL uses `postgresql://` but connects to CockroachDB.
## Skipping CockroachDB Tests
-To skip CockroachDB tests, use the `-DdisableCockroachDBTests` flag:
+CockroachDB tests are disabled by default. To explicitly skip them:
```bash
-mvn test -pl ojp-jdbc-driver -DdisableCockroachDBTests=true
+mvn test -pl ojp-jdbc-driver -DenableCockroachDBTests=false
```
+Or simply omit the `-DenableCockroachDBTests=true` flag.
+
## Production Setup
For production environments, you should:
@@ -98,46 +115,51 @@ jdbc:postgresql://localhost:26257/defaultdb?sslmode=require&user=myuser&password
## Troubleshooting
-### Port Already in Use
+### TestContainers Issues
-If port 26257 or 8080 is already in use:
+If TestContainers fails to start:
-```bash
-# Find and stop the process using the port
-docker ps | grep cockroach
-docker stop ojp-cockroachdb
+1. **Check Docker is running**:
+ ```bash
+ docker ps
+ ```
-# Or use different ports:
-docker run --name ojp-cockroachdb -p 26258:26257 -p 8081:8080 -d --rm cockroachdb/cockroach:v24.3.4 start-single-node --insecure
-```
+2. **Check Docker disk space**:
+ ```bash
+ docker system df
+ ```
-### Connection Refused
+3. **Clean up Docker resources**:
+ ```bash
+ docker system prune -a
+ ```
-Ensure CockroachDB is fully started and listening:
+### Connection Issues
-```bash
-# Check CockroachDB logs
-docker logs ojp-cockroachdb
+If tests fail with connection errors:
-# Test connection with psql (if installed)
-psql -h localhost -p 26257 -U root -d defaultdb
-```
+1. **Check OJP server is running**:
+ ```bash
+ curl http://localhost:1059/health
+ ```
-### Database Not Found
+2. **Check TestContainer logs** (in test output):
+ Look for CockroachDB container startup messages
-CockroachDB automatically creates the `defaultdb` database. If it doesn't exist:
+### Performance Issues
-```bash
-# Connect with SQL client
-docker exec -it ojp-cockroachdb ./cockroach sql --insecure
+If tests are slow:
-# Create database
-CREATE DATABASE defaultdb;
-```
+1. **Check Docker resources**: Ensure Docker has sufficient CPU/memory
+2. **Use local Docker images**: Pull the CockroachDB image beforehand:
+ ```bash
+ docker pull cockroachdb/cockroach:v24.3.4
+ ```
## Additional Resources
- [CockroachDB Official Documentation](https://www.cockroachlabs.com/docs/)
- [CockroachDB PostgreSQL Compatibility](https://www.cockroachlabs.com/docs/stable/postgresql-compatibility.html)
- [CockroachDB Docker Image](https://hub.docker.com/r/cockroachdb/cockroach)
-- [CockroachDB SQL Reference](https://www.cockroachlabs.com/docs/stable/sql-statements.html)
+- [TestContainers Documentation](https://www.testcontainers.org/)
+- [TestContainers Generic Container](https://www.testcontainers.org/features/creating_container/)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
index b227eca4b..387a23dfb 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
@@ -32,7 +32,7 @@ public static void setup() {
isPostgresTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
- isCockroachDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isCockroachDBTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
isOracleTestEnabled = Boolean.parseBoolean(System.getProperty("enableOracleTests", "false"));
isSqlServerTestEnabled = Boolean.parseBoolean(System.getProperty("enableSqlServerTests", "false"));
isDb2TestEnabled = Boolean.parseBoolean(System.getProperty("enableDb2Tests", "false"));
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBBinaryStreamIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBBinaryStreamIntegrationTest.java
index 8425592dc..54f3a7c01 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBBinaryStreamIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBBinaryStreamIntegrationTest.java
@@ -2,8 +2,10 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -21,17 +23,18 @@
* CockroachDB-specific binary stream integration tests.
* Tests CockroachDB-specific binary data types (BYTEA) and stream handling.
*/
+@EnabledIf("openjproxy.jdbc.testutil.CockroachDBTestContainer#isEnabled")
public class CockroachDBBinaryStreamIntegrationTest {
private static boolean isTestDisabled;
@BeforeAll
public static void setup() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void createAndReadingBinaryStreamSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
assumeFalse(isTestDisabled, "Skipping CockroachDB tests");
@@ -92,7 +95,7 @@ public void createAndReadingBinaryStreamSuccessful(String driverClass, String ur
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void createAndReadingLargeBinaryStreamSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
assumeFalse(isTestDisabled, "Skipping CockroachDB tests");
@@ -145,7 +148,7 @@ public void createAndReadingLargeBinaryStreamSuccessful(String driverClass, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testBinaryStreamWithNullValues(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
assumeFalse(isTestDisabled, "Skipping CockroachDB tests");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBBlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBBlobIntegrationTest.java
index 482acc2a6..f22d5c6ee 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBBlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBBlobIntegrationTest.java
@@ -2,8 +2,10 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -22,6 +24,7 @@
* CockroachDB-specific BLOB integration tests.
* Tests CockroachDB BYTEA functionality (equivalent to BLOB).
*/
+@EnabledIf("openjproxy.jdbc.testutil.CockroachDBTestContainer#isEnabled")
public class CockroachDBBlobIntegrationTest {
private static boolean isTestDisabled;
@@ -30,7 +33,7 @@ public class CockroachDBBlobIntegrationTest {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
}
public void setUp(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
@@ -52,7 +55,7 @@ public void setUp(String driverClass, String url, String user, String pwd) throw
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBBlobCreationAndRetrieval(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
setUp(driverClass, url, user, pwd);
@@ -94,7 +97,7 @@ public void testCockroachDBBlobCreationAndRetrieval(String driverClass, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBLargeBlobHandling(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
setUp(driverClass, url, user, pwd);
@@ -137,7 +140,7 @@ public void testCockroachDBLargeBlobHandling(String driverClass, String url, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBBlobUpdate(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, IOException {
setUp(driverClass, url, user, pwd);
@@ -190,7 +193,7 @@ public void testCockroachDBBlobUpdate(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBBlobWithNullValue(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
setUp(driverClass, url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBConnectionExtensiveTests.java
index f4fbd8fa7..ff49e9c7d 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBConnectionExtensiveTests.java
@@ -4,8 +4,10 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
import java.sql.*;
@@ -17,17 +19,18 @@
* These tests verify that OJP can properly handle CockroachDB-specific SQL syntax and features.
*/
@Slf4j
+@EnabledIf("openjproxy.jdbc.testutil.CockroachDBTestContainer#isEnabled")
public class CockroachDBConnectionExtensiveTests {
private static boolean isTestDisabled;
@BeforeAll
public static void setup() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBBasicConnection(String driverClass, String url, String user, String pwd) throws SQLException {
Assumptions.assumeFalse(isTestDisabled, "CockroachDB tests are disabled");
@@ -66,7 +69,7 @@ public void testCockroachDBBasicConnection(String driverClass, String url, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBAutoIncrement(String driverClass, String url, String user, String pwd) throws SQLException {
Assumptions.assumeFalse(isTestDisabled, "CockroachDB tests are disabled");
@@ -98,7 +101,7 @@ public void testCockroachDBAutoIncrement(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBTransactionHandling(String driverClass, String url, String user, String pwd) throws SQLException {
Assumptions.assumeFalse(isTestDisabled, "CockroachDB tests are disabled");
@@ -160,7 +163,7 @@ public void testCockroachDBTransactionHandling(String driverClass, String url, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBPreparedStatements(String driverClass, String url, String user, String pwd) throws SQLException {
Assumptions.assumeFalse(isTestDisabled, "CockroachDB tests are disabled");
@@ -196,7 +199,7 @@ public void testCockroachDBPreparedStatements(String driverClass, String url, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBDataTypes(String driverClass, String url, String user, String pwd) throws SQLException {
Assumptions.assumeFalse(isTestDisabled, "CockroachDB tests are disabled");
@@ -245,7 +248,7 @@ public void testCockroachDBDataTypes(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBJoins(String driverClass, String url, String user, String pwd) throws SQLException {
Assumptions.assumeFalse(isTestDisabled, "CockroachDB tests are disabled");
@@ -300,7 +303,7 @@ public void testCockroachDBJoins(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBMetadata(String driverClass, String url, String user, String pwd) throws SQLException {
Assumptions.assumeFalse(isTestDisabled, "CockroachDB tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBDatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBDatabaseMetaDataExtensiveTests.java
index 3570d7961..d7bc2f23b 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBDatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBDatabaseMetaDataExtensiveTests.java
@@ -3,12 +3,14 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
import java.sql.*;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.CockroachDBTestContainer#isEnabled")
public class CockroachDBDatabaseMetaDataExtensiveTests {
private static boolean isTestDisabled;
@@ -16,7 +18,7 @@ public class CockroachDBDatabaseMetaDataExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
}
public void setUp(String driverClass, String url, String user, String password) throws Exception {
@@ -32,7 +34,7 @@ public static void teardown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void allDatabaseMetaDataMethodsShouldWorkAndBeAsserted(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -276,7 +278,7 @@ public void allDatabaseMetaDataMethodsShouldWorkAndBeAsserted(String driverClass
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testGetTypeInfo(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -295,7 +297,7 @@ public void testGetTypeInfo(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testGetIndexInfo(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -306,7 +308,7 @@ public void testGetIndexInfo(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testGetTablePrivileges(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -317,7 +319,7 @@ public void testGetTablePrivileges(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testGetSchemas(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
@@ -336,7 +338,7 @@ public void testGetSchemas(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testGetCatalogs(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
DatabaseMetaData meta = connection.getMetaData();
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBMultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBMultipleTypesIntegrationTest.java
index 40e852f66..81b0f01ac 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBMultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBMultipleTypesIntegrationTest.java
@@ -3,8 +3,10 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
import java.math.BigDecimal;
import java.sql.Connection;
@@ -19,17 +21,18 @@
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.CockroachDBTestContainer#isEnabled")
public class CockroachDBMultipleTypesIntegrationTest {
private static boolean isTestDisabled;
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void typesCoverageTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, ParseException {
assumeFalse(isTestDisabled, "CockroachDB tests are disabled");
@@ -131,7 +134,7 @@ public void typesCoverageTestSuccessful(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBSpecificTypes(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "CockroachDB tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBPreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBPreparedStatementExtensiveTests.java
index 47382fee3..2f6c3f934 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBPreparedStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBPreparedStatementExtensiveTests.java
@@ -3,8 +3,10 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
import java.io.ByteArrayInputStream;
import java.io.StringReader;
@@ -26,6 +28,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.CockroachDBTestContainer#isEnabled")
public class CockroachDBPreparedStatementExtensiveTests {
private static boolean isTestDisabled;
@@ -35,7 +38,7 @@ public class CockroachDBPreparedStatementExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
}
public void setUp(String driverClass, String url, String user, String password) throws Exception {
@@ -63,7 +66,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testBasicParameterSetting(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO cockroachdb_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -88,7 +91,7 @@ public void testBasicParameterSetting(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testNullParameterHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO cockroachdb_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -116,7 +119,7 @@ public void testNullParameterHandling(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testNumericParameterTypes(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -144,7 +147,7 @@ public void testNumericParameterTypes(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testDateTimeParameterTypes(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO cockroachdb_prepared_stmt_test (id, name, dt) VALUES (?, ?, ?)");
@@ -169,7 +172,7 @@ public void testDateTimeParameterTypes(String driverClass, String url, String us
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testLargeObjectHandling(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO cockroachdb_prepared_stmt_test (id, name, data, info) VALUES (?, ?, ?, ?)");
@@ -199,7 +202,7 @@ public void testLargeObjectHandling(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testBatchExecution(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO cockroachdb_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -227,7 +230,7 @@ public void testBatchExecution(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testClearParameters(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO cockroachdb_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -256,7 +259,7 @@ public void testClearParameters(String driverClass, String url, String user, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testExecuteQuery(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
@@ -277,7 +280,7 @@ public void testExecuteQuery(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testExecute(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO cockroachdb_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -292,7 +295,7 @@ public void testExecute(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testMetadata(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("SELECT id, name, age FROM cockroachdb_prepared_stmt_test WHERE id = ?");
@@ -303,7 +306,7 @@ public void testMetadata(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testParameterMetadata(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("INSERT INTO cockroachdb_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
@@ -316,7 +319,7 @@ public void testParameterMetadata(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testClose(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("SELECT * FROM cockroachdb_prepared_stmt_test WHERE id = ?");
@@ -327,7 +330,7 @@ public void testClose(String driverClass, String url, String user, String passwo
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testExecuteAfterCloseThrows(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ps = connection.prepareStatement("SELECT * FROM cockroachdb_prepared_stmt_test WHERE id = ?");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBReadMultipleBlocksOfDataIntegrationTest.java
index 1869ddcfb..a9d470cf0 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBReadMultipleBlocksOfDataIntegrationTest.java
@@ -2,8 +2,10 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -17,17 +19,18 @@
* CockroachDB-specific multiple blocks of data integration tests.
* Tests CockroachDB pagination and large result set handling.
*/
+@EnabledIf("openjproxy.jdbc.testutil.CockroachDBTestContainer#isEnabled")
public class CockroachDBReadMultipleBlocksOfDataIntegrationTest {
private static boolean isTestDisabled;
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBMultiplePagesOfRows(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping CockroachDB tests");
@@ -75,7 +78,7 @@ public void testCockroachDBMultiplePagesOfRows(String driverClass, String url, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBLargeDataSetPagination(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping CockroachDB tests");
@@ -134,7 +137,7 @@ public void testCockroachDBLargeDataSetPagination(String driverClass, String url
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBLargeResultSetWithVariousTypes(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping CockroachDB tests");
@@ -195,7 +198,7 @@ public void testCockroachDBLargeResultSetWithVariousTypes(String driverClass, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBFetchSizePerformance(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
assumeFalse(isTestDisabled, "Skipping CockroachDB tests");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBResultSetMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBResultSetMetaDataExtensiveTests.java
index a78cbe4e8..32166ce80 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBResultSetMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBResultSetMetaDataExtensiveTests.java
@@ -3,14 +3,17 @@
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
import java.sql.*;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.CockroachDBTestContainer#isEnabled")
public class CockroachDBResultSetMetaDataExtensiveTests {
private static boolean isTestDisabled;
@@ -19,7 +22,7 @@ public class CockroachDBResultSetMetaDataExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
}
@SneakyThrows
@@ -56,7 +59,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testAllResultSetMetaDataMethods(String driverClass, String url, String user, String password) throws SQLException {
setUp(driverClass, url, user, password);
@@ -173,7 +176,7 @@ public void testAllResultSetMetaDataMethods(String driverClass, String url, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testResultSetMetaDataWithNullValues(String driverClass, String url, String user, String password) throws SQLException {
assumeFalse(isTestDisabled, "CockroachDB tests are disabled");
@@ -204,7 +207,7 @@ public void testResultSetMetaDataWithNullValues(String driverClass, String url,
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testResultSetMetaDataWithComplexTypes(String driverClass, String url, String user, String password) throws SQLException {
assumeFalse(isTestDisabled, "CockroachDB tests are disabled");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBResultSetTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBResultSetTest.java
index 6c742d490..81808aad4 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBResultSetTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBResultSetTest.java
@@ -3,8 +3,10 @@
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -24,6 +26,7 @@
* CockroachDB-specific ResultSet tests.
* Tests CockroachDB-specific ResultSet behavior and data type handling.
*/
+@EnabledIf("openjproxy.jdbc.testutil.CockroachDBTestContainer#isEnabled")
public class CockroachDBResultSetTest {
private Connection connection;
@@ -34,7 +37,7 @@ public class CockroachDBResultSetTest {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
}
@SneakyThrows
@@ -86,7 +89,7 @@ public void tearDown() throws SQLException {
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBNavigationMethods(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
assertTrue(resultSet.next()); // Row 1
@@ -101,7 +104,7 @@ public void testCockroachDBNavigationMethods(String driverClass, String url, Str
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBAbsoluteAndRelativePositioning(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -116,7 +119,7 @@ public void testCockroachDBAbsoluteAndRelativePositioning(String driverClass, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBGetRow(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -128,7 +131,7 @@ public void testCockroachDBGetRow(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBDataRetrieval(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -152,7 +155,7 @@ public void testCockroachDBDataRetrieval(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBNullHandling(String driverClass, String url, String user, String pwd) throws SQLException {
assumeFalse(isTestDisabled, "Skipping CockroachDB tests");
@@ -179,7 +182,7 @@ public void testCockroachDBNullHandling(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBFindColumn(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -194,7 +197,7 @@ public void testCockroachDBFindColumn(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBResultSetType(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -202,7 +205,7 @@ public void testCockroachDBResultSetType(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBResultSetConcurrency(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -211,7 +214,7 @@ public void testCockroachDBResultSetConcurrency(String driverClass, String url,
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBWarnings(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -222,7 +225,7 @@ public void testCockroachDBWarnings(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBGetStatement(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -232,7 +235,7 @@ public void testCockroachDBGetStatement(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBBeforeFirstAfterLast(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -246,7 +249,7 @@ public void testCockroachDBBeforeFirstAfterLast(String driverClass, String url,
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCockroachDBIsClosed(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBSavepointTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBSavepointTests.java
index 3befc0bc8..15e466384 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBSavepointTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBSavepointTests.java
@@ -3,8 +3,10 @@
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -16,6 +18,7 @@
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.CockroachDBTestContainer#isEnabled")
public class CockroachDBSavepointTests {
private static boolean isTestDisabled;
@@ -23,7 +26,7 @@ public class CockroachDBSavepointTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
}
@SneakyThrows
@@ -54,7 +57,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testUnnamedSavepoint(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -73,7 +76,7 @@ public void testUnnamedSavepoint(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testNamedSavepoint(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -94,7 +97,7 @@ public void testNamedSavepoint(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testMultipleSavepoints(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -124,7 +127,7 @@ public void testMultipleSavepoints(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testReleaseSavepoint(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -146,7 +149,7 @@ public void testReleaseSavepoint(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testSavepointWithRollback(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -165,7 +168,7 @@ public void testSavepointWithRollback(String driverClass, String url, String use
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testSavepointWithCommit(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -184,7 +187,7 @@ public void testSavepointWithCommit(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testNestedSavepoints(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
@@ -212,7 +215,7 @@ public void testNestedSavepoints(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testSavepointAfterError(String driverClass, String url, String user, String pwd) throws SQLException {
setUp(driverClass, url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBStatementExtensiveTests.java
index 322fa553c..c47b055c4 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBStatementExtensiveTests.java
@@ -3,8 +3,10 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.CsvFileSource;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
import java.sql.Connection;
import java.sql.DriverManager;
@@ -22,6 +24,7 @@
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
+@EnabledIf("openjproxy.jdbc.testutil.CockroachDBTestContainer#isEnabled")
public class CockroachDBStatementExtensiveTests {
private static boolean isTestDisabled;
@@ -31,7 +34,7 @@ public class CockroachDBStatementExtensiveTests {
@BeforeAll
public static void checkTestConfiguration() {
- isTestDisabled = Boolean.parseBoolean(System.getProperty("disableCockroachDBTests", "false"));
+ isTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
}
public void setUp(String driverClass, String url, String user, String password) throws Exception {
@@ -49,7 +52,7 @@ public void tearDown() throws Exception {
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testExecuteQuery(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
ResultSet rs = statement.executeQuery("SELECT * FROM cockroachdb_statement_test");
@@ -59,7 +62,7 @@ public void testExecuteQuery(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testExecuteUpdate(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int rows = statement.executeUpdate("UPDATE cockroachdb_statement_test SET name = 'Updated Alice' WHERE id = 1");
@@ -72,7 +75,7 @@ public void testExecuteUpdate(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testClose(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
assertFalse(statement.isClosed());
@@ -81,7 +84,7 @@ public void testClose(String driverClass, String url, String user, String passwo
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testMaxFieldSize(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getMaxFieldSize();
@@ -91,7 +94,7 @@ public void testMaxFieldSize(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testExecuteAfterCloseThrows(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.close();
@@ -101,7 +104,7 @@ public void testExecuteAfterCloseThrows(String driverClass, String url, String u
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testMaxRows(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setMaxRows(1);
@@ -113,7 +116,7 @@ public void testMaxRows(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testEscapeProcessing(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Should not throw
@@ -122,7 +125,7 @@ public void testEscapeProcessing(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testQueryTimeout(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.setQueryTimeout(5);
@@ -130,7 +133,7 @@ public void testQueryTimeout(String driverClass, String url, String user, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCancel(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Should not throw
@@ -138,7 +141,7 @@ public void testCancel(String driverClass, String url, String user, String passw
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testWarnings(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.clearWarnings();
@@ -146,7 +149,7 @@ public void testWarnings(String driverClass, String url, String user, String pas
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testSetCursorName(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// No-op in most drivers; should not throw
@@ -154,7 +157,7 @@ public void testSetCursorName(String driverClass, String url, String user, Strin
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testExecute(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
boolean isResultSet = statement.execute("SELECT * FROM cockroachdb_statement_test");
@@ -170,7 +173,7 @@ public void testExecute(String driverClass, String url, String user, String pass
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testGetMoreResults(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.execute("SELECT * FROM cockroachdb_statement_test");
@@ -179,7 +182,7 @@ public void testGetMoreResults(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testFetchDirection(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getFetchDirection();
@@ -189,7 +192,7 @@ public void testFetchDirection(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testFetchSize(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int orig = statement.getFetchSize();
@@ -199,7 +202,7 @@ public void testFetchSize(String driverClass, String url, String user, String pa
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testResultSetConcurrencyAndType(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int concurrency = statement.getResultSetConcurrency();
@@ -209,7 +212,7 @@ public void testResultSetConcurrencyAndType(String driverClass, String url, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testBatchExecution(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.addBatch("INSERT INTO cockroachdb_statement_test (id, name) VALUES (3, 'Charlie')");
@@ -224,7 +227,7 @@ public void testBatchExecution(String driverClass, String url, String user, Stri
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testClearBatch(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.addBatch("INSERT INTO cockroachdb_statement_test (id, name) VALUES (5, 'Eve')");
@@ -234,14 +237,14 @@ public void testClearBatch(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testGetConnection(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
assertSame(connection, statement.getConnection());
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testGetMoreResultsWithCurrent(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.execute("SELECT * FROM cockroachdb_statement_test");
@@ -249,7 +252,7 @@ public void testGetMoreResultsWithCurrent(String driverClass, String url, String
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testGetGeneratedKeys(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// CockroachDB supports SERIAL, create table with auto-increment
@@ -273,7 +276,7 @@ public void testGetGeneratedKeys(String driverClass, String url, String user, St
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testExecuteLargeBatch(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.addBatch("INSERT INTO cockroachdb_statement_test (id, name) VALUES (10, 'Large1')");
@@ -283,7 +286,7 @@ public void testExecuteLargeBatch(String driverClass, String url, String user, S
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testExecuteLargeUpdate(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
long affected = statement.executeLargeUpdate("UPDATE cockroachdb_statement_test SET name = 'LargeUpdate' WHERE id = 1");
@@ -291,7 +294,7 @@ public void testExecuteLargeUpdate(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testGetLargeUpdateCount(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
statement.executeUpdate("UPDATE cockroachdb_statement_test SET name = 'Test' WHERE id = 1");
@@ -302,7 +305,7 @@ public void testGetLargeUpdateCount(String driverClass, String url, String user,
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testResultSetHoldability(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
int holdability = statement.getResultSetHoldability();
@@ -311,7 +314,7 @@ public void testResultSetHoldability(String driverClass, String url, String user
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testIsPoolable(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
// Default is usually false, but should not throw
@@ -321,7 +324,7 @@ public void testIsPoolable(String driverClass, String url, String user, String p
}
@ParameterizedTest
- @CsvFileSource(resources = "/cockroachdb_connection.csv")
+ @ArgumentsSource(CockroachDBConnectionProvider.class)
public void testCloseOnCompletion(String driverClass, String url, String user, String password) throws Exception {
this.setUp(driverClass, url, user, password);
assertFalse(statement.isCloseOnCompletion());
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBConnectionProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBConnectionProvider.java
new file mode 100644
index 000000000..02221fa89
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBConnectionProvider.java
@@ -0,0 +1,56 @@
+package openjproxy.jdbc.testutil;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+import java.util.stream.Stream;
+
+/**
+ * Custom ArgumentsProvider for CockroachDB integration tests.
+ * Provides connection details from TestContainers when CockroachDB tests are enabled.
+ * This allows tests to use TestContainers instead of external CockroachDB instances.
+ */
+public class CockroachDBConnectionProvider implements ArgumentsProvider {
+
+ // JDBC URL prefix to be removed when building OJP URL
+ private static final String JDBC_PREFIX = "jdbc:";
+
+ // OJP proxy server configuration - can be overridden via system property
+ private static final String OJP_PROXY_HOST = System.getProperty("ojp.proxy.host", "localhost");
+ private static final String OJP_PROXY_PORT = System.getProperty("ojp.proxy.port", "1059");
+ private static final String OJP_PROXY_ADDRESS = OJP_PROXY_HOST + ":" + OJP_PROXY_PORT;
+
+ @Override
+ public Stream extends Arguments> provideArguments(ExtensionContext context) {
+ if (!CockroachDBTestContainer.isEnabled()) {
+ // Return empty stream when tests are disabled
+ return Stream.empty();
+ }
+
+ // Initialize and start the TestContainer
+ CockroachDBTestContainer.getInstance();
+
+ // Get connection details from the TestContainer
+ String containerJdbcUrl = CockroachDBTestContainer.getJdbcUrl();
+ String username = CockroachDBTestContainer.getUsername();
+ String password = CockroachDBTestContainer.getPassword();
+
+ // Build OJP JDBC URL from the container URL
+ // TestContainer URL format: jdbc:postgresql://localhost:RANDOM_PORT/defaultdb?sslmode=disable
+ // OJP wraps this by removing 'jdbc:' and prepending 'jdbc:ojp[host:port]_'
+ // Result format: jdbc:ojp[localhost:1059]_postgresql://localhost:RANDOM_PORT/defaultdb?sslmode=disable
+ String driverClass = "org.openjproxy.jdbc.Driver";
+
+ // Remove "jdbc:" prefix and add OJP wrapper
+ String urlWithoutPrefix = containerJdbcUrl.startsWith(JDBC_PREFIX)
+ ? containerJdbcUrl.substring(JDBC_PREFIX.length())
+ : containerJdbcUrl;
+ String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
+
+ // Return a single set of arguments with the TestContainer connection details
+ return Stream.of(
+ Arguments.of(driverClass, ojpUrl, username, password)
+ );
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBConnectionWithRecordCountsProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBConnectionWithRecordCountsProvider.java
new file mode 100644
index 000000000..cfddf1ae1
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBConnectionWithRecordCountsProvider.java
@@ -0,0 +1,55 @@
+package openjproxy.jdbc.testutil;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+import java.util.Arrays;
+import java.util.stream.Stream;
+
+/**
+ * Custom ArgumentsProvider for CockroachDB integration tests that include record counts.
+ * Provides connection details from TestContainers along with various record counts for testing.
+ */
+public class CockroachDBConnectionWithRecordCountsProvider implements ArgumentsProvider {
+
+ // JDBC URL prefix to be removed when building OJP URL
+ private static final String JDBC_PREFIX = "jdbc:";
+
+ // OJP proxy server configuration - can be overridden via system property
+ private static final String OJP_PROXY_HOST = System.getProperty("ojp.proxy.host", "localhost");
+ private static final String OJP_PROXY_PORT = System.getProperty("ojp.proxy.port", "1059");
+ private static final String OJP_PROXY_ADDRESS = OJP_PROXY_HOST + ":" + OJP_PROXY_PORT;
+
+ // Test record counts to iterate through
+ private static final int[] RECORD_COUNTS = {1, 99, 100, 101, 1000, 10000};
+
+ @Override
+ public Stream extends Arguments> provideArguments(ExtensionContext context) {
+ if (!CockroachDBTestContainer.isEnabled()) {
+ // Return empty stream when tests are disabled
+ return Stream.empty();
+ }
+
+ // Initialize and start the TestContainer
+ CockroachDBTestContainer.getInstance();
+
+ // Get connection details from the TestContainer
+ String containerJdbcUrl = CockroachDBTestContainer.getJdbcUrl();
+ String username = CockroachDBTestContainer.getUsername();
+ String password = CockroachDBTestContainer.getPassword();
+
+ // Build OJP JDBC URL from the container URL
+ String driverClass = "org.openjproxy.jdbc.Driver";
+
+ // Remove "jdbc:" prefix and add OJP wrapper
+ String urlWithoutPrefix = containerJdbcUrl.startsWith(JDBC_PREFIX)
+ ? containerJdbcUrl.substring(JDBC_PREFIX.length())
+ : containerJdbcUrl;
+ String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
+
+ // Return arguments for each record count
+ return Arrays.stream(RECORD_COUNTS)
+ .mapToObj(count -> Arguments.of(count, driverClass, ojpUrl, username, password));
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBTestContainer.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBTestContainer.java
new file mode 100644
index 000000000..073f0dc0b
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/CockroachDBTestContainer.java
@@ -0,0 +1,105 @@
+package openjproxy.jdbc.testutil;
+
+import lombok.extern.slf4j.Slf4j;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.utility.DockerImageName;
+
+/**
+ * Singleton CockroachDB test container for all CockroachDB integration tests.
+ * This ensures that all tests share the same CockroachDB instance to improve test performance
+ * and reduce resource usage.
+ */
+@Slf4j
+public class CockroachDBTestContainer {
+
+ // CockroachDB Docker image version
+ private static final String COCKROACHDB_IMAGE = "cockroachdb/cockroach:v24.3.4";
+ private static final int COCKROACHDB_PORT = 26257;
+
+ private static GenericContainer> container;
+ private static boolean isStarted = false;
+ private static boolean shutdownHookRegistered = false;
+
+ /**
+ * Gets or creates the shared CockroachDB test container instance.
+ * The container is automatically started on first access.
+ *
+ * @return the shared GenericContainer instance
+ */
+ public static synchronized GenericContainer> getInstance() {
+ if (container == null) {
+ container = new GenericContainer<>(DockerImageName.parse(COCKROACHDB_IMAGE))
+ .withCommand("start-single-node", "--insecure")
+ .withExposedPorts(COCKROACHDB_PORT);
+ }
+
+ if (!isStarted) {
+ container.start();
+ isStarted = true;
+ log.info("CockroachDB TestContainer started successfully on port: {}", container.getMappedPort(COCKROACHDB_PORT));
+
+ // Add shutdown hook to stop container when JVM exits
+ if (!shutdownHookRegistered) {
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ if (container != null && container.isRunning()) {
+ container.stop();
+ }
+ }));
+ shutdownHookRegistered = true;
+ }
+ }
+
+ return container;
+ }
+
+ /**
+ * Gets the JDBC URL for connecting to the test container.
+ * CockroachDB uses the PostgreSQL wire protocol.
+ *
+ * @return JDBC URL string
+ */
+ public static String getJdbcUrl() {
+ GenericContainer> instance = getInstance();
+ String host = instance.getHost();
+ Integer port = instance.getMappedPort(COCKROACHDB_PORT);
+ return "jdbc:postgresql://" + host + ":" + port + "/defaultdb?sslmode=disable";
+ }
+
+ /**
+ * Gets the username for connecting to the test container.
+ * CockroachDB in insecure mode uses "root" by default.
+ *
+ * @return username string
+ */
+ public static String getUsername() {
+ return "root";
+ }
+
+ /**
+ * Gets the password for connecting to the test container.
+ * CockroachDB in insecure mode doesn't require a password.
+ *
+ * @return password string (empty for insecure mode)
+ */
+ public static String getPassword() {
+ return "";
+ }
+
+ /**
+ * Gets the database name for the test container.
+ *
+ * @return database name string
+ */
+ public static String getDatabaseName() {
+ return "defaultdb";
+ }
+
+ /**
+ * Checks if CockroachDB tests are enabled via system property.
+ *
+ * @return true if CockroachDB tests should run
+ */
+ public static boolean isEnabled() {
+ return Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/resources/cockroachdb_connection.csv b/ojp-jdbc-driver/src/test/resources/cockroachdb_connection.csv
deleted file mode 100644
index 1def7398e..000000000
--- a/ojp-jdbc-driver/src/test/resources/cockroachdb_connection.csv
+++ /dev/null
@@ -1 +0,0 @@
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_postgresql://localhost:26257/defaultdb?sslmode=disable,root,
From 0e46e97fc538872f0892c59548dc6567a1324272 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 16:42:54 +0000
Subject: [PATCH 35/49] Add MariaDB documentation and update flag references
- Created mariadb-testing-guide.md with TestContainer setup instructions
- Created MARIADB_TESTCONTAINER_GUIDE.md for migration details
- Updated all documentation to use enableMariaDBTests instead of disableMariaDBTests
- Added MariaDB setup section to setup_and_testing_ojp_source.md
- Updated test options documentation with all enable/disable flags
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
documents/MARIADB_TESTCONTAINER_GUIDE.md | 123 ++++++++++++++
.../setup_and_testing_ojp_source.md | 13 +-
.../cockroachdb-testing-guide.md | 4 +-
.../environment-setup/db2-testing-guide.md | 2 +-
.../mariadb-testing-guide.md | 156 ++++++++++++++++++
.../environment-setup/oracle-testing-guide.md | 2 +-
.../sqlserver-testing-guide.md | 2 +-
7 files changed, 294 insertions(+), 8 deletions(-)
create mode 100644 documents/MARIADB_TESTCONTAINER_GUIDE.md
create mode 100644 documents/environment-setup/mariadb-testing-guide.md
diff --git a/documents/MARIADB_TESTCONTAINER_GUIDE.md b/documents/MARIADB_TESTCONTAINER_GUIDE.md
new file mode 100644
index 000000000..71cc22b3c
--- /dev/null
+++ b/documents/MARIADB_TESTCONTAINER_GUIDE.md
@@ -0,0 +1,123 @@
+# MariaDB Integration Tests with TestContainers
+
+## Overview
+
+All MariaDB integration tests have been migrated to use TestContainers. This provides:
+- Automatic MariaDB container management
+- Consistent test environment across all environments
+- No need for external MariaDB instances
+
+## How It Works
+
+### TestContainer Setup
+
+1. **MariaDBTestContainer** - Singleton class that manages a shared MariaDB container
+ - Located: `ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java`
+ - Uses `mariadb:10.11` Docker image
+ - Automatically starts on first test execution
+ - Shared across all MariaDB tests for efficiency
+ - Automatically stops when tests complete
+
+2. **MariaDBConnectionProvider** - Custom JUnit ArgumentsProvider
+ - Located: `ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java`
+ - Provides dynamic connection details from the TestContainer
+ - Replaces CSV-based connection configuration
+
+### Test Changes
+
+All MariaDB test classes have been updated:
+- Changed from `@CsvFileSource` to `@ArgumentsSource(MariaDBConnectionProvider.class)`
+- Added `@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")` annotation
+- Tests automatically use TestContainer when `enableMariaDBTests=true`
+
+### Running MariaDB Tests
+
+#### Prerequisites
+- Docker must be installed and running
+- OJP server must be started (tests connect through OJP proxy)
+
+#### Local Execution
+```bash
+# Start OJP server first (requires Java 21+)
+java -jar ojp-server/target/ojp-server-0.2.1-snapshot-shaded.jar &
+
+# Run MariaDB tests
+mvn test -pl ojp-jdbc-driver -DenableMariaDBTests=true -Dtest="*MariaDB*,Blob*,BasicCrud*"
+```
+
+#### CI/CD Workflow
+The `.github/workflows/mariadb-testing.yml` workflow:
+- Automatically builds the OJP server
+- Starts the server in background
+- Runs all MariaDB integration tests
+- Uses TestContainers for MariaDB instance
+- Matrix tests against Java 11, 17, 21, 22
+
+### Dependencies
+
+#### ojp-jdbc-driver/pom.xml
+```xml
+
+
+ org.mariadb.jdbc
+ mariadb-java-client
+ 3.5.1
+ test
+
+
+
+
+ org.testcontainers
+ mariadb
+ 1.20.4
+ test
+
+```
+
+## Test Files Updated
+
+All MariaDB integration test files:
+- MySQLMariaDBConnectionExtensiveTests.java
+- MySQLDatabaseMetaDataExtensiveTests.java
+- MySQLMultipleTypesIntegrationTest.java
+- MySQLPreparedStatementExtensiveTests.java
+- MySQLSpecificFeaturesIntegrationTest.java
+- MySQLStatementExtensiveTests.java
+
+Multi-database tests updated for flag change:
+- BasicCrudIntegrationTest.java (changed from `disableMariaDBTests` to `enableMariaDBTests`)
+- BlobIntegrationTest.java (changed from `disableMariaDBTests` to `enableMariaDBTests`)
+
+## Files Removed
+
+- `mysql_mariadb_connection.csv` - No longer needed with TestContainers
+
+## Flag Change
+
+**Previous behavior:**
+- Flag: `-DdisableMariaDBTests` (default: `false`, tests enabled)
+- MariaDB tests ran by default in main CI workflow
+- Used manually started MariaDB service in GitHub Actions
+
+**New behavior:**
+- Flag: `-DenableMariaDBTests` (default: `false`, tests disabled)
+- MariaDB tests are disabled by default
+- Must explicitly enable with `-DenableMariaDBTests=true`
+- Uses TestContainers for automatic container management
+- Has dedicated `mariadb-testing.yml` workflow
+
+## Benefits
+
+1. **No External Dependencies** - No need to set up external MariaDB
+2. **Consistency** - Same environment for all developers and CI
+3. **Isolation** - Each test run uses fresh containers
+4. **Speed** - Shared container across tests improves performance
+5. **Simplicity** - Automatic container lifecycle management
+6. **Explicit Opt-in** - Tests only run when explicitly enabled
+
+## Migration Notes
+
+If you were previously relying on MariaDB tests running automatically:
+- Update your test commands to include `-DenableMariaDBTests=true`
+- Update any CI/CD pipelines to explicitly enable MariaDB tests
+- Remove any manual MariaDB service configurations (no longer needed)
diff --git a/documents/code-contributions/setup_and_testing_ojp_source.md b/documents/code-contributions/setup_and_testing_ojp_source.md
index 157a96f04..3004b36c0 100644
--- a/documents/code-contributions/setup_and_testing_ojp_source.md
+++ b/documents/code-contributions/setup_and_testing_ojp_source.md
@@ -26,7 +26,7 @@
Navigate to the ojp-jdbc-driver folder first:
```bash
cd ojp-jdbc-driver
- mvn test -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests -DdisableCockroachDBTests -DdisablePostgresXATests
+ mvn test -DdisablePostgresTests -DdisableMySQLTests -DenableMariaDBTests=false -DdisableCockroachDBTests -DdisablePostgresXATests
```
**Note:** With the disable flags only H2 integration tests will run, to run the full set of integration tests you have to run all the databases locally, follow the instructions at [Run Local Databases](../../documents/environment-setup/run-local-databases.md)
@@ -41,7 +41,7 @@ We have comprehensive JDBC integration tests with OJP for the following database
- DB2
- H2
-The free and open source databases (H2, Postgres, MySQL, MariaDB and CockroachDB) jdbc drivers are packed with OJP and have integration tests always running in our CI pipelines, for proprietary databases as Oracle and SQL Server see specific sections.
+The free and open source databases (H2, Postgres, MySQL and CockroachDB) JDBC drivers are packed with OJP and have integration tests always running in our CI pipelines. MariaDB tests use TestContainers and are disabled by default (see [MariaDB Testing Guide](../../documents/environment-setup/mariadb-testing-guide.md)). For proprietary databases like Oracle, SQL Server, and DB2, see their specific sections.
### Oracle Database Setup (Optional)
Oracle integration tests require the Oracle JDBC driver and due to licensing restrictions we do not pack it with OJP.
@@ -55,6 +55,10 @@ For detailed SQL Server setup instructions, see [SQL Server Testing Guide](../..
DB2 integration tests use the IBM JDBC driver which is not included in OJP dependencies.
For detailed DB2 instructions, see [DB2 Testing Guide](../../documents/environment-setup/db2-testing-guide.md).
+### MariaDB Database Setup (Optional)
+MariaDB integration tests use TestContainers to automatically manage the database lifecycle. Tests are disabled by default.
+For detailed MariaDB setup instructions, see [MariaDB Testing Guide](../../documents/environment-setup/mariadb-testing-guide.md).
+
### CockroachDB Database Setup (Optional)
CockroachDB integration tests use the PostgreSQL JDBC driver which is already included in OJP dependencies.
For detailed CockroachDB setup instructions, see [CockroachDB Testing Guide](../../documents/environment-setup/cockroachdb-testing-guide.md).
@@ -68,9 +72,12 @@ For detailed CockroachDB setup instructions, see [CockroachDB Testing Guide](../
### Test Options
- `-DdisablePostgresTests` - Skip PostgreSQL integration tests
+- `-DdisableMySQLTests` - Skip MySQL integration tests
- `-DdisableCockroachDBTests` - Skip CockroachDB integration tests
+- `-DenableMariaDBTests` - Enable MariaDB integration tests (disabled by default, uses TestContainers)
- `-DenableOracleTests` - Enable Oracle integration tests (disabled by default, requires manual Oracle JDBC driver setup)
-- `-DenableSqlServerTests` - Enable SQL Server integration tests (disabled by default)
+- `-DenableSqlServerTests` - Enable SQL Server integration tests (disabled by default, uses TestContainers)
+- `-DenableDb2Tests` - Enable DB2 integration tests (disabled by default, uses TestContainers)
### Contributing code
1. Fork the repository
diff --git a/documents/environment-setup/cockroachdb-testing-guide.md b/documents/environment-setup/cockroachdb-testing-guide.md
index 6a26d251c..9d8b572b0 100644
--- a/documents/environment-setup/cockroachdb-testing-guide.md
+++ b/documents/environment-setup/cockroachdb-testing-guide.md
@@ -48,14 +48,14 @@ cd ojp
mvn test -pl ojp-jdbc-driver -Dgpg.skip=true
```
-The CockroachDB integration tests will run automatically along with H2, PostgreSQL, MySQL, and MariaDB tests.
+The CockroachDB integration tests will run automatically along with H2, PostgreSQL, and MySQL tests. MariaDB tests are disabled by default.
#### Running CockroachDB Tests in Isolation
To run **only** CockroachDB integration tests, disable the other databases that are enabled by default:
```bash
-mvn test -pl ojp-jdbc-driver -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests -Dgpg.skip=true
+mvn test -pl ojp-jdbc-driver -DdisablePostgresTests -DdisableMySQLTests -DenableMariaDBTests=false -Dgpg.skip=true
```
## Test Configuration Files
diff --git a/documents/environment-setup/db2-testing-guide.md b/documents/environment-setup/db2-testing-guide.md
index 70caeca21..c30488876 100644
--- a/documents/environment-setup/db2-testing-guide.md
+++ b/documents/environment-setup/db2-testing-guide.md
@@ -49,7 +49,7 @@ To run only DB2 tests:
```bash
cd ojp-jdbc-driver
-mvn test -DenableDb2Tests -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests
+mvn test -DenableDb2Tests=true -DdisablePostgresTests -DdisableMySQLTests -DenableMariaDBTests=false
```
To run DB2 tests alongside other databases:
diff --git a/documents/environment-setup/mariadb-testing-guide.md b/documents/environment-setup/mariadb-testing-guide.md
new file mode 100644
index 000000000..02e866a0e
--- /dev/null
+++ b/documents/environment-setup/mariadb-testing-guide.md
@@ -0,0 +1,156 @@
+# MariaDB Database Testing Guide
+
+This document explains how to set up and run MariaDB Database tests with OJP using TestContainers.
+
+## Prerequisites
+
+1. **Docker** - Required for TestContainers to run MariaDB locally
+2. **MariaDB JDBC Driver** - Automatically included in test dependencies
+
+## Overview
+
+MariaDB integration tests use **TestContainers** to automatically manage the MariaDB container lifecycle. This means:
+- No manual Docker commands needed
+- Container starts automatically when tests run
+- Container stops automatically when tests complete
+- Consistent testing environment across all developers and CI
+
+## Running MariaDB Tests
+
+### Enable MariaDB Tests
+
+MariaDB tests are **disabled by default**. To run them, use the `-DenableMariaDBTests=true` flag:
+
+```bash
+cd ojp-jdbc-driver
+mvn test -DenableMariaDBTests=true
+```
+
+### Run Only MariaDB Tests
+
+To run **only** MariaDB integration tests (excluding other databases):
+
+```bash
+cd ojp-jdbc-driver
+mvn test -DenableMariaDBTests=true -DdisablePostgresTests -DdisableMySQLTests -DdisableCockroachDBTests -Dtest="*MariaDB*,Blob*,BasicCrud*"
+```
+
+### Run MariaDB Tests Alongside Other Databases
+
+```bash
+cd ojp-jdbc-driver
+mvn test -DenableMariaDBTests=true -DenableOracleTests=true -DenableSqlServerTests=true
+```
+
+## Test Infrastructure
+
+### TestContainers
+
+The tests use the following TestContainer configuration:
+- **Image**: `mariadb:10.11`
+- **Database**: `defaultdb`
+- **Username**: `testuser`
+- **Password**: `testpassword`
+- **Port**: Randomly assigned by TestContainers
+
+The container is managed by:
+- `MariaDBTestContainer.java` - Singleton container manager
+- `MariaDBConnectionProvider.java` - Provides connection parameters to tests
+
+### Test Files
+
+MariaDB-specific test files include:
+- `MySQLMariaDBConnectionExtensiveTests.java`
+- `MySQLDatabaseMetaDataExtensiveTests.java`
+- `MySQLMultipleTypesIntegrationTest.java`
+- `MySQLPreparedStatementExtensiveTests.java`
+- `MySQLSpecificFeaturesIntegrationTest.java`
+- `MySQLStatementExtensiveTests.java`
+
+These tests are annotated with `@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")` to ensure they only run when MariaDB tests are explicitly enabled.
+
+## Connection String Format
+
+The MariaDB connection string for OJP follows this format:
+
+```
+jdbc:ojp[localhost:1059]_mariadb://localhost:RANDOM_PORT/defaultdb
+```
+
+Where:
+- `localhost:1059` - OJP server address and port
+- `mariadb://localhost:RANDOM_PORT` - MariaDB instance (port assigned by TestContainers)
+- `defaultdb` - Target database
+
+## Skipping MariaDB Tests
+
+MariaDB tests are skipped by default when running:
+
+```bash
+mvn test
+```
+
+You can also explicitly disable MariaDB tests:
+
+```bash
+mvn test -DenableMariaDBTests=false
+```
+
+## CI/CD Integration
+
+In GitHub Actions, there is a dedicated workflow `mariadb-testing.yml` that:
+- Runs only MariaDB integration tests
+- Uses TestContainers for database management
+- Tests against multiple Java versions (11, 17, 21, 22)
+- Runs automatically on push/PR to main branch
+
+## Troubleshooting
+
+### Docker Not Running
+
+If you see errors about Docker not being available:
+
+```bash
+# Check if Docker is running
+docker info
+
+# Start Docker Desktop or Docker daemon
+```
+
+### Port Conflicts
+
+TestContainers automatically assigns random available ports, so port conflicts are unlikely. If you experience issues:
+
+```bash
+# Stop any running containers
+docker ps
+docker stop
+```
+
+### Memory Issues
+
+MariaDB TestContainers requires sufficient Docker memory allocation. Ensure Docker has at least 4GB RAM allocated:
+
+```bash
+# Check Docker resource limits
+docker info | grep Memory
+```
+
+## Differences from Previous Setup
+
+Previously, MariaDB tests:
+- Used a manually started MariaDB service in CI
+- Used CSV configuration files (`mysql_mariadb_connection.csv`)
+- Were controlled by `-DdisableMariaDBTests` flag (default false)
+
+Now, MariaDB tests:
+- Use TestContainers for automatic container management
+- Use `MariaDBConnectionProvider` for test parameterization
+- Are controlled by `-DenableMariaDBTests` flag (default false)
+- Run in a dedicated CI workflow
+
+## Additional Resources
+
+- [MariaDB Official Documentation](https://mariadb.org/documentation/)
+- [TestContainers MariaDB Module](https://www.testcontainers.org/modules/databases/mariadb/)
+- [MariaDB JDBC Driver](https://mariadb.com/kb/en/about-mariadb-connector-j/)
diff --git a/documents/environment-setup/oracle-testing-guide.md b/documents/environment-setup/oracle-testing-guide.md
index 9d197e0a0..89104970b 100644
--- a/documents/environment-setup/oracle-testing-guide.md
+++ b/documents/environment-setup/oracle-testing-guide.md
@@ -42,7 +42,7 @@ To run only Oracle tests:
```bash
cd ojp-jdbc-driver
-mvn test -DenableOracleTests -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests
+mvn test -DenableOracleTests=true -DdisablePostgresTests -DdisableMySQLTests -DenableMariaDBTests=false
```
## Test Configuration Files
diff --git a/documents/environment-setup/sqlserver-testing-guide.md b/documents/environment-setup/sqlserver-testing-guide.md
index 0511665ed..9f53613dc 100644
--- a/documents/environment-setup/sqlserver-testing-guide.md
+++ b/documents/environment-setup/sqlserver-testing-guide.md
@@ -79,7 +79,7 @@ To run only SQL Server tests:
```bash
cd ojp-jdbc-driver
-mvn test -DenableSqlServerTests -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests
+mvn test -DenableSqlServerTests=true -DdisablePostgresTests -DdisableMySQLTests -DenableMariaDBTests=false
```
To run SQL Server tests alongside other databases:
From a6f9322d834ab7d7301d2aecd16fb46a9c40fce7 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 16:45:03 +0000
Subject: [PATCH 36/49] Fix missing import in
CockroachDBDatabaseMetaDataExtensiveTests
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../jdbc/CockroachDBDatabaseMetaDataExtensiveTests.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBDatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBDatabaseMetaDataExtensiveTests.java
index d7bc2f23b..ee54c2e94 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBDatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/CockroachDBDatabaseMetaDataExtensiveTests.java
@@ -2,6 +2,7 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
import openjproxy.jdbc.testutil.CockroachDBConnectionProvider;
From 9d0615931cc30973a74fc89e2ecb5679d5e7d0da Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Fri, 5 Dec 2025 16:56:43 +0000
Subject: [PATCH 37/49] Update workflows and documentation for MySQL/MariaDB
separation
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.github/workflows/mariadb-testing.yml | 6 ++--
documents/MARIADB_TESTCONTAINER_GUIDE.md | 30 ++++++++++++-------
.../mariadb-testing-guide.md | 16 +++++-----
3 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/.github/workflows/mariadb-testing.yml b/.github/workflows/mariadb-testing.yml
index dea8c62c0..92d7cbf24 100644
--- a/.github/workflows/mariadb-testing.yml
+++ b/.github/workflows/mariadb-testing.yml
@@ -67,10 +67,10 @@ jobs:
run: |
mvn test -pl ojp-jdbc-driver -Dgpg.skip=true \
-DenableMariaDBTests=true \
- -DdisablePostgresTests=true \
- -DdisableMySQLTests=true \
+ -DenablePostgresTests=false \
+ -DenableMySQLTests=false \
-DdisableCockroachDBTests=true \
- -Dtest="*MariaDB*,Blob*,BasicCrud*"
+ -Dtest="MariaDB*,Blob*,BasicCrud*"
- name: Show ojp-server.log
if: always() # ensures it runs even if previous steps fail
diff --git a/documents/MARIADB_TESTCONTAINER_GUIDE.md b/documents/MARIADB_TESTCONTAINER_GUIDE.md
index 71cc22b3c..f06eda678 100644
--- a/documents/MARIADB_TESTCONTAINER_GUIDE.md
+++ b/documents/MARIADB_TESTCONTAINER_GUIDE.md
@@ -76,17 +76,25 @@ The `.github/workflows/mariadb-testing.yml` workflow:
## Test Files Updated
-All MariaDB integration test files:
-- MySQLMariaDBConnectionExtensiveTests.java
-- MySQLDatabaseMetaDataExtensiveTests.java
-- MySQLMultipleTypesIntegrationTest.java
-- MySQLPreparedStatementExtensiveTests.java
-- MySQLSpecificFeaturesIntegrationTest.java
-- MySQLStatementExtensiveTests.java
-
-Multi-database tests updated for flag change:
-- BasicCrudIntegrationTest.java (changed from `disableMariaDBTests` to `enableMariaDBTests`)
-- BlobIntegrationTest.java (changed from `disableMariaDBTests` to `enableMariaDBTests`)
+MariaDB-specific test files (duplicated from MySQL versions):
+- `MariaDBConnectionExtensiveTests.java` (was `MySQLMariaDBConnectionExtensiveTests.java`)
+- `MariaDBDatabaseMetaDataExtensiveTests.java` (was `MySQLDatabaseMetaDataExtensiveTests.java`)
+- `MariaDBMultipleTypesIntegrationTest.java` (was `MySQLMultipleTypesIntegrationTest.java`)
+- `MariaDBPreparedStatementExtensiveTests.java` (was `MySQLPreparedStatementExtensiveTests.java`)
+- `MariaDBSpecificFeaturesIntegrationTest.java` (was `MySQLSpecificFeaturesIntegrationTest.java`)
+- `MariaDBStatementExtensiveTests.java` (was `MySQLStatementExtensiveTests.java`)
+
+MySQL test files (remain unchanged, using MySQLTestContainer):
+- `MySQLMariaDBConnectionExtensiveTests.java`
+- `MySQLDatabaseMetaDataExtensiveTests.java`
+- `MySQLMultipleTypesIntegrationTest.java`
+- `MySQLPreparedStatementExtensiveTests.java`
+- `MySQLSpecificFeaturesIntegrationTest.java`
+- `MySQLStatementExtensiveTests.java`
+
+Multi-database tests updated for both flags:
+- `BasicCrudIntegrationTest.java` (supports both `enableMySQLTests` and `enableMariaDBTests`)
+- `BlobIntegrationTest.java` (supports both `enableMySQLTests` and `enableMariaDBTests`)
## Files Removed
diff --git a/documents/environment-setup/mariadb-testing-guide.md b/documents/environment-setup/mariadb-testing-guide.md
index 02e866a0e..a8110b923 100644
--- a/documents/environment-setup/mariadb-testing-guide.md
+++ b/documents/environment-setup/mariadb-testing-guide.md
@@ -32,7 +32,7 @@ To run **only** MariaDB integration tests (excluding other databases):
```bash
cd ojp-jdbc-driver
-mvn test -DenableMariaDBTests=true -DdisablePostgresTests -DdisableMySQLTests -DdisableCockroachDBTests -Dtest="*MariaDB*,Blob*,BasicCrud*"
+mvn test -DenableMariaDBTests=true -DenablePostgresTests=false -DenableMySQLTests=false -DdisableCockroachDBTests=true -Dtest="MariaDB*,Blob*,BasicCrud*"
```
### Run MariaDB Tests Alongside Other Databases
@@ -60,15 +60,17 @@ The container is managed by:
### Test Files
MariaDB-specific test files include:
-- `MySQLMariaDBConnectionExtensiveTests.java`
-- `MySQLDatabaseMetaDataExtensiveTests.java`
-- `MySQLMultipleTypesIntegrationTest.java`
-- `MySQLPreparedStatementExtensiveTests.java`
-- `MySQLSpecificFeaturesIntegrationTest.java`
-- `MySQLStatementExtensiveTests.java`
+- `MariaDBConnectionExtensiveTests.java`
+- `MariaDBDatabaseMetaDataExtensiveTests.java`
+- `MariaDBMultipleTypesIntegrationTest.java`
+- `MariaDBPreparedStatementExtensiveTests.java`
+- `MariaDBSpecificFeaturesIntegrationTest.java`
+- `MariaDBStatementExtensiveTests.java`
These tests are annotated with `@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")` to ensure they only run when MariaDB tests are explicitly enabled.
+**Note:** These test files were duplicated from their MySQL counterparts (`MySQLMariaDBConnectionExtensiveTests.java`, etc.) to allow independent testing of MySQL and MariaDB with separate TestContainers and enable flags.
+
## Connection String Format
The MariaDB connection string for OJP follows this format:
From f86e5513c416dfabebc27aefa4d70b9129dc3ac4 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 6 Dec 2025 18:36:40 +0000
Subject: [PATCH 38/49] Fix MariaDB workflow failures by removing hardcoded
MariaDB URLs from CSV files
- Removed MariaDB entries from h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv (port 3307 no longer valid with TestContainers)
- Removed MariaDB entries from h2_mysql_mariadb_oracle_connections.csv
- Added MariaDB-specific test methods to BasicCrudIntegrationTest using MariaDBConnectionProvider
- Added MariaDB-specific test methods to BlobIntegrationTest using MariaDBConnectionProvider
- MariaDB tests now exclusively use TestContainers with dynamic ports instead of hardcoded localhost:3307
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../jdbc/BasicCrudIntegrationTest.java | 102 +++++++++++++
.../openjproxy/jdbc/BlobIntegrationTest.java | 139 ++++++++++++++++++
.../h2_mysql_mariadb_oracle_connections.csv | 1 -
...l_mariadb_oracle_sqlserver_connections.csv | 1 -
4 files changed, 241 insertions(+), 2 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
index 330b34b90..78181ce7a 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
@@ -1,12 +1,14 @@
package openjproxy.jdbc;
import lombok.extern.slf4j.Slf4j;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
import openjproxy.jdbc.testutil.TestDBUtils;
import openjproxy.jdbc.testutil.TestDBUtils.ConnectionResult;
import org.junit.Assert;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import org.junit.jupiter.params.provider.CsvFileSource;
import java.sql.Connection;
@@ -181,4 +183,104 @@ public void crudTestSuccessful(String driverClass, String url, String user, Stri
connResult.close();
}
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void crudTestSuccessfulMariaDB(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
+ // This method tests MariaDB using TestContainers
+ tablePrefix = "mariadb_";
+ String tableName = tablePrefix + "basic_crud_test";
+
+ ConnectionResult connResult = TestDBUtils.createConnection(url, user, pwd, isXA);
+ Connection conn = connResult.getConnection();
+
+ // For non-XA connections, set autocommit to false for explicit transaction control
+ if (!isXA) {
+ conn.setAutoCommit(false);
+ }
+
+ // Start transaction if needed
+ connResult.startXATransactionIfNeeded();
+
+ // Drop table if it exists from previous test run
+ try {
+ executeUpdate(conn, "drop table " + tableName);
+ connResult.commit();
+ } catch (Exception e) {
+ // Table doesn't exist yet, ignore
+ try {
+ connResult.rollback();
+ } catch (Exception ex) {
+ // Ignore rollback errors
+ }
+ }
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ executeUpdate(conn, "create table " + tableName + "(" +
+ "id INT NOT NULL," +
+ "title VARCHAR(50) NOT NULL" +
+ ")");
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ executeUpdate(conn, " insert into " + tableName + " (id, title) values (1, 'TITLE_1')");
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ java.sql.PreparedStatement psSelect = conn.prepareStatement("select * from " + tableName + " where id = ?");
+ psSelect.setInt(1, 1);
+ ResultSet resultSet = psSelect.executeQuery();
+ resultSet.next();
+ int id = resultSet.getInt(1);
+ String title = resultSet.getString(2);
+ Assert.assertEquals(1, id);
+ Assert.assertEquals("TITLE_1", title);
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ executeUpdate(conn, " update " + tableName + " set title = 'TITLE_1_UPDATED' where id = 1");
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ ResultSet resultSetAfterUpdate = psSelect.executeQuery();
+ resultSetAfterUpdate.next();
+ String titleAfterUpdate = resultSetAfterUpdate.getString(2);
+ Assert.assertEquals("TITLE_1_UPDATED", titleAfterUpdate);
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ executeUpdate(conn, " delete from " + tableName + " where id = 1");
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ ResultSet resultSetAfterDeletion = psSelect.executeQuery();
+ Assert.assertFalse(resultSetAfterDeletion.next());
+
+ resultSet.close();
+ psSelect.close();
+
+ // Clean up - drop the test table
+ try {
+ executeUpdate(conn, "drop table " + tableName);
+ connResult.commit();
+ } catch (Exception e) {
+ // Ignore cleanup errors
+ }
+
+ connResult.close();
+ }
+
}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
index 1cd6e7e9b..781bb05e9 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
@@ -1,9 +1,11 @@
package openjproxy.jdbc;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import org.junit.jupiter.params.provider.CsvFileSource;
import java.io.ByteArrayInputStream;
@@ -179,4 +181,141 @@ public void creatingAndReadingLargeBLOBsSuccessful(String driverClass, String ur
conn.close();
}
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void createAndReadingBLOBsSuccessfulMariaDB(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException, IOException {
+ // This method tests MariaDB using TestContainers
+ this.tableName = "blob_test_blob_mariadb";
+ Class.forName(driverClass);
+ this.conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing for url -> " + url);
+
+ try {
+ executeUpdate(conn, "drop table " + tableName);
+ } catch (Exception e) {
+ //If fails disregard as per the table is most possibly not created yet
+ }
+
+ executeUpdate(conn,
+ "create table " + tableName + "(" +
+ " val_blob BLOB," +
+ " val_blob2 BLOB," +
+ " val_blob3 BLOB" +
+ ")"
+ );
+
+ PreparedStatement psInsert = conn.prepareStatement(
+ " insert into " + tableName + " (val_blob, val_blob2, val_blob3) values (?, ?, ?)"
+ );
+
+ byte[] blobBytes = {1, 2, 3, 4, 5, 6};
+ Blob blob = conn.createBlob();
+ blob.setBytes(1, blobBytes);
+
+ psInsert.setBlob(1, blob);
+
+ InputStream inputStream = new ByteArrayInputStream(blobBytes);
+ psInsert.setBlob(2, inputStream);
+
+ psInsert.setBytes(3, blobBytes);
+
+ psInsert.executeUpdate();
+
+ psInsert.close();
+
+ PreparedStatement psSelect = conn.prepareStatement("select * from " + tableName);
+ ResultSet resultSet = psSelect.executeQuery();
+ resultSet.next();
+
+ Blob blobFromDB = resultSet.getBlob(1);
+ byte[] bytesFromDB = blobFromDB.getBytes(1, (int) blobFromDB.length());
+ Assert.assertArrayEquals(blobBytes, bytesFromDB);
+
+ Blob blobFromDB2 = resultSet.getBlob(2);
+ byte[] bytesFromDB2 = blobFromDB2.getBytes(1, (int) blobFromDB2.length());
+ Assert.assertArrayEquals(blobBytes, bytesFromDB2);
+
+ byte[] bytesFromDB3 = resultSet.getBytes(3);
+ Assert.assertArrayEquals(blobBytes, bytesFromDB3);
+
+ executeUpdate(conn, "delete from " + tableName);
+
+ resultSet.close();
+ psSelect.close();
+ conn.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void creatingAndReadingLargeBLOBsSuccessfulMariaDB(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, IOException, ClassNotFoundException {
+ // This method tests MariaDB using TestContainers
+ this.tableName = "blob_test_blob_mariadb";
+ Class.forName(driverClass);
+ this.conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing for url -> " + url);
+
+ try {
+ executeUpdate(conn, "drop table " + tableName);
+ } catch (Exception e) {
+ //If fails disregard as per the table is most possibly not created yet
+ }
+
+ executeUpdate(conn,
+ "create table " + tableName + "(" +
+ " val_blob BLOB" +
+ ")"
+ );
+
+ PreparedStatement psInsert = conn.prepareStatement(
+ " insert into " + tableName + " (val_blob) values (?)"
+ );
+
+ // Create a 5MB blob
+ byte[] blobBytes = new byte[5 * 1024 * 1024];
+ for (int i = 0; i < blobBytes.length; i++) {
+ blobBytes[i] = (byte) (i % 256);
+ }
+
+ InputStream inputStream = new ByteArrayInputStream(blobBytes);
+ psInsert.setBlob(1, inputStream);
+
+ psInsert.executeUpdate();
+
+ psInsert.close();
+
+ PreparedStatement psSelect = conn.prepareStatement("select * from " + tableName);
+ ResultSet resultSet = psSelect.executeQuery();
+ resultSet.next();
+
+ Blob blobFromDB = resultSet.getBlob(1);
+
+ InputStream inputStreamFromDB = blobFromDB.getBinaryStream();
+
+ InputStream inputStreamTestFile = new ByteArrayInputStream(blobBytes);
+
+ int byteFile = inputStreamTestFile.read();
+ int blobByte = inputStreamFromDB.read();
+
+ while (byteFile != -1) {
+
+ Assert.assertEquals(byteFile, blobByte);
+ byteFile = inputStreamTestFile.read();
+ blobByte = inputStreamFromDB.read();
+ }
+
+ while (blobByte != -1) {
+
+ Assert.assertEquals(byteFile, blobByte);
+ byteFile = inputStreamTestFile.read();
+ }
+
+ executeUpdate(conn, "delete from " + tableName);
+
+ resultSet.close();
+ psSelect.close();
+ conn.close();
+ }
+
}
diff --git a/ojp-jdbc-driver/src/test/resources/h2_mysql_mariadb_oracle_connections.csv b/ojp-jdbc-driver/src/test/resources/h2_mysql_mariadb_oracle_connections.csv
index 009564e39..3358c4c7a 100644
--- a/ojp-jdbc-driver/src/test/resources/h2_mysql_mariadb_oracle_connections.csv
+++ b/ojp-jdbc-driver/src/test/resources/h2_mysql_mariadb_oracle_connections.csv
@@ -1,4 +1,3 @@
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_h2:~/test,sa,
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mysql://localhost:3306/defaultdb,testuser,testpassword
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mariadb://localhost:3307/defaultdb,testuser,testpassword
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_oracle:thin:@localhost:1521/XEPDB1,testuser,testpassword
\ No newline at end of file
diff --git a/ojp-jdbc-driver/src/test/resources/h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv b/ojp-jdbc-driver/src/test/resources/h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv
index 6480f9fbc..e20191e7e 100644
--- a/ojp-jdbc-driver/src/test/resources/h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv
+++ b/ojp-jdbc-driver/src/test/resources/h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv
@@ -2,7 +2,6 @@ org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_h2:~/test,sa,,false
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_postgresql://localhost:5432/defaultdb,testuser,testpassword,false
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_postgresql://localhost:5432/defaultdb,testuser,testpassword,true
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mysql://localhost:3306/defaultdb,testuser,testpassword,false
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mariadb://localhost:3307/defaultdb,testuser,testpassword,false
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_oracle:thin:@localhost:1521/XEPDB1,testuser,testpassword,false
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_sqlserver://localhost:1433;databaseName=defaultdb;encrypt=false;trustServerCertificate=true,testuser,TestPassword123!,false
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_db2://localhost:50000/testdb,db2inst1,testpass,false
From 13eae5ab244fbe0cdba22ebe14512d3c25e5ddb5 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 6 Dec 2025 18:58:46 +0000
Subject: [PATCH 39/49] Add @EnabledIf to MariaDB-specific test methods to fix
main CI
- Added @EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled") to crudTestSuccessfulMariaDB in BasicCrudIntegrationTest
- Added @EnabledIf to createAndReadingBLOBsSuccessfulMariaDB in BlobIntegrationTest
- Added @EnabledIf to creatingAndReadingLargeBLOBsSuccessfulMariaDB in BlobIntegrationTest
- These annotations prevent tests from running when enableMariaDBTests=false (default in main CI)
- Fixes "PreconditionViolation: Configuration error: You must configure at least one set of arguments" error
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java | 2 ++
.../src/test/java/openjproxy/jdbc/BlobIntegrationTest.java | 3 +++
2 files changed, 5 insertions(+)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
index 78181ce7a..e5dd8f786 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
@@ -7,6 +7,7 @@
import org.junit.Assert;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
import org.junit.jupiter.params.provider.CsvFileSource;
@@ -185,6 +186,7 @@ public void crudTestSuccessful(String driverClass, String url, String user, Stri
@ParameterizedTest
@ArgumentsSource(MariaDBConnectionProvider.class)
+ @EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public void crudTestSuccessfulMariaDB(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
// This method tests MariaDB using TestContainers
tablePrefix = "mariadb_";
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
index 781bb05e9..53800df6b 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
@@ -4,6 +4,7 @@
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ArgumentsSource;
import org.junit.jupiter.params.provider.CsvFileSource;
@@ -183,6 +184,7 @@ public void creatingAndReadingLargeBLOBsSuccessful(String driverClass, String ur
@ParameterizedTest
@ArgumentsSource(MariaDBConnectionProvider.class)
+ @EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public void createAndReadingBLOBsSuccessfulMariaDB(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException, IOException {
// This method tests MariaDB using TestContainers
this.tableName = "blob_test_blob_mariadb";
@@ -248,6 +250,7 @@ public void createAndReadingBLOBsSuccessfulMariaDB(String driverClass, String ur
@ParameterizedTest
@ArgumentsSource(MariaDBConnectionProvider.class)
+ @EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
public void creatingAndReadingLargeBLOBsSuccessfulMariaDB(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, IOException, ClassNotFoundException {
// This method tests MariaDB using TestContainers
this.tableName = "blob_test_blob_mariadb";
From 08fa9238f07815bb7140599c20e984dcdc363318 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 6 Dec 2025 20:17:34 +0000
Subject: [PATCH 40/49] Reduce blob size in MariaDB large BLOB test to fix gRPC
limit error
- Reduced blob size from 5MB to 3MB in creatingAndReadingLargeBLOBsSuccessfulMariaDB test
- gRPC message size limit is 4MB, the 5MB blob was exceeding this causing RESOURCE_EXHAUSTED error
- 3MB provides safe margin below the 4MB limit while still testing large BLOB functionality
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../src/test/java/openjproxy/jdbc/BlobIntegrationTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
index 53800df6b..7eaab9384 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
@@ -275,8 +275,8 @@ public void creatingAndReadingLargeBLOBsSuccessfulMariaDB(String driverClass, St
" insert into " + tableName + " (val_blob) values (?)"
);
- // Create a 5MB blob
- byte[] blobBytes = new byte[5 * 1024 * 1024];
+ // Create a 3MB blob (under gRPC 4MB limit)
+ byte[] blobBytes = new byte[3 * 1024 * 1024];
for (int i = 0; i < blobBytes.length; i++) {
blobBytes[i] = (byte) (i % 256);
}
From 7acf1b5f44e6c9bc915ddc1aa27fe6558195ae57 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 6 Dec 2025 22:51:08 +0000
Subject: [PATCH 41/49] Reduce MariaDB large BLOB test size to 1MB to fix
socket errors
- Reduced blob size from 3MB to 1MB in creatingAndReadingLargeBLOBsSuccessfulMariaDB test
- 3MB was causing socket errors/timeouts during data transfer through OJP proxy
- 1MB is more conservative and reliable while still testing large BLOB functionality
- Original CSV-based test uses 18KB file, so 1MB is still significantly larger for testing
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../src/test/java/openjproxy/jdbc/BlobIntegrationTest.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
index 7eaab9384..64a7a06fe 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
@@ -275,8 +275,8 @@ public void creatingAndReadingLargeBLOBsSuccessfulMariaDB(String driverClass, St
" insert into " + tableName + " (val_blob) values (?)"
);
- // Create a 3MB blob (under gRPC 4MB limit)
- byte[] blobBytes = new byte[3 * 1024 * 1024];
+ // Create a 1MB blob (conservative size to avoid socket timeouts)
+ byte[] blobBytes = new byte[1024 * 1024];
for (int i = 0; i < blobBytes.length; i++) {
blobBytes[i] = (byte) (i % 256);
}
From 2fbd5566177d738ffaa9654a57e1214e0c44ddb3 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 7 Dec 2025 11:57:57 +0000
Subject: [PATCH 42/49] Use largeTextFile.txt resource in MariaDB blob test
instead of byte array
- Changed creatingAndReadingLargeBLOBsSuccessfulMariaDB to use largeTextFile.txt resource (17KB) instead of creating large in-memory byte arrays
- Matches the approach used in the original CSV-based test
- Fixes "Broken pipe" socket errors caused by large in-memory blob transfers
- 17KB file transfers reliably through OJP proxy without connection issues
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../openjproxy/jdbc/BlobIntegrationTest.java | 35 ++++++-------------
1 file changed, 10 insertions(+), 25 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
index 64a7a06fe..674c8d84e 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
@@ -272,43 +272,28 @@ public void creatingAndReadingLargeBLOBsSuccessfulMariaDB(String driverClass, St
);
PreparedStatement psInsert = conn.prepareStatement(
- " insert into " + tableName + " (val_blob) values (?)"
+ "insert into " + tableName + " (val_blob) values (?)"
);
- // Create a 1MB blob (conservative size to avoid socket timeouts)
- byte[] blobBytes = new byte[1024 * 1024];
- for (int i = 0; i < blobBytes.length; i++) {
- blobBytes[i] = (byte) (i % 256);
- }
-
- InputStream inputStream = new ByteArrayInputStream(blobBytes);
+ // Use the same largeTextFile.txt resource as the original CSV-based test
+ InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("largeTextFile.txt");
psInsert.setBlob(1, inputStream);
psInsert.executeUpdate();
- psInsert.close();
-
- PreparedStatement psSelect = conn.prepareStatement("select * from " + tableName);
+ PreparedStatement psSelect = conn.prepareStatement("select val_blob from " + tableName);
ResultSet resultSet = psSelect.executeQuery();
resultSet.next();
+ Blob blobResult = resultSet.getBlob(1);
- Blob blobFromDB = resultSet.getBlob(1);
-
- InputStream inputStreamFromDB = blobFromDB.getBinaryStream();
-
- InputStream inputStreamTestFile = new ByteArrayInputStream(blobBytes);
+ InputStream inputStreamTestFile = this.getClass().getClassLoader().getResourceAsStream("largeTextFile.txt");
+ InputStream inputStreamBlob = blobResult.getBinaryStream();
int byteFile = inputStreamTestFile.read();
- int blobByte = inputStreamFromDB.read();
-
+ int count = 0;
while (byteFile != -1) {
-
- Assert.assertEquals(byteFile, blobByte);
- byteFile = inputStreamTestFile.read();
- blobByte = inputStreamFromDB.read();
- }
-
- while (blobByte != -1) {
+ count++;
+ int blobByte = inputStreamBlob.read();
Assert.assertEquals(byteFile, blobByte);
byteFile = inputStreamTestFile.read();
From 7c4c423c42a207772153eabf2ea9aca2b6bddca6 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 7 Dec 2025 12:38:40 +0000
Subject: [PATCH 43/49] Consolidate MariaDB documentation and clean up
CockroachDB guide
- Merged MARIADB_TESTCONTAINER_GUIDE.md into mariadb-testing-guide.md
- Added technical details, dependencies, and migration information to mariadb-testing-guide.md
- Removed standalone MARIADB_TESTCONTAINER_GUIDE.md file
- Removed unnecessary paragraph from cockroachdb-testing-guide.md about MariaDB tests being disabled by default
- All MariaDB documentation now in single comprehensive guide
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
documents/MARIADB_TESTCONTAINER_GUIDE.md | 131 ------------------
.../cockroachdb-testing-guide.md | 2 -
.../mariadb-testing-guide.md | 110 ++++++++++++++-
3 files changed, 103 insertions(+), 140 deletions(-)
delete mode 100644 documents/MARIADB_TESTCONTAINER_GUIDE.md
diff --git a/documents/MARIADB_TESTCONTAINER_GUIDE.md b/documents/MARIADB_TESTCONTAINER_GUIDE.md
deleted file mode 100644
index f06eda678..000000000
--- a/documents/MARIADB_TESTCONTAINER_GUIDE.md
+++ /dev/null
@@ -1,131 +0,0 @@
-# MariaDB Integration Tests with TestContainers
-
-## Overview
-
-All MariaDB integration tests have been migrated to use TestContainers. This provides:
-- Automatic MariaDB container management
-- Consistent test environment across all environments
-- No need for external MariaDB instances
-
-## How It Works
-
-### TestContainer Setup
-
-1. **MariaDBTestContainer** - Singleton class that manages a shared MariaDB container
- - Located: `ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java`
- - Uses `mariadb:10.11` Docker image
- - Automatically starts on first test execution
- - Shared across all MariaDB tests for efficiency
- - Automatically stops when tests complete
-
-2. **MariaDBConnectionProvider** - Custom JUnit ArgumentsProvider
- - Located: `ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java`
- - Provides dynamic connection details from the TestContainer
- - Replaces CSV-based connection configuration
-
-### Test Changes
-
-All MariaDB test classes have been updated:
-- Changed from `@CsvFileSource` to `@ArgumentsSource(MariaDBConnectionProvider.class)`
-- Added `@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")` annotation
-- Tests automatically use TestContainer when `enableMariaDBTests=true`
-
-### Running MariaDB Tests
-
-#### Prerequisites
-- Docker must be installed and running
-- OJP server must be started (tests connect through OJP proxy)
-
-#### Local Execution
-```bash
-# Start OJP server first (requires Java 21+)
-java -jar ojp-server/target/ojp-server-0.2.1-snapshot-shaded.jar &
-
-# Run MariaDB tests
-mvn test -pl ojp-jdbc-driver -DenableMariaDBTests=true -Dtest="*MariaDB*,Blob*,BasicCrud*"
-```
-
-#### CI/CD Workflow
-The `.github/workflows/mariadb-testing.yml` workflow:
-- Automatically builds the OJP server
-- Starts the server in background
-- Runs all MariaDB integration tests
-- Uses TestContainers for MariaDB instance
-- Matrix tests against Java 11, 17, 21, 22
-
-### Dependencies
-
-#### ojp-jdbc-driver/pom.xml
-```xml
-
-
- org.mariadb.jdbc
- mariadb-java-client
- 3.5.1
- test
-
-
-
-
- org.testcontainers
- mariadb
- 1.20.4
- test
-
-```
-
-## Test Files Updated
-
-MariaDB-specific test files (duplicated from MySQL versions):
-- `MariaDBConnectionExtensiveTests.java` (was `MySQLMariaDBConnectionExtensiveTests.java`)
-- `MariaDBDatabaseMetaDataExtensiveTests.java` (was `MySQLDatabaseMetaDataExtensiveTests.java`)
-- `MariaDBMultipleTypesIntegrationTest.java` (was `MySQLMultipleTypesIntegrationTest.java`)
-- `MariaDBPreparedStatementExtensiveTests.java` (was `MySQLPreparedStatementExtensiveTests.java`)
-- `MariaDBSpecificFeaturesIntegrationTest.java` (was `MySQLSpecificFeaturesIntegrationTest.java`)
-- `MariaDBStatementExtensiveTests.java` (was `MySQLStatementExtensiveTests.java`)
-
-MySQL test files (remain unchanged, using MySQLTestContainer):
-- `MySQLMariaDBConnectionExtensiveTests.java`
-- `MySQLDatabaseMetaDataExtensiveTests.java`
-- `MySQLMultipleTypesIntegrationTest.java`
-- `MySQLPreparedStatementExtensiveTests.java`
-- `MySQLSpecificFeaturesIntegrationTest.java`
-- `MySQLStatementExtensiveTests.java`
-
-Multi-database tests updated for both flags:
-- `BasicCrudIntegrationTest.java` (supports both `enableMySQLTests` and `enableMariaDBTests`)
-- `BlobIntegrationTest.java` (supports both `enableMySQLTests` and `enableMariaDBTests`)
-
-## Files Removed
-
-- `mysql_mariadb_connection.csv` - No longer needed with TestContainers
-
-## Flag Change
-
-**Previous behavior:**
-- Flag: `-DdisableMariaDBTests` (default: `false`, tests enabled)
-- MariaDB tests ran by default in main CI workflow
-- Used manually started MariaDB service in GitHub Actions
-
-**New behavior:**
-- Flag: `-DenableMariaDBTests` (default: `false`, tests disabled)
-- MariaDB tests are disabled by default
-- Must explicitly enable with `-DenableMariaDBTests=true`
-- Uses TestContainers for automatic container management
-- Has dedicated `mariadb-testing.yml` workflow
-
-## Benefits
-
-1. **No External Dependencies** - No need to set up external MariaDB
-2. **Consistency** - Same environment for all developers and CI
-3. **Isolation** - Each test run uses fresh containers
-4. **Speed** - Shared container across tests improves performance
-5. **Simplicity** - Automatic container lifecycle management
-6. **Explicit Opt-in** - Tests only run when explicitly enabled
-
-## Migration Notes
-
-If you were previously relying on MariaDB tests running automatically:
-- Update your test commands to include `-DenableMariaDBTests=true`
-- Update any CI/CD pipelines to explicitly enable MariaDB tests
-- Remove any manual MariaDB service configurations (no longer needed)
diff --git a/documents/environment-setup/cockroachdb-testing-guide.md b/documents/environment-setup/cockroachdb-testing-guide.md
index 9d8b572b0..98f88b7a7 100644
--- a/documents/environment-setup/cockroachdb-testing-guide.md
+++ b/documents/environment-setup/cockroachdb-testing-guide.md
@@ -48,8 +48,6 @@ cd ojp
mvn test -pl ojp-jdbc-driver -Dgpg.skip=true
```
-The CockroachDB integration tests will run automatically along with H2, PostgreSQL, and MySQL tests. MariaDB tests are disabled by default.
-
#### Running CockroachDB Tests in Isolation
To run **only** CockroachDB integration tests, disable the other databases that are enabled by default:
diff --git a/documents/environment-setup/mariadb-testing-guide.md b/documents/environment-setup/mariadb-testing-guide.md
index a8110b923..7628044b5 100644
--- a/documents/environment-setup/mariadb-testing-guide.md
+++ b/documents/environment-setup/mariadb-testing-guide.md
@@ -2,18 +2,41 @@
This document explains how to set up and run MariaDB Database tests with OJP using TestContainers.
+## Overview
+
+All MariaDB integration tests have been migrated to use TestContainers. This provides:
+- Automatic MariaDB container management
+- Consistent test environment across all environments
+- No need for external MariaDB instances
+- Automatic container lifecycle management
+
## Prerequisites
1. **Docker** - Required for TestContainers to run MariaDB locally
2. **MariaDB JDBC Driver** - Automatically included in test dependencies
-## Overview
+## How It Works
+
+### TestContainer Setup
+
+1. **MariaDBTestContainer** - Singleton class that manages a shared MariaDB container
+ - Located: `ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java`
+ - Uses `mariadb:10.11` Docker image
+ - Automatically starts on first test execution
+ - Shared across all MariaDB tests for efficiency
+ - Automatically stops when tests complete
-MariaDB integration tests use **TestContainers** to automatically manage the MariaDB container lifecycle. This means:
-- No manual Docker commands needed
-- Container starts automatically when tests run
-- Container stops automatically when tests complete
-- Consistent testing environment across all developers and CI
+2. **MariaDBConnectionProvider** - Custom JUnit ArgumentsProvider
+ - Located: `ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java`
+ - Provides dynamic connection details from the TestContainer
+ - Replaces CSV-based connection configuration
+
+### Test Changes
+
+All MariaDB test classes have been updated:
+- Changed from `@CsvFileSource` to `@ArgumentsSource(MariaDBConnectionProvider.class)`
+- Added `@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")` annotation
+- Tests automatically use TestContainer when `enableMariaDBTests=true`
## Running MariaDB Tests
@@ -44,7 +67,7 @@ mvn test -DenableMariaDBTests=true -DenableOracleTests=true -DenableSqlServerTes
## Test Infrastructure
-### TestContainers
+### TestContainers Configuration
The tests use the following TestContainer configuration:
- **Image**: `mariadb:10.11`
@@ -57,6 +80,27 @@ The container is managed by:
- `MariaDBTestContainer.java` - Singleton container manager
- `MariaDBConnectionProvider.java` - Provides connection parameters to tests
+### Dependencies
+
+#### ojp-jdbc-driver/pom.xml
+```xml
+
+
+ org.mariadb.jdbc
+ mariadb-java-client
+ 3.5.1
+ test
+
+
+
+
+ org.testcontainers
+ mariadb
+ 1.20.4
+ test
+
+```
+
### Test Files
MariaDB-specific test files include:
@@ -71,6 +115,26 @@ These tests are annotated with `@EnabledIf("openjproxy.jdbc.testutil.MariaDBTest
**Note:** These test files were duplicated from their MySQL counterparts (`MySQLMariaDBConnectionExtensiveTests.java`, etc.) to allow independent testing of MySQL and MariaDB with separate TestContainers and enable flags.
+### MySQL Test Files (Separate)
+
+MySQL test files (remain unchanged, using MySQLTestContainer):
+- `MySQLMariaDBConnectionExtensiveTests.java`
+- `MySQLDatabaseMetaDataExtensiveTests.java`
+- `MySQLMultipleTypesIntegrationTest.java`
+- `MySQLPreparedStatementExtensiveTests.java`
+- `MySQLSpecificFeaturesIntegrationTest.java`
+- `MySQLStatementExtensiveTests.java`
+
+### Multi-Database Tests
+
+Multi-database tests updated for both flags:
+- `BasicCrudIntegrationTest.java` (supports both `enableMySQLTests` and `enableMariaDBTests`)
+- `BlobIntegrationTest.java` (supports both `enableMySQLTests` and `enableMariaDBTests`)
+
+## Files Removed
+
+- `mysql_mariadb_connection.csv` - No longer needed with TestContainers
+
## Connection String Format
The MariaDB connection string for OJP follows this format:
@@ -140,6 +204,22 @@ docker info | grep Memory
## Differences from Previous Setup
+### Flag Change
+
+**Previous behavior:**
+- Flag: `-DdisableMariaDBTests` (default: `false`, tests enabled)
+- MariaDB tests ran by default in main CI workflow
+- Used manually started MariaDB service in GitHub Actions
+
+**New behavior:**
+- Flag: `-DenableMariaDBTests` (default: `false`, tests disabled)
+- MariaDB tests are disabled by default
+- Must explicitly enable with `-DenableMariaDBTests=true`
+- Uses TestContainers for automatic container management
+- Has dedicated `mariadb-testing.yml` workflow
+
+### Migration Summary
+
Previously, MariaDB tests:
- Used a manually started MariaDB service in CI
- Used CSV configuration files (`mysql_mariadb_connection.csv`)
@@ -151,6 +231,22 @@ Now, MariaDB tests:
- Are controlled by `-DenableMariaDBTests` flag (default false)
- Run in a dedicated CI workflow
+### Benefits
+
+1. **No External Dependencies** - No need to set up external MariaDB
+2. **Consistency** - Same environment for all developers and CI
+3. **Isolation** - Each test run uses fresh containers
+4. **Speed** - Shared container across tests improves performance
+5. **Simplicity** - Automatic container lifecycle management
+6. **Explicit Opt-in** - Tests only run when explicitly enabled
+
+### Migration Notes
+
+If you were previously relying on MariaDB tests running automatically:
+- Update your test commands to include `-DenableMariaDBTests=true`
+- Update any CI/CD pipelines to explicitly enable MariaDB tests
+- Remove any manual MariaDB service configurations (no longer needed)
+
## Additional Resources
- [MariaDB Official Documentation](https://mariadb.org/documentation/)
From 755ab98ff8ca2ae5570531061c69cbb43b50ac29 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 7 Dec 2025 13:22:46 +0000
Subject: [PATCH 44/49] Merge main branch and resolve conflicts with MariaDB
changes
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.github/workflows/db2-testing.yml | 2 +-
.github/workflows/mariadb-testing.yml | 77 ++++
.github/workflows/oracle-testing.yml | 2 +-
.github/workflows/sqlserver-testing.yml | 2 +-
.../setup_and_testing_ojp_source.md | 13 +-
.../cockroachdb-testing-guide.md | 2 +-
.../environment-setup/db2-testing-guide.md | 2 +-
.../mariadb-testing-guide.md | 254 +++++++++++
.../environment-setup/oracle-testing-guide.md | 2 +-
.../sqlserver-testing-guide.md | 2 +-
ojp-jdbc-driver/pom.xml | 18 +
.../jdbc/BasicCrudIntegrationTest.java | 114 ++++-
.../openjproxy/jdbc/BlobIntegrationTest.java | 133 +++++-
.../jdbc/MariaDBConnectionExtensiveTests.java | 338 ++++++++++++++
...MariaDBDatabaseMetaDataExtensiveTests.java | 340 ++++++++++++++
.../MariaDBMultipleTypesIntegrationTest.java | 192 ++++++++
...ariaDBPreparedStatementExtensiveTests.java | 421 ++++++++++++++++++
...ariaDBSpecificFeaturesIntegrationTest.java | 270 +++++++++++
.../jdbc/MariaDBStatementExtensiveTests.java | 334 ++++++++++++++
.../testutil/MariaDBConnectionProvider.java | 58 +++
.../jdbc/testutil/MariaDBTestContainer.java | 103 +++++
.../h2_mysql_mariadb_oracle_connections.csv | 1 -
...l_mariadb_oracle_sqlserver_connections.csv | 1 -
23 files changed, 2661 insertions(+), 20 deletions(-)
create mode 100644 .github/workflows/mariadb-testing.yml
create mode 100644 documents/environment-setup/mariadb-testing-guide.md
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBConnectionExtensiveTests.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBDatabaseMetaDataExtensiveTests.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBMultipleTypesIntegrationTest.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBPreparedStatementExtensiveTests.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBSpecificFeaturesIntegrationTest.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBStatementExtensiveTests.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java
create mode 100644 ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java
diff --git a/.github/workflows/db2-testing.yml b/.github/workflows/db2-testing.yml
index d79b7d0c7..1d3f54a4d 100644
--- a/.github/workflows/db2-testing.yml
+++ b/.github/workflows/db2-testing.yml
@@ -88,7 +88,7 @@ jobs:
-DenableDb2Tests=true \
-DdisablePostgresTests=true \
-DdisableMySQLTests=true \
- -DdisableMariaDBTests=true \
+ -DenableMariaDBTests=false \
-DenableCockroachDBTests=false \
-Dtest="Db2*"
diff --git a/.github/workflows/mariadb-testing.yml b/.github/workflows/mariadb-testing.yml
new file mode 100644
index 000000000..92d7cbf24
--- /dev/null
+++ b/.github/workflows/mariadb-testing.yml
@@ -0,0 +1,77 @@
+# This workflow runs only MariaDB integration tests using TestContainers.
+# It disables all other database integration tests to focus on MariaDB testing.
+# TestContainers automatically manages the MariaDB container lifecycle.
+name: MariaDB Integration Tests
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+ workflow_dispatch: # Allow manual triggering
+
+jobs:
+ mariadb-tests:
+ name: MariaDB Integration Tests
+ runs-on: ubuntu-latest
+
+ permissions:
+ contents: read
+
+ strategy:
+ fail-fast: false
+ matrix:
+ java-version: [ 11, 17, 21, 22 ]
+
+ steps:
+ - name: Git checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: Set up JDK 22 for build
+ uses: actions/setup-java@v4
+ with:
+ java-version: 22
+ distribution: 'temurin'
+ cache: maven
+
+ - name: Build and Install (ojp-grpc-commons) with JDK 22
+ run: mvn clean install -pl ojp-grpc-commons -am -DskipTests -Dgpg.skip=true
+
+ - name: Test (ojp-grpc-commons) with JDK 22
+ run: mvn test -pl ojp-grpc-commons -Dgpg.skip=true
+
+ - name: Build (ojp-server) with JDK 22
+ run: mvn clean install -pl ojp-server -am -DskipTests -Dgpg.skip=true
+
+ - name: Test and Run (ojp-server)
+ run: |
+ nohup java -jar ojp-server/target/ojp-server-0.2.1-snapshot-shaded.jar > /tmp/ojp-server.log 2>&1 &
+ echo $! > /tmp/ojp-server.pid
+
+ - name: Wait for ojp-server to start
+ run: sleep 10
+
+ - name: Set up JDK ${{ matrix.java-version }} for ojp-jdbc-driver
+ uses: actions/setup-java@v4
+ with:
+ java-version: ${{ matrix.java-version }}
+ distribution: 'temurin'
+ cache: maven
+
+ - name: Build (ojp-jdbc-driver) with JDK ${{ matrix.java-version }}
+ run: mvn clean install -pl ojp-jdbc-driver -am -DskipTests -Dgpg.skip=true
+
+ - name: Run MariaDB Integration Tests
+ run: |
+ mvn test -pl ojp-jdbc-driver -Dgpg.skip=true \
+ -DenableMariaDBTests=true \
+ -DenablePostgresTests=false \
+ -DenableMySQLTests=false \
+ -DdisableCockroachDBTests=true \
+ -Dtest="MariaDB*,Blob*,BasicCrud*"
+
+ - name: Show ojp-server.log
+ if: always() # ensures it runs even if previous steps fail
+ run: cat /tmp/ojp-server.log || echo "/tmp/ojp-server.log not found"
diff --git a/.github/workflows/oracle-testing.yml b/.github/workflows/oracle-testing.yml
index f733393ee..40dc9bb39 100644
--- a/.github/workflows/oracle-testing.yml
+++ b/.github/workflows/oracle-testing.yml
@@ -88,7 +88,7 @@ jobs:
-DenableOracleTests=true \
-DdisablePostgresTests=true \
-DdisableMySQLTests=true \
- -DdisableMariaDBTests=true \
+ -DenableMariaDBTests=false \
-DenableCockroachDBTests=false \
-Dtest="Oracle*"
diff --git a/.github/workflows/sqlserver-testing.yml b/.github/workflows/sqlserver-testing.yml
index 3c1e1bfbd..1dd7ed6d0 100644
--- a/.github/workflows/sqlserver-testing.yml
+++ b/.github/workflows/sqlserver-testing.yml
@@ -88,7 +88,7 @@ jobs:
-DenableSqlServerTests=true \
-DdisablePostgresTests=true \
-DdisableMySQLTests=true \
- -DdisableMariaDBTests=true \
+ -DenableMariaDBTests=false \
-DenableCockroachDBTests=false \
-Dtest="SQLServer*"
diff --git a/documents/code-contributions/setup_and_testing_ojp_source.md b/documents/code-contributions/setup_and_testing_ojp_source.md
index cc2599cde..44945eeb3 100644
--- a/documents/code-contributions/setup_and_testing_ojp_source.md
+++ b/documents/code-contributions/setup_and_testing_ojp_source.md
@@ -26,7 +26,7 @@
Navigate to the ojp-jdbc-driver folder first:
```bash
cd ojp-jdbc-driver
- mvn test -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests -DenableCockroachDBTests=false -DdisablePostgresXATests
+ mvn test -DdisablePostgresTests -DdisableMySQLTests -DenableMariaDBTests=false -DenableCockroachDBTests=false -DdisablePostgresXATests
```
**Note:** With the disable flags only H2 integration tests will run, to run the full set of integration tests you have to run all the databases locally, follow the instructions at [Run Local Databases](../../documents/environment-setup/run-local-databases.md)
@@ -41,7 +41,7 @@ We have comprehensive JDBC integration tests with OJP for the following database
- DB2
- H2
-The free and open source databases (H2, Postgres, MySQL, MariaDB and CockroachDB) jdbc drivers are packed with OJP. Integration tests for PostgreSQL, Oracle, SQL Server, DB2, and CockroachDB use TestContainers and run in dedicated CI workflows.
+The free and open source databases (H2, Postgres, MySQL and CockroachDB) JDBC drivers are packed with OJP and have integration tests always running in our CI pipelines. MariaDB, CockroachDB tests use TestContainers and are disabled by default. For proprietary databases like Oracle, SQL Server, and DB2, see their specific sections.
### Oracle Database Setup (Optional)
Oracle integration tests require the Oracle JDBC driver and due to licensing restrictions we do not pack it with OJP.
@@ -55,6 +55,10 @@ For detailed SQL Server setup instructions, see [SQL Server Testing Guide](../..
DB2 integration tests use the IBM JDBC driver which is not included in OJP dependencies.
For detailed DB2 instructions, see [DB2 Testing Guide](../../documents/environment-setup/db2-testing-guide.md).
+### MariaDB Database Setup (Optional)
+MariaDB integration tests use TestContainers to automatically manage the database lifecycle. Tests are disabled by default.
+For detailed MariaDB setup instructions, see [MariaDB Testing Guide](../../documents/environment-setup/mariadb-testing-guide.md).
+
### CockroachDB Database Setup (Optional)
CockroachDB integration tests use TestContainers which automatically manages the CockroachDB instance.
For detailed CockroachDB setup instructions, see [CockroachDB Testing Guide](../../documents/environment-setup/cockroachdb-testing-guide.md).
@@ -68,9 +72,12 @@ For detailed CockroachDB setup instructions, see [CockroachDB Testing Guide](../
### Test Options
- `-DdisablePostgresTests` - Skip PostgreSQL integration tests
+- `-DdisableMySQLTests` - Skip MySQL integration tests
+- `-DenableMariaDBTests` - Enable MariaDB integration tests (disabled by default, uses TestContainers)
- `-DenableCockroachDBTests` - Enable CockroachDB integration tests (disabled by default, uses TestContainers)
- `-DenableOracleTests` - Enable Oracle integration tests (disabled by default, requires manual Oracle JDBC driver setup)
-- `-DenableSqlServerTests` - Enable SQL Server integration tests (disabled by default)
+- `-DenableSqlServerTests` - Enable SQL Server integration tests (disabled by default, uses TestContainers)
+- `-DenableDb2Tests` - Enable DB2 integration tests (disabled by default, uses TestContainers)
### Contributing code
1. Fork the repository
diff --git a/documents/environment-setup/cockroachdb-testing-guide.md b/documents/environment-setup/cockroachdb-testing-guide.md
index ee7c58713..c7e216cac 100644
--- a/documents/environment-setup/cockroachdb-testing-guide.md
+++ b/documents/environment-setup/cockroachdb-testing-guide.md
@@ -49,7 +49,7 @@ mvn test -pl ojp-jdbc-driver \
-DenableCockroachDBTests=true \
-DdisablePostgresTests=true \
-DdisableMySQLTests=true \
- -DdisableMariaDBTests=true \
+ -DenableMariaDBTests=false \
-Dgpg.skip=true \
-Dtest="CockroachDB*"
```
diff --git a/documents/environment-setup/db2-testing-guide.md b/documents/environment-setup/db2-testing-guide.md
index 70caeca21..c30488876 100644
--- a/documents/environment-setup/db2-testing-guide.md
+++ b/documents/environment-setup/db2-testing-guide.md
@@ -49,7 +49,7 @@ To run only DB2 tests:
```bash
cd ojp-jdbc-driver
-mvn test -DenableDb2Tests -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests
+mvn test -DenableDb2Tests=true -DdisablePostgresTests -DdisableMySQLTests -DenableMariaDBTests=false
```
To run DB2 tests alongside other databases:
diff --git a/documents/environment-setup/mariadb-testing-guide.md b/documents/environment-setup/mariadb-testing-guide.md
new file mode 100644
index 000000000..7628044b5
--- /dev/null
+++ b/documents/environment-setup/mariadb-testing-guide.md
@@ -0,0 +1,254 @@
+# MariaDB Database Testing Guide
+
+This document explains how to set up and run MariaDB Database tests with OJP using TestContainers.
+
+## Overview
+
+All MariaDB integration tests have been migrated to use TestContainers. This provides:
+- Automatic MariaDB container management
+- Consistent test environment across all environments
+- No need for external MariaDB instances
+- Automatic container lifecycle management
+
+## Prerequisites
+
+1. **Docker** - Required for TestContainers to run MariaDB locally
+2. **MariaDB JDBC Driver** - Automatically included in test dependencies
+
+## How It Works
+
+### TestContainer Setup
+
+1. **MariaDBTestContainer** - Singleton class that manages a shared MariaDB container
+ - Located: `ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java`
+ - Uses `mariadb:10.11` Docker image
+ - Automatically starts on first test execution
+ - Shared across all MariaDB tests for efficiency
+ - Automatically stops when tests complete
+
+2. **MariaDBConnectionProvider** - Custom JUnit ArgumentsProvider
+ - Located: `ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java`
+ - Provides dynamic connection details from the TestContainer
+ - Replaces CSV-based connection configuration
+
+### Test Changes
+
+All MariaDB test classes have been updated:
+- Changed from `@CsvFileSource` to `@ArgumentsSource(MariaDBConnectionProvider.class)`
+- Added `@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")` annotation
+- Tests automatically use TestContainer when `enableMariaDBTests=true`
+
+## Running MariaDB Tests
+
+### Enable MariaDB Tests
+
+MariaDB tests are **disabled by default**. To run them, use the `-DenableMariaDBTests=true` flag:
+
+```bash
+cd ojp-jdbc-driver
+mvn test -DenableMariaDBTests=true
+```
+
+### Run Only MariaDB Tests
+
+To run **only** MariaDB integration tests (excluding other databases):
+
+```bash
+cd ojp-jdbc-driver
+mvn test -DenableMariaDBTests=true -DenablePostgresTests=false -DenableMySQLTests=false -DdisableCockroachDBTests=true -Dtest="MariaDB*,Blob*,BasicCrud*"
+```
+
+### Run MariaDB Tests Alongside Other Databases
+
+```bash
+cd ojp-jdbc-driver
+mvn test -DenableMariaDBTests=true -DenableOracleTests=true -DenableSqlServerTests=true
+```
+
+## Test Infrastructure
+
+### TestContainers Configuration
+
+The tests use the following TestContainer configuration:
+- **Image**: `mariadb:10.11`
+- **Database**: `defaultdb`
+- **Username**: `testuser`
+- **Password**: `testpassword`
+- **Port**: Randomly assigned by TestContainers
+
+The container is managed by:
+- `MariaDBTestContainer.java` - Singleton container manager
+- `MariaDBConnectionProvider.java` - Provides connection parameters to tests
+
+### Dependencies
+
+#### ojp-jdbc-driver/pom.xml
+```xml
+
+
+ org.mariadb.jdbc
+ mariadb-java-client
+ 3.5.1
+ test
+
+
+
+
+ org.testcontainers
+ mariadb
+ 1.20.4
+ test
+
+```
+
+### Test Files
+
+MariaDB-specific test files include:
+- `MariaDBConnectionExtensiveTests.java`
+- `MariaDBDatabaseMetaDataExtensiveTests.java`
+- `MariaDBMultipleTypesIntegrationTest.java`
+- `MariaDBPreparedStatementExtensiveTests.java`
+- `MariaDBSpecificFeaturesIntegrationTest.java`
+- `MariaDBStatementExtensiveTests.java`
+
+These tests are annotated with `@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")` to ensure they only run when MariaDB tests are explicitly enabled.
+
+**Note:** These test files were duplicated from their MySQL counterparts (`MySQLMariaDBConnectionExtensiveTests.java`, etc.) to allow independent testing of MySQL and MariaDB with separate TestContainers and enable flags.
+
+### MySQL Test Files (Separate)
+
+MySQL test files (remain unchanged, using MySQLTestContainer):
+- `MySQLMariaDBConnectionExtensiveTests.java`
+- `MySQLDatabaseMetaDataExtensiveTests.java`
+- `MySQLMultipleTypesIntegrationTest.java`
+- `MySQLPreparedStatementExtensiveTests.java`
+- `MySQLSpecificFeaturesIntegrationTest.java`
+- `MySQLStatementExtensiveTests.java`
+
+### Multi-Database Tests
+
+Multi-database tests updated for both flags:
+- `BasicCrudIntegrationTest.java` (supports both `enableMySQLTests` and `enableMariaDBTests`)
+- `BlobIntegrationTest.java` (supports both `enableMySQLTests` and `enableMariaDBTests`)
+
+## Files Removed
+
+- `mysql_mariadb_connection.csv` - No longer needed with TestContainers
+
+## Connection String Format
+
+The MariaDB connection string for OJP follows this format:
+
+```
+jdbc:ojp[localhost:1059]_mariadb://localhost:RANDOM_PORT/defaultdb
+```
+
+Where:
+- `localhost:1059` - OJP server address and port
+- `mariadb://localhost:RANDOM_PORT` - MariaDB instance (port assigned by TestContainers)
+- `defaultdb` - Target database
+
+## Skipping MariaDB Tests
+
+MariaDB tests are skipped by default when running:
+
+```bash
+mvn test
+```
+
+You can also explicitly disable MariaDB tests:
+
+```bash
+mvn test -DenableMariaDBTests=false
+```
+
+## CI/CD Integration
+
+In GitHub Actions, there is a dedicated workflow `mariadb-testing.yml` that:
+- Runs only MariaDB integration tests
+- Uses TestContainers for database management
+- Tests against multiple Java versions (11, 17, 21, 22)
+- Runs automatically on push/PR to main branch
+
+## Troubleshooting
+
+### Docker Not Running
+
+If you see errors about Docker not being available:
+
+```bash
+# Check if Docker is running
+docker info
+
+# Start Docker Desktop or Docker daemon
+```
+
+### Port Conflicts
+
+TestContainers automatically assigns random available ports, so port conflicts are unlikely. If you experience issues:
+
+```bash
+# Stop any running containers
+docker ps
+docker stop
+```
+
+### Memory Issues
+
+MariaDB TestContainers requires sufficient Docker memory allocation. Ensure Docker has at least 4GB RAM allocated:
+
+```bash
+# Check Docker resource limits
+docker info | grep Memory
+```
+
+## Differences from Previous Setup
+
+### Flag Change
+
+**Previous behavior:**
+- Flag: `-DdisableMariaDBTests` (default: `false`, tests enabled)
+- MariaDB tests ran by default in main CI workflow
+- Used manually started MariaDB service in GitHub Actions
+
+**New behavior:**
+- Flag: `-DenableMariaDBTests` (default: `false`, tests disabled)
+- MariaDB tests are disabled by default
+- Must explicitly enable with `-DenableMariaDBTests=true`
+- Uses TestContainers for automatic container management
+- Has dedicated `mariadb-testing.yml` workflow
+
+### Migration Summary
+
+Previously, MariaDB tests:
+- Used a manually started MariaDB service in CI
+- Used CSV configuration files (`mysql_mariadb_connection.csv`)
+- Were controlled by `-DdisableMariaDBTests` flag (default false)
+
+Now, MariaDB tests:
+- Use TestContainers for automatic container management
+- Use `MariaDBConnectionProvider` for test parameterization
+- Are controlled by `-DenableMariaDBTests` flag (default false)
+- Run in a dedicated CI workflow
+
+### Benefits
+
+1. **No External Dependencies** - No need to set up external MariaDB
+2. **Consistency** - Same environment for all developers and CI
+3. **Isolation** - Each test run uses fresh containers
+4. **Speed** - Shared container across tests improves performance
+5. **Simplicity** - Automatic container lifecycle management
+6. **Explicit Opt-in** - Tests only run when explicitly enabled
+
+### Migration Notes
+
+If you were previously relying on MariaDB tests running automatically:
+- Update your test commands to include `-DenableMariaDBTests=true`
+- Update any CI/CD pipelines to explicitly enable MariaDB tests
+- Remove any manual MariaDB service configurations (no longer needed)
+
+## Additional Resources
+
+- [MariaDB Official Documentation](https://mariadb.org/documentation/)
+- [TestContainers MariaDB Module](https://www.testcontainers.org/modules/databases/mariadb/)
+- [MariaDB JDBC Driver](https://mariadb.com/kb/en/about-mariadb-connector-j/)
diff --git a/documents/environment-setup/oracle-testing-guide.md b/documents/environment-setup/oracle-testing-guide.md
index 9d197e0a0..89104970b 100644
--- a/documents/environment-setup/oracle-testing-guide.md
+++ b/documents/environment-setup/oracle-testing-guide.md
@@ -42,7 +42,7 @@ To run only Oracle tests:
```bash
cd ojp-jdbc-driver
-mvn test -DenableOracleTests -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests
+mvn test -DenableOracleTests=true -DdisablePostgresTests -DdisableMySQLTests -DenableMariaDBTests=false
```
## Test Configuration Files
diff --git a/documents/environment-setup/sqlserver-testing-guide.md b/documents/environment-setup/sqlserver-testing-guide.md
index 0511665ed..9f53613dc 100644
--- a/documents/environment-setup/sqlserver-testing-guide.md
+++ b/documents/environment-setup/sqlserver-testing-guide.md
@@ -79,7 +79,7 @@ To run only SQL Server tests:
```bash
cd ojp-jdbc-driver
-mvn test -DenableSqlServerTests -DdisablePostgresTests -DdisableMySQLTests -DdisableMariaDBTests
+mvn test -DenableSqlServerTests=true -DdisablePostgresTests -DdisableMySQLTests -DenableMariaDBTests=false
```
To run SQL Server tests alongside other databases:
diff --git a/ojp-jdbc-driver/pom.xml b/ojp-jdbc-driver/pom.xml
index 933777a6f..32952f2b0 100644
--- a/ojp-jdbc-driver/pom.xml
+++ b/ojp-jdbc-driver/pom.xml
@@ -179,6 +179,24 @@
test
+
+
+
+ org.mariadb.jdbc
+ mariadb-java-client
+ 3.5.1
+ test
+
+
+
+
+
+ org.testcontainers
+ mariadb
+ 1.20.4
+ test
+
+
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
index 387a23dfb..9bd5a1df7 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
@@ -1,12 +1,15 @@
package openjproxy.jdbc;
import lombok.extern.slf4j.Slf4j;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
import openjproxy.jdbc.testutil.TestDBUtils;
import openjproxy.jdbc.testutil.TestDBUtils.ConnectionResult;
import org.junit.Assert;
import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import org.junit.jupiter.params.provider.CsvFileSource;
import java.sql.Connection;
@@ -20,7 +23,7 @@ public class BasicCrudIntegrationTest {
private static boolean isPostgresTestDisabled;
private static boolean isMySQLTestDisabled;
- private static boolean isMariaDBTestDisabled;
+ private static boolean isMariaDBTestEnabled;
private static boolean isCockroachDBTestDisabled;
private static boolean isOracleTestEnabled;
private static boolean isSqlServerTestEnabled;
@@ -31,7 +34,7 @@ public class BasicCrudIntegrationTest {
public static void setup() {
isPostgresTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
- isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
isCockroachDBTestDisabled = !Boolean.parseBoolean(System.getProperty("enableCockroachDBTests", "false"));
isOracleTestEnabled = Boolean.parseBoolean(System.getProperty("enableOracleTests", "false"));
isSqlServerTestEnabled = Boolean.parseBoolean(System.getProperty("enableSqlServerTests", "false"));
@@ -53,9 +56,9 @@ public void crudTestSuccessful(String driverClass, String url, String user, Stri
tablePrefix = "mysql_";
}
- // Skip MariaDB tests if disabled
- if (url.toLowerCase().contains("mariadb") && isMariaDBTestDisabled) {
- Assumptions.assumeFalse(true, "Skipping MariaDB tests");
+ // Skip MariaDB tests if not enabled
+ if (url.toLowerCase().contains("mariadb") && !isMariaDBTestEnabled) {
+ Assumptions.assumeFalse(true, "Skipping MariaDB tests - not enabled");
tablePrefix = "mariadb_";
}
@@ -181,4 +184,105 @@ public void crudTestSuccessful(String driverClass, String url, String user, Stri
connResult.close();
}
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ @EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
+ public void crudTestSuccessfulMariaDB(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
+ // This method tests MariaDB using TestContainers
+ tablePrefix = "mariadb_";
+ String tableName = tablePrefix + "basic_crud_test";
+
+ ConnectionResult connResult = TestDBUtils.createConnection(url, user, pwd, isXA);
+ Connection conn = connResult.getConnection();
+
+ // For non-XA connections, set autocommit to false for explicit transaction control
+ if (!isXA) {
+ conn.setAutoCommit(false);
+ }
+
+ // Start transaction if needed
+ connResult.startXATransactionIfNeeded();
+
+ // Drop table if it exists from previous test run
+ try {
+ executeUpdate(conn, "drop table " + tableName);
+ connResult.commit();
+ } catch (Exception e) {
+ // Table doesn't exist yet, ignore
+ try {
+ connResult.rollback();
+ } catch (Exception ex) {
+ // Ignore rollback errors
+ }
+ }
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ executeUpdate(conn, "create table " + tableName + "(" +
+ "id INT NOT NULL," +
+ "title VARCHAR(50) NOT NULL" +
+ ")");
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ executeUpdate(conn, " insert into " + tableName + " (id, title) values (1, 'TITLE_1')");
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ java.sql.PreparedStatement psSelect = conn.prepareStatement("select * from " + tableName + " where id = ?");
+ psSelect.setInt(1, 1);
+ ResultSet resultSet = psSelect.executeQuery();
+ resultSet.next();
+ int id = resultSet.getInt(1);
+ String title = resultSet.getString(2);
+ Assert.assertEquals(1, id);
+ Assert.assertEquals("TITLE_1", title);
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ executeUpdate(conn, " update " + tableName + " set title = 'TITLE_1_UPDATED' where id = 1");
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ ResultSet resultSetAfterUpdate = psSelect.executeQuery();
+ resultSetAfterUpdate.next();
+ String titleAfterUpdate = resultSetAfterUpdate.getString(2);
+ Assert.assertEquals("TITLE_1_UPDATED", titleAfterUpdate);
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ executeUpdate(conn, " delete from " + tableName + " where id = 1");
+ connResult.commit();
+
+ // Start new transaction for next operation
+ connResult.startXATransactionIfNeeded();
+
+ ResultSet resultSetAfterDeletion = psSelect.executeQuery();
+ Assert.assertFalse(resultSetAfterDeletion.next());
+
+ resultSet.close();
+ psSelect.close();
+
+ // Clean up - drop the test table
+ try {
+ executeUpdate(conn, "drop table " + tableName);
+ connResult.commit();
+ } catch (Exception e) {
+ // Ignore cleanup errors
+ }
+
+ connResult.close();
+ }
+
}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
index 761121aba..674c8d84e 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
@@ -1,9 +1,12 @@
package openjproxy.jdbc;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
import org.junit.Assert;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
import org.junit.jupiter.params.provider.CsvFileSource;
import java.io.ByteArrayInputStream;
@@ -22,7 +25,7 @@
public class BlobIntegrationTest {
private static boolean isMySQLTestDisabled;
- private static boolean isMariaDBTestDisabled;
+ private static boolean isMariaDBTestEnabled;
private static boolean isOracleTestEnabled;
private String tableName;
private Connection conn;
@@ -30,7 +33,7 @@ public class BlobIntegrationTest {
@BeforeAll
public static void checkTestConfiguration() {
isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
- isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
isOracleTestEnabled = Boolean.parseBoolean(System.getProperty("enableOracleTests", "false"));
}
@@ -41,7 +44,7 @@ public void setUp(String driverClass, String url, String user, String pwd) throw
assumeFalse(isMySQLTestDisabled, "MySQL tests are disabled");
this.tableName += "_mysql";
} else if (url.toLowerCase().contains("mariadb")) {
- assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+ assumeFalse(!isMariaDBTestEnabled, "MariaDB tests are not enabled");
this.tableName += "_mariadb";
} else if (url.toLowerCase().contains("oracle")) {
assumeFalse(!isOracleTestEnabled, "Oracle tests are disabled");
@@ -179,4 +182,128 @@ public void creatingAndReadingLargeBLOBsSuccessful(String driverClass, String ur
conn.close();
}
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ @EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
+ public void createAndReadingBLOBsSuccessfulMariaDB(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException, IOException {
+ // This method tests MariaDB using TestContainers
+ this.tableName = "blob_test_blob_mariadb";
+ Class.forName(driverClass);
+ this.conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing for url -> " + url);
+
+ try {
+ executeUpdate(conn, "drop table " + tableName);
+ } catch (Exception e) {
+ //If fails disregard as per the table is most possibly not created yet
+ }
+
+ executeUpdate(conn,
+ "create table " + tableName + "(" +
+ " val_blob BLOB," +
+ " val_blob2 BLOB," +
+ " val_blob3 BLOB" +
+ ")"
+ );
+
+ PreparedStatement psInsert = conn.prepareStatement(
+ " insert into " + tableName + " (val_blob, val_blob2, val_blob3) values (?, ?, ?)"
+ );
+
+ byte[] blobBytes = {1, 2, 3, 4, 5, 6};
+ Blob blob = conn.createBlob();
+ blob.setBytes(1, blobBytes);
+
+ psInsert.setBlob(1, blob);
+
+ InputStream inputStream = new ByteArrayInputStream(blobBytes);
+ psInsert.setBlob(2, inputStream);
+
+ psInsert.setBytes(3, blobBytes);
+
+ psInsert.executeUpdate();
+
+ psInsert.close();
+
+ PreparedStatement psSelect = conn.prepareStatement("select * from " + tableName);
+ ResultSet resultSet = psSelect.executeQuery();
+ resultSet.next();
+
+ Blob blobFromDB = resultSet.getBlob(1);
+ byte[] bytesFromDB = blobFromDB.getBytes(1, (int) blobFromDB.length());
+ Assert.assertArrayEquals(blobBytes, bytesFromDB);
+
+ Blob blobFromDB2 = resultSet.getBlob(2);
+ byte[] bytesFromDB2 = blobFromDB2.getBytes(1, (int) blobFromDB2.length());
+ Assert.assertArrayEquals(blobBytes, bytesFromDB2);
+
+ byte[] bytesFromDB3 = resultSet.getBytes(3);
+ Assert.assertArrayEquals(blobBytes, bytesFromDB3);
+
+ executeUpdate(conn, "delete from " + tableName);
+
+ resultSet.close();
+ psSelect.close();
+ conn.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ @EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
+ public void creatingAndReadingLargeBLOBsSuccessfulMariaDB(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, IOException, ClassNotFoundException {
+ // This method tests MariaDB using TestContainers
+ this.tableName = "blob_test_blob_mariadb";
+ Class.forName(driverClass);
+ this.conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing for url -> " + url);
+
+ try {
+ executeUpdate(conn, "drop table " + tableName);
+ } catch (Exception e) {
+ //If fails disregard as per the table is most possibly not created yet
+ }
+
+ executeUpdate(conn,
+ "create table " + tableName + "(" +
+ " val_blob BLOB" +
+ ")"
+ );
+
+ PreparedStatement psInsert = conn.prepareStatement(
+ "insert into " + tableName + " (val_blob) values (?)"
+ );
+
+ // Use the same largeTextFile.txt resource as the original CSV-based test
+ InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("largeTextFile.txt");
+ psInsert.setBlob(1, inputStream);
+
+ psInsert.executeUpdate();
+
+ PreparedStatement psSelect = conn.prepareStatement("select val_blob from " + tableName);
+ ResultSet resultSet = psSelect.executeQuery();
+ resultSet.next();
+ Blob blobResult = resultSet.getBlob(1);
+
+ InputStream inputStreamTestFile = this.getClass().getClassLoader().getResourceAsStream("largeTextFile.txt");
+ InputStream inputStreamBlob = blobResult.getBinaryStream();
+
+ int byteFile = inputStreamTestFile.read();
+ int count = 0;
+ while (byteFile != -1) {
+ count++;
+ int blobByte = inputStreamBlob.read();
+
+ Assert.assertEquals(byteFile, blobByte);
+ byteFile = inputStreamTestFile.read();
+ }
+
+ executeUpdate(conn, "delete from " + tableName);
+
+ resultSet.close();
+ psSelect.close();
+ conn.close();
+ }
+
}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBConnectionExtensiveTests.java
new file mode 100644
index 000000000..e429916e8
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBConnectionExtensiveTests.java
@@ -0,0 +1,338 @@
+package openjproxy.jdbc;
+
+import lombok.SneakyThrows;
+import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
+import org.junit.Assert;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+
+import java.sql.CallableStatement;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLClientInfoException;
+import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.sql.SQLWarning;
+import java.sql.Savepoint;
+import java.sql.Statement;
+import java.util.Properties;
+
+import static org.junit.jupiter.api.Assumptions.assumeFalse;
+
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
+public class MariaDBConnectionExtensiveTests {
+
+ private static boolean isMariaDBTestEnabled;
+ private static boolean isMariaDBTestDisabled;
+ private Connection connection;
+
+ @BeforeAll
+ public static void checkTestConfiguration() {
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
+ isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ }
+
+ @SneakyThrows
+ public void setUp(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ // MariaDB tests controlled by @EnabledIf annotation
+ assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+ connection = DriverManager.getConnection(url, user, password);
+ }
+
+ @AfterEach
+ public void tearDown() throws SQLException {
+ TestDBUtils.closeQuietly(connection);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testCreateStatement(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ Statement statement = connection.createStatement();
+ Assert.assertNotNull(statement);
+ statement.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testPrepareStatement(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ PreparedStatement preparedStatement = connection.prepareStatement("SELECT 1");
+ Assert.assertNotNull(preparedStatement);
+ preparedStatement.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testPrepareCall(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ // MySQL supports callable statements, though syntax may differ
+ try {
+ CallableStatement callableStatement = connection.prepareCall("CALL test_procedure()");
+ Assert.assertNotNull(callableStatement);
+ callableStatement.close();
+ } catch (SQLException e) {
+ // This is expected if the procedure doesn't exist - test that the method works
+ Assert.assertTrue(e.getMessage().contains("PROCEDURE") || e.getMessage().contains("procedure"));
+ }
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testNativeSQL(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ String nativeSQL = connection.nativeSQL("SELECT {fn NOW()}");
+ Assert.assertNotNull(nativeSQL);
+ // MySQL should convert JDBC escape sequence
+ Assert.assertTrue(nativeSQL.contains("NOW()") || nativeSQL.contains("SELECT"));
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testAutoCommit(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ // Test getting and setting auto-commit
+ boolean originalAutoCommit = connection.getAutoCommit();
+
+ connection.setAutoCommit(false);
+ Assert.assertEquals(false, connection.getAutoCommit());
+
+ connection.setAutoCommit(true);
+ Assert.assertEquals(true, connection.getAutoCommit());
+
+ // Restore original state
+ connection.setAutoCommit(originalAutoCommit);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testCommitAndRollback(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ // Test commit and rollback operations
+ connection.setAutoCommit(false);
+
+ // These should not throw exceptions
+ connection.commit();
+ connection.rollback();
+
+ connection.setAutoCommit(true);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testIsClosed(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ Assert.assertEquals(false, connection.isClosed());
+
+ connection.close();
+ Assert.assertEquals(true, connection.isClosed());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGetMetaData(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ DatabaseMetaData metaData = connection.getMetaData();
+ Assert.assertNotNull(metaData);
+
+ String databaseProductName = metaData.getDatabaseProductName();
+ Assert.assertNotNull(databaseProductName);
+ if (url.toLowerCase().contains("mysql"))
+ Assert.assertTrue(databaseProductName.toLowerCase().contains("mysql"));
+ else
+ Assert.assertTrue(databaseProductName.toLowerCase().contains("mariadb"));
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testReadOnly(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ // Test read-only mode
+ boolean originalReadOnly = connection.isReadOnly();
+
+ try {
+ connection.setReadOnly(true);
+ // MySQL may or may not support read-only mode depending on configuration
+ // Just test that the call doesn't throw an unexpected exception
+ } catch (SQLException e) {
+ // Some MySQL configurations may not support read-only mode
+ // This is acceptable
+ }
+
+ // Restore original state
+ connection.setReadOnly(originalReadOnly);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testCatalog(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ String catalog = connection.getCatalog();
+ // Catalog might be null or the database name
+
+ // Test setting catalog (should work in MySQL)
+ if (catalog != null) {
+ connection.setCatalog(catalog);
+ Assert.assertEquals(catalog, connection.getCatalog());
+ }
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testTransactionIsolation(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ int isolationLevel = connection.getTransactionIsolation();
+ Assert.assertTrue(isolationLevel >= Connection.TRANSACTION_NONE && isolationLevel <= Connection.TRANSACTION_SERIALIZABLE);
+
+ // Test setting transaction isolation level
+ connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
+ Assert.assertEquals(Connection.TRANSACTION_READ_COMMITTED, connection.getTransactionIsolation());
+
+ // Restore original level
+ connection.setTransactionIsolation(isolationLevel);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testWarnings(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ // Test warning operations
+ SQLWarning warnings = connection.getWarnings();
+ // Warnings might be null initially
+
+ connection.clearWarnings();
+ // Should not throw exception
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testCreateStatementWithParameters(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ Statement statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+ Assert.assertNotNull(statement);
+ statement.close();
+
+ statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
+ Assert.assertNotNull(statement);
+ statement.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testPrepareStatementWithParameters(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ PreparedStatement ps = connection.prepareStatement("SELECT 1", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
+ Assert.assertNotNull(ps);
+ ps.close();
+
+ ps = connection.prepareStatement("SELECT 1", Statement.RETURN_GENERATED_KEYS);
+ Assert.assertNotNull(ps);
+ ps.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testHoldability(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ int holdability = connection.getHoldability();
+ Assert.assertTrue(holdability == ResultSet.HOLD_CURSORS_OVER_COMMIT || holdability == ResultSet.CLOSE_CURSORS_AT_COMMIT);
+
+ // Test setting holdability
+ connection.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
+ Assert.assertEquals(ResultSet.HOLD_CURSORS_OVER_COMMIT, connection.getHoldability());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testSavepoints(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ connection.setAutoCommit(false);
+
+ // Test unnamed savepoint
+ Savepoint savepoint1 = connection.setSavepoint();
+ Assert.assertNotNull(savepoint1);
+
+ // Test named savepoint
+ Savepoint savepoint2 = connection.setSavepoint("test_savepoint");
+ Assert.assertNotNull(savepoint2);
+ Assert.assertEquals("test_savepoint", savepoint2.getSavepointName());
+
+ // Test rollback to savepoint
+ connection.rollback(savepoint2);
+ connection.rollback(savepoint1);
+
+ // Test release savepoint
+ connection.releaseSavepoint(savepoint1);
+
+ connection.setAutoCommit(true);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testClientInfo(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ Properties clientInfo = connection.getClientInfo();
+ Assert.assertNotNull(clientInfo);
+
+ // Test setting client info
+ try {
+ connection.setClientInfo("ApplicationName", "MySQLTest");
+ // Should not throw exception, though MySQL may not support all properties
+ } catch (SQLClientInfoException e) {
+ // This is acceptable for MySQL
+ }
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testValid(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ boolean isValid = connection.isValid(5);
+ Assert.assertTrue(isValid);
+
+ // Test with closed connection
+ connection.close();
+ isValid = connection.isValid(5);
+ Assert.assertEquals(false, isValid);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testUnsupportedOperations(String driverClass, String url, String user, String password, boolean isXA) throws SQLException {
+ setUp(driverClass, url, user, password, isXA);
+
+ // Test operations that might not be supported
+ Assert.assertThrows(SQLException.class, () -> {
+ connection.createArrayOf("VARCHAR", new String[]{"test"});
+ });
+
+ Assert.assertThrows(SQLFeatureNotSupportedException.class, () -> {
+ connection.createStruct("test_type", new Object[]{});
+ });
+ }
+}
\ No newline at end of file
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBDatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBDatabaseMetaDataExtensiveTests.java
new file mode 100644
index 000000000..c2131b5ac
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBDatabaseMetaDataExtensiveTests.java
@@ -0,0 +1,340 @@
+package openjproxy.jdbc;
+
+import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
+import org.junit.Assert;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+
+import static org.junit.jupiter.api.Assumptions.assumeFalse;
+
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
+public class MariaDBDatabaseMetaDataExtensiveTests {
+
+ private static boolean isMariaDBTestEnabled;
+ private static boolean isMariaDBTestDisabled;
+ private static Connection connection;
+
+ @BeforeAll
+ public static void checkTestConfiguration() {
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
+ isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ }
+
+ public void setUp(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ // MariaDB tests controlled by @EnabledIf annotation
+ assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+ connection = DriverManager.getConnection(url, user, password);
+ TestDBUtils.createBasicTestTable(connection, "mysql_db_metadata_test", TestDBUtils.SqlSyntax.MYSQL, true);
+ }
+
+ @AfterAll
+ public static void teardown() throws Exception {
+ TestDBUtils.closeQuietly(connection);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ Assert.assertNotNull(meta.getDatabaseProductName());
+ if (url.toLowerCase().contains("mysql"))
+ Assert.assertTrue(meta.getDatabaseProductName().toLowerCase().contains("mysql"));
+ else
+ Assert.assertTrue(meta.getDatabaseProductName().toLowerCase().contains("mariadb"));
+
+ Assert.assertNotNull(meta.getDatabaseProductVersion());
+ Assert.assertNotNull(meta.getDriverName());
+ Assert.assertNotNull(meta.getDriverVersion());
+ Assert.assertTrue(meta.getDriverMajorVersion() > 0);
+
+ // URL and user info
+ Assert.assertNotNull(meta.getURL());
+ if (url.toLowerCase().contains("mysql"))
+ Assert.assertTrue(meta.getURL().contains("mysql"));
+ else
+ Assert.assertTrue(meta.getURL().contains("mariadb"));
+
+ Assert.assertNotNull(meta.getUserName());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ Assert.assertTrue(meta.supportsTransactions());
+ if (url.toLowerCase().contains("mysql"))
+ Assert.assertFalse(meta.supportsDataDefinitionAndDataManipulationTransactions());
+ else
+ Assert.assertTrue(meta.supportsDataDefinitionAndDataManipulationTransactions());
+ Assert.assertFalse(meta.supportsDataManipulationTransactionsOnly());
+ Assert.assertTrue(meta.supportsResultSetType(ResultSet.TYPE_FORWARD_ONLY));
+ Assert.assertTrue(meta.supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY));
+
+ // MySQL supports various SQL features
+ Assert.assertTrue(meta.supportsAlterTableWithAddColumn());
+ Assert.assertTrue(meta.supportsAlterTableWithDropColumn());
+ Assert.assertTrue(meta.supportsUnion());
+ Assert.assertTrue(meta.supportsUnionAll());
+ if (url.toLowerCase().contains("mysql"))
+ Assert.assertFalse(meta.supportsOrderByUnrelated());
+ else
+ Assert.assertTrue(meta.supportsOrderByUnrelated());
+ Assert.assertTrue(meta.supportsGroupBy());
+ Assert.assertTrue(meta.supportsGroupByUnrelated());
+ Assert.assertTrue(meta.supportsLikeEscapeClause());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ Assert.assertNotNull(meta.getIdentifierQuoteString());
+ Assert.assertEquals("`", meta.getIdentifierQuoteString());
+ Assert.assertNotNull(meta.getSQLKeywords());
+ Assert.assertNotNull(meta.getExtraNameCharacters());
+
+ // Case sensitivity - MySQL varies by platform
+ // Just test that these methods don't throw exceptions
+ meta.supportsMixedCaseIdentifiers();
+ meta.storesUpperCaseIdentifiers();
+ meta.storesLowerCaseIdentifiers();
+ meta.storesMixedCaseIdentifiers();
+ meta.supportsMixedCaseQuotedIdentifiers();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ Assert.assertTrue(meta.supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_COMMITTED));
+ Assert.assertTrue(meta.supportsTransactionIsolationLevel(Connection.TRANSACTION_READ_UNCOMMITTED));
+ Assert.assertTrue(meta.supportsTransactionIsolationLevel(Connection.TRANSACTION_REPEATABLE_READ));
+ Assert.assertTrue(meta.supportsTransactionIsolationLevel(Connection.TRANSACTION_SERIALIZABLE));
+
+ // Default transaction isolation
+ int defaultIsolation = meta.getDefaultTransactionIsolation();
+ Assert.assertTrue(defaultIsolation >= Connection.TRANSACTION_NONE &&
+ defaultIsolation <= Connection.TRANSACTION_SERIALIZABLE);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ Assert.assertNotNull(meta.getNumericFunctions());
+ Assert.assertNotNull(meta.getStringFunctions());
+ Assert.assertNotNull(meta.getSystemFunctions());
+ Assert.assertNotNull(meta.getTimeDateFunctions());
+
+ // MySQL should support common functions
+ String numericFunctions = meta.getNumericFunctions().toUpperCase();
+ String stringFunctions = meta.getStringFunctions().toUpperCase();
+ String timeDateFunctions = meta.getTimeDateFunctions().toUpperCase();
+
+ // Verify some common MySQL functions are listed
+ Assert.assertTrue(numericFunctions.contains("ABS") || numericFunctions.contains("ROUND"));
+ Assert.assertTrue(stringFunctions.contains("CONCAT") || stringFunctions.contains("LENGTH"));
+ Assert.assertTrue(timeDateFunctions.contains("NOW") || timeDateFunctions.contains("CURDATE"));
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ Assert.assertTrue(meta.supportsResultSetType(ResultSet.TYPE_FORWARD_ONLY));
+ // MySQL may or may not support scrollable result sets depending on configuration
+ meta.supportsResultSetType(ResultSet.TYPE_SCROLL_INSENSITIVE);
+ meta.supportsResultSetType(ResultSet.TYPE_SCROLL_SENSITIVE);
+
+ // ResultSet concurrency support
+ Assert.assertTrue(meta.supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY));
+ meta.supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
+
+ // ResultSet holdability
+ Assert.assertTrue(meta.supportsResultSetHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT) ||
+ meta.supportsResultSetHoldability(ResultSet.CLOSE_CURSORS_AT_COMMIT));
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ ResultSet tables = meta.getTables(null, null, "%", new String[]{"TABLE"});
+ Assert.assertNotNull(tables);
+
+ boolean foundTestTable = false;
+ while (tables.next()) {
+ String tableName = tables.getString("TABLE_NAME");
+ if ("mysql_db_metadata_test".equals(tableName)) {
+ foundTestTable = true;
+ Assert.assertEquals("TABLE", tables.getString("TABLE_TYPE"));
+ break;
+ }
+ }
+ Assert.assertTrue("Should find the test table we created", foundTestTable);
+ tables.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ ResultSet columns = meta.getColumns(null, null, "mysql_db_metadata_test", "%");
+ Assert.assertNotNull(columns);
+
+ boolean foundIdColumn = false;
+ boolean foundNameColumn = false;
+ while (columns.next()) {
+ String columnName = columns.getString("COLUMN_NAME");
+ if ("id".equals(columnName)) {
+ foundIdColumn = true;
+ Assert.assertEquals("INT", columns.getString("TYPE_NAME").toUpperCase());
+ } else if ("name".equals(columnName)) {
+ foundNameColumn = true;
+ Assert.assertEquals("VARCHAR", columns.getString("TYPE_NAME").toUpperCase());
+ }
+ }
+ Assert.assertTrue("Should find id column", foundIdColumn);
+ Assert.assertTrue("Should find name column", foundNameColumn);
+ columns.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ ResultSet primaryKeys = meta.getPrimaryKeys(null, null, "mysql_db_metadata_test");
+ Assert.assertNotNull(primaryKeys);
+
+ boolean foundPrimaryKey = false;
+ while (primaryKeys.next()) {
+ String columnName = primaryKeys.getString("COLUMN_NAME");
+ if ("id".equals(columnName)) {
+ foundPrimaryKey = true;
+ Assert.assertEquals("mysql_db_metadata_test", primaryKeys.getString("TABLE_NAME"));
+ Assert.assertEquals((short) 1, primaryKeys.getShort("KEY_SEQ"));
+ break;
+ }
+ }
+ Assert.assertTrue("Should find primary key on id column", foundPrimaryKey);
+ primaryKeys.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ ResultSet typeInfo = meta.getTypeInfo();
+ Assert.assertNotNull(typeInfo);
+
+ boolean foundIntType = false;
+ boolean foundVarcharType = false;
+ while (typeInfo.next()) {
+ String typeName = typeInfo.getString("TYPE_NAME").toUpperCase();
+ if (typeName.contains("INT")) {
+ foundIntType = true;
+ } else if (typeName.contains("VARCHAR")) {
+ foundVarcharType = true;
+ }
+ }
+ Assert.assertTrue("Should find integer type", foundIntType);
+ Assert.assertTrue("Should find varchar type", foundVarcharType);
+ typeInfo.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ Assert.assertTrue(meta.supportsSubqueriesInComparisons());
+ Assert.assertTrue(meta.supportsSubqueriesInExists());
+ Assert.assertTrue(meta.supportsSubqueriesInIns());
+ Assert.assertTrue(meta.supportsCorrelatedSubqueries());
+
+ // Batch updates
+ Assert.assertTrue(meta.supportsBatchUpdates());
+
+ // Savepoints
+ Assert.assertTrue(meta.supportsSavepoints());
+
+ // Get/Set autocommit
+ Assert.assertTrue(meta.supportsGetGeneratedKeys());
+
+ // Named parameters in callable statements
+ meta.supportsNamedParameters(); // May return false, which is fine
+
+ // Multiple open results
+ meta.supportsMultipleOpenResults(); // Depends on MySQL version/config
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ 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
+ Assert.assertTrue(meta.getMaxBinaryLiteralLength() >= 0);
+ Assert.assertTrue(meta.getMaxCharLiteralLength() >= 0);
+ Assert.assertTrue(meta.getMaxColumnNameLength() >= 0);
+ Assert.assertTrue(meta.getMaxColumnsInGroupBy() >= 0);
+ Assert.assertTrue(meta.getMaxColumnsInIndex() >= 0);
+ Assert.assertTrue(meta.getMaxColumnsInOrderBy() >= 0);
+ Assert.assertTrue(meta.getMaxColumnsInSelect() >= 0);
+ Assert.assertTrue(meta.getMaxColumnsInTable() >= 0);
+ Assert.assertTrue(meta.getMaxConnections() >= 0);
+ Assert.assertTrue(meta.getMaxCursorNameLength() >= 0);
+ Assert.assertTrue(meta.getMaxIndexLength() >= 0);
+ Assert.assertTrue(meta.getMaxSchemaNameLength() >= 0);
+ Assert.assertTrue(meta.getMaxProcedureNameLength() >= 0);
+ Assert.assertTrue(meta.getMaxCatalogNameLength() >= 0);
+ Assert.assertTrue(meta.getMaxRowSize() >= 0);
+ Assert.assertTrue(meta.getMaxStatementLength() >= 0);
+ Assert.assertTrue(meta.getMaxStatements() >= 0);
+ Assert.assertTrue(meta.getMaxTableNameLength() >= 0);
+ Assert.assertTrue(meta.getMaxTablesInSelect() >= 0);
+ Assert.assertTrue(meta.getMaxUserNameLength() >= 0);
+ }
+}
\ No newline at end of file
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBMultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBMultipleTypesIntegrationTest.java
new file mode 100644
index 000000000..bc8b2a438
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBMultipleTypesIntegrationTest.java
@@ -0,0 +1,192 @@
+package openjproxy.jdbc;
+
+import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
+import org.junit.Assert;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.Date;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+
+import static org.junit.jupiter.api.Assumptions.assumeFalse;
+
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
+public class MariaDBMultipleTypesIntegrationTest {
+
+ private static boolean isMariaDBTestEnabled;
+ private static boolean isMariaDBTestDisabled;
+
+ @BeforeAll
+ public static void checkTestConfiguration() {
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
+ isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void typesCoverageTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, ParseException {
+ // MariaDB tests controlled by @EnabledIf annotation
+ assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+
+ Connection conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing for url -> " + url);
+
+ TestDBUtils.createMultiTypeTestTable(conn, "mysql_multi_types_test", TestDBUtils.SqlSyntax.MYSQL);
+
+ java.sql.PreparedStatement psInsert = conn.prepareStatement(
+ "insert into mysql_multi_types_test (val_int, val_varchar, val_double_precision, val_bigint, val_tinyint, " +
+ "val_smallint, val_boolean, val_decimal, val_float, val_byte, val_binary, val_date, val_time, " +
+ "val_timestamp) " +
+ "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
+ );
+
+ psInsert.setInt(1, 1);
+ psInsert.setString(2, "TITLE_1");
+ psInsert.setDouble(3, 2.2222d);
+ psInsert.setLong(4, 33333333333333l);
+ psInsert.setInt(5, 127);
+ psInsert.setInt(6, 32767);
+ psInsert.setBoolean(7, true);
+ psInsert.setBigDecimal(8, new BigDecimal(10));
+ psInsert.setFloat(9, 20.20f);
+ psInsert.setByte(10, (byte) 1);
+ psInsert.setBytes(11, "AAAA".getBytes());
+
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ Date valDate = new Date(sdf.parse("2024-12-01").getTime());
+ psInsert.setDate(12, valDate);
+
+ SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
+ Time valTime = new Time(sdfTime.parse("10:10:10").getTime());
+ psInsert.setTime(13, valTime);
+
+ SimpleDateFormat sdfTimestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ Timestamp valTimestamp = new Timestamp(sdfTimestamp.parse("2024-12-01 10:10:10").getTime());
+ psInsert.setTimestamp(14, valTimestamp);
+
+ psInsert.executeUpdate();
+
+ java.sql.PreparedStatement psSelect = conn.prepareStatement("select * from mysql_multi_types_test where val_int = ?");
+ psSelect.setInt(1, 1);
+ ResultSet resultSet = psSelect.executeQuery();
+ resultSet.next();
+
+ // Validate all data types
+ int valInt = resultSet.getInt(1);
+ String valVarchar = resultSet.getString(2);
+ double valDoublePrecision = resultSet.getDouble(3);
+ long valBigint = resultSet.getLong(4);
+ int valTinyint = resultSet.getInt(5);
+ int valSmallint = resultSet.getInt(6);
+ boolean valBoolean = resultSet.getBoolean(7);
+ BigDecimal valDecimal = resultSet.getBigDecimal(8);
+ float valFloat = resultSet.getFloat(9);
+ byte valByte = resultSet.getByte(10);
+ byte[] valBinary = resultSet.getBytes(11);
+ Date valDateRet = resultSet.getDate(12);
+ Time valTimeRet = resultSet.getTime(13);
+ Timestamp valTimestampRet = resultSet.getTimestamp(14);
+
+ // Assertions
+ Assert.assertEquals(1, valInt);
+ Assert.assertEquals("TITLE_1", valVarchar);
+ Assert.assertEquals(2.2222d, valDoublePrecision, 0.00001);
+ Assert.assertEquals(33333333333333l, valBigint);
+ Assert.assertEquals(127, valTinyint);
+ Assert.assertEquals(32767, valSmallint);
+ Assert.assertEquals(true, valBoolean);
+ Assert.assertEquals(new BigDecimal(10), valDecimal);
+ Assert.assertEquals(20.20f, valFloat, 0.001);
+ Assert.assertEquals((byte) 49, valByte);//Mysql return the byte as a character somehow and the byte value of character 1 is 49 (tested with direct connection)
+ Assert.assertEquals("AAAA", new String(valBinary));
+ Assert.assertEquals(valDate, valDateRet);
+ Assert.assertEquals(valTime, valTimeRet);
+ Assert.assertEquals(valTimestamp, valTimestampRet);
+
+ resultSet.close();
+ psSelect.close();
+ psInsert.close();
+ conn.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void mysqlSpecificTypesTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
+ // MariaDB tests controlled by @EnabledIf annotation
+
+ Connection conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing MySQL-specific types for url -> " + url);
+
+ TestDBUtils.createMySQLSpecificTestTable(conn, "mysql_specific_types_test");
+
+ java.sql.PreparedStatement psInsert = conn.prepareStatement(
+ "insert into mysql_specific_types_test (enum_col, json_col, text_col, mediumtext_col, " +
+ "longtext_col, blob_col, mediumblob_col, longblob_col, set_col, year_col, bit_col) " +
+ "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
+ );
+
+ psInsert.setString(1, "medium");
+ psInsert.setString(2, "{\"key\": \"value\", \"number\": 42}");
+ psInsert.setString(3, "This is a TEXT column");
+ psInsert.setString(4, "This is a MEDIUMTEXT column with more content");
+ psInsert.setString(5, "This is a LONGTEXT column with even more content");
+ psInsert.setBytes(6, "BLOB data".getBytes());
+ psInsert.setBytes(7, "MEDIUMBLOB data".getBytes());
+ psInsert.setBytes(8, "LONGBLOB data".getBytes());
+ psInsert.setString(9, "option1,option3");
+ psInsert.setInt(10, 2024);
+ psInsert.setByte(11, (byte) 0b101010);
+
+ psInsert.executeUpdate();
+
+ java.sql.PreparedStatement psSelect = conn.prepareStatement("select * from mysql_specific_types_test where id = LAST_INSERT_ID()");
+ ResultSet resultSet = psSelect.executeQuery();
+ resultSet.next();
+
+ // Validate MySQL-specific data types
+ int id = resultSet.getInt(1);
+ String enumCol = resultSet.getString(2);
+ String jsonCol = resultSet.getString(3);
+ String textCol = resultSet.getString(4);
+ String mediumtextCol = resultSet.getString(5);
+ String longtextCol = resultSet.getString(6);
+ byte[] blobCol = resultSet.getBytes(7);
+ byte[] mediumblobCol = resultSet.getBytes(8);
+ byte[] longblobCol = resultSet.getBytes(9);
+ String setCol = resultSet.getString(10);
+ int yearCol = resultSet.getInt(11);
+ byte bitCol = resultSet.getByte(12);
+
+ // Assertions
+ Assert.assertTrue(id > 0);
+ Assert.assertEquals("medium", enumCol);
+ Assert.assertEquals("{\"key\": \"value\", \"number\": 42}", jsonCol);
+ Assert.assertEquals("This is a TEXT column", textCol);
+ Assert.assertEquals("This is a MEDIUMTEXT column with more content", mediumtextCol);
+ Assert.assertEquals("This is a LONGTEXT column with even more content", longtextCol);
+ Assert.assertEquals("BLOB data", new String(blobCol));
+ Assert.assertEquals("MEDIUMBLOB data", new String(mediumblobCol));
+ Assert.assertEquals("LONGBLOB data", new String(longblobCol));
+ Assert.assertEquals("option1,option3", setCol);
+ Assert.assertEquals(2024, yearCol);
+ Assert.assertEquals((byte) 0b101010, bitCol);
+
+ resultSet.close();
+ psSelect.close();
+ psInsert.close();
+ conn.close();
+ }
+}
\ No newline at end of file
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBPreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBPreparedStatementExtensiveTests.java
new file mode 100644
index 000000000..26037eb43
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBPreparedStatementExtensiveTests.java
@@ -0,0 +1,421 @@
+package openjproxy.jdbc;
+
+import openjproxy.jdbc.testutil.TestDBUtils;
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
+import org.junit.Assert;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+
+import java.io.ByteArrayInputStream;
+import java.io.StringReader;
+import java.math.BigDecimal;
+import java.sql.Connection;
+import java.sql.Date;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.sql.Types;
+
+import static org.junit.jupiter.api.Assumptions.assumeFalse;
+
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
+public class MariaDBPreparedStatementExtensiveTests {
+
+ private static boolean isMariaDBTestEnabled;
+ private static boolean isMariaDBTestDisabled;
+ private Connection connection;
+ private PreparedStatement ps;
+
+ @BeforeAll
+ public static void checkTestConfiguration() {
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
+ isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ }
+
+ public void setUp(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ // MariaDB tests controlled by @EnabledIf annotation
+ assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+
+ connection = DriverManager.getConnection(url, user, password);
+ Statement stmt = connection.createStatement();
+ try {
+ stmt.execute("DROP TABLE mysql_prepared_stmt_test");
+ } catch (SQLException ignore) {}
+ stmt.execute("CREATE TABLE mysql_prepared_stmt_test (" +
+ "id INT PRIMARY KEY, " +
+ "name VARCHAR(255), " +
+ "age INT, " +
+ "data BLOB, " +
+ "info TEXT, " +
+ "dt DATE, " +
+ "tm TIME, " +
+ "ts TIMESTAMP)");
+ stmt.close();
+ }
+
+ @AfterEach
+ public void tearDown() throws Exception {
+ TestDBUtils.closeQuietly(ps, connection);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testBasicParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
+
+ // Test basic parameter setters
+ ps.setInt(1, 1);
+ ps.setString(2, "Alice");
+ ps.setInt(3, 25);
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ // Verify the insert
+ ps = connection.prepareStatement("SELECT id, name, age FROM mysql_prepared_stmt_test WHERE id = ?");
+ ps.setInt(1, 1);
+ ResultSet rs = ps.executeQuery();
+ Assert.assertTrue(rs.next());
+ Assert.assertEquals(1, rs.getInt("id"));
+ Assert.assertEquals("Alice", rs.getString("name"));
+ Assert.assertEquals(25, rs.getInt("age"));
+ rs.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testNumericParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
+
+ // Test numeric parameter setters
+ ps.setLong(1, 2L);
+ ps.setString(2, "Bob");
+ ps.setShort(3, (short) 30);
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ ps.setByte(1, (byte) 3);
+ ps.setString(2, "Charlie");
+ ps.setFloat(3, 35.5f);
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ ps.setDouble(1, 4.0);
+ ps.setString(2, "David");
+ ps.setBigDecimal(3, BigDecimal.valueOf(40));
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ ps.setBoolean(1, true); // Will be converted to 1
+ ps.setString(2, "Eve");
+ ps.setInt(3, 45);
+ Assert.assertEquals(1, ps.executeUpdate());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testDateTimeParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, dt, tm, ts) VALUES (?, ?, ?, ?, ?)");
+
+ Date testDate = Date.valueOf("2024-12-01");
+ Time testTime = Time.valueOf("10:30:45");
+ Timestamp testTimestamp = Timestamp.valueOf("2024-12-01 10:30:45");
+
+ ps.setInt(1, 10);
+ ps.setString(2, "DateTest");
+ ps.setDate(3, testDate);
+ ps.setTime(4, testTime);
+ ps.setTimestamp(5, testTimestamp);
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ // Verify the data
+ ps = connection.prepareStatement("SELECT dt, tm, ts FROM mysql_prepared_stmt_test WHERE id = ?");
+ ps.setInt(1, 10);
+ ResultSet rs = ps.executeQuery();
+ Assert.assertTrue(rs.next());
+ Assert.assertEquals(testDate, rs.getDate("dt"));
+ Assert.assertEquals(testTime, rs.getTime("tm"));
+ Assert.assertEquals(testTimestamp, rs.getTimestamp("ts"));
+ rs.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testBinaryParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, data) VALUES (?, ?, ?)");
+
+ byte[] testData = "Hello World".getBytes();
+ ps.setInt(1, 20);
+ ps.setString(2, "BinaryTest");
+ ps.setBytes(3, testData);
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ // Test with InputStream
+ ps.setInt(1, 21);
+ ps.setString(2, "StreamTest");
+ ps.setBinaryStream(3, new ByteArrayInputStream(testData));
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ // Verify the data
+ ps = connection.prepareStatement("SELECT data FROM mysql_prepared_stmt_test WHERE id = ?");
+ ps.setInt(1, 20);
+ ResultSet rs = ps.executeQuery();
+ Assert.assertTrue(rs.next());
+ byte[] retrievedData = rs.getBytes("data");
+ Assert.assertEquals("Hello World", new String(retrievedData));
+ rs.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testTextParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, info) VALUES (?, ?, ?)");
+
+ String testText = "This is a test text for TEXT column";
+ ps.setInt(1, 30);
+ ps.setString(2, "TextTest");
+ ps.setString(3, testText);
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ // Test with character stream
+ ps.setInt(1, 31);
+ ps.setString(2, "StreamTextTest");
+ ps.setCharacterStream(3, new StringReader(testText));
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ // Verify the data
+ ps = connection.prepareStatement("SELECT info FROM mysql_prepared_stmt_test WHERE id = ?");
+ ps.setInt(1, 30);
+ ResultSet rs = ps.executeQuery();
+ Assert.assertTrue(rs.next());
+ Assert.assertEquals(testText, rs.getString("info"));
+ rs.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testNullParameterSetters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age, data, info) VALUES (?, ?, ?, ?, ?)");
+
+ ps.setInt(1, 40);
+ ps.setNull(2, Types.VARCHAR);
+ ps.setNull(3, Types.INTEGER);
+ ps.setNull(4, Types.BLOB);
+ ps.setNull(5, Types.LONGVARCHAR);
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ // Verify nulls
+ ps = connection.prepareStatement("SELECT name, age, data, info FROM mysql_prepared_stmt_test WHERE id = ?");
+ ps.setInt(1, 40);
+ ResultSet rs = ps.executeQuery();
+ Assert.assertTrue(rs.next());
+ Assert.assertNull(rs.getString("name"));
+ Assert.assertEquals(0, rs.getInt("age"));
+ Assert.assertTrue(rs.wasNull());
+ Assert.assertNull(rs.getBytes("data"));
+ Assert.assertNull(rs.getString("info"));
+ rs.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecuteQuery(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ // Insert test data
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
+ ps.setInt(1, 50);
+ ps.setString(2, "QueryTest");
+ ps.setInt(3, 25);
+ ps.executeUpdate();
+
+ // Test executeQuery
+ ps = connection.prepareStatement("SELECT * FROM mysql_prepared_stmt_test WHERE id = ?");
+ ps.setInt(1, 50);
+ ResultSet rs = ps.executeQuery();
+ Assert.assertNotNull(rs);
+ Assert.assertTrue(rs.next());
+ Assert.assertEquals(50, rs.getInt("id"));
+ Assert.assertEquals("QueryTest", rs.getString("name"));
+ Assert.assertEquals(25, rs.getInt("age"));
+ Assert.assertFalse(rs.next());
+ rs.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecuteUpdate(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ // Test INSERT
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
+ ps.setInt(1, 60);
+ ps.setString(2, "UpdateTest");
+ ps.setInt(3, 30);
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ // Test UPDATE
+ ps = connection.prepareStatement("UPDATE mysql_prepared_stmt_test SET age = ? WHERE id = ?");
+ ps.setInt(1, 35);
+ ps.setInt(2, 60);
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ // Test DELETE
+ ps = connection.prepareStatement("DELETE FROM mysql_prepared_stmt_test WHERE id = ?");
+ ps.setInt(1, 60);
+ Assert.assertEquals(1, ps.executeUpdate());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecute(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ // Test execute with query
+ ps = connection.prepareStatement("SELECT COUNT(*) FROM mysql_prepared_stmt_test");
+ boolean hasResultSet = ps.execute();
+ Assert.assertTrue(hasResultSet);
+ ResultSet rs = ps.getResultSet();
+ Assert.assertNotNull(rs);
+ rs.close();
+
+ // Test execute with update
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name) VALUES (?, ?)");
+ ps.setInt(1, 70);
+ ps.setString(2, "ExecuteTest");
+ hasResultSet = ps.execute();
+ Assert.assertFalse(hasResultSet);
+ Assert.assertEquals(1, ps.getUpdateCount());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testBatch(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
+
+ ps.setInt(1, 80);
+ ps.setString(2, "Batch1");
+ ps.setInt(3, 25);
+ ps.addBatch();
+
+ ps.setInt(1, 81);
+ ps.setString(2, "Batch2");
+ ps.setInt(3, 30);
+ ps.addBatch();
+
+ ps.setInt(1, 82);
+ ps.setString(2, "Batch3");
+ ps.setInt(3, 35);
+ ps.addBatch();
+
+ int[] results = ps.executeBatch();
+ Assert.assertEquals(3, results.length);
+ Assert.assertEquals(1, results[0]);
+ Assert.assertEquals(1, results[1]);
+ Assert.assertEquals(1, results[2]);
+
+ // Verify the batch insert
+ ps = connection.prepareStatement("SELECT COUNT(*) FROM mysql_prepared_stmt_test WHERE id BETWEEN ? AND ?");
+ ps.setInt(1, 80);
+ ps.setInt(2, 82);
+ ResultSet rs = ps.executeQuery();
+ Assert.assertTrue(rs.next());
+ Assert.assertEquals(3, rs.getInt(1));
+ rs.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testClearParameters(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
+ ps.setInt(1, 90);
+ ps.setString(2, "ClearTest");
+ ps.setInt(3, 25);
+
+ ps.clearParameters();
+
+ // Should throw SQLException because parameters are not set
+ Assert.assertThrows(SQLException.class, () -> ps.executeUpdate());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testMetaData(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ ps = connection.prepareStatement("SELECT id, name, age FROM mysql_prepared_stmt_test WHERE id = ?");
+ ResultSetMetaData metaData = ps.getMetaData();
+ Assert.assertNotNull(metaData);
+ Assert.assertEquals(3, metaData.getColumnCount());
+ Assert.assertEquals("id", metaData.getColumnName(1).toLowerCase());
+ Assert.assertEquals("name", metaData.getColumnName(2).toLowerCase());
+ Assert.assertEquals("age", metaData.getColumnName(3).toLowerCase());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testParameterMetaData(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ ps = connection.prepareStatement("INSERT INTO mysql_prepared_stmt_test (id, name, age) VALUES (?, ?, ?)");
+ try {
+ var paramMetaData = ps.getParameterMetaData();
+ Assert.assertNotNull(paramMetaData);
+ //TODO implement the ParameterMetaData using remote proxy
+ //Assert.assertEquals(3, paramMetaData.getParameterCount());
+ } catch (SQLException e) {
+ // Some MySQL drivers/versions may not fully support parameter metadata
+ // This is acceptable
+ }
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGeneratedKeys(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ // Create table with auto-increment
+ Statement stmt = connection.createStatement();
+ try {
+ stmt.execute("DROP TABLE mysql_auto_increment_ps_test");
+ } catch (SQLException ignore) {}
+ stmt.execute("CREATE TABLE mysql_auto_increment_ps_test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100))");
+ stmt.close();
+
+ ps = connection.prepareStatement("INSERT INTO mysql_auto_increment_ps_test (name) VALUES (?)",
+ Statement.RETURN_GENERATED_KEYS);
+ ps.setString(1, "GeneratedKeyTest");
+ Assert.assertEquals(1, ps.executeUpdate());
+
+ ResultSet keys = ps.getGeneratedKeys();
+ Assert.assertNotNull(keys);
+ Assert.assertTrue(keys.next());
+ Assert.assertTrue(keys.getInt(1) > 0);
+ keys.close();
+
+ // Cleanup
+ stmt = connection.createStatement();
+ stmt.execute("DROP TABLE mysql_auto_increment_ps_test");
+ stmt.close();
+ }
+}
\ No newline at end of file
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBSpecificFeaturesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBSpecificFeaturesIntegrationTest.java
new file mode 100644
index 000000000..ce7ebf49b
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBSpecificFeaturesIntegrationTest.java
@@ -0,0 +1,270 @@
+package openjproxy.jdbc;
+
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
+import org.junit.Assert;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import static org.junit.jupiter.api.Assumptions.assumeFalse;
+
+/**
+ * Tests for MySQL-specific functionality that is not covered by database-agnostic tests.
+ * Includes features like ON DUPLICATE KEY UPDATE, SELECT ... FOR UPDATE, SHOW commands, etc.
+ */
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
+public class MariaDBSpecificFeaturesIntegrationTest {
+
+ private static boolean isMariaDBTestEnabled;
+ private static boolean isMariaDBTestDisabled;
+
+ @BeforeAll
+ public static void checkTestConfiguration() {
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
+ isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void onDuplicateKeyUpdateTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
+ // MariaDB tests controlled by @EnabledIf annotation
+ assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+
+ Connection conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing ON DUPLICATE KEY UPDATE for url -> " + url);
+
+ try (Statement stmt = conn.createStatement()) {
+ // Drop table if exists
+ try {
+ stmt.execute("DROP TABLE mysql_upsert_test");
+ } catch (SQLException e) {
+ // Ignore - table might not exist
+ }
+
+ // Create table with unique constraint
+ stmt.execute("CREATE TABLE mysql_upsert_test (" +
+ "id INT PRIMARY KEY, " +
+ "name VARCHAR(100), " +
+ "count_val INT DEFAULT 1" +
+ ")");
+
+ // Insert initial data
+ stmt.execute("INSERT INTO mysql_upsert_test (id, name, count_val) VALUES (1, 'Test Item', 1)");
+
+ // Test ON DUPLICATE KEY UPDATE
+ stmt.execute("INSERT INTO mysql_upsert_test (id, name, count_val) VALUES (1, 'Updated Item', 2) " +
+ "ON DUPLICATE KEY UPDATE name = VALUES(name), count_val = count_val + VALUES(count_val)");
+
+ // Verify the upsert worked correctly
+ ResultSet rs = stmt.executeQuery("SELECT id, name, count_val FROM mysql_upsert_test WHERE id = 1");
+ Assert.assertTrue(rs.next());
+ Assert.assertEquals(1, rs.getInt("id"));
+ Assert.assertEquals("Updated Item", rs.getString("name"));
+ Assert.assertEquals(3, rs.getInt("count_val")); // 1 + 2
+
+ rs.close();
+ }
+
+ conn.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void selectForUpdateTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
+ // MariaDB tests controlled by @EnabledIf annotation
+
+ Connection conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing SELECT ... FOR UPDATE for url -> " + url);
+
+ try (Statement stmt = conn.createStatement()) {
+ // Drop table if exists
+ try {
+ stmt.execute("DROP TABLE mysql_lock_test");
+ } catch (SQLException e) {
+ // Ignore - table might not exist
+ }
+
+ // Create table
+ stmt.execute("CREATE TABLE mysql_lock_test (" +
+ "id INT PRIMARY KEY, " +
+ "balance DECIMAL(10,2)" +
+ ")");
+
+ // Insert test data
+ stmt.execute("INSERT INTO mysql_lock_test (id, balance) VALUES (1, 100.00)");
+
+ // Disable autocommit to test locking
+ conn.setAutoCommit(false);
+
+ // Test SELECT ... FOR UPDATE
+ ResultSet rs = stmt.executeQuery("SELECT id, balance FROM mysql_lock_test WHERE id = 1 FOR UPDATE");
+ Assert.assertTrue(rs.next());
+ Assert.assertEquals(1, rs.getInt("id"));
+ Assert.assertEquals(100.00, rs.getDouble("balance"), 0.01);
+
+ // Update the locked row
+ stmt.executeUpdate("UPDATE mysql_lock_test SET balance = balance - 50.00 WHERE id = 1");
+
+ // Commit the transaction
+ conn.commit();
+
+ // Verify the update
+ rs = stmt.executeQuery("SELECT balance FROM mysql_lock_test WHERE id = 1");
+ Assert.assertTrue(rs.next());
+ Assert.assertEquals(50.00, rs.getDouble("balance"), 0.01);
+
+ rs.close();
+ }
+
+ conn.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void showTablesTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
+ // MariaDB tests controlled by @EnabledIf annotation
+
+ Connection conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing SHOW TABLES for url -> " + url);
+
+ try (Statement stmt = conn.createStatement()) {
+ // Create a test table
+ try {
+ stmt.execute("DROP TABLE mysql_show_test");
+ } catch (SQLException e) {
+ // Ignore - table might not exist
+ }
+
+ stmt.execute("CREATE TABLE mysql_show_test (id INT PRIMARY KEY)");
+
+ // Test SHOW TABLES
+ ResultSet rs = stmt.executeQuery("SHOW TABLES");
+ boolean foundTable = false;
+ while (rs.next()) {
+ String tableName = rs.getString(1);
+ if ("mysql_show_test".equals(tableName)) {
+ foundTable = true;
+ break;
+ }
+ }
+ Assert.assertTrue("Table mysql_show_test should be found in SHOW TABLES", foundTable);
+
+ rs.close();
+ }
+
+ conn.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void autoIncrementAndLastInsertIdTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
+ // MariaDB tests controlled by @EnabledIf annotation
+
+ Connection conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing AUTO_INCREMENT and LAST_INSERT_ID() for url -> " + url);
+
+ try (Statement stmt = conn.createStatement()) {
+ // Drop table if exists
+ try {
+ stmt.execute("DROP TABLE mysql_auto_increment_test");
+ } catch (SQLException e) {
+ // Ignore - table might not exist
+ }
+
+ // Create table with auto-increment
+ stmt.execute("CREATE TABLE mysql_auto_increment_test (" +
+ "id INT AUTO_INCREMENT PRIMARY KEY, " +
+ "name VARCHAR(100)" +
+ ")");
+
+ // Insert data and test LAST_INSERT_ID()
+ stmt.execute("INSERT INTO mysql_auto_increment_test (name) VALUES ('First Item')");
+ ResultSet rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");
+ Assert.assertTrue(rs.next());
+ long firstId = rs.getLong(1);
+ Assert.assertTrue(firstId > 0);
+
+ // Insert another item
+ stmt.execute("INSERT INTO mysql_auto_increment_test (name) VALUES ('Second Item')");
+ rs = stmt.executeQuery("SELECT LAST_INSERT_ID()");
+ Assert.assertTrue(rs.next());
+ long secondId = rs.getLong(1);
+ Assert.assertEquals(firstId + 1, secondId);
+
+ // Verify the data
+ rs = stmt.executeQuery("SELECT id, name FROM mysql_auto_increment_test ORDER BY id");
+ Assert.assertTrue(rs.next());
+ Assert.assertEquals(firstId, rs.getLong("id"));
+ Assert.assertEquals("First Item", rs.getString("name"));
+
+ Assert.assertTrue(rs.next());
+ Assert.assertEquals(secondId, rs.getLong("id"));
+ Assert.assertEquals("Second Item", rs.getString("name"));
+
+ rs.close();
+ }
+
+ conn.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void mysqlInformationSchemaTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
+ // MariaDB tests controlled by @EnabledIf annotation
+
+ Connection conn = DriverManager.getConnection(url, user, pwd);
+
+ System.out.println("Testing MySQL INFORMATION_SCHEMA queries for url -> " + url);
+
+ try (Statement stmt = conn.createStatement()) {
+ // Test INFORMATION_SCHEMA.TABLES
+ ResultSet rs = stmt.executeQuery(
+ "SELECT TABLE_NAME, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES " +
+ "WHERE TABLE_SCHEMA = DATABASE() LIMIT 10"
+ );
+
+ // Should have at least some results
+ boolean hasResults = false;
+ while (rs.next()) {
+ hasResults = true;
+ String tableName = rs.getString("TABLE_NAME");
+ String tableType = rs.getString("TABLE_TYPE");
+ Assert.assertNotNull(tableName);
+ Assert.assertNotNull(tableType);
+ }
+ // Note: We can't assert hasResults because the database might be empty in tests
+
+ rs.close();
+
+ // Test INFORMATION_SCHEMA.COLUMNS
+ rs = stmt.executeQuery(
+ "SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS " +
+ "WHERE TABLE_SCHEMA = DATABASE() LIMIT 10"
+ );
+
+ // Validate the query runs without error
+ while (rs.next()) {
+ String columnName = rs.getString("COLUMN_NAME");
+ String dataType = rs.getString("DATA_TYPE");
+ // Just verify these can be read without error
+ Assert.assertNotNull(columnName);
+ Assert.assertNotNull(dataType);
+ }
+
+ rs.close();
+ }
+
+ conn.close();
+ }
+}
\ No newline at end of file
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBStatementExtensiveTests.java
new file mode 100644
index 000000000..4f0b7ce40
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/MariaDBStatementExtensiveTests.java
@@ -0,0 +1,334 @@
+package openjproxy.jdbc;
+
+import openjproxy.jdbc.testutil.MariaDBConnectionProvider;
+import openjproxy.jdbc.testutil.TestDBUtils;
+import org.junit.Assert;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.condition.EnabledIf;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ArgumentsSource;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import static org.junit.jupiter.api.Assumptions.assumeFalse;
+
+@EnabledIf("openjproxy.jdbc.testutil.MariaDBTestContainer#isEnabled")
+public class MariaDBStatementExtensiveTests {
+
+ private static boolean isMariaDBTestEnabled;
+ private static boolean isMariaDBTestDisabled;
+ private Connection connection;
+ private Statement statement;
+
+ @BeforeAll
+ public static void checkTestConfiguration() {
+ isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
+ isMariaDBTestDisabled = Boolean.parseBoolean(System.getProperty("disableMariaDBTests", "false"));
+ }
+
+ public void setUp(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ // MariaDB tests controlled by @EnabledIf annotation
+ assumeFalse(isMariaDBTestDisabled, "MariaDB tests are disabled");
+
+ connection = DriverManager.getConnection(url, user, password);
+ statement = connection.createStatement();
+ TestDBUtils.createBasicTestTable(connection, "mysql_statement_test", TestDBUtils.SqlSyntax.MYSQL, true);
+ }
+
+ @AfterEach
+ public void tearDown() throws Exception {
+ TestDBUtils.closeQuietly(statement, connection);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecuteQuery(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ ResultSet rs = statement.executeQuery("SELECT * FROM mysql_statement_test");
+ Assert.assertNotNull(rs);
+ Assert.assertTrue(rs.next());
+ rs.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecuteUpdate(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ int rows = statement.executeUpdate("UPDATE mysql_statement_test SET name = 'Updated Alice' WHERE id = 1");
+ Assert.assertEquals(1, rows);
+
+ ResultSet rs = statement.executeQuery("SELECT name FROM mysql_statement_test WHERE id = 1");
+ Assert.assertTrue(rs.next());
+ Assert.assertEquals("Updated Alice", rs.getString("name"));
+ rs.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testClose(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ Assert.assertFalse(statement.isClosed());
+ statement.close();
+ Assert.assertTrue(statement.isClosed());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testMaxFieldSize(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ int orig = statement.getMaxFieldSize();
+ if (url.toLowerCase().contains("mysql"))
+ Assert.assertTrue(orig > 0);
+ else
+ Assert.assertTrue(orig == 0);
+ statement.setMaxFieldSize(5);
+ if (url.toLowerCase().contains("mysql"))
+ Assert.assertEquals(5, statement.getMaxFieldSize());
+ else
+ Assert.assertEquals(0, statement.getMaxFieldSize());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testMaxRows(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ Assert.assertEquals(0, statement.getMaxRows());
+ statement.setMaxRows(10);
+ Assert.assertEquals(10, statement.getMaxRows());
+ statement.setMaxRows(0);
+ Assert.assertEquals(0, statement.getMaxRows());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testQueryTimeout(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ Assert.assertEquals(0, statement.getQueryTimeout());
+ statement.setQueryTimeout(30);
+ Assert.assertEquals(30, statement.getQueryTimeout());
+ statement.setQueryTimeout(0);
+ Assert.assertEquals(0, statement.getQueryTimeout());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testWarnings(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ // Initial warnings might be null
+ statement.getWarnings();
+ statement.clearWarnings();
+ Assert.assertNull(statement.getWarnings());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecute(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ boolean hasResultSet = statement.execute("SELECT * FROM mysql_statement_test");
+ Assert.assertTrue(hasResultSet);
+
+ ResultSet rs = statement.getResultSet();
+ Assert.assertNotNull(rs);
+ Assert.assertTrue(rs.next());
+ rs.close();
+
+ hasResultSet = statement.execute("UPDATE mysql_statement_test SET name = 'Test' WHERE id = 1");
+ Assert.assertFalse(hasResultSet);
+ Assert.assertEquals(1, statement.getUpdateCount());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGetResultSet(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ statement.execute("SELECT * FROM mysql_statement_test");
+ ResultSet rs = statement.getResultSet();
+ Assert.assertNotNull(rs);
+ rs.close();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGetUpdateCount(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ statement.execute("UPDATE mysql_statement_test SET name = 'Test Update' WHERE id = 1");
+ Assert.assertEquals(1, statement.getUpdateCount());
+
+ statement.execute("SELECT * FROM mysql_statement_test");
+ Assert.assertEquals(-1, statement.getUpdateCount());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGetMoreResults(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ statement.execute("SELECT * FROM mysql_statement_test");
+ if (url.toLowerCase().contains("mysql"))
+ Assert.assertFalse(statement.getMoreResults());
+ else
+ Assert.assertThrows(SQLException.class, () -> statement.getMoreResults());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testFetchDirection(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ Assert.assertEquals(ResultSet.FETCH_FORWARD, statement.getFetchDirection());
+ statement.setFetchDirection(ResultSet.FETCH_FORWARD);
+ Assert.assertEquals(ResultSet.FETCH_FORWARD, statement.getFetchDirection());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testFetchSize(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ int originalFetchSize = statement.getFetchSize();
+ statement.setFetchSize(100);
+ Assert.assertEquals(100, statement.getFetchSize());
+ statement.setFetchSize(originalFetchSize);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testResultSetConcurrency(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ int concurrency = statement.getResultSetConcurrency();
+ Assert.assertTrue(concurrency == ResultSet.CONCUR_READ_ONLY || concurrency == ResultSet.CONCUR_UPDATABLE);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testResultSetType(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ int type = statement.getResultSetType();
+ Assert.assertTrue(type == ResultSet.TYPE_FORWARD_ONLY ||
+ type == ResultSet.TYPE_SCROLL_INSENSITIVE ||
+ type == ResultSet.TYPE_SCROLL_SENSITIVE);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testAddBatch(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ statement.addBatch("INSERT INTO mysql_statement_test (id, name) VALUES (10, 'Batch1')");
+ statement.addBatch("INSERT INTO mysql_statement_test (id, name) VALUES (11, 'Batch2')");
+ statement.clearBatch();
+
+ statement.addBatch("INSERT INTO mysql_statement_test (id, name) VALUES (12, 'Batch3')");
+ int[] results = statement.executeBatch();
+ Assert.assertEquals(1, results.length);
+ Assert.assertEquals(1, results[0]);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGetConnection(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ Assert.assertSame(connection, statement.getConnection());
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testGetGeneratedKeys(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ // Create table with auto-increment
+ try {
+ statement.execute("DROP TABLE mysql_auto_test");
+ } catch (SQLException e) {
+ // Ignore if table doesn't exist
+ }
+ statement.execute("CREATE TABLE mysql_auto_test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100))");
+
+ statement.execute("INSERT INTO mysql_auto_test (name) VALUES ('Test')", Statement.RETURN_GENERATED_KEYS);
+ ResultSet keys = statement.getGeneratedKeys();
+ Assert.assertNotNull(keys);
+ Assert.assertTrue(keys.next());
+ Assert.assertTrue(keys.getInt(1) > 0);
+ keys.close();
+
+ statement.execute("DROP TABLE mysql_auto_test");
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testExecuteUpdateWithGeneratedKeys(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+
+ // Create table with auto-increment
+ try{
+ statement.execute("DROP TABLE mysql_auto_test2");
+ } catch (SQLException e) {
+ // Ignore if table doesn't exist
+ }
+ statement.execute("CREATE TABLE mysql_auto_test2 (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100))");
+
+ int rows = statement.executeUpdate("INSERT INTO mysql_auto_test2 (name) VALUES ('Test')", Statement.RETURN_GENERATED_KEYS);
+ Assert.assertEquals(1, rows);
+
+ ResultSet keys = statement.getGeneratedKeys();
+ Assert.assertNotNull(keys);
+ Assert.assertTrue(keys.next());
+ Assert.assertTrue(keys.getInt(1) > 0);
+ keys.close();
+
+ statement.execute("DROP TABLE mysql_auto_test2");
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testResultSetHoldability(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ int holdability = statement.getResultSetHoldability();
+ Assert.assertTrue(holdability == ResultSet.HOLD_CURSORS_OVER_COMMIT ||
+ holdability == ResultSet.CLOSE_CURSORS_AT_COMMIT);
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testCancel(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ // Test that cancel doesn't throw an exception
+ statement.cancel();
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testEscapeProcessing(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ statement.setEscapeProcessing(true);
+ statement.setEscapeProcessing(false);
+ // Just verify these calls don't throw exceptions
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testCursorName(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ // MySQL may not support named cursors in all configurations
+ if (url.toLowerCase().contains("mysql"))
+ statement.setCursorName("test_cursor");
+ else
+ Assert.assertThrows(SQLException.class, () -> statement.setCursorName("test_cursor"));
+ }
+
+ @ParameterizedTest
+ @ArgumentsSource(MariaDBConnectionProvider.class)
+ public void testPoolable(String driverClass, String url, String user, String password, boolean isXA) throws Exception {
+ this.setUp(driverClass, url, user, password, isXA);
+ boolean poolable = statement.isPoolable();
+ statement.setPoolable(!poolable);
+ if (url.toLowerCase().contains("mysql"))
+ Assert.assertEquals(!poolable, statement.isPoolable());
+ else
+ Assert.assertEquals(false, statement.isPoolable());
+
+
+ statement.setPoolable(poolable);
+ }
+}
\ No newline at end of file
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java
new file mode 100644
index 000000000..7706a8502
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBConnectionProvider.java
@@ -0,0 +1,58 @@
+package openjproxy.jdbc.testutil;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.ArgumentsProvider;
+
+import java.util.stream.Stream;
+
+/**
+ * Custom ArgumentsProvider for MariaDB integration tests.
+ * Provides connection details from TestContainers when MariaDB tests are enabled.
+ * This allows tests to use TestContainers instead of external MariaDB instances.
+ */
+public class MariaDBConnectionProvider implements ArgumentsProvider {
+
+ // JDBC URL prefix to be removed when building OJP URL
+ private static final String JDBC_PREFIX = "jdbc:";
+
+ // OJP proxy server configuration - can be overridden via system property
+ private static final String OJP_PROXY_HOST = System.getProperty("ojp.proxy.host", "localhost");
+ private static final String OJP_PROXY_PORT = System.getProperty("ojp.proxy.port", "1059");
+ private static final String OJP_PROXY_ADDRESS = OJP_PROXY_HOST + ":" + OJP_PROXY_PORT;
+
+ @Override
+ public Stream extends Arguments> provideArguments(ExtensionContext context) {
+ if (!MariaDBTestContainer.isEnabled()) {
+ // Return empty stream when tests are disabled
+ return Stream.empty();
+ }
+
+ // Initialize and start the TestContainer
+ MariaDBTestContainer.getInstance();
+
+ // Get connection details from the TestContainer
+ String containerJdbcUrl = MariaDBTestContainer.getJdbcUrl();
+ String username = MariaDBTestContainer.getUsername();
+ String password = MariaDBTestContainer.getPassword();
+
+ // Build OJP JDBC URL from the container URL
+ // TestContainer URL format: jdbc:mariadb://localhost:RANDOM_PORT/defaultdb
+ // OJP wraps this by removing 'jdbc:' and prepending 'jdbc:ojp[host:port]_'
+ // Result format: jdbc:ojp[localhost:1059]_mariadb://localhost:RANDOM_PORT/defaultdb
+ String driverClass = "org.openjproxy.jdbc.Driver";
+
+ // Remove "jdbc:" prefix and add OJP wrapper
+ String urlWithoutPrefix = containerJdbcUrl.startsWith(JDBC_PREFIX)
+ ? containerJdbcUrl.substring(JDBC_PREFIX.length())
+ : containerJdbcUrl;
+ String ojpUrl = JDBC_PREFIX + "ojp[" + OJP_PROXY_ADDRESS + "]_" + urlWithoutPrefix;
+
+ // Return a single set of arguments with the TestContainer connection details
+ // The fifth parameter (false) represents the isXA flag, indicating this is not an XA connection
+ // This matches the CSV format which had a boolean flag for XA configuration
+ return Stream.of(
+ Arguments.of(driverClass, ojpUrl, username, password, false)
+ );
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java
new file mode 100644
index 000000000..8fa70690d
--- /dev/null
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/testutil/MariaDBTestContainer.java
@@ -0,0 +1,103 @@
+package openjproxy.jdbc.testutil;
+
+import lombok.extern.slf4j.Slf4j;
+import org.testcontainers.containers.MariaDBContainer;
+
+/**
+ * Singleton MariaDB test container for all MariaDB integration tests.
+ * This ensures that all tests share the same MariaDB instance to improve test performance
+ * and reduce resource usage.
+ */
+@Slf4j
+public class MariaDBTestContainer {
+
+ // MariaDB Docker image version
+ private static final String MARIADB_IMAGE = "mariadb:10.11";
+ private static final String TEST_DATABASE = "defaultdb";
+ private static final String TEST_USERNAME = "testuser";
+ private static final String TEST_PASSWORD = "testpassword";
+
+ private static MariaDBContainer> container;
+ private static boolean isStarted = false;
+ private static boolean shutdownHookRegistered = false;
+
+ /**
+ * Gets or creates the shared MariaDB test container instance.
+ * The container is automatically started on first access.
+ *
+ * @return the shared MariaDBContainer instance
+ */
+ public static synchronized MariaDBContainer> getInstance() {
+ if (container == null) {
+ container = new MariaDBContainer<>(MARIADB_IMAGE)
+ .withDatabaseName(TEST_DATABASE)
+ .withUsername(TEST_USERNAME)
+ .withPassword(TEST_PASSWORD);
+ }
+
+ if (!isStarted) {
+ log.info("Starting MariaDB TestContainer...");
+ container.start();
+ isStarted = true;
+ log.info("MariaDB TestContainer started successfully at: {}", container.getJdbcUrl());
+
+ // Add shutdown hook to stop container when JVM exits
+ if (!shutdownHookRegistered) {
+ Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+ if (container != null && container.isRunning()) {
+ log.info("Stopping MariaDB TestContainer...");
+ container.stop();
+ }
+ }));
+ shutdownHookRegistered = true;
+ }
+ }
+
+ return container;
+ }
+
+ /**
+ * Gets the JDBC URL for connecting to the test container.
+ *
+ * @return JDBC URL string
+ */
+ public static String getJdbcUrl() {
+ return getInstance().getJdbcUrl();
+ }
+
+ /**
+ * Gets the username for connecting to the test container.
+ *
+ * @return username string
+ */
+ public static String getUsername() {
+ return getInstance().getUsername();
+ }
+
+ /**
+ * Gets the password for connecting to the test container.
+ *
+ * @return password string
+ */
+ public static String getPassword() {
+ return getInstance().getPassword();
+ }
+
+ /**
+ * Gets the database name for the test container.
+ *
+ * @return database name string
+ */
+ public static String getDatabaseName() {
+ return getInstance().getDatabaseName();
+ }
+
+ /**
+ * Checks if MariaDB tests are enabled via system property.
+ *
+ * @return true if MariaDB tests should run
+ */
+ public static boolean isEnabled() {
+ return Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
+ }
+}
diff --git a/ojp-jdbc-driver/src/test/resources/h2_mysql_mariadb_oracle_connections.csv b/ojp-jdbc-driver/src/test/resources/h2_mysql_mariadb_oracle_connections.csv
index 009564e39..3358c4c7a 100644
--- a/ojp-jdbc-driver/src/test/resources/h2_mysql_mariadb_oracle_connections.csv
+++ b/ojp-jdbc-driver/src/test/resources/h2_mysql_mariadb_oracle_connections.csv
@@ -1,4 +1,3 @@
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_h2:~/test,sa,
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mysql://localhost:3306/defaultdb,testuser,testpassword
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mariadb://localhost:3307/defaultdb,testuser,testpassword
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_oracle:thin:@localhost:1521/XEPDB1,testuser,testpassword
\ No newline at end of file
diff --git a/ojp-jdbc-driver/src/test/resources/h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv b/ojp-jdbc-driver/src/test/resources/h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv
index 6480f9fbc..e20191e7e 100644
--- a/ojp-jdbc-driver/src/test/resources/h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv
+++ b/ojp-jdbc-driver/src/test/resources/h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv
@@ -2,7 +2,6 @@ org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_h2:~/test,sa,,false
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_postgresql://localhost:5432/defaultdb,testuser,testpassword,false
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_postgresql://localhost:5432/defaultdb,testuser,testpassword,true
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mysql://localhost:3306/defaultdb,testuser,testpassword,false
-org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_mariadb://localhost:3307/defaultdb,testuser,testpassword,false
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_oracle:thin:@localhost:1521/XEPDB1,testuser,testpassword,false
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_sqlserver://localhost:1433;databaseName=defaultdb;encrypt=false;trustServerCertificate=true,testuser,TestPassword123!,false
org.openjproxy.jdbc.Driver,jdbc:ojp[localhost:1059]_db2://localhost:50000/testdb,db2inst1,testpass,false
From 3ad74f3389808a7276f55557bece8e42dc5e23b9 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 7 Dec 2025 20:30:14 +0000
Subject: [PATCH 45/49] Initial plan
From b863c179e7da3ac5e79139c717947037049ace8b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 7 Dec 2025 20:41:37 +0000
Subject: [PATCH 46/49] Add enableH2Tests flag and restructure CI workflows for
fail-fast approach
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.github/workflows/cockroachdb-testing.yml | 7 +-
.github/workflows/db2-testing.yml | 7 +-
.github/workflows/main.yml | 2 +-
.github/workflows/mariadb-testing.yml | 7 +-
.github/workflows/multinode-integration.yml | 7 +-
.github/workflows/mysql-testing.yml | 7 +-
.github/workflows/oracle-testing.yml | 7 +-
.github/workflows/postgres-testing.yml | 7 +-
.github/workflows/sqlserver-testing.yml | 7 +-
documents/ci-cd-workflow-structure.md | 171 ++++++++++++++++++
.../setup_and_testing_ojp_source.md | 5 +-
.../jdbc/BasicCrudIntegrationTest.java | 8 +
.../jdbc/BinaryStreamIntegrationTest.java | 5 +
.../openjproxy/jdbc/BlobIntegrationTest.java | 3 +
.../jdbc/ConcurrencyTimeoutTest.java | 8 +
.../jdbc/H2ConnectionExtensiveTests.java | 9 +
.../H2DatabaseMetaDataExtensiveTests.java | 7 +
.../jdbc/H2MultipleTypesIntegrationTest.java | 10 +
.../H2PreparedStatementExtensiveTests.java | 9 +
.../jdbc/H2StatementExtensiveTests.java | 9 +
.../jdbc/HydratedLobValidationTest.java | 8 +
...adMultipleBlocksOfDataIntegrationTest.java | 6 +
.../jdbc/ResultSetMetaDataExtensiveTests.java | 9 +
.../java/openjproxy/jdbc/ResultSetTest.java | 6 +
24 files changed, 320 insertions(+), 11 deletions(-)
create mode 100644 documents/ci-cd-workflow-structure.md
diff --git a/.github/workflows/cockroachdb-testing.yml b/.github/workflows/cockroachdb-testing.yml
index a2c103c54..0c7387523 100644
--- a/.github/workflows/cockroachdb-testing.yml
+++ b/.github/workflows/cockroachdb-testing.yml
@@ -1,10 +1,14 @@
# This workflow runs only CockroachDB integration tests using TestContainers.
# It disables all other database integration tests to focus on CockroachDB testing.
# TestContainers automatically manages the CockroachDB container lifecycle.
+# This workflow only runs after the Main CI workflow succeeds.
name: CockroachDB Integration Tests
on:
- push:
+ workflow_run:
+ workflows: ["Main CI"]
+ types:
+ - completed
branches: [ main ]
pull_request:
branches: [ main ]
@@ -14,6 +18,7 @@ jobs:
cockroachdb-tests:
name: CockroachDB Integration Tests
runs-on: ubuntu-latest
+ if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request' || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') }}
permissions:
contents: read
diff --git a/.github/workflows/db2-testing.yml b/.github/workflows/db2-testing.yml
index 1d3f54a4d..95e3f119e 100644
--- a/.github/workflows/db2-testing.yml
+++ b/.github/workflows/db2-testing.yml
@@ -1,10 +1,14 @@
# This workflow runs only DB2 integration tests using TestContainers.
# It disables all other database integration tests to focus on DB2 testing.
# TestContainers automatically manages the DB2 container lifecycle.
+# This workflow only runs after the Main CI workflow succeeds.
name: DB2 Integration Tests
on:
- push:
+ workflow_run:
+ workflows: ["Main CI"]
+ types:
+ - completed
branches: [ main ]
pull_request:
branches: [ main ]
@@ -14,6 +18,7 @@ jobs:
db2-tests:
name: DB2 Integration Tests
runs-on: ubuntu-latest
+ if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request' || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') }}
permissions:
contents: read
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 9e5056989..d21e0827e 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -135,7 +135,7 @@ jobs:
run: mvn clean install -pl ojp-jdbc-driver -am -DskipTests -Dgpg.skip=true
- name: Test (ojp-jdbc-driver)
- run: mvn test -pl ojp-jdbc-driver -Dgpg.skip=true -DenableMySQLTests=false -DenablePostgresTests=false -DenableCockroachDBTests=false
+ run: mvn test -pl ojp-jdbc-driver -Dgpg.skip=true -DenableH2Tests=true -DenableMySQLTests=false -DenablePostgresTests=false -DenableCockroachDBTests=false
- name: Show ojp-server.log
if: always() # ensures it runs even if previous steps fail
diff --git a/.github/workflows/mariadb-testing.yml b/.github/workflows/mariadb-testing.yml
index 92d7cbf24..9474593df 100644
--- a/.github/workflows/mariadb-testing.yml
+++ b/.github/workflows/mariadb-testing.yml
@@ -1,10 +1,14 @@
# This workflow runs only MariaDB integration tests using TestContainers.
# It disables all other database integration tests to focus on MariaDB testing.
# TestContainers automatically manages the MariaDB container lifecycle.
+# This workflow only runs after the Main CI workflow succeeds.
name: MariaDB Integration Tests
on:
- push:
+ workflow_run:
+ workflows: ["Main CI"]
+ types:
+ - completed
branches: [ main ]
pull_request:
branches: [ main ]
@@ -14,6 +18,7 @@ jobs:
mariadb-tests:
name: MariaDB Integration Tests
runs-on: ubuntu-latest
+ if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request' || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') }}
permissions:
contents: read
diff --git a/.github/workflows/multinode-integration.yml b/.github/workflows/multinode-integration.yml
index 2c18182d4..230538fa3 100644
--- a/.github/workflows/multinode-integration.yml
+++ b/.github/workflows/multinode-integration.yml
@@ -1,10 +1,14 @@
# This workflow tests multinode functionality with two OJP server instances
# It starts a Postgres database and two OJP servers on different ports,
# then runs integration tests for multinode scenarios including failover and recovery.
+# This workflow only runs after the Main CI workflow succeeds.
name: Multinode Integration Tests
on:
- push:
+ workflow_run:
+ workflows: ["Main CI"]
+ types:
+ - completed
branches: [ main ]
pull_request:
branches: [ main ]
@@ -13,6 +17,7 @@ jobs:
multinode-test:
name: Multinode Integration Test
runs-on: ubuntu-latest
+ if: ${{ github.event_name == 'pull_request' || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') }}
steps:
- name: Git checkout
diff --git a/.github/workflows/mysql-testing.yml b/.github/workflows/mysql-testing.yml
index bd1c3d23f..b55bbc53f 100644
--- a/.github/workflows/mysql-testing.yml
+++ b/.github/workflows/mysql-testing.yml
@@ -1,10 +1,14 @@
# This workflow runs only MySQL integration tests using TestContainers.
# It disables all other database integration tests to focus on MySQL testing.
# TestContainers automatically manages the MySQL container lifecycle.
+# This workflow only runs after the Main CI workflow succeeds.
name: MySQL Integration Tests
on:
- push:
+ workflow_run:
+ workflows: ["Main CI"]
+ types:
+ - completed
branches: [ main ]
pull_request:
branches: [ main ]
@@ -14,6 +18,7 @@ jobs:
mysql-tests:
name: MySQL Integration Tests
runs-on: ubuntu-latest
+ if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request' || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') }}
permissions:
contents: read
diff --git a/.github/workflows/oracle-testing.yml b/.github/workflows/oracle-testing.yml
index 40dc9bb39..beed26f8a 100644
--- a/.github/workflows/oracle-testing.yml
+++ b/.github/workflows/oracle-testing.yml
@@ -1,10 +1,14 @@
# This workflow runs only Oracle integration tests using TestContainers.
# It disables all other database integration tests to focus on Oracle testing.
# TestContainers automatically manages the Oracle container lifecycle.
+# This workflow only runs after the Main CI workflow succeeds.
name: Oracle Integration Tests
on:
- push:
+ workflow_run:
+ workflows: ["Main CI"]
+ types:
+ - completed
branches: [ main ]
pull_request:
branches: [ main ]
@@ -14,6 +18,7 @@ jobs:
oracle-tests:
name: Oracle Integration Tests
runs-on: ubuntu-latest
+ if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request' || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') }}
permissions:
contents: read
diff --git a/.github/workflows/postgres-testing.yml b/.github/workflows/postgres-testing.yml
index ab8e426c5..45dabaaeb 100644
--- a/.github/workflows/postgres-testing.yml
+++ b/.github/workflows/postgres-testing.yml
@@ -1,10 +1,14 @@
# This workflow runs only PostgreSQL integration tests using TestContainers.
# It disables all other database integration tests to focus on PostgreSQL testing.
# TestContainers automatically manages the PostgreSQL container lifecycle.
+# This workflow only runs after the Main CI workflow succeeds.
name: PostgreSQL Integration Tests
on:
- push:
+ workflow_run:
+ workflows: ["Main CI"]
+ types:
+ - completed
branches: [ main ]
pull_request:
branches: [ main ]
@@ -14,6 +18,7 @@ jobs:
postgres-tests:
name: PostgreSQL Integration Tests
runs-on: ubuntu-latest
+ if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request' || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') }}
permissions:
contents: read
diff --git a/.github/workflows/sqlserver-testing.yml b/.github/workflows/sqlserver-testing.yml
index 1dd7ed6d0..2d08d0bd3 100644
--- a/.github/workflows/sqlserver-testing.yml
+++ b/.github/workflows/sqlserver-testing.yml
@@ -1,10 +1,14 @@
# This workflow runs only SQL Server integration tests using TestContainers.
# It disables all other database integration tests to focus on SQL Server testing.
# TestContainers automatically manages the SQL Server container lifecycle.
+# This workflow only runs after the Main CI workflow succeeds.
name: SQL Server Integration Tests
on:
- push:
+ workflow_run:
+ workflows: ["Main CI"]
+ types:
+ - completed
branches: [ main ]
pull_request:
branches: [ main ]
@@ -14,6 +18,7 @@ jobs:
sqlserver-tests:
name: SQL Server Integration Tests
runs-on: ubuntu-latest
+ if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request' || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') }}
permissions:
contents: read
diff --git a/documents/ci-cd-workflow-structure.md b/documents/ci-cd-workflow-structure.md
new file mode 100644
index 000000000..d5c57094a
--- /dev/null
+++ b/documents/ci-cd-workflow-structure.md
@@ -0,0 +1,171 @@
+# CI/CD Workflow Structure
+
+## Overview
+
+The OJP project uses a multi-stage CI/CD workflow structure designed to optimize CI resource usage while maintaining comprehensive test coverage across multiple database systems.
+
+## Workflow Execution Order
+
+### 1. Main CI (Fail-Fast with H2)
+**Purpose:** Quick feedback and fail-fast mechanism
+
+The Main CI workflow is the first to run and serves as a gatekeeper for all other workflows. It focuses exclusively on H2 database tests, which are:
+- **Fast**: H2 is an in-memory database that starts instantly
+- **Lightweight**: No external database containers required
+- **Comprehensive**: Tests core JDBC functionality that applies across all databases
+- **Cost-effective**: Minimal CI resource consumption
+
+**What it does:**
+- Builds all modules (ojp-grpc-commons, ojp-server, ojp-jdbc-driver)
+- Runs H2 integration tests only using `-DenableH2Tests=true`
+- Tests across multiple Java versions (11, 17, 21, 22)
+- Acts as a quality gate - if H2 tests fail, other workflows won't run
+
+**Rationale:**
+If there are fundamental issues with the code (compilation errors, basic JDBC contract violations, major bugs), they will be caught quickly in the Main CI without wasting resources running the full test suite across all databases.
+
+### 2. Database-Specific Integration Tests (Run After Main CI)
+**Purpose:** Comprehensive database compatibility validation
+
+These workflows only execute after the Main CI succeeds:
+
+- **MySQL Integration Tests**
+- **PostgreSQL Integration Tests**
+- **MariaDB Integration Tests**
+- **CockroachDB Integration Tests**
+- **Oracle Integration Tests**
+- **SQL Server Integration Tests**
+- **DB2 Integration Tests**
+
+Each workflow:
+- Uses TestContainers to manage database lifecycle
+- Tests database-specific features and behaviors
+- Runs in parallel (independently from each other)
+- Can be triggered manually via `workflow_dispatch` for debugging
+
+**Trigger conditions:**
+- **On push to main**: Only runs if Main CI succeeds
+- **On pull request**: Runs independently for PR validation
+- **Manual trigger**: Can be run anytime via workflow_dispatch
+
+### 3. Multinode Integration Tests (Run After Main CI)
+**Purpose:** Tests distributed OJP server scenarios
+
+This workflow:
+- Tests multiple OJP server instances working together
+- Validates failover and recovery mechanisms
+- Only runs after Main CI succeeds
+
+## Benefits of This Structure
+
+### Resource Optimization
+- **Fast Feedback**: Developers get quick feedback from H2 tests (~5-10 minutes)
+- **Reduced Waste**: Database-specific tests only run if basic functionality passes
+- **Parallel Execution**: Database tests run in parallel after Main CI succeeds
+
+### Cost Savings
+- **Fewer Failed Runs**: H2 tests catch issues before expensive database tests start
+- **Efficient CI Usage**: Only run full suite when code is likely to pass
+- **Lower Resource Consumption**: H2 tests use minimal resources compared to containerized databases
+
+### Developer Experience
+- **Clear Feedback**: If tests fail on H2, fix those first before investigating database-specific issues
+- **Faster Iterations**: Quick H2 feedback loop during development
+- **Targeted Testing**: Can manually trigger specific database workflows for debugging
+
+## Testing Flags
+
+All test workflows use standardized flags to control which database tests run:
+
+- `-DenableH2Tests=true/false` - Enable/disable H2 tests (default: true)
+- `-DenablePostgresTests=true/false` - Enable/disable PostgreSQL tests (default: false)
+- `-DenableMySQLTests=true/false` - Enable/disable MySQL tests (default: false)
+- `-DenableMariaDBTests=true/false` - Enable/disable MariaDB tests (default: false)
+- `-DenableCockroachDBTests=true/false` - Enable/disable CockroachDB tests (default: false)
+- `-DenableOracleTests=true/false` - Enable/disable Oracle tests (default: false)
+- `-DenableSqlServerTests=true/false` - Enable/disable SQL Server tests (default: false)
+- `-DenableDb2Tests=true/false` - Enable/disable DB2 tests (default: false)
+
+## Local Development
+
+For local development, developers can:
+
+1. **Run only H2 tests** (fastest):
+ ```bash
+ mvn test -pl ojp-jdbc-driver -DenableH2Tests=true -DenablePostgresTests=false -DenableMySQLTests=false
+ ```
+
+2. **Run specific database tests**:
+ ```bash
+ mvn test -pl ojp-jdbc-driver -DenableH2Tests=false -DenablePostgresTests=true -DenableMySQLTests=false
+ ```
+
+3. **Run all tests** (requires all databases running locally):
+ ```bash
+ mvn test -pl ojp-jdbc-driver -DenableH2Tests=true -DenablePostgresTests=true -DenableMySQLTests=true -DenableMariaDBTests=true
+ ```
+
+See [Setup and Testing Guide](code-contributions/setup_and_testing_ojp_source.md) for more details.
+
+## Workflow Diagram
+
+```
+ ┌─────────────┐
+ │ Push to │
+ │ main or │
+ │ PR │
+ └──────┬──────┘
+ │
+ ▼
+ ┌─────────────┐
+ │ Main CI │
+ │ (H2 Tests) │
+ └──────┬──────┘
+ │
+ ┌─────────┴─────────┐
+ │ │
+ Success Failure
+ │ │
+ ▼ ▼
+ ┌───────────────────┐ Workflows Stop
+ │ Database-Specific │ (No further tests)
+ │ Integration │
+ │ Tests │
+ │ (in parallel) │
+ └───────────────────┘
+ │
+ ┌───────────┼───────────┐
+ │ │ │
+ ▼ ▼ ▼
+ ┌───────┐ ┌───────┐ ┌───────┐
+ │ MySQL │ │ Postgres│ │MariaDB│
+ └───────┘ └───────┘ └───────┘
+ │ │ │
+ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐
+ │Oracle │ │ SQLSvr│ │ DB2 │
+ └───────┘ └───────┘ └───────┘
+ │ │ │
+ ┌───▼───────┐ └──┬────────┘
+ │CockroachDB│ │
+ └───────────┘ │
+ │
+ ▼
+ ┌───────────────┐
+ │ Multinode │
+ │ Tests │
+ └───────────────┘
+```
+
+## Maintenance
+
+When adding new database support:
+1. Create a new workflow file in `.github/workflows/`
+2. Add workflow_run trigger to depend on Main CI
+3. Use the standardized test flag pattern
+4. Update this documentation
+
+When modifying test behavior:
+1. Ensure H2 tests cover core functionality
+2. Keep H2 tests fast and focused
+3. Database-specific tests can be more comprehensive
+4. Update test flags as needed
diff --git a/documents/code-contributions/setup_and_testing_ojp_source.md b/documents/code-contributions/setup_and_testing_ojp_source.md
index 8a957a470..8ca7e986d 100644
--- a/documents/code-contributions/setup_and_testing_ojp_source.md
+++ b/documents/code-contributions/setup_and_testing_ojp_source.md
@@ -26,9 +26,9 @@
Navigate to the ojp-jdbc-driver folder first:
```bash
cd ojp-jdbc-driver
- mvn test -DdisablePostgresTests -DdisableMySQLTests -DenableMariaDBTests=false -DenableCockroachDBTests=false -DdisablePostgresXATests
+ mvn test -DenableH2Tests=true -DdisablePostgresTests -DdisableMySQLTests -DenableMariaDBTests=false -DenableCockroachDBTests=false -DdisablePostgresXATests
```
-**Note:** With the disable flags only H2 integration tests will run, to run the full set of integration tests you have to run all the databases locally, follow the instructions at [Run Local Databases](../../documents/environment-setup/run-local-databases.md)
+**Note:** With the above command, only H2 integration tests will run. To run the full set of integration tests you have to run all the databases locally, follow the instructions at [Run Local Databases](../../documents/environment-setup/run-local-databases.md)
### Databases with integration tests
We have comprehensive JDBC integration tests with OJP for the following databases:
@@ -71,6 +71,7 @@ For detailed CockroachDB setup instructions, see [CockroachDB Testing Guide](../
- See [run-local-databases.md](documents/environment-setup/run-local-databases.md) for local database setup
### Test Options
+- `-DenableH2Tests` - Enable H2 integration tests (enabled by default)
- `-DdisablePostgresTests` - Skip PostgreSQL integration tests
- `-DdisableMySQLTests` - Skip MySQL integration tests
- `-DenableMariaDBTests` - Enable MariaDB integration tests (disabled by default, uses TestContainers)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
index 9bd5a1df7..6b821b4df 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
@@ -21,6 +21,7 @@
@Slf4j
public class BasicCrudIntegrationTest {
+ private static boolean isH2TestEnabled;
private static boolean isPostgresTestDisabled;
private static boolean isMySQLTestDisabled;
private static boolean isMariaDBTestEnabled;
@@ -32,6 +33,7 @@ public class BasicCrudIntegrationTest {
@BeforeAll
public static void setup() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
isPostgresTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
@@ -44,6 +46,12 @@ public static void setup() {
@ParameterizedTest
@CsvFileSource(resources = "/h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv")
public void crudTestSuccessful(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
+ // Skip H2 tests if not enabled
+ if (url.toLowerCase().contains("_h2:") && !isH2TestEnabled) {
+ Assumptions.assumeFalse(true, "Skipping H2 tests - not enabled");
+ tablePrefix = "h2_";
+ }
+
// Skip PostgreSQL tests if disabled
if (url.toLowerCase().contains("postgresql") && isPostgresTestDisabled) {
Assumptions.assumeFalse(true, "Skipping Postgres tests");
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
index 414e9ed30..e171a84f9 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
@@ -19,16 +19,21 @@
public class BinaryStreamIntegrationTest {
+ private static boolean isH2TestEnabled;
private static boolean isPostgresTestDisabled;
@BeforeAll
public static void setup() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
isPostgresTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
@ParameterizedTest
@CsvFileSource(resources = "/h2_postgres_connections.csv")
public void createAndReadingBinaryStreamSuccessful(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException, IOException {
+ if (!isH2TestEnabled && url.toLowerCase().contains("_h2:")) {
+ return;
+ }
if (isPostgresTestDisabled && url.contains("postgresql")) {
return;
}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
index 674c8d84e..30585da82 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BlobIntegrationTest.java
@@ -24,6 +24,7 @@
public class BlobIntegrationTest {
+ private static boolean isH2TestEnabled;
private static boolean isMySQLTestDisabled;
private static boolean isMariaDBTestEnabled;
private static boolean isOracleTestEnabled;
@@ -32,6 +33,7 @@ public class BlobIntegrationTest {
@BeforeAll
public static void checkTestConfiguration() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
isMySQLTestDisabled = !Boolean.parseBoolean(System.getProperty("enableMySQLTests", "false"));
isMariaDBTestEnabled = Boolean.parseBoolean(System.getProperty("enableMariaDBTests", "false"));
isOracleTestEnabled = Boolean.parseBoolean(System.getProperty("enableOracleTests", "false"));
@@ -50,6 +52,7 @@ public void setUp(String driverClass, String url, String user, String pwd) throw
assumeFalse(!isOracleTestEnabled, "Oracle tests are disabled");
this.tableName += "_oracle";
} else {
+ assumeFalse(!isH2TestEnabled, "H2 tests are not enabled");
this.tableName += "_h2";
}
Class.forName(driverClass);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ConcurrencyTimeoutTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ConcurrencyTimeoutTest.java
index cb24063b5..cde6e4366 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ConcurrencyTimeoutTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ConcurrencyTimeoutTest.java
@@ -2,6 +2,7 @@
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
@@ -23,9 +24,16 @@ public class ConcurrencyTimeoutTest {
private static final int THREADS = 50; // Smaller number for quick testing
private static final int OPERATIONS_PER_THREAD = 5;
+ private static boolean isH2TestEnabled;
private static AtomicInteger successfulOperations = new AtomicInteger(0);
private static AtomicInteger failedOperations = new AtomicInteger(0);
+ @BeforeAll
+ public static void checkH2TestsEnabled() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
+ Assumptions.assumeTrue(isH2TestEnabled, "H2 tests are not enabled");
+ }
+
@SneakyThrows
@ParameterizedTest
@CsvFileSource(resources = "/h2_connection.csv")
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2ConnectionExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2ConnectionExtensiveTests.java
index 4a4ed3a07..51d7fad17 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2ConnectionExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2ConnectionExtensiveTests.java
@@ -4,6 +4,8 @@
import lombok.SneakyThrows;
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
@@ -35,8 +37,15 @@
public class H2ConnectionExtensiveTests {
+ private static boolean isH2TestEnabled;
private Connection connection;
+ @BeforeAll
+ public static void setup() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
+ Assumptions.assumeTrue(isH2TestEnabled, "H2 tests are not enabled");
+ }
+
@SneakyThrows
public void setUp(String driverClass, String url, String user, String password) throws SQLException {
connection = DriverManager.getConnection(url, user, password);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2DatabaseMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2DatabaseMetaDataExtensiveTests.java
index 091c83f39..0d88a2225 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2DatabaseMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2DatabaseMetaDataExtensiveTests.java
@@ -10,8 +10,15 @@
public class H2DatabaseMetaDataExtensiveTests {
+ private static boolean isH2TestEnabled;
private static Connection connection;
+ @BeforeAll
+ public static void checkH2TestsEnabled() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
+ Assumptions.assumeTrue(isH2TestEnabled, "H2 tests are not enabled");
+ }
+
public void setUp(String driverClass, String url, String user, String password) throws Exception {
connection = DriverManager.getConnection(url, user, password);
TestDBUtils.createBasicTestTable(connection, "h2_db_metadata_test", TestDBUtils.SqlSyntax.H2, true);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2MultipleTypesIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2MultipleTypesIntegrationTest.java
index 5be00d1c9..8c41a90e6 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2MultipleTypesIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2MultipleTypesIntegrationTest.java
@@ -2,6 +2,8 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.Assert;
+import org.junit.jupiter.api.Assumptions;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
@@ -21,6 +23,14 @@
public class H2MultipleTypesIntegrationTest {
+ private static boolean isH2TestEnabled;
+
+ @BeforeAll
+ public static void checkH2TestsEnabled() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
+ Assumptions.assumeTrue(isH2TestEnabled, "H2 tests are not enabled");
+ }
+
@ParameterizedTest
@CsvFileSource(resources = "/h2_connection.csv")
public void typesCoverageTestSuccessful(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException, ParseException {
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2PreparedStatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2PreparedStatementExtensiveTests.java
index 83ebd7c62..f36090646 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2PreparedStatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2PreparedStatementExtensiveTests.java
@@ -1,6 +1,8 @@
package openjproxy.jdbc;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assumptions;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
@@ -30,9 +32,16 @@
public class H2PreparedStatementExtensiveTests {
+ private static boolean isH2TestEnabled;
private Connection connection;
private PreparedStatement ps;
+ @BeforeAll
+ public static void checkH2TestsEnabled() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
+ Assumptions.assumeTrue(isH2TestEnabled, "H2 tests are not enabled");
+ }
+
public void setUp(String driverClass, String url, String user, String password) throws Exception {
connection = DriverManager.getConnection(url, user, password);
Statement stmt = connection.createStatement();
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2StatementExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2StatementExtensiveTests.java
index 57d5eab2a..749a206d9 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2StatementExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/H2StatementExtensiveTests.java
@@ -2,6 +2,8 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assumptions;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
@@ -22,9 +24,16 @@
public class H2StatementExtensiveTests {
+ private static boolean isH2TestEnabled;
private Connection connection;
private Statement statement;
+ @BeforeAll
+ public static void checkH2TestsEnabled() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
+ Assumptions.assumeTrue(isH2TestEnabled, "H2 tests are not enabled");
+ }
+
public void setUp(String driverClass, String url, String user, String password) throws Exception {
connection = DriverManager.getConnection(url, user, password);
statement = connection.createStatement();
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/HydratedLobValidationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/HydratedLobValidationTest.java
index 5bc0f624c..66bb418cc 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/HydratedLobValidationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/HydratedLobValidationTest.java
@@ -1,6 +1,7 @@
package openjproxy.jdbc;
import org.junit.Assert;
+import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
@@ -24,9 +25,16 @@
*/
public class HydratedLobValidationTest {
+ private static boolean isH2TestEnabled;
private String tableName;
private Connection conn;
+ @BeforeAll
+ public static void checkH2TestsEnabled() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
+ Assumptions.assumeTrue(isH2TestEnabled, "H2 tests are not enabled");
+ }
+
public void setUp(String driverClass, String url, String user, String pwd) throws SQLException, ClassNotFoundException {
this.tableName = "hydrated_lob_test";
conn = DriverManager.getConnection(url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
index 95dfc2c04..7887fb36f 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
@@ -17,10 +17,12 @@
public class ReadMultipleBlocksOfDataIntegrationTest {
+ private static boolean isH2TestEnabled;
private static boolean isPostgresTestEnabled;
@BeforeAll
public static void checkTestConfiguration() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
isPostgresTestEnabled = Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
@@ -28,6 +30,10 @@ public static void checkTestConfiguration() {
@ParameterizedTest
@CsvFileSource(resources = "/h2_postgres_connections_with_record_counts.csv")
public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
+ // Skip H2 tests if not enabled
+ if (!isH2TestEnabled && url.toLowerCase().contains("_h2:")) {
+ return;
+ }
// Skip Postgres connections in this test - they're tested separately using TestContainers
// See multiplePagesOfRowsResultSetSuccessfulPostgres() method below
if (url.contains("postgresql")) {
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetMetaDataExtensiveTests.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetMetaDataExtensiveTests.java
index b329223c9..05365d1b4 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetMetaDataExtensiveTests.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetMetaDataExtensiveTests.java
@@ -2,6 +2,8 @@
import lombok.SneakyThrows;
import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assumptions;
+import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
@@ -11,9 +13,16 @@
public class ResultSetMetaDataExtensiveTests {
+ private static boolean isH2TestEnabled;
private Connection connection;
private ResultSetMetaData metaData;
+ @BeforeAll
+ public static void checkH2TestsEnabled() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
+ Assumptions.assumeTrue(isH2TestEnabled, "H2 tests are not enabled");
+ }
+
@SneakyThrows
public void setUp(String driverClass, String url, String user, String password) throws SQLException {
connection = DriverManager.getConnection(url, user, password);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java
index e4062c2bf..21a6c8618 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java
@@ -26,15 +26,21 @@ public class ResultSetTest {
private Statement statement;
private ResultSet resultSet;
+ private static boolean isH2TestEnabled;
private static boolean isPostgresTestDisabled;
@BeforeAll
public static void checkTestConfiguration() {
+ isH2TestEnabled = Boolean.parseBoolean(System.getProperty("enableH2Tests", "true"));
isPostgresTestDisabled = !Boolean.parseBoolean(System.getProperty("enablePostgresTests", "false"));
}
@SneakyThrows
public void setUp(String driverClass, String url, String user, String pwd) throws SQLException {
+ // Skip H2 tests if not enabled
+ if (url.toLowerCase().contains("_h2:") && !isH2TestEnabled) {
+ Assumptions.assumeFalse(true, "Skipping H2 tests");
+ }
// Skip PostgreSQL tests if disabled
if (url.contains("postgresql") && isPostgresTestDisabled) {
Assumptions.assumeFalse(true, "Skipping Postgres tests");
From f29d14d1e85e62f67cbefe15a68eda4c930bcd25 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 7 Dec 2025 20:45:53 +0000
Subject: [PATCH 47/49] Add CI/CD workflow documentation link to README
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index f83696a63..e12c6eed2 100644
--- a/README.md
+++ b/README.md
@@ -103,6 +103,7 @@ If Docker is not available in your environment, you can build and run OJP Server
- [OJP Components](documents/OJPComponents.md) - Core modules that define OJP’s architecture, including the server, JDBC driver, and shared gRPC contracts.
- [Targeted Problem and Solution](documents/targeted-problem/README.md) - Explanation of the problem OJP solves and how it addresses it.
- [BigDecimal Wire Format](documents/protocol/BIGDECIMAL_WIRE_FORMAT.md) - Protocol specification for language-neutral BigDecimal serialization.
+- [CI/CD Workflow Structure](documents/ci-cd-workflow-structure.md) - Explains the multi-stage CI/CD workflow with H2 fail-fast mechanism.
---
From dc69d8e2bb5286b3424317e89f554597e9cb8854 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 7 Dec 2025 20:48:45 +0000
Subject: [PATCH 48/49] Fix code review issues: remove unreachable code and use
consistent Assumptions pattern
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../java/openjproxy/jdbc/BasicCrudIntegrationTest.java | 8 --------
.../java/openjproxy/jdbc/BinaryStreamIntegrationTest.java | 5 +++--
.../jdbc/ReadMultipleBlocksOfDataIntegrationTest.java | 5 +++--
3 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
index 6b821b4df..4642a7d5b 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
@@ -49,49 +49,41 @@ public void crudTestSuccessful(String driverClass, String url, String user, Stri
// Skip H2 tests if not enabled
if (url.toLowerCase().contains("_h2:") && !isH2TestEnabled) {
Assumptions.assumeFalse(true, "Skipping H2 tests - not enabled");
- tablePrefix = "h2_";
}
// Skip PostgreSQL tests if disabled
if (url.toLowerCase().contains("postgresql") && isPostgresTestDisabled) {
Assumptions.assumeFalse(true, "Skipping Postgres tests");
- tablePrefix = "postgres_";
}
// Skip MySQL tests if disabled
if (url.toLowerCase().contains("mysql") && isMySQLTestDisabled) {
Assumptions.assumeFalse(true, "Skipping MySQL tests");
- tablePrefix = "mysql_";
}
// Skip MariaDB tests if not enabled
if (url.toLowerCase().contains("mariadb") && !isMariaDBTestEnabled) {
Assumptions.assumeFalse(true, "Skipping MariaDB tests - not enabled");
- tablePrefix = "mariadb_";
}
// Skip Oracle tests if not enabled
if (url.toLowerCase().contains("oracle") && !isOracleTestEnabled) {
Assumptions.assumeFalse(true, "Skipping Oracle tests - not enabled");
- tablePrefix = "oracle_";
}
// Skip SQL Server tests if not enabled
if (url.toLowerCase().contains("sqlserver") && !isSqlServerTestEnabled) {
Assumptions.assumeFalse(true, "Skipping SQL Server tests - not enabled");
- tablePrefix = "sqlserver_";
}
// Skip DB2 tests if not enabled
if (url.toLowerCase().contains("db2") && !isDb2TestEnabled) {
Assumptions.assumeFalse(true, "Skipping DB2 tests - not enabled");
- tablePrefix = "db2_";
}
// Skip CockroachDB tests if disabled
if (url.toLowerCase().contains("26257") && isCockroachDBTestDisabled) {
Assumptions.assumeFalse(true, "Skipping CockroachDB tests");
- tablePrefix = "cockroachdb_";
}
ConnectionResult connResult = TestDBUtils.createConnection(url, user, pwd, isXA);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
index e171a84f9..cf4bff4ea 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
@@ -3,6 +3,7 @@
import openjproxy.jdbc.testutil.TestDBUtils;
import openjproxy.jdbc.testutil.TestDBUtils.ConnectionResult;
import org.junit.Assert;
+import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
@@ -32,10 +33,10 @@ public static void setup() {
@CsvFileSource(resources = "/h2_postgres_connections.csv")
public void createAndReadingBinaryStreamSuccessful(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException, IOException {
if (!isH2TestEnabled && url.toLowerCase().contains("_h2:")) {
- return;
+ Assumptions.assumeFalse(true, "Skipping H2 tests - not enabled");
}
if (isPostgresTestDisabled && url.contains("postgresql")) {
- return;
+ Assumptions.assumeFalse(true, "Skipping Postgres tests");
}
ConnectionResult connResult = TestDBUtils.createConnection(url, user, pwd, isXA);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
index 7887fb36f..025b53dcb 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
@@ -1,6 +1,7 @@
package openjproxy.jdbc;
import org.junit.Assert;
+import org.junit.jupiter.api.Assumptions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.condition.EnabledIf;
import org.junit.jupiter.params.ParameterizedTest;
@@ -32,12 +33,12 @@ public static void checkTestConfiguration() {
public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
// Skip H2 tests if not enabled
if (!isH2TestEnabled && url.toLowerCase().contains("_h2:")) {
- return;
+ Assumptions.assumeFalse(true, "Skipping H2 tests - not enabled");
}
// Skip Postgres connections in this test - they're tested separately using TestContainers
// See multiplePagesOfRowsResultSetSuccessfulPostgres() method below
if (url.contains("postgresql")) {
- return;
+ Assumptions.assumeFalse(true, "Skipping Postgres tests");
}
Connection conn = DriverManager.getConnection(url, user, pwd);
From 6dfb776773ddf26d30391cbc1babb6fd58f08abb Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 7 Dec 2025 20:50:32 +0000
Subject: [PATCH 49/49] Fix URL pattern consistency: use h2: instead of _h2:
and lowercase all URL checks
Co-authored-by: rrobetti <7221783+rrobetti@users.noreply.github.com>
---
.../test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java | 2 +-
.../java/openjproxy/jdbc/BinaryStreamIntegrationTest.java | 4 ++--
.../jdbc/ReadMultipleBlocksOfDataIntegrationTest.java | 4 ++--
.../src/test/java/openjproxy/jdbc/ResultSetTest.java | 4 ++--
4 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
index 4642a7d5b..651f39b50 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BasicCrudIntegrationTest.java
@@ -47,7 +47,7 @@ public static void setup() {
@CsvFileSource(resources = "/h2_postgres_mysql_mariadb_oracle_sqlserver_connections.csv")
public void crudTestSuccessful(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
// Skip H2 tests if not enabled
- if (url.toLowerCase().contains("_h2:") && !isH2TestEnabled) {
+ if (url.toLowerCase().contains("h2:") && !isH2TestEnabled) {
Assumptions.assumeFalse(true, "Skipping H2 tests - not enabled");
}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
index cf4bff4ea..f768b6344 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/BinaryStreamIntegrationTest.java
@@ -32,10 +32,10 @@ public static void setup() {
@ParameterizedTest
@CsvFileSource(resources = "/h2_postgres_connections.csv")
public void createAndReadingBinaryStreamSuccessful(String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException, IOException {
- if (!isH2TestEnabled && url.toLowerCase().contains("_h2:")) {
+ if (!isH2TestEnabled && url.toLowerCase().contains("h2:")) {
Assumptions.assumeFalse(true, "Skipping H2 tests - not enabled");
}
- if (isPostgresTestDisabled && url.contains("postgresql")) {
+ if (isPostgresTestDisabled && url.toLowerCase().contains("postgresql")) {
Assumptions.assumeFalse(true, "Skipping Postgres tests");
}
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
index 025b53dcb..b35f5d465 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ReadMultipleBlocksOfDataIntegrationTest.java
@@ -32,12 +32,12 @@ public static void checkTestConfiguration() {
@CsvFileSource(resources = "/h2_postgres_connections_with_record_counts.csv")
public void multiplePagesOfRowsResultSetSuccessful(int totalRecords, String driverClass, String url, String user, String pwd, boolean isXA) throws SQLException, ClassNotFoundException {
// Skip H2 tests if not enabled
- if (!isH2TestEnabled && url.toLowerCase().contains("_h2:")) {
+ if (!isH2TestEnabled && url.toLowerCase().contains("h2:")) {
Assumptions.assumeFalse(true, "Skipping H2 tests - not enabled");
}
// Skip Postgres connections in this test - they're tested separately using TestContainers
// See multiplePagesOfRowsResultSetSuccessfulPostgres() method below
- if (url.contains("postgresql")) {
+ if (url.toLowerCase().contains("postgresql")) {
Assumptions.assumeFalse(true, "Skipping Postgres tests");
}
Connection conn = DriverManager.getConnection(url, user, pwd);
diff --git a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java
index 21a6c8618..d373a9ad6 100644
--- a/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java
+++ b/ojp-jdbc-driver/src/test/java/openjproxy/jdbc/ResultSetTest.java
@@ -38,11 +38,11 @@ public static void checkTestConfiguration() {
@SneakyThrows
public void setUp(String driverClass, String url, String user, String pwd) throws SQLException {
// Skip H2 tests if not enabled
- if (url.toLowerCase().contains("_h2:") && !isH2TestEnabled) {
+ if (url.toLowerCase().contains("h2:") && !isH2TestEnabled) {
Assumptions.assumeFalse(true, "Skipping H2 tests");
}
// Skip PostgreSQL tests if disabled
- if (url.contains("postgresql") && isPostgresTestDisabled) {
+ if (url.toLowerCase().contains("postgresql") && isPostgresTestDisabled) {
Assumptions.assumeFalse(true, "Skipping Postgres tests");
}