From 0af8b12d6eb3e9ee4e6df50ee9f06b4e49eb34ef Mon Sep 17 00:00:00 2001 From: eaxdev Date: Sun, 15 Sep 2019 21:55:22 +0300 Subject: [PATCH 01/12] Add additional url params in MySQLContainer (#1802) Added the ability to add additional parameters to the URL (https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-configuration-properties.html) --- .../testcontainers/junit/SimpleMySQLTest.java | 60 +++++++++++++++++++ .../containers/JdbcDatabaseContainer.java | 4 ++ .../containers/MySQLContainer.java | 14 +++++ 3 files changed, 78 insertions(+) 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 9570659c4dc..ff4b8f2399f 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 @@ -8,8 +8,14 @@ import org.testcontainers.containers.MySQLContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; +import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Statement; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.temporal.ChronoUnit; import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; @@ -136,4 +142,58 @@ public void testEmptyPasswordWithNonRootUser() { container.stop(); } } + + @Test + public void testWithAdditionalUrlParamTimeZone() throws SQLException { + MySQLContainer mysql = (MySQLContainer) new MySQLContainer() + .withUrlParam("serverTimezone", "Europe/Zurich") + .withEnv("TZ", "Europe/Zurich") + .withLogConsumer(new Slf4jLogConsumer(logger)); + mysql.start(); + + try(Connection connection = mysql.createConnection("")) { + Statement statement = connection.createStatement(); + statement.execute("SELECT NOW();"); + try (ResultSet resultSet = statement.getResultSet()) { + resultSet.next(); + + // checking that the time_zone MySQL is Europe/Zurich + LocalDateTime localDateTime = resultSet.getObject(1, LocalDateTime.class); + ZonedDateTime actualDateTime = localDateTime.atZone(ZoneId.of("Europe/Zurich")) + .truncatedTo(ChronoUnit.MINUTES); + ZonedDateTime expectedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Zurich")) + .truncatedTo(ChronoUnit.MINUTES); + + String message = String.format("MySQL time zone is not Europe/Zurich. MySQL date:%s, current date:%s", + actualDateTime, expectedDateTime); + assertTrue(message, actualDateTime.equals(expectedDateTime)); + } + } finally { + mysql.stop(); + } + } + + @Test + public void testWithAdditionalUrlParamMultiQueries() throws SQLException { + MySQLContainer mysql = (MySQLContainer) new MySQLContainer() + .withUrlParam("allowMultiQueries", "true") + .withLogConsumer(new Slf4jLogConsumer(logger)); + mysql.start(); + + try(Connection connection = mysql.createConnection("")) { + Statement statement = connection.createStatement(); + String multiQuery = "DROP TABLE IF EXISTS bar; " + + "CREATE TABLE bar (foo VARCHAR(20)); " + + "INSERT INTO bar (foo) VALUES ('hello world');"; + statement.execute(multiQuery); + statement.execute("SELECT foo FROM bar;"); + try(ResultSet resultSet = statement.getResultSet()) { + resultSet.next(); + String firstColumnValue = resultSet.getString(1); + assertEquals("Value from bar should equal real value", "hello world", firstColumnValue); + } + } finally { + mysql.stop(); + } + } } diff --git a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java index 36a6461aa74..181012a57df 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java +++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java @@ -28,6 +28,7 @@ public abstract class JdbcDatabaseContainer parameters = new HashMap<>(); + protected Map urlParameters = new HashMap<>(); private int startupTimeoutSeconds = 120; private int connectTimeoutSeconds = 120; @@ -82,7 +83,10 @@ public SELF withPassword(String password) { public SELF withDatabaseName(String dbName) { throw new UnsupportedOperationException(); + } + public SELF withUrlParam(String paramName, String paramValue) { + throw new UnsupportedOperationException(); } /** 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 fa2e8626b0d..a7d65554e09 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java @@ -5,6 +5,8 @@ import java.util.HashSet; import java.util.Set; +import static java.util.stream.Collectors.joining; + /** * @author richardnorth */ @@ -82,9 +84,21 @@ protected String constructUrlForConnection(String queryString) { url = url + "&allowPublicKeyRetrieval=true"; } + if (!urlParameters.isEmpty()) { + String additionalParameters = this.urlParameters.entrySet().stream() + .map(Object::toString) + .collect(joining("&")); + url = url + "&" + additionalParameters; + } return url; } + @Override + public SELF withUrlParam(String paramName, String paramValue) { + urlParameters.put(paramName, paramValue); + return self(); + } + @Override public String getDatabaseName() { return databaseName; From e55eb25de1055fca7883f14384a268fd1ba330dc Mon Sep 17 00:00:00 2001 From: eaxdev Date: Wed, 16 Oct 2019 21:20:00 +0300 Subject: [PATCH 02/12] Change additional url params in MySQLContainer. Create common method: constructUrlParameters() (#1802) --- .../testcontainers/junit/SimpleMySQLTest.java | 21 +++++++++++++++++++ .../containers/JdbcDatabaseContainer.java | 13 ++++++++++++ .../containers/MySQLContainer.java | 10 +++------ 3 files changed, 37 insertions(+), 7 deletions(-) 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 ff4b8f2399f..43d8cc7605c 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 @@ -17,6 +17,8 @@ import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.junit.Assume.assumeFalse; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; @@ -196,4 +198,23 @@ public void testWithAdditionalUrlParamMultiQueries() throws SQLException { mysql.stop(); } } + + @Test + public void testWithAdditionalUrlParamInJdbcUrl() throws SQLException { + MySQLContainer mysql = (MySQLContainer) new MySQLContainer() + .withUrlParam("allowMultiQueries", "true") + .withUrlParam("rewriteBatchedStatements", "true") + .withLogConsumer(new Slf4jLogConsumer(logger)); + + try { + mysql.start(); + String jdbcUrl = mysql.getJdbcUrl(); + assertThat(jdbcUrl, containsString("?")); + assertThat(jdbcUrl, containsString("&")); + assertThat(jdbcUrl, containsString("rewriteBatchedStatements=true")); + assertThat(jdbcUrl, containsString("allowMultiQueries=true")); + } finally { + mysql.stop(); + } + } } diff --git a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java index 181012a57df..1d2a2d21177 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java +++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java @@ -17,6 +17,8 @@ import java.util.Properties; import java.util.concurrent.Future; +import static java.util.stream.Collectors.joining; + /** * Base class for containers that expose a JDBC connection * @@ -227,6 +229,17 @@ protected String constructUrlForConnection(String queryString) { return getJdbcUrl() + queryString; } + protected String constructUrlParameters(String startCharacter, String delimiter) { + String urlParameters = ""; + if (!this.urlParameters.isEmpty()) { + String additionalParameters = this.urlParameters.entrySet().stream() + .map(Object::toString) + .collect(joining(delimiter)); + urlParameters = startCharacter + additionalParameters; + } + return urlParameters; + } + protected void optionallyMapResourceParameterAsVolume(@NotNull String paramName, @NotNull String pathNameInContainer, @NotNull String defaultResource) { String resourceName = parameters.getOrDefault(paramName, defaultResource); 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 a7d65554e09..f5bf7898458 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java @@ -68,7 +68,9 @@ public String getDriverClassName() { @Override public String getJdbcUrl() { - return "jdbc:mysql://" + getContainerIpAddress() + ":" + getMappedPort(MYSQL_PORT) + "/" + databaseName; + String additionalUrlParams = constructUrlParameters("?", "&"); + return "jdbc:mysql://" + getContainerIpAddress() + ":" + getMappedPort(MYSQL_PORT) + + "/" + databaseName + additionalUrlParams; } @Override @@ -84,12 +86,6 @@ protected String constructUrlForConnection(String queryString) { url = url + "&allowPublicKeyRetrieval=true"; } - if (!urlParameters.isEmpty()) { - String additionalParameters = this.urlParameters.entrySet().stream() - .map(Object::toString) - .collect(joining("&")); - url = url + "&" + additionalParameters; - } return url; } From 5417319460b8d880b704f5744cb07a18a9104152 Mon Sep 17 00:00:00 2001 From: eaxdev Date: Wed, 16 Oct 2019 21:39:09 +0300 Subject: [PATCH 03/12] Add additional url params in CockroachContainer (#1802) --- .../containers/CockroachContainer.java | 10 +++++++++- .../junit/SimpleCockroachDBTest.java | 20 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java index fb13ced60d7..743d1fff26a 100644 --- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java +++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java @@ -43,7 +43,9 @@ public String getDriverClassName() { @Override public String getJdbcUrl() { - return JDBC_URL_PREFIX + "://" + getContainerIpAddress() + ":" + getMappedPort(DB_PORT) + "/" + databaseName; + String additionalUrlParams = constructUrlParameters("?", "&"); + return JDBC_URL_PREFIX + "://" + getContainerIpAddress() + ":" + getMappedPort(DB_PORT) + + "/" + databaseName + additionalUrlParams; } @Override @@ -75,4 +77,10 @@ public CockroachContainer withPassword(String password) { public CockroachContainer withDatabaseName(final String databaseName) { throw new UnsupportedOperationException("The CockroachDB docker image does not currently support this - please see https://github.com/cockroachdb/cockroach/issues/19826"); } + + @Override + public CockroachContainer withUrlParam(String paramName, String paramValue) { + urlParameters.put(paramName, paramValue); + return self(); + } } diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleCockroachDBTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleCockroachDBTest.java index c21a5ddfaf1..7975013a147 100644 --- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleCockroachDBTest.java +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleCockroachDBTest.java @@ -8,6 +8,8 @@ import java.util.logging.Level; import java.util.logging.LogManager; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; public class SimpleCockroachDBTest extends AbstractContainerDatabaseTest { @@ -41,4 +43,22 @@ public void testExplicitInitScript() throws SQLException { assertEquals("Value from init script should equal real value", "hello world", firstColumnValue); } } + + @Test + public void testWithAdditionalUrlParamInJdbcUrl() throws SQLException { + CockroachContainer cockroach = new CockroachContainer() + .withUrlParam("sslmode", "disable") + .withUrlParam("application_name", "cockroach"); + + try { + cockroach.start(); + String jdbcUrl = cockroach.getJdbcUrl(); + assertThat(jdbcUrl, containsString("?")); + assertThat(jdbcUrl, containsString("&")); + assertThat(jdbcUrl, containsString("sslmode=disable")); + assertThat(jdbcUrl, containsString("application_name=cockroach")); + } finally { + cockroach.stop(); + } + } } From 8af81ac6fd028a4d4c7f58298c0a67de998962f2 Mon Sep 17 00:00:00 2001 From: eaxdev Date: Wed, 16 Oct 2019 22:28:50 +0300 Subject: [PATCH 04/12] Add additional url params in Db2Container (#1802) --- .../org/testcontainers/containers/Db2Container.java | 10 +++++++++- .../java/org/testcontainers/junit/SimpleDb2Test.java | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java index 429cc060094..3749b6343b6 100644 --- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java +++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java @@ -81,7 +81,9 @@ public String getDriverClassName() { @Override public String getJdbcUrl() { - return "jdbc:db2://" + getContainerIpAddress() + ":" + getMappedPort(DB2_PORT) + "/" + databaseName; + String additionalUrlParams = constructUrlParameters(":", ";"); + return "jdbc:db2://" + getContainerIpAddress() + ":" + getMappedPort(DB2_PORT) + + "/" + databaseName + additionalUrlParams; } @Override @@ -117,6 +119,12 @@ public Db2Container withDatabaseName(String dbName) { return this; } + @Override + public Db2Container withUrlParam(String paramName, String paramValue) { + urlParameters.put(paramName, paramValue); + return this; + } + @Override protected void waitUntilContainerStarted() { getWaitStrategy().waitUntilReady(this); diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java index c686f979b79..e0d2b7edea7 100644 --- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java @@ -10,6 +10,8 @@ import java.sql.SQLException; import java.sql.Statement; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; @@ -17,6 +19,7 @@ public class SimpleDb2Test { @Rule public Db2Container db2 = new Db2Container() + .withUrlParam("sslConnection", "false") .acceptLicense(); @Test @@ -36,4 +39,9 @@ public void testSimple() throws SQLException { assertEquals("A basic SELECT query succeeds", 1, resultSetInt); } + @Test + public void testWithAdditionalUrlParamInJdbcUrl() { + String jdbcUrl = db2.getJdbcUrl(); + assertThat(jdbcUrl, containsString(":sslConnection=false")); + } } From 96c955e7338224b63d2ad7a1fd2a58dad06fb4a2 Mon Sep 17 00:00:00 2001 From: eaxdev Date: Wed, 16 Oct 2019 22:47:54 +0300 Subject: [PATCH 05/12] Add additional url params in MSSQLServerContainer (#1802) --- .../testcontainers/junit/SimpleMSSQLServerTest.java | 12 +++++++++++- .../containers/MSSQLServerContainer.java | 9 ++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) 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 2791efa0780..1992f8e5000 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 @@ -9,6 +9,8 @@ import java.sql.SQLException; import java.sql.Statement; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; /** @@ -17,7 +19,9 @@ public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest { @Rule - public MSSQLServerContainer mssqlServer = new MSSQLServerContainer(); + public MSSQLServerContainer mssqlServer = new MSSQLServerContainer() + .withUrlParam("integratedSecurity", "false") + .withUrlParam("applicationName", "MyApp"); @Test public void testSimple() throws SQLException { @@ -44,4 +48,10 @@ public void testSetupDatabase() throws SQLException { int resultSetInt = resultSet.getInt("ID"); assertEquals("A basic SELECT query succeeds", 3, resultSetInt); } + + @Test + public void testWithAdditionalUrlParamInJdbcUrl() { + String jdbcUrl = mssqlServer.getJdbcUrl(); + assertThat(jdbcUrl, containsString(";integratedSecurity=true;applicationName=MyApp")); + } } diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java index ad1a7d19090..2de0d144cbf 100644 --- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java +++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java @@ -60,7 +60,8 @@ public String getDriverClassName() { @Override public String getJdbcUrl() { - return "jdbc:sqlserver://" + getContainerIpAddress() + ":" + getMappedPort(MS_SQL_SERVER_PORT); + String additionalUrlParams = constructUrlParameters(";", ";"); + return "jdbc:sqlserver://" + getContainerIpAddress() + ":" + getMappedPort(MS_SQL_SERVER_PORT) + additionalUrlParams; } @Override @@ -78,6 +79,12 @@ public String getTestQueryString() { return "SELECT 1"; } + @Override + public SELF withUrlParam(String paramName, String paramValue) { + urlParameters.put(paramName, paramValue); + return self(); + } + @Override public SELF withPassword(final String password) { checkPasswordStrength(password); From 709ad1e59631d869b0dbdb713f30e1dbaec070dc Mon Sep 17 00:00:00 2001 From: eaxdev Date: Wed, 16 Oct 2019 22:48:21 +0300 Subject: [PATCH 06/12] Add additional url params in MariaDBContainer (#1802) --- .../junit/SimpleMariaDBTest.java | 20 +++++++++++++++++++ .../testcontainers/junit/SimpleMySQLTest.java | 2 +- .../containers/MariaDBContainer.java | 12 +++++++++-- 3 files changed, 31 insertions(+), 3 deletions(-) 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 21badefb9fb..6ae2e7192f6 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 @@ -7,6 +7,8 @@ import java.sql.ResultSet; import java.sql.SQLException; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; import static org.junit.Assume.assumeFalse; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertTrue; @@ -80,4 +82,22 @@ public void testMariaDBWithCommandOverride() throws SQLException { mariadbCustomConfig.stop(); } } + + @Test + public void testWithAdditionalUrlParamInJdbcUrl() { + MariaDBContainer mariaDBContainer = new MariaDBContainer() + .withUrlParam("connectTimeout", "40000") + .withUrlParam("rewriteBatchedStatements", "true"); + + try { + mariaDBContainer.start(); + String jdbcUrl = mariaDBContainer.getJdbcUrl(); + assertThat(jdbcUrl, containsString("?")); + assertThat(jdbcUrl, containsString("&")); + assertThat(jdbcUrl, containsString("rewriteBatchedStatements=true")); + assertThat(jdbcUrl, containsString("connectTimeout=40000")); + } finally { + mariaDBContainer.stop(); + } + } } 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 43d8cc7605c..1beb1d02971 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 @@ -200,7 +200,7 @@ public void testWithAdditionalUrlParamMultiQueries() throws SQLException { } @Test - public void testWithAdditionalUrlParamInJdbcUrl() throws SQLException { + public void testWithAdditionalUrlParamInJdbcUrl() { MySQLContainer mysql = (MySQLContainer) new MySQLContainer() .withUrlParam("allowMultiQueries", "true") .withUrlParam("rewriteBatchedStatements", "true") diff --git a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java index c41136c0bf2..727110fea66 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java +++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java @@ -56,7 +56,9 @@ public String getDriverClassName() { @Override public String getJdbcUrl() { - return "jdbc:mariadb://" + getContainerIpAddress() + ":" + getMappedPort(MARIADB_PORT) + "/" + databaseName; + String additionalUrlParams = constructUrlParameters("?", "&"); + return "jdbc:mariadb://" + getContainerIpAddress() + ":" + getMappedPort(MARIADB_PORT) + + "/" + databaseName + additionalUrlParams; } @Override @@ -79,11 +81,17 @@ public String getTestQueryString() { return "SELECT 1"; } + @Override + public SELF withUrlParam(String paramName, String paramValue) { + urlParameters.put(paramName, paramValue); + return self(); + } + public SELF withConfigurationOverride(String s) { parameters.put(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, s); return self(); } - + @Override public SELF withDatabaseName(final String databaseName) { this.databaseName = databaseName; From 722f32b03af85bb09ce4dcc7f55274a2f4b0b9d2 Mon Sep 17 00:00:00 2001 From: eaxdev Date: Wed, 16 Oct 2019 22:58:21 +0300 Subject: [PATCH 07/12] Add additional url params in PostgreSQLContainer (#1802) --- .../junit/SimpleCockroachDBTest.java | 2 +- .../junit/SimplePostgreSQLTest.java | 15 +++++++++++++++ .../containers/PostgreSQLContainer.java | 13 +++++++++++-- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleCockroachDBTest.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleCockroachDBTest.java index 7975013a147..b10b2ebce5c 100644 --- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleCockroachDBTest.java +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleCockroachDBTest.java @@ -45,7 +45,7 @@ public void testExplicitInitScript() throws SQLException { } @Test - public void testWithAdditionalUrlParamInJdbcUrl() throws SQLException { + public void testWithAdditionalUrlParamInJdbcUrl() { CockroachContainer cockroach = new CockroachContainer() .withUrlParam("sslmode", "disable") .withUrlParam("application_name", "cockroach"); 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 7189e05fb16..c137f7be509 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 @@ -8,6 +8,8 @@ import java.util.logging.Level; import java.util.logging.LogManager; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; import static org.rnorth.visibleassertions.VisibleAssertions.assertNotEquals; @@ -62,4 +64,17 @@ public void testExplicitInitScript() throws SQLException { assertEquals("Value from init script should equal real value", "hello world", firstColumnValue); } } + + @Test + public void testWithAdditionalUrlParamInJdbcUrl() { + try (PostgreSQLContainer postgres = new PostgreSQLContainer<>() + .withUrlParam("charSet", "UNICODE")) { + + postgres.start(); + String jdbcUrl = postgres.getJdbcUrl(); + assertThat(jdbcUrl, containsString("?")); + assertThat(jdbcUrl, containsString("&")); + assertThat(jdbcUrl, containsString("charSet=UNICODE")); + } + } } diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java index 85ad910aa17..7f4f3f3b651 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java @@ -46,6 +46,8 @@ protected Set getLivenessCheckPorts() { @Override protected void configure() { addExposedPort(POSTGRESQL_PORT); + // Disable Postgres driver use of java.util.logging to reduce noise at startup time + withUrlParam("loggerLevel", "OFF"); addEnv("POSTGRES_DB", databaseName); addEnv("POSTGRES_USER", username); addEnv("POSTGRES_PASSWORD", password); @@ -58,8 +60,9 @@ public String getDriverClassName() { @Override public String getJdbcUrl() { - // Disable Postgres driver use of java.util.logging to reduce noise at startup time - return "jdbc:postgresql://" + getContainerIpAddress() + ":" + getMappedPort(POSTGRESQL_PORT) + "/" + databaseName + "?loggerLevel=OFF"; + String additionalUrlParams = constructUrlParameters("?", "&"); + return "jdbc:postgresql://" + getContainerIpAddress() + ":" + getMappedPort(POSTGRESQL_PORT) + + "/" + databaseName + additionalUrlParams; } @Override @@ -82,6 +85,12 @@ public String getTestQueryString() { return "SELECT 1"; } + @Override + public SELF withUrlParam(String paramName, String paramValue) { + urlParameters.put(paramName, paramValue); + return self(); + } + @Override public SELF withDatabaseName(final String databaseName) { this.databaseName = databaseName; From 062070f8bada58853cacc58543cd44f6a257d4e7 Mon Sep 17 00:00:00 2001 From: eaxdev Date: Thu, 17 Oct 2019 21:47:32 +0300 Subject: [PATCH 08/12] Fix typo in test (#1802) --- .../java/org/testcontainers/junit/SimpleMSSQLServerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1992f8e5000..1d8789b1fad 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 @@ -52,6 +52,6 @@ public void testSetupDatabase() throws SQLException { @Test public void testWithAdditionalUrlParamInJdbcUrl() { String jdbcUrl = mssqlServer.getJdbcUrl(); - assertThat(jdbcUrl, containsString(";integratedSecurity=true;applicationName=MyApp")); + assertThat(jdbcUrl, containsString(";integratedSecurity=false;applicationName=MyApp")); } } From 2022e5db7aff2d2ede0aa47cc99b1b0dfb8a86c5 Mon Sep 17 00:00:00 2001 From: eaxdev Date: Thu, 17 Oct 2019 23:01:44 +0300 Subject: [PATCH 09/12] Move common method withUrlParam() to parent abstract class (#1802) --- .../org/testcontainers/containers/ClickHouseContainer.java | 4 ++++ .../org/testcontainers/containers/CockroachContainer.java | 6 ------ .../java/org/testcontainers/containers/Db2Container.java | 6 ------ .../org/testcontainers/junit/SimpleMSSQLServerTest.java | 2 +- .../java/org/testcontainers/junit/SimpleMariaDBTest.java | 2 +- .../testcontainers/containers/JdbcDatabaseContainer.java | 4 +++- .../org/testcontainers/containers/MariaDBContainer.java | 6 ------ .../org/testcontainers/containers/MSSQLServerContainer.java | 6 ------ .../java/org/testcontainers/containers/MySQLContainer.java | 6 ------ .../java/org/testcontainers/containers/OracleContainer.java | 5 +++++ .../org/testcontainers/containers/PostgreSQLContainer.java | 6 ------ 11 files changed, 14 insertions(+), 39 deletions(-) diff --git a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java index 0fd6174bf3b..312af40436a 100644 --- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java +++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseContainer.java @@ -69,4 +69,8 @@ public String getTestQueryString() { return TEST_QUERY; } + @Override + public ClickHouseContainer withUrlParam(String paramName, String paramValue) { + throw new UnsupportedOperationException("The ClickHouse does not support this"); + } } diff --git a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java index 743d1fff26a..9f0459e7ce1 100644 --- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java +++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java @@ -77,10 +77,4 @@ public CockroachContainer withPassword(String password) { public CockroachContainer withDatabaseName(final String databaseName) { throw new UnsupportedOperationException("The CockroachDB docker image does not currently support this - please see https://github.com/cockroachdb/cockroach/issues/19826"); } - - @Override - public CockroachContainer withUrlParam(String paramName, String paramValue) { - urlParameters.put(paramName, paramValue); - return self(); - } } diff --git a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java index 3749b6343b6..6ba35bea431 100644 --- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java +++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java @@ -119,12 +119,6 @@ public Db2Container withDatabaseName(String dbName) { return this; } - @Override - public Db2Container withUrlParam(String paramName, String paramValue) { - urlParameters.put(paramName, paramValue); - return this; - } - @Override protected void waitUntilContainerStarted() { getWaitStrategy().waitUntilReady(this); 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 1d8789b1fad..4266a4e2078 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 @@ -19,7 +19,7 @@ public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest { @Rule - public MSSQLServerContainer mssqlServer = new MSSQLServerContainer() + public MSSQLServerContainer mssqlServer = (MSSQLServerContainer) new MSSQLServerContainer() .withUrlParam("integratedSecurity", "false") .withUrlParam("applicationName", "MyApp"); 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 6ae2e7192f6..497b7d2605d 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 @@ -85,7 +85,7 @@ public void testMariaDBWithCommandOverride() throws SQLException { @Test public void testWithAdditionalUrlParamInJdbcUrl() { - MariaDBContainer mariaDBContainer = new MariaDBContainer() + MariaDBContainer mariaDBContainer = (MariaDBContainer) new MariaDBContainer() .withUrlParam("connectTimeout", "40000") .withUrlParam("rewriteBatchedStatements", "true"); diff --git a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java index 1d2a2d21177..6642c4c893e 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java +++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java @@ -2,6 +2,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import lombok.NonNull; +import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.testcontainers.containers.traits.LinkableContainer; import org.testcontainers.delegate.DatabaseDelegate; @@ -88,7 +89,8 @@ public SELF withDatabaseName(String dbName) { } public SELF withUrlParam(String paramName, String paramValue) { - throw new UnsupportedOperationException(); + urlParameters.put(paramName, paramValue); + return self(); } /** diff --git a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java index 727110fea66..8ce976e1e7c 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java +++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java @@ -81,12 +81,6 @@ public String getTestQueryString() { return "SELECT 1"; } - @Override - public SELF withUrlParam(String paramName, String paramValue) { - urlParameters.put(paramName, paramValue); - return self(); - } - public SELF withConfigurationOverride(String s) { parameters.put(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, s); return self(); diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java index 2de0d144cbf..cbb9e4187ad 100644 --- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java +++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java @@ -79,12 +79,6 @@ public String getTestQueryString() { return "SELECT 1"; } - @Override - public SELF withUrlParam(String paramName, String paramValue) { - urlParameters.put(paramName, paramValue); - return self(); - } - @Override public SELF withPassword(final String password) { checkPasswordStrength(password); 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 f5bf7898458..750cb117028 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java @@ -89,12 +89,6 @@ protected String constructUrlForConnection(String queryString) { return url; } - @Override - public SELF withUrlParam(String paramName, String paramValue) { - urlParameters.put(paramName, paramValue); - return self(); - } - @Override public String getDatabaseName() { return databaseName; diff --git a/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java b/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java index ea0eee1a2ff..1c7f5568da9 100644 --- a/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java +++ b/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java @@ -90,6 +90,11 @@ public OracleContainer withPassword(String password) { return self(); } + @Override + public OracleContainer withUrlParam(String paramName, String paramValue) { + throw new UnsupportedOperationException("The OracleDb does not support this"); + } + @SuppressWarnings("SameReturnValue") public String getSid() { return "xe"; diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java index 7f4f3f3b651..7e1d1034c4c 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java @@ -85,12 +85,6 @@ public String getTestQueryString() { return "SELECT 1"; } - @Override - public SELF withUrlParam(String paramName, String paramValue) { - urlParameters.put(paramName, paramValue); - return self(); - } - @Override public SELF withDatabaseName(final String databaseName) { this.databaseName = databaseName; From 701a1b0dfe13390f2c892b81b39b38f0d4976fdb Mon Sep 17 00:00:00 2001 From: eaxdev Date: Thu, 17 Oct 2019 23:03:38 +0300 Subject: [PATCH 10/12] Fixed build url params in DB2 container. DB2 require ';' symbol in the end url (#1802) --- .../java/org/testcontainers/containers/Db2Container.java | 2 +- .../test/java/org/testcontainers/junit/SimpleDb2Test.java | 2 +- .../testcontainers/containers/JdbcDatabaseContainer.java | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java index 6ba35bea431..c0ef73f1bf4 100644 --- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java +++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java @@ -81,7 +81,7 @@ public String getDriverClassName() { @Override public String getJdbcUrl() { - String additionalUrlParams = constructUrlParameters(":", ";"); + String additionalUrlParams = constructUrlParameters(":", ";", ";"); return "jdbc:db2://" + getContainerIpAddress() + ":" + getMappedPort(DB2_PORT) + "/" + databaseName + additionalUrlParams; } diff --git a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java index e0d2b7edea7..5354caf9c1a 100644 --- a/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java +++ b/modules/jdbc-test/src/test/java/org/testcontainers/junit/SimpleDb2Test.java @@ -42,6 +42,6 @@ public void testSimple() throws SQLException { @Test public void testWithAdditionalUrlParamInJdbcUrl() { String jdbcUrl = db2.getJdbcUrl(); - assertThat(jdbcUrl, containsString(":sslConnection=false")); + assertThat(jdbcUrl, containsString(":sslConnection=false;")); } } diff --git a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java index 6642c4c893e..6c265bc6943 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java +++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java @@ -232,12 +232,16 @@ protected String constructUrlForConnection(String queryString) { } protected String constructUrlParameters(String startCharacter, String delimiter) { + return constructUrlParameters(startCharacter, delimiter, StringUtils.EMPTY); + } + + protected String constructUrlParameters(String startCharacter, String delimiter, String endCharacter) { String urlParameters = ""; if (!this.urlParameters.isEmpty()) { String additionalParameters = this.urlParameters.entrySet().stream() .map(Object::toString) .collect(joining(delimiter)); - urlParameters = startCharacter + additionalParameters; + urlParameters = startCharacter + additionalParameters + endCharacter; } return urlParameters; } From fd560783759f9b2eb4206feb9fd7e42cf24bea57 Mon Sep 17 00:00:00 2001 From: Richard North Date: Sat, 16 May 2020 21:30:51 +0100 Subject: [PATCH 11/12] Reinstate tests lost during merge --- .../testcontainers/junit/db2/SimpleDb2Test.java | 15 +++++++++++++++ .../junit/mssqlserver/SimpleMSSQLServerTest.java | 16 ++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java b/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java index 08f427cf12b..6cc7535f785 100644 --- a/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java +++ b/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java @@ -7,6 +7,8 @@ import java.sql.ResultSet; import java.sql.SQLException; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; public class SimpleDb2Test extends AbstractContainerDatabaseTest { @@ -24,4 +26,17 @@ public void testSimple() throws SQLException { assertEquals("A basic SELECT query succeeds", 1, resultSetInt); } } + + @Test + public void testWithAdditionalUrlParamInJdbcUrl() { + try (Db2Container db2 = new Db2Container() + .withUrlParam("sslConnection", "false") + .acceptLicense()) { + + db2.start(); + + String jdbcUrl = db2.getJdbcUrl(); + assertThat(jdbcUrl, containsString(":sslConnection=false;")); + } + } } diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java index c1699d2473a..71e12a6d864 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java @@ -9,6 +9,8 @@ import java.sql.SQLException; import java.sql.Statement; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals; public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest { @@ -24,6 +26,20 @@ public void testSimple() throws SQLException { } } + @Test + public void testWithAdditionalUrlParamInJdbcUrl() { + try (MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>() + .withUrlParam("integratedSecurity", "false") + .withUrlParam("applicationName", "MyApp")) { + + mssqlServer.start(); + + String jdbcUrl = mssqlServer.getJdbcUrl(); + assertThat(jdbcUrl, containsString(";integratedSecurity=false;applicationName=MyApp")); + } + } + + @Test public void testSetupDatabase() throws SQLException { try (MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>()) { From 4f1d18f66a2965ce5376d5f27b42aa7a6ebcc3d0 Mon Sep 17 00:00:00 2001 From: Richard North Date: Thu, 21 May 2020 16:21:58 +0100 Subject: [PATCH 12/12] Fix erroneous assertion --- .../testcontainers/containers/PostgreSQLConnectionURLTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java index 05f6ea204a8..c0ba7e40d44 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java @@ -15,7 +15,7 @@ public void shouldCorrectlyAppendQueryString() { String connectionUrl = postgres.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); - assertTrue("Query String contains expected params", queryString.contains("&stringtype=unspecified&stringtype=unspecified")); + assertTrue("Query String contains expected params", queryString.contains("?stringtype=unspecified&stringtype=unspecified")); assertEquals("Query String starts with '?'", 0, queryString.indexOf('?')); assertFalse("Query String does not contain extra '?'", queryString.substring(1).contains("?")); }