def testAddressListExclusion(self): a1 = nacaddr.IPv4('1.1.1.0/24') a2 = nacaddr.IPv4('10.0.0.0/24') b1 = nacaddr.IPv4('1.1.1.1/32') b2 = nacaddr.IPv4('10.0.0.25/32') b3 = nacaddr.IPv4('192.168.0.0/16') expected = [ nacaddr.IPv4('1.1.1.0/32'), nacaddr.IPv4('1.1.1.2/31'), nacaddr.IPv4('1.1.1.4/30'), nacaddr.IPv4('1.1.1.8/29'), nacaddr.IPv4('1.1.1.16/28'), nacaddr.IPv4('1.1.1.32/27'), nacaddr.IPv4('1.1.1.64/26'), nacaddr.IPv4('1.1.1.128/25'), nacaddr.IPv4('10.0.0.0/28'), nacaddr.IPv4('10.0.0.16/29'), nacaddr.IPv4('10.0.0.24/32'), nacaddr.IPv4('10.0.0.26/31'), nacaddr.IPv4('10.0.0.28/30'), nacaddr.IPv4('10.0.0.32/27'), nacaddr.IPv4('10.0.0.64/26'), nacaddr.IPv4('10.0.0.128/25') ] self.assertListEqual( nacaddr.AddressListExclude([a1, a2], [b1, b2, b3]), expected) # [1,2,3] + [4,5,6] = [1,2,3,4,5,6]. this is basically the same test as # above but i think it's a little more readable self.assertListEqual( nacaddr.AddressListExclude([a1, a2], [b1, b2, b3]), a1.AddressExclude(b1) + a2.AddressExclude(b2))
def testAddressListExcludeCaseSix(self): # IPv6 does not affect IPv4 superset = [nacaddr.IPv6('0::ffff:0.0.0.0/96')] excludes = [nacaddr.IPv4('0.0.0.0/0')] expected = [nacaddr.IPv6('0::ffff:0.0.0.0/96')] self.assertListEqual(nacaddr.AddressListExclude(superset, excludes), expected)
def testComplexAddressListExcludesion(self): # this is a big fugly test. there was a bug in AddressListExclude # which manifested itself when more than one member of the excludes # list was a part of the same superset token. # # for example, it used to be like so: # excludes = ['1.1.1.1/32', '1.1.1.2/32'] # superset = ['1.1.1.0/30'] # # '1.1.1.0/30'.AddressExclude('1.1.1.1/32') -> # ['1.1.1.0/32', '1.1.1.2/32', '1.1.1.3/32'] # '1.1.1.0/30'.AddressExclude('1.1.1.2/32') -> # ['1.1.1.0/32', '1.1.1.1/32', '1.1.1.3/32'] # # yet combining those two results gives you # ['1.1.1.0/32', '1.1.1.1/32', '1.1.1.2/32' '1.1.1.3/32'], or # '1.1.1.0/30', which clearly isn't right. excludes = [nacaddr.IPv4('10.0.0.0/23'), nacaddr.IPv4('10.1.0.0/16')] superset = [nacaddr.IPv4('0.0.0.0/0')] expected = [nacaddr.IPv4('0.0.0.0/5'), nacaddr.IPv4('8.0.0.0/7'), nacaddr.IPv4('10.0.2.0/23'), nacaddr.IPv4('10.0.4.0/22'), nacaddr.IPv4('10.0.8.0/21'), nacaddr.IPv4('10.0.16.0/20'), nacaddr.IPv4('10.0.32.0/19'), nacaddr.IPv4('10.0.64.0/18'), nacaddr.IPv4('10.0.128.0/17'), nacaddr.IPv4('10.2.0.0/15'), nacaddr.IPv4('10.4.0.0/14'), nacaddr.IPv4('10.8.0.0/13'), nacaddr.IPv4('10.16.0.0/12'), nacaddr.IPv4('10.32.0.0/11'), nacaddr.IPv4('10.64.0.0/10'), nacaddr.IPv4('10.128.0.0/9'), nacaddr.IPv4('11.0.0.0/8'), nacaddr.IPv4('12.0.0.0/6'), nacaddr.IPv4('16.0.0.0/4'), nacaddr.IPv4('32.0.0.0/3'), nacaddr.IPv4('64.0.0.0/2'), nacaddr.IPv4('128.0.0.0/1')] self.assertListEqual(nacaddr.AddressListExclude(superset, excludes), expected)
def testAddressListExcludeCaseOne(self): # Small block eliminated by large block, and an extra block that stays. # For both IP versions. superset = [nacaddr.IPv4('200.0.0.0/24'), nacaddr.IPv4('10.1.0.0/24'), nacaddr.IPv6('200::/56'), nacaddr.IPv6('10:1::/56')] excludes = [nacaddr.IPv6('10::/16'), nacaddr.IPv4('10.0.0.0/8')] expected = [nacaddr.IPv4('200.0.0.0/24'), nacaddr.IPv6('200::/56')] self.assertListEqual(nacaddr.AddressListExclude(superset, excludes), expected)
def testAddressListExcludeCaseThree(self): # Two blocks off both ends of a large block. superset = [nacaddr.IPv4('200.0.0.0/24'), nacaddr.IPv4('10.0.0.0/8'), nacaddr.IPv6('200::/56'), nacaddr.IPv6('10::/16')] excludes = [nacaddr.IPv6('10::/18'), nacaddr.IPv6('10:c000::/18'), nacaddr.IPv4('10.0.0.0/10'), nacaddr.IPv4('10.192.0.0/10')] expected = [nacaddr.IPv4('10.64.0.0/10'), nacaddr.IPv4('10.128.0.0/10'), nacaddr.IPv4('200.0.0.0/24'), nacaddr.IPv6('10:4000::/18'), nacaddr.IPv6('10:8000::/18'), nacaddr.IPv6('200::/56')] self.assertListEqual(nacaddr.AddressListExclude(superset, excludes), expected)