From cb4e0216c29165aacdb16d554ef5f470c55670f9 Mon Sep 17 00:00:00 2001 From: Artem Dmitriev Date: Sat, 9 Jun 2018 14:53:21 +0300 Subject: [PATCH 1/5] Pass queryString to the JdbcDatabaseDelegate #727 --- .../org/testcontainers/jdbc/ContainerDatabaseDriver.java | 2 +- .../org/testcontainers/jdbc/ContainerLessJdbcDelegate.java | 2 +- .../java/org/testcontainers/jdbc/JdbcDatabaseDelegate.java | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerDatabaseDriver.java b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerDatabaseDriver.java index 569dc794213..fa6a25f2d5f 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerDatabaseDriver.java +++ b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerDatabaseDriver.java @@ -156,7 +156,7 @@ public synchronized Connection connect(String url, final Properties info) throws an init script or function has been specified, use it */ if (!initializedContainers.contains(container.getContainerId())) { - DatabaseDelegate databaseDelegate = new JdbcDatabaseDelegate(container); + DatabaseDelegate databaseDelegate = new JdbcDatabaseDelegate(container, queryString); runInitScriptIfRequired(url, databaseDelegate); runInitFunctionIfRequired(url, connection); initializedContainers.add(container.getContainerId()); diff --git a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerLessJdbcDelegate.java b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerLessJdbcDelegate.java index 7a22d139bea..0806ddd2c31 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerLessJdbcDelegate.java +++ b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerLessJdbcDelegate.java @@ -20,7 +20,7 @@ public class ContainerLessJdbcDelegate extends JdbcDatabaseDelegate { private Connection connection; public ContainerLessJdbcDelegate(Connection connection) { - super(null); + super(null, ""); this.connection = connection; } diff --git a/modules/jdbc/src/main/java/org/testcontainers/jdbc/JdbcDatabaseDelegate.java b/modules/jdbc/src/main/java/org/testcontainers/jdbc/JdbcDatabaseDelegate.java index e490da87c4a..6173a8f6a37 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/jdbc/JdbcDatabaseDelegate.java +++ b/modules/jdbc/src/main/java/org/testcontainers/jdbc/JdbcDatabaseDelegate.java @@ -18,15 +18,17 @@ public class JdbcDatabaseDelegate extends AbstractDatabaseDelegate { private JdbcDatabaseContainer container; + private String queryString; - public JdbcDatabaseDelegate(JdbcDatabaseContainer container) { + public JdbcDatabaseDelegate(JdbcDatabaseContainer container, String queryString) { this.container = container; + this.queryString = queryString; } @Override protected Statement createNewConnection() { try { - return container.createConnection("").createStatement(); + return container.createConnection(queryString).createStatement(); } catch (SQLException e) { log.error("Could not obtain JDBC connection"); throw new ConnectionCreationException("Could not obtain JDBC connection", e); From 7b612d304115734dc7c3380e3282860f5aa72a7b Mon Sep 17 00:00:00 2001 From: Artem Dmitriev Date: Sat, 9 Jun 2018 15:07:48 +0300 Subject: [PATCH 2/5] little code refactor --- .../org/testcontainers/jdbc/ContainerDatabaseDriver.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerDatabaseDriver.java b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerDatabaseDriver.java index fa6a25f2d5f..7cfc9ecb6b3 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerDatabaseDriver.java +++ b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ContainerDatabaseDriver.java @@ -192,14 +192,9 @@ private Map getContainerParameters(String url) { */ private Connection wrapConnection(final Connection connection, final JdbcDatabaseContainer container, final String url) { final Matcher matcher = DAEMON_MATCHING_PATTERN.matcher(url); - final boolean isDaemon = matcher.matches() ? Boolean.parseBoolean(matcher.group(2)) : false; + final boolean isDaemon = matcher.matches() && Boolean.parseBoolean(matcher.group(2)); - Set connections = containerConnections.get(container.getContainerId()); - - if (connections == null) { - connections = new HashSet<>(); - containerConnections.put(container.getContainerId(), connections); - } + Set connections = containerConnections.computeIfAbsent(container.getContainerId(), k -> new HashSet<>()); connections.add(connection); From 47a1f91d82462b7ea174a6c872287db6647b95e5 Mon Sep 17 00:00:00 2001 From: Artem Dmitriev Date: Wed, 13 Jun 2018 12:37:51 +0300 Subject: [PATCH 3/5] #727 test correct charset is applied for the Init Script --- .../org/testcontainers/jdbc/JDBCDriverTest.java | 13 +++++++++++-- .../test/resources/somepath/init_unicode_mysql.sql | 5 +++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql 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 4ef75c2c516..ea5bdc03a18 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 @@ -40,14 +40,14 @@ public static Iterable data() { {"jdbc:tc:mysql://hostname/databasename", false, false, false}, {"jdbc:tc:mysql:5.5.43://hostname/databasename?TC_INITSCRIPT=somepath/init_mysql.sql", true, false, false}, {"jdbc:tc:mysql:5.5.43://hostname/databasename?TC_INITFUNCTION=org.testcontainers.jdbc.JDBCDriverTest::sampleInitFunction", true, false, false}, - {"jdbc:tc:mysql:5.5.43://hostname/databasename?useUnicode=yes&characterEncoding=utf8", false, true, false}, + {"jdbc:tc:mysql:5.5.43://hostname/databasename?TC_INITSCRIPT=somepath/init_unicode_mysql.sql&useUnicode=yes&characterEncoding=utf8", false, true, false}, {"jdbc:tc:mysql:5.5.43://hostname/databasename", false, false, false}, {"jdbc:tc:mysql:5.5.43://hostname/databasename?useSSL=false", false, false, false}, {"jdbc:tc:postgresql:9.6.8://hostname/databasename", false, false, false}, {"jdbc:tc:mysql:5.6://hostname/databasename?TC_MY_CNF=somepath/mysql_conf_override", false, false, true}, {"jdbc:tc:mariadb://hostname/databasename", false, false, false}, {"jdbc:tc:mariadb:10.2.14://hostname/databasename", false, false, false}, - {"jdbc:tc:mariadb:10.2.14://hostname/databasename?useUnicode=yes&characterEncoding=utf8", false, true, false}, + {"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_INITSCRIPT=somepath/init_unicode_mysql.sql&useUnicode=yes&characterEncoding=utf8", false, true, false}, {"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_INITSCRIPT=somepath/init_mariadb.sql", true, false, false}, {"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_INITFUNCTION=org.testcontainers.jdbc.JDBCDriverTest::sampleInitFunction", true, false, false}, {"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_MY_CNF=somepath/mariadb_conf_override", false, false, true} @@ -123,6 +123,15 @@ private void performSimpleTestWithCharacterSet(String jdbcUrl) throws SQLExcepti }); assertTrue("The database returned a record as expected", result); + + result = new QueryRunner(dataSource).query("SELECT foo FROM bar", rs -> { + rs.next(); + String resultSetString = rs.getString(1); + assertEquals("A SELECT query succeed and the correct charset has been applied for the init script", "тест", resultSetString); + return true; + }); + + assertTrue("The database returned a record as expected", result); } } diff --git a/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql b/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql new file mode 100644 index 00000000000..51aff08726e --- /dev/null +++ b/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql @@ -0,0 +1,5 @@ +CREATE TABLE bar ( + foo VARCHAR(255) +) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci; + +INSERT INTO bar (foo) VALUES ('тест'); From dc972b3dedb03d68645212ca383575b7907a0b90 Mon Sep 17 00:00:00 2001 From: Artem Dmitriev Date: Wed, 13 Jun 2018 16:41:36 +0300 Subject: [PATCH 4/5] SQLint codestyle fix --- .../src/test/resources/somepath/init_unicode_mysql.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql b/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql index 51aff08726e..573a6ae894c 100644 --- a/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql +++ b/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql @@ -1,5 +1,5 @@ CREATE TABLE bar ( - foo VARCHAR(255) -) DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci; + foo varchar(255) character set utf8 +); INSERT INTO bar (foo) VALUES ('тест'); From 0d6f0dc51dc1e1562fa56992c146f6d4835d6a1c Mon Sep 17 00:00:00 2001 From: Artem Dmitriev Date: Wed, 13 Jun 2018 18:32:42 +0300 Subject: [PATCH 5/5] more conforming test --- .../src/test/java/org/testcontainers/jdbc/JDBCDriverTest.java | 4 ++-- .../src/test/resources/somepath/init_unicode_mysql.sql | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 ea5bdc03a18..3da82e914c5 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 @@ -124,10 +124,10 @@ private void performSimpleTestWithCharacterSet(String jdbcUrl) throws SQLExcepti assertTrue("The database returned a record as expected", result); - result = new QueryRunner(dataSource).query("SELECT foo FROM bar", rs -> { + result = new QueryRunner(dataSource).query("SELECT foo FROM bar WHERE foo LIKE '%мир'", rs -> { rs.next(); String resultSetString = rs.getString(1); - assertEquals("A SELECT query succeed and the correct charset has been applied for the init script", "тест", resultSetString); + assertEquals("A SELECT query succeed and the correct charset has been applied for the init script", "привет мир", resultSetString); return true; }); diff --git a/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql b/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql index 573a6ae894c..f88969b0f30 100644 --- a/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql +++ b/modules/jdbc-test/src/test/resources/somepath/init_unicode_mysql.sql @@ -2,4 +2,4 @@ CREATE TABLE bar ( foo varchar(255) character set utf8 ); -INSERT INTO bar (foo) VALUES ('тест'); +INSERT INTO bar (foo) VALUES ('привет мир');