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)));
+ }
}