diff --git a/testcontainers/core/container.py b/testcontainers/core/container.py index 0ca126ca6..109319886 100644 --- a/testcontainers/core/container.py +++ b/testcontainers/core/container.py @@ -127,7 +127,13 @@ def get_wrapped_container(self) -> Container: def get_docker_client(self) -> DockerClient: return self._docker + def get_logs(self): + if not self._container: + raise ContainerStartException("Container should be started before") + return self._container.logs(stderr=False), self._container.logs(stdout=False) + def exec(self, command): if not self._container: raise ContainerStartException("Container should be started before") return self.get_wrapped_container().exec_run(command) + diff --git a/testcontainers/core/waiting_utils.py b/testcontainers/core/waiting_utils.py index 9b224d3b4..a711ace1d 100644 --- a/testcontainers/core/waiting_utils.py +++ b/testcontainers/core/waiting_utils.py @@ -84,7 +84,9 @@ def wait_for_logs(container, predicate, timeout=None, interval=1): start = time.time() while True: duration = time.time() - start - if predicate(container._container.logs().decode()): + stdout = container.get_logs()[0].decode() + stderr = container.get_logs()[1].decode() + if predicate(stdout) or predicate(stderr): return duration if timeout and duration > timeout: raise TimeoutError("container did not emit logs satisfying predicate in %.3f seconds" diff --git a/tests/docker-compose-4.yml b/tests/docker-compose-4.yml new file mode 100644 index 000000000..9966c6549 --- /dev/null +++ b/tests/docker-compose-4.yml @@ -0,0 +1,2 @@ +hello-world: + image: "hello-world" diff --git a/tests/test_core.py b/tests/test_core.py index 0b5aced4b..c4ac6f05a 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -13,3 +13,10 @@ def test_raise_timeout(): def test_wait_for_hello(): with DockerContainer("hello-world") as container: wait_for_logs(container, "Hello from Docker!") + + +def test_can_get_logs(): + with DockerContainer("hello-world") as container: + wait_for_logs(container, "Hello from Docker!") + stdout, stderr = container.get_logs() + assert stdout, 'There should be something on stdout' \ No newline at end of file diff --git a/tests/test_db_containers.py b/tests/test_db_containers.py index 2fdc706e8..2fda23037 100644 --- a/tests/test_db_containers.py +++ b/tests/test_db_containers.py @@ -22,7 +22,7 @@ def test_docker_run_mysql(): assert row[0] == '5.7.17' -def test_docker_run_postgress(): +def test_docker_run_postgres(): postgres_container = PostgresContainer("postgres:9.5") with postgres_container as postgres: e = sqlalchemy.create_engine(postgres.get_connection_url()) diff --git a/tests/test_docker_compose.py b/tests/test_docker_compose.py index 747be5e16..28650d58d 100644 --- a/tests/test_docker_compose.py +++ b/tests/test_docker_compose.py @@ -4,6 +4,7 @@ from testcontainers.compose import DockerCompose from testcontainers.core.docker_client import DockerClient from testcontainers.core.exceptions import NoSuchPortExposed +from testcontainers.core.waiting_utils import wait_for_logs def test_can_spawn_service_via_compose(): @@ -34,6 +35,11 @@ def test_compose_wait_for_container_ready(): compose.wait_for("http://%s:4444/wd/hub" % docker.host()) +def test_compose_can_wait_for_logs(): + with DockerCompose(filepath="tests", compose_file_name="docker-compose-4.yml") as compose: + wait_for_logs(compose, "Hello from Docker!") + + def test_can_parse_multiple_compose_files(): with DockerCompose(filepath="tests", compose_file_name=["docker-compose.yml", "docker-compose-2.yml"]) as compose: