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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ public static Iterable<Object[]> data() {
{"jdbc:tc:mysql:5.5.43://hostname/databasename?TC_INITSCRIPT=somepath/init_unicode_mysql.sql&useUnicode=yes&characterEncoding=utf8", EnumSet.of(Options.CharacterSet)},
{"jdbc:tc:mysql:5.5.43://hostname/databasename", EnumSet.noneOf(Options.class)},
{"jdbc:tc:mysql:5.5.43://hostname/databasename?useSSL=false", EnumSet.noneOf(Options.class)},
{"jdbc:tc:postgresql:9.6.8://hostname/databasename", EnumSet.noneOf(Options.class)},
{"jdbc:tc:postgis://hostname/databasename", EnumSet.noneOf(Options.class)},
{"jdbc:tc:postgis:9.6://hostname/databasename", EnumSet.noneOf(Options.class)},
{"jdbc:tc:postgresql:9.6.8://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
{"jdbc:tc:postgis://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
{"jdbc:tc:postgis:9.6://hostname/databasename?user=someuser&password=somepwd", EnumSet.of(Options.JDBCParams)},
{"jdbc:tc:mysql:5.6://hostname/databasename?TC_MY_CNF=somepath/mysql_conf_override", EnumSet.of(Options.CustomIniFile)},
{"jdbc:tc:mariadb://hostname/databasename", EnumSet.noneOf(Options.class)},
{"jdbc:tc:mariadb://hostname/databasename?user=someuser&TC_INITSCRIPT=somepath/init_mariadb.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
Expand Down Expand Up @@ -135,16 +135,27 @@ private void performTestForScriptedSchema(String jdbcUrl) throws SQLException {

private void performTestForJDBCParamUsage(String jdbcUrl) throws SQLException {
try (HikariDataSource dataSource = getDataSource(jdbcUrl, 1)) {
boolean result = new QueryRunner(dataSource).query("select CURRENT_USER()", rs -> {
boolean result = new QueryRunner(dataSource).query("select CURRENT_USER", rs -> {
rs.next();
String resultUser = rs.getString(1);
assertEquals("User from query param is created.", "someuser@%", resultUser);
// Not all databases (eg. Postgres) return @% at the end of user name. We just need to make sure the user name matches.
if (resultUser.endsWith("@%")) {
resultUser = resultUser.substring(0, resultUser.length() - 2);
}
assertEquals("User from query param is created.", "someuser", resultUser);
return true;
});

assertTrue("The database returned a record as expected", result);

result = new QueryRunner(dataSource).query("SELECT DATABASE()", rs -> {
String databaseQuery = "SELECT DATABASE()";
// Postgres does not have Database() as a function
String databaseType = ConnectionUrl.newInstance(jdbcUrl).getDatabaseType();
if (databaseType.equalsIgnoreCase("postgresql") || databaseType.equalsIgnoreCase("postgis")) {
databaseQuery = "SELECT CURRENT_DATABASE()";
}

result = new QueryRunner(dataSource).query(databaseQuery, rs -> {
rs.next();
String resultDB = rs.getString(1);
assertEquals("Database name from URL String is used.", "databasename", resultDB);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

import lombok.extern.slf4j.Slf4j;

import java.util.Objects;

/**
* Base class for classes that can provide a JDBC container.
*/
Expand Down Expand Up @@ -49,4 +51,24 @@ public JdbcDatabaseContainer newInstance(ConnectionUrl url) {
return newInstance();
}
}

protected JdbcDatabaseContainer newInstanceFromConnectionUrl(ConnectionUrl connectionUrl, final String userParamName, final String pwdParamName) {
Objects.requireNonNull(connectionUrl, "Connection URL cannot be null");

final String databaseName = connectionUrl.getDatabaseName().orElse("test");
final String user = connectionUrl.getQueryParameters().getOrDefault(userParamName, "test");
final String password = connectionUrl.getQueryParameters().getOrDefault(pwdParamName, "test");

final JdbcDatabaseContainer instance;
if (connectionUrl.getImageTag().isPresent()) {
instance = newInstance(connectionUrl.getImageTag().get());
} else {
instance = newInstance();
}

return instance
.withDatabaseName(databaseName)
.withUsername(user)
.withPassword(password);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
* Factory for MariaDB org.testcontainers.containers.
*/
public class MariaDBContainerProvider extends JdbcDatabaseContainerProvider {

private static final String USER_PARAM = "user";

private static final String PASSWORD_PARAM = "password";
Expand All @@ -27,26 +27,10 @@ public JdbcDatabaseContainer newInstance() {
public JdbcDatabaseContainer newInstance(String tag) {
return new MariaDBContainer(MariaDBContainer.IMAGE + ":" + tag);
}

@Override
public JdbcDatabaseContainer newInstance(ConnectionUrl connectionUrl) {
Objects.requireNonNull(connectionUrl, "Connection URL cannot be null");

final String databaseName = connectionUrl.getDatabaseName().orElse("test");
final String user = connectionUrl.getQueryParameters().getOrDefault(USER_PARAM, "test");
final String password = connectionUrl.getQueryParameters().getOrDefault(PASSWORD_PARAM, "test");

final JdbcDatabaseContainer instance;
if (connectionUrl.getImageTag().isPresent()) {
instance = newInstance(connectionUrl.getImageTag().get());
} else {
instance = newInstance();
}

return instance
.withDatabaseName(databaseName)
.withUsername(user)
.withPassword(password);
return newInstanceFromConnectionUrl(connectionUrl, USER_PARAM, PASSWORD_PARAM);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,23 +34,7 @@ public JdbcDatabaseContainer newInstance(String tag) {

@Override
public JdbcDatabaseContainer newInstance(ConnectionUrl connectionUrl) {
Objects.requireNonNull(connectionUrl, "Connection URL cannot be null");

final String databaseName = connectionUrl.getDatabaseName().orElse("test");
final String user = connectionUrl.getQueryParameters().getOrDefault(USER_PARAM, "test");
final String password = connectionUrl.getQueryParameters().getOrDefault(PASSWORD_PARAM, "test");

final JdbcDatabaseContainer instance;
if (connectionUrl.getImageTag().isPresent()) {
instance = newInstance(connectionUrl.getImageTag().get());
} else {
instance = newInstance();
}

return instance
.withDatabaseName(databaseName)
.withUsername(user)
.withPassword(password);
return newInstanceFromConnectionUrl(connectionUrl, USER_PARAM, PASSWORD_PARAM);
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package org.testcontainers.containers;

import org.testcontainers.jdbc.ConnectionUrl;

import java.util.Objects;

/**
* Factory for PostGIS containers, which are a special flavour of PostgreSQL.
*/
Expand All @@ -8,6 +12,9 @@ public class PostgisContainerProvider extends JdbcDatabaseContainerProvider {
private static final String NAME = "postgis";
private static final String DEFAULT_TAG = "10";
private static final String DEFAULT_IMAGE = "mdillon/postgis";
public static final String USER_PARAM = "user";
public static final String PASSWORD_PARAM = "password";


@Override
public boolean supports(String databaseType) {
Expand All @@ -23,4 +30,9 @@ public JdbcDatabaseContainer newInstance() {
public JdbcDatabaseContainer newInstance(String tag) {
return new PostgreSQLContainer(DEFAULT_IMAGE + ":" + tag);
}

@Override
public JdbcDatabaseContainer newInstance(ConnectionUrl connectionUrl) {
return newInstanceFromConnectionUrl(connectionUrl, USER_PARAM, PASSWORD_PARAM);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
package org.testcontainers.containers;

import org.testcontainers.jdbc.ConnectionUrl;

import java.util.Objects;

/**
* Factory for PostgreSQL containers.
*/
public class PostgreSQLContainerProvider extends JdbcDatabaseContainerProvider {

public static final String USER_PARAM = "user";
public static final String PASSWORD_PARAM = "password";

@Override
public boolean supports(String databaseType) {
return databaseType.equals(PostgreSQLContainer.NAME);
Expand All @@ -18,4 +26,10 @@ public JdbcDatabaseContainer newInstance() {
public JdbcDatabaseContainer newInstance(String tag) {
return new PostgreSQLContainer(PostgreSQLContainer.IMAGE + ":" + tag);
}

@Override
public JdbcDatabaseContainer newInstance(ConnectionUrl connectionUrl) {
return newInstanceFromConnectionUrl(connectionUrl, USER_PARAM, PASSWORD_PARAM);
}

}