Files
NetAlertX/test/docker_tests/conftest.py
2026-01-03 22:15:19 +00:00

100 lines
2.8 KiB
Python

import os
import pathlib
import subprocess
import shutil
import pytest
def _announce(request: pytest.FixtureRequest, message: str) -> None:
reporter = request.config.pluginmanager.get_plugin("terminalreporter")
if reporter: # pragma: no branch - depends on pytest runner
reporter.write_line(message)
else:
print(message)
def _clean_test_mounts(project_root: pathlib.Path) -> None:
"""Clean up the test_mounts directory, handling root-owned files via Docker."""
mounts_dir = project_root / "test_mounts"
if not mounts_dir.exists():
return
# Try python removal first (faster)
try:
shutil.rmtree(mounts_dir)
except PermissionError:
# Fallback to docker for root-owned files
# We mount the parent directory to delete the directory itself
cmd = [
"docker", "run", "--rm",
"-v", f"{project_root}:/work",
"alpine:3.22",
"rm", "-rf", "/work/test_mounts"
]
subprocess.run(
cmd,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
check=False
)
@pytest.fixture(scope="session")
def cleanup_artifacts(request: pytest.FixtureRequest) -> None:
"""Ensure test artifacts are cleaned up before and after the session."""
project_root = pathlib.Path(__file__).resolve().parents[2]
_announce(request, "[docker-tests] Cleaning up previous test artifacts...")
_clean_test_mounts(project_root)
yield
_announce(request, "[docker-tests] Cleaning up test artifacts...")
_clean_test_mounts(project_root)
@pytest.fixture(scope="session", autouse=True)
def build_netalertx_test_image(request: pytest.FixtureRequest, cleanup_artifacts: None) -> None:
"""Build the docker test image before running any docker-based tests."""
image = os.environ.get("NETALERTX_TEST_IMAGE", "netalertx-test")
project_root = pathlib.Path(__file__).resolve().parents[2]
cmd = [
"docker",
"buildx",
"build",
"--load",
"-t",
image,
".",
]
_announce(request, f"[docker-tests] Building test image '{image}' using docker buildx")
env = os.environ.copy()
env.setdefault("DOCKER_BUILDKIT", "1")
result = subprocess.run(
cmd,
cwd=project_root,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
check=False,
env=env,
)
if result.returncode != 0:
_announce(request, f"[docker-tests] docker buildx failed for '{image}'")
pytest.fail(
"Docker buildx failed before running docker tests.\n"
f"Command: {' '.join(cmd)}\n"
f"STDOUT:\n{result.stdout}\n"
f"STDERR:\n{result.stderr}"
)
_announce(request, f"[docker-tests] docker buildx completed for '{image}'")