From 581b80b184e2d0a0f65e4f12f8493565adb2f60a Mon Sep 17 00:00:00 2001 From: Richard North Date: Mon, 27 May 2019 20:55:43 +0100 Subject: [PATCH] Support MySQL 8 (#1470) Amend default MySQL connection parameters for MySQL 5 - 8 compatibility Fixes #736 --- modules/jdbc-test/build.gradle | 2 +- .../testcontainers/jdbc/JDBCDriverTest.java | 4 +- .../junit/AbstractContainerDatabaseTest.java | 32 +++++++++++ .../junit/MultiVersionMySQLTest.java | 37 ++++++++++++ .../junit/SimpleClickhouseTest.java | 15 +---- .../junit/SimpleMSSQLServerTest.java | 23 ++------ .../junit/SimpleMariaDBTest.java | 25 +------- .../testcontainers/junit/SimpleMySQLTest.java | 57 +++---------------- .../junit/SimpleOracleTest.java | 16 +----- .../junit/SimplePostgreSQLTest.java | 20 +------ .../containers/MySQLContainer.java | 10 +++- 11 files changed, 99 insertions(+), 142 deletions(-) create mode 100644 modules/jdbc-test/src/test/java/org/testcontainers/junit/AbstractContainerDatabaseTest.java create mode 100644 modules/jdbc-test/src/test/java/org/testcontainers/junit/MultiVersionMySQLTest.java diff --git a/modules/jdbc-test/build.gradle b/modules/jdbc-test/build.gradle index e631d2fa1a3..4c7ab8b0974 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -14,7 +14,7 @@ dependencies { testCompile 'com.google.guava:guava:18.0' testCompile 'org.postgresql:postgresql:42.0.0' - testCompile 'mysql:mysql-connector-java:5.1.45' + testCompile 'mysql:mysql-connector-java:8.0.14' testCompile 'org.mariadb.jdbc:mariadb-java-client:1.4.6' testCompile 'com.oracle:ojdbc6:12.1.0.1-atlassian-hosted' testCompile 'com.microsoft.sqlserver:mssql-jdbc:6.1.0.jre8' diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/JDBCDriverTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/JDBCDriverTest.java index 4eb55b38e24..40cb707a2d0 100644 --- a/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/JDBCDriverTest.java +++ b/modules/jdbc-test/src/test/java/org/testcontainers/jdbc/JDBCDriverTest.java @@ -198,8 +198,8 @@ private HikariDataSource verifyCharacterSet(String jdbcUrl) throws SQLException HikariDataSource dataSource = getDataSource(jdbcUrl, 1); boolean result = new QueryRunner(dataSource).query("SHOW VARIABLES LIKE 'character\\_set\\_connection'", rs -> { rs.next(); - String resultSetInt = rs.getString(2); - assertEquals("Passing query parameters to set DB connection encoding is successful", "utf8", resultSetInt); + String resultSetString = rs.getString(2); + assertTrue("Passing query parameters to set DB connection encoding is successful", resultSetString.startsWith("utf8")); return true; }); diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/AbstractContainerDatabaseTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/AbstractContainerDatabaseTest.java new file mode 100644 index 00000000000..a01146fe7a3 --- /dev/null +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/AbstractContainerDatabaseTest.java @@ -0,0 +1,32 @@ +package org.testcontainers.junit; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import org.testcontainers.containers.JdbcDatabaseContainer; + +import javax.sql.DataSource; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +abstract class AbstractContainerDatabaseTest { + + ResultSet performQuery(JdbcDatabaseContainer container, String sql) throws SQLException { + DataSource ds = getDataSource(container); + Statement statement = ds.getConnection().createStatement(); + statement.execute(sql); + ResultSet resultSet = statement.getResultSet(); + + resultSet.next(); + return resultSet; + } + + DataSource getDataSource(JdbcDatabaseContainer container) { + HikariConfig hikariConfig = new HikariConfig(); + hikariConfig.setJdbcUrl(container.getJdbcUrl()); + hikariConfig.setUsername(container.getUsername()); + hikariConfig.setPassword(container.getPassword()); + + return new HikariDataSource(hikariConfig); + } +} diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/MultiVersionMySQLTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/MultiVersionMySQLTest.java new file mode 100644 index 00000000000..b685d6dad80 --- /dev/null +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/MultiVersionMySQLTest.java @@ -0,0 +1,37 @@ +package org.testcontainers.junit; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.testcontainers.containers.MySQLContainer; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; + +@RunWith(Parameterized.class) +public class MultiVersionMySQLTest extends AbstractContainerDatabaseTest { + + @Parameterized.Parameters(name = "{0}") + public static String[] params() { + return new String[]{"5.5.62", "5.6.42", "5.7.26", "8.0.16"}; + } + + private final String version; + + public MultiVersionMySQLTest(String version) { + this.version = version; + } + + @Test + public void versionCheckTest() throws SQLException { + try (final MySQLContainer container = new MySQLContainer<>("mysql:" + version)) { + container.start(); + final ResultSet resultSet = performQuery(container, "SELECT VERSION()"); + final String resultSetString = resultSet.getString(1); + + assertEquals("The database version can be set using a container rule parameter", version, resultSetString); + } + } +} diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleClickhouseTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleClickhouseTest.java index 4e123617b8d..b765208e212 100644 --- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleClickhouseTest.java +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleClickhouseTest.java @@ -1,33 +1,22 @@ package org.testcontainers.junit; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; import org.junit.Rule; import org.junit.Test; import org.testcontainers.containers.ClickHouseContainer; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Statement; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; -public class SimpleClickhouseTest { +public class SimpleClickhouseTest extends AbstractContainerDatabaseTest { @Rule public ClickHouseContainer clickhouse = new ClickHouseContainer(); @Test public void testSimple() throws SQLException { - HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setJdbcUrl(clickhouse.getJdbcUrl()); - hikariConfig.setUsername(clickhouse.getUsername()); - hikariConfig.setPassword(clickhouse.getPassword()); - - HikariDataSource ds = new HikariDataSource(hikariConfig); - Statement statement = ds.getConnection().createStatement(); - statement.execute("SELECT 1"); - ResultSet resultSet = statement.getResultSet(); + ResultSet resultSet = performQuery(clickhouse, "SELECT 1"); resultSet.next(); int resultSetInt = resultSet.getInt(1); diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMSSQLServerTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMSSQLServerTest.java index 93904cfb94a..2791efa0780 100644 --- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMSSQLServerTest.java +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMSSQLServerTest.java @@ -1,11 +1,10 @@ package org.testcontainers.junit; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; import org.junit.Rule; import org.junit.Test; import org.testcontainers.containers.MSSQLServerContainer; +import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; @@ -15,36 +14,22 @@ /** * @author Stefan Hufschmidt */ -public class SimpleMSSQLServerTest { +public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest { @Rule public MSSQLServerContainer mssqlServer = new MSSQLServerContainer(); @Test public void testSimple() throws SQLException { - HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setJdbcUrl(mssqlServer.getJdbcUrl()); - hikariConfig.setUsername(mssqlServer.getUsername()); - hikariConfig.setPassword(mssqlServer.getPassword()); + ResultSet resultSet = performQuery(mssqlServer, "SELECT 1"); - HikariDataSource ds = new HikariDataSource(hikariConfig); - Statement statement = ds.getConnection().createStatement(); - statement.execute("SELECT 1"); - ResultSet resultSet = statement.getResultSet(); - - resultSet.next(); int resultSetInt = resultSet.getInt(1); assertEquals("A basic SELECT query succeeds", 1, resultSetInt); } @Test public void testSetupDatabase() throws SQLException { - HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setJdbcUrl(mssqlServer.getJdbcUrl()); - hikariConfig.setUsername(mssqlServer.getUsername()); - hikariConfig.setPassword(mssqlServer.getPassword()); - - HikariDataSource ds = new HikariDataSource(hikariConfig); + DataSource ds = getDataSource(mssqlServer); Statement statement = ds.getConnection().createStatement(); statement.executeUpdate("CREATE DATABASE [test];"); statement = ds.getConnection().createStatement(); diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMariaDBTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMariaDBTest.java index 042582ed890..21badefb9fb 100644 --- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMariaDBTest.java +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMariaDBTest.java @@ -1,26 +1,21 @@ package org.testcontainers.junit; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; -import lombok.NonNull; - import org.apache.commons.lang.SystemUtils; import org.junit.Test; import org.testcontainers.containers.MariaDBContainer; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Statement; +import static org.junit.Assume.assumeFalse; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; -import static org.junit.Assume.assumeFalse; /** * @author Miguel Gonzalez Sanchez */ -public class SimpleMariaDBTest { +public class SimpleMariaDBTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { @@ -85,20 +80,4 @@ public void testMariaDBWithCommandOverride() throws SQLException { mariadbCustomConfig.stop(); } } - - @NonNull - protected ResultSet performQuery(MariaDBContainer containerRule, String sql) throws SQLException { - HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setJdbcUrl(containerRule.getJdbcUrl()); - hikariConfig.setUsername(containerRule.getUsername()); - hikariConfig.setPassword(containerRule.getPassword()); - - HikariDataSource ds = new HikariDataSource(hikariConfig); - Statement statement = ds.getConnection().createStatement(); - statement.execute(sql); - ResultSet resultSet = statement.getResultSet(); - - resultSet.next(); - return resultSet; - } } diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMySQLTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMySQLTest.java index 5c8e4133a22..9570659c4dc 100644 --- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMySQLTest.java +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleMySQLTest.java @@ -1,17 +1,5 @@ package org.testcontainers.junit; -import static org.junit.Assert.fail; -import static org.junit.Assume.assumeFalse; -import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; -import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; - -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; - import org.apache.commons.lang.SystemUtils; import org.junit.Test; import org.slf4j.Logger; @@ -20,13 +8,19 @@ import org.testcontainers.containers.MySQLContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; -import lombok.NonNull; +import java.sql.ResultSet; +import java.sql.SQLException; + +import static org.junit.Assert.fail; +import static org.junit.Assume.assumeFalse; +import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; +import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; /** * @author richardnorth */ -public class SimpleMySQLTest { +public class SimpleMySQLTest extends AbstractContainerDatabaseTest { private static final Logger logger = LoggerFactory.getLogger(SimpleMySQLTest.class); @@ -114,24 +108,6 @@ public void testCommandOverride() throws SQLException { } - @Test - public void testMySQL8() throws SQLException { - assumeFalse(SystemUtils.IS_OS_WINDOWS); - MySQLContainer container = new MySQLContainer<>("mysql:8.0.11") - .withCommand("mysqld --default-authentication-plugin=mysql_native_password"); - container.start(); - - try { - ResultSet resultSet = performQuery(container, "SELECT VERSION()"); - String resultSetString = resultSet.getString(1); - - assertTrue("The database version can be set using a container rule parameter", "8.0.11".equals(resultSetString)); - } - finally { - container.stop(); - } - } - @Test public void testExplicitInitScript() throws SQLException { try (MySQLContainer container = (MySQLContainer) new MySQLContainer() @@ -160,21 +136,4 @@ public void testEmptyPasswordWithNonRootUser() { container.stop(); } } - - @NonNull - protected ResultSet performQuery(MySQLContainer containerRule, String sql) throws SQLException { - HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setDriverClassName(containerRule.getDriverClassName()); - hikariConfig.setJdbcUrl(containerRule.getJdbcUrl()); - hikariConfig.setUsername(containerRule.getUsername()); - hikariConfig.setPassword(containerRule.getPassword()); - - HikariDataSource ds = new HikariDataSource(hikariConfig); - Statement statement = ds.getConnection().createStatement(); - statement.execute(sql); - ResultSet resultSet = statement.getResultSet(); - - resultSet.next(); - return resultSet; - } } diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleOracleTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleOracleTest.java index 2fedcaf08e1..0855fd4860e 100644 --- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleOracleTest.java +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleOracleTest.java @@ -1,7 +1,5 @@ package org.testcontainers.junit; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; @@ -9,7 +7,6 @@ import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Statement; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; @@ -17,25 +14,18 @@ * @author gusohal */ @Ignore -public class SimpleOracleTest { +public class SimpleOracleTest extends AbstractContainerDatabaseTest { @Rule public OracleContainer oracle = new OracleContainer(); @Test public void testSimple() throws SQLException { - HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setJdbcUrl(oracle.getJdbcUrl()); - hikariConfig.setUsername(oracle.getUsername()); - hikariConfig.setPassword(oracle.getPassword()); - - HikariDataSource ds = new HikariDataSource(hikariConfig); - Statement statement = ds.getConnection().createStatement(); - statement.execute("SELECT 1 FROM dual"); - ResultSet resultSet = statement.getResultSet(); + ResultSet resultSet = performQuery(oracle, "SELECT 1 FROM dual"); resultSet.next(); int resultSetInt = resultSet.getInt(1); + assertEquals("A basic SELECT query succeeds", 1, resultSetInt); } } diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimplePostgreSQLTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimplePostgreSQLTest.java index 2581240cd84..c6685343c29 100644 --- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimplePostgreSQLTest.java +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimplePostgreSQLTest.java @@ -1,21 +1,17 @@ package org.testcontainers.junit; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; import org.junit.Test; -import org.testcontainers.containers.JdbcDatabaseContainer; import org.testcontainers.containers.PostgreSQLContainer; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Statement; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; /** * @author richardnorth */ -public class SimplePostgreSQLTest { +public class SimplePostgreSQLTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { @@ -41,18 +37,4 @@ public void testExplicitInitScript() throws SQLException { assertEquals("Value from init script should equal real value", "hello world", firstColumnValue); } } - - private ResultSet performQuery(JdbcDatabaseContainer container, String sql) throws SQLException { - HikariConfig hikariConfig = new HikariConfig(); - hikariConfig.setJdbcUrl(container.getJdbcUrl()); - hikariConfig.setUsername(container.getUsername()); - hikariConfig.setPassword(container.getPassword()); - - HikariDataSource ds = new HikariDataSource(hikariConfig); - Statement statement = ds.getConnection().createStatement(); - statement.execute(sql); - ResultSet resultSet = statement.getResultSet(); - resultSet.next(); - return resultSet; - } } diff --git a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java index 6d9139fa971..172ead4856a 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java @@ -70,10 +70,14 @@ protected String constructUrlForConnection(String queryString) { if (! url.contains("useSSL=")) { String separator = url.contains("?") ? "&" : "?"; - return url + separator + "useSSL=false"; - } else { - return url; + url = url + separator + "useSSL=false"; + } + + if (! url.contains("allowPublicKeyRetrieval=")) { + url = url + "&allowPublicKeyRetrieval=true"; } + + return url; } @Override