diff --git a/vertx-pg-client/src/test/java/io/vertx/tests/pgclient/PgBouncerTest.java b/vertx-pg-client/src/test/java/io/vertx/tests/pgclient/PgBouncerTest.java index 8f0b04bb1..0671f7b8c 100644 --- a/vertx-pg-client/src/test/java/io/vertx/tests/pgclient/PgBouncerTest.java +++ b/vertx-pg-client/src/test/java/io/vertx/tests/pgclient/PgBouncerTest.java @@ -1,12 +1,15 @@ package io.vertx.tests.pgclient; -import io.vertx.core.*; +import io.vertx.core.CompositeFuture; +import io.vertx.core.Future; +import io.vertx.core.Vertx; import io.vertx.ext.unit.junit.VertxUnitRunner; import io.vertx.pgclient.PgConnectOptions; import io.vertx.pgclient.PgConnection; import io.vertx.sqlclient.Cursor; import io.vertx.sqlclient.Tuple; +import org.apache.commons.compress.utils.IOUtils; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -14,13 +17,19 @@ import org.testcontainers.Testcontainers; import org.testcontainers.containers.FixedHostPortGenericContainer; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.utility.DockerImageName; - -import java.util.*; +import org.testcontainers.images.builder.ImageFromDockerfile; +import org.testcontainers.images.builder.Transferable; + +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; +import static org.testcontainers.containers.BindMode.READ_ONLY; @RunWith(VertxUnitRunner.class) public class PgBouncerTest { @@ -41,21 +50,15 @@ public void setUp() { pgContainer.withNetworkAliases("foo"); pgContainer.start(); Integer pgPort = pgContainer.getFirstMappedPort(); - String pgHost = pgContainer.getHost(); Testcontainers.exposeHostPorts(pgPort); - - pgBouncerContainer = new GenericContainer(DockerImageName.parse("bitnamilegacy/pgbouncer:1.20.1-debian-11-r30")); - pgBouncerContainer.withEnv("POSTGRESQL_USERNAME", "postgres"); - pgBouncerContainer.withEnv("POSTGRESQL_PASSWORD", "postgres"); - pgBouncerContainer.withEnv("POSTGRESQL_DATABASE", "postgres"); - pgBouncerContainer.withEnv("POSTGRESQL_HOST", "host.testcontainers.internal"); - pgBouncerContainer.withEnv("POSTGRESQL_PORT", "" + pgPort); - pgBouncerContainer.withEnv("PGBOUNCER_IGNORE_STARTUP_PARAMETERS", "extra_float_digits"); - pgBouncerContainer.withEnv("PGBOUNCER_POOL_MODE", "transaction"); - pgBouncerContainer.withEnv("PGBOUNCER_MAX_DB_CONNECTIONS", "2"); - pgBouncerContainer.withExposedPorts(6432); + pgBouncerContainer = new GenericContainer<>( + new ImageFromDockerfile() + .withFileFromTransferable("Dockerfile", resourceTransferable("pgBouncer/Dockerfile"))) + .withClasspathResourceMapping("pgBouncer/pgbouncer.ini", "/etc/pgbouncer/pgbouncer.ini", READ_ONLY) + .withClasspathResourceMapping("pgBouncer/userlist.txt", "/etc/pgbouncer/userlist.txt", READ_ONLY) + .withExposedPorts(6432); pgBouncerContainer.start(); Integer bouncerPort = pgBouncerContainer.getFirstMappedPort(); String bouncerHost = pgBouncerContainer.getHost(); @@ -72,6 +75,15 @@ public void setUp() { vertx = Vertx.vertx(); } + private static Transferable resourceTransferable(String resourceName) { + try (InputStream stream = PgBouncerTest.class.getClassLoader().getResourceAsStream(resourceName)) { + assert stream != null; + return Transferable.of(IOUtils.toByteArray(stream)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + @After public void tearDown() throws Exception { Testcontainers.exposeHostPorts(); diff --git a/vertx-pg-client/src/test/java/module-info.java b/vertx-pg-client/src/test/java/module-info.java index 9173677e9..230ce6b4a 100644 --- a/vertx-pg-client/src/test/java/module-info.java +++ b/vertx-pg-client/src/test/java/module-info.java @@ -12,5 +12,6 @@ requires junit; requires testcontainers; requires static org.slf4j; + requires org.apache.commons.compress; } diff --git a/vertx-pg-client/src/test/resources/pgBouncer/Dockerfile b/vertx-pg-client/src/test/resources/pgBouncer/Dockerfile new file mode 100644 index 000000000..c0d88753b --- /dev/null +++ b/vertx-pg-client/src/test/resources/pgBouncer/Dockerfile @@ -0,0 +1,9 @@ +FROM fedora:43 +RUN dnf -y update \ + && dnf -y install pgbouncer \ + && dnf clean all +RUN mkdir -p /var/run/pgbouncer /var/log/pgbouncer \ + && chown -R pgbouncer:pgbouncer /var/run/pgbouncer /var/log/pgbouncer /etc/pgbouncer +EXPOSE 6432 +USER pgbouncer +CMD ["pgbouncer", "/etc/pgbouncer/pgbouncer.ini"] diff --git a/vertx-pg-client/src/test/resources/pgBouncer/pgbouncer.ini b/vertx-pg-client/src/test/resources/pgBouncer/pgbouncer.ini new file mode 100644 index 000000000..1ebf59d83 --- /dev/null +++ b/vertx-pg-client/src/test/resources/pgBouncer/pgbouncer.ini @@ -0,0 +1,12 @@ +[databases] +* = host=host.testcontainers.internal port=5432 + +[pgbouncer] +listen_addr = 0.0.0.0 +listen_port = 6432 +auth_type = md5 +auth_file = /etc/pgbouncer/userlist.txt +pool_mode = transaction +max_client_conn = 2 +admin_users = postgres +ignore_startup_parameters = extra_float_digits diff --git a/vertx-pg-client/src/test/resources/pgBouncer/userlist.txt b/vertx-pg-client/src/test/resources/pgBouncer/userlist.txt new file mode 100644 index 000000000..888c6eb54 --- /dev/null +++ b/vertx-pg-client/src/test/resources/pgBouncer/userlist.txt @@ -0,0 +1 @@ +"postgres" "md53175bce1d3201d16594cebf9d7eb3f9d"