package org.testcontainers.junit; import org.junit.Rule; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.OutputFrame; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.containers.output.ToStringConsumer; import org.testcontainers.containers.output.WaitingConsumer; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; import static org.rnorth.visibleassertions.VisibleAssertions.*; import static org.testcontainers.containers.output.OutputFrame.OutputType.STDOUT; /** * Simple test for following container output. */ public class OutputStreamTest { @Rule public GenericContainer container = new GenericContainer("alpine:3.2") .withCommand("ping -c 5 www.google.com"); private static final Logger LOGGER = LoggerFactory.getLogger(OutputStreamTest.class); @Test public void testFetchStdout() throws TimeoutException { WaitingConsumer consumer = new WaitingConsumer(); container.followOutput(consumer, STDOUT); consumer.waitUntil(frame -> frame.getType() == STDOUT && frame.getUtf8String().contains("seq=2"), 30, TimeUnit.SECONDS); } @Test public void testFetchStdoutWithTimeout() throws TimeoutException { WaitingConsumer consumer = new WaitingConsumer(); container.followOutput(consumer, STDOUT); assertThrows("a TimeoutException should be thrown", TimeoutException.class, () -> { consumer.waitUntil(frame -> frame.getType() == STDOUT && frame.getUtf8String().contains("seq=5"), 2, TimeUnit.SECONDS); return true; }); } @Test public void testFetchStdoutWithNoLimit() throws TimeoutException { WaitingConsumer consumer = new WaitingConsumer(); container.followOutput(consumer, STDOUT); consumer.waitUntil(frame -> frame.getType() == STDOUT && frame.getUtf8String().contains("seq=2")); } @Test public void testLogConsumer() throws TimeoutException { WaitingConsumer waitingConsumer = new WaitingConsumer(); Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(LOGGER); Consumer<OutputFrame> composedConsumer = logConsumer.andThen(waitingConsumer); container.followOutput(composedConsumer); waitingConsumer.waitUntil(frame -> frame.getType() == STDOUT && frame.getUtf8String().contains("seq=2")); } @Test public void testToStringConsumer() throws TimeoutException { WaitingConsumer waitingConsumer = new WaitingConsumer(); ToStringConsumer toStringConsumer = new ToStringConsumer(); Consumer<OutputFrame> composedConsumer = toStringConsumer.andThen(waitingConsumer); container.followOutput(composedConsumer); waitingConsumer.waitUntilEnd(30, TimeUnit.SECONDS); String utf8String = toStringConsumer.toUtf8String(); assertTrue("the expected first value was found", utf8String.contains("seq=1")); assertTrue("the expected last value was found", utf8String.contains("seq=4")); assertFalse("a non-expected value was found", utf8String.contains("seq=42")); } }