diff --git a/Lib/test/test_uuid.py b/Lib/test/test_uuid.py index bccfcb746e6..0a8130ee0c7 100644 --- a/Lib/test/test_uuid.py +++ b/Lib/test/test_uuid.py @@ -12,9 +12,6 @@ def importable(name): return False class TestUUID(unittest.TestCase): - last_node = None - source2node = {} - def test_UUID(self): equal = self.assertEqual ascending = [] @@ -282,119 +279,13 @@ class TestUUID(unittest.TestCase): badtype(lambda: setattr(u, 'clock_seq_low', 0)) badtype(lambda: setattr(u, 'node', 0)) - def check_node(self, node, source): - message = "%012x is not an RFC 4122 node ID" % node - self.assertTrue(0 < node, message) - self.assertTrue(node < (1L << 48), message) - - TestUUID.source2node[source] = node - if TestUUID.last_node: - if TestUUID.last_node != node: - msg = "different sources disagree on node:\n" - for s, n in TestUUID.source2node.iteritems(): - msg += " from source %r, node was %012x\n" % (s, n) - # There's actually no reason to expect the MAC addresses - # to agree across various methods -- e.g., a box may have - # multiple network interfaces, and different ways of getting - # a MAC address may favor different HW. - ##self.fail(msg) - else: - TestUUID.last_node = node - - @unittest.skipUnless(os.name == 'posix', 'requires Posix') - def test_ifconfig_getnode(self): - node = uuid._ifconfig_getnode() - if node is not None: - self.check_node(node, 'ifconfig') - - @unittest.skipUnless(os.name == 'posix', 'requires Posix') - def test_arp_getnode(self): - node = uuid._arp_getnode() - if node is not None: - self.check_node(node, 'arp') - - @unittest.skipUnless(os.name == 'posix', 'requires Posix') - def test_lanscan_getnode(self): - node = uuid._lanscan_getnode() - if node is not None: - self.check_node(node, 'lanscan') - - @unittest.skipUnless(os.name == 'posix', 'requires Posix') - def test_netstat_getnode(self): - node = uuid._netstat_getnode() - if node is not None: - self.check_node(node, 'netstat') - - @unittest.skipUnless(os.name == 'nt', 'requires Windows') - def test_ipconfig_getnode(self): - node = uuid._ipconfig_getnode() - if node is not None: - self.check_node(node, 'ipconfig') - - @unittest.skipUnless(importable('win32wnet'), 'requires win32wnet') - @unittest.skipUnless(importable('netbios'), 'requires netbios') - def test_netbios_getnode(self): - self.check_node(uuid._netbios_getnode(), 'netbios') - - def test_random_getnode(self): - node = uuid._random_getnode() - # Least significant bit of first octet must be set. - self.assertTrue(node & 0x010000000000) - self.assertTrue(node < (1L << 48)) - - @unittest.skipUnless(os.name == 'posix', 'requires Posix') - @unittest.skipUnless(importable('ctypes'), 'requires ctypes') - def test_unixdll_getnode(self): - try: # Issues 1481, 3581: _uuid_generate_time() might be None. - self.check_node(uuid._unixdll_getnode(), 'unixdll') - except TypeError: - pass - - @unittest.skipUnless(os.name == 'nt', 'requires Windows') - @unittest.skipUnless(importable('ctypes'), 'requires ctypes') - def test_windll_getnode(self): - self.check_node(uuid._windll_getnode(), 'windll') - def test_getnode(self): node1 = uuid.getnode() - self.check_node(node1, "getnode1") + self.assertTrue(0 < node1 < (1 << 48), '%012x' % node1) # Test it again to ensure consistency. node2 = uuid.getnode() - self.check_node(node2, "getnode2") - - self.assertEqual(node1, node2) - - @unittest.skipUnless(os.name == 'posix', 'requires Posix') - def test_find_mac(self): - data = '''\ - -fake hwaddr -cscotun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 -eth0 Link encap:Ethernet HWaddr 12:34:56:78:90:ab -''' - def mock_popen(cmd): - return io.BytesIO(data) - - path = os.environ.get("PATH", os.defpath).split(os.pathsep) - path.extend(('/sbin', '/usr/sbin')) - for dir in path: - executable = os.path.join(dir, 'ifconfig') - if (os.path.exists(executable) and - os.access(executable, os.F_OK | os.X_OK) and - not os.path.isdir(executable)): - break - else: - self.skipTest('requires ifconfig') - - with test_support.swap_attr(os, 'popen', mock_popen): - mac = uuid._find_mac( - command='ifconfig', - args='', - hw_identifiers=['hwaddr'], - get_index=lambda x: x + 1, - ) - self.assertEqual(mac, 0x1234567890ab) + self.assertEqual(node1, node2, '%012x != %012x' % (node1, node2)) @unittest.skipUnless(importable('ctypes'), 'requires ctypes') def test_uuid1(self): @@ -506,11 +397,106 @@ eth0 Link encap:Ethernet HWaddr 12:34:56:78:90:ab self.assertNotEqual(parent_value, child_value) +class TestInternals(unittest.TestCase): + @unittest.skipUnless(os.name == 'posix', 'requires Posix') + def test_find_mac(self): + data = '''\ +fake hwaddr +cscotun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 +eth0 Link encap:Ethernet HWaddr 12:34:56:78:90:ab +''' + def mock_popen(cmd): + return io.BytesIO(data) + + path = os.environ.get("PATH", os.defpath).split(os.pathsep) + path.extend(('/sbin', '/usr/sbin')) + for dir in path: + executable = os.path.join(dir, 'ifconfig') + if (os.path.exists(executable) and + os.access(executable, os.F_OK | os.X_OK) and + not os.path.isdir(executable)): + break + else: + self.skipTest('requires ifconfig') + + with test_support.swap_attr(os, 'popen', mock_popen): + mac = uuid._find_mac( + command='ifconfig', + args='', + hw_identifiers=['hwaddr'], + get_index=lambda x: x + 1, + ) + self.assertEqual(mac, 0x1234567890ab) + + def check_node(self, node, requires=None, network=False): + if requires and node is None: + self.skipTest('requires ' + requires) + hex = '%012x' % node + if test_support.verbose >= 2: + print hex + ' ', + if network: + # 47 bit will never be set in IEEE 802 addresses obtained + # from network cards. + self.assertFalse(node & 0x010000000000, hex) + self.assertTrue(0 < node < (1L << 48), + "%s is not an RFC 4122 node ID" % hex) + + @unittest.skipUnless(os.name == 'posix', 'requires Posix') + def test_ifconfig_getnode(self): + node = uuid._ifconfig_getnode() + self.check_node(node, 'ifconfig', True) + + @unittest.skipUnless(os.name == 'posix', 'requires Posix') + def test_arp_getnode(self): + node = uuid._arp_getnode() + self.check_node(node, 'arp', True) + + @unittest.skipUnless(os.name == 'posix', 'requires Posix') + def test_lanscan_getnode(self): + node = uuid._lanscan_getnode() + self.check_node(node, 'lanscan', True) + + @unittest.skipUnless(os.name == 'posix', 'requires Posix') + def test_netstat_getnode(self): + node = uuid._netstat_getnode() + self.check_node(node, 'netstat', True) + + @unittest.skipUnless(os.name == 'nt', 'requires Windows') + def test_ipconfig_getnode(self): + node = uuid._ipconfig_getnode() + self.check_node(node, 'ipconfig', True) + + @unittest.skipUnless(importable('win32wnet'), 'requires win32wnet') + @unittest.skipUnless(importable('netbios'), 'requires netbios') + def test_netbios_getnode(self): + node = uuid._netbios_getnode() + self.check_node(node, network=True) + + def test_random_getnode(self): + node = uuid._random_getnode() + # Least significant bit of first octet must be set. + self.assertTrue(node & 0x010000000000, '%012x' % node) + self.check_node(node) + + @unittest.skipUnless(os.name == 'posix', 'requires Posix') + @unittest.skipUnless(importable('ctypes'), 'requires ctypes') + def test_unixdll_getnode(self): + try: # Issues 1481, 3581: _uuid_generate_time() might be None. + node = uuid._unixdll_getnode() + except TypeError: + self.skipTest('requires uuid_generate_time') + self.check_node(node) + + @unittest.skipUnless(os.name == 'nt', 'requires Windows') + @unittest.skipUnless(importable('ctypes'), 'requires ctypes') + def test_windll_getnode(self): + node = uuid._windll_getnode() + self.check_node(node) def test_main(): - test_support.run_unittest(TestUUID) + test_support.run_unittest(TestUUID, TestInternals) if __name__ == '__main__': test_main()