"""Validatie en IP-toewijzing voor macvlan/ipvlan-netwerken.""" import sys from pathlib import Path import pytest sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "server-up")) from core import networks GELDIG = {"name": "lan", "driver": "macvlan", "parent": "eth0", "subnet": "192.168.1.0/24", "gateway": "192.168.1.1", "ip_range": "192.168.1.240/28"} def test_geldige_definitie(): assert networks.validate(GELDIG) == "" @pytest.mark.parametrize("wijziging,fragment", [ ({"name": "../boos"}, "netwerknaam"), ({"name": ""}, "netwerknaam"), ({"driver": "bridge"}, "macvlan"), ({"parent": "eth0; rm -rf /"}, "host-interface"), ({"subnet": "geen-subnet"}, "subnet"), ({"gateway": "10.9.9.1"}, "gateway ligt buiten"), ({"gateway": "nogal-fout"}, "gateway-adres"), ({"ip_range": "10.9.9.0/24"}, "range ligt buiten"), ({"ip_range": "onzin"}, "IP-range"), ]) def test_ongeldige_definities(wijziging, fragment): net = {**GELDIG, **wijziging} assert fragment in networks.validate(net) def test_next_free_ip_respecteert_range_en_gateway(monkeypatch): monkeypatch.setattr(networks, "used_ips", lambda naam: set()) # .240/28 loopt van .240 t/m .255; .240 is het netwerkadres, dus .241 eerst. assert networks.next_free_ip(GELDIG) == "192.168.1.241" def test_next_free_ip_slaat_bezette_adressen_over(monkeypatch): monkeypatch.setattr(networks, "used_ips", lambda naam: {"192.168.1.241", "192.168.1.242"}) assert networks.next_free_ip(GELDIG) == "192.168.1.243" def test_next_free_ip_houdt_rekening_met_reserveringen(monkeypatch): monkeypatch.setattr(networks, "used_ips", lambda naam: set()) assert networks.next_free_ip(GELDIG, {"192.168.1.241"}) == "192.168.1.242" def test_next_free_ip_zonder_range_gebruikt_subnet(monkeypatch): monkeypatch.setattr(networks, "used_ips", lambda naam: set()) net = {**GELDIG, "ip_range": ""} assert networks.next_free_ip(net) == "192.168.1.2" # .1 is de gateway def test_next_free_ip_leeg_als_alles_bezet(monkeypatch): bezet = {f"192.168.1.{i}" for i in range(240, 256)} monkeypatch.setattr(networks, "used_ips", lambda naam: bezet) assert networks.next_free_ip(GELDIG) == "" @pytest.mark.parametrize("ip,verwacht", [ ("192.168.1.240", True), ("192.168.2.1", False), ("geen-ip", False), ]) def test_ip_in_network(ip, verwacht): assert networks.ip_in_network(ip, GELDIG) is verwacht def test_remove_weigert_ongeldige_naam(): ok, msg = networks.remove("../etc") assert ok is False assert "netwerknaam" in msg