diff --git a/test/compose.base.yml b/test/compose.base.yml index e1905fd..36e804b 100644 --- a/test/compose.base.yml +++ b/test/compose.base.yml @@ -4,3 +4,6 @@ services: container_name: nginx-proxy volumes: - /var/run/docker.sock:/tmp/docker.sock:ro + ports: + - "80:80" + - "443:443" diff --git a/test/conftest.py b/test/conftest.py index 534fa8a..1d69a66 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -2,6 +2,7 @@ import contextlib import logging import os import pathlib +import platform import re import shlex import socket @@ -219,8 +220,8 @@ def nginx_proxy_dns_resolver(domain_name: str) -> Optional[str]: def docker_container_dns_resolver(domain_name: str) -> Optional[str]: """ - if domain name is of the form "XXX.container.docker" or "anything.XXX.container.docker", return the ip address of the docker container - named XXX. + if domain name is of the form "XXX.container.docker" or "anything.XXX.container.docker", + return the ip address of the docker container named XXX. :return: IP or None """ @@ -250,7 +251,10 @@ def monkey_patch_urllib_dns_resolver(): """ Alter the behavior of the urllib DNS resolver so that any domain name containing substring 'nginx-proxy' will resolve to the IP address - of the container created from image 'nginxproxy/nginx-proxy:test'. + of the container created from image 'nginxproxy/nginx-proxy:test', + or to 127.0.0.1 on Darwin. + + see https://docs.docker.com/desktop/features/networking/#i-want-to-connect-to-a-container-from-the-host """ prv_getaddrinfo = socket.getaddrinfo dns_cache = {} @@ -264,7 +268,12 @@ def monkey_patch_urllib_dns_resolver(): pytest.skip("This system does not support IPv6") # custom DNS resolvers - ip = nginx_proxy_dns_resolver(args[0]) + ip = None + # Docker Desktop can't route traffic directly to Linux containers. + if platform.system() == "Darwin": + ip = "127.0.0.1" + if ip is None: + ip = nginx_proxy_dns_resolver(args[0]) if ip is None: ip = docker_container_dns_resolver(args[0]) if ip is not None: diff --git a/test/test_dockergen/test_dockergen.base.yml b/test/test_dockergen/test_dockergen.base.yml index 2762a35..69f6c85 100644 --- a/test/test_dockergen/test_dockergen.base.yml +++ b/test/test_dockergen/test_dockergen.base.yml @@ -8,6 +8,9 @@ services: container_name: nginx volumes: - nginx_conf:/etc/nginx/conf.d:ro + ports: + - "80:80" + - "443:443" nginx-proxy-dockergen: image: nginxproxy/docker-gen diff --git a/test/test_fallback/test_fallback.data/compose.base.yml b/test/test_fallback/test_fallback.data/compose.base.yml index e1905fd..36e804b 100644 --- a/test/test_fallback/test_fallback.data/compose.base.yml +++ b/test/test_fallback/test_fallback.data/compose.base.yml @@ -4,3 +4,6 @@ services: container_name: nginx-proxy volumes: - /var/run/docker.sock:/tmp/docker.sock:ro + ports: + - "80:80" + - "443:443" diff --git a/test/test_host-network-mode/test_proxy-host-network-mode.py b/test/test_host-network-mode/test_proxy-host-network-mode.py index 0c8bf65..fd7208e 100644 --- a/test/test_host-network-mode/test_proxy-host-network-mode.py +++ b/test/test_host-network-mode/test_proxy-host-network-mode.py @@ -1,3 +1,6 @@ +# Note: on Docker Desktop, host networking must be manually enabled. +# See https://docs.docker.com/engine/network/drivers/host/ + def test_forwards_to_host_network_container_1(docker_compose, nginxproxy): r = nginxproxy.get("http://host-network-1.nginx-proxy.tld:8888/port") assert r.status_code == 200 diff --git a/test/test_http-port/test_http-port.yml b/test/test_http-port/test_http-port.yml index d2e9cf8..f1203ee 100644 --- a/test/test_http-port/test_http-port.yml +++ b/test/test_http-port/test_http-port.yml @@ -2,6 +2,8 @@ services: nginx-proxy: environment: HTTP_PORT: 8080 + ports: + - "8080:8080" web1: image: web diff --git a/test/test_ipv6/test_ipv6.py b/test/test_ipv6/test_ipv6.py index 3cfd2b2..6ef8fb2 100644 --- a/test/test_ipv6/test_ipv6.py +++ b/test/test_ipv6/test_ipv6.py @@ -1,3 +1,13 @@ +import platform + +import pytest + +pytestmark = pytest.mark.skipif( + platform.system() == "Darwin", + reason="Those tests rely entirely on being able to directly contact container's IP" +) + + def test_unknown_virtual_host_ipv4(docker_compose, nginxproxy): r = nginxproxy.get("http://nginx-proxy/port") assert r.status_code == 503 diff --git a/test/test_nominal/test_nominal.py b/test/test_nominal/test_nominal.py index a3f9c87..82ac919 100644 --- a/test/test_nominal/test_nominal.py +++ b/test/test_nominal/test_nominal.py @@ -1,3 +1,5 @@ +import platform + import pytest from requests import ConnectionError @@ -19,6 +21,10 @@ def test_forwards_to_web2(docker_compose, nginxproxy): assert r.text == "answer from port 82\n" +@pytest.mark.skipif( + platform.system() == "Darwin", + reason="This test rely on being able to directly contact the container's IP" +) def test_ipv6_is_disabled_by_default(docker_compose, nginxproxy): with pytest.raises(ConnectionError): nginxproxy.get("http://nginx-proxy/port", ipv6=True) diff --git a/test/test_raw-ip-vhost/test_raw-ip-vhost.py b/test/test_raw-ip-vhost/test_raw-ip-vhost.py index 4884402..4708f9a 100644 --- a/test/test_raw-ip-vhost/test_raw-ip-vhost.py +++ b/test/test_raw-ip-vhost/test_raw-ip-vhost.py @@ -1,12 +1,12 @@ def test_raw_ipv4_vhost_forwards_to_web1(docker_compose, nginxproxy): - r = nginxproxy.get("http://172.20.0.4") + r = nginxproxy.get("http://172.20.0.1") assert r.status_code == 200 web1_container = docker_compose.containers.get("web1") assert r.text == f"I'm {web1_container.id[:12]}\n" def test_raw_ipv6_vhost_forwards_to_web2(docker_compose, nginxproxy): - r = nginxproxy.get("http://[fd00::4]", ipv6=True) + r = nginxproxy.get("http://[fd00::1]") assert r.status_code == 200 web2_container = docker_compose.containers.get("web2") assert r.text == f"I'm {web2_container.id[:12]}\n" diff --git a/test/test_raw-ip-vhost/test_raw-ip-vhost.yml b/test/test_raw-ip-vhost/test_raw-ip-vhost.yml index ec51d6b..c0b0b02 100644 --- a/test/test_raw-ip-vhost/test_raw-ip-vhost.yml +++ b/test/test_raw-ip-vhost/test_raw-ip-vhost.yml @@ -22,7 +22,7 @@ services: - "81" environment: WEB_PORTS: "81" - VIRTUAL_HOST: "172.20.0.4" + VIRTUAL_HOST: "172.20.0.1" networks: net1: ipv4_address: 172.20.0.2 @@ -35,7 +35,7 @@ services: - "82" environment: WEB_PORTS: "82" - VIRTUAL_HOST: "[fd00::4]" + VIRTUAL_HOST: "[fd00::1]" networks: net1: ipv4_address: 172.20.0.3 diff --git a/test/test_ssl/test_dhparam.py b/test/test_ssl/test_dhparam.py index ac78eb1..9c8ee4d 100644 --- a/test/test_ssl/test_dhparam.py +++ b/test/test_ssl/test_dhparam.py @@ -1,3 +1,4 @@ +import platform import re import subprocess @@ -7,6 +8,10 @@ import pytest docker_client = docker.from_env() +pytestmark = pytest.mark.skipif( + platform.system() == "Darwin", + reason="Those tests rely entirely on being able to directly contact container's IP" +) ############################################################################### # diff --git a/test/test_ssl/test_https-port.yml b/test/test_ssl/test_https-port.yml index a37ec51..de07aa7 100644 --- a/test/test_ssl/test_https-port.yml +++ b/test/test_ssl/test_https-port.yml @@ -3,6 +3,9 @@ services: environment: HTTP_PORT: 8080 HTTPS_PORT: 8443 + ports: + - "8080:8080" + - "8443:8443" web1: image: web