From 9b138d1b0175c357f17d9a64bb774ee4cff79fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 1 Oct 2025 10:37:35 -0600 Subject: [PATCH] Add MariaDB container implementation under org.testcontainers.mariadb --- docs/modules/databases/mariadb.md | 2 +- .../containers/MariaDBContainer.java | 3 + .../mariadb/MariaDBContainer.java | 136 ++++++++++++++++++ .../MariaDBContainerTest.java} | 21 ++- 4 files changed, 150 insertions(+), 12 deletions(-) create mode 100644 modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java rename modules/mariadb/src/test/java/org/testcontainers/{junit/mariadb/SimpleMariaDBTest.java => mariadb/MariaDBContainerTest.java} (85%) diff --git a/docs/modules/databases/mariadb.md b/docs/modules/databases/mariadb.md index 2968c7a7e13..01d66139f1a 100644 --- a/docs/modules/databases/mariadb.md +++ b/docs/modules/databases/mariadb.md @@ -7,7 +7,7 @@ Testcontainers module for [MariaDB](https://hub.docker.com/_/mariadb) You can start a MySQL container instance from any Java application by using: -[Container definition](../../../modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java) inside_block:container +[Container definition](../../../modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBContainerTest.java) inside_block:container See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. diff --git a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java index bff0faf9d03..6c9ffda7722 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java +++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java @@ -12,7 +12,10 @@ * Supported image: {@code mariadb} *

* Exposed ports: 3306 + * + * @deprecated use {@link org.testcontainers.mariadb.MariaDBContainer} instead. */ +@Deprecated public class MariaDBContainer> extends JdbcDatabaseContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mariadb"); diff --git a/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java b/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java new file mode 100644 index 00000000000..957754c946b --- /dev/null +++ b/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java @@ -0,0 +1,136 @@ +package org.testcontainers.mariadb; + +import com.google.common.collect.Sets; +import org.testcontainers.containers.ContainerLaunchException; +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.images.builder.Transferable; +import org.testcontainers.utility.DockerImageName; + +import java.util.Set; + +/** + * Testcontainers implementation for MariaDB. + *

+ * Supported image: {@code mariadb} + *

+ * Exposed ports: 3306 + */ +public class MariaDBContainer extends JdbcDatabaseContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mariadb"); + + public static final String NAME = "mariadb"; + + static final String DEFAULT_USER = "test"; + + static final String DEFAULT_PASSWORD = "test"; + + static final Integer MARIADB_PORT = 3306; + + private String databaseName = "test"; + + private String username = DEFAULT_USER; + + private String password = DEFAULT_PASSWORD; + + private static final String MARIADB_ROOT_USER = "root"; + + private static final String MY_CNF_CONFIG_OVERRIDE_PARAM_NAME = "TC_MY_CNF"; + + public MariaDBContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public MariaDBContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + addExposedPort(MARIADB_PORT); + } + + @Override + public Set getLivenessCheckPortNumbers() { + return Sets.newHashSet(MARIADB_PORT); + } + + @Override + protected void configure() { + optionallyMapResourceParameterAsVolume( + MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, + "/etc/mysql/conf.d", + "mariadb-default-conf", + Transferable.DEFAULT_DIR_MODE + ); + + addEnv("MYSQL_DATABASE", databaseName); + + if (!MARIADB_ROOT_USER.equalsIgnoreCase(this.username)) { + addEnv("MYSQL_USER", username); + } + if (password != null && !password.isEmpty()) { + addEnv("MYSQL_PASSWORD", password); + addEnv("MYSQL_ROOT_PASSWORD", password); + } else if (MARIADB_ROOT_USER.equalsIgnoreCase(username)) { + addEnv("MYSQL_ALLOW_EMPTY_PASSWORD", "yes"); + } else { + throw new ContainerLaunchException("Empty password can be used only with the root user"); + } + setStartupAttempts(3); + } + + @Override + public String getDriverClassName() { + return "org.mariadb.jdbc.Driver"; + } + + @Override + public String getJdbcUrl() { + String additionalUrlParams = constructUrlParameters("?", "&"); + return ( + "jdbc:mariadb://" + getHost() + ":" + getMappedPort(MARIADB_PORT) + "/" + databaseName + additionalUrlParams + ); + } + + @Override + public String getDatabaseName() { + return databaseName; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getTestQueryString() { + return "SELECT 1"; + } + + public MariaDBContainer withConfigurationOverride(String s) { + parameters.put(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, s); + return self(); + } + + @Override + public MariaDBContainer withDatabaseName(final String databaseName) { + this.databaseName = databaseName; + return self(); + } + + @Override + public MariaDBContainer withUsername(final String username) { + this.username = username; + return self(); + } + + @Override + public MariaDBContainer withPassword(final String password) { + this.password = password; + return self(); + } +} diff --git a/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java b/modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBContainerTest.java similarity index 85% rename from modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java rename to modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBContainerTest.java index 4e88c8981eb..99348f9168d 100644 --- a/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java +++ b/modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBContainerTest.java @@ -1,9 +1,8 @@ -package org.testcontainers.junit.mariadb; +package org.testcontainers.mariadb; import org.apache.commons.lang3.SystemUtils; import org.junit.jupiter.api.Test; import org.testcontainers.MariaDBTestImages; -import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; import java.io.File; @@ -20,12 +19,12 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assumptions.assumeThat; -class SimpleMariaDBTest extends AbstractContainerDatabaseTest { +class MariaDBContainerTest extends AbstractContainerDatabaseTest { @Test void testSimple() throws SQLException { try ( // container { - MariaDBContainer mariadb = new MariaDBContainer<>("mariadb:10.3.39") + MariaDBContainer mariadb = new MariaDBContainer("mariadb:10.3.39") // } ) { mariadb.start(); @@ -40,7 +39,7 @@ void testSimple() throws SQLException { @Test void testSpecificVersion() throws SQLException { try ( - MariaDBContainer mariadbOldVersion = new MariaDBContainer<>( + MariaDBContainer mariadbOldVersion = new MariaDBContainer( MariaDBTestImages.MARIADB_IMAGE.withTag("10.3.39") ) ) { @@ -60,7 +59,7 @@ void testMariaDBWithCustomIniFile() throws SQLException { assumeThat(SystemUtils.IS_OS_WINDOWS).isFalse(); try ( - MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>( + MariaDBContainer mariadbCustomConfig = new MariaDBContainer( MariaDBTestImages.MARIADB_IMAGE.withTag("10.3.39") ) .withConfigurationOverride("somepath/mariadb_conf_override") @@ -74,7 +73,7 @@ void testMariaDBWithCustomIniFile() throws SQLException { @Test void testMariaDBWithCommandOverride() throws SQLException { try ( - MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>(MariaDBTestImages.MARIADB_IMAGE) + MariaDBContainer mariadbCustomConfig = new MariaDBContainer(MariaDBTestImages.MARIADB_IMAGE) .withCommand("mysqld --auto_increment_increment=10") ) { mariadbCustomConfig.start(); @@ -87,7 +86,7 @@ void testMariaDBWithCommandOverride() throws SQLException { @Test void testWithAdditionalUrlParamInJdbcUrl() { - MariaDBContainer mariaDBContainer = new MariaDBContainer<>(MariaDBTestImages.MARIADB_IMAGE) + MariaDBContainer mariaDBContainer = new MariaDBContainer(MariaDBTestImages.MARIADB_IMAGE) .withUrlParam("connectTimeout", "40000") .withUrlParam("rewriteBatchedStatements", "true"); @@ -108,7 +107,7 @@ void testWithOnlyUserReadableCustomIniFile() throws Exception { assumeThat(FileSystems.getDefault().supportedFileAttributeViews().contains("posix")).isTrue(); try ( - MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>( + MariaDBContainer mariadbCustomConfig = new MariaDBContainer( MariaDBTestImages.MARIADB_IMAGE.withTag("10.3.39") ) .withConfigurationOverride("somepath/mariadb_conf_override") @@ -136,7 +135,7 @@ void testWithOnlyUserReadableCustomIniFile() throws Exception { @Test void testEmptyPasswordWithRootUser() throws SQLException { - try (MariaDBContainer mysql = new MariaDBContainer<>("mariadb:11.2.4").withUsername("root")) { + try (MariaDBContainer mysql = new MariaDBContainer("mariadb:11.2.4").withUsername("root")) { mysql.start(); ResultSet resultSet = performQuery(mysql, "SELECT 1"); @@ -146,7 +145,7 @@ void testEmptyPasswordWithRootUser() throws SQLException { } } - private void assertThatCustomIniFileWasUsed(MariaDBContainer mariadb) throws SQLException { + private void assertThatCustomIniFileWasUsed(MariaDBContainer mariadb) throws SQLException { try (ResultSet resultSet = performQuery(mariadb, "SELECT @@GLOBAL.innodb_max_undo_log_size")) { long result = resultSet.getLong(1); assertThat(result)