From d80c31f57841492c99eec10fec140e76c7b071d9 Mon Sep 17 00:00:00 2001 From: Frank Stettner Date: Mon, 7 Apr 2025 08:06:28 +0200 Subject: [PATCH] tests/integration: Add tests for up and down command Refs #387 Signed-off-by: Frank Stettner --- tests/integration/up_down/Dockerfile | 6 + tests/integration/up_down/__init__.py | 1 + .../up_down/docker-compose-orphans.yml | 12 + tests/integration/up_down/docker-compose.yml | 19 + .../up_down/test_podman_compose_up_down.py | 559 ++++++++++++++++++ 5 files changed, 597 insertions(+) create mode 100644 tests/integration/up_down/Dockerfile create mode 100644 tests/integration/up_down/__init__.py create mode 100644 tests/integration/up_down/docker-compose-orphans.yml create mode 100644 tests/integration/up_down/docker-compose.yml create mode 100644 tests/integration/up_down/test_podman_compose_up_down.py diff --git a/tests/integration/up_down/Dockerfile b/tests/integration/up_down/Dockerfile new file mode 100644 index 0000000..d6ab234 --- /dev/null +++ b/tests/integration/up_down/Dockerfile @@ -0,0 +1,6 @@ +FROM docker.io/library/debian:bookworm-slim +RUN apt-get update \ + && apt-get install -y \ + dumb-init \ + && apt-get autoremove +RUN mkdir -p /mnt/test/ diff --git a/tests/integration/up_down/__init__.py b/tests/integration/up_down/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tests/integration/up_down/__init__.py @@ -0,0 +1 @@ + diff --git a/tests/integration/up_down/docker-compose-orphans.yml b/tests/integration/up_down/docker-compose-orphans.yml new file mode 100644 index 0000000..c4fd3f3 --- /dev/null +++ b/tests/integration/up_down/docker-compose-orphans.yml @@ -0,0 +1,12 @@ +version: "3" +volumes: + web1_vol: + web2_vol: +services: + web1: + image: podman-compose-up-down-test + build: . + hostname: web1 + command: ["dumb-init", "sleep", "infinity"] + volumes: + - web1_vol:/mnt/test/ diff --git a/tests/integration/up_down/docker-compose.yml b/tests/integration/up_down/docker-compose.yml new file mode 100644 index 0000000..a32db2b --- /dev/null +++ b/tests/integration/up_down/docker-compose.yml @@ -0,0 +1,19 @@ +version: "3" +volumes: + web1_vol: + web2_vol: +services: + web1: + image: podman-compose-up-down-test + build: . + hostname: web1 + command: ["dumb-init", "sleep", "infinity"] + volumes: + - web1_vol:/mnt/test/ + web2: + image: docker.io/library/debian:up-down-test + hostname: web2 + command: ["sleep", "infinity"] + volumes: + - web2_vol:/mnt/test/ + diff --git a/tests/integration/up_down/test_podman_compose_up_down.py b/tests/integration/up_down/test_podman_compose_up_down.py new file mode 100644 index 0000000..2169bde --- /dev/null +++ b/tests/integration/up_down/test_podman_compose_up_down.py @@ -0,0 +1,559 @@ +# SPDX-License-Identifier: GPL-2.0 + +""" +test_podman_compose_up_down.py + +Tests the podman compose up and down commands used to create and remove services. +""" + +import os +import unittest + +from tests.integration.test_utils import RunSubprocessMixin +from tests.integration.test_utils import podman_compose_path +from tests.integration.test_utils import test_path + + +class TestPodmanCompose(unittest.TestCase, RunSubprocessMixin): + up_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + os.path.join(test_path(), "up_down", "docker-compose.yml"), + "up", + "-d", + "--force-recreate", + ] + + def setUp(self): + """ + Retag the debian image before each test to no mess with the other integration tests when + testing the `--rmi` argument + """ + tag_cmd = [ + "podman", + "tag", + "docker.io/library/debian:bookworm-slim", + "docker.io/library/debian:up-down-test", + ] + self.run_subprocess_assert_returncode(tag_cmd) + + @classmethod + def tearDownClass(cls): + """ + Ensures that the images that were created for this tests will be removed + """ + rmi_cmd = [ + "podman", + "rmi", + "--force", + "--ignore", + "podman-compose-up-down-test", + "docker.io/library/debian:up-down-test", + ] + cls().run_subprocess_assert_returncode(rmi_cmd) + + def test_down(self): + down_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + os.path.join(test_path(), "up_down", "docker-compose.yml"), + "down", + "--timeout", + "0", + ] + + try: + self.run_subprocess_assert_returncode(self.up_cmd) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web1_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web2_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web1_vol", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web2_vol", + ]) + finally: + self.run_subprocess_assert_returncode(down_cmd) + + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web1_1"], 1 + ) + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web2_1"], 1 + ) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web1_vol"]) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web2_vol"]) + self.run_subprocess_assert_returncode([ + "podman", + "image", + "exists", + "podman-compose-up-down-test", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "image", + "exists", + "docker.io/library/debian:up-down-test", + ]) + + def test_down_with_volumes(self): + down_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + os.path.join(test_path(), "up_down", "docker-compose.yml"), + "down", + "--volumes", + "--timeout", + "0", + ] + + try: + self.run_subprocess_assert_returncode(self.up_cmd) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web1_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web2_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web1_vol", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web2_vol", + ]) + finally: + self.run_subprocess_assert_returncode(down_cmd) + + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web1_1"], 1 + ) + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web2_1"], 1 + ) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web1_vol"], 1) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web2_vol"], 1) + self.run_subprocess_assert_returncode([ + "podman", + "image", + "exists", + "podman-compose-up-down-test", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "image", + "exists", + "docker.io/library/debian:up-down-test", + ]) + + def test_down_without_orphans(self): + down_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + os.path.join(test_path(), "up_down", "docker-compose-orphans.yml"), + "down", + "--volumes", + "--timeout", + "0", + ] + + try: + self.run_subprocess_assert_returncode(self.up_cmd) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web1_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web2_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web1_vol", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web2_vol", + ]) + finally: + self.run_subprocess_assert_returncode(down_cmd) + + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web1_1"], 1 + ) + self.run_subprocess_assert_returncode(["podman", "container", "exists", "up_down_web2_1"]) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web1_vol"], 1) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web2_vol"]) + self.run_subprocess_assert_returncode([ + "podman", + "image", + "exists", + "podman-compose-up-down-test", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "image", + "exists", + "docker.io/library/debian:up-down-test", + ]) + + # Cleanup orphaned container + down_all_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + os.path.join(test_path(), "up_down", "docker-compose.yml"), + "down", + "--volumes", + "--timeout", + "0", + ] + self.run_subprocess_assert_returncode(down_all_cmd) + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web2_1"], 1 + ) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web2_vol"], 1) + + def test_down_with_orphans(self): + down_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + os.path.join(test_path(), "up_down", "docker-compose-orphans.yml"), + "down", + "--volumes", + "--remove-orphans", + "--timeout", + "0", + ] + + try: + self.run_subprocess_assert_returncode(self.up_cmd) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web1_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web2_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web1_vol", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web2_vol", + ]) + finally: + self.run_subprocess_assert_returncode(down_cmd) + + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web1_1"], 1 + ) + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web2_1"], 1 + ) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web1_vol"], 1) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web2_vol"], 1) + self.run_subprocess_assert_returncode([ + "podman", + "image", + "exists", + "podman-compose-up-down-test", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "image", + "exists", + "docker.io/library/debian:up-down-test", + ]) + + def test_down_with_images_default(self): + down_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + os.path.join(test_path(), "up_down", "docker-compose.yml"), + "down", + "--rmi", + "--timeout", + "0", + ] + + try: + self.run_subprocess_assert_returncode(self.up_cmd) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web1_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web2_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web1_vol", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web2_vol", + ]) + finally: + self.run_subprocess_assert_returncode(down_cmd) + + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web1_1"], 1 + ) + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web2_1"], 1 + ) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web1_vol"]) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web2_vol"]) + self.run_subprocess_assert_returncode( + ["podman", "image", "exists", "podman-compose-up-down-test"], 1 + ) + self.run_subprocess_assert_returncode( + ["podman", "image", "exists", "docker.io/library/debian:up-down-test"], 1 + ) + + def test_down_with_images_all(self): + down_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + os.path.join(test_path(), "up_down", "docker-compose.yml"), + "down", + "--rmi", + "all", + "--timeout", + "0", + ] + + try: + self.run_subprocess_assert_returncode(self.up_cmd) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web1_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web2_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web1_vol", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web2_vol", + ]) + finally: + self.run_subprocess_assert_returncode(down_cmd) + + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web1_1"], 1 + ) + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web2_1"], 1 + ) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web1_vol"]) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web2_vol"]) + self.run_subprocess_assert_returncode( + ["podman", "image", "exists", "podman-compose-up-down-test"], 1 + ) + self.run_subprocess_assert_returncode( + ["podman", "image", "exists", "docker.io/library/debian:up-down-test"], 1 + ) + + def test_down_with_images_all_and_orphans(self): + down_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + os.path.join(test_path(), "up_down", "docker-compose-orphans.yml"), + "down", + "--volumes", + "--remove-orphans", + "--rmi", + "all", + "--timeout", + "0", + ] + + try: + self.run_subprocess_assert_returncode(self.up_cmd) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web1_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web2_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web1_vol", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web2_vol", + ]) + finally: + self.run_subprocess_assert_returncode(down_cmd) + + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web1_1"], 1 + ) + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web2_1"], 1 + ) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web1_vol"], 1) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web2_vol"], 1) + self.run_subprocess_assert_returncode( + ["podman", "image", "exists", "podman-compose-up-down-test"], 1 + ) + self.run_subprocess_assert_returncode( + ["podman", "image", "exists", "docker.io/library/debian:up-down-test"], 1 + ) + + def test_down_with_images_local(self): + down_cmd = [ + "coverage", + "run", + podman_compose_path(), + "-f", + os.path.join(test_path(), "up_down", "docker-compose.yml"), + "down", + "--rmi", + "local", + "--timeout", + "0", + ] + + try: + self.run_subprocess_assert_returncode(self.up_cmd) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web1_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "container", + "exists", + "up_down_web2_1", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web1_vol", + ]) + self.run_subprocess_assert_returncode([ + "podman", + "volume", + "exists", + "up_down_web2_vol", + ]) + finally: + self.run_subprocess_assert_returncode(down_cmd) + + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web1_1"], 1 + ) + self.run_subprocess_assert_returncode( + ["podman", "container", "exists", "up_down_web2_1"], 1 + ) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web1_vol"]) + self.run_subprocess_assert_returncode(["podman", "volume", "exists", "up_down_web2_vol"]) + self.run_subprocess_assert_returncode( + ["podman", "image", "exists", "podman-compose-up-down-test"], 1 + ) + self.run_subprocess_assert_returncode([ + "podman", + "image", + "exists", + "docker.io/library/debian:up-down-test", + ])