Skip to content

Commit cbcd51e

Browse files
committed
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.
1 parent 75492cf commit cbcd51e

File tree

1 file changed

+46
-30
lines changed

1 file changed

+46
-30
lines changed

test/parallel/test-fs-watch-ignore-recursive.js

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ tmpdir.refresh();
3434

3535
let seenFile = false;
3636
let seenIgnored = false;
37-
let watcherClosed = false;
37+
let interval;
3838

3939
watcher.on('change', common.mustCallAtLeast((event, filename) => {
4040
// On recursive watch, filename includes relative path from watched dir
@@ -45,18 +45,22 @@ tmpdir.refresh();
4545
seenIgnored = true;
4646
}
4747
if (seenFile) {
48+
clearInterval(interval);
49+
interval = null;
4850
watcher.close();
49-
watcherClosed = true;
5051
}
5152
}, 1));
5253

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

5862
process.on('exit', () => {
59-
assert.strictEqual(watcherClosed, true);
63+
assert.strictEqual(interval, null);
6064
assert.strictEqual(seenFile, true);
6165
assert.strictEqual(seenIgnored, false);
6266
});
@@ -80,7 +84,7 @@ tmpdir.refresh();
8084

8185
let seenFile = false;
8286
let seenIgnored = false;
83-
let watcherClosed = false;
87+
let interval;
8488

8589
watcher.on('change', common.mustCallAtLeast((event, filename) => {
8690
if (filename && filename.endsWith('keep.txt')) {
@@ -90,18 +94,22 @@ tmpdir.refresh();
9094
seenIgnored = true;
9195
}
9296
if (seenFile) {
97+
clearInterval(interval);
98+
interval = null;
9399
watcher.close();
94-
watcherClosed = true;
95100
}
96101
}, 1));
97102

98-
setTimeout(() => {
99-
fs.writeFileSync(ignoredFile, 'ignored');
100-
fs.writeFileSync(testFile, 'content');
101-
}, common.platformTimeout(200));
103+
// Use setInterval to handle potential event delays on macOS FSEvents
104+
process.nextTick(common.mustCall(() => {
105+
interval = setInterval(() => {
106+
fs.writeFileSync(ignoredFile, 'ignored');
107+
fs.writeFileSync(testFile, 'content-' + Date.now());
108+
}, 100);
109+
}));
102110

103111
process.on('exit', () => {
104-
assert.strictEqual(watcherClosed, true);
112+
assert.strictEqual(interval, null);
105113
assert.strictEqual(seenFile, true);
106114
assert.strictEqual(seenIgnored, false);
107115
});
@@ -127,7 +135,7 @@ tmpdir.refresh();
127135

128136
let seenFile = false;
129137
let seenIgnored = false;
130-
let watcherClosed = false;
138+
let interval;
131139

132140
watcher.on('change', common.mustCallAtLeast((event, filename) => {
133141
if (filename && filename.endsWith('app.js')) {
@@ -137,18 +145,22 @@ tmpdir.refresh();
137145
seenIgnored = true;
138146
}
139147
if (seenFile) {
148+
clearInterval(interval);
149+
interval = null;
140150
watcher.close();
141-
watcherClosed = true;
142151
}
143152
}, 1));
144153

145-
setTimeout(() => {
146-
fs.writeFileSync(ignoredFile, '{}');
147-
fs.writeFileSync(testFile, 'console.log("hello")');
148-
}, common.platformTimeout(200));
154+
// Use setInterval to handle potential event delays on macOS FSEvents
155+
process.nextTick(common.mustCall(() => {
156+
interval = setInterval(() => {
157+
fs.writeFileSync(ignoredFile, '{}');
158+
fs.writeFileSync(testFile, 'console.log("hello-' + Date.now() + '")');
159+
}, 100);
160+
}));
149161

150162
process.on('exit', () => {
151-
assert.strictEqual(watcherClosed, true);
163+
assert.strictEqual(interval, null);
152164
assert.strictEqual(seenFile, true);
153165
assert.strictEqual(seenIgnored, false);
154166
});
@@ -180,7 +192,7 @@ tmpdir.refresh();
180192
let seenLog = false;
181193
let seenTmp = false;
182194
let seenHidden = false;
183-
let watcherClosed = false;
195+
let interval;
184196

185197
watcher.on('change', common.mustCallAtLeast((event, filename) => {
186198
if (filename && filename.endsWith('visible.txt')) {
@@ -191,20 +203,24 @@ tmpdir.refresh();
191203
if (filename && filename.endsWith('.gitignore')) seenHidden = true;
192204

193205
if (seenFile) {
206+
clearInterval(interval);
207+
interval = null;
194208
watcher.close();
195-
watcherClosed = true;
196209
}
197210
}, 1));
198211

199-
setTimeout(() => {
200-
fs.writeFileSync(ignoredLog, 'ignored');
201-
fs.writeFileSync(ignoredTmp, 'ignored');
202-
fs.writeFileSync(ignoredHidden, 'ignored');
203-
fs.writeFileSync(testFile, 'content');
204-
}, common.platformTimeout(200));
212+
// Use setInterval to handle potential event delays on macOS FSEvents
213+
process.nextTick(common.mustCall(() => {
214+
interval = setInterval(() => {
215+
fs.writeFileSync(ignoredLog, 'ignored');
216+
fs.writeFileSync(ignoredTmp, 'ignored');
217+
fs.writeFileSync(ignoredHidden, 'ignored');
218+
fs.writeFileSync(testFile, 'content-' + Date.now());
219+
}, 100);
220+
}));
205221

206222
process.on('exit', () => {
207-
assert.strictEqual(watcherClosed, true);
223+
assert.strictEqual(interval, null);
208224
assert.strictEqual(seenFile, true);
209225
assert.strictEqual(seenLog, false);
210226
assert.strictEqual(seenTmp, false);

0 commit comments

Comments
 (0)