#! /usr/bin/env avocado-runner-avocado-classless # SPDX-License-Identifier: GPL-2.0-or-later # # Copyright Red Hat # Author: David Gibson """ Test A Simple Socket Transport address.py - Address allocation helpers """ import ipaddress from avocado_classless.test import assert_eq, test # Loopback addresses, for convenience LOOPBACK4 = ipaddress.ip_address('127.0.0.1') LOOPBACK6 = ipaddress.ip_address('::1') # Documentation test networks defined by RFC 5737 TEST_NET_1 = ipaddress.ip_network('192.0.2.0/24') TEST_NET_2 = ipaddress.ip_network('198.51.100.0/24') TEST_NET_3 = ipaddress.ip_network('203.0.113.0/24') # Documentation test network defined by RFC 3849 TEST_NET6 = ipaddress.ip_network('2001:db8::/32') # Some subnets of that for our usage TEST_NET6_TASST_A = ipaddress.ip_network('2001:db8:9a55:aaaa::/64') TEST_NET6_TASST_B = ipaddress.ip_network('2001:db8:9a55:bbbb::/64') TEST_NET6_TASST_C = ipaddress.ip_network('2001:db8:9a55:cccc::/64') class IpiAllocator: # pylint: disable=R0903 """IP address allocator""" DEFAULT_NETS = [TEST_NET_1, TEST_NET6_TASST_A] def __init__(self, *nets): if not nets: nets = self.DEFAULT_NETS self.nets = [ipaddress.ip_network(n) for n in nets] self.hostses = [n.hosts() for n in self.nets] def next_ipis(self): addrs = [next(h) for h in self.hostses] return [ipaddress.ip_interface(f'{a}/{n.prefixlen}') for a, n in zip(addrs, self.nets)] @test def ipa_test(nets=None, count=12): if nets is None: ipa = IpiAllocator() nets = IpiAllocator.DEFAULT_NETS else: ipa = IpiAllocator(*nets) addrsets = [set() for i in range(len(nets))] for i in range(count): addrs = ipa.next_ipis() # Check we got as many addresses as expected assert_eq(len(addrs), len(nets)) for s, a, n in zip(addrsets, addrs, nets): # Check the addresses belong to the right network assert_eq(a.network, ipaddress.ip_network(n)) s.add(a) print(addrsets) # Check the addresses are unique for s in addrsets: assert_eq(len(s), count) @test def ipa_test_custom(): ipa_test(nets=['10.55.0.0/16', '192.168.55.0/24', 'fd00:9a57:a000::/48'])