dom/tests/mochitest/crypto/test_getRandomValues.html

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/dom/tests/mochitest/crypto/test_getRandomValues.html	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,212 @@
     1.4 +<!DOCTYPE HTML>
     1.5 +<html><head>
     1.6 +  <title>Test window.crypto.getRandomValues</title>
     1.7 +  <script type="text/javascript" src="/MochiKit/packed.js"></script>
     1.8 +  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>        
     1.9 +  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
    1.10 +</head>
    1.11 +<body onload="onWindowLoad()">
    1.12 +<script class="testbody" type="text/javascript">
    1.13 +SimpleTest.waitForExplicitFinish();
    1.14 +
    1.15 +var testData = [ { len: 32, type: "Int8", pass: true },
    1.16 +                 { len: 32, type: "Int16", pass: true },
    1.17 +                 { len: 32, type: "Int32", pass: true },
    1.18 +                 { len: 32, type: "Uint8", pass: true },
    1.19 +                 { len: 32, type: "Uint16", pass: true },
    1.20 +                 { len: 32, type: "Uint32", pass: true },
    1.21 +                 { len: 65536, type: "Uint8", pass: true },
    1.22 +                 { len: 32, type: "Uint8Clamped", pass: true },
    1.23 +                 { len: 65537, type: "Uint8", pass: false },
    1.24 +                 { len: 32, type: "Float32", pass: false },
    1.25 +                 { len: 32, type: "Float64", pass: false } ];
    1.26 +
    1.27 +
    1.28 +var testCount = 0;
    1.29 +
    1.30 +function testNsCryptoGetRandomValues(aLength, aType)
    1.31 +{
    1.32 +  var arrayTypes = {
    1.33 +    Int8:         Int8Array,
    1.34 +    Int16:        Int16Array,
    1.35 +    Int32:        Int32Array,
    1.36 +    Uint8:        Uint8Array,
    1.37 +    Uint16:       Uint16Array,
    1.38 +    Uint32:       Uint32Array,
    1.39 +    Float32:      Float32Array,
    1.40 +    Float64:      Float64Array,
    1.41 +    Uint8Clamped: Uint8ClampedArray,
    1.42 +  };
    1.43 +
    1.44 +  testCount++;
    1.45 +
    1.46 +  var buf = new ArrayBuffer(aLength);
    1.47 +  var arBuf = new arrayTypes[aType](buf);
    1.48 +
    1.49 +  var pass = false;
    1.50 +  var b = window.crypto.getRandomValues(arBuf);
    1.51 +  ok(b === arBuf, "ArrayBuffer result is argument buffer");
    1.52 +
    1.53 +  for (var i = 0; i < arBuf.length; i++) {
    1.54 +    if (arBuf.length > 6) {
    1.55 +      // XXXddahl: THIS MIGHT FAIL EVERY FULL MOON, SORRY QA!!!
    1.56 +      if (arBuf[i] != 0) {
    1.57 +        pass = true;
    1.58 +        break;
    1.59 +      }
    1.60 +    } 
    1.61 +    else {
    1.62 +      pass = true;
    1.63 +    }
    1.64 +  }
    1.65 +  is(pass, true,  "Non-zero result: " + i  +  " found in the  " + aType + ": " + aLength + " ArrayBufferView");
    1.66 +}
    1.67 +
    1.68 +function onWindowLoad()
    1.69 +{
    1.70 +  window.removeEventListener("load", onWindowLoad, false);
    1.71 +  var failedWithCorrectError = false;
    1.72 +  try {
    1.73 +    for (var i = 0; i < testData.length; i++) {
    1.74 +      if (testData[i].pass) {
    1.75 +        try {
    1.76 +          testNsCryptoGetRandomValues(testData[i].len, testData[i].type, testData[i].pass);
    1.77 +        } 
    1.78 +        catch (ex) {
    1.79 +          ok(false, "testNsCryptoGetRandomValues failed, test should have passed: " + testData[i].type);
    1.80 +        }
    1.81 +      }
    1.82 +      else {
    1.83 +        // failing tests are dealt with here
    1.84 +        if (i == 8) {
    1.85 +          try {
    1.86 +            testNsCryptoGetRandomValues(testData[i].len, testData[i].type, testData[i].pass);
    1.87 +          }
    1.88 +          catch (ex) {
    1.89 +            todo("QuotaExceededError" in window && ex instanceof QuotaExceededError,
    1.90 +                 "Exception was the correct type");
    1.91 +            failedWithCorrectError = ex.toString().search(/QUOTA_EXCEEDED_ERR/);
    1.92 +            ok(failedWithCorrectError, "Extended length array buffer fails, NS_ERROR_DOM_QUOTA_EXCEEDED_ERR thrown");
    1.93 +          }
    1.94 +        } // 8
    1.95 +
    1.96 +        if (i == 9) {
    1.97 +          try {
    1.98 +            testNsCryptoGetRandomValues(testData[i].len, testData[i].type, testData[i].pass);
    1.99 +          }
   1.100 +          catch (ex) {
   1.101 +            failedWithCorrectError = ex.toString().search(/TYPE_MISMATCH_ERR/);
   1.102 +            ok(failedWithCorrectError,
   1.103 +               "Expected TYPE_MISMATCH_ERR: Float32Array is not valid, got " + ex + ".");
   1.104 +          }
   1.105 +        } // 9
   1.106 +
   1.107 +        if (i == 10) {
   1.108 +          try {
   1.109 +            testNsCryptoGetRandomValues(testData[i].len, testData[i].type, testData[i].pass);
   1.110 +          }
   1.111 +          catch (ex) {
   1.112 +            failedWithCorrectError = ex.toString().search(/TYPE_MISMATCH_ERR/);
   1.113 +            ok(failedWithCorrectError,
   1.114 +               "Expected TYPE_MISMATCH_ERR: Float64Array is not valid, got " + ex + ".");
   1.115 +          }
   1.116 +        }
   1.117 +      }
   1.118 +    } // end main for loop
   1.119 +  }
   1.120 +  catch (ex) {
   1.121 +    ok(false, "Unexpected Error: " + ex);
   1.122 +  }
   1.123 +  // Count the tests in the testData array
   1.124 +  ok(testCount == 11, "11 tests run via testData");
   1.125 +
   1.126 +  // Test a null argument
   1.127 +  try {
   1.128 +    window.crypto.getRandomValues(null);
   1.129 +  }
   1.130 +  catch (ex) {
   1.131 +    var test = ex.toString().search(/1003|TypeError/);
   1.132 +    ok((test > -1), "Expected TYPE_ERR, got " + ex + ".");
   1.133 +  }
   1.134 +
   1.135 +  // Test a zero-length buffer view
   1.136 +  try {
   1.137 +    var a = new Int8Array(0);
   1.138 +    window.crypto.getRandomValues(a);
   1.139 +    ok(a[0] === undefined, "The array buffer is unchanged, still 0 length");
   1.140 +  }
   1.141 +  catch (ex) {
   1.142 +    ok(false, "A zero-length array buffer view should not fail");
   1.143 +  }
   1.144 +
   1.145 +  // Test a one-length buffer view
   1.146 +  var randomVal = 0;
   1.147 +  // The probability of getRandomValues generating a zero value is 1/256 so we
   1.148 +  // run this in a loop until it returns a non-zero value to guard against
   1.149 +  // false failures
   1.150 +  do {
   1.151 +    try {
   1.152 +      var a = new Uint8Array(1);
   1.153 +      var b = window.crypto.getRandomValues(a);
   1.154 +      randomVal = a[0];
   1.155 +      ok(a === b, "ArrayBuffer result is argument buffer");
   1.156 +    }
   1.157 +    catch (ex) {
   1.158 +      ok(false, "A one-length array buffer view should not fail");
   1.159 +    }
   1.160 +  }
   1.161 +  while (randomVal == 0);
   1.162 +  ok(randomVal !== 0, "The array buffer eventually had one random value");
   1.163 +
   1.164 +  // Test a 16 byte length buffer
   1.165 +  var testConfig = { len: 16, type: "Int8", pass: true };
   1.166 +  testNsCryptoGetRandomValues(testConfig.len,
   1.167 +                              testConfig.type,
   1.168 +                              testConfig.pass);
   1.169 +
   1.170 +  // Test a 31 byte length buffer
   1.171 +  testConfig = { len: 31, type: "Int8", pass: true };
   1.172 +  testNsCryptoGetRandomValues(testConfig.len,
   1.173 +                              testConfig.type,
   1.174 +                              testConfig.pass);
   1.175 +
   1.176 +  // Test a 33 byte length buffer
   1.177 +  testConfig = { len: 33, type: "Int8", pass: true };
   1.178 +  testNsCryptoGetRandomValues(testConfig.len,
   1.179 +                              testConfig.type,
   1.180 +                              testConfig.pass);
   1.181 +
   1.182 +  // Test a range of an array buffer view
   1.183 +  var buffer = new ArrayBuffer(32);
   1.184 +  var view = new Int8Array(buffer, 0, 16);
   1.185 +  var view2 = new Int8Array(buffer, 16, 16);
   1.186 +  for (var i = 0; i < view2.byteLength; i++) {
   1.187 +    view2[i] = 1;
   1.188 +  }
   1.189 +  var b = window.crypto.getRandomValues(view);
   1.190 +  ok(b === view, "ArrayBuffer result is argument buffer");
   1.191 +  for (var i = 0; i < view.byteLength; i++) {
   1.192 +    is(view2[i], 1, "view2 is unchanged");
   1.193 +  }
   1.194 +
   1.195 +  // test an offset view
   1.196 +  var result = false;
   1.197 +  var b = window.crypto.getRandomValues(view2);
   1.198 +  for (var i = 0; i < view2.length; i++) {
   1.199 +    if (view2[i] != 1) {
   1.200 +      result = true;
   1.201 +      break;
   1.202 +    }
   1.203 +  }
   1.204 +  ok(result, "view2 has been updated correctly");
   1.205 +  ok(b === view2, "ArrayBuffer result is argument buffer");
   1.206 +  // test the return value
   1.207 +  buffer = new ArrayBuffer(32);
   1.208 +  view = new Int8Array(buffer, 0, 16);
   1.209 +  var retval = window.crypto.getRandomValues(view);
   1.210 +  ok(view === retval, "The view and return value are the same");
   1.211 +
   1.212 +  SimpleTest.finish();
   1.213 +}
   1.214 +</script>
   1.215 +</body></html>

mercurial