|
| 1 | +import random |
1 | 2 | import unittest |
2 | 3 | from test import support |
3 | 4 | from test.support import import_helper |
|
10 | 11 | import pickle |
11 | 12 | import sys |
12 | 13 | import weakref |
| 14 | +from itertools import product |
13 | 15 | from unittest import mock |
14 | 16 |
|
15 | 17 | py_uuid = import_helper.import_fresh_module('uuid', blocked=['_uuid']) |
@@ -267,7 +269,7 @@ def test_exceptions(self): |
267 | 269 |
|
268 | 270 | # Version number out of range. |
269 | 271 | 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)) |
271 | 273 |
|
272 | 274 | # Integer value out of range. |
273 | 275 | badvalue(lambda: self.uuid.UUID(int=-1)) |
@@ -588,15 +590,15 @@ def test_uuid1_bogus_return_value(self): |
588 | 590 |
|
589 | 591 | def test_uuid1_time(self): |
590 | 592 | 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), \ |
592 | 594 | mock.patch.object(self.uuid, 'getnode', return_value=93328246233727), \ |
593 | 595 | mock.patch('time.time_ns', return_value=1545052026752910643), \ |
594 | 596 | mock.patch('random.getrandbits', return_value=5317): # guaranteed to be random |
595 | 597 | u = self.uuid.uuid1() |
596 | 598 | self.assertEqual(u, self.uuid.UUID('a7a55b92-01fc-11e9-94c5-54e1acf6da7f')) |
597 | 599 |
|
598 | 600 | 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), \ |
600 | 602 | mock.patch('time.time_ns', return_value=1545052026752910643): |
601 | 603 | u = self.uuid.uuid1(node=93328246233727, clock_seq=5317) |
602 | 604 | self.assertEqual(u, self.uuid.UUID('a7a55b92-01fc-11e9-94c5-54e1acf6da7f')) |
@@ -681,6 +683,84 @@ def test_uuid5(self): |
681 | 683 | equal(u, self.uuid.UUID(v)) |
682 | 684 | equal(str(u), v) |
683 | 685 |
|
| 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 | + |
684 | 764 | @support.requires_fork() |
685 | 765 | def testIssue8621(self): |
686 | 766 | # On at least some versions of OSX self.uuid.uuid4 generates |
|
0 commit comments