| // Run for enough iterations that we're likely to catch edge-cases, like |
| // failing to set a reserved bit: |
| const iterations = 256; |
| // Track all the UUIDs generated during test run, bail if we ever collide: |
| const uuids = new Set() |
| function randomUUID() { |
| const uuid = self.crypto.randomUUID(); |
| if (uuids.has(uuid)) { |
| throw new Error(`uuid collision ${uuid}`) |
| } |
| uuids.add(uuid); |
| return uuid; |
| } |
| |
| // UUID is in namespace format (16 bytes separated by dashes): |
| test(function() { |
| const UUIDRegex = /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/ |
| for (let i = 0; i < iterations; i++) { |
| assert_true(UUIDRegex.test(randomUUID())); |
| } |
| }, "namespace format"); |
| |
| // Set the 4 most significant bits of array[6], which represent the UUID |
| // version, to 0b0100: |
| test(function() { |
| for (let i = 0; i < iterations; i++) { |
| let value = parseInt(randomUUID().split('-')[2].slice(0, 2), 16); |
| value &= 0b11110000; |
| assert_true(value === 0b01000000); |
| } |
| }, "version set"); |
| |
| // Set the 2 most significant bits of array[8], which represent the UUID |
| // variant, to 0b10: |
| test(function() { |
| for (let i = 0; i < iterations; i++) { |
| // Grab the byte representing array[8]: |
| let value = parseInt(randomUUID().split('-')[3].slice(0, 2), 16); |
| value &= 0b11000000 |
| assert_true(value === 0b10000000); |
| } |
| }, "variant set"); |