From 7f9ccb16d7a31823482185ebfb7547c1b1ad780b Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Wed, 12 Apr 2017 14:09:35 +0200 Subject: [PATCH 1/4] Update to latest postgres jdbc driver to make error logs visible --- modules/jdbc-test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/jdbc-test/pom.xml b/modules/jdbc-test/pom.xml index d025dc7780f..2ce69f20476 100644 --- a/modules/jdbc-test/pom.xml +++ b/modules/jdbc-test/pom.xml @@ -34,7 +34,7 @@ org.postgresql postgresql - 9.3-1101-jdbc41 + 42.0.0 test From d1de0968b780d1356de6e90c184fb3de49bac5e4 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Wed, 12 Apr 2017 14:28:31 +0200 Subject: [PATCH 2/4] Change PostgreSQLContainer to use WaitingConsumer for waiting instead of SQL query (#317) Fix #317 --- .../containers/PostgreSQLContainer.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java index 725f73d639c..c5a74f9fbdd 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java @@ -1,5 +1,12 @@ package org.testcontainers.containers; +import org.testcontainers.containers.output.OutputFrame; +import org.testcontainers.containers.output.WaitingConsumer; + +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.function.Predicate; + /** * @author richardnorth */ @@ -73,4 +80,23 @@ public SELF withPassword(final String password) { this.password = password; return self(); } + + @Override + protected void waitUntilContainerStarted() { + String regEx = ".*database system is ready to accept connections.*\\s"; + logger().info("Waiting for database to log '{}'", regEx); + + WaitingConsumer waitingConsumer = new WaitingConsumer(); + this.followOutput(waitingConsumer); + + + Predicate waitPredicate = outputFrame -> + outputFrame.getUtf8String().matches(regEx); + + try { + waitingConsumer.waitUntil(waitPredicate, 120, TimeUnit.SECONDS, 2); + } catch (TimeoutException e) { + throw new ContainerLaunchException("Timed out waiting for log output matching '" + regEx + "'"); + } + } } From 5bfd7f46c5a0557b7ce7c820ce0c78a59fa02995 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Fri, 14 Apr 2017 20:09:30 +0200 Subject: [PATCH 3/4] Make OutputFrame return empty String if containing no bytes --- .../java/org/testcontainers/containers/output/OutputFrame.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/containers/output/OutputFrame.java b/core/src/main/java/org/testcontainers/containers/output/OutputFrame.java index 9948bb451d1..d5ddcada8c8 100644 --- a/core/src/main/java/org/testcontainers/containers/output/OutputFrame.java +++ b/core/src/main/java/org/testcontainers/containers/output/OutputFrame.java @@ -30,7 +30,7 @@ public byte[] getBytes() { public String getUtf8String() { if (bytes == null) { - return null; + return ""; } return new String(bytes, Charsets.UTF_8); From 9b627c8aca4eb16d1341d8aad59be9724f6a5595 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Fri, 21 Apr 2017 16:27:53 +0200 Subject: [PATCH 4/4] Change PostgreSQLContainer to use LogMessageWaitStrategy (#317) Fix #317 --- .../containers/PostgreSQLContainer.java | 33 +++++++------------ 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java index c5a74f9fbdd..f8229f4131c 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java @@ -1,18 +1,17 @@ package org.testcontainers.containers; -import org.testcontainers.containers.output.OutputFrame; -import org.testcontainers.containers.output.WaitingConsumer; +import org.testcontainers.containers.wait.LogMessageWaitStrategy; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.function.Predicate; +import java.time.Duration; + +import static java.time.temporal.ChronoUnit.SECONDS; /** * @author richardnorth */ public class PostgreSQLContainer> extends JdbcDatabaseContainer { - public static final String NAME = "postgresql"; - public static final String IMAGE = "postgres"; + static final String NAME = "postgresql"; + static final String IMAGE = "postgres"; public static final Integer POSTGRESQL_PORT = 5432; private String databaseName = "test"; private String username = "test"; @@ -24,6 +23,10 @@ public PostgreSQLContainer() { public PostgreSQLContainer(final String dockerImageName) { super(dockerImageName); + this.waitStrategy = new LogMessageWaitStrategy() + .withRegEx(".*database system is ready to accept connections.*\\s") + .withTimes(2) + .withStartupTimeout(Duration.of(60, SECONDS)); } @Override @@ -83,20 +86,6 @@ public SELF withPassword(final String password) { @Override protected void waitUntilContainerStarted() { - String regEx = ".*database system is ready to accept connections.*\\s"; - logger().info("Waiting for database to log '{}'", regEx); - - WaitingConsumer waitingConsumer = new WaitingConsumer(); - this.followOutput(waitingConsumer); - - - Predicate waitPredicate = outputFrame -> - outputFrame.getUtf8String().matches(regEx); - - try { - waitingConsumer.waitUntil(waitPredicate, 120, TimeUnit.SECONDS, 2); - } catch (TimeoutException e) { - throw new ContainerLaunchException("Timed out waiting for log output matching '" + regEx + "'"); - } + getWaitStrategy().waitUntilReady(this); } }