diff --git a/plugin/trino-postgresql/pom.xml b/plugin/trino-postgresql/pom.xml index 4cf1839eefab..dcdbf58447a3 100644 --- a/plugin/trino-postgresql/pom.xml +++ b/plugin/trino-postgresql/pom.xml @@ -162,6 +162,12 @@ test + + io.trino + trino-testing-containers + test + + io.trino trino-testing-services diff --git a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/PostgreSqlQueryRunner.java b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/PostgreSqlQueryRunner.java index ba714ff68fc7..de78683890de 100644 --- a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/PostgreSqlQueryRunner.java +++ b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/PostgreSqlQueryRunner.java @@ -83,7 +83,7 @@ public static void main(String[] args) throws Exception { DistributedQueryRunner queryRunner = createPostgreSqlQueryRunner( - new TestingPostgreSqlServer(), + new TestingPostgreSqlServer(true), ImmutableMap.of("http-server.http.port", "8080"), ImmutableMap.of(), TpchTable.getTables()); diff --git a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestingPostgreSqlServer.java b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestingPostgreSqlServer.java index f84cb8e46dfc..277674701555 100644 --- a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestingPostgreSqlServer.java +++ b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestingPostgreSqlServer.java @@ -31,6 +31,7 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import static io.trino.plugin.jdbc.RemoteDatabaseEvent.Status.CANCELLED; import static io.trino.plugin.jdbc.RemoteDatabaseEvent.Status.RUNNING; +import static io.trino.testing.containers.TestContainers.exposeFixedPorts; import static java.lang.String.format; import static java.util.function.Predicate.not; import static org.testcontainers.containers.PostgreSQLContainer.POSTGRESQL_PORT; @@ -50,6 +51,11 @@ public class TestingPostgreSqlServer private final PostgreSQLContainer dockerContainer; public TestingPostgreSqlServer() + { + this(false); + } + + public TestingPostgreSqlServer(boolean shouldExposeFixedPorts) { // Use the oldest supported PostgreSQL version dockerContainer = new PostgreSQLContainer<>("postgres:10.20") @@ -58,6 +64,9 @@ public TestingPostgreSqlServer() .withUsername(USER) .withPassword(PASSWORD) .withCommand("postgres", "-c", "log_destination=stderr", "-c", "log_statement=all"); + if (shouldExposeFixedPorts) { + exposeFixedPorts(dockerContainer); + } dockerContainer.start(); execute("CREATE SCHEMA tpch"); diff --git a/testing/trino-testing-containers/src/main/java/io/trino/testing/containers/TestContainers.java b/testing/trino-testing-containers/src/main/java/io/trino/testing/containers/TestContainers.java index 2469bd3bbb03..7044e1b8686b 100644 --- a/testing/trino-testing-containers/src/main/java/io/trino/testing/containers/TestContainers.java +++ b/testing/trino-testing-containers/src/main/java/io/trino/testing/containers/TestContainers.java @@ -14,14 +14,20 @@ package io.trino.testing.containers; +import com.github.dockerjava.api.model.ExposedPort; +import com.github.dockerjava.api.model.PortBinding; +import com.google.common.collect.ImmutableList; import org.testcontainers.containers.GenericContainer; import org.testcontainers.utility.TestcontainersConfiguration; import java.io.Closeable; +import static com.github.dockerjava.api.model.Ports.Binding.bindPort; import static com.google.common.base.Preconditions.checkState; +import static com.google.common.collect.ImmutableList.toImmutableList; import static java.lang.Boolean.parseBoolean; import static java.lang.System.getenv; +import static java.util.Objects.requireNonNull; import static org.testcontainers.utility.MountableFile.forClasspathResource; public final class TestContainers @@ -55,4 +61,20 @@ public static String getPathFromClassPathResource(String resourcePath) // and mounted from there. .getResolvedPath(); } + + public static void exposeFixedPorts(GenericContainer container) + { + checkState(System.getenv("CONTINUOUS_INTEGRATION") == null, "" + + "Exposing fixed ports should not be used in regular test code. This could break parallel test execution. " + + "This method is supposed to be invoked from local development helpers only e.g. QueryRunner.main(), " + + "hence it should never run on CI"); + + ImmutableList portBindings = container.getExposedPorts().stream() + .map(exposedPort -> new PortBinding(bindPort(exposedPort), new ExposedPort(exposedPort))) + .collect(toImmutableList()); + + container.withCreateContainerCmdModifier(cmd -> cmd + .withHostConfig(requireNonNull(cmd.getHostConfig(), "hostConfig is null") + .withPortBindings(portBindings))); + } }