Skip to content

Commit

Permalink
[Fix/144] wait_for_logs working for DockerCompose (#149)
Browse files Browse the repository at this point in the history
* Fix/issue 144 (#1)

* added logs for container
* updated docker compose for tests
* added test for container logs

* Add newline at the end of test_core.py

* Fix Linter typo and replaced legacy README file extension in dockerfile
  • Loading branch information
singerjess committed Mar 27, 2022
1 parent fc5f2df commit 3b8a1b5
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 1 deletion.
5 changes: 5 additions & 0 deletions testcontainers/core/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,11 @@ 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")
Expand Down
4 changes: 3 additions & 1 deletion testcontainers/core/waiting_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,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"
Expand Down
2 changes: 2 additions & 0 deletions tests/docker-compose-4.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
hello-world:
image: "hello-world"
7 changes: 7 additions & 0 deletions tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
6 changes: 6 additions & 0 deletions tests/test_docker_compose.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down Expand Up @@ -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:
Expand Down

0 comments on commit 3b8a1b5

Please sign in to comment.