summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/WebCryptoAPI/randomUUID.https.any.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/WebCryptoAPI/randomUUID.https.any.js')
-rw-r--r--testing/web-platform/tests/WebCryptoAPI/randomUUID.https.any.js42
1 files changed, 42 insertions, 0 deletions
diff --git a/testing/web-platform/tests/WebCryptoAPI/randomUUID.https.any.js b/testing/web-platform/tests/WebCryptoAPI/randomUUID.https.any.js
new file mode 100644
index 0000000000..600a9728f0
--- /dev/null
+++ b/testing/web-platform/tests/WebCryptoAPI/randomUUID.https.any.js
@@ -0,0 +1,42 @@
+// 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");