Files
supervisor/tests/dbus/network/test_ip_configuration.py
David Rapan d5b5a328d7 feat: Add opt-in IPv6 for containers (#5879)
Configurable and w/ migrations between IPv4-Only and Dual-Stack

Signed-off-by: David Rapan <david@rapan.cz>
Co-authored-by: Stefan Agner <stefan@agner.ch>
2025-06-12 11:32:24 +02:00

92 lines
3.1 KiB
Python

"""Test Network Manager IP configuration object."""
from ipaddress import IPv4Address, IPv6Address
from dbus_fast.aio.message_bus import MessageBus
import pytest
from supervisor.dbus.network.ip_configuration import IpConfiguration
from tests.common import mock_dbus_services
from tests.dbus_service_mocks.network_ip4config import IP4Config as IP4ConfigService
from tests.dbus_service_mocks.network_ip6config import IP6Config as IP6ConfigService
@pytest.fixture(name="ip4config_service")
async def fixture_ip4config_service(dbus_session_bus: MessageBus) -> IP4ConfigService:
"""Mock IP4Config service."""
yield (await mock_dbus_services({"network_ip4config": None}, dbus_session_bus))[
"network_ip4config"
]
@pytest.fixture(name="ip6config_service")
async def fixture_ip6config_service(dbus_session_bus: MessageBus) -> IP4ConfigService:
"""Mock IP6Config service."""
yield (await mock_dbus_services({"network_ip6config": None}, dbus_session_bus))[
"network_ip6config"
]
async def test_ipv4_configuration(
ip4config_service: IP4ConfigService, dbus_session_bus: MessageBus
):
"""Test IPv4 configuration object."""
ip4 = IpConfiguration("/org/freedesktop/NetworkManager/IP4Config/1")
assert ip4.gateway is None
assert ip4.nameservers is None
await ip4.connect(dbus_session_bus)
assert ip4.gateway == IPv4Address("192.168.2.1")
assert ip4.nameservers == [IPv4Address("192.168.2.2")]
ip4config_service.emit_properties_changed({"Gateway": "192.168.100.1"})
await ip4config_service.ping()
assert ip4.gateway == IPv4Address("192.168.100.1")
ip4config_service.emit_properties_changed({}, ["Gateway"])
await ip4config_service.ping()
await ip4config_service.ping()
assert ip4.gateway == IPv4Address("192.168.2.1")
async def test_ipv6_configuration(
ip6config_service: IP6ConfigService, dbus_session_bus: MessageBus
):
"""Test IPv6 configuration object."""
ip6 = IpConfiguration("/org/freedesktop/NetworkManager/IP6Config/1", ip4=False)
assert ip6.gateway is None
assert ip6.nameservers is None
await ip6.connect(dbus_session_bus)
assert ip6.gateway == IPv6Address("fe80::da58:d7ff:fe00:9c69")
assert ip6.nameservers == [
IPv6Address("2001:1620:2777:1::10"),
IPv6Address("2001:1620:2777:2::20"),
]
ip6config_service.emit_properties_changed({"Gateway": "2001:1620:2777:1::10"})
await ip6config_service.ping()
assert ip6.gateway == IPv6Address("2001:1620:2777:1::10")
ip6config_service.emit_properties_changed({}, ["Gateway"])
await ip6config_service.ping()
await ip6config_service.ping()
assert ip6.gateway == IPv6Address("fe80::da58:d7ff:fe00:9c69")
async def test_gateway_empty_string(
ip4config_service: IP4ConfigService, dbus_session_bus: MessageBus
):
"""Test empty string in gateway returns None."""
ip4 = IpConfiguration("/org/freedesktop/NetworkManager/IP4Config/1", ip4=True)
await ip4.connect(dbus_session_bus)
ip4config_service.emit_properties_changed({"Gateway": ""})
await ip4config_service.ping()
assert ip4.gateway is None