Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
test: fix flaky test-fs-watch-ignore-recursive
Use setInterval instead of setTimeout to handle potential event delays
on macOS FSEvents. This ensures that if a write event is missed due to
event coalescing or latency, subsequent writes will eventually trigger
the expected event.
  • Loading branch information
mcollina committed Jan 19, 2026
commit cbcd51e614a8fb357a483567927b458cefbdc8dd
76 changes: 46 additions & 30 deletions test/parallel/test-fs-watch-ignore-recursive.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

let seenFile = false;
let seenIgnored = false;
let watcherClosed = false;
let interval;

watcher.on('change', common.mustCallAtLeast((event, filename) => {
// On recursive watch, filename includes relative path from watched dir
Expand All @@ -45,18 +45,22 @@
seenIgnored = true;
}
if (seenFile) {
clearInterval(interval);
interval = null;
watcher.close();
watcherClosed = true;
}
}, 1));

setTimeout(() => {
fs.writeFileSync(ignoredFile, 'ignored');
fs.writeFileSync(testFile, 'content');
}, common.platformTimeout(200));
// Use setInterval to handle potential event delays on macOS FSEvents
process.nextTick(common.mustCall(() => {
interval = setInterval(() => {
fs.writeFileSync(ignoredFile, 'ignored');
fs.writeFileSync(testFile, 'content-' + Date.now());
}, 100);
}));

process.on('exit', () => {
assert.strictEqual(watcherClosed, true);
assert.strictEqual(interval, null);
assert.strictEqual(seenFile, true);
assert.strictEqual(seenIgnored, false);
});
Expand All @@ -80,7 +84,7 @@

let seenFile = false;
let seenIgnored = false;
let watcherClosed = false;
let interval;

watcher.on('change', common.mustCallAtLeast((event, filename) => {
if (filename && filename.endsWith('keep.txt')) {
Expand All @@ -90,18 +94,22 @@
seenIgnored = true;
}
if (seenFile) {
clearInterval(interval);
interval = null;
watcher.close();
watcherClosed = true;
}
}, 1));

setTimeout(() => {
fs.writeFileSync(ignoredFile, 'ignored');
fs.writeFileSync(testFile, 'content');
}, common.platformTimeout(200));
// Use setInterval to handle potential event delays on macOS FSEvents
process.nextTick(common.mustCall(() => {
interval = setInterval(() => {
fs.writeFileSync(ignoredFile, 'ignored');
fs.writeFileSync(testFile, 'content-' + Date.now());
}, 100);
}));

process.on('exit', () => {
assert.strictEqual(watcherClosed, true);
assert.strictEqual(interval, null);
assert.strictEqual(seenFile, true);
assert.strictEqual(seenIgnored, false);
});
Expand All @@ -127,7 +135,7 @@

let seenFile = false;
let seenIgnored = false;
let watcherClosed = false;
let interval;

watcher.on('change', common.mustCallAtLeast((event, filename) => {
if (filename && filename.endsWith('app.js')) {
Expand All @@ -137,20 +145,24 @@
seenIgnored = true;
}
if (seenFile) {
clearInterval(interval);
interval = null;
watcher.close();
watcherClosed = true;
}
}, 1));

setTimeout(() => {
fs.writeFileSync(ignoredFile, '{}');
fs.writeFileSync(testFile, 'console.log("hello")');
}, common.platformTimeout(200));
// Use setInterval to handle potential event delays on macOS FSEvents
process.nextTick(common.mustCall(() => {
interval = setInterval(() => {
fs.writeFileSync(ignoredFile, '{}');
fs.writeFileSync(testFile, 'console.log("hello-' + Date.now() + '")');
}, 100);
}));

