Skip to content

Commit 16565f2

Browse files
committed
add tests
1 parent 818d417 commit 16565f2

File tree

1 file changed

+83
-3
lines changed

1 file changed

+83
-3
lines changed

Lib/test/test_uuid.py

Lines changed: 83 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import random
12
import unittest
23
from test import support
34
from test.support import import_helper
@@ -10,6 +11,7 @@
1011
import pickle
1112
import sys
1213
import weakref
14+
from itertools import product
1315
from unittest import mock
1416

1517
py_uuid = import_helper.import_fresh_module('uuid', blocked=['_uuid'])
@@ -267,7 +269,7 @@ def test_exceptions(self):
267269

268270
# Version number out of range.
269271
badvalue(lambda: self.uuid.UUID('00'*16, version=0))
270-
badvalue(lambda: self.uuid.UUID('00'*16, version=6))
272+
badvalue(lambda: self.uuid.UUID('00'*16, version=42))
271273

272274
# Integer value out of range.
273275
badvalue(lambda: self.uuid.UUID(int=-1))
@@ -588,15 +590,15 @@ def test_uuid1_bogus_return_value(self):
588590

589591
def test_uuid1_time(self):
590592
with mock.patch.object(self.uuid, '_generate_time_safe', None), \
591-
mock.patch.object(self.uuid, '_last_timestamp', None), \
593+
mock.patch.object(self.uuid, '_last_timestamp_v1', None), \
592594
mock.patch.object(self.uuid, 'getnode', return_value=93328246233727), \
593595
mock.patch('time.time_ns', return_value=1545052026752910643), \
594596
mock.patch('random.getrandbits', return_value=5317): # guaranteed to be random
595597
u = self.uuid.uuid1()
596598
self.assertEqual(u, self.uuid.UUID('a7a55b92-01fc-11e9-94c5-54e1acf6da7f'))
597599

598600
with mock.patch.object(self.uuid, '_generate_time_safe', None), \
599-
mock.patch.object(self.uuid, '_last_timestamp', None), \
601+
mock.patch.object(self.uuid, '_last_timestamp_v1', None), \
600602
mock.patch('time.time_ns', return_value=1545052026752910643):
601603
u = self.uuid.uuid1(node=93328246233727, clock_seq=5317)
602604
self.assertEqual(u, self.uuid.UUID('a7a55b92-01fc-11e9-94c5-54e1acf6da7f'))
@@ -681,6 +683,84 @@ def test_uuid5(self):
681683
equal(u, self.uuid.UUID(v))
682684
equal(str(u), v)
683685

686+
def test_uuid6(self):
687+
equal = self.assertEqual
688+
u = self.uuid.uuid6()
689+
equal(u.variant, self.uuid.RFC_4122)
690+
equal(u.version, 6)
691+
692+
fake_nanoseconds = 1545052026752910643
693+
fake_node_value = 93328246233727
694+
fake_clock_seq = 5317
695+
with mock.patch.object(self.uuid, '_generate_time_safe', None), \
696+
mock.patch.object(self.uuid, '_last_timestamp_v6', None), \
697+
mock.patch.object(self.uuid, 'getnode', return_value=fake_node_value), \
698+
mock.patch('time.time_ns', return_value=fake_nanoseconds), \
699+
mock.patch('random.getrandbits', return_value=fake_clock_seq):
700+
u = self.uuid.uuid6()
701+
equal(u.variant, self.uuid.RFC_4122)
702+
equal(u.version, 6)
703+
704+
# time_hi time_mid time_lo
705+
# 00011110100100000001111111001010 0111101001010101 101110010010
706+
timestamp = 137643448267529106
707+
equal(u.time_hi, 0b00011110100100000001111111001010)
708+
equal(u.time_mid, 0b0111101001010101)
709+
equal(u.time_low, 0b101110010010)
710+
equal(u.time, timestamp)
711+
equal(u.fields[0], u.time_hi)
712+
equal(u.fields[1], u.time_mid)
713+
equal(u.fields[2], u.time_hi_version)
714+
715+
def test_uuid7(self):
716+
equal = self.assertEqual
717+
u = self.uuid.uuid7()
718+
equal(u.variant, self.uuid.RFC_4122)
719+
equal(u.version, 7)
720+
721+
fake_nanoseconds = 1545052026752910643
722+
# some fake 74 = 12 + 62 random bits speared over 76 bits
723+
# are generated by generating a random 76-bit number, and
724+
# split into chunks of 62 (hi) and 12 (lo) bits. It is a
725+
rand_a = random.getrandbits(12)
726+
rand_b = random.getrandbits(62)
727+
fake_bytes = (rand_b << 12) | rand_a
728+
fake_bytes = fake_bytes.to_bytes(19, byteorder='big')
729+
730+
with mock.patch.object(self.uuid, '_last_timestamp_v7', None), \
731+
mock.patch('time.time_ns', return_value=fake_nanoseconds), \
732+
mock.patch('os.urandom', return_value=fake_bytes):
733+
u = self.uuid.uuid7()
734+
equal(u.variant, self.uuid.RFC_4122)
735+
equal(u.version, 7)
736+
fake_milliseconds = (fake_nanoseconds // 1_000_000) & 0xffffffffffff
737+
equal((u.int >> 80) & 0xffffffffffff, fake_milliseconds)
738+
equal((u.int >> 64) & 0x0fff, rand_a)
739+
equal(u.int & 0x3fffffffffffffff, rand_b)
740+
741+
def test_uuid8(self):
742+
equal = self.assertEqual
743+
u = self.uuid.uuid8()
744+
745+
equal(u.variant, self.uuid.RFC_4122)
746+
equal(u.version, 8)
747+
748+
for (_, hi, mid, lo) in product(
749+
range(10), # repeat 10 times
750+
[None, 0, random.getrandbits(48)],
751+
[None, 0, random.getrandbits(12)],
752+
[None, 0, random.getrandbits(62)],
753+
):
754+
u = self.uuid.uuid8(hi, mid, lo)
755+
equal(u.variant, self.uuid.RFC_4122)
756+
equal(u.version, 8)
757+
if hi is not None:
758+
equal((u.int >> 80) & 0xffffffffffff, hi)
759+
if mid is not None:
760+
equal((u.int >> 64) & 0xfff, mid)
761+
if lo is not None:
762+
equal(u.int & 0x3fffffffffffffff, lo)
763+
684764
@support.requires_fork()
685765
def testIssue8621(self):
686766
# On at least some versions of OSX self.uuid.uuid4 generates

0 commit comments

Comments
 (0)