From 7c6e231d4830463e6f7552bf2d513d2cdb50e26a Mon Sep 17 00:00:00 2001 From: Julien Viet Date: Tue, 10 Sep 2024 12:03:57 +0200 Subject: [PATCH] Use org.testcontainers:testcontainers instead of per database specializations. Motivation: Test containers specializations for database do have a split package with the main test containers jars, preventing running tests in IDE. Since the benefit of these specialization is very thin, the tradeof is not worth and we should use basic testcontainers. Changes: Use org.testcontainers:testcontainers everywhere. --- pom.xml | 2 +- vertx-db2-client/pom.xml | 2 +- .../io/vertx/db2client/junit/DB2Resource.java | 43 +++++++++++++++---- vertx-pg-client/pom.xml | 2 +- .../vertx/pgclient/junit/ContainerPgRule.java | 33 ++++++++++---- 5 files changed, 61 insertions(+), 21 deletions(-) diff --git a/pom.xml b/pom.xml index 140b04bc7..bee4462dd 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ ${project.basedir}/src/main/resources/META-INF/MANIFEST.MF - 1.17.6 + 1.20.1 diff --git a/vertx-db2-client/pom.xml b/vertx-db2-client/pom.xml index ab34d7be0..61845a14e 100644 --- a/vertx-db2-client/pom.xml +++ b/vertx-db2-client/pom.xml @@ -50,7 +50,7 @@ org.testcontainers - db2 + testcontainers ${testcontainers.version} test diff --git a/vertx-db2-client/src/test/java/io/vertx/db2client/junit/DB2Resource.java b/vertx-db2-client/src/test/java/io/vertx/db2client/junit/DB2Resource.java index 4efd195c8..1fd4e52b0 100644 --- a/vertx-db2-client/src/test/java/io/vertx/db2client/junit/DB2Resource.java +++ b/vertx-db2-client/src/test/java/io/vertx/db2client/junit/DB2Resource.java @@ -19,7 +19,8 @@ import io.vertx.core.net.JksOptions; import io.vertx.db2client.DB2ConnectOptions; import org.junit.rules.ExternalResource; -import org.testcontainers.containers.Db2Container; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.InternetProtocol; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; import java.nio.file.Files; @@ -45,12 +46,25 @@ public class DB2Resource extends ExternalResource { private boolean started = false; private boolean isDb2OnZ = false; private DB2ConnectOptions options; - private final Db2Container instance = new Db2Container("ibmcom/db2:11.5.0.0a") - .acceptLicense() + private final String database = "vertx"; + private final String user = "vertx"; + private final String password = "vertx"; + private final ServerContainer instance = new ServerContainer("ibmcom/db2:11.5.0.0a") { + @Override + protected void configure() { + this.addEnv("LICENSE", "accept"); + this.addEnv("DBNAME", database); + this.addEnv("DB2INSTANCE", user); + this.addEnv("DB2INST1_PASSWORD", password); + if (!this.getEnvMap().containsKey("AUTOCONFIG")) { + this.addEnv("AUTOCONFIG", "false"); + } + if (!this.getEnvMap().containsKey("ARCHIVE_LOGS")) { + this.addEnv("ARCHIVE_LOGS", "false"); + } + } + } .withLogConsumer(out -> System.out.print("[DB2] " + out.getUtf8String())) - .withUsername("vertx") - .withPassword("vertx") - .withDatabaseName("vertx") .withExposedPorts(50000, 50001) .withFileSystemBind("src/test/resources/tls/server/", "/certs/") .withFileSystemBind("src/test/resources/tls/db2_tls_setup.sh", "/var/custom/db2_tls_setup.sh") @@ -69,9 +83,9 @@ protected void before() throws Throwable { options = new DB2ConnectOptions() .setHost(instance.getHost()) .setPort(instance.getMappedPort(50000)) - .setDatabase(instance.getDatabaseName()) - .setUser(instance.getUsername()) - .setPassword(instance.getPassword()); + .setDatabase(database) + .setUser(user) + .setPassword(password); } else { System.out.println("Using custom DB2 instance as requested via DB2_HOST=" + get("DB2_HOST")); Objects.requireNonNull(get("DB2_PORT"), "Must set DB2_PORT to a non-null value if DB2_HOST is set"); @@ -143,4 +157,15 @@ private void runInitSql(Connection con) throws Exception { } } + private class ServerContainer extends GenericContainer { + + public ServerContainer(String dockerImageName) { + super(dockerImageName); + } + + public ServerContainer withFixedExposedPort(int hostPort, int containerPort) { + super.addFixedExposedPort(hostPort, containerPort, InternetProtocol.TCP); + return self(); + } + } } diff --git a/vertx-pg-client/pom.xml b/vertx-pg-client/pom.xml index 5580e95e4..5f2b8ea60 100644 --- a/vertx-pg-client/pom.xml +++ b/vertx-pg-client/pom.xml @@ -85,7 +85,7 @@ org.testcontainers - postgresql + testcontainers ${testcontainers.version} test diff --git a/vertx-pg-client/src/test/java/io/vertx/pgclient/junit/ContainerPgRule.java b/vertx-pg-client/src/test/java/io/vertx/pgclient/junit/ContainerPgRule.java index 24ee60dd0..7263d8fc7 100644 --- a/vertx-pg-client/src/test/java/io/vertx/pgclient/junit/ContainerPgRule.java +++ b/vertx-pg-client/src/test/java/io/vertx/pgclient/junit/ContainerPgRule.java @@ -20,10 +20,12 @@ import io.vertx.sqlclient.PoolOptions; import org.junit.rules.ExternalResource; import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.InternetProtocol; -import org.testcontainers.containers.PostgreSQLContainer; +import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; -import static org.testcontainers.containers.PostgreSQLContainer.POSTGRESQL_PORT; +import java.time.Duration; +import java.time.temporal.ChronoUnit; /** * Postgresql test database based on https://www.testcontainers.org @@ -34,11 +36,13 @@ */ public class ContainerPgRule extends ExternalResource { + private static final int POSTGRESQL_PORT = 5432; + private static final String connectionUri = System.getProperty("connection.uri"); private static final String tlsConnectionUri = System.getProperty("tls.connection.uri"); private static final String tlsForceConnectionUri = System.getProperty("tls.force.connection.uri"); - private ServerContainer server; + private ServerContainer server; private PgConnectOptions options; private String databaseVersion; private boolean ssl; @@ -72,10 +76,7 @@ public ContainerPgRule user(String user) { } private void initServer(String version) throws Exception { - server = new ServerContainer<>("postgres:" + version) - .withDatabaseName("postgres") - .withUsername(user) - .withPassword("postgres") + server = new ServerContainer("postgres:" + version) .withClasspathResourceMapping("create-postgres.sql", "/docker-entrypoint-initdb.d/create-postgres.sql", BindMode.READ_ONLY); if (ssl) { server @@ -183,15 +184,29 @@ protected void after() { } } - private static class ServerContainer> extends PostgreSQLContainer { + private class ServerContainer extends GenericContainer { public ServerContainer(String dockerImageName) { super(dockerImageName); + this.waitStrategy = (new LogMessageWaitStrategy()).withRegEx(".*database system is ready to accept connections.*\\s").withTimes(2).withStartupTimeout(Duration.of(60L, ChronoUnit.SECONDS)); + this.setCommand("postgres", "-c", "fsync=off"); + this.addExposedPort(POSTGRESQL_PORT); + } + + @Override + protected void configure() { + this.addEnv("POSTGRES_DB", "postgres"); + this.addEnv("POSTGRES_USER", user); + this.addEnv("POSTGRES_PASSWORD", "postgres"); } - public SELF withFixedExposedPort(int hostPort, int containerPort) { + public ServerContainer withFixedExposedPort(int hostPort, int containerPort) { super.addFixedExposedPort(hostPort, containerPort, InternetProtocol.TCP); return self(); } + + protected void waitUntilContainerStarted() { + this.getWaitStrategy().waitUntilReady(this); + } } }