| // 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"); |