From 801ca26e83b6451ad6a98ad7c9f623e4959933dc Mon Sep 17 00:00:00 2001 From: jess Date: Thu, 24 Jun 2021 11:02:11 -0300 Subject: [PATCH 1/3] Fix/issue 144 (#1) * added logs for container * updated docker compose for tests * added test for container logs --- testcontainers/core/container.py | 6 ++++++ testcontainers/core/waiting_utils.py | 4 +++- tests/docker-compose-4.yml | 2 ++ tests/test_core.py | 7 +++++++ tests/test_db_containers.py | 2 +- tests/test_docker_compose.py | 6 ++++++ 6 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 tests/docker-compose-4.yml 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: From b7e30494ac1af642fac967ae954ac3c16fe1eaf7 Mon Sep 17 00:00:00 2001 From: jess Date: Mon, 28 Jun 2021 10:28:20 -0300 Subject: [PATCH 2/3] Add newline at the end of test_core.py --- tests/test_core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_core.py b/tests/test_core.py index c4ac6f05a..bb0126ae1 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -19,4 +19,5 @@ 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 + assert stdout, 'There should be something on stdout' + From 24eafa31c785a29877cbf874019adc9fb0e7b02d Mon Sep 17 00:00:00 2001 From: jess Date: Mon, 28 Jun 2021 11:34:00 -0300 Subject: [PATCH 3/3] Fix Linter typo and replaced legacy README file extension in dockerfile --- Dockerfile | 2 +- testcontainers/core/container.py | 1 - tests/test_core.py | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 73d815683..ef3cb7652 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,6 +4,6 @@ FROM python:${version} WORKDIR /workspace ARG version=3.8 COPY requirements/${version}.txt requirements.txt -COPY setup.py README.md ./ +COPY setup.py README.rst ./ RUN pip install -r requirements.txt COPY . . diff --git a/testcontainers/core/container.py b/testcontainers/core/container.py index 109319886..00fd24662 100644 --- a/testcontainers/core/container.py +++ b/testcontainers/core/container.py @@ -136,4 +136,3 @@ 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/tests/test_core.py b/tests/test_core.py index bb0126ae1..5a6663502 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -20,4 +20,3 @@ def test_can_get_logs(): wait_for_logs(container, "Hello from Docker!") stdout, stderr = container.get_logs() assert stdout, 'There should be something on stdout' -