process.on('exit', () => {
assert.strictEqual(watcherClosed, true);
assert.strictEqual(interval, null);
assert.strictEqual(seenFile, true);
assert.strictEqual(seenIgnored, false);

Check failure on line 165 in test/parallel/test-fs-watch-ignore-recursive.js

View workflow job for this annotation

GitHub Actions / test-macOS

--- stderr --- node:internal/assert/utils:146 throw error; ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: true !== false at process.<anonymous> (/Users/runner/work/node/node/node/test/parallel/test-fs-watch-ignore-recursive.js:165:12) at process.emit (node:events:520:22) { generatedMessage: true, code: 'ERR_ASSERTION', actual: true, expected: false, operator: 'strictEqual', diff: 'simple' } Node.js v26.0.0-pre Command: out/Release/node /Users/runner/work/node/node/node/test/parallel/test-fs-watch-ignore-recursive.js

Check failure on line 165 in test/parallel/test-fs-watch-ignore-recursive.js

View workflow job for this annotation

GitHub Actions / aarch64-darwin: with shared libraries

--- stderr --- node:internal/assert/utils:146 throw error; ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: true !== false at process.<anonymous> (/Users/runner/work/_temp/node-v26.0.0-nightly2026-01-193763a0e997-slim/test/parallel/test-fs-watch-ignore-recursive.js:165:12) at process.emit (node:events:520:22) { generatedMessage: true, code: 'ERR_ASSERTION', actual: true, expected: false, operator: 'strictEqual', diff: 'simple' } Node.js v26.0.0-pre Command: out/Release/node /Users/runner/work/_temp/node-v26.0.0-nightly2026-01-193763a0e997-slim/test/parallel/test-fs-watch-ignore-recursive.js

Check failure on line 165 in test/parallel/test-fs-watch-ignore-recursive.js

View workflow job for this annotation

GitHub Actions / x86_64-darwin: with shared libraries

--- stderr --- node:internal/assert/utils:146 throw error; ^ AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: true !== false at process.<anonymous> (/Users/runner/work/_temp/node-v26.0.0-nightly2026-01-193763a0e997-slim/test/parallel/test-fs-watch-ignore-recursive.js:165:12) at process.emit (node:events:520:22) { generatedMessage: true, code: 'ERR_ASSERTION', actual: true, expected: false, operator: 'strictEqual', diff: 'simple' } Node.js v26.0.0-pre Command: out/Release/node /Users/runner/work/_temp/node-v26.0.0-nightly2026-01-193763a0e997-slim/test/parallel/test-fs-watch-ignore-recursive.js
});
}

Expand Down Expand Up @@ -180,7 +192,7 @@
let seenLog = false;
let seenTmp = false;
let seenHidden = false;
let watcherClosed = false;
let interval;

watcher.on('change', common.mustCallAtLeast((event, filename) => {
if (filename && filename.endsWith('visible.txt')) {
Expand All @@ -191,20 +203,24 @@
if (filename && filename.endsWith('.gitignore')) seenHidden = true;

if (seenFile) {
clearInterval(interval);
interval = null;
watcher.close();
watcherClosed = true;
}
}, 1));

setTimeout(() => {
fs.writeFileSync(ignoredLog, 'ignored');
fs.writeFileSync(ignoredTmp, 'ignored');
fs.writeFileSync(ignoredHidden, 'ignored');
fs.writeFileSync(testFile, 'content');
}, common.platformTimeout(200));
// Use setInterval to handle potential event delays on macOS FSEvents
process.nextTick(common.mustCall(() => {
interval = setInterval(() => {
fs.writeFileSync(ignoredLog, 'ignored');
fs.writeFileSync(ignoredTmp, 'ignored');
fs.writeFileSync(ignoredHidden, 'ignored');
fs.writeFileSync(testFile, 'content-' + Date.now());
}, 100);
}));

process.on('exit', () => {
assert.strictEqual(watcherClosed, true);
assert.strictEqual(interval, null);
assert.strictEqual(seenFile, true);
assert.strictEqual(seenLog, false);
assert.strictEqual(seenTmp, false);
Expand Down
Loading