Skip to content

Commit e823ca2

Browse files
guss77rnorth
authored andcommitted
Support using MariaDB JDBC URL to set database name, user and password (#950)
Implement feature compatibility with MySQL container requested in issue #949
1 parent 12f7ce5 commit e823ca2

File tree

3 files changed

+72
-13
lines changed

3 files changed

+72
-13
lines changed

modules/jdbc-test/src/test/java/org/testcontainers/jdbc/JDBCDriverTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,13 @@ public static Iterable<Object[]> data() {
5555
{"jdbc:tc:postgis:9.6://hostname/databasename", EnumSet.noneOf(Options.class)},
5656
{"jdbc:tc:mysql:5.6://hostname/databasename?TC_MY_CNF=somepath/mysql_conf_override", EnumSet.of(Options.CustomIniFile)},
5757
{"jdbc:tc:mariadb://hostname/databasename", EnumSet.noneOf(Options.class)},
58+
{"jdbc:tc:mariadb://hostname/databasename?user=someuser&TC_INITSCRIPT=somepath/init_mariadb.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
5859
{"jdbc:tc:mariadb:10.2.14://hostname/databasename", EnumSet.noneOf(Options.class)},
5960
{"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_INITSCRIPT=somepath/init_unicode_mysql.sql&useUnicode=yes&characterEncoding=utf8", EnumSet.of(Options.CharacterSet)},
60-
{"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_INITSCRIPT=somepath/init_mariadb.sql", EnumSet.of(Options.ScriptedSchema)},
61-
{"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_INITFUNCTION=org.testcontainers.jdbc.JDBCDriverTest::sampleInitFunction", EnumSet.of(Options.ScriptedSchema)},
61+
{"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&TC_INITSCRIPT=somepath/init_mariadb.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
62+
{"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&TC_INITFUNCTION=org.testcontainers.jdbc.JDBCDriverTest::sampleInitFunction", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
63+
{"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&password=somepwd&TC_INITSCRIPT=somepath/init_mariadb.sql", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
64+
{"jdbc:tc:mariadb:10.2.14://hostname/databasename?user=someuser&password=somepwd&TC_INITFUNCTION=org.testcontainers.jdbc.JDBCDriverTest::sampleInitFunction", EnumSet.of(Options.ScriptedSchema, Options.JDBCParams)},
6265
{"jdbc:tc:mariadb:10.2.14://hostname/databasename?TC_MY_CNF=somepath/mariadb_conf_override", EnumSet.of(Options.CustomIniFile)},
6366
{"jdbc:tc:clickhouse://hostname/databasename", EnumSet.of(Options.PmdKnownBroken)},
6467
});

modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ public class MariaDBContainer<SELF extends MariaDBContainer<SELF>> extends JdbcD
1212
public static final String DEFAULT_TAG = "10.3.6";
1313

1414
private static final Integer MARIADB_PORT = 3306;
15-
private static final String MARIADB_USER = "test";
16-
private static final String MARIADB_PASSWORD = "test";
17-
private static final String MARIADB_DATABASE = "test";
15+
private String databaseName = "test";
16+
private String username = "test";
17+
private String password = "test";
18+
private static final String MARIADB_ROOT_USER = "root";
1819
private static final String MY_CNF_CONFIG_OVERRIDE_PARAM_NAME = "TC_MY_CNF";
1920

2021
public MariaDBContainer() {
@@ -35,10 +36,16 @@ protected void configure() {
3536
optionallyMapResourceParameterAsVolume(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, "/etc/mysql/conf.d", "mariadb-default-conf");
3637

3738
addExposedPort(MARIADB_PORT);
38-
addEnv("MYSQL_DATABASE", MARIADB_DATABASE);
39-
addEnv("MYSQL_USER", MARIADB_USER);
40-
addEnv("MYSQL_PASSWORD", MARIADB_PASSWORD);
41-
addEnv("MYSQL_ROOT_PASSWORD", MARIADB_PASSWORD);
39+
addEnv("MYSQL_DATABASE", databaseName);
40+
addEnv("MYSQL_USER", username);
41+
if (password != null && !password.isEmpty()) {
42+
addEnv("MYSQL_PASSWORD", password);
43+
addEnv("MYSQL_ROOT_PASSWORD", password);
44+
} else if (MARIADB_ROOT_USER.equalsIgnoreCase(username)) {
45+
addEnv("MYSQL_ALLOW_EMPTY_PASSWORD", "yes");
46+
} else {
47+
throw new ContainerLaunchException("Empty password can be used only with the root user");
48+
}
4249
setStartupAttempts(3);
4350
}
4451

@@ -49,22 +56,22 @@ public String getDriverClassName() {
4956

5057
@Override
5158
public String getJdbcUrl() {
52-
return "jdbc:mariadb://" + getContainerIpAddress() + ":" + getMappedPort(MARIADB_PORT) + "/test";
59+
return "jdbc:mariadb://" + getContainerIpAddress() + ":" + getMappedPort(MARIADB_PORT) + "/" + databaseName;
5360
}
5461

5562
@Override
5663
public String getDatabaseName() {
57-
return MARIADB_DATABASE;
64+
return databaseName;
5865
}
5966

6067
@Override
6168
public String getUsername() {
62-
return MARIADB_USER;
69+
return username;
6370
}
6471

6572
@Override
6673
public String getPassword() {
67-
return MARIADB_PASSWORD;
74+
return password;
6875
}
6976

7077
@Override
@@ -76,4 +83,22 @@ public SELF withConfigurationOverride(String s) {
7683
parameters.put(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, s);
7784
return self();
7885
}
86+
87+
@Override
88+
public SELF withDatabaseName(final String databaseName) {
89+
this.databaseName = databaseName;
90+
return self();
91+
}
92+
93+
@Override
94+
public SELF withUsername(final String username) {
95+
this.username = username;
96+
return self();
97+
}
98+
99+
@Override
100+
public SELF withPassword(final String password) {
101+
this.password = password;
102+
return self();
103+
}
79104
}

modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainerProvider.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,18 @@
11
package org.testcontainers.containers;
22

3+
import org.testcontainers.jdbc.ConnectionUrl;
4+
5+
import java.util.Objects;
6+
37
/**
48
* Factory for MariaDB org.testcontainers.containers.
59
*/
610
public class MariaDBContainerProvider extends JdbcDatabaseContainerProvider {
11+
12+
private static final String USER_PARAM = "user";
13+
14+
private static final String PASSWORD_PARAM = "password";
15+
716
@Override
817
public boolean supports(String databaseType) {
918
return databaseType.equals(MariaDBContainer.NAME);
@@ -18,4 +27,26 @@ public JdbcDatabaseContainer newInstance() {
1827
public JdbcDatabaseContainer newInstance(String tag) {
1928
return new MariaDBContainer(MariaDBContainer.IMAGE + ":" + tag);
2029
}
30+
31+
@Override
32+
public JdbcDatabaseContainer newInstance(ConnectionUrl connectionUrl) {
33+
Objects.requireNonNull(connectionUrl, "Connection URL cannot be null");
34+
35+
final String databaseName = connectionUrl.getDatabaseName().orElse("test");
36+
final String user = connectionUrl.getQueryParameters().getOrDefault(USER_PARAM, "test");
37+
final String password = connectionUrl.getQueryParameters().getOrDefault(PASSWORD_PARAM, "test");
38+
39+
final JdbcDatabaseContainer instance;
40+
if (connectionUrl.getImageTag().isPresent()) {
41+
instance = newInstance(connectionUrl.getImageTag().get());
42+
} else {
43+
instance = newInstance();
44+
}
45+
46+
return instance
47+
.withDatabaseName(databaseName)
48+
.withUsername(user)
49+
.withPassword(password);
50+
}
51+
2152
}

0 commit comments

Comments
 (0)