diff --git a/test/parallel/parallel.status b/test/parallel/parallel.status index 4b6f0a9c478d61..0ad22df0b8ad9f 100644 --- a/test/parallel/parallel.status +++ b/test/parallel/parallel.status @@ -9,8 +9,6 @@ prefix parallel test-repl-sigint-nested-eval: PASS, FLAKY [$system==win32] -# https://github.com/nodejs/node/issues/24497 -test-timers-immediate-queue: PASS,FLAKY # https://github.com/nodejs/node/issues/23277 test-worker-memory: PASS,FLAKY # https://github.com/nodejs/node/issues/41206 diff --git a/test/parallel/test-timers-immediate-event-loop.js b/test/parallel/test-timers-immediate-event-loop.js new file mode 100644 index 00000000000000..768fc90a1c295f --- /dev/null +++ b/test/parallel/test-timers-immediate-event-loop.js @@ -0,0 +1,34 @@ +// Flags: --expose-internals +'use strict'; + +const common = require('../common'); + +const assert = require('assert'); +const { sleep } = require('internal/util'); + +// SetImmediate should clear its existing queue on each event loop run +// but leave any newly scheduled Immediates until the next run. +// +// Since timer expiries are notoriously flaky and dependant on specific +// OS configurations, we instead just check that an Immediate queue +// will eventually be interrupted by the timer — regardless of how long +// it actually takes for that to happen. + +const duration = 1; +let nextImmediate; + +const exit = common.mustCall(() => { + assert.ok(nextImmediate.hasRef()); + process.exit(); +}); + +function check() { + sleep(duration); + nextImmediate = setImmediate(check); +} + +setImmediate(common.mustCall(() => { + setTimeout(exit, duration); + + check(); +})); diff --git a/test/parallel/test-timers-immediate-queue.js b/test/parallel/test-timers-immediate-queue.js deleted file mode 100644 index dd793eead03438..00000000000000 --- a/test/parallel/test-timers-immediate-queue.js +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -'use strict'; -require('../common'); -const assert = require('assert'); - -// setImmediate should run clear its queued cbs once per event loop turn -// but immediates queued while processing the current queue should happen -// on the next turn of the event loop. - -// hit should be the exact same size of QUEUE, if we're letting things -// recursively add to the immediate QUEUE hit will be > QUEUE - -let ticked = false; - -let hit = 0; -const QUEUE = 10; - -function run() { - if (hit === 0) { - setTimeout(() => { ticked = true; }, 1); - const now = Date.now(); - while (Date.now() - now < 2); - } - - if (ticked) return; - - hit += 1; - setImmediate(run); -} - -for (let i = 0; i < QUEUE; i++) - setImmediate(run); - -process.on('exit', function() { - console.log('hit', hit); - assert.strictEqual(hit, QUEUE); -});