From 1ce0c13fc9407487d09a3c4c5b3efa43e426d469 Mon Sep 17 00:00:00 2001 From: grossmj Date: Fri, 18 Aug 2023 12:20:54 +1000 Subject: [PATCH] Better mocking in Docker tests --- tests/compute/docker/test_docker.py | 16 ++++----- tests/compute/docker/test_docker_vm.py | 46 +++++++++++++++----------- 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/tests/compute/docker/test_docker.py b/tests/compute/docker/test_docker.py index 04b144c5..bdae9361 100644 --- a/tests/compute/docker/test_docker.py +++ b/tests/compute/docker/test_docker.py @@ -219,10 +219,10 @@ async def test_install_busybox(): mock_process.returncode = 1 # means that busybox is not dynamically linked mock_process.communicate = AsyncioMagicMock(return_value=(b"", b"not a dynamic executable")) - with patch("os.path.isfile", return_value=False): - with patch("shutil.which", return_value="/usr/bin/busybox"): - with asyncio_patch("asyncio.create_subprocess_exec", return_value=mock_process) as create_subprocess_mock: - with patch("shutil.copy2") as copy2_mock: + with patch("gns3server.compute.docker.os.path.isfile", return_value=False): + with patch("gns3server.compute.docker.shutil.which", return_value="/usr/bin/busybox"): + with asyncio_patch("gns3server.compute.docker.asyncio.create_subprocess_exec", return_value=mock_process) as create_subprocess_mock: + with patch("gns3server.compute.docker.shutil.copy2") as copy2_mock: await Docker.install_busybox() create_subprocess_mock.assert_called_with( "ldd", @@ -241,8 +241,8 @@ async def test_install_busybox_dynamic_linked(): mock_process.communicate = AsyncioMagicMock(return_value=(b"Dynamically linked library", b"")) with patch("os.path.isfile", return_value=False): - with patch("shutil.which", return_value="/usr/bin/busybox"): - with asyncio_patch("asyncio.create_subprocess_exec", return_value=mock_process): + with patch("gns3server.compute.docker.shutil.which", return_value="/usr/bin/busybox"): + with asyncio_patch("gns3server.compute.docker.asyncio.create_subprocess_exec", return_value=mock_process): with pytest.raises(DockerError) as e: await Docker.install_busybox() assert str(e.value) == "No busybox executable could be found" @@ -251,8 +251,8 @@ async def test_install_busybox_dynamic_linked(): @pytest.mark.asyncio async def test_install_busybox_no_executables(): - with patch("os.path.isfile", return_value=False): - with patch("shutil.which", return_value=None): + with patch("gns3server.compute.docker.os.path.isfile", return_value=False): + with patch("gns3server.compute.docker.shutil.which", return_value=None): with pytest.raises(DockerError) as e: await Docker.install_busybox() assert str(e.value) == "No busybox executable could be found" diff --git a/tests/compute/docker/test_docker_vm.py b/tests/compute/docker/test_docker_vm.py index cf0c63c2..273b119b 100644 --- a/tests/compute/docker/test_docker_vm.py +++ b/tests/compute/docker/test_docker_vm.py @@ -21,6 +21,8 @@ import pytest import pytest_asyncio import uuid import os + +from unittest.mock import patch from tests.utils import asyncio_patch, AsyncioMagicMock from gns3server.compute.ubridge.ubridge_error import UbridgeNamespaceError @@ -1072,8 +1074,9 @@ async def test_start(vm, manager, free_console_port): nio = manager.create_nio({"type": "nio_udp", "lport": free_console_port, "rport": free_console_port, "rhost": "127.0.0.1"}) await vm.adapter_add_nio_binding(0, nio) - with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: - await vm.start() + with patch("gns3server.compute.docker.Docker.install_busybox"): + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: + await vm.start() mock_query.assert_called_with("POST", "containers/e90e34656842/start") vm._add_ubridge_connection.assert_called_once_with(nio, 0) @@ -1092,15 +1095,16 @@ async def test_start_namespace_failed(vm, manager, free_console_port): nio = manager.create_nio({"type": "nio_udp", "lport": free_console_port, "rport": free_console_port, "rhost": "127.0.0.1"}) await vm.adapter_add_nio_binding(0, nio) - with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="stopped"): - with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: - with asyncio_patch("gns3server.compute.docker.DockerVM._start_ubridge") as mock_start_ubridge: - with asyncio_patch("gns3server.compute.docker.DockerVM._get_namespace", return_value=42) as mock_namespace: - with asyncio_patch("gns3server.compute.docker.DockerVM._add_ubridge_connection", side_effect=UbridgeNamespaceError()) as mock_add_ubridge_connection: - with asyncio_patch("gns3server.compute.docker.DockerVM._get_log", return_value='Hello not available') as mock_log: + with patch("gns3server.compute.docker.Docker.install_busybox"): + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="stopped"): + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: + with asyncio_patch("gns3server.compute.docker.DockerVM._start_ubridge") as mock_start_ubridge: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_namespace", return_value=42) as mock_namespace: + with asyncio_patch("gns3server.compute.docker.DockerVM._add_ubridge_connection", side_effect=UbridgeNamespaceError()) as mock_add_ubridge_connection: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_log", return_value='Hello not available') as mock_log: - with pytest.raises(DockerError): - await vm.start() + with pytest.raises(DockerError): + await vm.start() mock_query.assert_any_call("POST", "containers/e90e34656842/start") mock_add_ubridge_connection.assert_called_once_with(nio, 0) @@ -1117,13 +1121,14 @@ async def test_start_without_nio(vm): assert vm.status != "started" vm.adapters = 1 - with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="stopped"): - with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: - with asyncio_patch("gns3server.compute.docker.DockerVM._start_ubridge") as mock_start_ubridge: - with asyncio_patch("gns3server.compute.docker.DockerVM._get_namespace", return_value=42): - with asyncio_patch("gns3server.compute.docker.DockerVM._add_ubridge_connection") as mock_add_ubridge_connection: - with asyncio_patch("gns3server.compute.docker.DockerVM._start_console") as mock_start_console: - await vm.start() + with patch("gns3server.compute.docker.Docker.install_busybox"): + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="stopped"): + with asyncio_patch("gns3server.compute.docker.Docker.query") as mock_query: + with asyncio_patch("gns3server.compute.docker.DockerVM._start_ubridge") as mock_start_ubridge: + with asyncio_patch("gns3server.compute.docker.DockerVM._get_namespace", return_value=42): + with asyncio_patch("gns3server.compute.docker.DockerVM._add_ubridge_connection") as mock_add_ubridge_connection: + with asyncio_patch("gns3server.compute.docker.DockerVM._start_console") as mock_start_console: + await vm.start() mock_query.assert_called_with("POST", "containers/e90e34656842/start") assert mock_add_ubridge_connection.called @@ -1135,9 +1140,10 @@ async def test_start_without_nio(vm): @pytest.mark.asyncio async def test_start_unpause(vm): - with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="paused"): - with asyncio_patch("gns3server.compute.docker.DockerVM.unpause", return_value="paused") as mock: - await vm.start() + with patch("gns3server.compute.docker.Docker.install_busybox"): + with asyncio_patch("gns3server.compute.docker.DockerVM._get_container_state", return_value="paused"): + with asyncio_patch("gns3server.compute.docker.DockerVM.unpause", return_value="paused") as mock: + await vm.start() assert mock.called assert vm.status == "started"