diff --git a/tests/docker/dirty_ttin_ttou/Dockerfile b/tests/docker/dirty_ttin_ttou/Dockerfile index 7d6c66ae..0c6cd837 100644 --- a/tests/docker/dirty_ttin_ttou/Dockerfile +++ b/tests/docker/dirty_ttin_ttou/Dockerfile @@ -6,9 +6,11 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ WORKDIR /app -# Install gunicorn from source +# Install gunicorn from source. setproctitle is required so dirty-arbiter +# and dirty-worker processes get distinguishable names that the tests use +# to count workers via pgrep. COPY . /gunicorn-src/ -RUN pip install --no-cache-dir /gunicorn-src/ +RUN pip install --no-cache-dir /gunicorn-src/ setproctitle # Copy test app COPY tests/docker/dirty_ttin_ttou/app.py /app/ diff --git a/tests/docker/dirty_ttin_ttou/test_ttin_ttou_docker.py b/tests/docker/dirty_ttin_ttou/test_ttin_ttou_docker.py index ca72c26d..9efcffff 100644 --- a/tests/docker/dirty_ttin_ttou/test_ttin_ttou_docker.py +++ b/tests/docker/dirty_ttin_ttou/test_ttin_ttou_docker.py @@ -21,7 +21,10 @@ pytestmark = [ # Directory containing this test file TEST_DIR = Path(__file__).parent COMPOSE_FILE = TEST_DIR / "docker-compose.yml" -BASE_URL = "http://localhost:18000" +# Use 127.0.0.1 (not "localhost") so we always hit IPv4. Docker Desktop / +# OrbStack on macOS map host ports to IPv4 only, and ``localhost`` resolves +# to ``::1`` on this host, which yields connection-reset noise. +BASE_URL = "http://127.0.0.1:18000" @pytest.fixture(scope="module") diff --git a/tests/docker/per_app_allocation/README.md b/tests/docker/per_app_allocation/README.md index bae552d7..91535227 100644 --- a/tests/docker/per_app_allocation/README.md +++ b/tests/docker/per_app_allocation/README.md @@ -58,5 +58,5 @@ pytest test_per_app_e2e.py::TestPerAppAllocation::test_config_limited_app_uses_o ## Notes -- Tests run on port 8001 to avoid conflicts with the existing dirty_arbiter tests on 8000 +- Tests run on port 28001 to avoid conflicts with the existing dirty_arbiter tests on 8000 and with macOS Docker alternatives that often reserve port 8001 (e.g., OrbStack's vcom-tunnel) - The container uses a keep-alive wrapper to allow testing worker crash scenarios diff --git a/tests/docker/per_app_allocation/docker-compose.yml b/tests/docker/per_app_allocation/docker-compose.yml index 19aaf7c8..a389cd0b 100644 --- a/tests/docker/per_app_allocation/docker-compose.yml +++ b/tests/docker/per_app_allocation/docker-compose.yml @@ -4,7 +4,7 @@ services: context: ../../.. dockerfile: tests/docker/per_app_allocation/Dockerfile ports: - - "8001:8000" + - "28001:8000" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/status"] interval: 1s diff --git a/tests/docker/per_app_allocation/test_per_app_e2e.py b/tests/docker/per_app_allocation/test_per_app_e2e.py index 1abcb1b3..e1c34472 100644 --- a/tests/docker/per_app_allocation/test_per_app_e2e.py +++ b/tests/docker/per_app_allocation/test_per_app_e2e.py @@ -39,7 +39,7 @@ class DockerContainer: self.name = name self.build = build self.container_id = None - self.base_url = "http://127.0.0.1:8001" + self.base_url = "http://127.0.0.1:28001" def __enter__(self): # Build if requested @@ -64,7 +64,7 @@ class DockerContainer: [ "docker", "run", "-d", "--name", self.name, - "-p", "8001:8000", + "-p", "28001:8000", "per_app_allocation-gunicorn", "sh", "-c", "gunicorn app:application -c gunicorn_conf.py & "