@@ -479,6 +479,59 @@ describe('Mock Timers Test Suite', () => {
479479 code : 'ERR_INVALID_ARG_TYPE' ,
480480 } ) ;
481481 } ) ;
482+
483+ // Test for https://github.com/nodejs/node/issues/50365
484+ it ( 'should not affect other timers when aborting' , async ( t ) => {
485+ const f1 = t . mock . fn ( ) ;
486+ const f2 = t . mock . fn ( ) ;
487+ t . mock . timers . enable ( { apis : [ 'setTimeout' ] } ) ;
488+ const ac = new AbortController ( ) ;
489+
490+ // id 1 & pos 1 in priority queue
491+ nodeTimersPromises . setTimeout ( 100 , undefined , { signal : ac . signal } ) . then ( f1 , f1 ) ;
492+ // id 2 & pos 1 in priority queue (id 1 is moved to pos 2)
493+ nodeTimersPromises . setTimeout ( 50 ) . then ( f2 , f2 ) ;
494+
495+ ac . abort ( ) ; // BUG: will remove timer at pos 1 not timer with id 1!
496+
497+ t . mock . timers . runAll ( ) ;
498+ await nodeTimersPromises . setImmediate ( ) ; // let promises settle
499+
500+ // First setTimeout is aborted
501+ assert . strictEqual ( f1 . mock . callCount ( ) , 1 ) ;
502+ assert . strictEqual ( f1 . mock . calls [ 0 ] . arguments [ 0 ] . code , 'ABORT_ERR' ) ;
503+
504+ // Second setTimeout should resolve, but never settles, because it was eronously removed by ac.abort()
505+ assert . strictEqual ( f2 . mock . callCount ( ) , 1 ) ;
506+ } ) ;
507+
508+ // Test for https://github.com/nodejs/node/issues/50365
509+ it ( 'should not affect other timers when aborted after triggering' , async ( t ) => {
510+ const f1 = t . mock . fn ( ) ;
511+ const f2 = t . mock . fn ( ) ;
512+ t . mock . timers . enable ( { apis : [ 'setTimeout' ] } ) ;
513+ const ac = new AbortController ( ) ;
514+
515+ // id 1 & pos 1 in priority queue
516+ nodeTimersPromises . setTimeout ( 50 , true , { signal : ac . signal } ) . then ( f1 , f1 ) ;
517+ // id 2 & pos 2 in priority queue
518+ nodeTimersPromises . setTimeout ( 100 ) . then ( f2 , f2 ) ;
519+
520+ // First setTimeout resolves
521+ t . mock . timers . tick ( 50 ) ;
522+ await nodeTimersPromises . setImmediate ( ) ; // let promises settle
523+ assert . strictEqual ( f1 . mock . callCount ( ) , 1 ) ;
524+ assert . strictEqual ( f1 . mock . calls [ 0 ] . arguments . length , 1 ) ;
525+ assert . strictEqual ( f1 . mock . calls [ 0 ] . arguments [ 0 ] , true ) ;
526+
527+ // Now timer with id 2 will be at pos 1 in priority queue
528+ ac . abort ( ) ; // BUG: will remove timer at pos 1 not timer with id 1!
529+
530+ // Second setTimeout should resolve, but never settles, because it was eronously removed by ac.abort()
531+ t . mock . timers . runAll ( ) ;
532+ await nodeTimersPromises . setImmediate ( ) ; // let promises settle
533+ assert . strictEqual ( f2 . mock . callCount ( ) , 1 ) ;
534+ } ) ;
482535 } ) ;
483536
484537 describe ( 'setInterval Suite' , ( ) => {
@@ -626,6 +679,38 @@ describe('Mock Timers Test Suite', () => {
626679 } ) ;
627680 assert . strictEqual ( numIterations , expectedIterations ) ;
628681 } ) ;
682+
683+ // Test for https://github.com/nodejs/node/issues/50381
684+ it ( 'should use the mocked interval' , ( t ) => {
685+ t . mock . timers . enable ( { apis : [ 'setInterval' ] } ) ;
686+ const fn = t . mock . fn ( ) ;
687+ setInterval ( fn , 1000 ) ;
688+ assert . strictEqual ( fn . mock . callCount ( ) , 0 ) ;
689+ t . mock . timers . tick ( 1000 ) ;
690+ assert . strictEqual ( fn . mock . callCount ( ) , 1 ) ;
691+ t . mock . timers . tick ( 1 ) ;
692+ t . mock . timers . tick ( 1 ) ;
693+ t . mock . timers . tick ( 1 ) ;
694+ assert . strictEqual ( fn . mock . callCount ( ) , 1 ) ;
695+ } ) ;
696+
697+ // Test for https://github.com/nodejs/node/issues/50382
698+ it ( 'should not prevent due timers to be processed' , async ( t ) => {
699+ t . mock . timers . enable ( { apis : [ 'setInterval' , 'setTimeout' ] } ) ;
700+ const f1 = t . mock . fn ( ) ;
701+ const f2 = t . mock . fn ( ) ;
702+
703+ setInterval ( f1 , 1000 ) ;
704+ setTimeout ( f2 , 1001 ) ;
705+
706+ assert . strictEqual ( f1 . mock . callCount ( ) , 0 ) ;
707+ assert . strictEqual ( f2 . mock . callCount ( ) , 0 ) ;
708+
709+ t . mock . timers . tick ( 1001 ) ;
710+
711+ assert . strictEqual ( f1 . mock . callCount ( ) , 1 ) ;
712+ assert . strictEqual ( f2 . mock . callCount ( ) , 1 ) ;
713+ } ) ;
629714 } ) ;
630715 } ) ;
631716 } ) ;
0 commit comments