import pytest
from motor.engine_server.utils.ip import ip_valid_check, port_valid_check, is_valid_ipv6_address, build_endpoint
class TestIpUtils:
"""Tests for IP utility functions"""
def test_ip_valid_check_valid_ipv4(self):
"""Test ip_valid_check with valid IPv4 addresses"""
valid_ips = [
"127.0.0.1",
"192.168.1.1",
"8.8.8.8",
"10.0.0.1",
"172.16.0.1",
]
for ip in valid_ips:
ip_valid_check(ip)
def test_ip_valid_check_valid_ipv6(self):
"""Test ip_valid_check with valid IPv6 addresses"""
valid_ipv6s = [
"::1",
"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"fe80::1",
"fd00::1",
]
for ipv6 in valid_ipv6s:
ip_valid_check(ipv6)
def test_ip_valid_check_invalid_format(self):
"""Test ip_valid_check with invalid IP formats"""
invalid_ips = [
"not_an_ip",
"256.0.0.1",
"192.168.1.256",
"192.168.1",
"192.168.1.1.1",
"::g::",
"2001:::3",
]
for ip in invalid_ips:
with pytest.raises(ValueError) as excinfo:
ip_valid_check(ip)
assert "parse to ip failed" in str(excinfo.value)
def test_ip_valid_check_all_zeros_ip(self):
"""Test ip_valid_check with all zeros IP addresses"""
all_zeros_ips = [
"0.0.0.0",
"::",
"0000:0000:0000:0000:0000:0000:0000:0000",
]
for ip in all_zeros_ips:
with pytest.raises(ValueError) as excinfo:
ip_valid_check(ip)
assert "is all zeros ip" in str(excinfo.value)
def test_ip_valid_check_multicast_ip(self):
"""Test ip_valid_check with multicast IP addresses"""
multicast_ips = [
"224.0.0.1",
"239.255.255.255",
"ff02::1",
"ff05::1:3",
]
for ip in multicast_ips:
with pytest.raises(ValueError) as excinfo:
ip_valid_check(ip)
assert "is multicast ip" in str(excinfo.value)
def test_port_valid_check_valid_ports(self):
"""Test port_valid_check with valid port numbers"""
valid_ports = [
1024,
8080,
9001,
65535,
]
for port in valid_ports:
port_valid_check(port)
def test_port_valid_check_invalid_ports_below_range(self):
"""Test port_valid_check with ports below 1024"""
invalid_ports = [
0,
1,
80,
443,
1023,
]
for port in invalid_ports:
with pytest.raises(ValueError) as excinfo:
port_valid_check(port)
assert "port must be between 1024 and 65535" in str(excinfo.value)
def test_port_valid_check_invalid_ports_above_range(self):
"""Test port_valid_check with ports above 65535"""
invalid_ports = [
65536,
100000,
2**16,
]
for port in invalid_ports:
with pytest.raises(ValueError) as excinfo:
port_valid_check(port)
assert "port must be between 1024 and 65535" in str(excinfo.value)
def test_is_valid_ipv6_address_valid(self):
"""Test is_valid_ipv6_address with valid IPv6 addresses"""
valid_ipv6s = [
"::1",
"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
"2001:db8:85a3::8a2e:370:7334",
"fe80::1",
"fd00::1",
"0000:0000:0000:0000:0000:0000:0000:0001",
"2001:0db8::1",
"::2001:0db8",
]
for ipv6 in valid_ipv6s:
assert is_valid_ipv6_address(ipv6) is True
def test_is_valid_ipv6_address_invalid(self):
"""Test is_valid_ipv6_address with invalid IPv6 addresses"""
invalid_ipv6s = [
"not_an_ip",
"::g::",
"2001:::3",
"2001:0db8:85a3:0000:0000:8a2e:0370:7334:7335",
"2001:0db8:85a3:0000:0000:8a2e:0370",
"256.0.0.1",
"192.168.1.1",
"",
]
for ipv6 in invalid_ipv6s:
assert is_valid_ipv6_address(ipv6) is False
def test_is_valid_ipv6_address_ipv4(self):
"""Test is_valid_ipv6_address with IPv4 addresses (should return False)"""
ipv4_addresses = [
"127.0.0.1",
"192.168.1.1",
"8.8.8.8",
"0.0.0.0",
]
for ipv4 in ipv4_addresses:
assert is_valid_ipv6_address(ipv4) is False
def test_is_valid_ipv6_address_none(self):
assert is_valid_ipv6_address(None) is False
def test_build_endpoint_ipv4(self):
assert build_endpoint("127.0.0.1", 8080) == "127.0.0.1:8080"
def test_build_endpoint_ipv6(self):
assert build_endpoint("::1", 8080) == "[::1]:8080"
def test_build_endpoint_rejects_empty_ip(self):
with pytest.raises(ValueError, match="ip must not be empty"):
build_endpoint(None, 8080)
with pytest.raises(ValueError, match="ip must not be empty"):
build_endpoint("", 8080)