Skip to content

Commit 3b8a1b5

Browse files
authored
[Fix/144] wait_for_logs working for DockerCompose (#149)
* 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
1 parent fc5f2df commit 3b8a1b5

File tree

5 files changed

+23
-1
lines changed

5 files changed

+23
-1
lines changed

testcontainers/core/container.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ def get_wrapped_container(self) -> Container:
132132
def get_docker_client(self) -> DockerClient:
133133
return self._docker
134134

135+
def get_logs(self):
136+
if not self._container:
137+
raise ContainerStartException("Container should be started before")
138+
return self._container.logs(stderr=False), self._container.logs(stdout=False)
139+
135140
def exec(self, command):
136141
if not self._container:
137142
raise ContainerStartException("Container should be started before")

testcontainers/core/waiting_utils.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,9 @@ def wait_for_logs(container, predicate, timeout=None, interval=1):
9090
start = time.time()
9191
while True:
9292
duration = time.time() - start
93-
if predicate(container._container.logs().decode()):
93+
stdout = container.get_logs()[0].decode()
94+
stderr = container.get_logs()[1].decode()
95+
if predicate(stdout) or predicate(stderr):
9496
return duration
9597
if timeout and duration > timeout:
9698
raise TimeoutError("container did not emit logs satisfying predicate in %.3f seconds"

tests/docker-compose-4.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
hello-world:
2+
image: "hello-world"

tests/test_core.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,10 @@ def test_raise_timeout():
1313
def test_wait_for_hello():
1414
with DockerContainer("hello-world") as container:
1515
wait_for_logs(container, "Hello from Docker!")
16+
17+
18+
def test_can_get_logs():
19+
with DockerContainer("hello-world") as container:
20+
wait_for_logs(container, "Hello from Docker!")
21+
stdout, stderr = container.get_logs()
22+
assert stdout, 'There should be something on stdout'

tests/test_docker_compose.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from testcontainers.compose import DockerCompose
55
from testcontainers.core.docker_client import DockerClient
66
from testcontainers.core.exceptions import NoSuchPortExposed
7+
from testcontainers.core.waiting_utils import wait_for_logs
78

89

910
def test_can_spawn_service_via_compose():
@@ -34,6 +35,11 @@ def test_compose_wait_for_container_ready():
3435
compose.wait_for("http://%s:4444/wd/hub" % docker.host())
3536

3637

38+
def test_compose_can_wait_for_logs():
39+
with DockerCompose(filepath="tests", compose_file_name="docker-compose-4.yml") as compose:
40+
wait_for_logs(compose, "Hello from Docker!")
41+
42+
3743
def test_can_parse_multiple_compose_files():
3844
with DockerCompose(filepath="tests",
3945
compose_file_name=["docker-compose.yml", "docker-compose-2.yml"]) as compose:

0 commit comments

Comments
 (0)