Skip to content

Commit 56513a4

Browse files
nickbabcockrnorth
authored andcommitted
Jdbc containers with user, passwd, and db customizations (#400)
1 parent d2906fd commit 56513a4

File tree

4 files changed

+91
-7
lines changed

4 files changed

+91
-7
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package org.testcontainers.junit;
2+
3+
import com.zaxxer.hikari.HikariConfig;
4+
import com.zaxxer.hikari.HikariDataSource;
5+
import org.junit.Rule;
6+
import org.junit.Test;
7+
import org.testcontainers.containers.MySQLContainer;
8+
9+
import java.sql.ResultSet;
10+
import java.sql.SQLException;
11+
import java.sql.Statement;
12+
13+
import static org.rnorth.visibleassertions.VisibleAssertions.assertEquals;
14+
15+
public class CustomizableMysqlTest {
16+
private static final String DB_NAME = "foo";
17+
private static final String USER = "bar";
18+
private static final String PWD = "baz";
19+
20+
// Add MYSQL_ROOT_HOST environment so that we can root login from anywhere for testing purposes
21+
@Rule
22+
public MySQLContainer mysql = (MySQLContainer) new MySQLContainer("mysql:5.5")
23+
.withDatabaseName(DB_NAME)
24+
.withUsername(USER)
25+
.withPassword(PWD)
26+
.withEnv("MYSQL_ROOT_HOST", "%");
27+
28+
@Test
29+
public void testSimple() throws SQLException {
30+
HikariConfig hikariConfig = new HikariConfig();
31+
hikariConfig.setJdbcUrl("jdbc:mysql://"
32+
+ mysql.getContainerIpAddress()
33+
+ ":" + mysql.getMappedPort(MySQLContainer.MYSQL_PORT)
34+
+ "/" + DB_NAME);
35+
hikariConfig.setUsername(USER);
36+
hikariConfig.setPassword(PWD);
37+
38+
HikariDataSource ds = new HikariDataSource(hikariConfig);
39+
Statement statement = ds.getConnection().createStatement();
40+
statement.execute("SELECT 1");
41+
ResultSet resultSet = statement.getResultSet();
42+
43+
assertEquals("There is a result", resultSet.next(), true);
44+
int resultSetInt = resultSet.getInt(1);
45+
assertEquals("A basic SELECT query succeeds", 1, resultSetInt);
46+
}
47+
}

modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,19 @@ public JdbcDatabaseContainer(String dockerImageName) {
6060
*/
6161
protected abstract String getTestQueryString();
6262

63+
public SELF withUsername(String username) {
64+
throw new UnsupportedOperationException();
65+
}
66+
67+
public SELF withPassword(String password){
68+
throw new UnsupportedOperationException();
69+
}
70+
71+
public SELF withDatabaseName(String dbName) {
72+
throw new UnsupportedOperationException();
73+
74+
}
75+
6376
@Override
6477
protected void waitUntilContainerStarted() {
6578
// Repeatedly try and open a connection to the DB and execute a test query

modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ public class MySQLContainer<SELF extends MySQLContainer<SELF>> extends JdbcDatab
88
public static final String NAME = "mysql";
99
public static final String IMAGE = "mysql";
1010
private static final String MY_CNF_CONFIG_OVERRIDE_PARAM_NAME = "TC_MY_CNF";
11-
private static final Integer MYSQL_PORT = 3306;
11+
public static final Integer MYSQL_PORT = 3306;
12+
private String databaseName = "test";
13+
private String username = "test";
14+
private String password = "test";
1215

1316
public MySQLContainer() {
1417
super(IMAGE + ":latest");
@@ -28,9 +31,9 @@ protected void configure() {
2831
optionallyMapResourceParameterAsVolume(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, "/etc/mysql/conf.d", "mysql-default-conf");
2932

3033
addExposedPort(3306);
31-
addEnv("MYSQL_DATABASE", "test");
32-
addEnv("MYSQL_USER", "test");
33-
addEnv("MYSQL_PASSWORD", "test");
34+
addEnv("MYSQL_DATABASE", databaseName);
35+
addEnv("MYSQL_USER", username);
36+
addEnv("MYSQL_PASSWORD", password);
3437
addEnv("MYSQL_ROOT_PASSWORD", "test");
3538
setCommand("mysqld");
3639
setStartupAttempts(3);
@@ -43,17 +46,17 @@ public String getDriverClassName() {
4346

4447
@Override
4548
public String getJdbcUrl() {
46-
return "jdbc:mysql://" + getContainerIpAddress() + ":" + getMappedPort(MYSQL_PORT) + "/test";
49+
return "jdbc:mysql://" + getContainerIpAddress() + ":" + getMappedPort(MYSQL_PORT) + "/" + databaseName;
4750
}
4851

4952
@Override
5053
public String getUsername() {
51-
return "test";
54+
return username;
5255
}
5356

5457
@Override
5558
public String getPassword() {
56-
return "test";
59+
return password;
5760
}
5861

5962
@Override
@@ -65,4 +68,22 @@ public SELF withConfigurationOverride(String s) {
6568
parameters.put(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, s);
6669
return self();
6770
}
71+
72+
@Override
73+
public SELF withDatabaseName(final String databaseName) {
74+
this.databaseName = databaseName;
75+
return self();
76+
}
77+
78+
@Override
79+
public SELF withUsername(final String username) {
80+
this.username = username;
81+
return self();
82+
}
83+
84+
@Override
85+
public SELF withPassword(final String password) {
86+
this.password = password;
87+
return self();
88+
}
6889
}

modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,16 +69,19 @@ public String getTestQueryString() {
6969
return "SELECT 1";
7070
}
7171

72+
@Override
7273
public SELF withDatabaseName(final String databaseName) {
7374
this.databaseName = databaseName;
7475
return self();
7576
}
7677

78+
@Override
7779
public SELF withUsername(final String username) {
7880
this.username = username;
7981
return self();
8082
}
8183

84+
@Override
8285
public SELF withPassword(final String password) {
8386
this.password = password;
8487
return self();

0 commit comments

Comments
 (0)