| var test = require('tape') | 
| var crypto = require('../') | 
|   | 
| var randomBytesFunctions = { | 
|   randomBytes: require('randombytes'), | 
|   pseudoRandomBytes: crypto.pseudoRandomBytes | 
| } | 
|   | 
| for (var randomBytesName in randomBytesFunctions) { | 
|   // Both randomBytes and pseudoRandomBytes should provide the same interface | 
|   var randomBytes = randomBytesFunctions[randomBytesName] | 
|   | 
|   test('get error message', function (t) { | 
|     try { | 
|       var b = randomBytes(10) | 
|       t.ok(Buffer.isBuffer(b)) | 
|       t.end() | 
|     } catch (err) { | 
|       t.ok(/not supported/.test(err.message), '"not supported"  is in error message') | 
|       t.end() | 
|     } | 
|   }) | 
|   | 
|   test(randomBytesName, function (t) { | 
|     t.plan(5) | 
|     t.equal(randomBytes(10).length, 10) | 
|     t.ok(Buffer.isBuffer(randomBytes(10))) | 
|     randomBytes(10, function (ex, bytes) { | 
|       t.error(ex) | 
|       t.equal(bytes.length, 10) | 
|       t.ok(Buffer.isBuffer(bytes)) | 
|       t.end() | 
|     }) | 
|   }) | 
|   | 
|   test(randomBytesName + ' seem random', function (t) { | 
|     var L = 1000 | 
|     var b = randomBytes(L) | 
|   | 
|     var mean = [].reduce.call(b, function (a, b) { return a + b }, 0) / L | 
|   | 
|     // test that the random numbers are plausably random. | 
|     // Math.random() will pass this, but this will catch | 
|     // terrible mistakes such as this blunder: | 
|     // https://github.com/dominictarr/crypto-browserify/commit/3267955e1df7edd1680e52aeede9a89506ed2464#commitcomment-7916835 | 
|   | 
|     // this doesn't check that the bytes are in a random *order* | 
|     // but it's better than nothing. | 
|   | 
|     var expected = 256 / 2 | 
|     var smean = Math.sqrt(mean) | 
|   | 
|     // console.log doesn't work right on testling, *grumble grumble* | 
|     console.log(JSON.stringify([expected - smean, mean, expected + smean])) | 
|     t.ok(mean < expected + smean) | 
|     t.ok(mean > expected - smean) | 
|   | 
|     t.end() | 
|   }) | 
| } |