@@ -315,3 +315,183 @@ assert.throws(
315
315
assert . strictEqual ( desc . writable , true ) ;
316
316
assert . strictEqual ( desc . enumerable , false ) ;
317
317
} ) ;
318
+
319
+
320
+ {
321
+ // Asynchronous API
322
+ const randomInts = [ ] ;
323
+ for ( let i = 0 ; i < 100 ; i ++ ) {
324
+ crypto . randomInt ( 3 , common . mustCall ( ( err , n ) => {
325
+ assert . ifError ( err ) ;
326
+ assert . ok ( n >= 0 ) ;
327
+ assert . ok ( n < 3 ) ;
328
+ randomInts . push ( n ) ;
329
+ if ( randomInts . length === 100 ) {
330
+ assert . ok ( ! randomInts . includes ( - 1 ) ) ;
331
+ assert . ok ( randomInts . includes ( 0 ) ) ;
332
+ assert . ok ( randomInts . includes ( 1 ) ) ;
333
+ assert . ok ( randomInts . includes ( 2 ) ) ;
334
+ assert . ok ( ! randomInts . includes ( 3 ) ) ;
335
+ }
336
+ } ) ) ;
337
+ }
338
+ }
339
+ {
340
+ // Synchronous API
341
+ const randomInts = [ ] ;
342
+ for ( let i = 0 ; i < 100 ; i ++ ) {
343
+ const n = crypto . randomInt ( 3 ) ;
344
+ assert . ok ( n >= 0 ) ;
345
+ assert . ok ( n < 3 ) ;
346
+ randomInts . push ( n ) ;
347
+ }
348
+
349
+ assert . ok ( ! randomInts . includes ( - 1 ) ) ;
350
+ assert . ok ( randomInts . includes ( 0 ) ) ;
351
+ assert . ok ( randomInts . includes ( 1 ) ) ;
352
+ assert . ok ( randomInts . includes ( 2 ) ) ;
353
+ assert . ok ( ! randomInts . includes ( 3 ) ) ;
354
+ }
355
+ {
356
+ // Positive range
357
+ const randomInts = [ ] ;
358
+ for ( let i = 0 ; i < 100 ; i ++ ) {
359
+ crypto . randomInt ( 1 , 3 , common . mustCall ( ( err , n ) => {
360
+ assert . ifError ( err ) ;
361
+ assert . ok ( n >= 1 ) ;
362
+ assert . ok ( n < 3 ) ;
363
+ randomInts . push ( n ) ;
364
+ if ( randomInts . length === 100 ) {
365
+ assert . ok ( ! randomInts . includes ( 0 ) ) ;
366
+ assert . ok ( randomInts . includes ( 1 ) ) ;
367
+ assert . ok ( randomInts . includes ( 2 ) ) ;
368
+ assert . ok ( ! randomInts . includes ( 3 ) ) ;
369
+ }
370
+ } ) ) ;
371
+ }
372
+ }
373
+ {
374
+ // Negative range
375
+ const randomInts = [ ] ;
376
+ for ( let i = 0 ; i < 100 ; i ++ ) {
377
+ crypto . randomInt ( - 10 , - 8 , common . mustCall ( ( err , n ) => {
378
+ assert . ifError ( err ) ;
379
+ assert . ok ( n >= - 10 ) ;
380
+ assert . ok ( n < - 8 ) ;
381
+ randomInts . push ( n ) ;
382
+ if ( randomInts . length === 100 ) {
383
+ assert . ok ( ! randomInts . includes ( - 11 ) ) ;
384
+ assert . ok ( randomInts . includes ( - 10 ) ) ;
385
+ assert . ok ( randomInts . includes ( - 9 ) ) ;
386
+ assert . ok ( ! randomInts . includes ( - 8 ) ) ;
387
+ }
388
+ } ) ) ;
389
+ }
390
+ }
391
+ {
392
+
393
+ [ '10' , true , NaN , null , { } , [ ] ] . forEach ( ( i ) => {
394
+ const invalidMinError = {
395
+ code : 'ERR_INVALID_ARG_TYPE' ,
396
+ name : 'TypeError' ,
397
+ message : 'The "min" argument must be safe integer.' +
398
+ `${ common . invalidArgTypeHelper ( i ) } ` ,
399
+ } ;
400
+ const invalidMaxError = {
401
+ code : 'ERR_INVALID_ARG_TYPE' ,
402
+ name : 'TypeError' ,
403
+ message : 'The "max" argument must be safe integer.' +
404
+ `${ common . invalidArgTypeHelper ( i ) } ` ,
405
+ } ;
406
+
407
+ assert . throws (
408
+ ( ) => crypto . randomInt ( i , 100 ) ,
409
+ invalidMinError
410
+ ) ;
411
+ assert . throws (
412
+ ( ) => crypto . randomInt ( i , 100 , common . mustNotCall ( ) ) ,
413
+ invalidMinError
414
+ ) ;
415
+ assert . throws (
416
+ ( ) => crypto . randomInt ( i ) ,
417
+ invalidMaxError
418
+ ) ;
419
+ assert . throws (
420
+ ( ) => crypto . randomInt ( i , common . mustNotCall ( ) ) ,
421
+ invalidMaxError
422
+ ) ;
423
+ assert . throws (
424
+ ( ) => crypto . randomInt ( 0 , i , common . mustNotCall ( ) ) ,
425
+ invalidMaxError
426
+ ) ;
427
+ assert . throws (
428
+ ( ) => crypto . randomInt ( 0 , i ) ,
429
+ invalidMaxError
430
+ ) ;
431
+ } ) ;
432
+
433
+ const maxInt = Number . MAX_SAFE_INTEGER ;
434
+ const minInt = Number . MIN_SAFE_INTEGER ;
435
+
436
+ crypto . randomInt ( minInt , minInt + 5 , common . mustCall ( ) ) ;
437
+ crypto . randomInt ( maxInt - 5 , maxInt , common . mustCall ( ) ) ;
438
+
439
+ assert . throws (
440
+ ( ) => crypto . randomInt ( minInt - 1 , minInt + 5 , common . mustNotCall ( ) ) ,
441
+ {
442
+ code : 'ERR_INVALID_ARG_TYPE' ,
443
+ name : 'TypeError' ,
444
+ message : 'The "min" argument must be safe integer.' +
445
+ `${ common . invalidArgTypeHelper ( minInt - 1 ) } ` ,
446
+ }
447
+ ) ;
448
+
449
+ assert . throws (
450
+ ( ) => crypto . randomInt ( maxInt + 1 , common . mustNotCall ( ) ) ,
451
+ {
452
+ code : 'ERR_INVALID_ARG_TYPE' ,
453
+ name : 'TypeError' ,
454
+ message : 'The "max" argument must be safe integer.' +
455
+ `${ common . invalidArgTypeHelper ( maxInt + 1 ) } ` ,
456
+ }
457
+ ) ;
458
+
459
+ crypto . randomInt ( 0 , common . mustCall ( ) ) ;
460
+ crypto . randomInt ( 0 , 0 , common . mustCall ( ) ) ;
461
+ assert . throws ( ( ) => crypto . randomInt ( - 1 , common . mustNotCall ( ) ) , {
462
+ code : 'ERR_OUT_OF_RANGE' ,
463
+ name : 'RangeError' ,
464
+ message : 'The value of "max" is out of range. It must be >= 0. Received -1'
465
+ } ) ;
466
+
467
+ const MAX_RANGE = 0xFFFF_FFFF_FFFF ;
468
+ crypto . randomInt ( MAX_RANGE , common . mustCall ( ) ) ;
469
+ crypto . randomInt ( 1 , MAX_RANGE + 1 , common . mustCall ( ) ) ;
470
+ assert . throws (
471
+ ( ) => crypto . randomInt ( 1 , MAX_RANGE + 2 , common . mustNotCall ( ) ) ,
472
+ {
473
+ code : 'ERR_OUT_OF_RANGE' ,
474
+ name : 'RangeError' ,
475
+ message : 'The value of "max - min" is out of range. ' +
476
+ `It must be <= ${ MAX_RANGE } . ` +
477
+ 'Received 281_474_976_710_656'
478
+ }
479
+ ) ;
480
+
481
+ assert . throws ( ( ) => crypto . randomInt ( MAX_RANGE + 1 , common . mustNotCall ( ) ) , {
482
+ code : 'ERR_OUT_OF_RANGE' ,
483
+ name : 'RangeError' ,
484
+ message : 'The value of "max" is out of range. ' +
485
+ `It must be <= ${ MAX_RANGE } . ` +
486
+ 'Received 281_474_976_710_656'
487
+ } ) ;
488
+
489
+ [ true , NaN , null , { } , [ ] , 10 ] . forEach ( ( i ) => {
490
+ const cbError = {
491
+ code : 'ERR_INVALID_CALLBACK' ,
492
+ name : 'TypeError' ,
493
+ message : `Callback must be a function. Received ${ inspect ( i ) } `
494
+ } ;
495
+ assert . throws ( ( ) => crypto . randomInt ( 0 , 1 , i ) , cbError ) ;
496
+ } ) ;
497
+ }
0 commit comments