17db96d56Sopenharmony_ci# Copyright 2007 Google Inc. 27db96d56Sopenharmony_ci# Licensed to PSF under a Contributor Agreement. 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci"""Unittest for ipaddress module.""" 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ciimport unittest 87db96d56Sopenharmony_ciimport re 97db96d56Sopenharmony_ciimport contextlib 107db96d56Sopenharmony_ciimport operator 117db96d56Sopenharmony_ciimport pickle 127db96d56Sopenharmony_ciimport ipaddress 137db96d56Sopenharmony_ciimport weakref 147db96d56Sopenharmony_cifrom test.support import LARGEST, SMALLEST 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci 177db96d56Sopenharmony_ciclass BaseTestCase(unittest.TestCase): 187db96d56Sopenharmony_ci # One big change in ipaddress over the original ipaddr module is 197db96d56Sopenharmony_ci # error reporting that tries to assume users *don't know the rules* 207db96d56Sopenharmony_ci # for what constitutes an RFC compliant IP address 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci # Ensuring these errors are emitted correctly in all relevant cases 237db96d56Sopenharmony_ci # meant moving to a more systematic test structure that allows the 247db96d56Sopenharmony_ci # test structure to map more directly to the module structure 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci # Note that if the constructors are refactored so that addresses with 277db96d56Sopenharmony_ci # multiple problems get classified differently, that's OK - just 287db96d56Sopenharmony_ci # move the affected examples to the newly appropriate test case. 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ci # There is some duplication between the original relatively ad hoc 317db96d56Sopenharmony_ci # test suite and the new systematic tests. While some redundancy in 327db96d56Sopenharmony_ci # testing is considered preferable to accidentally deleting a valid 337db96d56Sopenharmony_ci # test, the original test suite will likely be reduced over time as 347db96d56Sopenharmony_ci # redundant tests are identified. 357db96d56Sopenharmony_ci 367db96d56Sopenharmony_ci @property 377db96d56Sopenharmony_ci def factory(self): 387db96d56Sopenharmony_ci raise NotImplementedError 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci @contextlib.contextmanager 417db96d56Sopenharmony_ci def assertCleanError(self, exc_type, details, *args): 427db96d56Sopenharmony_ci """ 437db96d56Sopenharmony_ci Ensure exception does not display a context by default 447db96d56Sopenharmony_ci 457db96d56Sopenharmony_ci Wraps unittest.TestCase.assertRaisesRegex 467db96d56Sopenharmony_ci """ 477db96d56Sopenharmony_ci if args: 487db96d56Sopenharmony_ci details = details % args 497db96d56Sopenharmony_ci cm = self.assertRaisesRegex(exc_type, details) 507db96d56Sopenharmony_ci with cm as exc: 517db96d56Sopenharmony_ci yield exc 527db96d56Sopenharmony_ci # Ensure we produce clean tracebacks on failure 537db96d56Sopenharmony_ci if exc.exception.__context__ is not None: 547db96d56Sopenharmony_ci self.assertTrue(exc.exception.__suppress_context__) 557db96d56Sopenharmony_ci 567db96d56Sopenharmony_ci def assertAddressError(self, details, *args): 577db96d56Sopenharmony_ci """Ensure a clean AddressValueError""" 587db96d56Sopenharmony_ci return self.assertCleanError(ipaddress.AddressValueError, 597db96d56Sopenharmony_ci details, *args) 607db96d56Sopenharmony_ci 617db96d56Sopenharmony_ci def assertNetmaskError(self, details, *args): 627db96d56Sopenharmony_ci """Ensure a clean NetmaskValueError""" 637db96d56Sopenharmony_ci return self.assertCleanError(ipaddress.NetmaskValueError, 647db96d56Sopenharmony_ci details, *args) 657db96d56Sopenharmony_ci 667db96d56Sopenharmony_ci def assertInstancesEqual(self, lhs, rhs): 677db96d56Sopenharmony_ci """Check constructor arguments produce equivalent instances""" 687db96d56Sopenharmony_ci self.assertEqual(self.factory(lhs), self.factory(rhs)) 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ciclass CommonTestMixin: 727db96d56Sopenharmony_ci 737db96d56Sopenharmony_ci def test_empty_address(self): 747db96d56Sopenharmony_ci with self.assertAddressError("Address cannot be empty"): 757db96d56Sopenharmony_ci self.factory("") 767db96d56Sopenharmony_ci 777db96d56Sopenharmony_ci def test_floats_rejected(self): 787db96d56Sopenharmony_ci with self.assertAddressError(re.escape(repr("1.0"))): 797db96d56Sopenharmony_ci self.factory(1.0) 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci def test_not_an_index_issue15559(self): 827db96d56Sopenharmony_ci # Implementing __index__ makes for a very nasty interaction with the 837db96d56Sopenharmony_ci # bytes constructor. Thus, we disallow implicit use as an integer 847db96d56Sopenharmony_ci self.assertRaises(TypeError, operator.index, self.factory(1)) 857db96d56Sopenharmony_ci self.assertRaises(TypeError, hex, self.factory(1)) 867db96d56Sopenharmony_ci self.assertRaises(TypeError, bytes, self.factory(1)) 877db96d56Sopenharmony_ci 887db96d56Sopenharmony_ci def pickle_test(self, addr): 897db96d56Sopenharmony_ci for proto in range(pickle.HIGHEST_PROTOCOL + 1): 907db96d56Sopenharmony_ci with self.subTest(proto=proto): 917db96d56Sopenharmony_ci x = self.factory(addr) 927db96d56Sopenharmony_ci y = pickle.loads(pickle.dumps(x, proto)) 937db96d56Sopenharmony_ci self.assertEqual(y, x) 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_ciclass CommonTestMixin_v4(CommonTestMixin): 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci def test_leading_zeros(self): 997db96d56Sopenharmony_ci # bpo-36384: no leading zeros to avoid ambiguity with octal notation 1007db96d56Sopenharmony_ci msg = "Leading zeros are not permitted in '\\d+'" 1017db96d56Sopenharmony_ci addresses = [ 1027db96d56Sopenharmony_ci "000.000.000.000", 1037db96d56Sopenharmony_ci "192.168.000.001", 1047db96d56Sopenharmony_ci "016.016.016.016", 1057db96d56Sopenharmony_ci "001.000.008.016", 1067db96d56Sopenharmony_ci "01.2.3.40", 1077db96d56Sopenharmony_ci "1.02.3.40", 1087db96d56Sopenharmony_ci "1.2.03.40", 1097db96d56Sopenharmony_ci "1.2.3.040", 1107db96d56Sopenharmony_ci ] 1117db96d56Sopenharmony_ci for address in addresses: 1127db96d56Sopenharmony_ci with self.subTest(address=address): 1137db96d56Sopenharmony_ci with self.assertAddressError(msg): 1147db96d56Sopenharmony_ci self.factory(address) 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci def test_int(self): 1177db96d56Sopenharmony_ci self.assertInstancesEqual(0, "0.0.0.0") 1187db96d56Sopenharmony_ci self.assertInstancesEqual(3232235521, "192.168.0.1") 1197db96d56Sopenharmony_ci 1207db96d56Sopenharmony_ci def test_packed(self): 1217db96d56Sopenharmony_ci self.assertInstancesEqual(bytes.fromhex("00000000"), "0.0.0.0") 1227db96d56Sopenharmony_ci self.assertInstancesEqual(bytes.fromhex("c0a80001"), "192.168.0.1") 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci def test_negative_ints_rejected(self): 1257db96d56Sopenharmony_ci msg = "-1 (< 0) is not permitted as an IPv4 address" 1267db96d56Sopenharmony_ci with self.assertAddressError(re.escape(msg)): 1277db96d56Sopenharmony_ci self.factory(-1) 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci def test_large_ints_rejected(self): 1307db96d56Sopenharmony_ci msg = "%d (>= 2**32) is not permitted as an IPv4 address" 1317db96d56Sopenharmony_ci with self.assertAddressError(re.escape(msg % 2**32)): 1327db96d56Sopenharmony_ci self.factory(2**32) 1337db96d56Sopenharmony_ci 1347db96d56Sopenharmony_ci def test_bad_packed_length(self): 1357db96d56Sopenharmony_ci def assertBadLength(length): 1367db96d56Sopenharmony_ci addr = b'\0' * length 1377db96d56Sopenharmony_ci msg = "%r (len %d != 4) is not permitted as an IPv4 address" 1387db96d56Sopenharmony_ci with self.assertAddressError(re.escape(msg % (addr, length))): 1397db96d56Sopenharmony_ci self.factory(addr) 1407db96d56Sopenharmony_ci 1417db96d56Sopenharmony_ci assertBadLength(3) 1427db96d56Sopenharmony_ci assertBadLength(5) 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci 1457db96d56Sopenharmony_ciclass CommonTestMixin_v6(CommonTestMixin): 1467db96d56Sopenharmony_ci 1477db96d56Sopenharmony_ci def test_leading_zeros(self): 1487db96d56Sopenharmony_ci self.assertInstancesEqual("0000::0000", "::") 1497db96d56Sopenharmony_ci self.assertInstancesEqual("000::c0a8:0001", "::c0a8:1") 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ci def test_int(self): 1527db96d56Sopenharmony_ci self.assertInstancesEqual(0, "::") 1537db96d56Sopenharmony_ci self.assertInstancesEqual(3232235521, "::c0a8:1") 1547db96d56Sopenharmony_ci 1557db96d56Sopenharmony_ci def test_packed(self): 1567db96d56Sopenharmony_ci addr = b'\0'*12 + bytes.fromhex("00000000") 1577db96d56Sopenharmony_ci self.assertInstancesEqual(addr, "::") 1587db96d56Sopenharmony_ci addr = b'\0'*12 + bytes.fromhex("c0a80001") 1597db96d56Sopenharmony_ci self.assertInstancesEqual(addr, "::c0a8:1") 1607db96d56Sopenharmony_ci addr = bytes.fromhex("c0a80001") + b'\0'*12 1617db96d56Sopenharmony_ci self.assertInstancesEqual(addr, "c0a8:1::") 1627db96d56Sopenharmony_ci 1637db96d56Sopenharmony_ci def test_negative_ints_rejected(self): 1647db96d56Sopenharmony_ci msg = "-1 (< 0) is not permitted as an IPv6 address" 1657db96d56Sopenharmony_ci with self.assertAddressError(re.escape(msg)): 1667db96d56Sopenharmony_ci self.factory(-1) 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci def test_large_ints_rejected(self): 1697db96d56Sopenharmony_ci msg = "%d (>= 2**128) is not permitted as an IPv6 address" 1707db96d56Sopenharmony_ci with self.assertAddressError(re.escape(msg % 2**128)): 1717db96d56Sopenharmony_ci self.factory(2**128) 1727db96d56Sopenharmony_ci 1737db96d56Sopenharmony_ci def test_bad_packed_length(self): 1747db96d56Sopenharmony_ci def assertBadLength(length): 1757db96d56Sopenharmony_ci addr = b'\0' * length 1767db96d56Sopenharmony_ci msg = "%r (len %d != 16) is not permitted as an IPv6 address" 1777db96d56Sopenharmony_ci with self.assertAddressError(re.escape(msg % (addr, length))): 1787db96d56Sopenharmony_ci self.factory(addr) 1797db96d56Sopenharmony_ci self.factory(addr) 1807db96d56Sopenharmony_ci 1817db96d56Sopenharmony_ci assertBadLength(15) 1827db96d56Sopenharmony_ci assertBadLength(17) 1837db96d56Sopenharmony_ci 1847db96d56Sopenharmony_ci def test_blank_scope_id(self): 1857db96d56Sopenharmony_ci address = ('::1%') 1867db96d56Sopenharmony_ci with self.assertAddressError('Invalid IPv6 address: "%r"', address): 1877db96d56Sopenharmony_ci self.factory(address) 1887db96d56Sopenharmony_ci 1897db96d56Sopenharmony_ci def test_invalid_scope_id_with_percent(self): 1907db96d56Sopenharmony_ci address = ('::1%scope%') 1917db96d56Sopenharmony_ci with self.assertAddressError('Invalid IPv6 address: "%r"', address): 1927db96d56Sopenharmony_ci self.factory(address) 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ciclass AddressTestCase_v4(BaseTestCase, CommonTestMixin_v4): 1957db96d56Sopenharmony_ci factory = ipaddress.IPv4Address 1967db96d56Sopenharmony_ci 1977db96d56Sopenharmony_ci def test_format(self): 1987db96d56Sopenharmony_ci v4 = ipaddress.IPv4Address("1.2.3.42") 1997db96d56Sopenharmony_ci v4_pairs = [ 2007db96d56Sopenharmony_ci ("b" ,"00000001000000100000001100101010"), 2017db96d56Sopenharmony_ci ("n" ,"00000001000000100000001100101010"), 2027db96d56Sopenharmony_ci ("x" ,"0102032a"), 2037db96d56Sopenharmony_ci ("X" ,"0102032A"), 2047db96d56Sopenharmony_ci ("_b" ,"0000_0001_0000_0010_0000_0011_0010_1010"), 2057db96d56Sopenharmony_ci ("_n" ,"0000_0001_0000_0010_0000_0011_0010_1010"), 2067db96d56Sopenharmony_ci ("_x" ,"0102_032a"), 2077db96d56Sopenharmony_ci ("_X" ,"0102_032A"), 2087db96d56Sopenharmony_ci ("#b" ,"0b00000001000000100000001100101010"), 2097db96d56Sopenharmony_ci ("#n" ,"0b00000001000000100000001100101010"), 2107db96d56Sopenharmony_ci ("#x" ,"0x0102032a"), 2117db96d56Sopenharmony_ci ("#X" ,"0X0102032A"), 2127db96d56Sopenharmony_ci ("#_b" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"), 2137db96d56Sopenharmony_ci ("#_n" ,"0b0000_0001_0000_0010_0000_0011_0010_1010"), 2147db96d56Sopenharmony_ci ("#_x" ,"0x0102_032a"), 2157db96d56Sopenharmony_ci ("#_X" ,"0X0102_032A"), 2167db96d56Sopenharmony_ci ("s" ,"1.2.3.42"), 2177db96d56Sopenharmony_ci ("" ,"1.2.3.42"), 2187db96d56Sopenharmony_ci ] 2197db96d56Sopenharmony_ci for (fmt, txt) in v4_pairs: 2207db96d56Sopenharmony_ci self.assertEqual(txt, format(v4, fmt)) 2217db96d56Sopenharmony_ci 2227db96d56Sopenharmony_ci def test_network_passed_as_address(self): 2237db96d56Sopenharmony_ci addr = "127.0.0.1/24" 2247db96d56Sopenharmony_ci with self.assertAddressError("Unexpected '/' in %r", addr): 2257db96d56Sopenharmony_ci ipaddress.IPv4Address(addr) 2267db96d56Sopenharmony_ci 2277db96d56Sopenharmony_ci def test_bad_address_split(self): 2287db96d56Sopenharmony_ci def assertBadSplit(addr): 2297db96d56Sopenharmony_ci with self.assertAddressError("Expected 4 octets in %r", addr): 2307db96d56Sopenharmony_ci ipaddress.IPv4Address(addr) 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_ci assertBadSplit("127.0.1") 2337db96d56Sopenharmony_ci assertBadSplit("42.42.42.42.42") 2347db96d56Sopenharmony_ci assertBadSplit("42.42.42") 2357db96d56Sopenharmony_ci assertBadSplit("42.42") 2367db96d56Sopenharmony_ci assertBadSplit("42") 2377db96d56Sopenharmony_ci assertBadSplit("42..42.42.42") 2387db96d56Sopenharmony_ci assertBadSplit("42.42.42.42.") 2397db96d56Sopenharmony_ci assertBadSplit("42.42.42.42...") 2407db96d56Sopenharmony_ci assertBadSplit(".42.42.42.42") 2417db96d56Sopenharmony_ci assertBadSplit("...42.42.42.42") 2427db96d56Sopenharmony_ci assertBadSplit("016.016.016") 2437db96d56Sopenharmony_ci assertBadSplit("016.016") 2447db96d56Sopenharmony_ci assertBadSplit("016") 2457db96d56Sopenharmony_ci assertBadSplit("000") 2467db96d56Sopenharmony_ci assertBadSplit("0x0a.0x0a.0x0a") 2477db96d56Sopenharmony_ci assertBadSplit("0x0a.0x0a") 2487db96d56Sopenharmony_ci assertBadSplit("0x0a") 2497db96d56Sopenharmony_ci assertBadSplit(".") 2507db96d56Sopenharmony_ci assertBadSplit("bogus") 2517db96d56Sopenharmony_ci assertBadSplit("bogus.com") 2527db96d56Sopenharmony_ci assertBadSplit("1000") 2537db96d56Sopenharmony_ci assertBadSplit("1000000000000000") 2547db96d56Sopenharmony_ci assertBadSplit("192.168.0.1.com") 2557db96d56Sopenharmony_ci 2567db96d56Sopenharmony_ci def test_empty_octet(self): 2577db96d56Sopenharmony_ci def assertBadOctet(addr): 2587db96d56Sopenharmony_ci with self.assertAddressError("Empty octet not permitted in %r", 2597db96d56Sopenharmony_ci addr): 2607db96d56Sopenharmony_ci ipaddress.IPv4Address(addr) 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci assertBadOctet("42..42.42") 2637db96d56Sopenharmony_ci assertBadOctet("...") 2647db96d56Sopenharmony_ci 2657db96d56Sopenharmony_ci def test_invalid_characters(self): 2667db96d56Sopenharmony_ci def assertBadOctet(addr, octet): 2677db96d56Sopenharmony_ci msg = "Only decimal digits permitted in %r in %r" % (octet, addr) 2687db96d56Sopenharmony_ci with self.assertAddressError(re.escape(msg)): 2697db96d56Sopenharmony_ci ipaddress.IPv4Address(addr) 2707db96d56Sopenharmony_ci 2717db96d56Sopenharmony_ci assertBadOctet("0x0a.0x0a.0x0a.0x0a", "0x0a") 2727db96d56Sopenharmony_ci assertBadOctet("0xa.0x0a.0x0a.0x0a", "0xa") 2737db96d56Sopenharmony_ci assertBadOctet("42.42.42.-0", "-0") 2747db96d56Sopenharmony_ci assertBadOctet("42.42.42.+0", "+0") 2757db96d56Sopenharmony_ci assertBadOctet("42.42.42.-42", "-42") 2767db96d56Sopenharmony_ci assertBadOctet("+1.+2.+3.4", "+1") 2777db96d56Sopenharmony_ci assertBadOctet("1.2.3.4e0", "4e0") 2787db96d56Sopenharmony_ci assertBadOctet("1.2.3.4::", "4::") 2797db96d56Sopenharmony_ci assertBadOctet("1.a.2.3", "a") 2807db96d56Sopenharmony_ci 2817db96d56Sopenharmony_ci def test_octet_length(self): 2827db96d56Sopenharmony_ci def assertBadOctet(addr, octet): 2837db96d56Sopenharmony_ci msg = "At most 3 characters permitted in %r in %r" 2847db96d56Sopenharmony_ci with self.assertAddressError(re.escape(msg % (octet, addr))): 2857db96d56Sopenharmony_ci ipaddress.IPv4Address(addr) 2867db96d56Sopenharmony_ci 2877db96d56Sopenharmony_ci assertBadOctet("0000.000.000.000", "0000") 2887db96d56Sopenharmony_ci assertBadOctet("12345.67899.-54321.-98765", "12345") 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ci def test_octet_limit(self): 2917db96d56Sopenharmony_ci def assertBadOctet(addr, octet): 2927db96d56Sopenharmony_ci msg = "Octet %d (> 255) not permitted in %r" % (octet, addr) 2937db96d56Sopenharmony_ci with self.assertAddressError(re.escape(msg)): 2947db96d56Sopenharmony_ci ipaddress.IPv4Address(addr) 2957db96d56Sopenharmony_ci 2967db96d56Sopenharmony_ci assertBadOctet("257.0.0.0", 257) 2977db96d56Sopenharmony_ci assertBadOctet("192.168.0.999", 999) 2987db96d56Sopenharmony_ci 2997db96d56Sopenharmony_ci def test_pickle(self): 3007db96d56Sopenharmony_ci self.pickle_test('192.0.2.1') 3017db96d56Sopenharmony_ci 3027db96d56Sopenharmony_ci def test_weakref(self): 3037db96d56Sopenharmony_ci weakref.ref(self.factory('192.0.2.1')) 3047db96d56Sopenharmony_ci 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_ciclass AddressTestCase_v6(BaseTestCase, CommonTestMixin_v6): 3077db96d56Sopenharmony_ci factory = ipaddress.IPv6Address 3087db96d56Sopenharmony_ci 3097db96d56Sopenharmony_ci def test_format(self): 3107db96d56Sopenharmony_ci 3117db96d56Sopenharmony_ci v6 = ipaddress.IPv6Address("::1.2.3.42") 3127db96d56Sopenharmony_ci v6_pairs = [ 3137db96d56Sopenharmony_ci ("b", 3147db96d56Sopenharmony_ci "000000000000000000000000000000000000000000000000000000" 3157db96d56Sopenharmony_ci "000000000000000000000000000000000000000000000000010000" 3167db96d56Sopenharmony_ci "00100000001100101010"), 3177db96d56Sopenharmony_ci ("n", "0000000000000000000000000102032a"), 3187db96d56Sopenharmony_ci ("x", "0000000000000000000000000102032a"), 3197db96d56Sopenharmony_ci ("X", "0000000000000000000000000102032A"), 3207db96d56Sopenharmony_ci ("_b", 3217db96d56Sopenharmony_ci "0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" 3227db96d56Sopenharmony_ci "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" 3237db96d56Sopenharmony_ci "_0000_0000_0000_0000_0001_0000_0010_0000_0011_0010" 3247db96d56Sopenharmony_ci "_1010"), 3257db96d56Sopenharmony_ci ("_n", "0000_0000_0000_0000_0000_0000_0102_032a"), 3267db96d56Sopenharmony_ci ("_x", "0000_0000_0000_0000_0000_0000_0102_032a"), 3277db96d56Sopenharmony_ci ("_X", "0000_0000_0000_0000_0000_0000_0102_032A"), 3287db96d56Sopenharmony_ci ("#b", 3297db96d56Sopenharmony_ci "0b0000000000000000000000000000000000000000000000000000" 3307db96d56Sopenharmony_ci "000000000000000000000000000000000000000000000000000100" 3317db96d56Sopenharmony_ci "0000100000001100101010"), 3327db96d56Sopenharmony_ci ("#n", "0x0000000000000000000000000102032a"), 3337db96d56Sopenharmony_ci ("#x", "0x0000000000000000000000000102032a"), 3347db96d56Sopenharmony_ci ("#X", "0X0000000000000000000000000102032A"), 3357db96d56Sopenharmony_ci ("#_b", 3367db96d56Sopenharmony_ci "0b0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" 3377db96d56Sopenharmony_ci "_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000" 3387db96d56Sopenharmony_ci "_0000_0000_0000_0000_0000_0001_0000_0010_0000_0011" 3397db96d56Sopenharmony_ci "_0010_1010"), 3407db96d56Sopenharmony_ci ("#_n", "0x0000_0000_0000_0000_0000_0000_0102_032a"), 3417db96d56Sopenharmony_ci ("#_x", "0x0000_0000_0000_0000_0000_0000_0102_032a"), 3427db96d56Sopenharmony_ci ("#_X", "0X0000_0000_0000_0000_0000_0000_0102_032A"), 3437db96d56Sopenharmony_ci ("s", "::102:32a"), 3447db96d56Sopenharmony_ci ("", "::102:32a"), 3457db96d56Sopenharmony_ci ] 3467db96d56Sopenharmony_ci 3477db96d56Sopenharmony_ci for (fmt, txt) in v6_pairs: 3487db96d56Sopenharmony_ci self.assertEqual(txt, format(v6, fmt)) 3497db96d56Sopenharmony_ci 3507db96d56Sopenharmony_ci def test_network_passed_as_address(self): 3517db96d56Sopenharmony_ci def assertBadSplit(addr): 3527db96d56Sopenharmony_ci msg = "Unexpected '/' in %r" 3537db96d56Sopenharmony_ci with self.assertAddressError(msg, addr): 3547db96d56Sopenharmony_ci ipaddress.IPv6Address(addr) 3557db96d56Sopenharmony_ci assertBadSplit("::1/24") 3567db96d56Sopenharmony_ci assertBadSplit("::1%scope_id/24") 3577db96d56Sopenharmony_ci 3587db96d56Sopenharmony_ci def test_bad_address_split_v6_not_enough_parts(self): 3597db96d56Sopenharmony_ci def assertBadSplit(addr): 3607db96d56Sopenharmony_ci msg = "At least 3 parts expected in %r" 3617db96d56Sopenharmony_ci with self.assertAddressError(msg, addr.split('%')[0]): 3627db96d56Sopenharmony_ci ipaddress.IPv6Address(addr) 3637db96d56Sopenharmony_ci 3647db96d56Sopenharmony_ci assertBadSplit(":") 3657db96d56Sopenharmony_ci assertBadSplit(":1") 3667db96d56Sopenharmony_ci assertBadSplit("FEDC:9878") 3677db96d56Sopenharmony_ci assertBadSplit(":%scope") 3687db96d56Sopenharmony_ci assertBadSplit(":1%scope") 3697db96d56Sopenharmony_ci assertBadSplit("FEDC:9878%scope") 3707db96d56Sopenharmony_ci 3717db96d56Sopenharmony_ci def test_bad_address_split_v6_too_many_colons(self): 3727db96d56Sopenharmony_ci def assertBadSplit(addr): 3737db96d56Sopenharmony_ci msg = "At most 8 colons permitted in %r" 3747db96d56Sopenharmony_ci with self.assertAddressError(msg, addr.split('%')[0]): 3757db96d56Sopenharmony_ci ipaddress.IPv6Address(addr) 3767db96d56Sopenharmony_ci 3777db96d56Sopenharmony_ci assertBadSplit("9:8:7:6:5:4:3::2:1") 3787db96d56Sopenharmony_ci assertBadSplit("10:9:8:7:6:5:4:3:2:1") 3797db96d56Sopenharmony_ci assertBadSplit("::8:7:6:5:4:3:2:1") 3807db96d56Sopenharmony_ci assertBadSplit("8:7:6:5:4:3:2:1::") 3817db96d56Sopenharmony_ci # A trailing IPv4 address is two parts 3827db96d56Sopenharmony_ci assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42") 3837db96d56Sopenharmony_ci 3847db96d56Sopenharmony_ci assertBadSplit("9:8:7:6:5:4:3::2:1%scope") 3857db96d56Sopenharmony_ci assertBadSplit("10:9:8:7:6:5:4:3:2:1%scope") 3867db96d56Sopenharmony_ci assertBadSplit("::8:7:6:5:4:3:2:1%scope") 3877db96d56Sopenharmony_ci assertBadSplit("8:7:6:5:4:3:2:1::%scope") 3887db96d56Sopenharmony_ci # A trailing IPv4 address is two parts 3897db96d56Sopenharmony_ci assertBadSplit("10:9:8:7:6:5:4:3:42.42.42.42%scope") 3907db96d56Sopenharmony_ci 3917db96d56Sopenharmony_ci def test_bad_address_split_v6_too_many_parts(self): 3927db96d56Sopenharmony_ci def assertBadSplit(addr): 3937db96d56Sopenharmony_ci msg = "Exactly 8 parts expected without '::' in %r" 3947db96d56Sopenharmony_ci with self.assertAddressError(msg, addr.split('%')[0]): 3957db96d56Sopenharmony_ci ipaddress.IPv6Address(addr) 3967db96d56Sopenharmony_ci 3977db96d56Sopenharmony_ci assertBadSplit("3ffe:0:0:0:0:0:0:0:1") 3987db96d56Sopenharmony_ci assertBadSplit("9:8:7:6:5:4:3:2:1") 3997db96d56Sopenharmony_ci assertBadSplit("7:6:5:4:3:2:1") 4007db96d56Sopenharmony_ci # A trailing IPv4 address is two parts 4017db96d56Sopenharmony_ci assertBadSplit("9:8:7:6:5:4:3:42.42.42.42") 4027db96d56Sopenharmony_ci assertBadSplit("7:6:5:4:3:42.42.42.42") 4037db96d56Sopenharmony_ci 4047db96d56Sopenharmony_ci assertBadSplit("3ffe:0:0:0:0:0:0:0:1%scope") 4057db96d56Sopenharmony_ci assertBadSplit("9:8:7:6:5:4:3:2:1%scope") 4067db96d56Sopenharmony_ci assertBadSplit("7:6:5:4:3:2:1%scope") 4077db96d56Sopenharmony_ci # A trailing IPv4 address is two parts 4087db96d56Sopenharmony_ci assertBadSplit("9:8:7:6:5:4:3:42.42.42.42%scope") 4097db96d56Sopenharmony_ci assertBadSplit("7:6:5:4:3:42.42.42.42%scope") 4107db96d56Sopenharmony_ci 4117db96d56Sopenharmony_ci def test_bad_address_split_v6_too_many_parts_with_double_colon(self): 4127db96d56Sopenharmony_ci def assertBadSplit(addr): 4137db96d56Sopenharmony_ci msg = "Expected at most 7 other parts with '::' in %r" 4147db96d56Sopenharmony_ci with self.assertAddressError(msg, addr.split('%')[0]): 4157db96d56Sopenharmony_ci ipaddress.IPv6Address(addr) 4167db96d56Sopenharmony_ci 4177db96d56Sopenharmony_ci assertBadSplit("1:2:3:4::5:6:7:8") 4187db96d56Sopenharmony_ci assertBadSplit("1:2:3:4::5:6:7:8%scope") 4197db96d56Sopenharmony_ci 4207db96d56Sopenharmony_ci def test_bad_address_split_v6_repeated_double_colon(self): 4217db96d56Sopenharmony_ci def assertBadSplit(addr): 4227db96d56Sopenharmony_ci msg = "At most one '::' permitted in %r" 4237db96d56Sopenharmony_ci with self.assertAddressError(msg, addr.split('%')[0]): 4247db96d56Sopenharmony_ci ipaddress.IPv6Address(addr) 4257db96d56Sopenharmony_ci 4267db96d56Sopenharmony_ci assertBadSplit("3ffe::1::1") 4277db96d56Sopenharmony_ci assertBadSplit("1::2::3::4:5") 4287db96d56Sopenharmony_ci assertBadSplit("2001::db:::1") 4297db96d56Sopenharmony_ci assertBadSplit("3ffe::1::") 4307db96d56Sopenharmony_ci assertBadSplit("::3ffe::1") 4317db96d56Sopenharmony_ci assertBadSplit(":3ffe::1::1") 4327db96d56Sopenharmony_ci assertBadSplit("3ffe::1::1:") 4337db96d56Sopenharmony_ci assertBadSplit(":3ffe::1::1:") 4347db96d56Sopenharmony_ci assertBadSplit(":::") 4357db96d56Sopenharmony_ci assertBadSplit('2001:db8:::1') 4367db96d56Sopenharmony_ci 4377db96d56Sopenharmony_ci assertBadSplit("3ffe::1::1%scope") 4387db96d56Sopenharmony_ci assertBadSplit("1::2::3::4:5%scope") 4397db96d56Sopenharmony_ci assertBadSplit("2001::db:::1%scope") 4407db96d56Sopenharmony_ci assertBadSplit("3ffe::1::%scope") 4417db96d56Sopenharmony_ci assertBadSplit("::3ffe::1%scope") 4427db96d56Sopenharmony_ci assertBadSplit(":3ffe::1::1%scope") 4437db96d56Sopenharmony_ci assertBadSplit("3ffe::1::1:%scope") 4447db96d56Sopenharmony_ci assertBadSplit(":3ffe::1::1:%scope") 4457db96d56Sopenharmony_ci assertBadSplit(":::%scope") 4467db96d56Sopenharmony_ci assertBadSplit('2001:db8:::1%scope') 4477db96d56Sopenharmony_ci 4487db96d56Sopenharmony_ci def test_bad_address_split_v6_leading_colon(self): 4497db96d56Sopenharmony_ci def assertBadSplit(addr): 4507db96d56Sopenharmony_ci msg = "Leading ':' only permitted as part of '::' in %r" 4517db96d56Sopenharmony_ci with self.assertAddressError(msg, addr.split('%')[0]): 4527db96d56Sopenharmony_ci ipaddress.IPv6Address(addr) 4537db96d56Sopenharmony_ci 4547db96d56Sopenharmony_ci assertBadSplit(":2001:db8::1") 4557db96d56Sopenharmony_ci assertBadSplit(":1:2:3:4:5:6:7") 4567db96d56Sopenharmony_ci assertBadSplit(":1:2:3:4:5:6:") 4577db96d56Sopenharmony_ci assertBadSplit(":6:5:4:3:2:1::") 4587db96d56Sopenharmony_ci 4597db96d56Sopenharmony_ci assertBadSplit(":2001:db8::1%scope") 4607db96d56Sopenharmony_ci assertBadSplit(":1:2:3:4:5:6:7%scope") 4617db96d56Sopenharmony_ci assertBadSplit(":1:2:3:4:5:6:%scope") 4627db96d56Sopenharmony_ci assertBadSplit(":6:5:4:3:2:1::%scope") 4637db96d56Sopenharmony_ci 4647db96d56Sopenharmony_ci def test_bad_address_split_v6_trailing_colon(self): 4657db96d56Sopenharmony_ci def assertBadSplit(addr): 4667db96d56Sopenharmony_ci msg = "Trailing ':' only permitted as part of '::' in %r" 4677db96d56Sopenharmony_ci with self.assertAddressError(msg, addr.split('%')[0]): 4687db96d56Sopenharmony_ci ipaddress.IPv6Address(addr) 4697db96d56Sopenharmony_ci 4707db96d56Sopenharmony_ci assertBadSplit("2001:db8::1:") 4717db96d56Sopenharmony_ci assertBadSplit("1:2:3:4:5:6:7:") 4727db96d56Sopenharmony_ci assertBadSplit("::1.2.3.4:") 4737db96d56Sopenharmony_ci assertBadSplit("::7:6:5:4:3:2:") 4747db96d56Sopenharmony_ci 4757db96d56Sopenharmony_ci assertBadSplit("2001:db8::1:%scope") 4767db96d56Sopenharmony_ci assertBadSplit("1:2:3:4:5:6:7:%scope") 4777db96d56Sopenharmony_ci assertBadSplit("::1.2.3.4:%scope") 4787db96d56Sopenharmony_ci assertBadSplit("::7:6:5:4:3:2:%scope") 4797db96d56Sopenharmony_ci 4807db96d56Sopenharmony_ci def test_bad_v4_part_in(self): 4817db96d56Sopenharmony_ci def assertBadAddressPart(addr, v4_error): 4827db96d56Sopenharmony_ci with self.assertAddressError("%s in %r", v4_error, addr.split('%')[0]): 4837db96d56Sopenharmony_ci ipaddress.IPv6Address(addr) 4847db96d56Sopenharmony_ci 4857db96d56Sopenharmony_ci assertBadAddressPart("3ffe::1.net", "Expected 4 octets in '1.net'") 4867db96d56Sopenharmony_ci assertBadAddressPart("3ffe::127.0.1", 4877db96d56Sopenharmony_ci "Expected 4 octets in '127.0.1'") 4887db96d56Sopenharmony_ci assertBadAddressPart("::1.2.3", 4897db96d56Sopenharmony_ci "Expected 4 octets in '1.2.3'") 4907db96d56Sopenharmony_ci assertBadAddressPart("::1.2.3.4.5", 4917db96d56Sopenharmony_ci "Expected 4 octets in '1.2.3.4.5'") 4927db96d56Sopenharmony_ci assertBadAddressPart("3ffe::1.1.1.net", 4937db96d56Sopenharmony_ci "Only decimal digits permitted in 'net' " 4947db96d56Sopenharmony_ci "in '1.1.1.net'") 4957db96d56Sopenharmony_ci 4967db96d56Sopenharmony_ci assertBadAddressPart("3ffe::1.net%scope", "Expected 4 octets in '1.net'") 4977db96d56Sopenharmony_ci assertBadAddressPart("3ffe::127.0.1%scope", 4987db96d56Sopenharmony_ci "Expected 4 octets in '127.0.1'") 4997db96d56Sopenharmony_ci assertBadAddressPart("::1.2.3%scope", 5007db96d56Sopenharmony_ci "Expected 4 octets in '1.2.3'") 5017db96d56Sopenharmony_ci assertBadAddressPart("::1.2.3.4.5%scope", 5027db96d56Sopenharmony_ci "Expected 4 octets in '1.2.3.4.5'") 5037db96d56Sopenharmony_ci assertBadAddressPart("3ffe::1.1.1.net%scope", 5047db96d56Sopenharmony_ci "Only decimal digits permitted in 'net' " 5057db96d56Sopenharmony_ci "in '1.1.1.net'") 5067db96d56Sopenharmony_ci 5077db96d56Sopenharmony_ci def test_invalid_characters(self): 5087db96d56Sopenharmony_ci def assertBadPart(addr, part): 5097db96d56Sopenharmony_ci msg = "Only hex digits permitted in %r in %r" % (part, addr.split('%')[0]) 5107db96d56Sopenharmony_ci with self.assertAddressError(re.escape(msg)): 5117db96d56Sopenharmony_ci ipaddress.IPv6Address(addr) 5127db96d56Sopenharmony_ci 5137db96d56Sopenharmony_ci assertBadPart("3ffe::goog", "goog") 5147db96d56Sopenharmony_ci assertBadPart("3ffe::-0", "-0") 5157db96d56Sopenharmony_ci assertBadPart("3ffe::+0", "+0") 5167db96d56Sopenharmony_ci assertBadPart("3ffe::-1", "-1") 5177db96d56Sopenharmony_ci assertBadPart("1.2.3.4::", "1.2.3.4") 5187db96d56Sopenharmony_ci assertBadPart('1234:axy::b', "axy") 5197db96d56Sopenharmony_ci 5207db96d56Sopenharmony_ci assertBadPart("3ffe::goog%scope", "goog") 5217db96d56Sopenharmony_ci assertBadPart("3ffe::-0%scope", "-0") 5227db96d56Sopenharmony_ci assertBadPart("3ffe::+0%scope", "+0") 5237db96d56Sopenharmony_ci assertBadPart("3ffe::-1%scope", "-1") 5247db96d56Sopenharmony_ci assertBadPart("1.2.3.4::%scope", "1.2.3.4") 5257db96d56Sopenharmony_ci assertBadPart('1234:axy::b%scope', "axy") 5267db96d56Sopenharmony_ci 5277db96d56Sopenharmony_ci def test_part_length(self): 5287db96d56Sopenharmony_ci def assertBadPart(addr, part): 5297db96d56Sopenharmony_ci msg = "At most 4 characters permitted in %r in %r" 5307db96d56Sopenharmony_ci with self.assertAddressError(msg, part, addr.split('%')[0]): 5317db96d56Sopenharmony_ci ipaddress.IPv6Address(addr) 5327db96d56Sopenharmony_ci 5337db96d56Sopenharmony_ci assertBadPart("::00000", "00000") 5347db96d56Sopenharmony_ci assertBadPart("3ffe::10000", "10000") 5357db96d56Sopenharmony_ci assertBadPart("02001:db8::", "02001") 5367db96d56Sopenharmony_ci assertBadPart('2001:888888::1', "888888") 5377db96d56Sopenharmony_ci 5387db96d56Sopenharmony_ci assertBadPart("::00000%scope", "00000") 5397db96d56Sopenharmony_ci assertBadPart("3ffe::10000%scope", "10000") 5407db96d56Sopenharmony_ci assertBadPart("02001:db8::%scope", "02001") 5417db96d56Sopenharmony_ci assertBadPart('2001:888888::1%scope', "888888") 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ci def test_pickle(self): 5447db96d56Sopenharmony_ci self.pickle_test('2001:db8::') 5457db96d56Sopenharmony_ci 5467db96d56Sopenharmony_ci def test_weakref(self): 5477db96d56Sopenharmony_ci weakref.ref(self.factory('2001:db8::')) 5487db96d56Sopenharmony_ci weakref.ref(self.factory('2001:db8::%scope')) 5497db96d56Sopenharmony_ci 5507db96d56Sopenharmony_ci 5517db96d56Sopenharmony_ciclass NetmaskTestMixin_v4(CommonTestMixin_v4): 5527db96d56Sopenharmony_ci """Input validation on interfaces and networks is very similar""" 5537db96d56Sopenharmony_ci 5547db96d56Sopenharmony_ci def test_no_mask(self): 5557db96d56Sopenharmony_ci for address in ('1.2.3.4', 0x01020304, b'\x01\x02\x03\x04'): 5567db96d56Sopenharmony_ci net = self.factory(address) 5577db96d56Sopenharmony_ci self.assertEqual(str(net), '1.2.3.4/32') 5587db96d56Sopenharmony_ci self.assertEqual(str(net.netmask), '255.255.255.255') 5597db96d56Sopenharmony_ci self.assertEqual(str(net.hostmask), '0.0.0.0') 5607db96d56Sopenharmony_ci # IPv4Network has prefixlen, but IPv4Interface doesn't. 5617db96d56Sopenharmony_ci # Should we add it to IPv4Interface too? (bpo-36392) 5627db96d56Sopenharmony_ci 5637db96d56Sopenharmony_ci def test_split_netmask(self): 5647db96d56Sopenharmony_ci addr = "1.2.3.4/32/24" 5657db96d56Sopenharmony_ci with self.assertAddressError("Only one '/' permitted in %r" % addr): 5667db96d56Sopenharmony_ci self.factory(addr) 5677db96d56Sopenharmony_ci 5687db96d56Sopenharmony_ci def test_address_errors(self): 5697db96d56Sopenharmony_ci def assertBadAddress(addr, details): 5707db96d56Sopenharmony_ci with self.assertAddressError(details): 5717db96d56Sopenharmony_ci self.factory(addr) 5727db96d56Sopenharmony_ci 5737db96d56Sopenharmony_ci assertBadAddress("/", "Address cannot be empty") 5747db96d56Sopenharmony_ci assertBadAddress("/8", "Address cannot be empty") 5757db96d56Sopenharmony_ci assertBadAddress("bogus", "Expected 4 octets") 5767db96d56Sopenharmony_ci assertBadAddress("google.com", "Expected 4 octets") 5777db96d56Sopenharmony_ci assertBadAddress("10/8", "Expected 4 octets") 5787db96d56Sopenharmony_ci assertBadAddress("::1.2.3.4", "Only decimal digits") 5797db96d56Sopenharmony_ci assertBadAddress("1.2.3.256", re.escape("256 (> 255)")) 5807db96d56Sopenharmony_ci 5817db96d56Sopenharmony_ci def test_valid_netmask(self): 5827db96d56Sopenharmony_ci self.assertEqual(str(self.factory(('192.0.2.0', 24))), '192.0.2.0/24') 5837db96d56Sopenharmony_ci self.assertEqual(str(self.factory(('192.0.2.0', '24'))), '192.0.2.0/24') 5847db96d56Sopenharmony_ci self.assertEqual(str(self.factory(('192.0.2.0', '255.255.255.0'))), 5857db96d56Sopenharmony_ci '192.0.2.0/24') 5867db96d56Sopenharmony_ci self.assertEqual(str(self.factory('192.0.2.0/255.255.255.0')), 5877db96d56Sopenharmony_ci '192.0.2.0/24') 5887db96d56Sopenharmony_ci for i in range(0, 33): 5897db96d56Sopenharmony_ci # Generate and re-parse the CIDR format (trivial). 5907db96d56Sopenharmony_ci net_str = '0.0.0.0/%d' % i 5917db96d56Sopenharmony_ci net = self.factory(net_str) 5927db96d56Sopenharmony_ci self.assertEqual(str(net), net_str) 5937db96d56Sopenharmony_ci # Generate and re-parse the expanded netmask. 5947db96d56Sopenharmony_ci self.assertEqual( 5957db96d56Sopenharmony_ci str(self.factory('0.0.0.0/%s' % net.netmask)), net_str) 5967db96d56Sopenharmony_ci # Zero prefix is treated as decimal. 5977db96d56Sopenharmony_ci self.assertEqual(str(self.factory('0.0.0.0/0%d' % i)), net_str) 5987db96d56Sopenharmony_ci # Generate and re-parse the expanded hostmask. The ambiguous 5997db96d56Sopenharmony_ci # cases (/0 and /32) are treated as netmasks. 6007db96d56Sopenharmony_ci if i in (32, 0): 6017db96d56Sopenharmony_ci net_str = '0.0.0.0/%d' % (32 - i) 6027db96d56Sopenharmony_ci self.assertEqual( 6037db96d56Sopenharmony_ci str(self.factory('0.0.0.0/%s' % net.hostmask)), net_str) 6047db96d56Sopenharmony_ci 6057db96d56Sopenharmony_ci def test_netmask_errors(self): 6067db96d56Sopenharmony_ci def assertBadNetmask(addr, netmask): 6077db96d56Sopenharmony_ci msg = "%r is not a valid netmask" % netmask 6087db96d56Sopenharmony_ci with self.assertNetmaskError(re.escape(msg)): 6097db96d56Sopenharmony_ci self.factory("%s/%s" % (addr, netmask)) 6107db96d56Sopenharmony_ci 6117db96d56Sopenharmony_ci assertBadNetmask("1.2.3.4", "") 6127db96d56Sopenharmony_ci assertBadNetmask("1.2.3.4", "-1") 6137db96d56Sopenharmony_ci assertBadNetmask("1.2.3.4", "+1") 6147db96d56Sopenharmony_ci assertBadNetmask("1.2.3.4", " 1 ") 6157db96d56Sopenharmony_ci assertBadNetmask("1.2.3.4", "0x1") 6167db96d56Sopenharmony_ci assertBadNetmask("1.2.3.4", "33") 6177db96d56Sopenharmony_ci assertBadNetmask("1.2.3.4", "254.254.255.256") 6187db96d56Sopenharmony_ci assertBadNetmask("1.2.3.4", "1.a.2.3") 6197db96d56Sopenharmony_ci assertBadNetmask("1.1.1.1", "254.xyz.2.3") 6207db96d56Sopenharmony_ci assertBadNetmask("1.1.1.1", "240.255.0.0") 6217db96d56Sopenharmony_ci assertBadNetmask("1.1.1.1", "255.254.128.0") 6227db96d56Sopenharmony_ci assertBadNetmask("1.1.1.1", "0.1.127.255") 6237db96d56Sopenharmony_ci assertBadNetmask("1.1.1.1", "pudding") 6247db96d56Sopenharmony_ci assertBadNetmask("1.1.1.1", "::") 6257db96d56Sopenharmony_ci 6267db96d56Sopenharmony_ci def test_netmask_in_tuple_errors(self): 6277db96d56Sopenharmony_ci def assertBadNetmask(addr, netmask): 6287db96d56Sopenharmony_ci msg = "%r is not a valid netmask" % netmask 6297db96d56Sopenharmony_ci with self.assertNetmaskError(re.escape(msg)): 6307db96d56Sopenharmony_ci self.factory((addr, netmask)) 6317db96d56Sopenharmony_ci assertBadNetmask("1.1.1.1", -1) 6327db96d56Sopenharmony_ci assertBadNetmask("1.1.1.1", 33) 6337db96d56Sopenharmony_ci 6347db96d56Sopenharmony_ci def test_pickle(self): 6357db96d56Sopenharmony_ci self.pickle_test('192.0.2.0/27') 6367db96d56Sopenharmony_ci self.pickle_test('192.0.2.0/31') # IPV4LENGTH - 1 6377db96d56Sopenharmony_ci self.pickle_test('192.0.2.0') # IPV4LENGTH 6387db96d56Sopenharmony_ci 6397db96d56Sopenharmony_ci 6407db96d56Sopenharmony_ciclass InterfaceTestCase_v4(BaseTestCase, NetmaskTestMixin_v4): 6417db96d56Sopenharmony_ci factory = ipaddress.IPv4Interface 6427db96d56Sopenharmony_ci 6437db96d56Sopenharmony_ci 6447db96d56Sopenharmony_ciclass NetworkTestCase_v4(BaseTestCase, NetmaskTestMixin_v4): 6457db96d56Sopenharmony_ci factory = ipaddress.IPv4Network 6467db96d56Sopenharmony_ci 6477db96d56Sopenharmony_ci def test_subnet_of(self): 6487db96d56Sopenharmony_ci # containee left of container 6497db96d56Sopenharmony_ci self.assertFalse( 6507db96d56Sopenharmony_ci self.factory('10.0.0.0/30').subnet_of( 6517db96d56Sopenharmony_ci self.factory('10.0.1.0/24'))) 6527db96d56Sopenharmony_ci # containee inside container 6537db96d56Sopenharmony_ci self.assertTrue( 6547db96d56Sopenharmony_ci self.factory('10.0.0.0/30').subnet_of( 6557db96d56Sopenharmony_ci self.factory('10.0.0.0/24'))) 6567db96d56Sopenharmony_ci # containee right of container 6577db96d56Sopenharmony_ci self.assertFalse( 6587db96d56Sopenharmony_ci self.factory('10.0.0.0/30').subnet_of( 6597db96d56Sopenharmony_ci self.factory('10.0.1.0/24'))) 6607db96d56Sopenharmony_ci # containee larger than container 6617db96d56Sopenharmony_ci self.assertFalse( 6627db96d56Sopenharmony_ci self.factory('10.0.1.0/24').subnet_of( 6637db96d56Sopenharmony_ci self.factory('10.0.0.0/30'))) 6647db96d56Sopenharmony_ci 6657db96d56Sopenharmony_ci def test_supernet_of(self): 6667db96d56Sopenharmony_ci # containee left of container 6677db96d56Sopenharmony_ci self.assertFalse( 6687db96d56Sopenharmony_ci self.factory('10.0.0.0/30').supernet_of( 6697db96d56Sopenharmony_ci self.factory('10.0.1.0/24'))) 6707db96d56Sopenharmony_ci # containee inside container 6717db96d56Sopenharmony_ci self.assertFalse( 6727db96d56Sopenharmony_ci self.factory('10.0.0.0/30').supernet_of( 6737db96d56Sopenharmony_ci self.factory('10.0.0.0/24'))) 6747db96d56Sopenharmony_ci # containee right of container 6757db96d56Sopenharmony_ci self.assertFalse( 6767db96d56Sopenharmony_ci self.factory('10.0.0.0/30').supernet_of( 6777db96d56Sopenharmony_ci self.factory('10.0.1.0/24'))) 6787db96d56Sopenharmony_ci # containee larger than container 6797db96d56Sopenharmony_ci self.assertTrue( 6807db96d56Sopenharmony_ci self.factory('10.0.0.0/24').supernet_of( 6817db96d56Sopenharmony_ci self.factory('10.0.0.0/30'))) 6827db96d56Sopenharmony_ci 6837db96d56Sopenharmony_ci def test_subnet_of_mixed_types(self): 6847db96d56Sopenharmony_ci with self.assertRaises(TypeError): 6857db96d56Sopenharmony_ci ipaddress.IPv4Network('10.0.0.0/30').supernet_of( 6867db96d56Sopenharmony_ci ipaddress.IPv6Network('::1/128')) 6877db96d56Sopenharmony_ci with self.assertRaises(TypeError): 6887db96d56Sopenharmony_ci ipaddress.IPv6Network('::1/128').supernet_of( 6897db96d56Sopenharmony_ci ipaddress.IPv4Network('10.0.0.0/30')) 6907db96d56Sopenharmony_ci with self.assertRaises(TypeError): 6917db96d56Sopenharmony_ci ipaddress.IPv4Network('10.0.0.0/30').subnet_of( 6927db96d56Sopenharmony_ci ipaddress.IPv6Network('::1/128')) 6937db96d56Sopenharmony_ci with self.assertRaises(TypeError): 6947db96d56Sopenharmony_ci ipaddress.IPv6Network('::1/128').subnet_of( 6957db96d56Sopenharmony_ci ipaddress.IPv4Network('10.0.0.0/30')) 6967db96d56Sopenharmony_ci 6977db96d56Sopenharmony_ci 6987db96d56Sopenharmony_ciclass NetmaskTestMixin_v6(CommonTestMixin_v6): 6997db96d56Sopenharmony_ci """Input validation on interfaces and networks is very similar""" 7007db96d56Sopenharmony_ci 7017db96d56Sopenharmony_ci def test_no_mask(self): 7027db96d56Sopenharmony_ci for address in ('::1', 1, b'\x00'*15 + b'\x01'): 7037db96d56Sopenharmony_ci net = self.factory(address) 7047db96d56Sopenharmony_ci self.assertEqual(str(net), '::1/128') 7057db96d56Sopenharmony_ci self.assertEqual(str(net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff') 7067db96d56Sopenharmony_ci self.assertEqual(str(net.hostmask), '::') 7077db96d56Sopenharmony_ci # IPv6Network has prefixlen, but IPv6Interface doesn't. 7087db96d56Sopenharmony_ci # Should we add it to IPv4Interface too? (bpo-36392) 7097db96d56Sopenharmony_ci 7107db96d56Sopenharmony_ci scoped_net = self.factory('::1%scope') 7117db96d56Sopenharmony_ci self.assertEqual(str(scoped_net), '::1%scope/128') 7127db96d56Sopenharmony_ci self.assertEqual(str(scoped_net.netmask), 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff') 7137db96d56Sopenharmony_ci self.assertEqual(str(scoped_net.hostmask), '::') 7147db96d56Sopenharmony_ci 7157db96d56Sopenharmony_ci def test_split_netmask(self): 7167db96d56Sopenharmony_ci addr = "cafe:cafe::/128/190" 7177db96d56Sopenharmony_ci with self.assertAddressError("Only one '/' permitted in %r" % addr): 7187db96d56Sopenharmony_ci self.factory(addr) 7197db96d56Sopenharmony_ci 7207db96d56Sopenharmony_ci scoped_addr = "cafe:cafe::%scope/128/190" 7217db96d56Sopenharmony_ci with self.assertAddressError("Only one '/' permitted in %r" % scoped_addr): 7227db96d56Sopenharmony_ci self.factory(scoped_addr) 7237db96d56Sopenharmony_ci 7247db96d56Sopenharmony_ci def test_address_errors(self): 7257db96d56Sopenharmony_ci def assertBadAddress(addr, details): 7267db96d56Sopenharmony_ci with self.assertAddressError(details): 7277db96d56Sopenharmony_ci self.factory(addr) 7287db96d56Sopenharmony_ci 7297db96d56Sopenharmony_ci assertBadAddress("/", "Address cannot be empty") 7307db96d56Sopenharmony_ci assertBadAddress("/8", "Address cannot be empty") 7317db96d56Sopenharmony_ci assertBadAddress("google.com", "At least 3 parts") 7327db96d56Sopenharmony_ci assertBadAddress("1.2.3.4", "At least 3 parts") 7337db96d56Sopenharmony_ci assertBadAddress("10/8", "At least 3 parts") 7347db96d56Sopenharmony_ci assertBadAddress("1234:axy::b", "Only hex digits") 7357db96d56Sopenharmony_ci 7367db96d56Sopenharmony_ci assertBadAddress("/%scope", "Address cannot be empty") 7377db96d56Sopenharmony_ci assertBadAddress("/%scope8", "Address cannot be empty") 7387db96d56Sopenharmony_ci assertBadAddress("google.com%scope", "At least 3 parts") 7397db96d56Sopenharmony_ci assertBadAddress("1.2.3.4%scope", "At least 3 parts") 7407db96d56Sopenharmony_ci assertBadAddress("10%scope/8", "At least 3 parts") 7417db96d56Sopenharmony_ci assertBadAddress("1234:axy::b%scope", "Only hex digits") 7427db96d56Sopenharmony_ci 7437db96d56Sopenharmony_ci def test_valid_netmask(self): 7447db96d56Sopenharmony_ci # We only support CIDR for IPv6, because expanded netmasks are not 7457db96d56Sopenharmony_ci # standard notation. 7467db96d56Sopenharmony_ci self.assertEqual(str(self.factory(('2001:db8::', 32))), 7477db96d56Sopenharmony_ci '2001:db8::/32') 7487db96d56Sopenharmony_ci self.assertEqual(str(self.factory(('2001:db8::', '32'))), 7497db96d56Sopenharmony_ci '2001:db8::/32') 7507db96d56Sopenharmony_ci self.assertEqual(str(self.factory('2001:db8::/32')), '2001:db8::/32') 7517db96d56Sopenharmony_ci for i in range(0, 129): 7527db96d56Sopenharmony_ci # Generate and re-parse the CIDR format (trivial). 7537db96d56Sopenharmony_ci net_str = '::/%d' % i 7547db96d56Sopenharmony_ci self.assertEqual(str(self.factory(net_str)), net_str) 7557db96d56Sopenharmony_ci # Zero prefix is treated as decimal. 7567db96d56Sopenharmony_ci self.assertEqual(str(self.factory('::/0%d' % i)), net_str) 7577db96d56Sopenharmony_ci 7587db96d56Sopenharmony_ci self.assertEqual(str(self.factory('2001:db8::%scope/32')), '2001:db8::%scope/32') 7597db96d56Sopenharmony_ci for i in range(0, 129): 7607db96d56Sopenharmony_ci # Generate and re-parse the CIDR format (trivial). 7617db96d56Sopenharmony_ci net_str = '::/%d' % i 7627db96d56Sopenharmony_ci self.assertEqual(str(self.factory(net_str)), net_str) 7637db96d56Sopenharmony_ci # Zero prefix is treated as decimal. 7647db96d56Sopenharmony_ci self.assertEqual(str(self.factory('::/0%d' % i)), net_str) 7657db96d56Sopenharmony_ci 7667db96d56Sopenharmony_ci def test_netmask_errors(self): 7677db96d56Sopenharmony_ci def assertBadNetmask(addr, netmask): 7687db96d56Sopenharmony_ci msg = "%r is not a valid netmask" % netmask 7697db96d56Sopenharmony_ci with self.assertNetmaskError(re.escape(msg)): 7707db96d56Sopenharmony_ci self.factory("%s/%s" % (addr, netmask)) 7717db96d56Sopenharmony_ci 7727db96d56Sopenharmony_ci assertBadNetmask("::1", "") 7737db96d56Sopenharmony_ci assertBadNetmask("::1", "::1") 7747db96d56Sopenharmony_ci assertBadNetmask("::1", "1::") 7757db96d56Sopenharmony_ci assertBadNetmask("::1", "-1") 7767db96d56Sopenharmony_ci assertBadNetmask("::1", "+1") 7777db96d56Sopenharmony_ci assertBadNetmask("::1", " 1 ") 7787db96d56Sopenharmony_ci assertBadNetmask("::1", "0x1") 7797db96d56Sopenharmony_ci assertBadNetmask("::1", "129") 7807db96d56Sopenharmony_ci assertBadNetmask("::1", "1.2.3.4") 7817db96d56Sopenharmony_ci assertBadNetmask("::1", "pudding") 7827db96d56Sopenharmony_ci assertBadNetmask("::", "::") 7837db96d56Sopenharmony_ci 7847db96d56Sopenharmony_ci assertBadNetmask("::1%scope", "pudding") 7857db96d56Sopenharmony_ci 7867db96d56Sopenharmony_ci def test_netmask_in_tuple_errors(self): 7877db96d56Sopenharmony_ci def assertBadNetmask(addr, netmask): 7887db96d56Sopenharmony_ci msg = "%r is not a valid netmask" % netmask 7897db96d56Sopenharmony_ci with self.assertNetmaskError(re.escape(msg)): 7907db96d56Sopenharmony_ci self.factory((addr, netmask)) 7917db96d56Sopenharmony_ci assertBadNetmask("::1", -1) 7927db96d56Sopenharmony_ci assertBadNetmask("::1", 129) 7937db96d56Sopenharmony_ci assertBadNetmask("::1%scope", 129) 7947db96d56Sopenharmony_ci 7957db96d56Sopenharmony_ci def test_pickle(self): 7967db96d56Sopenharmony_ci self.pickle_test('2001:db8::1000/124') 7977db96d56Sopenharmony_ci self.pickle_test('2001:db8::1000/127') # IPV6LENGTH - 1 7987db96d56Sopenharmony_ci self.pickle_test('2001:db8::1000') # IPV6LENGTH 7997db96d56Sopenharmony_ci 8007db96d56Sopenharmony_ci self.pickle_test('2001:db8::1000%scope') # IPV6LENGTH 8017db96d56Sopenharmony_ci 8027db96d56Sopenharmony_ci 8037db96d56Sopenharmony_ciclass InterfaceTestCase_v6(BaseTestCase, NetmaskTestMixin_v6): 8047db96d56Sopenharmony_ci factory = ipaddress.IPv6Interface 8057db96d56Sopenharmony_ci 8067db96d56Sopenharmony_ci 8077db96d56Sopenharmony_ciclass NetworkTestCase_v6(BaseTestCase, NetmaskTestMixin_v6): 8087db96d56Sopenharmony_ci factory = ipaddress.IPv6Network 8097db96d56Sopenharmony_ci 8107db96d56Sopenharmony_ci def test_subnet_of(self): 8117db96d56Sopenharmony_ci # containee left of container 8127db96d56Sopenharmony_ci self.assertFalse( 8137db96d56Sopenharmony_ci self.factory('2000:999::/56').subnet_of( 8147db96d56Sopenharmony_ci self.factory('2000:aaa::/48'))) 8157db96d56Sopenharmony_ci # containee inside container 8167db96d56Sopenharmony_ci self.assertTrue( 8177db96d56Sopenharmony_ci self.factory('2000:aaa::/56').subnet_of( 8187db96d56Sopenharmony_ci self.factory('2000:aaa::/48'))) 8197db96d56Sopenharmony_ci # containee right of container 8207db96d56Sopenharmony_ci self.assertFalse( 8217db96d56Sopenharmony_ci self.factory('2000:bbb::/56').subnet_of( 8227db96d56Sopenharmony_ci self.factory('2000:aaa::/48'))) 8237db96d56Sopenharmony_ci # containee larger than container 8247db96d56Sopenharmony_ci self.assertFalse( 8257db96d56Sopenharmony_ci self.factory('2000:aaa::/48').subnet_of( 8267db96d56Sopenharmony_ci self.factory('2000:aaa::/56'))) 8277db96d56Sopenharmony_ci 8287db96d56Sopenharmony_ci self.assertFalse( 8297db96d56Sopenharmony_ci self.factory('2000:999::%scope/56').subnet_of( 8307db96d56Sopenharmony_ci self.factory('2000:aaa::%scope/48'))) 8317db96d56Sopenharmony_ci self.assertTrue( 8327db96d56Sopenharmony_ci self.factory('2000:aaa::%scope/56').subnet_of( 8337db96d56Sopenharmony_ci self.factory('2000:aaa::%scope/48'))) 8347db96d56Sopenharmony_ci 8357db96d56Sopenharmony_ci def test_supernet_of(self): 8367db96d56Sopenharmony_ci # containee left of container 8377db96d56Sopenharmony_ci self.assertFalse( 8387db96d56Sopenharmony_ci self.factory('2000:999::/56').supernet_of( 8397db96d56Sopenharmony_ci self.factory('2000:aaa::/48'))) 8407db96d56Sopenharmony_ci # containee inside container 8417db96d56Sopenharmony_ci self.assertFalse( 8427db96d56Sopenharmony_ci self.factory('2000:aaa::/56').supernet_of( 8437db96d56Sopenharmony_ci self.factory('2000:aaa::/48'))) 8447db96d56Sopenharmony_ci # containee right of container 8457db96d56Sopenharmony_ci self.assertFalse( 8467db96d56Sopenharmony_ci self.factory('2000:bbb::/56').supernet_of( 8477db96d56Sopenharmony_ci self.factory('2000:aaa::/48'))) 8487db96d56Sopenharmony_ci # containee larger than container 8497db96d56Sopenharmony_ci self.assertTrue( 8507db96d56Sopenharmony_ci self.factory('2000:aaa::/48').supernet_of( 8517db96d56Sopenharmony_ci self.factory('2000:aaa::/56'))) 8527db96d56Sopenharmony_ci 8537db96d56Sopenharmony_ci 8547db96d56Sopenharmony_ciclass FactoryFunctionErrors(BaseTestCase): 8557db96d56Sopenharmony_ci 8567db96d56Sopenharmony_ci def assertFactoryError(self, factory, kind): 8577db96d56Sopenharmony_ci """Ensure a clean ValueError with the expected message""" 8587db96d56Sopenharmony_ci addr = "camelot" 8597db96d56Sopenharmony_ci msg = '%r does not appear to be an IPv4 or IPv6 %s' 8607db96d56Sopenharmony_ci with self.assertCleanError(ValueError, msg, addr, kind): 8617db96d56Sopenharmony_ci factory(addr) 8627db96d56Sopenharmony_ci 8637db96d56Sopenharmony_ci def test_ip_address(self): 8647db96d56Sopenharmony_ci self.assertFactoryError(ipaddress.ip_address, "address") 8657db96d56Sopenharmony_ci 8667db96d56Sopenharmony_ci def test_ip_interface(self): 8677db96d56Sopenharmony_ci self.assertFactoryError(ipaddress.ip_interface, "interface") 8687db96d56Sopenharmony_ci 8697db96d56Sopenharmony_ci def test_ip_network(self): 8707db96d56Sopenharmony_ci self.assertFactoryError(ipaddress.ip_network, "network") 8717db96d56Sopenharmony_ci 8727db96d56Sopenharmony_ci 8737db96d56Sopenharmony_ciclass ComparisonTests(unittest.TestCase): 8747db96d56Sopenharmony_ci 8757db96d56Sopenharmony_ci v4addr = ipaddress.IPv4Address(1) 8767db96d56Sopenharmony_ci v4net = ipaddress.IPv4Network(1) 8777db96d56Sopenharmony_ci v4intf = ipaddress.IPv4Interface(1) 8787db96d56Sopenharmony_ci v6addr = ipaddress.IPv6Address(1) 8797db96d56Sopenharmony_ci v6net = ipaddress.IPv6Network(1) 8807db96d56Sopenharmony_ci v6intf = ipaddress.IPv6Interface(1) 8817db96d56Sopenharmony_ci v6addr_scoped = ipaddress.IPv6Address('::1%scope') 8827db96d56Sopenharmony_ci v6net_scoped= ipaddress.IPv6Network('::1%scope') 8837db96d56Sopenharmony_ci v6intf_scoped= ipaddress.IPv6Interface('::1%scope') 8847db96d56Sopenharmony_ci 8857db96d56Sopenharmony_ci v4_addresses = [v4addr, v4intf] 8867db96d56Sopenharmony_ci v4_objects = v4_addresses + [v4net] 8877db96d56Sopenharmony_ci v6_addresses = [v6addr, v6intf] 8887db96d56Sopenharmony_ci v6_objects = v6_addresses + [v6net] 8897db96d56Sopenharmony_ci v6_scoped_addresses = [v6addr_scoped, v6intf_scoped] 8907db96d56Sopenharmony_ci v6_scoped_objects = v6_scoped_addresses + [v6net_scoped] 8917db96d56Sopenharmony_ci 8927db96d56Sopenharmony_ci objects = v4_objects + v6_objects 8937db96d56Sopenharmony_ci objects_with_scoped = objects + v6_scoped_objects 8947db96d56Sopenharmony_ci 8957db96d56Sopenharmony_ci v4addr2 = ipaddress.IPv4Address(2) 8967db96d56Sopenharmony_ci v4net2 = ipaddress.IPv4Network(2) 8977db96d56Sopenharmony_ci v4intf2 = ipaddress.IPv4Interface(2) 8987db96d56Sopenharmony_ci v6addr2 = ipaddress.IPv6Address(2) 8997db96d56Sopenharmony_ci v6net2 = ipaddress.IPv6Network(2) 9007db96d56Sopenharmony_ci v6intf2 = ipaddress.IPv6Interface(2) 9017db96d56Sopenharmony_ci v6addr2_scoped = ipaddress.IPv6Address('::2%scope') 9027db96d56Sopenharmony_ci v6net2_scoped = ipaddress.IPv6Network('::2%scope') 9037db96d56Sopenharmony_ci v6intf2_scoped = ipaddress.IPv6Interface('::2%scope') 9047db96d56Sopenharmony_ci 9057db96d56Sopenharmony_ci def test_foreign_type_equality(self): 9067db96d56Sopenharmony_ci # __eq__ should never raise TypeError directly 9077db96d56Sopenharmony_ci other = object() 9087db96d56Sopenharmony_ci for obj in self.objects_with_scoped: 9097db96d56Sopenharmony_ci self.assertNotEqual(obj, other) 9107db96d56Sopenharmony_ci self.assertFalse(obj == other) 9117db96d56Sopenharmony_ci self.assertEqual(obj.__eq__(other), NotImplemented) 9127db96d56Sopenharmony_ci self.assertEqual(obj.__ne__(other), NotImplemented) 9137db96d56Sopenharmony_ci 9147db96d56Sopenharmony_ci def test_mixed_type_equality(self): 9157db96d56Sopenharmony_ci # Ensure none of the internal objects accidentally 9167db96d56Sopenharmony_ci # expose the right set of attributes to become "equal" 9177db96d56Sopenharmony_ci for lhs in self.objects: 9187db96d56Sopenharmony_ci for rhs in self.objects: 9197db96d56Sopenharmony_ci if lhs is rhs: 9207db96d56Sopenharmony_ci continue 9217db96d56Sopenharmony_ci self.assertNotEqual(lhs, rhs) 9227db96d56Sopenharmony_ci 9237db96d56Sopenharmony_ci def test_scoped_ipv6_equality(self): 9247db96d56Sopenharmony_ci for lhs, rhs in zip(self.v6_objects, self.v6_scoped_objects): 9257db96d56Sopenharmony_ci self.assertNotEqual(lhs, rhs) 9267db96d56Sopenharmony_ci 9277db96d56Sopenharmony_ci def test_v4_with_v6_scoped_equality(self): 9287db96d56Sopenharmony_ci for lhs in self.v4_objects: 9297db96d56Sopenharmony_ci for rhs in self.v6_scoped_objects: 9307db96d56Sopenharmony_ci self.assertNotEqual(lhs, rhs) 9317db96d56Sopenharmony_ci 9327db96d56Sopenharmony_ci def test_same_type_equality(self): 9337db96d56Sopenharmony_ci for obj in self.objects_with_scoped: 9347db96d56Sopenharmony_ci self.assertEqual(obj, obj) 9357db96d56Sopenharmony_ci self.assertLessEqual(obj, obj) 9367db96d56Sopenharmony_ci self.assertGreaterEqual(obj, obj) 9377db96d56Sopenharmony_ci 9387db96d56Sopenharmony_ci def test_same_type_ordering(self): 9397db96d56Sopenharmony_ci for lhs, rhs in ( 9407db96d56Sopenharmony_ci (self.v4addr, self.v4addr2), 9417db96d56Sopenharmony_ci (self.v4net, self.v4net2), 9427db96d56Sopenharmony_ci (self.v4intf, self.v4intf2), 9437db96d56Sopenharmony_ci (self.v6addr, self.v6addr2), 9447db96d56Sopenharmony_ci (self.v6net, self.v6net2), 9457db96d56Sopenharmony_ci (self.v6intf, self.v6intf2), 9467db96d56Sopenharmony_ci (self.v6addr_scoped, self.v6addr2_scoped), 9477db96d56Sopenharmony_ci (self.v6net_scoped, self.v6net2_scoped), 9487db96d56Sopenharmony_ci (self.v6intf_scoped, self.v6intf2_scoped), 9497db96d56Sopenharmony_ci ): 9507db96d56Sopenharmony_ci self.assertNotEqual(lhs, rhs) 9517db96d56Sopenharmony_ci self.assertLess(lhs, rhs) 9527db96d56Sopenharmony_ci self.assertLessEqual(lhs, rhs) 9537db96d56Sopenharmony_ci self.assertGreater(rhs, lhs) 9547db96d56Sopenharmony_ci self.assertGreaterEqual(rhs, lhs) 9557db96d56Sopenharmony_ci self.assertFalse(lhs > rhs) 9567db96d56Sopenharmony_ci self.assertFalse(rhs < lhs) 9577db96d56Sopenharmony_ci self.assertFalse(lhs >= rhs) 9587db96d56Sopenharmony_ci self.assertFalse(rhs <= lhs) 9597db96d56Sopenharmony_ci 9607db96d56Sopenharmony_ci def test_containment(self): 9617db96d56Sopenharmony_ci for obj in self.v4_addresses: 9627db96d56Sopenharmony_ci self.assertIn(obj, self.v4net) 9637db96d56Sopenharmony_ci for obj in self.v6_addresses + self.v6_scoped_addresses: 9647db96d56Sopenharmony_ci self.assertIn(obj, self.v6net) 9657db96d56Sopenharmony_ci for obj in self.v6_addresses + self.v6_scoped_addresses: 9667db96d56Sopenharmony_ci self.assertIn(obj, self.v6net_scoped) 9677db96d56Sopenharmony_ci 9687db96d56Sopenharmony_ci for obj in self.v4_objects + [self.v6net, self.v6net_scoped]: 9697db96d56Sopenharmony_ci self.assertNotIn(obj, self.v6net) 9707db96d56Sopenharmony_ci for obj in self.v4_objects + [self.v6net, self.v6net_scoped]: 9717db96d56Sopenharmony_ci self.assertNotIn(obj, self.v6net_scoped) 9727db96d56Sopenharmony_ci for obj in self.v6_objects + self.v6_scoped_objects + [self.v4net]: 9737db96d56Sopenharmony_ci self.assertNotIn(obj, self.v4net) 9747db96d56Sopenharmony_ci 9757db96d56Sopenharmony_ci def test_mixed_type_ordering(self): 9767db96d56Sopenharmony_ci for lhs in self.objects_with_scoped: 9777db96d56Sopenharmony_ci for rhs in self.objects_with_scoped: 9787db96d56Sopenharmony_ci if isinstance(lhs, type(rhs)) or isinstance(rhs, type(lhs)): 9797db96d56Sopenharmony_ci continue 9807db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: lhs < rhs) 9817db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: lhs > rhs) 9827db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: lhs <= rhs) 9837db96d56Sopenharmony_ci self.assertRaises(TypeError, lambda: lhs >= rhs) 9847db96d56Sopenharmony_ci 9857db96d56Sopenharmony_ci def test_foreign_type_ordering(self): 9867db96d56Sopenharmony_ci other = object() 9877db96d56Sopenharmony_ci for obj in self.objects_with_scoped: 9887db96d56Sopenharmony_ci with self.assertRaises(TypeError): 9897db96d56Sopenharmony_ci obj < other 9907db96d56Sopenharmony_ci with self.assertRaises(TypeError): 9917db96d56Sopenharmony_ci obj > other 9927db96d56Sopenharmony_ci with self.assertRaises(TypeError): 9937db96d56Sopenharmony_ci obj <= other 9947db96d56Sopenharmony_ci with self.assertRaises(TypeError): 9957db96d56Sopenharmony_ci obj >= other 9967db96d56Sopenharmony_ci self.assertTrue(obj < LARGEST) 9977db96d56Sopenharmony_ci self.assertFalse(obj > LARGEST) 9987db96d56Sopenharmony_ci self.assertTrue(obj <= LARGEST) 9997db96d56Sopenharmony_ci self.assertFalse(obj >= LARGEST) 10007db96d56Sopenharmony_ci self.assertFalse(obj < SMALLEST) 10017db96d56Sopenharmony_ci self.assertTrue(obj > SMALLEST) 10027db96d56Sopenharmony_ci self.assertFalse(obj <= SMALLEST) 10037db96d56Sopenharmony_ci self.assertTrue(obj >= SMALLEST) 10047db96d56Sopenharmony_ci 10057db96d56Sopenharmony_ci def test_mixed_type_key(self): 10067db96d56Sopenharmony_ci # with get_mixed_type_key, you can sort addresses and network. 10077db96d56Sopenharmony_ci v4_ordered = [self.v4addr, self.v4net, self.v4intf] 10087db96d56Sopenharmony_ci v6_ordered = [self.v6addr, self.v6net, self.v6intf] 10097db96d56Sopenharmony_ci v6_scoped_ordered = [self.v6addr_scoped, self.v6net_scoped, self.v6intf_scoped] 10107db96d56Sopenharmony_ci self.assertEqual(v4_ordered, 10117db96d56Sopenharmony_ci sorted(self.v4_objects, 10127db96d56Sopenharmony_ci key=ipaddress.get_mixed_type_key)) 10137db96d56Sopenharmony_ci self.assertEqual(v6_ordered, 10147db96d56Sopenharmony_ci sorted(self.v6_objects, 10157db96d56Sopenharmony_ci key=ipaddress.get_mixed_type_key)) 10167db96d56Sopenharmony_ci self.assertEqual(v6_scoped_ordered, 10177db96d56Sopenharmony_ci sorted(self.v6_scoped_objects, 10187db96d56Sopenharmony_ci key=ipaddress.get_mixed_type_key)) 10197db96d56Sopenharmony_ci self.assertEqual(v4_ordered + v6_scoped_ordered, 10207db96d56Sopenharmony_ci sorted(self.v4_objects + self.v6_scoped_objects, 10217db96d56Sopenharmony_ci key=ipaddress.get_mixed_type_key)) 10227db96d56Sopenharmony_ci self.assertEqual(NotImplemented, ipaddress.get_mixed_type_key(object)) 10237db96d56Sopenharmony_ci 10247db96d56Sopenharmony_ci def test_incompatible_versions(self): 10257db96d56Sopenharmony_ci # These should always raise TypeError 10267db96d56Sopenharmony_ci v4addr = ipaddress.ip_address('1.1.1.1') 10277db96d56Sopenharmony_ci v4net = ipaddress.ip_network('1.1.1.1') 10287db96d56Sopenharmony_ci v6addr = ipaddress.ip_address('::1') 10297db96d56Sopenharmony_ci v6net = ipaddress.ip_network('::1') 10307db96d56Sopenharmony_ci v6addr_scoped = ipaddress.ip_address('::1%scope') 10317db96d56Sopenharmony_ci v6net_scoped = ipaddress.ip_network('::1%scope') 10327db96d56Sopenharmony_ci 10337db96d56Sopenharmony_ci self.assertRaises(TypeError, v4addr.__lt__, v6addr) 10347db96d56Sopenharmony_ci self.assertRaises(TypeError, v4addr.__gt__, v6addr) 10357db96d56Sopenharmony_ci self.assertRaises(TypeError, v4net.__lt__, v6net) 10367db96d56Sopenharmony_ci self.assertRaises(TypeError, v4net.__gt__, v6net) 10377db96d56Sopenharmony_ci 10387db96d56Sopenharmony_ci self.assertRaises(TypeError, v6addr.__lt__, v4addr) 10397db96d56Sopenharmony_ci self.assertRaises(TypeError, v6addr.__gt__, v4addr) 10407db96d56Sopenharmony_ci self.assertRaises(TypeError, v6net.__lt__, v4net) 10417db96d56Sopenharmony_ci self.assertRaises(TypeError, v6net.__gt__, v4net) 10427db96d56Sopenharmony_ci 10437db96d56Sopenharmony_ci self.assertRaises(TypeError, v4addr.__lt__, v6addr_scoped) 10447db96d56Sopenharmony_ci self.assertRaises(TypeError, v4addr.__gt__, v6addr_scoped) 10457db96d56Sopenharmony_ci self.assertRaises(TypeError, v4net.__lt__, v6net_scoped) 10467db96d56Sopenharmony_ci self.assertRaises(TypeError, v4net.__gt__, v6net_scoped) 10477db96d56Sopenharmony_ci 10487db96d56Sopenharmony_ci self.assertRaises(TypeError, v6addr_scoped.__lt__, v4addr) 10497db96d56Sopenharmony_ci self.assertRaises(TypeError, v6addr_scoped.__gt__, v4addr) 10507db96d56Sopenharmony_ci self.assertRaises(TypeError, v6net_scoped.__lt__, v4net) 10517db96d56Sopenharmony_ci self.assertRaises(TypeError, v6net_scoped.__gt__, v4net) 10527db96d56Sopenharmony_ci 10537db96d56Sopenharmony_ci 10547db96d56Sopenharmony_ciclass IpaddrUnitTest(unittest.TestCase): 10557db96d56Sopenharmony_ci 10567db96d56Sopenharmony_ci def setUp(self): 10577db96d56Sopenharmony_ci self.ipv4_address = ipaddress.IPv4Address('1.2.3.4') 10587db96d56Sopenharmony_ci self.ipv4_interface = ipaddress.IPv4Interface('1.2.3.4/24') 10597db96d56Sopenharmony_ci self.ipv4_network = ipaddress.IPv4Network('1.2.3.0/24') 10607db96d56Sopenharmony_ci #self.ipv4_hostmask = ipaddress.IPv4Interface('10.0.0.1/0.255.255.255') 10617db96d56Sopenharmony_ci self.ipv6_address = ipaddress.IPv6Interface( 10627db96d56Sopenharmony_ci '2001:658:22a:cafe:200:0:0:1') 10637db96d56Sopenharmony_ci self.ipv6_interface = ipaddress.IPv6Interface( 10647db96d56Sopenharmony_ci '2001:658:22a:cafe:200:0:0:1/64') 10657db96d56Sopenharmony_ci self.ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/64') 10667db96d56Sopenharmony_ci self.ipv6_scoped_address = ipaddress.IPv6Interface( 10677db96d56Sopenharmony_ci '2001:658:22a:cafe:200:0:0:1%scope') 10687db96d56Sopenharmony_ci self.ipv6_scoped_interface = ipaddress.IPv6Interface( 10697db96d56Sopenharmony_ci '2001:658:22a:cafe:200:0:0:1%scope/64') 10707db96d56Sopenharmony_ci self.ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/64') 10717db96d56Sopenharmony_ci 10727db96d56Sopenharmony_ci def testRepr(self): 10737db96d56Sopenharmony_ci self.assertEqual("IPv4Interface('1.2.3.4/32')", 10747db96d56Sopenharmony_ci repr(ipaddress.IPv4Interface('1.2.3.4'))) 10757db96d56Sopenharmony_ci self.assertEqual("IPv6Interface('::1/128')", 10767db96d56Sopenharmony_ci repr(ipaddress.IPv6Interface('::1'))) 10777db96d56Sopenharmony_ci self.assertEqual("IPv6Interface('::1%scope/128')", 10787db96d56Sopenharmony_ci repr(ipaddress.IPv6Interface('::1%scope'))) 10797db96d56Sopenharmony_ci 10807db96d56Sopenharmony_ci # issue #16531: constructing IPv4Network from an (address, mask) tuple 10817db96d56Sopenharmony_ci def testIPv4Tuple(self): 10827db96d56Sopenharmony_ci # /32 10837db96d56Sopenharmony_ci ip = ipaddress.IPv4Address('192.0.2.1') 10847db96d56Sopenharmony_ci net = ipaddress.IPv4Network('192.0.2.1/32') 10857db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 32)), net) 10867db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((ip, 32)), net) 10877db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((3221225985, 32)), net) 10887db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 10897db96d56Sopenharmony_ci '255.255.255.255')), net) 10907db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((ip, 10917db96d56Sopenharmony_ci '255.255.255.255')), net) 10927db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((3221225985, 10937db96d56Sopenharmony_ci '255.255.255.255')), net) 10947db96d56Sopenharmony_ci # strict=True and host bits set 10957db96d56Sopenharmony_ci with self.assertRaises(ValueError): 10967db96d56Sopenharmony_ci ipaddress.IPv4Network(('192.0.2.1', 24)) 10977db96d56Sopenharmony_ci with self.assertRaises(ValueError): 10987db96d56Sopenharmony_ci ipaddress.IPv4Network((ip, 24)) 10997db96d56Sopenharmony_ci with self.assertRaises(ValueError): 11007db96d56Sopenharmony_ci ipaddress.IPv4Network((3221225985, 24)) 11017db96d56Sopenharmony_ci with self.assertRaises(ValueError): 11027db96d56Sopenharmony_ci ipaddress.IPv4Network(('192.0.2.1', '255.255.255.0')) 11037db96d56Sopenharmony_ci with self.assertRaises(ValueError): 11047db96d56Sopenharmony_ci ipaddress.IPv4Network((ip, '255.255.255.0')) 11057db96d56Sopenharmony_ci with self.assertRaises(ValueError): 11067db96d56Sopenharmony_ci ipaddress.IPv4Network((3221225985, '255.255.255.0')) 11077db96d56Sopenharmony_ci # strict=False and host bits set 11087db96d56Sopenharmony_ci net = ipaddress.IPv4Network('192.0.2.0/24') 11097db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 24), 11107db96d56Sopenharmony_ci strict=False), net) 11117db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((ip, 24), 11127db96d56Sopenharmony_ci strict=False), net) 11137db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((3221225985, 24), 11147db96d56Sopenharmony_ci strict=False), net) 11157db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network(('192.0.2.1', 11167db96d56Sopenharmony_ci '255.255.255.0'), 11177db96d56Sopenharmony_ci strict=False), net) 11187db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((ip, 11197db96d56Sopenharmony_ci '255.255.255.0'), 11207db96d56Sopenharmony_ci strict=False), net) 11217db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((3221225985, 11227db96d56Sopenharmony_ci '255.255.255.0'), 11237db96d56Sopenharmony_ci strict=False), net) 11247db96d56Sopenharmony_ci 11257db96d56Sopenharmony_ci # /24 11267db96d56Sopenharmony_ci ip = ipaddress.IPv4Address('192.0.2.0') 11277db96d56Sopenharmony_ci net = ipaddress.IPv4Network('192.0.2.0/24') 11287db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 11297db96d56Sopenharmony_ci '255.255.255.0')), net) 11307db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((ip, 11317db96d56Sopenharmony_ci '255.255.255.0')), net) 11327db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((3221225984, 11337db96d56Sopenharmony_ci '255.255.255.0')), net) 11347db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network(('192.0.2.0', 24)), net) 11357db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((ip, 24)), net) 11367db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network((3221225984, 24)), net) 11377db96d56Sopenharmony_ci 11387db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Interface(('192.0.2.1', 24)), 11397db96d56Sopenharmony_ci ipaddress.IPv4Interface('192.0.2.1/24')) 11407db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Interface((3221225985, 24)), 11417db96d56Sopenharmony_ci ipaddress.IPv4Interface('192.0.2.1/24')) 11427db96d56Sopenharmony_ci 11437db96d56Sopenharmony_ci # Invalid netmask 11447db96d56Sopenharmony_ci with self.assertRaises(ValueError): 11457db96d56Sopenharmony_ci ipaddress.IPv4Network(('192.0.2.1', '255.255.255.255.0')) 11467db96d56Sopenharmony_ci 11477db96d56Sopenharmony_ci # Invalid netmask using factory 11487db96d56Sopenharmony_ci with self.assertRaises(ValueError): 11497db96d56Sopenharmony_ci ipaddress.ip_network(('192.0.2.1', '255.255.255.255.0')) 11507db96d56Sopenharmony_ci 11517db96d56Sopenharmony_ci # issue #16531: constructing IPv6Network from an (address, mask) tuple 11527db96d56Sopenharmony_ci def testIPv6Tuple(self): 11537db96d56Sopenharmony_ci # /128 11547db96d56Sopenharmony_ci ip = ipaddress.IPv6Address('2001:db8::') 11557db96d56Sopenharmony_ci net = ipaddress.IPv6Network('2001:db8::/128') 11567db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '128')), 11577db96d56Sopenharmony_ci net) 11587db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Network( 11597db96d56Sopenharmony_ci (42540766411282592856903984951653826560, 128)), 11607db96d56Sopenharmony_ci net) 11617db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Network((ip, '128')), 11627db96d56Sopenharmony_ci net) 11637db96d56Sopenharmony_ci ip = ipaddress.IPv6Address('2001:db8::') 11647db96d56Sopenharmony_ci net = ipaddress.IPv6Network('2001:db8::/96') 11657db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Network(('2001:db8::', '96')), 11667db96d56Sopenharmony_ci net) 11677db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Network( 11687db96d56Sopenharmony_ci (42540766411282592856903984951653826560, 96)), 11697db96d56Sopenharmony_ci net) 11707db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Network((ip, '96')), 11717db96d56Sopenharmony_ci net) 11727db96d56Sopenharmony_ci 11737db96d56Sopenharmony_ci ip_scoped = ipaddress.IPv6Address('2001:db8::%scope') 11747db96d56Sopenharmony_ci 11757db96d56Sopenharmony_ci # strict=True and host bits set 11767db96d56Sopenharmony_ci ip = ipaddress.IPv6Address('2001:db8::1') 11777db96d56Sopenharmony_ci with self.assertRaises(ValueError): 11787db96d56Sopenharmony_ci ipaddress.IPv6Network(('2001:db8::1', 96)) 11797db96d56Sopenharmony_ci with self.assertRaises(ValueError): 11807db96d56Sopenharmony_ci ipaddress.IPv6Network(( 11817db96d56Sopenharmony_ci 42540766411282592856903984951653826561, 96)) 11827db96d56Sopenharmony_ci with self.assertRaises(ValueError): 11837db96d56Sopenharmony_ci ipaddress.IPv6Network((ip, 96)) 11847db96d56Sopenharmony_ci # strict=False and host bits set 11857db96d56Sopenharmony_ci net = ipaddress.IPv6Network('2001:db8::/96') 11867db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Network(('2001:db8::1', 96), 11877db96d56Sopenharmony_ci strict=False), 11887db96d56Sopenharmony_ci net) 11897db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Network( 11907db96d56Sopenharmony_ci (42540766411282592856903984951653826561, 96), 11917db96d56Sopenharmony_ci strict=False), 11927db96d56Sopenharmony_ci net) 11937db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Network((ip, 96), strict=False), 11947db96d56Sopenharmony_ci net) 11957db96d56Sopenharmony_ci 11967db96d56Sopenharmony_ci # /96 11977db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Interface(('2001:db8::1', '96')), 11987db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:db8::1/96')) 11997db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Interface( 12007db96d56Sopenharmony_ci (42540766411282592856903984951653826561, '96')), 12017db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:db8::1/96')) 12027db96d56Sopenharmony_ci 12037db96d56Sopenharmony_ci ip_scoped = ipaddress.IPv6Address('2001:db8::1%scope') 12047db96d56Sopenharmony_ci with self.assertRaises(ValueError): 12057db96d56Sopenharmony_ci ipaddress.IPv6Network(('2001:db8::1%scope', 96)) 12067db96d56Sopenharmony_ci with self.assertRaises(ValueError): 12077db96d56Sopenharmony_ci ipaddress.IPv6Network((ip_scoped, 96)) 12087db96d56Sopenharmony_ci # strict=False and host bits set 12097db96d56Sopenharmony_ci 12107db96d56Sopenharmony_ci # Invalid netmask 12117db96d56Sopenharmony_ci with self.assertRaises(ValueError): 12127db96d56Sopenharmony_ci ipaddress.IPv6Network(('2001:db8::1', '255.255.255.0')) 12137db96d56Sopenharmony_ci 12147db96d56Sopenharmony_ci # Invalid netmask using factory 12157db96d56Sopenharmony_ci with self.assertRaises(ValueError): 12167db96d56Sopenharmony_ci ipaddress.ip_network(('2001:db8::1', '255.255.255.0')) 12177db96d56Sopenharmony_ci 12187db96d56Sopenharmony_ci # issue57 12197db96d56Sopenharmony_ci def testAddressIntMath(self): 12207db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Address('1.1.1.1') + 255, 12217db96d56Sopenharmony_ci ipaddress.IPv4Address('1.1.2.0')) 12227db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Address('1.1.1.1') - 256, 12237db96d56Sopenharmony_ci ipaddress.IPv4Address('1.1.0.1')) 12247db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Address('::1') + (2**16 - 2), 12257db96d56Sopenharmony_ci ipaddress.IPv6Address('::ffff')) 12267db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Address('::ffff') - (2**16 - 2), 12277db96d56Sopenharmony_ci ipaddress.IPv6Address('::1')) 12287db96d56Sopenharmony_ci self.assertNotEqual(ipaddress.IPv6Address('::1%scope') + (2**16 - 2), 12297db96d56Sopenharmony_ci ipaddress.IPv6Address('::ffff%scope')) 12307db96d56Sopenharmony_ci self.assertNotEqual(ipaddress.IPv6Address('::ffff%scope') - (2**16 - 2), 12317db96d56Sopenharmony_ci ipaddress.IPv6Address('::1%scope')) 12327db96d56Sopenharmony_ci 12337db96d56Sopenharmony_ci def testInvalidIntToBytes(self): 12347db96d56Sopenharmony_ci self.assertRaises(ValueError, ipaddress.v4_int_to_packed, -1) 12357db96d56Sopenharmony_ci self.assertRaises(ValueError, ipaddress.v4_int_to_packed, 12367db96d56Sopenharmony_ci 2 ** ipaddress.IPV4LENGTH) 12377db96d56Sopenharmony_ci self.assertRaises(ValueError, ipaddress.v6_int_to_packed, -1) 12387db96d56Sopenharmony_ci self.assertRaises(ValueError, ipaddress.v6_int_to_packed, 12397db96d56Sopenharmony_ci 2 ** ipaddress.IPV6LENGTH) 12407db96d56Sopenharmony_ci 12417db96d56Sopenharmony_ci def testInternals(self): 12427db96d56Sopenharmony_ci ip1 = ipaddress.IPv4Address('10.10.10.10') 12437db96d56Sopenharmony_ci ip2 = ipaddress.IPv4Address('10.10.10.11') 12447db96d56Sopenharmony_ci ip3 = ipaddress.IPv4Address('10.10.10.12') 12457db96d56Sopenharmony_ci self.assertEqual(list(ipaddress._find_address_range([ip1])), 12467db96d56Sopenharmony_ci [(ip1, ip1)]) 12477db96d56Sopenharmony_ci self.assertEqual(list(ipaddress._find_address_range([ip1, ip3])), 12487db96d56Sopenharmony_ci [(ip1, ip1), (ip3, ip3)]) 12497db96d56Sopenharmony_ci self.assertEqual(list(ipaddress._find_address_range([ip1, ip2, ip3])), 12507db96d56Sopenharmony_ci [(ip1, ip3)]) 12517db96d56Sopenharmony_ci self.assertEqual(128, ipaddress._count_righthand_zero_bits(0, 128)) 12527db96d56Sopenharmony_ci self.assertEqual("IPv4Network('1.2.3.0/24')", repr(self.ipv4_network)) 12537db96d56Sopenharmony_ci 12547db96d56Sopenharmony_ci def testGetNetwork(self): 12557db96d56Sopenharmony_ci self.assertEqual(int(self.ipv4_network.network_address), 16909056) 12567db96d56Sopenharmony_ci self.assertEqual(str(self.ipv4_network.network_address), '1.2.3.0') 12577db96d56Sopenharmony_ci 12587db96d56Sopenharmony_ci self.assertEqual(int(self.ipv6_network.network_address), 12597db96d56Sopenharmony_ci 42540616829182469433403647294022090752) 12607db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_network.network_address), 12617db96d56Sopenharmony_ci '2001:658:22a:cafe::') 12627db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_network.hostmask), 12637db96d56Sopenharmony_ci '::ffff:ffff:ffff:ffff') 12647db96d56Sopenharmony_ci self.assertEqual(int(self.ipv6_scoped_network.network_address), 12657db96d56Sopenharmony_ci 42540616829182469433403647294022090752) 12667db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_scoped_network.network_address), 12677db96d56Sopenharmony_ci '2001:658:22a:cafe::%scope') 12687db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_scoped_network.hostmask), 12697db96d56Sopenharmony_ci '::ffff:ffff:ffff:ffff') 12707db96d56Sopenharmony_ci 12717db96d56Sopenharmony_ci def testIpFromInt(self): 12727db96d56Sopenharmony_ci self.assertEqual(self.ipv4_interface._ip, 12737db96d56Sopenharmony_ci ipaddress.IPv4Interface(16909060)._ip) 12747db96d56Sopenharmony_ci 12757db96d56Sopenharmony_ci ipv4 = ipaddress.ip_network('1.2.3.4') 12767db96d56Sopenharmony_ci ipv6 = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1') 12777db96d56Sopenharmony_ci ipv6_scoped = ipaddress.ip_network('2001:658:22a:cafe:200:0:0:1%scope') 12787db96d56Sopenharmony_ci self.assertEqual(ipv4, ipaddress.ip_network(int(ipv4.network_address))) 12797db96d56Sopenharmony_ci self.assertEqual(ipv6, ipaddress.ip_network(int(ipv6.network_address))) 12807db96d56Sopenharmony_ci self.assertNotEqual(ipv6_scoped, ipaddress.ip_network(int(ipv6_scoped.network_address))) 12817db96d56Sopenharmony_ci 12827db96d56Sopenharmony_ci v6_int = 42540616829182469433547762482097946625 12837db96d56Sopenharmony_ci self.assertEqual(self.ipv6_interface._ip, 12847db96d56Sopenharmony_ci ipaddress.IPv6Interface(v6_int)._ip) 12857db96d56Sopenharmony_ci self.assertEqual(self.ipv6_scoped_interface._ip, 12867db96d56Sopenharmony_ci ipaddress.IPv6Interface(v6_int)._ip) 12877db96d56Sopenharmony_ci 12887db96d56Sopenharmony_ci self.assertEqual(ipaddress.ip_network(self.ipv4_address._ip).version, 12897db96d56Sopenharmony_ci 4) 12907db96d56Sopenharmony_ci self.assertEqual(ipaddress.ip_network(self.ipv6_address._ip).version, 12917db96d56Sopenharmony_ci 6) 12927db96d56Sopenharmony_ci self.assertEqual(ipaddress.ip_network(self.ipv6_scoped_address._ip).version, 12937db96d56Sopenharmony_ci 6) 12947db96d56Sopenharmony_ci 12957db96d56Sopenharmony_ci def testIpFromPacked(self): 12967db96d56Sopenharmony_ci address = ipaddress.ip_address 12977db96d56Sopenharmony_ci self.assertEqual(self.ipv4_interface._ip, 12987db96d56Sopenharmony_ci ipaddress.ip_interface(b'\x01\x02\x03\x04')._ip) 12997db96d56Sopenharmony_ci self.assertEqual(address('255.254.253.252'), 13007db96d56Sopenharmony_ci address(b'\xff\xfe\xfd\xfc')) 13017db96d56Sopenharmony_ci self.assertEqual(self.ipv6_interface.ip, 13027db96d56Sopenharmony_ci ipaddress.ip_interface( 13037db96d56Sopenharmony_ci b'\x20\x01\x06\x58\x02\x2a\xca\xfe' 13047db96d56Sopenharmony_ci b'\x02\x00\x00\x00\x00\x00\x00\x01').ip) 13057db96d56Sopenharmony_ci self.assertEqual(address('ffff:2:3:4:ffff::'), 13067db96d56Sopenharmony_ci address(b'\xff\xff\x00\x02\x00\x03\x00\x04' + 13077db96d56Sopenharmony_ci b'\xff\xff' + b'\x00' * 6)) 13087db96d56Sopenharmony_ci self.assertEqual(address('::'), 13097db96d56Sopenharmony_ci address(b'\x00' * 16)) 13107db96d56Sopenharmony_ci 13117db96d56Sopenharmony_ci def testGetIp(self): 13127db96d56Sopenharmony_ci self.assertEqual(int(self.ipv4_interface.ip), 16909060) 13137db96d56Sopenharmony_ci self.assertEqual(str(self.ipv4_interface.ip), '1.2.3.4') 13147db96d56Sopenharmony_ci 13157db96d56Sopenharmony_ci self.assertEqual(int(self.ipv6_interface.ip), 13167db96d56Sopenharmony_ci 42540616829182469433547762482097946625) 13177db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_interface.ip), 13187db96d56Sopenharmony_ci '2001:658:22a:cafe:200::1') 13197db96d56Sopenharmony_ci self.assertEqual(int(self.ipv6_scoped_interface.ip), 13207db96d56Sopenharmony_ci 42540616829182469433547762482097946625) 13217db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_scoped_interface.ip), 13227db96d56Sopenharmony_ci '2001:658:22a:cafe:200::1') 13237db96d56Sopenharmony_ci 13247db96d56Sopenharmony_ci def testGetScopeId(self): 13257db96d56Sopenharmony_ci self.assertEqual(self.ipv6_address.scope_id, 13267db96d56Sopenharmony_ci None) 13277db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_scoped_address.scope_id), 13287db96d56Sopenharmony_ci 'scope') 13297db96d56Sopenharmony_ci self.assertEqual(self.ipv6_interface.scope_id, 13307db96d56Sopenharmony_ci None) 13317db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_scoped_interface.scope_id), 13327db96d56Sopenharmony_ci 'scope') 13337db96d56Sopenharmony_ci self.assertEqual(self.ipv6_network.network_address.scope_id, 13347db96d56Sopenharmony_ci None) 13357db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_scoped_network.network_address.scope_id), 13367db96d56Sopenharmony_ci 'scope') 13377db96d56Sopenharmony_ci 13387db96d56Sopenharmony_ci def testGetNetmask(self): 13397db96d56Sopenharmony_ci self.assertEqual(int(self.ipv4_network.netmask), 4294967040) 13407db96d56Sopenharmony_ci self.assertEqual(str(self.ipv4_network.netmask), '255.255.255.0') 13417db96d56Sopenharmony_ci self.assertEqual(int(self.ipv6_network.netmask), 13427db96d56Sopenharmony_ci 340282366920938463444927863358058659840) 13437db96d56Sopenharmony_ci self.assertEqual(self.ipv6_network.prefixlen, 64) 13447db96d56Sopenharmony_ci self.assertEqual(int(self.ipv6_scoped_network.netmask), 13457db96d56Sopenharmony_ci 340282366920938463444927863358058659840) 13467db96d56Sopenharmony_ci self.assertEqual(self.ipv6_scoped_network.prefixlen, 64) 13477db96d56Sopenharmony_ci 13487db96d56Sopenharmony_ci def testZeroNetmask(self): 13497db96d56Sopenharmony_ci ipv4_zero_netmask = ipaddress.IPv4Interface('1.2.3.4/0') 13507db96d56Sopenharmony_ci self.assertEqual(int(ipv4_zero_netmask.network.netmask), 0) 13517db96d56Sopenharmony_ci self.assertEqual(ipv4_zero_netmask._prefix_from_prefix_string('0'), 0) 13527db96d56Sopenharmony_ci 13537db96d56Sopenharmony_ci ipv6_zero_netmask = ipaddress.IPv6Interface('::1/0') 13547db96d56Sopenharmony_ci self.assertEqual(int(ipv6_zero_netmask.network.netmask), 0) 13557db96d56Sopenharmony_ci self.assertEqual(ipv6_zero_netmask._prefix_from_prefix_string('0'), 0) 13567db96d56Sopenharmony_ci 13577db96d56Sopenharmony_ci ipv6_scoped_zero_netmask = ipaddress.IPv6Interface('::1%scope/0') 13587db96d56Sopenharmony_ci self.assertEqual(int(ipv6_scoped_zero_netmask.network.netmask), 0) 13597db96d56Sopenharmony_ci self.assertEqual(ipv6_scoped_zero_netmask._prefix_from_prefix_string('0'), 0) 13607db96d56Sopenharmony_ci 13617db96d56Sopenharmony_ci def testIPv4Net(self): 13627db96d56Sopenharmony_ci net = ipaddress.IPv4Network('127.0.0.0/0.0.0.255') 13637db96d56Sopenharmony_ci self.assertEqual(net.prefixlen, 24) 13647db96d56Sopenharmony_ci 13657db96d56Sopenharmony_ci def testGetBroadcast(self): 13667db96d56Sopenharmony_ci self.assertEqual(int(self.ipv4_network.broadcast_address), 16909311) 13677db96d56Sopenharmony_ci self.assertEqual(str(self.ipv4_network.broadcast_address), '1.2.3.255') 13687db96d56Sopenharmony_ci 13697db96d56Sopenharmony_ci self.assertEqual(int(self.ipv6_network.broadcast_address), 13707db96d56Sopenharmony_ci 42540616829182469451850391367731642367) 13717db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_network.broadcast_address), 13727db96d56Sopenharmony_ci '2001:658:22a:cafe:ffff:ffff:ffff:ffff') 13737db96d56Sopenharmony_ci 13747db96d56Sopenharmony_ci self.assertEqual(int(self.ipv6_scoped_network.broadcast_address), 13757db96d56Sopenharmony_ci 42540616829182469451850391367731642367) 13767db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_scoped_network.broadcast_address), 13777db96d56Sopenharmony_ci '2001:658:22a:cafe:ffff:ffff:ffff:ffff') 13787db96d56Sopenharmony_ci 13797db96d56Sopenharmony_ci def testGetPrefixlen(self): 13807db96d56Sopenharmony_ci self.assertEqual(self.ipv4_interface.network.prefixlen, 24) 13817db96d56Sopenharmony_ci self.assertEqual(self.ipv6_interface.network.prefixlen, 64) 13827db96d56Sopenharmony_ci self.assertEqual(self.ipv6_scoped_interface.network.prefixlen, 64) 13837db96d56Sopenharmony_ci 13847db96d56Sopenharmony_ci def testGetSupernet(self): 13857db96d56Sopenharmony_ci self.assertEqual(self.ipv4_network.supernet().prefixlen, 23) 13867db96d56Sopenharmony_ci self.assertEqual(str(self.ipv4_network.supernet().network_address), 13877db96d56Sopenharmony_ci '1.2.2.0') 13887db96d56Sopenharmony_ci self.assertEqual( 13897db96d56Sopenharmony_ci ipaddress.IPv4Interface('0.0.0.0/0').network.supernet(), 13907db96d56Sopenharmony_ci ipaddress.IPv4Network('0.0.0.0/0')) 13917db96d56Sopenharmony_ci 13927db96d56Sopenharmony_ci self.assertEqual(self.ipv6_network.supernet().prefixlen, 63) 13937db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_network.supernet().network_address), 13947db96d56Sopenharmony_ci '2001:658:22a:cafe::') 13957db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Interface('::0/0').network.supernet(), 13967db96d56Sopenharmony_ci ipaddress.IPv6Network('::0/0')) 13977db96d56Sopenharmony_ci self.assertEqual(self.ipv6_scoped_network.supernet().prefixlen, 63) 13987db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_scoped_network.supernet().network_address), 13997db96d56Sopenharmony_ci '2001:658:22a:cafe::') 14007db96d56Sopenharmony_ci 14017db96d56Sopenharmony_ci def testGetSupernet3(self): 14027db96d56Sopenharmony_ci self.assertEqual(self.ipv4_network.supernet(3).prefixlen, 21) 14037db96d56Sopenharmony_ci self.assertEqual(str(self.ipv4_network.supernet(3).network_address), 14047db96d56Sopenharmony_ci '1.2.0.0') 14057db96d56Sopenharmony_ci 14067db96d56Sopenharmony_ci self.assertEqual(self.ipv6_network.supernet(3).prefixlen, 61) 14077db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_network.supernet(3).network_address), 14087db96d56Sopenharmony_ci '2001:658:22a:caf8::') 14097db96d56Sopenharmony_ci self.assertEqual(self.ipv6_scoped_network.supernet(3).prefixlen, 61) 14107db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_scoped_network.supernet(3).network_address), 14117db96d56Sopenharmony_ci '2001:658:22a:caf8::') 14127db96d56Sopenharmony_ci 14137db96d56Sopenharmony_ci def testGetSupernet4(self): 14147db96d56Sopenharmony_ci self.assertRaises(ValueError, self.ipv4_network.supernet, 14157db96d56Sopenharmony_ci prefixlen_diff=2, new_prefix=1) 14167db96d56Sopenharmony_ci self.assertRaises(ValueError, self.ipv4_network.supernet, 14177db96d56Sopenharmony_ci new_prefix=25) 14187db96d56Sopenharmony_ci self.assertEqual(self.ipv4_network.supernet(prefixlen_diff=2), 14197db96d56Sopenharmony_ci self.ipv4_network.supernet(new_prefix=22)) 14207db96d56Sopenharmony_ci 14217db96d56Sopenharmony_ci self.assertRaises(ValueError, self.ipv6_network.supernet, 14227db96d56Sopenharmony_ci prefixlen_diff=2, new_prefix=1) 14237db96d56Sopenharmony_ci self.assertRaises(ValueError, self.ipv6_network.supernet, 14247db96d56Sopenharmony_ci new_prefix=65) 14257db96d56Sopenharmony_ci self.assertEqual(self.ipv6_network.supernet(prefixlen_diff=2), 14267db96d56Sopenharmony_ci self.ipv6_network.supernet(new_prefix=62)) 14277db96d56Sopenharmony_ci self.assertRaises(ValueError, self.ipv6_scoped_network.supernet, 14287db96d56Sopenharmony_ci prefixlen_diff=2, new_prefix=1) 14297db96d56Sopenharmony_ci self.assertRaises(ValueError, self.ipv6_scoped_network.supernet, 14307db96d56Sopenharmony_ci new_prefix=65) 14317db96d56Sopenharmony_ci self.assertEqual(self.ipv6_scoped_network.supernet(prefixlen_diff=2), 14327db96d56Sopenharmony_ci self.ipv6_scoped_network.supernet(new_prefix=62)) 14337db96d56Sopenharmony_ci 14347db96d56Sopenharmony_ci def testHosts(self): 14357db96d56Sopenharmony_ci hosts = list(self.ipv4_network.hosts()) 14367db96d56Sopenharmony_ci self.assertEqual(254, len(hosts)) 14377db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Address('1.2.3.1'), hosts[0]) 14387db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Address('1.2.3.254'), hosts[-1]) 14397db96d56Sopenharmony_ci 14407db96d56Sopenharmony_ci ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120') 14417db96d56Sopenharmony_ci hosts = list(ipv6_network.hosts()) 14427db96d56Sopenharmony_ci self.assertEqual(255, len(hosts)) 14437db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0]) 14447db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1]) 14457db96d56Sopenharmony_ci 14467db96d56Sopenharmony_ci ipv6_scoped_network = ipaddress.IPv6Network('2001:658:22a:cafe::%scope/120') 14477db96d56Sopenharmony_ci hosts = list(ipv6_scoped_network.hosts()) 14487db96d56Sopenharmony_ci self.assertEqual(255, len(hosts)) 14497db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::1'), hosts[0]) 14507db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Address('2001:658:22a:cafe::ff'), hosts[-1]) 14517db96d56Sopenharmony_ci 14527db96d56Sopenharmony_ci # special case where only 1 bit is left for address 14537db96d56Sopenharmony_ci addrs = [ipaddress.IPv4Address('2.0.0.0'), 14547db96d56Sopenharmony_ci ipaddress.IPv4Address('2.0.0.1')] 14557db96d56Sopenharmony_ci str_args = '2.0.0.0/31' 14567db96d56Sopenharmony_ci tpl_args = ('2.0.0.0', 31) 14577db96d56Sopenharmony_ci self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) 14587db96d56Sopenharmony_ci self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) 14597db96d56Sopenharmony_ci self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), 14607db96d56Sopenharmony_ci list(ipaddress.ip_network(tpl_args).hosts())) 14617db96d56Sopenharmony_ci 14627db96d56Sopenharmony_ci # special case where the network is a /32 14637db96d56Sopenharmony_ci addrs = [ipaddress.IPv4Address('1.2.3.4')] 14647db96d56Sopenharmony_ci str_args = '1.2.3.4/32' 14657db96d56Sopenharmony_ci tpl_args = ('1.2.3.4', 32) 14667db96d56Sopenharmony_ci self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) 14677db96d56Sopenharmony_ci self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) 14687db96d56Sopenharmony_ci self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), 14697db96d56Sopenharmony_ci list(ipaddress.ip_network(tpl_args).hosts())) 14707db96d56Sopenharmony_ci 14717db96d56Sopenharmony_ci addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::'), 14727db96d56Sopenharmony_ci ipaddress.IPv6Address('2001:658:22a:cafe::1')] 14737db96d56Sopenharmony_ci str_args = '2001:658:22a:cafe::/127' 14747db96d56Sopenharmony_ci tpl_args = ('2001:658:22a:cafe::', 127) 14757db96d56Sopenharmony_ci self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) 14767db96d56Sopenharmony_ci self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) 14777db96d56Sopenharmony_ci self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), 14787db96d56Sopenharmony_ci list(ipaddress.ip_network(tpl_args).hosts())) 14797db96d56Sopenharmony_ci 14807db96d56Sopenharmony_ci addrs = [ipaddress.IPv6Address('2001:658:22a:cafe::1'), ] 14817db96d56Sopenharmony_ci str_args = '2001:658:22a:cafe::1/128' 14827db96d56Sopenharmony_ci tpl_args = ('2001:658:22a:cafe::1', 128) 14837db96d56Sopenharmony_ci self.assertEqual(addrs, list(ipaddress.ip_network(str_args).hosts())) 14847db96d56Sopenharmony_ci self.assertEqual(addrs, list(ipaddress.ip_network(tpl_args).hosts())) 14857db96d56Sopenharmony_ci self.assertEqual(list(ipaddress.ip_network(str_args).hosts()), 14867db96d56Sopenharmony_ci list(ipaddress.ip_network(tpl_args).hosts())) 14877db96d56Sopenharmony_ci 14887db96d56Sopenharmony_ci def testFancySubnetting(self): 14897db96d56Sopenharmony_ci self.assertEqual(sorted(self.ipv4_network.subnets(prefixlen_diff=3)), 14907db96d56Sopenharmony_ci sorted(self.ipv4_network.subnets(new_prefix=27))) 14917db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 14927db96d56Sopenharmony_ci self.ipv4_network.subnets(new_prefix=23)) 14937db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 14947db96d56Sopenharmony_ci self.ipv4_network.subnets(prefixlen_diff=3, 14957db96d56Sopenharmony_ci new_prefix=27)) 14967db96d56Sopenharmony_ci self.assertEqual(sorted(self.ipv6_network.subnets(prefixlen_diff=4)), 14977db96d56Sopenharmony_ci sorted(self.ipv6_network.subnets(new_prefix=68))) 14987db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 14997db96d56Sopenharmony_ci self.ipv6_network.subnets(new_prefix=63)) 15007db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 15017db96d56Sopenharmony_ci self.ipv6_network.subnets(prefixlen_diff=4, 15027db96d56Sopenharmony_ci new_prefix=68)) 15037db96d56Sopenharmony_ci self.assertEqual(sorted(self.ipv6_scoped_network.subnets(prefixlen_diff=4)), 15047db96d56Sopenharmony_ci sorted(self.ipv6_scoped_network.subnets(new_prefix=68))) 15057db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 15067db96d56Sopenharmony_ci self.ipv6_scoped_network.subnets(new_prefix=63)) 15077db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 15087db96d56Sopenharmony_ci self.ipv6_scoped_network.subnets(prefixlen_diff=4, 15097db96d56Sopenharmony_ci new_prefix=68)) 15107db96d56Sopenharmony_ci 15117db96d56Sopenharmony_ci def testGetSubnets(self): 15127db96d56Sopenharmony_ci self.assertEqual(list(self.ipv4_network.subnets())[0].prefixlen, 25) 15137db96d56Sopenharmony_ci self.assertEqual(str(list( 15147db96d56Sopenharmony_ci self.ipv4_network.subnets())[0].network_address), 15157db96d56Sopenharmony_ci '1.2.3.0') 15167db96d56Sopenharmony_ci self.assertEqual(str(list( 15177db96d56Sopenharmony_ci self.ipv4_network.subnets())[1].network_address), 15187db96d56Sopenharmony_ci '1.2.3.128') 15197db96d56Sopenharmony_ci 15207db96d56Sopenharmony_ci self.assertEqual(list(self.ipv6_network.subnets())[0].prefixlen, 65) 15217db96d56Sopenharmony_ci self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].prefixlen, 65) 15227db96d56Sopenharmony_ci 15237db96d56Sopenharmony_ci def testGetSubnetForSingle32(self): 15247db96d56Sopenharmony_ci ip = ipaddress.IPv4Network('1.2.3.4/32') 15257db96d56Sopenharmony_ci subnets1 = [str(x) for x in ip.subnets()] 15267db96d56Sopenharmony_ci subnets2 = [str(x) for x in ip.subnets(2)] 15277db96d56Sopenharmony_ci self.assertEqual(subnets1, ['1.2.3.4/32']) 15287db96d56Sopenharmony_ci self.assertEqual(subnets1, subnets2) 15297db96d56Sopenharmony_ci 15307db96d56Sopenharmony_ci def testGetSubnetForSingle128(self): 15317db96d56Sopenharmony_ci ip = ipaddress.IPv6Network('::1/128') 15327db96d56Sopenharmony_ci subnets1 = [str(x) for x in ip.subnets()] 15337db96d56Sopenharmony_ci subnets2 = [str(x) for x in ip.subnets(2)] 15347db96d56Sopenharmony_ci self.assertEqual(subnets1, ['::1/128']) 15357db96d56Sopenharmony_ci self.assertEqual(subnets1, subnets2) 15367db96d56Sopenharmony_ci 15377db96d56Sopenharmony_ci ip_scoped = ipaddress.IPv6Network('::1%scope/128') 15387db96d56Sopenharmony_ci subnets1 = [str(x) for x in ip_scoped.subnets()] 15397db96d56Sopenharmony_ci subnets2 = [str(x) for x in ip_scoped.subnets(2)] 15407db96d56Sopenharmony_ci self.assertEqual(subnets1, ['::1%scope/128']) 15417db96d56Sopenharmony_ci self.assertEqual(subnets1, subnets2) 15427db96d56Sopenharmony_ci 15437db96d56Sopenharmony_ci def testSubnet2(self): 15447db96d56Sopenharmony_ci ips = [str(x) for x in self.ipv4_network.subnets(2)] 15457db96d56Sopenharmony_ci self.assertEqual( 15467db96d56Sopenharmony_ci ips, 15477db96d56Sopenharmony_ci ['1.2.3.0/26', '1.2.3.64/26', '1.2.3.128/26', '1.2.3.192/26']) 15487db96d56Sopenharmony_ci 15497db96d56Sopenharmony_ci ipsv6 = [str(x) for x in self.ipv6_network.subnets(2)] 15507db96d56Sopenharmony_ci self.assertEqual( 15517db96d56Sopenharmony_ci ipsv6, 15527db96d56Sopenharmony_ci ['2001:658:22a:cafe::/66', 15537db96d56Sopenharmony_ci '2001:658:22a:cafe:4000::/66', 15547db96d56Sopenharmony_ci '2001:658:22a:cafe:8000::/66', 15557db96d56Sopenharmony_ci '2001:658:22a:cafe:c000::/66']) 15567db96d56Sopenharmony_ci 15577db96d56Sopenharmony_ci def testGetSubnets3(self): 15587db96d56Sopenharmony_ci subnets = [str(x) for x in self.ipv4_network.subnets(8)] 15597db96d56Sopenharmony_ci self.assertEqual(subnets[:3], 15607db96d56Sopenharmony_ci ['1.2.3.0/32', '1.2.3.1/32', '1.2.3.2/32']) 15617db96d56Sopenharmony_ci self.assertEqual(subnets[-3:], 15627db96d56Sopenharmony_ci ['1.2.3.253/32', '1.2.3.254/32', '1.2.3.255/32']) 15637db96d56Sopenharmony_ci self.assertEqual(len(subnets), 256) 15647db96d56Sopenharmony_ci 15657db96d56Sopenharmony_ci ipv6_network = ipaddress.IPv6Network('2001:658:22a:cafe::/120') 15667db96d56Sopenharmony_ci subnets = [str(x) for x in ipv6_network.subnets(8)] 15677db96d56Sopenharmony_ci self.assertEqual(subnets[:3], 15687db96d56Sopenharmony_ci ['2001:658:22a:cafe::/128', 15697db96d56Sopenharmony_ci '2001:658:22a:cafe::1/128', 15707db96d56Sopenharmony_ci '2001:658:22a:cafe::2/128']) 15717db96d56Sopenharmony_ci self.assertEqual(subnets[-3:], 15727db96d56Sopenharmony_ci ['2001:658:22a:cafe::fd/128', 15737db96d56Sopenharmony_ci '2001:658:22a:cafe::fe/128', 15747db96d56Sopenharmony_ci '2001:658:22a:cafe::ff/128']) 15757db96d56Sopenharmony_ci self.assertEqual(len(subnets), 256) 15767db96d56Sopenharmony_ci 15777db96d56Sopenharmony_ci def testSubnetFailsForLargeCidrDiff(self): 15787db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 15797db96d56Sopenharmony_ci self.ipv4_interface.network.subnets(9)) 15807db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 15817db96d56Sopenharmony_ci self.ipv4_network.subnets(9)) 15827db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 15837db96d56Sopenharmony_ci self.ipv6_interface.network.subnets(65)) 15847db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 15857db96d56Sopenharmony_ci self.ipv6_network.subnets(65)) 15867db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 15877db96d56Sopenharmony_ci self.ipv6_scoped_interface.network.subnets(65)) 15887db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 15897db96d56Sopenharmony_ci self.ipv6_scoped_network.subnets(65)) 15907db96d56Sopenharmony_ci 15917db96d56Sopenharmony_ci def testSupernetFailsForLargeCidrDiff(self): 15927db96d56Sopenharmony_ci self.assertRaises(ValueError, 15937db96d56Sopenharmony_ci self.ipv4_interface.network.supernet, 25) 15947db96d56Sopenharmony_ci self.assertRaises(ValueError, 15957db96d56Sopenharmony_ci self.ipv6_interface.network.supernet, 65) 15967db96d56Sopenharmony_ci self.assertRaises(ValueError, 15977db96d56Sopenharmony_ci self.ipv6_scoped_interface.network.supernet, 65) 15987db96d56Sopenharmony_ci 15997db96d56Sopenharmony_ci def testSubnetFailsForNegativeCidrDiff(self): 16007db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 16017db96d56Sopenharmony_ci self.ipv4_interface.network.subnets(-1)) 16027db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 16037db96d56Sopenharmony_ci self.ipv4_network.subnets(-1)) 16047db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 16057db96d56Sopenharmony_ci self.ipv6_interface.network.subnets(-1)) 16067db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 16077db96d56Sopenharmony_ci self.ipv6_network.subnets(-1)) 16087db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 16097db96d56Sopenharmony_ci self.ipv6_scoped_interface.network.subnets(-1)) 16107db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 16117db96d56Sopenharmony_ci self.ipv6_scoped_network.subnets(-1)) 16127db96d56Sopenharmony_ci 16137db96d56Sopenharmony_ci def testGetNum_Addresses(self): 16147db96d56Sopenharmony_ci self.assertEqual(self.ipv4_network.num_addresses, 256) 16157db96d56Sopenharmony_ci self.assertEqual(list(self.ipv4_network.subnets())[0].num_addresses, 16167db96d56Sopenharmony_ci 128) 16177db96d56Sopenharmony_ci self.assertEqual(self.ipv4_network.supernet().num_addresses, 512) 16187db96d56Sopenharmony_ci 16197db96d56Sopenharmony_ci self.assertEqual(self.ipv6_network.num_addresses, 18446744073709551616) 16207db96d56Sopenharmony_ci self.assertEqual(list(self.ipv6_network.subnets())[0].num_addresses, 16217db96d56Sopenharmony_ci 9223372036854775808) 16227db96d56Sopenharmony_ci self.assertEqual(self.ipv6_network.supernet().num_addresses, 16237db96d56Sopenharmony_ci 36893488147419103232) 16247db96d56Sopenharmony_ci self.assertEqual(self.ipv6_scoped_network.num_addresses, 18446744073709551616) 16257db96d56Sopenharmony_ci self.assertEqual(list(self.ipv6_scoped_network.subnets())[0].num_addresses, 16267db96d56Sopenharmony_ci 9223372036854775808) 16277db96d56Sopenharmony_ci self.assertEqual(self.ipv6_scoped_network.supernet().num_addresses, 16287db96d56Sopenharmony_ci 36893488147419103232) 16297db96d56Sopenharmony_ci 16307db96d56Sopenharmony_ci def testContains(self): 16317db96d56Sopenharmony_ci self.assertIn(ipaddress.IPv4Interface('1.2.3.128/25'), 16327db96d56Sopenharmony_ci self.ipv4_network) 16337db96d56Sopenharmony_ci self.assertNotIn(ipaddress.IPv4Interface('1.2.4.1/24'), 16347db96d56Sopenharmony_ci self.ipv4_network) 16357db96d56Sopenharmony_ci # We can test addresses and string as well. 16367db96d56Sopenharmony_ci addr1 = ipaddress.IPv4Address('1.2.3.37') 16377db96d56Sopenharmony_ci self.assertIn(addr1, self.ipv4_network) 16387db96d56Sopenharmony_ci # issue 61, bad network comparison on like-ip'd network objects 16397db96d56Sopenharmony_ci # with identical broadcast addresses. 16407db96d56Sopenharmony_ci self.assertFalse(ipaddress.IPv4Network('1.1.0.0/16').__contains__( 16417db96d56Sopenharmony_ci ipaddress.IPv4Network('1.0.0.0/15'))) 16427db96d56Sopenharmony_ci 16437db96d56Sopenharmony_ci def testNth(self): 16447db96d56Sopenharmony_ci self.assertEqual(str(self.ipv4_network[5]), '1.2.3.5') 16457db96d56Sopenharmony_ci self.assertRaises(IndexError, self.ipv4_network.__getitem__, 256) 16467db96d56Sopenharmony_ci 16477db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_network[5]), 16487db96d56Sopenharmony_ci '2001:658:22a:cafe::5') 16497db96d56Sopenharmony_ci self.assertRaises(IndexError, self.ipv6_network.__getitem__, 1 << 64) 16507db96d56Sopenharmony_ci self.assertEqual(str(self.ipv6_scoped_network[5]), 16517db96d56Sopenharmony_ci '2001:658:22a:cafe::5') 16527db96d56Sopenharmony_ci self.assertRaises(IndexError, self.ipv6_scoped_network.__getitem__, 1 << 64) 16537db96d56Sopenharmony_ci 16547db96d56Sopenharmony_ci def testGetitem(self): 16557db96d56Sopenharmony_ci # https://code.google.com/p/ipaddr-py/issues/detail?id=15 16567db96d56Sopenharmony_ci addr = ipaddress.IPv4Network('172.31.255.128/255.255.255.240') 16577db96d56Sopenharmony_ci self.assertEqual(28, addr.prefixlen) 16587db96d56Sopenharmony_ci addr_list = list(addr) 16597db96d56Sopenharmony_ci self.assertEqual('172.31.255.128', str(addr_list[0])) 16607db96d56Sopenharmony_ci self.assertEqual('172.31.255.128', str(addr[0])) 16617db96d56Sopenharmony_ci self.assertEqual('172.31.255.143', str(addr_list[-1])) 16627db96d56Sopenharmony_ci self.assertEqual('172.31.255.143', str(addr[-1])) 16637db96d56Sopenharmony_ci self.assertEqual(addr_list[-1], addr[-1]) 16647db96d56Sopenharmony_ci 16657db96d56Sopenharmony_ci def testEqual(self): 16667db96d56Sopenharmony_ci self.assertTrue(self.ipv4_interface == 16677db96d56Sopenharmony_ci ipaddress.IPv4Interface('1.2.3.4/24')) 16687db96d56Sopenharmony_ci self.assertFalse(self.ipv4_interface == 16697db96d56Sopenharmony_ci ipaddress.IPv4Interface('1.2.3.4/23')) 16707db96d56Sopenharmony_ci self.assertFalse(self.ipv4_interface == 16717db96d56Sopenharmony_ci ipaddress.IPv6Interface('::1.2.3.4/24')) 16727db96d56Sopenharmony_ci self.assertFalse(self.ipv4_interface == 16737db96d56Sopenharmony_ci ipaddress.IPv6Interface('::1.2.3.4%scope/24')) 16747db96d56Sopenharmony_ci self.assertFalse(self.ipv4_interface == '') 16757db96d56Sopenharmony_ci self.assertFalse(self.ipv4_interface == []) 16767db96d56Sopenharmony_ci self.assertFalse(self.ipv4_interface == 2) 16777db96d56Sopenharmony_ci 16787db96d56Sopenharmony_ci self.assertTrue(self.ipv6_interface == 16797db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64')) 16807db96d56Sopenharmony_ci self.assertFalse(self.ipv6_interface == 16817db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63')) 16827db96d56Sopenharmony_ci self.assertFalse(self.ipv6_interface == 16837db96d56Sopenharmony_ci ipaddress.IPv4Interface('1.2.3.4/23')) 16847db96d56Sopenharmony_ci self.assertFalse(self.ipv6_interface == '') 16857db96d56Sopenharmony_ci self.assertFalse(self.ipv6_interface == []) 16867db96d56Sopenharmony_ci self.assertFalse(self.ipv6_interface == 2) 16877db96d56Sopenharmony_ci 16887db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_interface == 16897db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64')) 16907db96d56Sopenharmony_ci self.assertFalse(self.ipv6_scoped_interface == 16917db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63')) 16927db96d56Sopenharmony_ci self.assertFalse(self.ipv6_scoped_interface == 16937db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64')) 16947db96d56Sopenharmony_ci self.assertFalse(self.ipv6_scoped_interface == 16957db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63')) 16967db96d56Sopenharmony_ci self.assertFalse(self.ipv6_scoped_interface == 16977db96d56Sopenharmony_ci ipaddress.IPv4Interface('1.2.3.4/23')) 16987db96d56Sopenharmony_ci self.assertFalse(self.ipv6_scoped_interface == '') 16997db96d56Sopenharmony_ci self.assertFalse(self.ipv6_scoped_interface == []) 17007db96d56Sopenharmony_ci self.assertFalse(self.ipv6_scoped_interface == 2) 17017db96d56Sopenharmony_ci 17027db96d56Sopenharmony_ci def testNotEqual(self): 17037db96d56Sopenharmony_ci self.assertFalse(self.ipv4_interface != 17047db96d56Sopenharmony_ci ipaddress.IPv4Interface('1.2.3.4/24')) 17057db96d56Sopenharmony_ci self.assertTrue(self.ipv4_interface != 17067db96d56Sopenharmony_ci ipaddress.IPv4Interface('1.2.3.4/23')) 17077db96d56Sopenharmony_ci self.assertTrue(self.ipv4_interface != 17087db96d56Sopenharmony_ci ipaddress.IPv6Interface('::1.2.3.4/24')) 17097db96d56Sopenharmony_ci self.assertTrue(self.ipv4_interface != 17107db96d56Sopenharmony_ci ipaddress.IPv6Interface('::1.2.3.4%scope/24')) 17117db96d56Sopenharmony_ci self.assertTrue(self.ipv4_interface != '') 17127db96d56Sopenharmony_ci self.assertTrue(self.ipv4_interface != []) 17137db96d56Sopenharmony_ci self.assertTrue(self.ipv4_interface != 2) 17147db96d56Sopenharmony_ci 17157db96d56Sopenharmony_ci self.assertTrue(self.ipv4_address != 17167db96d56Sopenharmony_ci ipaddress.IPv4Address('1.2.3.5')) 17177db96d56Sopenharmony_ci self.assertTrue(self.ipv4_address != '') 17187db96d56Sopenharmony_ci self.assertTrue(self.ipv4_address != []) 17197db96d56Sopenharmony_ci self.assertTrue(self.ipv4_address != 2) 17207db96d56Sopenharmony_ci 17217db96d56Sopenharmony_ci self.assertFalse(self.ipv6_interface != 17227db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64')) 17237db96d56Sopenharmony_ci self.assertTrue(self.ipv6_interface != 17247db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63')) 17257db96d56Sopenharmony_ci self.assertTrue(self.ipv6_interface != 17267db96d56Sopenharmony_ci ipaddress.IPv4Interface('1.2.3.4/23')) 17277db96d56Sopenharmony_ci self.assertTrue(self.ipv6_interface != '') 17287db96d56Sopenharmony_ci self.assertTrue(self.ipv6_interface != []) 17297db96d56Sopenharmony_ci self.assertTrue(self.ipv6_interface != 2) 17307db96d56Sopenharmony_ci 17317db96d56Sopenharmony_ci self.assertTrue(self.ipv6_address != 17327db96d56Sopenharmony_ci ipaddress.IPv4Address('1.2.3.4')) 17337db96d56Sopenharmony_ci self.assertTrue(self.ipv6_address != '') 17347db96d56Sopenharmony_ci self.assertTrue(self.ipv6_address != []) 17357db96d56Sopenharmony_ci self.assertTrue(self.ipv6_address != 2) 17367db96d56Sopenharmony_ci 17377db96d56Sopenharmony_ci self.assertFalse(self.ipv6_scoped_interface != 17387db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/64')) 17397db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_interface != 17407db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1%scope/63')) 17417db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_interface != 17427db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/64')) 17437db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_interface != 17447db96d56Sopenharmony_ci ipaddress.IPv6Interface('2001:658:22a:cafe:200::1/63')) 17457db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_interface != 17467db96d56Sopenharmony_ci ipaddress.IPv4Interface('1.2.3.4/23')) 17477db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_interface != '') 17487db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_interface != []) 17497db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_interface != 2) 17507db96d56Sopenharmony_ci 17517db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_address != 17527db96d56Sopenharmony_ci ipaddress.IPv4Address('1.2.3.4')) 17537db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_address != '') 17547db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_address != []) 17557db96d56Sopenharmony_ci self.assertTrue(self.ipv6_scoped_address != 2) 17567db96d56Sopenharmony_ci 17577db96d56Sopenharmony_ci def testSlash32Constructor(self): 17587db96d56Sopenharmony_ci self.assertEqual(str(ipaddress.IPv4Interface( 17597db96d56Sopenharmony_ci '1.2.3.4/255.255.255.255')), '1.2.3.4/32') 17607db96d56Sopenharmony_ci 17617db96d56Sopenharmony_ci def testSlash128Constructor(self): 17627db96d56Sopenharmony_ci self.assertEqual(str(ipaddress.IPv6Interface('::1/128')), 17637db96d56Sopenharmony_ci '::1/128') 17647db96d56Sopenharmony_ci self.assertEqual(str(ipaddress.IPv6Interface('::1%scope/128')), 17657db96d56Sopenharmony_ci '::1%scope/128') 17667db96d56Sopenharmony_ci 17677db96d56Sopenharmony_ci def testSlash0Constructor(self): 17687db96d56Sopenharmony_ci self.assertEqual(str(ipaddress.IPv4Interface('1.2.3.4/0.0.0.0')), 17697db96d56Sopenharmony_ci '1.2.3.4/0') 17707db96d56Sopenharmony_ci 17717db96d56Sopenharmony_ci def testCollapsing(self): 17727db96d56Sopenharmony_ci # test only IP addresses including some duplicates 17737db96d56Sopenharmony_ci ip1 = ipaddress.IPv4Address('1.1.1.0') 17747db96d56Sopenharmony_ci ip2 = ipaddress.IPv4Address('1.1.1.1') 17757db96d56Sopenharmony_ci ip3 = ipaddress.IPv4Address('1.1.1.2') 17767db96d56Sopenharmony_ci ip4 = ipaddress.IPv4Address('1.1.1.3') 17777db96d56Sopenharmony_ci ip5 = ipaddress.IPv4Address('1.1.1.4') 17787db96d56Sopenharmony_ci ip6 = ipaddress.IPv4Address('1.1.1.0') 17797db96d56Sopenharmony_ci # check that addresses are subsumed properly. 17807db96d56Sopenharmony_ci collapsed = ipaddress.collapse_addresses( 17817db96d56Sopenharmony_ci [ip1, ip2, ip3, ip4, ip5, ip6]) 17827db96d56Sopenharmony_ci self.assertEqual(list(collapsed), 17837db96d56Sopenharmony_ci [ipaddress.IPv4Network('1.1.1.0/30'), 17847db96d56Sopenharmony_ci ipaddress.IPv4Network('1.1.1.4/32')]) 17857db96d56Sopenharmony_ci 17867db96d56Sopenharmony_ci # test a mix of IP addresses and networks including some duplicates 17877db96d56Sopenharmony_ci ip1 = ipaddress.IPv4Address('1.1.1.0') 17887db96d56Sopenharmony_ci ip2 = ipaddress.IPv4Address('1.1.1.1') 17897db96d56Sopenharmony_ci ip3 = ipaddress.IPv4Address('1.1.1.2') 17907db96d56Sopenharmony_ci ip4 = ipaddress.IPv4Address('1.1.1.3') 17917db96d56Sopenharmony_ci #ip5 = ipaddress.IPv4Interface('1.1.1.4/30') 17927db96d56Sopenharmony_ci #ip6 = ipaddress.IPv4Interface('1.1.1.4/30') 17937db96d56Sopenharmony_ci # check that addresses are subsumed properly. 17947db96d56Sopenharmony_ci collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4]) 17957db96d56Sopenharmony_ci self.assertEqual(list(collapsed), 17967db96d56Sopenharmony_ci [ipaddress.IPv4Network('1.1.1.0/30')]) 17977db96d56Sopenharmony_ci 17987db96d56Sopenharmony_ci # test only IP networks 17997db96d56Sopenharmony_ci ip1 = ipaddress.IPv4Network('1.1.0.0/24') 18007db96d56Sopenharmony_ci ip2 = ipaddress.IPv4Network('1.1.1.0/24') 18017db96d56Sopenharmony_ci ip3 = ipaddress.IPv4Network('1.1.2.0/24') 18027db96d56Sopenharmony_ci ip4 = ipaddress.IPv4Network('1.1.3.0/24') 18037db96d56Sopenharmony_ci ip5 = ipaddress.IPv4Network('1.1.4.0/24') 18047db96d56Sopenharmony_ci # stored in no particular order b/c we want CollapseAddr to call 18057db96d56Sopenharmony_ci # [].sort 18067db96d56Sopenharmony_ci ip6 = ipaddress.IPv4Network('1.1.0.0/22') 18077db96d56Sopenharmony_ci # check that addresses are subsumed properly. 18087db96d56Sopenharmony_ci collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3, ip4, ip5, 18097db96d56Sopenharmony_ci ip6]) 18107db96d56Sopenharmony_ci self.assertEqual(list(collapsed), 18117db96d56Sopenharmony_ci [ipaddress.IPv4Network('1.1.0.0/22'), 18127db96d56Sopenharmony_ci ipaddress.IPv4Network('1.1.4.0/24')]) 18137db96d56Sopenharmony_ci 18147db96d56Sopenharmony_ci # test that two addresses are supernet'ed properly 18157db96d56Sopenharmony_ci collapsed = ipaddress.collapse_addresses([ip1, ip2]) 18167db96d56Sopenharmony_ci self.assertEqual(list(collapsed), 18177db96d56Sopenharmony_ci [ipaddress.IPv4Network('1.1.0.0/23')]) 18187db96d56Sopenharmony_ci 18197db96d56Sopenharmony_ci # test same IP networks 18207db96d56Sopenharmony_ci ip_same1 = ip_same2 = ipaddress.IPv4Network('1.1.1.1/32') 18217db96d56Sopenharmony_ci self.assertEqual(list(ipaddress.collapse_addresses( 18227db96d56Sopenharmony_ci [ip_same1, ip_same2])), 18237db96d56Sopenharmony_ci [ip_same1]) 18247db96d56Sopenharmony_ci 18257db96d56Sopenharmony_ci # test same IP addresses 18267db96d56Sopenharmony_ci ip_same1 = ip_same2 = ipaddress.IPv4Address('1.1.1.1') 18277db96d56Sopenharmony_ci self.assertEqual(list(ipaddress.collapse_addresses( 18287db96d56Sopenharmony_ci [ip_same1, ip_same2])), 18297db96d56Sopenharmony_ci [ipaddress.ip_network('1.1.1.1/32')]) 18307db96d56Sopenharmony_ci ip1 = ipaddress.IPv6Network('2001::/100') 18317db96d56Sopenharmony_ci ip2 = ipaddress.IPv6Network('2001::/120') 18327db96d56Sopenharmony_ci ip3 = ipaddress.IPv6Network('2001::/96') 18337db96d56Sopenharmony_ci # test that ipv6 addresses are subsumed properly. 18347db96d56Sopenharmony_ci collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3]) 18357db96d56Sopenharmony_ci self.assertEqual(list(collapsed), [ip3]) 18367db96d56Sopenharmony_ci 18377db96d56Sopenharmony_ci ip1 = ipaddress.IPv6Network('2001::%scope/100') 18387db96d56Sopenharmony_ci ip2 = ipaddress.IPv6Network('2001::%scope/120') 18397db96d56Sopenharmony_ci ip3 = ipaddress.IPv6Network('2001::%scope/96') 18407db96d56Sopenharmony_ci # test that ipv6 addresses are subsumed properly. 18417db96d56Sopenharmony_ci collapsed = ipaddress.collapse_addresses([ip1, ip2, ip3]) 18427db96d56Sopenharmony_ci self.assertEqual(list(collapsed), [ip3]) 18437db96d56Sopenharmony_ci 18447db96d56Sopenharmony_ci # the toejam test 18457db96d56Sopenharmony_ci addr_tuples = [ 18467db96d56Sopenharmony_ci (ipaddress.ip_address('1.1.1.1'), 18477db96d56Sopenharmony_ci ipaddress.ip_address('::1')), 18487db96d56Sopenharmony_ci (ipaddress.IPv4Network('1.1.0.0/24'), 18497db96d56Sopenharmony_ci ipaddress.IPv6Network('2001::/120')), 18507db96d56Sopenharmony_ci (ipaddress.IPv4Network('1.1.0.0/32'), 18517db96d56Sopenharmony_ci ipaddress.IPv6Network('2001::/128')), 18527db96d56Sopenharmony_ci ] 18537db96d56Sopenharmony_ci for ip1, ip2 in addr_tuples: 18547db96d56Sopenharmony_ci self.assertRaises(TypeError, ipaddress.collapse_addresses, 18557db96d56Sopenharmony_ci [ip1, ip2]) 18567db96d56Sopenharmony_ci 18577db96d56Sopenharmony_ci addr_tuples = [ 18587db96d56Sopenharmony_ci (ipaddress.ip_address('1.1.1.1'), 18597db96d56Sopenharmony_ci ipaddress.ip_address('::1%scope')), 18607db96d56Sopenharmony_ci (ipaddress.IPv4Network('1.1.0.0/24'), 18617db96d56Sopenharmony_ci ipaddress.IPv6Network('2001::%scope/120')), 18627db96d56Sopenharmony_ci (ipaddress.IPv4Network('1.1.0.0/32'), 18637db96d56Sopenharmony_ci ipaddress.IPv6Network('2001::%scope/128')), 18647db96d56Sopenharmony_ci ] 18657db96d56Sopenharmony_ci for ip1, ip2 in addr_tuples: 18667db96d56Sopenharmony_ci self.assertRaises(TypeError, ipaddress.collapse_addresses, 18677db96d56Sopenharmony_ci [ip1, ip2]) 18687db96d56Sopenharmony_ci 18697db96d56Sopenharmony_ci def testSummarizing(self): 18707db96d56Sopenharmony_ci #ip = ipaddress.ip_address 18717db96d56Sopenharmony_ci #ipnet = ipaddress.ip_network 18727db96d56Sopenharmony_ci summarize = ipaddress.summarize_address_range 18737db96d56Sopenharmony_ci ip1 = ipaddress.ip_address('1.1.1.0') 18747db96d56Sopenharmony_ci ip2 = ipaddress.ip_address('1.1.1.255') 18757db96d56Sopenharmony_ci 18767db96d56Sopenharmony_ci # summarize works only for IPv4 & IPv6 18777db96d56Sopenharmony_ci class IPv7Address(ipaddress.IPv6Address): 18787db96d56Sopenharmony_ci @property 18797db96d56Sopenharmony_ci def version(self): 18807db96d56Sopenharmony_ci return 7 18817db96d56Sopenharmony_ci ip_invalid1 = IPv7Address('::1') 18827db96d56Sopenharmony_ci ip_invalid2 = IPv7Address('::1') 18837db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 18847db96d56Sopenharmony_ci summarize(ip_invalid1, ip_invalid2)) 18857db96d56Sopenharmony_ci # test that a summary over ip4 & ip6 fails 18867db96d56Sopenharmony_ci self.assertRaises(TypeError, list, 18877db96d56Sopenharmony_ci summarize(ip1, ipaddress.IPv6Address('::1'))) 18887db96d56Sopenharmony_ci self.assertRaises(TypeError, list, 18897db96d56Sopenharmony_ci summarize(ip1, ipaddress.IPv6Address('::1%scope'))) 18907db96d56Sopenharmony_ci # test a /24 is summarized properly 18917db96d56Sopenharmony_ci self.assertEqual(list(summarize(ip1, ip2))[0], 18927db96d56Sopenharmony_ci ipaddress.ip_network('1.1.1.0/24')) 18937db96d56Sopenharmony_ci # test an IPv4 range that isn't on a network byte boundary 18947db96d56Sopenharmony_ci ip2 = ipaddress.ip_address('1.1.1.8') 18957db96d56Sopenharmony_ci self.assertEqual(list(summarize(ip1, ip2)), 18967db96d56Sopenharmony_ci [ipaddress.ip_network('1.1.1.0/29'), 18977db96d56Sopenharmony_ci ipaddress.ip_network('1.1.1.8')]) 18987db96d56Sopenharmony_ci # all! 18997db96d56Sopenharmony_ci ip1 = ipaddress.IPv4Address(0) 19007db96d56Sopenharmony_ci ip2 = ipaddress.IPv4Address(ipaddress.IPv4Address._ALL_ONES) 19017db96d56Sopenharmony_ci self.assertEqual([ipaddress.IPv4Network('0.0.0.0/0')], 19027db96d56Sopenharmony_ci list(summarize(ip1, ip2))) 19037db96d56Sopenharmony_ci 19047db96d56Sopenharmony_ci ip1 = ipaddress.ip_address('1::') 19057db96d56Sopenharmony_ci ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff') 19067db96d56Sopenharmony_ci # test an IPv6 is summarized properly 19077db96d56Sopenharmony_ci self.assertEqual(list(summarize(ip1, ip2))[0], 19087db96d56Sopenharmony_ci ipaddress.ip_network('1::/16')) 19097db96d56Sopenharmony_ci # test an IPv6 range that isn't on a network byte boundary 19107db96d56Sopenharmony_ci ip2 = ipaddress.ip_address('2::') 19117db96d56Sopenharmony_ci self.assertEqual(list(summarize(ip1, ip2)), 19127db96d56Sopenharmony_ci [ipaddress.ip_network('1::/16'), 19137db96d56Sopenharmony_ci ipaddress.ip_network('2::/128')]) 19147db96d56Sopenharmony_ci 19157db96d56Sopenharmony_ci ip1 = ipaddress.ip_address('1::%scope') 19167db96d56Sopenharmony_ci ip2 = ipaddress.ip_address('1:ffff:ffff:ffff:ffff:ffff:ffff:ffff%scope') 19177db96d56Sopenharmony_ci # test an IPv6 is summarized properly 19187db96d56Sopenharmony_ci self.assertEqual(list(summarize(ip1, ip2))[0], 19197db96d56Sopenharmony_ci ipaddress.ip_network('1::/16')) 19207db96d56Sopenharmony_ci # test an IPv6 range that isn't on a network byte boundary 19217db96d56Sopenharmony_ci ip2 = ipaddress.ip_address('2::%scope') 19227db96d56Sopenharmony_ci self.assertEqual(list(summarize(ip1, ip2)), 19237db96d56Sopenharmony_ci [ipaddress.ip_network('1::/16'), 19247db96d56Sopenharmony_ci ipaddress.ip_network('2::/128')]) 19257db96d56Sopenharmony_ci 19267db96d56Sopenharmony_ci # test exception raised when first is greater than last 19277db96d56Sopenharmony_ci self.assertRaises(ValueError, list, 19287db96d56Sopenharmony_ci summarize(ipaddress.ip_address('1.1.1.0'), 19297db96d56Sopenharmony_ci ipaddress.ip_address('1.1.0.0'))) 19307db96d56Sopenharmony_ci # test exception raised when first and last aren't IP addresses 19317db96d56Sopenharmony_ci self.assertRaises(TypeError, list, 19327db96d56Sopenharmony_ci summarize(ipaddress.ip_network('1.1.1.0'), 19337db96d56Sopenharmony_ci ipaddress.ip_network('1.1.0.0'))) 19347db96d56Sopenharmony_ci self.assertRaises(TypeError, list, 19357db96d56Sopenharmony_ci summarize(ipaddress.ip_network('1.1.1.0'), 19367db96d56Sopenharmony_ci ipaddress.ip_network('1.1.0.0'))) 19377db96d56Sopenharmony_ci # test exception raised when first and last are not same version 19387db96d56Sopenharmony_ci self.assertRaises(TypeError, list, 19397db96d56Sopenharmony_ci summarize(ipaddress.ip_address('::'), 19407db96d56Sopenharmony_ci ipaddress.ip_network('1.1.0.0'))) 19417db96d56Sopenharmony_ci 19427db96d56Sopenharmony_ci def testAddressComparison(self): 19437db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_address('1.1.1.1') <= 19447db96d56Sopenharmony_ci ipaddress.ip_address('1.1.1.1')) 19457db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_address('1.1.1.1') <= 19467db96d56Sopenharmony_ci ipaddress.ip_address('1.1.1.2')) 19477db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_address('::1') <= 19487db96d56Sopenharmony_ci ipaddress.ip_address('::1')) 19497db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_address('::1') <= 19507db96d56Sopenharmony_ci ipaddress.ip_address('::2')) 19517db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_address('::1%scope') <= 19527db96d56Sopenharmony_ci ipaddress.ip_address('::1%scope')) 19537db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_address('::1%scope') <= 19547db96d56Sopenharmony_ci ipaddress.ip_address('::2%scope')) 19557db96d56Sopenharmony_ci 19567db96d56Sopenharmony_ci def testInterfaceComparison(self): 19577db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') == 19587db96d56Sopenharmony_ci ipaddress.ip_interface('1.1.1.1/24')) 19597db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('1.1.1.1/16') < 19607db96d56Sopenharmony_ci ipaddress.ip_interface('1.1.1.1/24')) 19617db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') < 19627db96d56Sopenharmony_ci ipaddress.ip_interface('1.1.1.2/24')) 19637db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('1.1.1.2/16') < 19647db96d56Sopenharmony_ci ipaddress.ip_interface('1.1.1.1/24')) 19657db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') > 19667db96d56Sopenharmony_ci ipaddress.ip_interface('1.1.1.1/16')) 19677db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('1.1.1.2/24') > 19687db96d56Sopenharmony_ci ipaddress.ip_interface('1.1.1.1/24')) 19697db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('1.1.1.1/24') > 19707db96d56Sopenharmony_ci ipaddress.ip_interface('1.1.1.2/16')) 19717db96d56Sopenharmony_ci 19727db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1/64') == 19737db96d56Sopenharmony_ci ipaddress.ip_interface('::1/64')) 19747db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1/64') < 19757db96d56Sopenharmony_ci ipaddress.ip_interface('::1/80')) 19767db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1/64') < 19777db96d56Sopenharmony_ci ipaddress.ip_interface('::2/64')) 19787db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::2/48') < 19797db96d56Sopenharmony_ci ipaddress.ip_interface('::1/64')) 19807db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1/80') > 19817db96d56Sopenharmony_ci ipaddress.ip_interface('::1/64')) 19827db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::2/64') > 19837db96d56Sopenharmony_ci ipaddress.ip_interface('::1/64')) 19847db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1/64') > 19857db96d56Sopenharmony_ci ipaddress.ip_interface('::2/48')) 19867db96d56Sopenharmony_ci 19877db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1%scope/64') == 19887db96d56Sopenharmony_ci ipaddress.ip_interface('::1%scope/64')) 19897db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1%scope/64') < 19907db96d56Sopenharmony_ci ipaddress.ip_interface('::1%scope/80')) 19917db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1%scope/64') < 19927db96d56Sopenharmony_ci ipaddress.ip_interface('::2%scope/64')) 19937db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::2%scope/48') < 19947db96d56Sopenharmony_ci ipaddress.ip_interface('::1%scope/64')) 19957db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1%scope/80') > 19967db96d56Sopenharmony_ci ipaddress.ip_interface('::1%scope/64')) 19977db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::2%scope/64') > 19987db96d56Sopenharmony_ci ipaddress.ip_interface('::1%scope/64')) 19997db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1%scope/64') > 20007db96d56Sopenharmony_ci ipaddress.ip_interface('::2%scope/48')) 20017db96d56Sopenharmony_ci 20027db96d56Sopenharmony_ci 20037db96d56Sopenharmony_ci self.assertFalse(ipaddress.ip_interface('::1%scope/64') == 20047db96d56Sopenharmony_ci ipaddress.ip_interface('::1/64')) 20057db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1%scope/64') < 20067db96d56Sopenharmony_ci ipaddress.ip_interface('::1/80')) 20077db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1%scope/64') < 20087db96d56Sopenharmony_ci ipaddress.ip_interface('::2/64')) 20097db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::2%scope/48') < 20107db96d56Sopenharmony_ci ipaddress.ip_interface('::1/64')) 20117db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1%scope/80') > 20127db96d56Sopenharmony_ci ipaddress.ip_interface('::1/64')) 20137db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::2%scope/64') > 20147db96d56Sopenharmony_ci ipaddress.ip_interface('::1/64')) 20157db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1%scope/64') > 20167db96d56Sopenharmony_ci ipaddress.ip_interface('::2/48')) 20177db96d56Sopenharmony_ci 20187db96d56Sopenharmony_ci self.assertFalse(ipaddress.ip_interface('::1/64') == 20197db96d56Sopenharmony_ci ipaddress.ip_interface('::1%scope/64')) 20207db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1/64') < 20217db96d56Sopenharmony_ci ipaddress.ip_interface('::1%scope/80')) 20227db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1/64') < 20237db96d56Sopenharmony_ci ipaddress.ip_interface('::2%scope/64')) 20247db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::2/48') < 20257db96d56Sopenharmony_ci ipaddress.ip_interface('::1%scope/64')) 20267db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1/80') > 20277db96d56Sopenharmony_ci ipaddress.ip_interface('::1%scope/64')) 20287db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::2/64') > 20297db96d56Sopenharmony_ci ipaddress.ip_interface('::1%scope/64')) 20307db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_interface('::1/64') > 20317db96d56Sopenharmony_ci ipaddress.ip_interface('::2%scope/48')) 20327db96d56Sopenharmony_ci 20337db96d56Sopenharmony_ci def testNetworkComparison(self): 20347db96d56Sopenharmony_ci # ip1 and ip2 have the same network address 20357db96d56Sopenharmony_ci ip1 = ipaddress.IPv4Network('1.1.1.0/24') 20367db96d56Sopenharmony_ci ip2 = ipaddress.IPv4Network('1.1.1.0/32') 20377db96d56Sopenharmony_ci ip3 = ipaddress.IPv4Network('1.1.2.0/24') 20387db96d56Sopenharmony_ci 20397db96d56Sopenharmony_ci self.assertTrue(ip1 < ip3) 20407db96d56Sopenharmony_ci self.assertTrue(ip3 > ip2) 20417db96d56Sopenharmony_ci 20427db96d56Sopenharmony_ci self.assertEqual(ip1.compare_networks(ip1), 0) 20437db96d56Sopenharmony_ci 20447db96d56Sopenharmony_ci # if addresses are the same, sort by netmask 20457db96d56Sopenharmony_ci self.assertEqual(ip1.compare_networks(ip2), -1) 20467db96d56Sopenharmony_ci self.assertEqual(ip2.compare_networks(ip1), 1) 20477db96d56Sopenharmony_ci 20487db96d56Sopenharmony_ci self.assertEqual(ip1.compare_networks(ip3), -1) 20497db96d56Sopenharmony_ci self.assertEqual(ip3.compare_networks(ip1), 1) 20507db96d56Sopenharmony_ci self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key()) 20517db96d56Sopenharmony_ci 20527db96d56Sopenharmony_ci ip1 = ipaddress.IPv6Network('2001:2000::/96') 20537db96d56Sopenharmony_ci ip2 = ipaddress.IPv6Network('2001:2001::/96') 20547db96d56Sopenharmony_ci ip3 = ipaddress.IPv6Network('2001:ffff:2000::/96') 20557db96d56Sopenharmony_ci 20567db96d56Sopenharmony_ci self.assertTrue(ip1 < ip3) 20577db96d56Sopenharmony_ci self.assertTrue(ip3 > ip2) 20587db96d56Sopenharmony_ci self.assertEqual(ip1.compare_networks(ip3), -1) 20597db96d56Sopenharmony_ci self.assertTrue(ip1._get_networks_key() < ip3._get_networks_key()) 20607db96d56Sopenharmony_ci 20617db96d56Sopenharmony_ci # Test comparing different protocols. 20627db96d56Sopenharmony_ci # Should always raise a TypeError. 20637db96d56Sopenharmony_ci self.assertRaises(TypeError, 20647db96d56Sopenharmony_ci self.ipv4_network.compare_networks, 20657db96d56Sopenharmony_ci self.ipv6_network) 20667db96d56Sopenharmony_ci ipv6 = ipaddress.IPv6Interface('::/0') 20677db96d56Sopenharmony_ci ipv4 = ipaddress.IPv4Interface('0.0.0.0/0') 20687db96d56Sopenharmony_ci self.assertRaises(TypeError, ipv4.__lt__, ipv6) 20697db96d56Sopenharmony_ci self.assertRaises(TypeError, ipv4.__gt__, ipv6) 20707db96d56Sopenharmony_ci self.assertRaises(TypeError, ipv6.__lt__, ipv4) 20717db96d56Sopenharmony_ci self.assertRaises(TypeError, ipv6.__gt__, ipv4) 20727db96d56Sopenharmony_ci 20737db96d56Sopenharmony_ci # Regression test for issue 19. 20747db96d56Sopenharmony_ci ip1 = ipaddress.ip_network('10.1.2.128/25') 20757db96d56Sopenharmony_ci self.assertFalse(ip1 < ip1) 20767db96d56Sopenharmony_ci self.assertFalse(ip1 > ip1) 20777db96d56Sopenharmony_ci ip2 = ipaddress.ip_network('10.1.3.0/24') 20787db96d56Sopenharmony_ci self.assertTrue(ip1 < ip2) 20797db96d56Sopenharmony_ci self.assertFalse(ip2 < ip1) 20807db96d56Sopenharmony_ci self.assertFalse(ip1 > ip2) 20817db96d56Sopenharmony_ci self.assertTrue(ip2 > ip1) 20827db96d56Sopenharmony_ci ip3 = ipaddress.ip_network('10.1.3.0/25') 20837db96d56Sopenharmony_ci self.assertTrue(ip2 < ip3) 20847db96d56Sopenharmony_ci self.assertFalse(ip3 < ip2) 20857db96d56Sopenharmony_ci self.assertFalse(ip2 > ip3) 20867db96d56Sopenharmony_ci self.assertTrue(ip3 > ip2) 20877db96d56Sopenharmony_ci 20887db96d56Sopenharmony_ci # Regression test for issue 28. 20897db96d56Sopenharmony_ci ip1 = ipaddress.ip_network('10.10.10.0/31') 20907db96d56Sopenharmony_ci ip2 = ipaddress.ip_network('10.10.10.0') 20917db96d56Sopenharmony_ci ip3 = ipaddress.ip_network('10.10.10.2/31') 20927db96d56Sopenharmony_ci ip4 = ipaddress.ip_network('10.10.10.2') 20937db96d56Sopenharmony_ci sorted = [ip1, ip2, ip3, ip4] 20947db96d56Sopenharmony_ci unsorted = [ip2, ip4, ip1, ip3] 20957db96d56Sopenharmony_ci unsorted.sort() 20967db96d56Sopenharmony_ci self.assertEqual(sorted, unsorted) 20977db96d56Sopenharmony_ci unsorted = [ip4, ip1, ip3, ip2] 20987db96d56Sopenharmony_ci unsorted.sort() 20997db96d56Sopenharmony_ci self.assertEqual(sorted, unsorted) 21007db96d56Sopenharmony_ci self.assertIs(ip1.__lt__(ipaddress.ip_address('10.10.10.0')), 21017db96d56Sopenharmony_ci NotImplemented) 21027db96d56Sopenharmony_ci self.assertIs(ip2.__lt__(ipaddress.ip_address('10.10.10.0')), 21037db96d56Sopenharmony_ci NotImplemented) 21047db96d56Sopenharmony_ci 21057db96d56Sopenharmony_ci # <=, >= 21067db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_network('1.1.1.1') <= 21077db96d56Sopenharmony_ci ipaddress.ip_network('1.1.1.1')) 21087db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_network('1.1.1.1') <= 21097db96d56Sopenharmony_ci ipaddress.ip_network('1.1.1.2')) 21107db96d56Sopenharmony_ci self.assertFalse(ipaddress.ip_network('1.1.1.2') <= 21117db96d56Sopenharmony_ci ipaddress.ip_network('1.1.1.1')) 21127db96d56Sopenharmony_ci 21137db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_network('::1') <= 21147db96d56Sopenharmony_ci ipaddress.ip_network('::1')) 21157db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_network('::1') <= 21167db96d56Sopenharmony_ci ipaddress.ip_network('::2')) 21177db96d56Sopenharmony_ci self.assertFalse(ipaddress.ip_network('::2') <= 21187db96d56Sopenharmony_ci ipaddress.ip_network('::1')) 21197db96d56Sopenharmony_ci 21207db96d56Sopenharmony_ci def testStrictNetworks(self): 21217db96d56Sopenharmony_ci self.assertRaises(ValueError, ipaddress.ip_network, '192.168.1.1/24') 21227db96d56Sopenharmony_ci self.assertRaises(ValueError, ipaddress.ip_network, '::1/120') 21237db96d56Sopenharmony_ci self.assertRaises(ValueError, ipaddress.ip_network, '::1%scope/120') 21247db96d56Sopenharmony_ci 21257db96d56Sopenharmony_ci def testOverlaps(self): 21267db96d56Sopenharmony_ci other = ipaddress.IPv4Network('1.2.3.0/30') 21277db96d56Sopenharmony_ci other2 = ipaddress.IPv4Network('1.2.2.0/24') 21287db96d56Sopenharmony_ci other3 = ipaddress.IPv4Network('1.2.2.64/26') 21297db96d56Sopenharmony_ci self.assertTrue(self.ipv4_network.overlaps(other)) 21307db96d56Sopenharmony_ci self.assertFalse(self.ipv4_network.overlaps(other2)) 21317db96d56Sopenharmony_ci self.assertTrue(other2.overlaps(other3)) 21327db96d56Sopenharmony_ci 21337db96d56Sopenharmony_ci def testEmbeddedIpv4(self): 21347db96d56Sopenharmony_ci ipv4_string = '192.168.0.1' 21357db96d56Sopenharmony_ci ipv4 = ipaddress.IPv4Interface(ipv4_string) 21367db96d56Sopenharmony_ci v4compat_ipv6 = ipaddress.IPv6Interface('::%s' % ipv4_string) 21377db96d56Sopenharmony_ci self.assertEqual(int(v4compat_ipv6.ip), int(ipv4.ip)) 21387db96d56Sopenharmony_ci v4mapped_ipv6 = ipaddress.IPv6Interface('::ffff:%s' % ipv4_string) 21397db96d56Sopenharmony_ci self.assertNotEqual(v4mapped_ipv6.ip, ipv4.ip) 21407db96d56Sopenharmony_ci self.assertRaises(ipaddress.AddressValueError, ipaddress.IPv6Interface, 21417db96d56Sopenharmony_ci '2001:1.1.1.1:1.1.1.1') 21427db96d56Sopenharmony_ci 21437db96d56Sopenharmony_ci # Issue 67: IPv6 with embedded IPv4 address not recognized. 21447db96d56Sopenharmony_ci def testIPv6AddressTooLarge(self): 21457db96d56Sopenharmony_ci # RFC4291 2.5.5.2 21467db96d56Sopenharmony_ci self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1'), 21477db96d56Sopenharmony_ci ipaddress.ip_address('::FFFF:c000:201')) 21487db96d56Sopenharmony_ci # RFC4291 2.2 (part 3) x::d.d.d.d 21497db96d56Sopenharmony_ci self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1'), 21507db96d56Sopenharmony_ci ipaddress.ip_address('FFFF::c000:201')) 21517db96d56Sopenharmony_ci 21527db96d56Sopenharmony_ci self.assertEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'), 21537db96d56Sopenharmony_ci ipaddress.ip_address('::FFFF:c000:201%scope')) 21547db96d56Sopenharmony_ci self.assertEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'), 21557db96d56Sopenharmony_ci ipaddress.ip_address('FFFF::c000:201%scope')) 21567db96d56Sopenharmony_ci self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1%scope'), 21577db96d56Sopenharmony_ci ipaddress.ip_address('::FFFF:c000:201')) 21587db96d56Sopenharmony_ci self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1%scope'), 21597db96d56Sopenharmony_ci ipaddress.ip_address('FFFF::c000:201')) 21607db96d56Sopenharmony_ci self.assertNotEqual(ipaddress.ip_address('::FFFF:192.0.2.1'), 21617db96d56Sopenharmony_ci ipaddress.ip_address('::FFFF:c000:201%scope')) 21627db96d56Sopenharmony_ci self.assertNotEqual(ipaddress.ip_address('FFFF::192.0.2.1'), 21637db96d56Sopenharmony_ci ipaddress.ip_address('FFFF::c000:201%scope')) 21647db96d56Sopenharmony_ci 21657db96d56Sopenharmony_ci def testIPVersion(self): 21667db96d56Sopenharmony_ci self.assertEqual(self.ipv4_address.version, 4) 21677db96d56Sopenharmony_ci self.assertEqual(self.ipv6_address.version, 6) 21687db96d56Sopenharmony_ci self.assertEqual(self.ipv6_scoped_address.version, 6) 21697db96d56Sopenharmony_ci 21707db96d56Sopenharmony_ci def testMaxPrefixLength(self): 21717db96d56Sopenharmony_ci self.assertEqual(self.ipv4_interface.max_prefixlen, 32) 21727db96d56Sopenharmony_ci self.assertEqual(self.ipv6_interface.max_prefixlen, 128) 21737db96d56Sopenharmony_ci self.assertEqual(self.ipv6_scoped_interface.max_prefixlen, 128) 21747db96d56Sopenharmony_ci 21757db96d56Sopenharmony_ci def testPacked(self): 21767db96d56Sopenharmony_ci self.assertEqual(self.ipv4_address.packed, 21777db96d56Sopenharmony_ci b'\x01\x02\x03\x04') 21787db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Interface('255.254.253.252').packed, 21797db96d56Sopenharmony_ci b'\xff\xfe\xfd\xfc') 21807db96d56Sopenharmony_ci self.assertEqual(self.ipv6_address.packed, 21817db96d56Sopenharmony_ci b'\x20\x01\x06\x58\x02\x2a\xca\xfe' 21827db96d56Sopenharmony_ci b'\x02\x00\x00\x00\x00\x00\x00\x01') 21837db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::').packed, 21847db96d56Sopenharmony_ci b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff' 21857db96d56Sopenharmony_ci + b'\x00' * 6) 21867db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0').packed, 21877db96d56Sopenharmony_ci b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8) 21887db96d56Sopenharmony_ci self.assertEqual(self.ipv6_scoped_address.packed, 21897db96d56Sopenharmony_ci b'\x20\x01\x06\x58\x02\x2a\xca\xfe' 21907db96d56Sopenharmony_ci b'\x02\x00\x00\x00\x00\x00\x00\x01') 21917db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Interface('ffff:2:3:4:ffff::%scope').packed, 21927db96d56Sopenharmony_ci b'\xff\xff\x00\x02\x00\x03\x00\x04\xff\xff' 21937db96d56Sopenharmony_ci + b'\x00' * 6) 21947db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Interface('::1:0:0:0:0%scope').packed, 21957db96d56Sopenharmony_ci b'\x00' * 6 + b'\x00\x01' + b'\x00' * 8) 21967db96d56Sopenharmony_ci 21977db96d56Sopenharmony_ci def testIpType(self): 21987db96d56Sopenharmony_ci ipv4net = ipaddress.ip_network('1.2.3.4') 21997db96d56Sopenharmony_ci ipv4addr = ipaddress.ip_address('1.2.3.4') 22007db96d56Sopenharmony_ci ipv6net = ipaddress.ip_network('::1.2.3.4') 22017db96d56Sopenharmony_ci ipv6addr = ipaddress.ip_address('::1.2.3.4') 22027db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Network, type(ipv4net)) 22037db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Address, type(ipv4addr)) 22047db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Network, type(ipv6net)) 22057db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Address, type(ipv6addr)) 22067db96d56Sopenharmony_ci 22077db96d56Sopenharmony_ci def testReservedIpv4(self): 22087db96d56Sopenharmony_ci # test networks 22097db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_interface( 22107db96d56Sopenharmony_ci '224.1.1.1/31').is_multicast) 22117db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('240.0.0.0').is_multicast) 22127db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network('240.0.0.0').is_reserved) 22137db96d56Sopenharmony_ci 22147db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_interface( 22157db96d56Sopenharmony_ci '192.168.1.1/17').is_private) 22167db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('192.169.0.0').is_private) 22177db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network( 22187db96d56Sopenharmony_ci '10.255.255.255').is_private) 22197db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_private) 22207db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('11.0.0.0').is_reserved) 22217db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network( 22227db96d56Sopenharmony_ci '172.31.255.255').is_private) 22237db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('172.32.0.0').is_private) 22247db96d56Sopenharmony_ci self.assertEqual(True, 22257db96d56Sopenharmony_ci ipaddress.ip_network('169.254.1.0/24').is_link_local) 22267db96d56Sopenharmony_ci 22277db96d56Sopenharmony_ci self.assertEqual(True, 22287db96d56Sopenharmony_ci ipaddress.ip_interface( 22297db96d56Sopenharmony_ci '169.254.100.200/24').is_link_local) 22307db96d56Sopenharmony_ci self.assertEqual(False, 22317db96d56Sopenharmony_ci ipaddress.ip_interface( 22327db96d56Sopenharmony_ci '169.255.100.200/24').is_link_local) 22337db96d56Sopenharmony_ci 22347db96d56Sopenharmony_ci self.assertEqual(True, 22357db96d56Sopenharmony_ci ipaddress.ip_network( 22367db96d56Sopenharmony_ci '127.100.200.254/32').is_loopback) 22377db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network( 22387db96d56Sopenharmony_ci '127.42.0.0/16').is_loopback) 22397db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('128.0.0.0').is_loopback) 22407db96d56Sopenharmony_ci self.assertEqual(False, 22417db96d56Sopenharmony_ci ipaddress.ip_network('100.64.0.0/10').is_private) 22427db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('100.64.0.0/10').is_global) 22437db96d56Sopenharmony_ci 22447db96d56Sopenharmony_ci self.assertEqual(True, 22457db96d56Sopenharmony_ci ipaddress.ip_network('192.0.2.128/25').is_private) 22467db96d56Sopenharmony_ci self.assertEqual(True, 22477db96d56Sopenharmony_ci ipaddress.ip_network('192.0.3.0/24').is_global) 22487db96d56Sopenharmony_ci 22497db96d56Sopenharmony_ci # test addresses 22507db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('0.0.0.0').is_unspecified) 22517db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('224.1.1.1').is_multicast) 22527db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('240.0.0.0').is_multicast) 22537db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('240.0.0.1').is_reserved) 22547db96d56Sopenharmony_ci self.assertEqual(False, 22557db96d56Sopenharmony_ci ipaddress.ip_address('239.255.255.255').is_reserved) 22567db96d56Sopenharmony_ci 22577db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('192.168.1.1').is_private) 22587db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('192.169.0.0').is_private) 22597db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address( 22607db96d56Sopenharmony_ci '10.255.255.255').is_private) 22617db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('11.0.0.0').is_private) 22627db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address( 22637db96d56Sopenharmony_ci '172.31.255.255').is_private) 22647db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('172.32.0.0').is_private) 22657db96d56Sopenharmony_ci 22667db96d56Sopenharmony_ci self.assertEqual(True, 22677db96d56Sopenharmony_ci ipaddress.ip_address('169.254.100.200').is_link_local) 22687db96d56Sopenharmony_ci self.assertEqual(False, 22697db96d56Sopenharmony_ci ipaddress.ip_address('169.255.100.200').is_link_local) 22707db96d56Sopenharmony_ci 22717db96d56Sopenharmony_ci self.assertTrue(ipaddress.ip_address('192.0.7.1').is_global) 22727db96d56Sopenharmony_ci self.assertFalse(ipaddress.ip_address('203.0.113.1').is_global) 22737db96d56Sopenharmony_ci 22747db96d56Sopenharmony_ci self.assertEqual(True, 22757db96d56Sopenharmony_ci ipaddress.ip_address('127.100.200.254').is_loopback) 22767db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('127.42.0.0').is_loopback) 22777db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('128.0.0.0').is_loopback) 22787db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network('0.0.0.0').is_unspecified) 22797db96d56Sopenharmony_ci 22807db96d56Sopenharmony_ci def testPrivateNetworks(self): 22817db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network("0.0.0.0/0").is_private) 22827db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network("1.0.0.0/8").is_private) 22837db96d56Sopenharmony_ci 22847db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("0.0.0.0/8").is_private) 22857db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("10.0.0.0/8").is_private) 22867db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("127.0.0.0/8").is_private) 22877db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("169.254.0.0/16").is_private) 22887db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("172.16.0.0/12").is_private) 22897db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("192.0.0.0/29").is_private) 22907db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("192.0.0.170/31").is_private) 22917db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("192.0.2.0/24").is_private) 22927db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("192.168.0.0/16").is_private) 22937db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("198.18.0.0/15").is_private) 22947db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("198.51.100.0/24").is_private) 22957db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("203.0.113.0/24").is_private) 22967db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("240.0.0.0/4").is_private) 22977db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("255.255.255.255/32").is_private) 22987db96d56Sopenharmony_ci 22997db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network("::/0").is_private) 23007db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network("::ff/128").is_private) 23017db96d56Sopenharmony_ci 23027db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("::1/128").is_private) 23037db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("::/128").is_private) 23047db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("::ffff:0:0/96").is_private) 23057db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("100::/64").is_private) 23067db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("2001::/23").is_private) 23077db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("2001:2::/48").is_private) 23087db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("2001:db8::/32").is_private) 23097db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("2001:10::/28").is_private) 23107db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("fc00::/7").is_private) 23117db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network("fe80::/10").is_private) 23127db96d56Sopenharmony_ci 23137db96d56Sopenharmony_ci def testReservedIpv6(self): 23147db96d56Sopenharmony_ci 23157db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network('ffff::').is_multicast) 23167db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network(2**128 - 1).is_multicast) 23177db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network('ff00::').is_multicast) 23187db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('fdff::').is_multicast) 23197db96d56Sopenharmony_ci 23207db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network('fecf::').is_site_local) 23217db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network( 23227db96d56Sopenharmony_ci 'feff:ffff:ffff:ffff::').is_site_local) 23237db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network( 23247db96d56Sopenharmony_ci 'fbf:ffff::').is_site_local) 23257db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('ff00::').is_site_local) 23267db96d56Sopenharmony_ci 23277db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network('fc00::').is_private) 23287db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network( 23297db96d56Sopenharmony_ci 'fc00:ffff:ffff:ffff::').is_private) 23307db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('fbff:ffff::').is_private) 23317db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('fe00::').is_private) 23327db96d56Sopenharmony_ci 23337db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network('fea0::').is_link_local) 23347db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network( 23357db96d56Sopenharmony_ci 'febf:ffff::').is_link_local) 23367db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network( 23377db96d56Sopenharmony_ci 'fe7f:ffff::').is_link_local) 23387db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('fec0::').is_link_local) 23397db96d56Sopenharmony_ci 23407db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_interface('0:0::0:01').is_loopback) 23417db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_interface('::1/127').is_loopback) 23427db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('::').is_loopback) 23437db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('::2').is_loopback) 23447db96d56Sopenharmony_ci 23457db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network('0::0').is_unspecified) 23467db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('::1').is_unspecified) 23477db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_network('::/127').is_unspecified) 23487db96d56Sopenharmony_ci 23497db96d56Sopenharmony_ci self.assertEqual(True, 23507db96d56Sopenharmony_ci ipaddress.ip_network('2001::1/128').is_private) 23517db96d56Sopenharmony_ci self.assertEqual(True, 23527db96d56Sopenharmony_ci ipaddress.ip_network('200::1/128').is_global) 23537db96d56Sopenharmony_ci # test addresses 23547db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('ffff::').is_multicast) 23557db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address(2**128 - 1).is_multicast) 23567db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('ff00::').is_multicast) 23577db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('fdff::').is_multicast) 23587db96d56Sopenharmony_ci 23597db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('fecf::').is_site_local) 23607db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address( 23617db96d56Sopenharmony_ci 'feff:ffff:ffff:ffff::').is_site_local) 23627db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address( 23637db96d56Sopenharmony_ci 'fbf:ffff::').is_site_local) 23647db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('ff00::').is_site_local) 23657db96d56Sopenharmony_ci 23667db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('fc00::').is_private) 23677db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address( 23687db96d56Sopenharmony_ci 'fc00:ffff:ffff:ffff::').is_private) 23697db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('fbff:ffff::').is_private) 23707db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('fe00::').is_private) 23717db96d56Sopenharmony_ci 23727db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('fea0::').is_link_local) 23737db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address( 23747db96d56Sopenharmony_ci 'febf:ffff::').is_link_local) 23757db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address( 23767db96d56Sopenharmony_ci 'fe7f:ffff::').is_link_local) 23777db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('fec0::').is_link_local) 23787db96d56Sopenharmony_ci 23797db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('0:0::0:01').is_loopback) 23807db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('::1').is_loopback) 23817db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('::2').is_loopback) 23827db96d56Sopenharmony_ci 23837db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('0::0').is_unspecified) 23847db96d56Sopenharmony_ci self.assertEqual(False, ipaddress.ip_address('::1').is_unspecified) 23857db96d56Sopenharmony_ci 23867db96d56Sopenharmony_ci # some generic IETF reserved addresses 23877db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_address('100::').is_reserved) 23887db96d56Sopenharmony_ci self.assertEqual(True, ipaddress.ip_network('4000::1/128').is_reserved) 23897db96d56Sopenharmony_ci 23907db96d56Sopenharmony_ci def testIpv4Mapped(self): 23917db96d56Sopenharmony_ci self.assertEqual( 23927db96d56Sopenharmony_ci ipaddress.ip_address('::ffff:192.168.1.1').ipv4_mapped, 23937db96d56Sopenharmony_ci ipaddress.ip_address('192.168.1.1')) 23947db96d56Sopenharmony_ci self.assertEqual(ipaddress.ip_address('::c0a8:101').ipv4_mapped, None) 23957db96d56Sopenharmony_ci self.assertEqual(ipaddress.ip_address('::ffff:c0a8:101').ipv4_mapped, 23967db96d56Sopenharmony_ci ipaddress.ip_address('192.168.1.1')) 23977db96d56Sopenharmony_ci 23987db96d56Sopenharmony_ci def testIpv4MappedPrivateCheck(self): 23997db96d56Sopenharmony_ci self.assertEqual( 24007db96d56Sopenharmony_ci True, ipaddress.ip_address('::ffff:192.168.1.1').is_private) 24017db96d56Sopenharmony_ci self.assertEqual( 24027db96d56Sopenharmony_ci False, ipaddress.ip_address('::ffff:172.32.0.0').is_private) 24037db96d56Sopenharmony_ci 24047db96d56Sopenharmony_ci def testAddrExclude(self): 24057db96d56Sopenharmony_ci addr1 = ipaddress.ip_network('10.1.1.0/24') 24067db96d56Sopenharmony_ci addr2 = ipaddress.ip_network('10.1.1.0/26') 24077db96d56Sopenharmony_ci addr3 = ipaddress.ip_network('10.2.1.0/24') 24087db96d56Sopenharmony_ci addr4 = ipaddress.ip_address('10.1.1.0') 24097db96d56Sopenharmony_ci addr5 = ipaddress.ip_network('2001:db8::0/32') 24107db96d56Sopenharmony_ci addr6 = ipaddress.ip_network('10.1.1.5/32') 24117db96d56Sopenharmony_ci self.assertEqual(sorted(list(addr1.address_exclude(addr2))), 24127db96d56Sopenharmony_ci [ipaddress.ip_network('10.1.1.64/26'), 24137db96d56Sopenharmony_ci ipaddress.ip_network('10.1.1.128/25')]) 24147db96d56Sopenharmony_ci self.assertRaises(ValueError, list, addr1.address_exclude(addr3)) 24157db96d56Sopenharmony_ci self.assertRaises(TypeError, list, addr1.address_exclude(addr4)) 24167db96d56Sopenharmony_ci self.assertRaises(TypeError, list, addr1.address_exclude(addr5)) 24177db96d56Sopenharmony_ci self.assertEqual(list(addr1.address_exclude(addr1)), []) 24187db96d56Sopenharmony_ci self.assertEqual(sorted(list(addr1.address_exclude(addr6))), 24197db96d56Sopenharmony_ci [ipaddress.ip_network('10.1.1.0/30'), 24207db96d56Sopenharmony_ci ipaddress.ip_network('10.1.1.4/32'), 24217db96d56Sopenharmony_ci ipaddress.ip_network('10.1.1.6/31'), 24227db96d56Sopenharmony_ci ipaddress.ip_network('10.1.1.8/29'), 24237db96d56Sopenharmony_ci ipaddress.ip_network('10.1.1.16/28'), 24247db96d56Sopenharmony_ci ipaddress.ip_network('10.1.1.32/27'), 24257db96d56Sopenharmony_ci ipaddress.ip_network('10.1.1.64/26'), 24267db96d56Sopenharmony_ci ipaddress.ip_network('10.1.1.128/25')]) 24277db96d56Sopenharmony_ci 24287db96d56Sopenharmony_ci def testHash(self): 24297db96d56Sopenharmony_ci self.assertEqual(hash(ipaddress.ip_interface('10.1.1.0/24')), 24307db96d56Sopenharmony_ci hash(ipaddress.ip_interface('10.1.1.0/24'))) 24317db96d56Sopenharmony_ci self.assertEqual(hash(ipaddress.ip_network('10.1.1.0/24')), 24327db96d56Sopenharmony_ci hash(ipaddress.ip_network('10.1.1.0/24'))) 24337db96d56Sopenharmony_ci self.assertEqual(hash(ipaddress.ip_address('10.1.1.0')), 24347db96d56Sopenharmony_ci hash(ipaddress.ip_address('10.1.1.0'))) 24357db96d56Sopenharmony_ci # i70 24367db96d56Sopenharmony_ci self.assertEqual(hash(ipaddress.ip_address('1.2.3.4')), 24377db96d56Sopenharmony_ci hash(ipaddress.ip_address( 24387db96d56Sopenharmony_ci int(ipaddress.ip_address('1.2.3.4')._ip)))) 24397db96d56Sopenharmony_ci ip1 = ipaddress.ip_address('10.1.1.0') 24407db96d56Sopenharmony_ci ip2 = ipaddress.ip_address('1::') 24417db96d56Sopenharmony_ci dummy = {} 24427db96d56Sopenharmony_ci dummy[self.ipv4_address] = None 24437db96d56Sopenharmony_ci dummy[self.ipv6_address] = None 24447db96d56Sopenharmony_ci dummy[ip1] = None 24457db96d56Sopenharmony_ci dummy[ip2] = None 24467db96d56Sopenharmony_ci self.assertIn(self.ipv4_address, dummy) 24477db96d56Sopenharmony_ci self.assertIn(ip2, dummy) 24487db96d56Sopenharmony_ci 24497db96d56Sopenharmony_ci def testIPBases(self): 24507db96d56Sopenharmony_ci net = self.ipv4_network 24517db96d56Sopenharmony_ci self.assertEqual('1.2.3.0/24', net.compressed) 24527db96d56Sopenharmony_ci net = self.ipv6_network 24537db96d56Sopenharmony_ci self.assertRaises(ValueError, net._string_from_ip_int, 2**128 + 1) 24547db96d56Sopenharmony_ci 24557db96d56Sopenharmony_ci def testIPv6NetworkHelpers(self): 24567db96d56Sopenharmony_ci net = self.ipv6_network 24577db96d56Sopenharmony_ci self.assertEqual('2001:658:22a:cafe::/64', net.with_prefixlen) 24587db96d56Sopenharmony_ci self.assertEqual('2001:658:22a:cafe::/ffff:ffff:ffff:ffff::', 24597db96d56Sopenharmony_ci net.with_netmask) 24607db96d56Sopenharmony_ci self.assertEqual('2001:658:22a:cafe::/::ffff:ffff:ffff:ffff', 24617db96d56Sopenharmony_ci net.with_hostmask) 24627db96d56Sopenharmony_ci self.assertEqual('2001:658:22a:cafe::/64', str(net)) 24637db96d56Sopenharmony_ci 24647db96d56Sopenharmony_ci def testIPv4NetworkHelpers(self): 24657db96d56Sopenharmony_ci net = self.ipv4_network 24667db96d56Sopenharmony_ci self.assertEqual('1.2.3.0/24', net.with_prefixlen) 24677db96d56Sopenharmony_ci self.assertEqual('1.2.3.0/255.255.255.0', net.with_netmask) 24687db96d56Sopenharmony_ci self.assertEqual('1.2.3.0/0.0.0.255', net.with_hostmask) 24697db96d56Sopenharmony_ci self.assertEqual('1.2.3.0/24', str(net)) 24707db96d56Sopenharmony_ci 24717db96d56Sopenharmony_ci def testCopyConstructor(self): 24727db96d56Sopenharmony_ci addr1 = ipaddress.ip_network('10.1.1.0/24') 24737db96d56Sopenharmony_ci addr2 = ipaddress.ip_network(addr1) 24747db96d56Sopenharmony_ci addr3 = ipaddress.ip_interface('2001:658:22a:cafe:200::1/64') 24757db96d56Sopenharmony_ci addr4 = ipaddress.ip_interface(addr3) 24767db96d56Sopenharmony_ci addr5 = ipaddress.IPv4Address('1.1.1.1') 24777db96d56Sopenharmony_ci addr6 = ipaddress.IPv6Address('2001:658:22a:cafe:200::1') 24787db96d56Sopenharmony_ci 24797db96d56Sopenharmony_ci self.assertEqual(addr1, addr2) 24807db96d56Sopenharmony_ci self.assertEqual(addr3, addr4) 24817db96d56Sopenharmony_ci self.assertEqual(addr5, ipaddress.IPv4Address(addr5)) 24827db96d56Sopenharmony_ci self.assertEqual(addr6, ipaddress.IPv6Address(addr6)) 24837db96d56Sopenharmony_ci 24847db96d56Sopenharmony_ci def testCompressIPv6Address(self): 24857db96d56Sopenharmony_ci test_addresses = { 24867db96d56Sopenharmony_ci '1:2:3:4:5:6:7:8': '1:2:3:4:5:6:7:8/128', 24877db96d56Sopenharmony_ci '2001:0:0:4:0:0:0:8': '2001:0:0:4::8/128', 24887db96d56Sopenharmony_ci '2001:0:0:4:5:6:7:8': '2001::4:5:6:7:8/128', 24897db96d56Sopenharmony_ci '2001:0:3:4:5:6:7:8': '2001:0:3:4:5:6:7:8/128', 24907db96d56Sopenharmony_ci '0:0:3:0:0:0:0:ffff': '0:0:3::ffff/128', 24917db96d56Sopenharmony_ci '0:0:0:4:0:0:0:ffff': '::4:0:0:0:ffff/128', 24927db96d56Sopenharmony_ci '0:0:0:0:5:0:0:ffff': '::5:0:0:ffff/128', 24937db96d56Sopenharmony_ci '1:0:0:4:0:0:7:8': '1::4:0:0:7:8/128', 24947db96d56Sopenharmony_ci '0:0:0:0:0:0:0:0': '::/128', 24957db96d56Sopenharmony_ci '0:0:0:0:0:0:0:0/0': '::/0', 24967db96d56Sopenharmony_ci '0:0:0:0:0:0:0:1': '::1/128', 24977db96d56Sopenharmony_ci '2001:0658:022a:cafe:0000:0000:0000:0000/66': 24987db96d56Sopenharmony_ci '2001:658:22a:cafe::/66', 24997db96d56Sopenharmony_ci '::1.2.3.4': '::102:304/128', 25007db96d56Sopenharmony_ci '1:2:3:4:5:ffff:1.2.3.4': '1:2:3:4:5:ffff:102:304/128', 25017db96d56Sopenharmony_ci '::7:6:5:4:3:2:1': '0:7:6:5:4:3:2:1/128', 25027db96d56Sopenharmony_ci '::7:6:5:4:3:2:0': '0:7:6:5:4:3:2:0/128', 25037db96d56Sopenharmony_ci '7:6:5:4:3:2:1::': '7:6:5:4:3:2:1:0/128', 25047db96d56Sopenharmony_ci '0:6:5:4:3:2:1::': '0:6:5:4:3:2:1:0/128', 25057db96d56Sopenharmony_ci } 25067db96d56Sopenharmony_ci for uncompressed, compressed in list(test_addresses.items()): 25077db96d56Sopenharmony_ci self.assertEqual(compressed, str(ipaddress.IPv6Interface( 25087db96d56Sopenharmony_ci uncompressed))) 25097db96d56Sopenharmony_ci 25107db96d56Sopenharmony_ci def testExplodeShortHandIpStr(self): 25117db96d56Sopenharmony_ci addr1 = ipaddress.IPv6Interface('2001::1') 25127db96d56Sopenharmony_ci addr2 = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1') 25137db96d56Sopenharmony_ci addr3 = ipaddress.IPv6Network('2001::/96') 25147db96d56Sopenharmony_ci addr4 = ipaddress.IPv4Address('192.168.178.1') 25157db96d56Sopenharmony_ci self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0001/128', 25167db96d56Sopenharmony_ci addr1.exploded) 25177db96d56Sopenharmony_ci self.assertEqual('0000:0000:0000:0000:0000:0000:0000:0001/128', 25187db96d56Sopenharmony_ci ipaddress.IPv6Interface('::1/128').exploded) 25197db96d56Sopenharmony_ci # issue 77 25207db96d56Sopenharmony_ci self.assertEqual('2001:0000:5ef5:79fd:0000:059d:a0e5:0ba1', 25217db96d56Sopenharmony_ci addr2.exploded) 25227db96d56Sopenharmony_ci self.assertEqual('2001:0000:0000:0000:0000:0000:0000:0000/96', 25237db96d56Sopenharmony_ci addr3.exploded) 25247db96d56Sopenharmony_ci self.assertEqual('192.168.178.1', addr4.exploded) 25257db96d56Sopenharmony_ci 25267db96d56Sopenharmony_ci def testReversePointer(self): 25277db96d56Sopenharmony_ci addr1 = ipaddress.IPv4Address('127.0.0.1') 25287db96d56Sopenharmony_ci addr2 = ipaddress.IPv6Address('2001:db8::1') 25297db96d56Sopenharmony_ci self.assertEqual('1.0.0.127.in-addr.arpa', addr1.reverse_pointer) 25307db96d56Sopenharmony_ci self.assertEqual('1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.' + 25317db96d56Sopenharmony_ci 'b.d.0.1.0.0.2.ip6.arpa', 25327db96d56Sopenharmony_ci addr2.reverse_pointer) 25337db96d56Sopenharmony_ci 25347db96d56Sopenharmony_ci def testIntRepresentation(self): 25357db96d56Sopenharmony_ci self.assertEqual(16909060, int(self.ipv4_address)) 25367db96d56Sopenharmony_ci self.assertEqual(42540616829182469433547762482097946625, 25377db96d56Sopenharmony_ci int(self.ipv6_address)) 25387db96d56Sopenharmony_ci 25397db96d56Sopenharmony_ci def testForceVersion(self): 25407db96d56Sopenharmony_ci self.assertEqual(ipaddress.ip_network(1).version, 4) 25417db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv6Network(1).version, 6) 25427db96d56Sopenharmony_ci 25437db96d56Sopenharmony_ci def testWithStar(self): 25447db96d56Sopenharmony_ci self.assertEqual(self.ipv4_interface.with_prefixlen, "1.2.3.4/24") 25457db96d56Sopenharmony_ci self.assertEqual(self.ipv4_interface.with_netmask, 25467db96d56Sopenharmony_ci "1.2.3.4/255.255.255.0") 25477db96d56Sopenharmony_ci self.assertEqual(self.ipv4_interface.with_hostmask, 25487db96d56Sopenharmony_ci "1.2.3.4/0.0.0.255") 25497db96d56Sopenharmony_ci 25507db96d56Sopenharmony_ci self.assertEqual(self.ipv6_interface.with_prefixlen, 25517db96d56Sopenharmony_ci '2001:658:22a:cafe:200::1/64') 25527db96d56Sopenharmony_ci self.assertEqual(self.ipv6_interface.with_netmask, 25537db96d56Sopenharmony_ci '2001:658:22a:cafe:200::1/ffff:ffff:ffff:ffff::') 25547db96d56Sopenharmony_ci # this probably don't make much sense, but it's included for 25557db96d56Sopenharmony_ci # compatibility with ipv4 25567db96d56Sopenharmony_ci self.assertEqual(self.ipv6_interface.with_hostmask, 25577db96d56Sopenharmony_ci '2001:658:22a:cafe:200::1/::ffff:ffff:ffff:ffff') 25587db96d56Sopenharmony_ci 25597db96d56Sopenharmony_ci def testNetworkElementCaching(self): 25607db96d56Sopenharmony_ci # V4 - make sure we're empty 25617db96d56Sopenharmony_ci self.assertNotIn('broadcast_address', self.ipv4_network.__dict__) 25627db96d56Sopenharmony_ci self.assertNotIn('hostmask', self.ipv4_network.__dict__) 25637db96d56Sopenharmony_ci 25647db96d56Sopenharmony_ci # V4 - populate and test 25657db96d56Sopenharmony_ci self.assertEqual(self.ipv4_network.broadcast_address, 25667db96d56Sopenharmony_ci ipaddress.IPv4Address('1.2.3.255')) 25677db96d56Sopenharmony_ci self.assertEqual(self.ipv4_network.hostmask, 25687db96d56Sopenharmony_ci ipaddress.IPv4Address('0.0.0.255')) 25697db96d56Sopenharmony_ci 25707db96d56Sopenharmony_ci # V4 - check we're cached 25717db96d56Sopenharmony_ci self.assertIn('broadcast_address', self.ipv4_network.__dict__) 25727db96d56Sopenharmony_ci self.assertIn('hostmask', self.ipv4_network.__dict__) 25737db96d56Sopenharmony_ci 25747db96d56Sopenharmony_ci # V6 - make sure we're empty 25757db96d56Sopenharmony_ci self.assertNotIn('broadcast_address', self.ipv6_network.__dict__) 25767db96d56Sopenharmony_ci self.assertNotIn('hostmask', self.ipv6_network.__dict__) 25777db96d56Sopenharmony_ci 25787db96d56Sopenharmony_ci # V6 - populate and test 25797db96d56Sopenharmony_ci self.assertEqual(self.ipv6_network.network_address, 25807db96d56Sopenharmony_ci ipaddress.IPv6Address('2001:658:22a:cafe::')) 25817db96d56Sopenharmony_ci self.assertEqual(self.ipv6_interface.network.network_address, 25827db96d56Sopenharmony_ci ipaddress.IPv6Address('2001:658:22a:cafe::')) 25837db96d56Sopenharmony_ci 25847db96d56Sopenharmony_ci self.assertEqual( 25857db96d56Sopenharmony_ci self.ipv6_network.broadcast_address, 25867db96d56Sopenharmony_ci ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff')) 25877db96d56Sopenharmony_ci self.assertEqual(self.ipv6_network.hostmask, 25887db96d56Sopenharmony_ci ipaddress.IPv6Address('::ffff:ffff:ffff:ffff')) 25897db96d56Sopenharmony_ci self.assertEqual( 25907db96d56Sopenharmony_ci self.ipv6_interface.network.broadcast_address, 25917db96d56Sopenharmony_ci ipaddress.IPv6Address('2001:658:22a:cafe:ffff:ffff:ffff:ffff')) 25927db96d56Sopenharmony_ci self.assertEqual(self.ipv6_interface.network.hostmask, 25937db96d56Sopenharmony_ci ipaddress.IPv6Address('::ffff:ffff:ffff:ffff')) 25947db96d56Sopenharmony_ci 25957db96d56Sopenharmony_ci # V6 - check we're cached 25967db96d56Sopenharmony_ci self.assertIn('broadcast_address', self.ipv6_network.__dict__) 25977db96d56Sopenharmony_ci self.assertIn('hostmask', self.ipv6_network.__dict__) 25987db96d56Sopenharmony_ci self.assertIn('broadcast_address', self.ipv6_interface.network.__dict__) 25997db96d56Sopenharmony_ci self.assertIn('hostmask', self.ipv6_interface.network.__dict__) 26007db96d56Sopenharmony_ci 26017db96d56Sopenharmony_ci def testTeredo(self): 26027db96d56Sopenharmony_ci # stolen from wikipedia 26037db96d56Sopenharmony_ci server = ipaddress.IPv4Address('65.54.227.120') 26047db96d56Sopenharmony_ci client = ipaddress.IPv4Address('192.0.2.45') 26057db96d56Sopenharmony_ci teredo_addr = '2001:0000:4136:e378:8000:63bf:3fff:fdd2' 26067db96d56Sopenharmony_ci self.assertEqual((server, client), 26077db96d56Sopenharmony_ci ipaddress.ip_address(teredo_addr).teredo) 26087db96d56Sopenharmony_ci bad_addr = '2000::4136:e378:8000:63bf:3fff:fdd2' 26097db96d56Sopenharmony_ci self.assertFalse(ipaddress.ip_address(bad_addr).teredo) 26107db96d56Sopenharmony_ci bad_addr = '2001:0001:4136:e378:8000:63bf:3fff:fdd2' 26117db96d56Sopenharmony_ci self.assertFalse(ipaddress.ip_address(bad_addr).teredo) 26127db96d56Sopenharmony_ci 26137db96d56Sopenharmony_ci # i77 26147db96d56Sopenharmony_ci teredo_addr = ipaddress.IPv6Address('2001:0:5ef5:79fd:0:59d:a0e5:ba1') 26157db96d56Sopenharmony_ci self.assertEqual((ipaddress.IPv4Address('94.245.121.253'), 26167db96d56Sopenharmony_ci ipaddress.IPv4Address('95.26.244.94')), 26177db96d56Sopenharmony_ci teredo_addr.teredo) 26187db96d56Sopenharmony_ci 26197db96d56Sopenharmony_ci def testsixtofour(self): 26207db96d56Sopenharmony_ci sixtofouraddr = ipaddress.ip_address('2002:ac1d:2d64::1') 26217db96d56Sopenharmony_ci bad_addr = ipaddress.ip_address('2000:ac1d:2d64::1') 26227db96d56Sopenharmony_ci self.assertEqual(ipaddress.IPv4Address('172.29.45.100'), 26237db96d56Sopenharmony_ci sixtofouraddr.sixtofour) 26247db96d56Sopenharmony_ci self.assertFalse(bad_addr.sixtofour) 26257db96d56Sopenharmony_ci 26267db96d56Sopenharmony_ci # issue41004 Hash collisions in IPv4Interface and IPv6Interface 26277db96d56Sopenharmony_ci def testV4HashIsNotConstant(self): 26287db96d56Sopenharmony_ci ipv4_address1 = ipaddress.IPv4Interface("1.2.3.4") 26297db96d56Sopenharmony_ci ipv4_address2 = ipaddress.IPv4Interface("2.3.4.5") 26307db96d56Sopenharmony_ci self.assertNotEqual(ipv4_address1.__hash__(), ipv4_address2.__hash__()) 26317db96d56Sopenharmony_ci 26327db96d56Sopenharmony_ci # issue41004 Hash collisions in IPv4Interface and IPv6Interface 26337db96d56Sopenharmony_ci def testV6HashIsNotConstant(self): 26347db96d56Sopenharmony_ci ipv6_address1 = ipaddress.IPv6Interface("2001:658:22a:cafe:200:0:0:1") 26357db96d56Sopenharmony_ci ipv6_address2 = ipaddress.IPv6Interface("2001:658:22a:cafe:200:0:0:2") 26367db96d56Sopenharmony_ci self.assertNotEqual(ipv6_address1.__hash__(), ipv6_address2.__hash__()) 26377db96d56Sopenharmony_ci 26387db96d56Sopenharmony_ci 26397db96d56Sopenharmony_ciif __name__ == '__main__': 26407db96d56Sopenharmony_ci unittest.main() 2641