17db96d56Sopenharmony_ciimport unittest
27db96d56Sopenharmony_cifrom test import support
37db96d56Sopenharmony_cifrom test.support import import_helper
47db96d56Sopenharmony_ciimport builtins
57db96d56Sopenharmony_ciimport contextlib
67db96d56Sopenharmony_ciimport copy
77db96d56Sopenharmony_ciimport enum
87db96d56Sopenharmony_ciimport io
97db96d56Sopenharmony_ciimport os
107db96d56Sopenharmony_ciimport pickle
117db96d56Sopenharmony_ciimport sys
127db96d56Sopenharmony_ciimport weakref
137db96d56Sopenharmony_cifrom unittest import mock
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_cipy_uuid = import_helper.import_fresh_module('uuid', blocked=['_uuid'])
167db96d56Sopenharmony_cic_uuid = import_helper.import_fresh_module('uuid', fresh=['_uuid'])
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_cidef importable(name):
197db96d56Sopenharmony_ci    try:
207db96d56Sopenharmony_ci        __import__(name)
217db96d56Sopenharmony_ci        return True
227db96d56Sopenharmony_ci    except:
237db96d56Sopenharmony_ci        return False
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_cidef mock_get_command_stdout(data):
277db96d56Sopenharmony_ci    def get_command_stdout(command, args):
287db96d56Sopenharmony_ci        return io.BytesIO(data.encode())
297db96d56Sopenharmony_ci    return get_command_stdout
307db96d56Sopenharmony_ci
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ciclass BaseTestUUID:
337db96d56Sopenharmony_ci    uuid = None
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci    def test_safe_uuid_enum(self):
367db96d56Sopenharmony_ci        class CheckedSafeUUID(enum.Enum):
377db96d56Sopenharmony_ci            safe = 0
387db96d56Sopenharmony_ci            unsafe = -1
397db96d56Sopenharmony_ci            unknown = None
407db96d56Sopenharmony_ci        enum._test_simple_enum(CheckedSafeUUID, py_uuid.SafeUUID)
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci    def test_UUID(self):
437db96d56Sopenharmony_ci        equal = self.assertEqual
447db96d56Sopenharmony_ci        ascending = []
457db96d56Sopenharmony_ci        for (string, curly, hex, bytes, bytes_le, fields, integer, urn,
467db96d56Sopenharmony_ci             time, clock_seq, variant, version) in [
477db96d56Sopenharmony_ci            ('00000000-0000-0000-0000-000000000000',
487db96d56Sopenharmony_ci             '{00000000-0000-0000-0000-000000000000}',
497db96d56Sopenharmony_ci             '00000000000000000000000000000000',
507db96d56Sopenharmony_ci             b'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
517db96d56Sopenharmony_ci             b'\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0',
527db96d56Sopenharmony_ci             (0, 0, 0, 0, 0, 0),
537db96d56Sopenharmony_ci             0,
547db96d56Sopenharmony_ci             'urn:uuid:00000000-0000-0000-0000-000000000000',
557db96d56Sopenharmony_ci             0, 0, self.uuid.RESERVED_NCS, None),
567db96d56Sopenharmony_ci            ('00010203-0405-0607-0809-0a0b0c0d0e0f',
577db96d56Sopenharmony_ci             '{00010203-0405-0607-0809-0a0b0c0d0e0f}',
587db96d56Sopenharmony_ci             '000102030405060708090a0b0c0d0e0f',
597db96d56Sopenharmony_ci             b'\0\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\x0d\x0e\x0f',
607db96d56Sopenharmony_ci             b'\x03\x02\x01\0\x05\x04\x07\x06\x08\t\n\x0b\x0c\x0d\x0e\x0f',
617db96d56Sopenharmony_ci             (0x00010203, 0x0405, 0x0607, 8, 9, 0x0a0b0c0d0e0f),
627db96d56Sopenharmony_ci             0x000102030405060708090a0b0c0d0e0f,
637db96d56Sopenharmony_ci             'urn:uuid:00010203-0405-0607-0809-0a0b0c0d0e0f',
647db96d56Sopenharmony_ci             0x607040500010203, 0x809, self.uuid.RESERVED_NCS, None),
657db96d56Sopenharmony_ci            ('02d9e6d5-9467-382e-8f9b-9300a64ac3cd',
667db96d56Sopenharmony_ci             '{02d9e6d5-9467-382e-8f9b-9300a64ac3cd}',
677db96d56Sopenharmony_ci             '02d9e6d59467382e8f9b9300a64ac3cd',
687db96d56Sopenharmony_ci             b'\x02\xd9\xe6\xd5\x94\x67\x38\x2e\x8f\x9b\x93\x00\xa6\x4a\xc3\xcd',
697db96d56Sopenharmony_ci             b'\xd5\xe6\xd9\x02\x67\x94\x2e\x38\x8f\x9b\x93\x00\xa6\x4a\xc3\xcd',
707db96d56Sopenharmony_ci             (0x02d9e6d5, 0x9467, 0x382e, 0x8f, 0x9b, 0x9300a64ac3cd),
717db96d56Sopenharmony_ci             0x02d9e6d59467382e8f9b9300a64ac3cd,
727db96d56Sopenharmony_ci             'urn:uuid:02d9e6d5-9467-382e-8f9b-9300a64ac3cd',
737db96d56Sopenharmony_ci             0x82e946702d9e6d5, 0xf9b, self.uuid.RFC_4122, 3),
747db96d56Sopenharmony_ci            ('12345678-1234-5678-1234-567812345678',
757db96d56Sopenharmony_ci             '{12345678-1234-5678-1234-567812345678}',
767db96d56Sopenharmony_ci             '12345678123456781234567812345678',
777db96d56Sopenharmony_ci             b'\x12\x34\x56\x78'*4,
787db96d56Sopenharmony_ci             b'\x78\x56\x34\x12\x34\x12\x78\x56\x12\x34\x56\x78\x12\x34\x56\x78',
797db96d56Sopenharmony_ci             (0x12345678, 0x1234, 0x5678, 0x12, 0x34, 0x567812345678),
807db96d56Sopenharmony_ci             0x12345678123456781234567812345678,
817db96d56Sopenharmony_ci             'urn:uuid:12345678-1234-5678-1234-567812345678',
827db96d56Sopenharmony_ci             0x678123412345678, 0x1234, self.uuid.RESERVED_NCS, None),
837db96d56Sopenharmony_ci            ('6ba7b810-9dad-11d1-80b4-00c04fd430c8',
847db96d56Sopenharmony_ci             '{6ba7b810-9dad-11d1-80b4-00c04fd430c8}',
857db96d56Sopenharmony_ci             '6ba7b8109dad11d180b400c04fd430c8',
867db96d56Sopenharmony_ci             b'\x6b\xa7\xb8\x10\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8',
877db96d56Sopenharmony_ci             b'\x10\xb8\xa7\x6b\xad\x9d\xd1\x11\x80\xb4\x00\xc0\x4f\xd4\x30\xc8',
887db96d56Sopenharmony_ci             (0x6ba7b810, 0x9dad, 0x11d1, 0x80, 0xb4, 0x00c04fd430c8),
897db96d56Sopenharmony_ci             0x6ba7b8109dad11d180b400c04fd430c8,
907db96d56Sopenharmony_ci             'urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8',
917db96d56Sopenharmony_ci             0x1d19dad6ba7b810, 0xb4, self.uuid.RFC_4122, 1),
927db96d56Sopenharmony_ci            ('6ba7b811-9dad-11d1-80b4-00c04fd430c8',
937db96d56Sopenharmony_ci             '{6ba7b811-9dad-11d1-80b4-00c04fd430c8}',
947db96d56Sopenharmony_ci             '6ba7b8119dad11d180b400c04fd430c8',
957db96d56Sopenharmony_ci             b'\x6b\xa7\xb8\x11\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8',
967db96d56Sopenharmony_ci             b'\x11\xb8\xa7\x6b\xad\x9d\xd1\x11\x80\xb4\x00\xc0\x4f\xd4\x30\xc8',
977db96d56Sopenharmony_ci             (0x6ba7b811, 0x9dad, 0x11d1, 0x80, 0xb4, 0x00c04fd430c8),
987db96d56Sopenharmony_ci             0x6ba7b8119dad11d180b400c04fd430c8,
997db96d56Sopenharmony_ci             'urn:uuid:6ba7b811-9dad-11d1-80b4-00c04fd430c8',
1007db96d56Sopenharmony_ci             0x1d19dad6ba7b811, 0xb4, self.uuid.RFC_4122, 1),
1017db96d56Sopenharmony_ci            ('6ba7b812-9dad-11d1-80b4-00c04fd430c8',
1027db96d56Sopenharmony_ci             '{6ba7b812-9dad-11d1-80b4-00c04fd430c8}',
1037db96d56Sopenharmony_ci             '6ba7b8129dad11d180b400c04fd430c8',
1047db96d56Sopenharmony_ci             b'\x6b\xa7\xb8\x12\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8',
1057db96d56Sopenharmony_ci             b'\x12\xb8\xa7\x6b\xad\x9d\xd1\x11\x80\xb4\x00\xc0\x4f\xd4\x30\xc8',
1067db96d56Sopenharmony_ci             (0x6ba7b812, 0x9dad, 0x11d1, 0x80, 0xb4, 0x00c04fd430c8),
1077db96d56Sopenharmony_ci             0x6ba7b8129dad11d180b400c04fd430c8,
1087db96d56Sopenharmony_ci             'urn:uuid:6ba7b812-9dad-11d1-80b4-00c04fd430c8',
1097db96d56Sopenharmony_ci             0x1d19dad6ba7b812, 0xb4, self.uuid.RFC_4122, 1),
1107db96d56Sopenharmony_ci            ('6ba7b814-9dad-11d1-80b4-00c04fd430c8',
1117db96d56Sopenharmony_ci             '{6ba7b814-9dad-11d1-80b4-00c04fd430c8}',
1127db96d56Sopenharmony_ci             '6ba7b8149dad11d180b400c04fd430c8',
1137db96d56Sopenharmony_ci             b'\x6b\xa7\xb8\x14\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8',
1147db96d56Sopenharmony_ci             b'\x14\xb8\xa7\x6b\xad\x9d\xd1\x11\x80\xb4\x00\xc0\x4f\xd4\x30\xc8',
1157db96d56Sopenharmony_ci             (0x6ba7b814, 0x9dad, 0x11d1, 0x80, 0xb4, 0x00c04fd430c8),
1167db96d56Sopenharmony_ci             0x6ba7b8149dad11d180b400c04fd430c8,
1177db96d56Sopenharmony_ci             'urn:uuid:6ba7b814-9dad-11d1-80b4-00c04fd430c8',
1187db96d56Sopenharmony_ci             0x1d19dad6ba7b814, 0xb4, self.uuid.RFC_4122, 1),
1197db96d56Sopenharmony_ci            ('7d444840-9dc0-11d1-b245-5ffdce74fad2',
1207db96d56Sopenharmony_ci             '{7d444840-9dc0-11d1-b245-5ffdce74fad2}',
1217db96d56Sopenharmony_ci             '7d4448409dc011d1b2455ffdce74fad2',
1227db96d56Sopenharmony_ci             b'\x7d\x44\x48\x40\x9d\xc0\x11\xd1\xb2\x45\x5f\xfd\xce\x74\xfa\xd2',
1237db96d56Sopenharmony_ci             b'\x40\x48\x44\x7d\xc0\x9d\xd1\x11\xb2\x45\x5f\xfd\xce\x74\xfa\xd2',
1247db96d56Sopenharmony_ci             (0x7d444840, 0x9dc0, 0x11d1, 0xb2, 0x45, 0x5ffdce74fad2),
1257db96d56Sopenharmony_ci             0x7d4448409dc011d1b2455ffdce74fad2,
1267db96d56Sopenharmony_ci             'urn:uuid:7d444840-9dc0-11d1-b245-5ffdce74fad2',
1277db96d56Sopenharmony_ci             0x1d19dc07d444840, 0x3245, self.uuid.RFC_4122, 1),
1287db96d56Sopenharmony_ci            ('e902893a-9d22-3c7e-a7b8-d6e313b71d9f',
1297db96d56Sopenharmony_ci             '{e902893a-9d22-3c7e-a7b8-d6e313b71d9f}',
1307db96d56Sopenharmony_ci             'e902893a9d223c7ea7b8d6e313b71d9f',
1317db96d56Sopenharmony_ci             b'\xe9\x02\x89\x3a\x9d\x22\x3c\x7e\xa7\xb8\xd6\xe3\x13\xb7\x1d\x9f',
1327db96d56Sopenharmony_ci             b'\x3a\x89\x02\xe9\x22\x9d\x7e\x3c\xa7\xb8\xd6\xe3\x13\xb7\x1d\x9f',
1337db96d56Sopenharmony_ci             (0xe902893a, 0x9d22, 0x3c7e, 0xa7, 0xb8, 0xd6e313b71d9f),
1347db96d56Sopenharmony_ci             0xe902893a9d223c7ea7b8d6e313b71d9f,
1357db96d56Sopenharmony_ci             'urn:uuid:e902893a-9d22-3c7e-a7b8-d6e313b71d9f',
1367db96d56Sopenharmony_ci             0xc7e9d22e902893a, 0x27b8, self.uuid.RFC_4122, 3),
1377db96d56Sopenharmony_ci            ('eb424026-6f54-4ef8-a4d0-bb658a1fc6cf',
1387db96d56Sopenharmony_ci             '{eb424026-6f54-4ef8-a4d0-bb658a1fc6cf}',
1397db96d56Sopenharmony_ci             'eb4240266f544ef8a4d0bb658a1fc6cf',
1407db96d56Sopenharmony_ci             b'\xeb\x42\x40\x26\x6f\x54\x4e\xf8\xa4\xd0\xbb\x65\x8a\x1f\xc6\xcf',
1417db96d56Sopenharmony_ci             b'\x26\x40\x42\xeb\x54\x6f\xf8\x4e\xa4\xd0\xbb\x65\x8a\x1f\xc6\xcf',
1427db96d56Sopenharmony_ci             (0xeb424026, 0x6f54, 0x4ef8, 0xa4, 0xd0, 0xbb658a1fc6cf),
1437db96d56Sopenharmony_ci             0xeb4240266f544ef8a4d0bb658a1fc6cf,
1447db96d56Sopenharmony_ci             'urn:uuid:eb424026-6f54-4ef8-a4d0-bb658a1fc6cf',
1457db96d56Sopenharmony_ci             0xef86f54eb424026, 0x24d0, self.uuid.RFC_4122, 4),
1467db96d56Sopenharmony_ci            ('f81d4fae-7dec-11d0-a765-00a0c91e6bf6',
1477db96d56Sopenharmony_ci             '{f81d4fae-7dec-11d0-a765-00a0c91e6bf6}',
1487db96d56Sopenharmony_ci             'f81d4fae7dec11d0a76500a0c91e6bf6',
1497db96d56Sopenharmony_ci             b'\xf8\x1d\x4f\xae\x7d\xec\x11\xd0\xa7\x65\x00\xa0\xc9\x1e\x6b\xf6',
1507db96d56Sopenharmony_ci             b'\xae\x4f\x1d\xf8\xec\x7d\xd0\x11\xa7\x65\x00\xa0\xc9\x1e\x6b\xf6',
1517db96d56Sopenharmony_ci             (0xf81d4fae, 0x7dec, 0x11d0, 0xa7, 0x65, 0x00a0c91e6bf6),
1527db96d56Sopenharmony_ci             0xf81d4fae7dec11d0a76500a0c91e6bf6,
1537db96d56Sopenharmony_ci             'urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6',
1547db96d56Sopenharmony_ci             0x1d07decf81d4fae, 0x2765, self.uuid.RFC_4122, 1),
1557db96d56Sopenharmony_ci            ('fffefdfc-fffe-fffe-fffe-fffefdfcfbfa',
1567db96d56Sopenharmony_ci             '{fffefdfc-fffe-fffe-fffe-fffefdfcfbfa}',
1577db96d56Sopenharmony_ci             'fffefdfcfffefffefffefffefdfcfbfa',
1587db96d56Sopenharmony_ci             b'\xff\xfe\xfd\xfc\xff\xfe\xff\xfe\xff\xfe\xff\xfe\xfd\xfc\xfb\xfa',
1597db96d56Sopenharmony_ci             b'\xfc\xfd\xfe\xff\xfe\xff\xfe\xff\xff\xfe\xff\xfe\xfd\xfc\xfb\xfa',
1607db96d56Sopenharmony_ci             (0xfffefdfc, 0xfffe, 0xfffe, 0xff, 0xfe, 0xfffefdfcfbfa),
1617db96d56Sopenharmony_ci             0xfffefdfcfffefffefffefffefdfcfbfa,
1627db96d56Sopenharmony_ci             'urn:uuid:fffefdfc-fffe-fffe-fffe-fffefdfcfbfa',
1637db96d56Sopenharmony_ci             0xffefffefffefdfc, 0x3ffe, self.uuid.RESERVED_FUTURE, None),
1647db96d56Sopenharmony_ci            ('ffffffff-ffff-ffff-ffff-ffffffffffff',
1657db96d56Sopenharmony_ci             '{ffffffff-ffff-ffff-ffff-ffffffffffff}',
1667db96d56Sopenharmony_ci             'ffffffffffffffffffffffffffffffff',
1677db96d56Sopenharmony_ci             b'\xff'*16,
1687db96d56Sopenharmony_ci             b'\xff'*16,
1697db96d56Sopenharmony_ci             (0xffffffff, 0xffff, 0xffff, 0xff, 0xff, 0xffffffffffff),
1707db96d56Sopenharmony_ci             0xffffffffffffffffffffffffffffffff,
1717db96d56Sopenharmony_ci             'urn:uuid:ffffffff-ffff-ffff-ffff-ffffffffffff',
1727db96d56Sopenharmony_ci             0xfffffffffffffff, 0x3fff, self.uuid.RESERVED_FUTURE, None),
1737db96d56Sopenharmony_ci            ]:
1747db96d56Sopenharmony_ci            equivalents = []
1757db96d56Sopenharmony_ci            # Construct each UUID in several different ways.
1767db96d56Sopenharmony_ci            for u in [self.uuid.UUID(string), self.uuid.UUID(curly), self.uuid.UUID(hex),
1777db96d56Sopenharmony_ci                      self.uuid.UUID(bytes=bytes), self.uuid.UUID(bytes_le=bytes_le),
1787db96d56Sopenharmony_ci                      self.uuid.UUID(fields=fields), self.uuid.UUID(int=integer),
1797db96d56Sopenharmony_ci                      self.uuid.UUID(urn)]:
1807db96d56Sopenharmony_ci                # Test all conversions and properties of the UUID object.
1817db96d56Sopenharmony_ci                equal(str(u), string)
1827db96d56Sopenharmony_ci                equal(int(u), integer)
1837db96d56Sopenharmony_ci                equal(u.bytes, bytes)
1847db96d56Sopenharmony_ci                equal(u.bytes_le, bytes_le)
1857db96d56Sopenharmony_ci                equal(u.fields, fields)
1867db96d56Sopenharmony_ci                equal(u.time_low, fields[0])
1877db96d56Sopenharmony_ci                equal(u.time_mid, fields[1])
1887db96d56Sopenharmony_ci                equal(u.time_hi_version, fields[2])
1897db96d56Sopenharmony_ci                equal(u.clock_seq_hi_variant, fields[3])
1907db96d56Sopenharmony_ci                equal(u.clock_seq_low, fields[4])
1917db96d56Sopenharmony_ci                equal(u.node, fields[5])
1927db96d56Sopenharmony_ci                equal(u.hex, hex)
1937db96d56Sopenharmony_ci                equal(u.int, integer)
1947db96d56Sopenharmony_ci                equal(u.urn, urn)
1957db96d56Sopenharmony_ci                equal(u.time, time)
1967db96d56Sopenharmony_ci                equal(u.clock_seq, clock_seq)
1977db96d56Sopenharmony_ci                equal(u.variant, variant)
1987db96d56Sopenharmony_ci                equal(u.version, version)
1997db96d56Sopenharmony_ci                equivalents.append(u)
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci            # Different construction methods should give the same UUID.
2027db96d56Sopenharmony_ci            for u in equivalents:
2037db96d56Sopenharmony_ci                for v in equivalents:
2047db96d56Sopenharmony_ci                    equal(u, v)
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci            # Bug 7380: "bytes" and "bytes_le" should give the same type.
2077db96d56Sopenharmony_ci            equal(type(u.bytes), builtins.bytes)
2087db96d56Sopenharmony_ci            equal(type(u.bytes_le), builtins.bytes)
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci            ascending.append(u)
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci        # Test comparison of UUIDs.
2137db96d56Sopenharmony_ci        for i in range(len(ascending)):
2147db96d56Sopenharmony_ci            for j in range(len(ascending)):
2157db96d56Sopenharmony_ci                equal(i < j, ascending[i] < ascending[j])
2167db96d56Sopenharmony_ci                equal(i <= j, ascending[i] <= ascending[j])
2177db96d56Sopenharmony_ci                equal(i == j, ascending[i] == ascending[j])
2187db96d56Sopenharmony_ci                equal(i > j, ascending[i] > ascending[j])
2197db96d56Sopenharmony_ci                equal(i >= j, ascending[i] >= ascending[j])
2207db96d56Sopenharmony_ci                equal(i != j, ascending[i] != ascending[j])
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci        # Test sorting of UUIDs (above list is in ascending order).
2237db96d56Sopenharmony_ci        resorted = ascending[:]
2247db96d56Sopenharmony_ci        resorted.reverse()
2257db96d56Sopenharmony_ci        resorted.sort()
2267db96d56Sopenharmony_ci        equal(ascending, resorted)
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci    def test_exceptions(self):
2297db96d56Sopenharmony_ci        badvalue = lambda f: self.assertRaises(ValueError, f)
2307db96d56Sopenharmony_ci        badtype = lambda f: self.assertRaises(TypeError, f)
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci        # Badly formed hex strings.
2337db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(''))
2347db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID('abc'))
2357db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID('1234567812345678123456781234567'))
2367db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID('123456781234567812345678123456789'))
2377db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID('123456781234567812345678z2345678'))
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci        # Badly formed bytes.
2407db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(bytes='abc'))
2417db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(bytes='\0'*15))
2427db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(bytes='\0'*17))
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci        # Badly formed bytes_le.
2457db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(bytes_le='abc'))
2467db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(bytes_le='\0'*15))
2477db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(bytes_le='\0'*17))
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ci        # Badly formed fields.
2507db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(1,)))
2517db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(1, 2, 3, 4, 5)))
2527db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(1, 2, 3, 4, 5, 6, 7)))
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci        # Field values out of range.
2557db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(-1, 0, 0, 0, 0, 0)))
2567db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(0x100000000, 0, 0, 0, 0, 0)))
2577db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(0, -1, 0, 0, 0, 0)))
2587db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(0, 0x10000, 0, 0, 0, 0)))
2597db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(0, 0, -1, 0, 0, 0)))
2607db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(0, 0, 0x10000, 0, 0, 0)))
2617db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(0, 0, 0, -1, 0, 0)))
2627db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(0, 0, 0, 0x100, 0, 0)))
2637db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(0, 0, 0, 0, -1, 0)))
2647db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(0, 0, 0, 0, 0x100, 0)))
2657db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(0, 0, 0, 0, 0, -1)))
2667db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(fields=(0, 0, 0, 0, 0, 0x1000000000000)))
2677db96d56Sopenharmony_ci
2687db96d56Sopenharmony_ci        # Version number out of range.
2697db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID('00'*16, version=0))
2707db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID('00'*16, version=6))
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci        # Integer value out of range.
2737db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(int=-1))
2747db96d56Sopenharmony_ci        badvalue(lambda: self.uuid.UUID(int=1<<128))
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci        # Must supply exactly one of hex, bytes, fields, int.
2777db96d56Sopenharmony_ci        h, b, f, i = '00'*16, b'\0'*16, (0, 0, 0, 0, 0, 0), 0
2787db96d56Sopenharmony_ci        self.uuid.UUID(h)
2797db96d56Sopenharmony_ci        self.uuid.UUID(hex=h)
2807db96d56Sopenharmony_ci        self.uuid.UUID(bytes=b)
2817db96d56Sopenharmony_ci        self.uuid.UUID(bytes_le=b)
2827db96d56Sopenharmony_ci        self.uuid.UUID(fields=f)
2837db96d56Sopenharmony_ci        self.uuid.UUID(int=i)
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci        # Wrong number of arguments (positional).
2867db96d56Sopenharmony_ci        badtype(lambda: self.uuid.UUID())
2877db96d56Sopenharmony_ci        badtype(lambda: self.uuid.UUID(h, b))
2887db96d56Sopenharmony_ci        badtype(lambda: self.uuid.UUID(h, b, b))
2897db96d56Sopenharmony_ci        badtype(lambda: self.uuid.UUID(h, b, b, f))
2907db96d56Sopenharmony_ci        badtype(lambda: self.uuid.UUID(h, b, b, f, i))
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci        # Duplicate arguments.
2937db96d56Sopenharmony_ci        for hh in [[], [('hex', h)]]:
2947db96d56Sopenharmony_ci            for bb in [[], [('bytes', b)]]:
2957db96d56Sopenharmony_ci                for bble in [[], [('bytes_le', b)]]:
2967db96d56Sopenharmony_ci                    for ii in [[], [('int', i)]]:
2977db96d56Sopenharmony_ci                        for ff in [[], [('fields', f)]]:
2987db96d56Sopenharmony_ci                            args = dict(hh + bb + bble + ii + ff)
2997db96d56Sopenharmony_ci                            if len(args) != 0:
3007db96d56Sopenharmony_ci                                badtype(lambda: self.uuid.UUID(h, **args))
3017db96d56Sopenharmony_ci                            if len(args) != 1:
3027db96d56Sopenharmony_ci                                badtype(lambda: self.uuid.UUID(**args))
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci        # Immutability.
3057db96d56Sopenharmony_ci        u = self.uuid.UUID(h)
3067db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'hex', h))
3077db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'bytes', b))
3087db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'bytes_le', b))
3097db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'fields', f))
3107db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'int', i))
3117db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'time_low', 0))
3127db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'time_mid', 0))
3137db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'time_hi_version', 0))
3147db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'time_hi_version', 0))
3157db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'clock_seq_hi_variant', 0))
3167db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'clock_seq_low', 0))
3177db96d56Sopenharmony_ci        badtype(lambda: setattr(u, 'node', 0))
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ci        # Comparison with a non-UUID object
3207db96d56Sopenharmony_ci        badtype(lambda: u < object())
3217db96d56Sopenharmony_ci        badtype(lambda: u > object())
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci    def test_getnode(self):
3247db96d56Sopenharmony_ci        node1 = self.uuid.getnode()
3257db96d56Sopenharmony_ci        self.assertTrue(0 < node1 < (1 << 48), '%012x' % node1)
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ci        # Test it again to ensure consistency.
3287db96d56Sopenharmony_ci        node2 = self.uuid.getnode()
3297db96d56Sopenharmony_ci        self.assertEqual(node1, node2, '%012x != %012x' % (node1, node2))
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ci    def test_pickle_roundtrip(self):
3327db96d56Sopenharmony_ci        def check(actual, expected):
3337db96d56Sopenharmony_ci            self.assertEqual(actual, expected)
3347db96d56Sopenharmony_ci            self.assertEqual(actual.is_safe, expected.is_safe)
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci        with support.swap_item(sys.modules, 'uuid', self.uuid):
3377db96d56Sopenharmony_ci            for is_safe in self.uuid.SafeUUID:
3387db96d56Sopenharmony_ci                u = self.uuid.UUID('d82579ce6642a0de7ddf490a7aec7aa5',
3397db96d56Sopenharmony_ci                                   is_safe=is_safe)
3407db96d56Sopenharmony_ci                check(copy.copy(u), u)
3417db96d56Sopenharmony_ci                check(copy.deepcopy(u), u)
3427db96d56Sopenharmony_ci                for proto in range(pickle.HIGHEST_PROTOCOL + 1):
3437db96d56Sopenharmony_ci                    with self.subTest(protocol=proto):
3447db96d56Sopenharmony_ci                        check(pickle.loads(pickle.dumps(u, proto)), u)
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci    def test_unpickle_previous_python_versions(self):
3477db96d56Sopenharmony_ci        def check(actual, expected):
3487db96d56Sopenharmony_ci            self.assertEqual(actual, expected)
3497db96d56Sopenharmony_ci            self.assertEqual(actual.is_safe, expected.is_safe)
3507db96d56Sopenharmony_ci
3517db96d56Sopenharmony_ci        pickled_uuids = [
3527db96d56Sopenharmony_ci            # Python 2.7, protocol 0
3537db96d56Sopenharmony_ci            b'ccopy_reg\n_reconstructor\n(cuuid\nUUID\nc__builtin__\nobject\nN'
3547db96d56Sopenharmony_ci            b'tR(dS\'int\'\nL287307832597519156748809049798316161701L\nsb.',
3557db96d56Sopenharmony_ci            # Python 2.7, protocol 1
3567db96d56Sopenharmony_ci            b'ccopy_reg\n_reconstructor\n(cuuid\nUUID\nc__builtin__\nobject\nN'
3577db96d56Sopenharmony_ci            b'tR}U\x03intL287307832597519156748809049798316161701L\nsb.',
3587db96d56Sopenharmony_ci            # Python 2.7, protocol 2
3597db96d56Sopenharmony_ci            b'\x80\x02cuuid\nUUID\n)\x81}U\x03int\x8a\x11\xa5z\xecz\nI\xdf}'
3607db96d56Sopenharmony_ci            b'\xde\xa0Bf\xcey%\xd8\x00sb.',
3617db96d56Sopenharmony_ci            # Python 3.6, protocol 0
3627db96d56Sopenharmony_ci            b'ccopy_reg\n_reconstructor\n(cuuid\nUUID\nc__builtin__\nobject\nN'
3637db96d56Sopenharmony_ci            b'tR(dVint\nL287307832597519156748809049798316161701L\nsb.',
3647db96d56Sopenharmony_ci            # Python 3.6, protocol 1
3657db96d56Sopenharmony_ci            b'ccopy_reg\n_reconstructor\n(cuuid\nUUID\nc__builtin__\nobject\nN'
3667db96d56Sopenharmony_ci            b'tR}X\x03\x00\x00\x00intL287307832597519156748809049798316161701L'
3677db96d56Sopenharmony_ci            b'\nsb.',
3687db96d56Sopenharmony_ci            # Python 3.6, protocol 2
3697db96d56Sopenharmony_ci            b'\x80\x02cuuid\nUUID\n)\x81}X\x03\x00\x00\x00int\x8a\x11\xa5z\xec'
3707db96d56Sopenharmony_ci            b'z\nI\xdf}\xde\xa0Bf\xcey%\xd8\x00sb.',
3717db96d56Sopenharmony_ci            # Python 3.6, protocol 3
3727db96d56Sopenharmony_ci            b'\x80\x03cuuid\nUUID\n)\x81}X\x03\x00\x00\x00int\x8a\x11\xa5z\xec'
3737db96d56Sopenharmony_ci            b'z\nI\xdf}\xde\xa0Bf\xcey%\xd8\x00sb.',
3747db96d56Sopenharmony_ci            # Python 3.6, protocol 4
3757db96d56Sopenharmony_ci            b'\x80\x04\x95+\x00\x00\x00\x00\x00\x00\x00\x8c\x04uuid\x8c\x04UUI'
3767db96d56Sopenharmony_ci            b'D\x93)\x81}\x8c\x03int\x8a\x11\xa5z\xecz\nI\xdf}\xde\xa0Bf\xcey%'
3777db96d56Sopenharmony_ci            b'\xd8\x00sb.',
3787db96d56Sopenharmony_ci            # Python 3.7, protocol 0
3797db96d56Sopenharmony_ci            b'ccopy_reg\n_reconstructor\n(cuuid\nUUID\nc__builtin__\nobject\nN'
3807db96d56Sopenharmony_ci            b'tR(dVint\nL287307832597519156748809049798316161701L\nsVis_safe\n'
3817db96d56Sopenharmony_ci            b'cuuid\nSafeUUID\n(NtRsb.',
3827db96d56Sopenharmony_ci            # Python 3.7, protocol 1
3837db96d56Sopenharmony_ci            b'ccopy_reg\n_reconstructor\n(cuuid\nUUID\nc__builtin__\nobject\nN'
3847db96d56Sopenharmony_ci            b'tR}(X\x03\x00\x00\x00intL287307832597519156748809049798316161701'
3857db96d56Sopenharmony_ci            b'L\nX\x07\x00\x00\x00is_safecuuid\nSafeUUID\n(NtRub.',
3867db96d56Sopenharmony_ci            # Python 3.7, protocol 2
3877db96d56Sopenharmony_ci            b'\x80\x02cuuid\nUUID\n)\x81}(X\x03\x00\x00\x00int\x8a\x11\xa5z'
3887db96d56Sopenharmony_ci            b'\xecz\nI\xdf}\xde\xa0Bf\xcey%\xd8\x00X\x07\x00\x00\x00is_safecuu'
3897db96d56Sopenharmony_ci            b'id\nSafeUUID\nN\x85Rub.',
3907db96d56Sopenharmony_ci            # Python 3.7, protocol 3
3917db96d56Sopenharmony_ci            b'\x80\x03cuuid\nUUID\n)\x81}(X\x03\x00\x00\x00int\x8a\x11\xa5z'
3927db96d56Sopenharmony_ci            b'\xecz\nI\xdf}\xde\xa0Bf\xcey%\xd8\x00X\x07\x00\x00\x00is_safecuu'
3937db96d56Sopenharmony_ci            b'id\nSafeUUID\nN\x85Rub.',
3947db96d56Sopenharmony_ci            # Python 3.7, protocol 4
3957db96d56Sopenharmony_ci            b'\x80\x04\x95F\x00\x00\x00\x00\x00\x00\x00\x8c\x04uuid\x94\x8c'
3967db96d56Sopenharmony_ci            b'\x04UUID\x93)\x81}(\x8c\x03int\x8a\x11\xa5z\xecz\nI\xdf}\xde\xa0'
3977db96d56Sopenharmony_ci            b'Bf\xcey%\xd8\x00\x8c\x07is_safeh\x00\x8c\x08SafeUUID\x93N\x85Rub'
3987db96d56Sopenharmony_ci            b'.',
3997db96d56Sopenharmony_ci        ]
4007db96d56Sopenharmony_ci        pickled_uuids_safe = [
4017db96d56Sopenharmony_ci            # Python 3.7, protocol 0
4027db96d56Sopenharmony_ci            b'ccopy_reg\n_reconstructor\n(cuuid\nUUID\nc__builtin__\nobject\nN'
4037db96d56Sopenharmony_ci            b'tR(dVint\nL287307832597519156748809049798316161701L\nsVis_safe\n'
4047db96d56Sopenharmony_ci            b'cuuid\nSafeUUID\n(I0\ntRsb.',
4057db96d56Sopenharmony_ci            # Python 3.7, protocol 1
4067db96d56Sopenharmony_ci            b'ccopy_reg\n_reconstructor\n(cuuid\nUUID\nc__builtin__\nobject\nN'
4077db96d56Sopenharmony_ci            b'tR}(X\x03\x00\x00\x00intL287307832597519156748809049798316161701'
4087db96d56Sopenharmony_ci            b'L\nX\x07\x00\x00\x00is_safecuuid\nSafeUUID\n(K\x00tRub.',
4097db96d56Sopenharmony_ci            # Python 3.7, protocol 2
4107db96d56Sopenharmony_ci            b'\x80\x02cuuid\nUUID\n)\x81}(X\x03\x00\x00\x00int\x8a\x11\xa5z'
4117db96d56Sopenharmony_ci            b'\xecz\nI\xdf}\xde\xa0Bf\xcey%\xd8\x00X\x07\x00\x00\x00is_safecuu'
4127db96d56Sopenharmony_ci            b'id\nSafeUUID\nK\x00\x85Rub.',
4137db96d56Sopenharmony_ci            # Python 3.7, protocol 3
4147db96d56Sopenharmony_ci            b'\x80\x03cuuid\nUUID\n)\x81}(X\x03\x00\x00\x00int\x8a\x11\xa5z'
4157db96d56Sopenharmony_ci            b'\xecz\nI\xdf}\xde\xa0Bf\xcey%\xd8\x00X\x07\x00\x00\x00is_safecuu'
4167db96d56Sopenharmony_ci            b'id\nSafeUUID\nK\x00\x85Rub.',
4177db96d56Sopenharmony_ci            # Python 3.7, protocol 4
4187db96d56Sopenharmony_ci            b'\x80\x04\x95G\x00\x00\x00\x00\x00\x00\x00\x8c\x04uuid\x94\x8c'
4197db96d56Sopenharmony_ci            b'\x04UUID\x93)\x81}(\x8c\x03int\x8a\x11\xa5z\xecz\nI\xdf}\xde\xa0'
4207db96d56Sopenharmony_ci            b'Bf\xcey%\xd8\x00\x8c\x07is_safeh\x00\x8c\x08SafeUUID\x93K\x00'
4217db96d56Sopenharmony_ci            b'\x85Rub.',
4227db96d56Sopenharmony_ci        ]
4237db96d56Sopenharmony_ci        pickled_uuids_unsafe = [
4247db96d56Sopenharmony_ci            # Python 3.7, protocol 0
4257db96d56Sopenharmony_ci            b'ccopy_reg\n_reconstructor\n(cuuid\nUUID\nc__builtin__\nobject\nN'
4267db96d56Sopenharmony_ci            b'tR(dVint\nL287307832597519156748809049798316161701L\nsVis_safe\n'
4277db96d56Sopenharmony_ci            b'cuuid\nSafeUUID\n(I-1\ntRsb.',
4287db96d56Sopenharmony_ci            # Python 3.7, protocol 1
4297db96d56Sopenharmony_ci            b'ccopy_reg\n_reconstructor\n(cuuid\nUUID\nc__builtin__\nobject\nN'
4307db96d56Sopenharmony_ci            b'tR}(X\x03\x00\x00\x00intL287307832597519156748809049798316161701'
4317db96d56Sopenharmony_ci            b'L\nX\x07\x00\x00\x00is_safecuuid\nSafeUUID\n(J\xff\xff\xff\xfftR'
4327db96d56Sopenharmony_ci            b'ub.',
4337db96d56Sopenharmony_ci            # Python 3.7, protocol 2
4347db96d56Sopenharmony_ci            b'\x80\x02cuuid\nUUID\n)\x81}(X\x03\x00\x00\x00int\x8a\x11\xa5z'
4357db96d56Sopenharmony_ci            b'\xecz\nI\xdf}\xde\xa0Bf\xcey%\xd8\x00X\x07\x00\x00\x00is_safecuu'
4367db96d56Sopenharmony_ci            b'id\nSafeUUID\nJ\xff\xff\xff\xff\x85Rub.',
4377db96d56Sopenharmony_ci            # Python 3.7, protocol 3
4387db96d56Sopenharmony_ci            b'\x80\x03cuuid\nUUID\n)\x81}(X\x03\x00\x00\x00int\x8a\x11\xa5z'
4397db96d56Sopenharmony_ci            b'\xecz\nI\xdf}\xde\xa0Bf\xcey%\xd8\x00X\x07\x00\x00\x00is_safecuu'
4407db96d56Sopenharmony_ci            b'id\nSafeUUID\nJ\xff\xff\xff\xff\x85Rub.',
4417db96d56Sopenharmony_ci            # Python 3.7, protocol 4
4427db96d56Sopenharmony_ci            b'\x80\x04\x95J\x00\x00\x00\x00\x00\x00\x00\x8c\x04uuid\x94\x8c'
4437db96d56Sopenharmony_ci            b'\x04UUID\x93)\x81}(\x8c\x03int\x8a\x11\xa5z\xecz\nI\xdf}\xde\xa0'
4447db96d56Sopenharmony_ci            b'Bf\xcey%\xd8\x00\x8c\x07is_safeh\x00\x8c\x08SafeUUID\x93J\xff'
4457db96d56Sopenharmony_ci            b'\xff\xff\xff\x85Rub.',
4467db96d56Sopenharmony_ci        ]
4477db96d56Sopenharmony_ci
4487db96d56Sopenharmony_ci        u = self.uuid.UUID('d82579ce6642a0de7ddf490a7aec7aa5')
4497db96d56Sopenharmony_ci        u_safe = self.uuid.UUID('d82579ce6642a0de7ddf490a7aec7aa5',
4507db96d56Sopenharmony_ci                                is_safe=self.uuid.SafeUUID.safe)
4517db96d56Sopenharmony_ci        u_unsafe = self.uuid.UUID('d82579ce6642a0de7ddf490a7aec7aa5',
4527db96d56Sopenharmony_ci                                  is_safe=self.uuid.SafeUUID.unsafe)
4537db96d56Sopenharmony_ci
4547db96d56Sopenharmony_ci        with support.swap_item(sys.modules, 'uuid', self.uuid):
4557db96d56Sopenharmony_ci            for pickled in pickled_uuids:
4567db96d56Sopenharmony_ci                # is_safe was added in 3.7.  When unpickling values from older
4577db96d56Sopenharmony_ci                # versions, is_safe will be missing, so it should be set to
4587db96d56Sopenharmony_ci                # SafeUUID.unknown.
4597db96d56Sopenharmony_ci                check(pickle.loads(pickled), u)
4607db96d56Sopenharmony_ci            for pickled in pickled_uuids_safe:
4617db96d56Sopenharmony_ci                check(pickle.loads(pickled), u_safe)
4627db96d56Sopenharmony_ci            for pickled in pickled_uuids_unsafe:
4637db96d56Sopenharmony_ci                check(pickle.loads(pickled), u_unsafe)
4647db96d56Sopenharmony_ci
4657db96d56Sopenharmony_ci    # bpo-32502: UUID1 requires a 48-bit identifier, but hardware identifiers
4667db96d56Sopenharmony_ci    # need not necessarily be 48 bits (e.g., EUI-64).
4677db96d56Sopenharmony_ci    def test_uuid1_eui64(self):
4687db96d56Sopenharmony_ci        # Confirm that uuid.getnode ignores hardware addresses larger than 48
4697db96d56Sopenharmony_ci        # bits. Mock out each platform's *_getnode helper functions to return
4707db96d56Sopenharmony_ci        # something just larger than 48 bits to test. This will cause
4717db96d56Sopenharmony_ci        # uuid.getnode to fall back on uuid._random_getnode, which will
4727db96d56Sopenharmony_ci        # generate a valid value.
4737db96d56Sopenharmony_ci        too_large_getter = lambda: 1 << 48
4747db96d56Sopenharmony_ci        with mock.patch.multiple(
4757db96d56Sopenharmony_ci            self.uuid,
4767db96d56Sopenharmony_ci            _node=None,  # Ignore any cached node value.
4777db96d56Sopenharmony_ci            _GETTERS=[too_large_getter],
4787db96d56Sopenharmony_ci        ):
4797db96d56Sopenharmony_ci            node = self.uuid.getnode()
4807db96d56Sopenharmony_ci        self.assertTrue(0 < node < (1 << 48), '%012x' % node)
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci        # Confirm that uuid1 can use the generated node, i.e., the that
4837db96d56Sopenharmony_ci        # uuid.getnode fell back on uuid._random_getnode() rather than using
4847db96d56Sopenharmony_ci        # the value from too_large_getter above.
4857db96d56Sopenharmony_ci        try:
4867db96d56Sopenharmony_ci            self.uuid.uuid1(node=node)
4877db96d56Sopenharmony_ci        except ValueError:
4887db96d56Sopenharmony_ci            self.fail('uuid1 was given an invalid node ID')
4897db96d56Sopenharmony_ci
4907db96d56Sopenharmony_ci    def test_uuid1(self):
4917db96d56Sopenharmony_ci        equal = self.assertEqual
4927db96d56Sopenharmony_ci
4937db96d56Sopenharmony_ci        # Make sure uuid1() generates UUIDs that are actually version 1.
4947db96d56Sopenharmony_ci        for u in [self.uuid.uuid1() for i in range(10)]:
4957db96d56Sopenharmony_ci            equal(u.variant, self.uuid.RFC_4122)
4967db96d56Sopenharmony_ci            equal(u.version, 1)
4977db96d56Sopenharmony_ci            self.assertIn(u.is_safe, {self.uuid.SafeUUID.safe,
4987db96d56Sopenharmony_ci                                      self.uuid.SafeUUID.unsafe,
4997db96d56Sopenharmony_ci                                      self.uuid.SafeUUID.unknown})
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci        # Make sure the generated UUIDs are actually unique.
5027db96d56Sopenharmony_ci        uuids = {}
5037db96d56Sopenharmony_ci        for u in [self.uuid.uuid1() for i in range(1000)]:
5047db96d56Sopenharmony_ci            uuids[u] = 1
5057db96d56Sopenharmony_ci        equal(len(uuids.keys()), 1000)
5067db96d56Sopenharmony_ci
5077db96d56Sopenharmony_ci        # Make sure the supplied node ID appears in the UUID.
5087db96d56Sopenharmony_ci        u = self.uuid.uuid1(0)
5097db96d56Sopenharmony_ci        equal(u.node, 0)
5107db96d56Sopenharmony_ci        u = self.uuid.uuid1(0x123456789abc)
5117db96d56Sopenharmony_ci        equal(u.node, 0x123456789abc)
5127db96d56Sopenharmony_ci        u = self.uuid.uuid1(0xffffffffffff)
5137db96d56Sopenharmony_ci        equal(u.node, 0xffffffffffff)
5147db96d56Sopenharmony_ci
5157db96d56Sopenharmony_ci        # Make sure the supplied clock sequence appears in the UUID.
5167db96d56Sopenharmony_ci        u = self.uuid.uuid1(0x123456789abc, 0)
5177db96d56Sopenharmony_ci        equal(u.node, 0x123456789abc)
5187db96d56Sopenharmony_ci        equal(((u.clock_seq_hi_variant & 0x3f) << 8) | u.clock_seq_low, 0)
5197db96d56Sopenharmony_ci        u = self.uuid.uuid1(0x123456789abc, 0x1234)
5207db96d56Sopenharmony_ci        equal(u.node, 0x123456789abc)
5217db96d56Sopenharmony_ci        equal(((u.clock_seq_hi_variant & 0x3f) << 8) |
5227db96d56Sopenharmony_ci                         u.clock_seq_low, 0x1234)
5237db96d56Sopenharmony_ci        u = self.uuid.uuid1(0x123456789abc, 0x3fff)
5247db96d56Sopenharmony_ci        equal(u.node, 0x123456789abc)
5257db96d56Sopenharmony_ci        equal(((u.clock_seq_hi_variant & 0x3f) << 8) |
5267db96d56Sopenharmony_ci                         u.clock_seq_low, 0x3fff)
5277db96d56Sopenharmony_ci
5287db96d56Sopenharmony_ci    # bpo-29925: On Mac OS X Tiger, self.uuid.uuid1().is_safe returns
5297db96d56Sopenharmony_ci    # self.uuid.SafeUUID.unknown
5307db96d56Sopenharmony_ci    @support.requires_mac_ver(10, 5)
5317db96d56Sopenharmony_ci    @unittest.skipUnless(os.name == 'posix', 'POSIX-only test')
5327db96d56Sopenharmony_ci    def test_uuid1_safe(self):
5337db96d56Sopenharmony_ci        if not self.uuid._has_uuid_generate_time_safe:
5347db96d56Sopenharmony_ci            self.skipTest('requires uuid_generate_time_safe(3)')
5357db96d56Sopenharmony_ci
5367db96d56Sopenharmony_ci        u = self.uuid.uuid1()
5377db96d56Sopenharmony_ci        # uuid_generate_time_safe() may return 0 or -1 but what it returns is
5387db96d56Sopenharmony_ci        # dependent on the underlying platform support.  At least it cannot be
5397db96d56Sopenharmony_ci        # unknown (unless I suppose the platform is buggy).
5407db96d56Sopenharmony_ci        self.assertNotEqual(u.is_safe, self.uuid.SafeUUID.unknown)
5417db96d56Sopenharmony_ci
5427db96d56Sopenharmony_ci    @contextlib.contextmanager
5437db96d56Sopenharmony_ci    def mock_generate_time_safe(self, safe_value):
5447db96d56Sopenharmony_ci        """
5457db96d56Sopenharmony_ci        Mock uuid._generate_time_safe() to return a given *safe_value*.
5467db96d56Sopenharmony_ci        """
5477db96d56Sopenharmony_ci        if os.name != 'posix':
5487db96d56Sopenharmony_ci            self.skipTest('POSIX-only test')
5497db96d56Sopenharmony_ci        self.uuid._load_system_functions()
5507db96d56Sopenharmony_ci        f = self.uuid._generate_time_safe
5517db96d56Sopenharmony_ci        if f is None:
5527db96d56Sopenharmony_ci            self.skipTest('need uuid._generate_time_safe')
5537db96d56Sopenharmony_ci        with mock.patch.object(self.uuid, '_generate_time_safe',
5547db96d56Sopenharmony_ci                               lambda: (f()[0], safe_value)):
5557db96d56Sopenharmony_ci            yield
5567db96d56Sopenharmony_ci
5577db96d56Sopenharmony_ci    @unittest.skipUnless(os.name == 'posix', 'POSIX-only test')
5587db96d56Sopenharmony_ci    def test_uuid1_unknown(self):
5597db96d56Sopenharmony_ci        # Even if the platform has uuid_generate_time_safe(), let's mock it to
5607db96d56Sopenharmony_ci        # be uuid_generate_time() and ensure the safety is unknown.
5617db96d56Sopenharmony_ci        with self.mock_generate_time_safe(None):
5627db96d56Sopenharmony_ci            u = self.uuid.uuid1()
5637db96d56Sopenharmony_ci            self.assertEqual(u.is_safe, self.uuid.SafeUUID.unknown)
5647db96d56Sopenharmony_ci
5657db96d56Sopenharmony_ci    @unittest.skipUnless(os.name == 'posix', 'POSIX-only test')
5667db96d56Sopenharmony_ci    def test_uuid1_is_safe(self):
5677db96d56Sopenharmony_ci        with self.mock_generate_time_safe(0):
5687db96d56Sopenharmony_ci            u = self.uuid.uuid1()
5697db96d56Sopenharmony_ci            self.assertEqual(u.is_safe, self.uuid.SafeUUID.safe)
5707db96d56Sopenharmony_ci
5717db96d56Sopenharmony_ci    @unittest.skipUnless(os.name == 'posix', 'POSIX-only test')
5727db96d56Sopenharmony_ci    def test_uuid1_is_unsafe(self):
5737db96d56Sopenharmony_ci        with self.mock_generate_time_safe(-1):
5747db96d56Sopenharmony_ci            u = self.uuid.uuid1()
5757db96d56Sopenharmony_ci            self.assertEqual(u.is_safe, self.uuid.SafeUUID.unsafe)
5767db96d56Sopenharmony_ci
5777db96d56Sopenharmony_ci    @unittest.skipUnless(os.name == 'posix', 'POSIX-only test')
5787db96d56Sopenharmony_ci    def test_uuid1_bogus_return_value(self):
5797db96d56Sopenharmony_ci        with self.mock_generate_time_safe(3):
5807db96d56Sopenharmony_ci            u = self.uuid.uuid1()
5817db96d56Sopenharmony_ci            self.assertEqual(u.is_safe, self.uuid.SafeUUID.unknown)
5827db96d56Sopenharmony_ci
5837db96d56Sopenharmony_ci    def test_uuid1_time(self):
5847db96d56Sopenharmony_ci        with mock.patch.object(self.uuid, '_has_uuid_generate_time_safe', False), \
5857db96d56Sopenharmony_ci             mock.patch.object(self.uuid, '_generate_time_safe', None), \
5867db96d56Sopenharmony_ci             mock.patch.object(self.uuid, '_last_timestamp', None), \
5877db96d56Sopenharmony_ci             mock.patch.object(self.uuid, 'getnode', return_value=93328246233727), \
5887db96d56Sopenharmony_ci             mock.patch('time.time_ns', return_value=1545052026752910643), \
5897db96d56Sopenharmony_ci             mock.patch('random.getrandbits', return_value=5317): # guaranteed to be random
5907db96d56Sopenharmony_ci            u = self.uuid.uuid1()
5917db96d56Sopenharmony_ci            self.assertEqual(u, self.uuid.UUID('a7a55b92-01fc-11e9-94c5-54e1acf6da7f'))
5927db96d56Sopenharmony_ci
5937db96d56Sopenharmony_ci        with mock.patch.object(self.uuid, '_has_uuid_generate_time_safe', False), \
5947db96d56Sopenharmony_ci             mock.patch.object(self.uuid, '_generate_time_safe', None), \
5957db96d56Sopenharmony_ci             mock.patch.object(self.uuid, '_last_timestamp', None), \
5967db96d56Sopenharmony_ci             mock.patch('time.time_ns', return_value=1545052026752910643):
5977db96d56Sopenharmony_ci            u = self.uuid.uuid1(node=93328246233727, clock_seq=5317)
5987db96d56Sopenharmony_ci            self.assertEqual(u, self.uuid.UUID('a7a55b92-01fc-11e9-94c5-54e1acf6da7f'))
5997db96d56Sopenharmony_ci
6007db96d56Sopenharmony_ci    def test_uuid3(self):
6017db96d56Sopenharmony_ci        equal = self.assertEqual
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci        # Test some known version-3 UUIDs.
6047db96d56Sopenharmony_ci        for u, v in [(self.uuid.uuid3(self.uuid.NAMESPACE_DNS, 'python.org'),
6057db96d56Sopenharmony_ci                      '6fa459ea-ee8a-3ca4-894e-db77e160355e'),
6067db96d56Sopenharmony_ci                     (self.uuid.uuid3(self.uuid.NAMESPACE_URL, 'http://python.org/'),
6077db96d56Sopenharmony_ci                      '9fe8e8c4-aaa8-32a9-a55c-4535a88b748d'),
6087db96d56Sopenharmony_ci                     (self.uuid.uuid3(self.uuid.NAMESPACE_OID, '1.3.6.1'),
6097db96d56Sopenharmony_ci                      'dd1a1cef-13d5-368a-ad82-eca71acd4cd1'),
6107db96d56Sopenharmony_ci                     (self.uuid.uuid3(self.uuid.NAMESPACE_X500, 'c=ca'),
6117db96d56Sopenharmony_ci                      '658d3002-db6b-3040-a1d1-8ddd7d189a4d'),
6127db96d56Sopenharmony_ci                    ]:
6137db96d56Sopenharmony_ci            equal(u.variant, self.uuid.RFC_4122)
6147db96d56Sopenharmony_ci            equal(u.version, 3)
6157db96d56Sopenharmony_ci            equal(u, self.uuid.UUID(v))
6167db96d56Sopenharmony_ci            equal(str(u), v)
6177db96d56Sopenharmony_ci
6187db96d56Sopenharmony_ci    def test_uuid4(self):
6197db96d56Sopenharmony_ci        equal = self.assertEqual
6207db96d56Sopenharmony_ci
6217db96d56Sopenharmony_ci        # Make sure uuid4() generates UUIDs that are actually version 4.
6227db96d56Sopenharmony_ci        for u in [self.uuid.uuid4() for i in range(10)]:
6237db96d56Sopenharmony_ci            equal(u.variant, self.uuid.RFC_4122)
6247db96d56Sopenharmony_ci            equal(u.version, 4)
6257db96d56Sopenharmony_ci
6267db96d56Sopenharmony_ci        # Make sure the generated UUIDs are actually unique.
6277db96d56Sopenharmony_ci        uuids = {}
6287db96d56Sopenharmony_ci        for u in [self.uuid.uuid4() for i in range(1000)]:
6297db96d56Sopenharmony_ci            uuids[u] = 1
6307db96d56Sopenharmony_ci        equal(len(uuids.keys()), 1000)
6317db96d56Sopenharmony_ci
6327db96d56Sopenharmony_ci    def test_uuid5(self):
6337db96d56Sopenharmony_ci        equal = self.assertEqual
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci        # Test some known version-5 UUIDs.
6367db96d56Sopenharmony_ci        for u, v in [(self.uuid.uuid5(self.uuid.NAMESPACE_DNS, 'python.org'),
6377db96d56Sopenharmony_ci                      '886313e1-3b8a-5372-9b90-0c9aee199e5d'),
6387db96d56Sopenharmony_ci                     (self.uuid.uuid5(self.uuid.NAMESPACE_URL, 'http://python.org/'),
6397db96d56Sopenharmony_ci                      '4c565f0d-3f5a-5890-b41b-20cf47701c5e'),
6407db96d56Sopenharmony_ci                     (self.uuid.uuid5(self.uuid.NAMESPACE_OID, '1.3.6.1'),
6417db96d56Sopenharmony_ci                      '1447fa61-5277-5fef-a9b3-fbc6e44f4af3'),
6427db96d56Sopenharmony_ci                     (self.uuid.uuid5(self.uuid.NAMESPACE_X500, 'c=ca'),
6437db96d56Sopenharmony_ci                      'cc957dd1-a972-5349-98cd-874190002798'),
6447db96d56Sopenharmony_ci                    ]:
6457db96d56Sopenharmony_ci            equal(u.variant, self.uuid.RFC_4122)
6467db96d56Sopenharmony_ci            equal(u.version, 5)
6477db96d56Sopenharmony_ci            equal(u, self.uuid.UUID(v))
6487db96d56Sopenharmony_ci            equal(str(u), v)
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_ci    @support.requires_fork()
6517db96d56Sopenharmony_ci    def testIssue8621(self):
6527db96d56Sopenharmony_ci        # On at least some versions of OSX self.uuid.uuid4 generates
6537db96d56Sopenharmony_ci        # the same sequence of UUIDs in the parent and any
6547db96d56Sopenharmony_ci        # children started using fork.
6557db96d56Sopenharmony_ci        fds = os.pipe()
6567db96d56Sopenharmony_ci        pid = os.fork()
6577db96d56Sopenharmony_ci        if pid == 0:
6587db96d56Sopenharmony_ci            os.close(fds[0])
6597db96d56Sopenharmony_ci            value = self.uuid.uuid4()
6607db96d56Sopenharmony_ci            os.write(fds[1], value.hex.encode('latin-1'))
6617db96d56Sopenharmony_ci            os._exit(0)
6627db96d56Sopenharmony_ci
6637db96d56Sopenharmony_ci        else:
6647db96d56Sopenharmony_ci            os.close(fds[1])
6657db96d56Sopenharmony_ci            self.addCleanup(os.close, fds[0])
6667db96d56Sopenharmony_ci            parent_value = self.uuid.uuid4().hex
6677db96d56Sopenharmony_ci            support.wait_process(pid, exitcode=0)
6687db96d56Sopenharmony_ci            child_value = os.read(fds[0], 100).decode('latin-1')
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci            self.assertNotEqual(parent_value, child_value)
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ci    def test_uuid_weakref(self):
6737db96d56Sopenharmony_ci        # bpo-35701: check that weak referencing to a UUID object can be created
6747db96d56Sopenharmony_ci        strong = self.uuid.uuid4()
6757db96d56Sopenharmony_ci        weak = weakref.ref(strong)
6767db96d56Sopenharmony_ci        self.assertIs(strong, weak())
6777db96d56Sopenharmony_ci
6787db96d56Sopenharmony_ciclass TestUUIDWithoutExtModule(BaseTestUUID, unittest.TestCase):
6797db96d56Sopenharmony_ci    uuid = py_uuid
6807db96d56Sopenharmony_ci
6817db96d56Sopenharmony_ci@unittest.skipUnless(c_uuid, 'requires the C _uuid module')
6827db96d56Sopenharmony_ciclass TestUUIDWithExtModule(BaseTestUUID, unittest.TestCase):
6837db96d56Sopenharmony_ci    uuid = c_uuid
6847db96d56Sopenharmony_ci
6857db96d56Sopenharmony_ci
6867db96d56Sopenharmony_ciclass BaseTestInternals:
6877db96d56Sopenharmony_ci    _uuid = py_uuid
6887db96d56Sopenharmony_ci
6897db96d56Sopenharmony_ci    def check_parse_mac(self, aix):
6907db96d56Sopenharmony_ci        if not aix:
6917db96d56Sopenharmony_ci            patch = mock.patch.multiple(self.uuid,
6927db96d56Sopenharmony_ci                                        _MAC_DELIM=b':',
6937db96d56Sopenharmony_ci                                        _MAC_OMITS_LEADING_ZEROES=False)
6947db96d56Sopenharmony_ci        else:
6957db96d56Sopenharmony_ci            patch = mock.patch.multiple(self.uuid,
6967db96d56Sopenharmony_ci                                        _MAC_DELIM=b'.',
6977db96d56Sopenharmony_ci                                        _MAC_OMITS_LEADING_ZEROES=True)
6987db96d56Sopenharmony_ci
6997db96d56Sopenharmony_ci        with patch:
7007db96d56Sopenharmony_ci            # Valid MAC addresses
7017db96d56Sopenharmony_ci            if not aix:
7027db96d56Sopenharmony_ci                tests = (
7037db96d56Sopenharmony_ci                    (b'52:54:00:9d:0e:67', 0x5254009d0e67),
7047db96d56Sopenharmony_ci                    (b'12:34:56:78:90:ab', 0x1234567890ab),
7057db96d56Sopenharmony_ci                )
7067db96d56Sopenharmony_ci            else:
7077db96d56Sopenharmony_ci                # AIX format
7087db96d56Sopenharmony_ci                tests = (
7097db96d56Sopenharmony_ci                    (b'fe.ad.c.1.23.4', 0xfead0c012304),
7107db96d56Sopenharmony_ci                )
7117db96d56Sopenharmony_ci            for mac, expected in tests:
7127db96d56Sopenharmony_ci                self.assertEqual(self.uuid._parse_mac(mac), expected)
7137db96d56Sopenharmony_ci
7147db96d56Sopenharmony_ci            # Invalid MAC addresses
7157db96d56Sopenharmony_ci            for mac in (
7167db96d56Sopenharmony_ci                b'',
7177db96d56Sopenharmony_ci                # IPv6 addresses with same length than valid MAC address
7187db96d56Sopenharmony_ci                # (17 characters)
7197db96d56Sopenharmony_ci                b'fe80::5054:ff:fe9',
7207db96d56Sopenharmony_ci                b'123:2:3:4:5:6:7:8',
7217db96d56Sopenharmony_ci                # empty 5rd field
7227db96d56Sopenharmony_ci                b'52:54:00:9d::67',
7237db96d56Sopenharmony_ci                # only 5 fields instead of 6
7247db96d56Sopenharmony_ci                b'52:54:00:9d:0e'
7257db96d56Sopenharmony_ci                # invalid character 'x'
7267db96d56Sopenharmony_ci                b'52:54:00:9d:0e:6x'
7277db96d56Sopenharmony_ci                # dash separator
7287db96d56Sopenharmony_ci                b'52-54-00-9d-0e-67',
7297db96d56Sopenharmony_ci            ):
7307db96d56Sopenharmony_ci                if aix:
7317db96d56Sopenharmony_ci                    mac = mac.replace(b':', b'.')
7327db96d56Sopenharmony_ci                with self.subTest(mac=mac):
7337db96d56Sopenharmony_ci                    self.assertIsNone(self.uuid._parse_mac(mac))
7347db96d56Sopenharmony_ci
7357db96d56Sopenharmony_ci    def test_parse_mac(self):
7367db96d56Sopenharmony_ci        self.check_parse_mac(False)
7377db96d56Sopenharmony_ci
7387db96d56Sopenharmony_ci    def test_parse_mac_aix(self):
7397db96d56Sopenharmony_ci        self.check_parse_mac(True)
7407db96d56Sopenharmony_ci
7417db96d56Sopenharmony_ci    def test_find_under_heading(self):
7427db96d56Sopenharmony_ci        data = '''\
7437db96d56Sopenharmony_ciName  Mtu   Network     Address           Ipkts Ierrs    Opkts Oerrs  Coll
7447db96d56Sopenharmony_cien0   1500  link#2      fe.ad.c.1.23.4   1714807956     0 711348489     0     0
7457db96d56Sopenharmony_ci                        01:00:5e:00:00:01
7467db96d56Sopenharmony_cien0   1500  192.168.129 x071             1714807956     0 711348489     0     0
7477db96d56Sopenharmony_ci                        224.0.0.1
7487db96d56Sopenharmony_cien0   1500  192.168.90  x071             1714807956     0 711348489     0     0
7497db96d56Sopenharmony_ci                        224.0.0.1
7507db96d56Sopenharmony_ci'''
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ci        # The above data is from AIX - with '.' as _MAC_DELIM and strings
7537db96d56Sopenharmony_ci        # shorter than 17 bytes (no leading 0). (_MAC_OMITS_LEADING_ZEROES=True)
7547db96d56Sopenharmony_ci        with mock.patch.multiple(self.uuid,
7557db96d56Sopenharmony_ci                                 _MAC_DELIM=b'.',
7567db96d56Sopenharmony_ci                                 _MAC_OMITS_LEADING_ZEROES=True,
7577db96d56Sopenharmony_ci                                 _get_command_stdout=mock_get_command_stdout(data)):
7587db96d56Sopenharmony_ci            mac = self.uuid._find_mac_under_heading(
7597db96d56Sopenharmony_ci                command='netstat',
7607db96d56Sopenharmony_ci                args='-ian',
7617db96d56Sopenharmony_ci                heading=b'Address',
7627db96d56Sopenharmony_ci            )
7637db96d56Sopenharmony_ci
7647db96d56Sopenharmony_ci        self.assertEqual(mac, 0xfead0c012304)
7657db96d56Sopenharmony_ci
7667db96d56Sopenharmony_ci    def test_find_under_heading_ipv6(self):
7677db96d56Sopenharmony_ci        # bpo-39991: IPv6 address "fe80::5054:ff:fe9" looks like a MAC address
7687db96d56Sopenharmony_ci        # (same string length) but must be skipped
7697db96d56Sopenharmony_ci        data = '''\
7707db96d56Sopenharmony_ciName    Mtu Network       Address              Ipkts Ierrs Idrop    Opkts Oerrs  Coll
7717db96d56Sopenharmony_civtnet  1500 <Link#1>      52:54:00:9d:0e:67    10017     0     0     8174     0     0
7727db96d56Sopenharmony_civtnet     - fe80::%vtnet0 fe80::5054:ff:fe9        0     -     -        4     -     -
7737db96d56Sopenharmony_civtnet     - 192.168.122.0 192.168.122.45        8844     -     -     8171     -     -
7747db96d56Sopenharmony_cilo0   16384 <Link#2>      lo0                 260148     0     0   260148     0     0
7757db96d56Sopenharmony_cilo0       - ::1/128       ::1                    193     -     -      193     -     -
7767db96d56Sopenharmony_ci                          ff01::1%lo0
7777db96d56Sopenharmony_ci                          ff02::2:2eb7:74fa
7787db96d56Sopenharmony_ci                          ff02::2:ff2e:b774
7797db96d56Sopenharmony_ci                          ff02::1%lo0
7807db96d56Sopenharmony_ci                          ff02::1:ff00:1%lo
7817db96d56Sopenharmony_cilo0       - fe80::%lo0/64 fe80::1%lo0              0     -     -        0     -     -
7827db96d56Sopenharmony_ci                          ff01::1%lo0
7837db96d56Sopenharmony_ci                          ff02::2:2eb7:74fa
7847db96d56Sopenharmony_ci                          ff02::2:ff2e:b774
7857db96d56Sopenharmony_ci                          ff02::1%lo0
7867db96d56Sopenharmony_ci                          ff02::1:ff00:1%lo
7877db96d56Sopenharmony_cilo0       - 127.0.0.0/8   127.0.0.1           259955     -     -   259955     -     -
7887db96d56Sopenharmony_ci                          224.0.0.1
7897db96d56Sopenharmony_ci'''
7907db96d56Sopenharmony_ci
7917db96d56Sopenharmony_ci        with mock.patch.multiple(self.uuid,
7927db96d56Sopenharmony_ci                                 _MAC_DELIM=b':',
7937db96d56Sopenharmony_ci                                 _MAC_OMITS_LEADING_ZEROES=False,
7947db96d56Sopenharmony_ci                                 _get_command_stdout=mock_get_command_stdout(data)):
7957db96d56Sopenharmony_ci            mac = self.uuid._find_mac_under_heading(
7967db96d56Sopenharmony_ci                command='netstat',
7977db96d56Sopenharmony_ci                args='-ian',
7987db96d56Sopenharmony_ci                heading=b'Address',
7997db96d56Sopenharmony_ci            )
8007db96d56Sopenharmony_ci
8017db96d56Sopenharmony_ci        self.assertEqual(mac, 0x5254009d0e67)
8027db96d56Sopenharmony_ci
8037db96d56Sopenharmony_ci    def test_find_mac_near_keyword(self):
8047db96d56Sopenharmony_ci        # key and value are on the same line
8057db96d56Sopenharmony_ci        data = '''
8067db96d56Sopenharmony_cifake      Link encap:UNSPEC  hwaddr 00-00
8077db96d56Sopenharmony_cicscotun0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
8087db96d56Sopenharmony_cieth0      Link encap:Ethernet  HWaddr 12:34:56:78:90:ab
8097db96d56Sopenharmony_ci'''
8107db96d56Sopenharmony_ci
8117db96d56Sopenharmony_ci        # The above data will only be parsed properly on non-AIX unixes.
8127db96d56Sopenharmony_ci        with mock.patch.multiple(self.uuid,
8137db96d56Sopenharmony_ci                                 _MAC_DELIM=b':',
8147db96d56Sopenharmony_ci                                 _MAC_OMITS_LEADING_ZEROES=False,
8157db96d56Sopenharmony_ci                                 _get_command_stdout=mock_get_command_stdout(data)):
8167db96d56Sopenharmony_ci            mac = self.uuid._find_mac_near_keyword(
8177db96d56Sopenharmony_ci                command='ifconfig',
8187db96d56Sopenharmony_ci                args='',
8197db96d56Sopenharmony_ci                keywords=[b'hwaddr'],
8207db96d56Sopenharmony_ci                get_word_index=lambda x: x + 1,
8217db96d56Sopenharmony_ci            )
8227db96d56Sopenharmony_ci
8237db96d56Sopenharmony_ci        self.assertEqual(mac, 0x1234567890ab)
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_ci    def check_node(self, node, requires=None):
8267db96d56Sopenharmony_ci        if requires and node is None:
8277db96d56Sopenharmony_ci            self.skipTest('requires ' + requires)
8287db96d56Sopenharmony_ci        hex = '%012x' % node
8297db96d56Sopenharmony_ci        if support.verbose >= 2:
8307db96d56Sopenharmony_ci            print(hex, end=' ')
8317db96d56Sopenharmony_ci        self.assertTrue(0 < node < (1 << 48),
8327db96d56Sopenharmony_ci                        "%s is not an RFC 4122 node ID" % hex)
8337db96d56Sopenharmony_ci
8347db96d56Sopenharmony_ci    @unittest.skipUnless(_uuid._ifconfig_getnode in _uuid._GETTERS,
8357db96d56Sopenharmony_ci        "ifconfig is not used for introspection on this platform")
8367db96d56Sopenharmony_ci    def test_ifconfig_getnode(self):
8377db96d56Sopenharmony_ci        node = self.uuid._ifconfig_getnode()
8387db96d56Sopenharmony_ci        self.check_node(node, 'ifconfig')
8397db96d56Sopenharmony_ci
8407db96d56Sopenharmony_ci    @unittest.skipUnless(_uuid._ip_getnode in _uuid._GETTERS,
8417db96d56Sopenharmony_ci        "ip is not used for introspection on this platform")
8427db96d56Sopenharmony_ci    def test_ip_getnode(self):
8437db96d56Sopenharmony_ci        node = self.uuid._ip_getnode()
8447db96d56Sopenharmony_ci        self.check_node(node, 'ip')
8457db96d56Sopenharmony_ci
8467db96d56Sopenharmony_ci    @unittest.skipUnless(_uuid._arp_getnode in _uuid._GETTERS,
8477db96d56Sopenharmony_ci        "arp is not used for introspection on this platform")
8487db96d56Sopenharmony_ci    def test_arp_getnode(self):
8497db96d56Sopenharmony_ci        node = self.uuid._arp_getnode()
8507db96d56Sopenharmony_ci        self.check_node(node, 'arp')
8517db96d56Sopenharmony_ci
8527db96d56Sopenharmony_ci    @unittest.skipUnless(_uuid._lanscan_getnode in _uuid._GETTERS,
8537db96d56Sopenharmony_ci        "lanscan is not used for introspection on this platform")
8547db96d56Sopenharmony_ci    def test_lanscan_getnode(self):
8557db96d56Sopenharmony_ci        node = self.uuid._lanscan_getnode()
8567db96d56Sopenharmony_ci        self.check_node(node, 'lanscan')
8577db96d56Sopenharmony_ci
8587db96d56Sopenharmony_ci    @unittest.skipUnless(_uuid._netstat_getnode in _uuid._GETTERS,
8597db96d56Sopenharmony_ci        "netstat is not used for introspection on this platform")
8607db96d56Sopenharmony_ci    def test_netstat_getnode(self):
8617db96d56Sopenharmony_ci        node = self.uuid._netstat_getnode()
8627db96d56Sopenharmony_ci        self.check_node(node, 'netstat')
8637db96d56Sopenharmony_ci
8647db96d56Sopenharmony_ci    def test_random_getnode(self):
8657db96d56Sopenharmony_ci        node = self.uuid._random_getnode()
8667db96d56Sopenharmony_ci        # The multicast bit, i.e. the least significant bit of first octet,
8677db96d56Sopenharmony_ci        # must be set for randomly generated MAC addresses.  See RFC 4122,
8687db96d56Sopenharmony_ci        # $4.1.6.
8697db96d56Sopenharmony_ci        self.assertTrue(node & (1 << 40), '%012x' % node)
8707db96d56Sopenharmony_ci        self.check_node(node)
8717db96d56Sopenharmony_ci
8727db96d56Sopenharmony_ci        node2 = self.uuid._random_getnode()
8737db96d56Sopenharmony_ci        self.assertNotEqual(node2, node, '%012x' % node)
8747db96d56Sopenharmony_ci
8757db96d56Sopenharmony_ciclass TestInternalsWithoutExtModule(BaseTestInternals, unittest.TestCase):
8767db96d56Sopenharmony_ci    uuid = py_uuid
8777db96d56Sopenharmony_ci
8787db96d56Sopenharmony_ci@unittest.skipUnless(c_uuid, 'requires the C _uuid module')
8797db96d56Sopenharmony_ciclass TestInternalsWithExtModule(BaseTestInternals, unittest.TestCase):
8807db96d56Sopenharmony_ci    uuid = c_uuid
8817db96d56Sopenharmony_ci
8827db96d56Sopenharmony_ci    @unittest.skipUnless(os.name == 'posix', 'requires Posix')
8837db96d56Sopenharmony_ci    def test_unix_getnode(self):
8847db96d56Sopenharmony_ci        if not importable('_uuid') and not importable('ctypes'):
8857db96d56Sopenharmony_ci            self.skipTest("neither _uuid extension nor ctypes available")
8867db96d56Sopenharmony_ci        try: # Issues 1481, 3581: _uuid_generate_time() might be None.
8877db96d56Sopenharmony_ci            node = self.uuid._unix_getnode()
8887db96d56Sopenharmony_ci        except TypeError:
8897db96d56Sopenharmony_ci            self.skipTest('requires uuid_generate_time')
8907db96d56Sopenharmony_ci        self.check_node(node, 'unix')
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ci    @unittest.skipUnless(os.name == 'nt', 'requires Windows')
8937db96d56Sopenharmony_ci    def test_windll_getnode(self):
8947db96d56Sopenharmony_ci        node = self.uuid._windll_getnode()
8957db96d56Sopenharmony_ci        self.check_node(node)
8967db96d56Sopenharmony_ci
8977db96d56Sopenharmony_ci
8987db96d56Sopenharmony_ciif __name__ == '__main__':
8997db96d56Sopenharmony_ci    unittest.main()
900