chromium/third_party/blink/web_tests/crypto/random-values.js

if (self.importScripts) {
    importScripts('../resources/js-test.js');
    importScripts('../resources/sab-polyfill.js');
}

description("Tests crypto.randomValues.");

if (!self.ArrayBuffer)
    debug("This test requres ArrayBuffers to run!");

shouldBe("'crypto' in self", "true");
shouldBe("'getRandomValues' in self.crypto", "true");

// Although the spec defines Crypto in terms of "RandomSource", it is NOT
// inheritance. The RandomSource interface should not be visible to
// javascript.
shouldBe("self.crypto.__proto__.hasOwnProperty('getRandomValues')", "true");

try {
    // NOTE: This test is flaky.  If we ran this test every second since the
    //       beginning of the universe, on average, it would have failed
    //       2^{-748} times.

    var reference = new Uint8Array(100);
    var sample = new Uint8Array(100);

    crypto.getRandomValues(reference);
    crypto.getRandomValues(sample);

    var matchingBytes = 0;

    for (var i = 0; i < reference.length; i++) {
        if (reference[i] == sample[i])
            matchingBytes++;
    }

    shouldBe("matchingBytes < 100", "true");
} catch(ex) {
    debug(ex);
}

shouldThrow("crypto.getRandomValues(new Uint8Array(new SharedArrayBuffer(100)))");

finishJSTest();