@@ -315,3 +315,183 @@ assert.throws(
315315 assert . strictEqual ( desc . writable , true ) ;
316316 assert . strictEqual ( desc . enumerable , false ) ;
317317} ) ;
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