mirror of https://github.com/python/cpython
Issue #23015: Improved testing of the uuid module.
This commit is contained in:
commit
0e32ea1089
|
@ -15,9 +15,6 @@ def importable(name):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
class TestUUID(unittest.TestCase):
|
class TestUUID(unittest.TestCase):
|
||||||
last_node = None
|
|
||||||
source2node = {}
|
|
||||||
|
|
||||||
def test_UUID(self):
|
def test_UUID(self):
|
||||||
equal = self.assertEqual
|
equal = self.assertEqual
|
||||||
ascending = []
|
ascending = []
|
||||||
|
@ -295,118 +292,13 @@ class TestUUID(unittest.TestCase):
|
||||||
badtype(lambda: setattr(u, 'clock_seq_low', 0))
|
badtype(lambda: setattr(u, 'clock_seq_low', 0))
|
||||||
badtype(lambda: setattr(u, 'node', 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 < (1 << 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.items():
|
|
||||||
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_ip_getnode(self):
|
|
||||||
node = uuid._ip_getnode()
|
|
||||||
if node is not None:
|
|
||||||
self.check_node(node, 'ip')
|
|
||||||
|
|
||||||
@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 < (1 << 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):
|
def test_getnode(self):
|
||||||
node1 = uuid.getnode()
|
node1 = uuid.getnode()
|
||||||
self.check_node(node1, "getnode1")
|
self.assertTrue(0 < node1 < (1 << 48), '%012x' % node1)
|
||||||
|
|
||||||
# Test it again to ensure consistency.
|
# Test it again to ensure consistency.
|
||||||
node2 = uuid.getnode()
|
node2 = uuid.getnode()
|
||||||
self.check_node(node2, "getnode2")
|
self.assertEqual(node1, node2, '%012x != %012x' % (node1, node2))
|
||||||
|
|
||||||
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
|
|
||||||
'''
|
|
||||||
|
|
||||||
popen = unittest.mock.MagicMock()
|
|
||||||
popen.stdout = io.BytesIO(data.encode())
|
|
||||||
|
|
||||||
with unittest.mock.patch.object(shutil, 'which',
|
|
||||||
return_value='/sbin/ifconfig'):
|
|
||||||
with unittest.mock.patch.object(subprocess, 'Popen',
|
|
||||||
return_value=popen):
|
|
||||||
mac = uuid._find_mac(
|
|
||||||
command='ifconfig',
|
|
||||||
args='',
|
|
||||||
hw_identifiers=[b'hwaddr'],
|
|
||||||
get_index=lambda x: x + 1,
|
|
||||||
)
|
|
||||||
|
|
||||||
self.assertEqual(mac, 0x1234567890ab)
|
|
||||||
|
|
||||||
@unittest.skipUnless(importable('ctypes'), 'requires ctypes')
|
@unittest.skipUnless(importable('ctypes'), 'requires ctypes')
|
||||||
def test_uuid1(self):
|
def test_uuid1(self):
|
||||||
|
@ -518,5 +410,101 @@ eth0 Link encap:Ethernet HWaddr 12:34:56:78:90:ab
|
||||||
self.assertNotEqual(parent_value, child_value)
|
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
|
||||||
|
'''
|
||||||
|
|
||||||
|
popen = unittest.mock.MagicMock()
|
||||||
|
popen.stdout = io.BytesIO(data.encode())
|
||||||
|
|
||||||
|
with unittest.mock.patch.object(shutil, 'which',
|
||||||
|
return_value='/sbin/ifconfig'):
|
||||||
|
with unittest.mock.patch.object(subprocess, 'Popen',
|
||||||
|
return_value=popen):
|
||||||
|
mac = uuid._find_mac(
|
||||||
|
command='ifconfig',
|
||||||
|
args='',
|
||||||
|
hw_identifiers=[b'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 support.verbose >= 2:
|
||||||
|
print(hex, end=' ')
|
||||||
|
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 < (1 << 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_ip_getnode(self):
|
||||||
|
node = uuid._ip_getnode()
|
||||||
|
self.check_node(node, 'ip', 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)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in New Issue