Skip to content

Commit 565e73c

Browse files
authored
Add MariaDB container implementation under org.testcontainers.mariadb (#11083)
1 parent 0102bcb commit 565e73c

File tree

4 files changed

+150
-12
lines changed

4 files changed

+150
-12
lines changed

docs/modules/databases/mariadb.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Testcontainers module for [MariaDB](https://hub.docker.com/_/mariadb)
77
You can start a MySQL container instance from any Java application by using:
88

99
<!--codeinclude-->
10-
[Container definition](../../../modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java) inside_block:container
10+
[Container definition](../../../modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBContainerTest.java) inside_block:container
1111
<!--/codeinclude-->
1212

1313
See [Database containers](./index.md) for documentation and usage that is common to all relational database container types.

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
* Supported image: {@code mariadb}
1313
* <p>
1414
* Exposed ports: 3306
15+
*
16+
* @deprecated use {@link org.testcontainers.mariadb.MariaDBContainer} instead.
1517
*/
18+
@Deprecated
1619
public class MariaDBContainer<SELF extends MariaDBContainer<SELF>> extends JdbcDatabaseContainer<SELF> {
1720

1821
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mariadb");
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
package org.testcontainers.mariadb;
2+
3+
import com.google.common.collect.Sets;
4+
import org.testcontainers.containers.ContainerLaunchException;
5+
import org.testcontainers.containers.JdbcDatabaseContainer;
6+
import org.testcontainers.images.builder.Transferable;
7+
import org.testcontainers.utility.DockerImageName;
8+
9+
import java.util.Set;
10+
11+
/**
12+
* Testcontainers implementation for MariaDB.
13+
* <p>
14+
* Supported image: {@code mariadb}
15+
* <p>
16+
* Exposed ports: 3306
17+
*/
18+
public class MariaDBContainer extends JdbcDatabaseContainer<MariaDBContainer> {
19+
20+
private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mariadb");
21+
22+
public static final String NAME = "mariadb";
23+
24+
static final String DEFAULT_USER = "test";
25+
26+
static final String DEFAULT_PASSWORD = "test";
27+
28+
static final Integer MARIADB_PORT = 3306;
29+
30+
private String databaseName = "test";
31+
32+
private String username = DEFAULT_USER;
33+
34+
private String password = DEFAULT_PASSWORD;
35+
36+
private static final String MARIADB_ROOT_USER = "root";
37+
38+
private static final String MY_CNF_CONFIG_OVERRIDE_PARAM_NAME = "TC_MY_CNF";
39+
40+
public MariaDBContainer(String dockerImageName) {
41+
this(DockerImageName.parse(dockerImageName));
42+
}
43+
44+
public MariaDBContainer(final DockerImageName dockerImageName) {
45+
super(dockerImageName);
46+
dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME);
47+
48+
addExposedPort(MARIADB_PORT);
49+
}
50+
51+
@Override
52+
public Set<Integer> getLivenessCheckPortNumbers() {
53+
return Sets.newHashSet(MARIADB_PORT);
54+
}
55+
56+
@Override
57+
protected void configure() {
58+
optionallyMapResourceParameterAsVolume(
59+
MY_CNF_CONFIG_OVERRIDE_PARAM_NAME,
60+
"/etc/mysql/conf.d",
61+
"mariadb-default-conf",
62+
Transferable.DEFAULT_DIR_MODE
63+
);
64+
65+
addEnv("MYSQL_DATABASE", databaseName);
66+
67+
if (!MARIADB_ROOT_USER.equalsIgnoreCase(this.username)) {
68+
addEnv("MYSQL_USER", username);
69+
}
70+
if (password != null && !password.isEmpty()) {
71+
addEnv("MYSQL_PASSWORD", password);
72+
addEnv("MYSQL_ROOT_PASSWORD", password);
73+
} else if (MARIADB_ROOT_USER.equalsIgnoreCase(username)) {
74+
addEnv("MYSQL_ALLOW_EMPTY_PASSWORD", "yes");
75+
} else {
76+
throw new ContainerLaunchException("Empty password can be used only with the root user");
77+
}
78+
setStartupAttempts(3);
79+
}
80+
81+
@Override
82+
public String getDriverClassName() {
83+
return "org.mariadb.jdbc.Driver";
84+
}
85+
86+
@Override
87+
public String getJdbcUrl() {
88+
String additionalUrlParams = constructUrlParameters("?", "&");
89+
return (
90+
"jdbc:mariadb://" + getHost() + ":" + getMappedPort(MARIADB_PORT) + "/" + databaseName + additionalUrlParams
91+
);
92+
}
93+
94+
@Override
95+
public String getDatabaseName() {
96+
return databaseName;
97+
}
98+
99+
@Override
100+
public String getUsername() {
101+
return username;
102+
}
103+
104+
@Override
105+
public String getPassword() {
106+
return password;
107+
}
108+
109+
@Override
110+
public String getTestQueryString() {
111+
return "SELECT 1";
112+
}
113+
114+
public MariaDBContainer withConfigurationOverride(String s) {
115+
parameters.put(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, s);
116+
return self();
117+
}
118+
119+
@Override
120+
public MariaDBContainer withDatabaseName(final String databaseName) {
121+
this.databaseName = databaseName;
122+
return self();
123+
}
124+
125+
@Override
126+
public MariaDBContainer withUsername(final String username) {
127+
this.username = username;
128+
return self();
129+
}
130+
131+
@Override
132+
public MariaDBContainer withPassword(final String password) {
133+
this.password = password;
134+
return self();
135+
}
136+
}

modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java renamed to modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBContainerTest.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
package org.testcontainers.junit.mariadb;
1+
package org.testcontainers.mariadb;
22

33
import org.apache.commons.lang3.SystemUtils;
44
import org.junit.jupiter.api.Test;
55
import org.testcontainers.MariaDBTestImages;
6-
import org.testcontainers.containers.MariaDBContainer;
76
import org.testcontainers.db.AbstractContainerDatabaseTest;
87

98
import java.io.File;
@@ -20,12 +19,12 @@
2019
import static org.assertj.core.api.Assertions.assertThat;
2120
import static org.assertj.core.api.Assumptions.assumeThat;
2221

23-
class SimpleMariaDBTest extends AbstractContainerDatabaseTest {
22+
class MariaDBContainerTest extends AbstractContainerDatabaseTest {
2423

2524
@Test
2625
void testSimple() throws SQLException {
2726
try ( // container {
28-
MariaDBContainer<?> mariadb = new MariaDBContainer<>("mariadb:10.3.39")
27+
MariaDBContainer mariadb = new MariaDBContainer("mariadb:10.3.39")
2928
// }
3029
) {
3130
mariadb.start();
@@ -40,7 +39,7 @@ void testSimple() throws SQLException {
4039
@Test
4140
void testSpecificVersion() throws SQLException {
4241
try (
43-
MariaDBContainer<?> mariadbOldVersion = new MariaDBContainer<>(
42+
MariaDBContainer mariadbOldVersion = new MariaDBContainer(
4443
MariaDBTestImages.MARIADB_IMAGE.withTag("10.3.39")
4544
)
4645
) {
@@ -60,7 +59,7 @@ void testMariaDBWithCustomIniFile() throws SQLException {
6059
assumeThat(SystemUtils.IS_OS_WINDOWS).isFalse();
6160

6261
try (
63-
MariaDBContainer<?> mariadbCustomConfig = new MariaDBContainer<>(
62+
MariaDBContainer mariadbCustomConfig = new MariaDBContainer(
6463
MariaDBTestImages.MARIADB_IMAGE.withTag("10.3.39")
6564
)
6665
.withConfigurationOverride("somepath/mariadb_conf_override")
@@ -74,7 +73,7 @@ void testMariaDBWithCustomIniFile() throws SQLException {
7473
@Test
7574
void testMariaDBWithCommandOverride() throws SQLException {
7675
try (
77-
MariaDBContainer<?> mariadbCustomConfig = new MariaDBContainer<>(MariaDBTestImages.MARIADB_IMAGE)
76+
MariaDBContainer mariadbCustomConfig = new MariaDBContainer(MariaDBTestImages.MARIADB_IMAGE)
7877
.withCommand("mysqld --auto_increment_increment=10")
7978
) {
8079
mariadbCustomConfig.start();
@@ -87,7 +86,7 @@ void testMariaDBWithCommandOverride() throws SQLException {
8786

8887
@Test
8988
void testWithAdditionalUrlParamInJdbcUrl() {
90-
MariaDBContainer<?> mariaDBContainer = new MariaDBContainer<>(MariaDBTestImages.MARIADB_IMAGE)
89+
MariaDBContainer mariaDBContainer = new MariaDBContainer(MariaDBTestImages.MARIADB_IMAGE)
9190
.withUrlParam("connectTimeout", "40000")
9291
.withUrlParam("rewriteBatchedStatements", "true");
9392

@@ -108,7 +107,7 @@ void testWithOnlyUserReadableCustomIniFile() throws Exception {
108107
assumeThat(FileSystems.getDefault().supportedFileAttributeViews().contains("posix")).isTrue();
109108

110109
try (
111-
MariaDBContainer<?> mariadbCustomConfig = new MariaDBContainer<>(
110+
MariaDBContainer mariadbCustomConfig = new MariaDBContainer(
112111
MariaDBTestImages.MARIADB_IMAGE.withTag("10.3.39")
113112
)
114113
.withConfigurationOverride("somepath/mariadb_conf_override")
@@ -136,7 +135,7 @@ void testWithOnlyUserReadableCustomIniFile() throws Exception {
136135

137136
@Test
138137
void testEmptyPasswordWithRootUser() throws SQLException {
139-
try (MariaDBContainer<?> mysql = new MariaDBContainer<>("mariadb:11.2.4").withUsername("root")) {
138+
try (MariaDBContainer mysql = new MariaDBContainer("mariadb:11.2.4").withUsername("root")) {
140139
mysql.start();
141140

142141
ResultSet resultSet = performQuery(mysql, "SELECT 1");
@@ -146,7 +145,7 @@ void testEmptyPasswordWithRootUser() throws SQLException {
146145
}
147146
}
148147

149-
private void assertThatCustomIniFileWasUsed(MariaDBContainer<?> mariadb) throws SQLException {
148+
private void assertThatCustomIniFileWasUsed(MariaDBContainer mariadb) throws SQLException {
150149
try (ResultSet resultSet = performQuery(mariadb, "SELECT @@GLOBAL.innodb_max_undo_log_size")) {
151150
long result = resultSet.getLong(1);
152151
assertThat(result)

0 commit comments

Comments
 (0)