Skip to content

Commit 63d31e7

Browse files
committed
separate tests and validate they do what they should
1 parent c8b37ae commit 63d31e7

File tree

2 files changed

+70
-30
lines changed

2 files changed

+70
-30
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
'use strict';
2+
const common = require('../common');
3+
4+
if (common.isIBMi)
5+
common.skip('IBMi does not support `fs.watch()`');
6+
7+
const { watch, readFile, writeFile } = require('fs/promises');
8+
const fs = require('fs');
9+
const assert = require('assert');
10+
const { join } = require('path');
11+
const { setTimeout } = require('timers/promises');
12+
const tmpdir = require('../common/tmpdir');
13+
14+
class WatchTestCase {
15+
constructor(shouldInclude, dirName, files) {
16+
this.dirName = dirName;
17+
this.files = files;
18+
this.shouldSkip = !shouldInclude;
19+
}
20+
get dirPath() { return tmpdir.resolve(this.dirName); }
21+
filePath(fileName) { return join(this.dirPath, fileName); }
22+
23+
async run() {
24+
if (common.isMacOS) {
25+
// On macOS delay watcher start to avoid leaking previous events.
26+
// Refs: https://github.com/libuv/libuv/pull/4503
27+
await setTimeout(common.platformTimeout(100));
28+
}
29+
await Promise.all([this.watchFiles(), this.writeFiles()]);
30+
assert(!this.files.length);
31+
}
32+
async watchFiles() {
33+
const watcher = watch(this.dirPath);
34+
for await (const evt of watcher) {
35+
const idx = this.files.indexOf(evt.filename);
36+
if (idx < 0) continue;
37+
this.files.splice(idx, 1);
38+
await setTimeout(common.platformTimeout(100));
39+
if (!this.files.length) break;
40+
}
41+
}
42+
async writeFiles() {
43+
for (const fileName of [...this.files]) {
44+
await writeFile(this.filePath(fileName), Date.now() + fileName.repeat(1e4));
45+
}
46+
await setTimeout(common.platformTimeout(100));
47+
}
48+
}
49+
50+
const kCases = [
51+
// Watch on a directory should callback with a filename on supported systems
52+
new WatchTestCase(
53+
common.isLinux || common.isMacOS || common.isWindows || common.isAIX,
54+
'watch1',
55+
['foo', 'bar', 'baz']
56+
)
57+
];
58+
59+
tmpdir.refresh();
60+
61+
for (const testCase of kCases) {
62+
if (testCase.shouldSkip) continue;
63+
fs.mkdirSync(testCase.dirPath);
64+
testCase.run().then(common.mustCall());
65+
}

test/parallel/test-fs-promises-watch.js

Lines changed: 5 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,14 @@ const { setTimeout } = require('timers/promises');
1212
const tmpdir = require('../common/tmpdir');
1313

1414
class WatchTestCase {
15-
constructor(shouldInclude, dirName, fileName, secondFileName, field) {
15+
constructor(shouldInclude, dirName, fileName, field) {
1616
this.dirName = dirName;
1717
this.fileName = fileName;
18-
this.secondFileName = secondFileName;
1918
this.field = field;
2019
this.shouldSkip = !shouldInclude;
2120
}
2221
get dirPath() { return tmpdir.resolve(this.dirName); }
2322
get filePath() { return join(this.dirPath, this.fileName); }
24-
get secondFilePath() { return join(this.dirPath, this.secondFileName); }
2523
}
2624

2725
const kCases = [
@@ -30,23 +28,13 @@ const kCases = [
3028
common.isLinux || common.isMacOS || common.isWindows || common.isAIX,
3129
'watch1',
3230
'foo',
33-
undefined,
3431
'filePath'
3532
),
3633
// Watch on a file should callback with a filename on supported systems
3734
new WatchTestCase(
3835
common.isLinux || common.isMacOS || common.isWindows,
3936
'watch2',
4037
'bar',
41-
undefined,
42-
'dirPath'
43-
),
44-
// Watch a path and ensure that no files are missed
45-
new WatchTestCase(
46-
common.isLinux || common.isMacOS || common.isWindows || common.isAIX,
47-
'watch3',
48-
'foo',
49-
'bar',
5038
'dirPath'
5139
),
5240
];
@@ -59,11 +47,6 @@ for (const testCase of kCases) {
5947
// Long content so it's actually flushed.
6048
const content1 = Date.now() + testCase.fileName.toLowerCase().repeat(1e4);
6149
fs.writeFileSync(testCase.filePath, content1);
62-
if (testCase.secondFileName) {
63-
const content2 = Date.now() + testCase.secondFileName.toLowerCase().repeat(1e4);
64-
fs.writeFileSync(testCase.secondFilePath, content2);
65-
}
66-
6750

6851
let interval;
6952
async function test() {
@@ -74,19 +57,11 @@ for (const testCase of kCases) {
7457
}
7558

7659
const watcher = watch(testCase[testCase.field]);
77-
let second = false;
7860
for await (const { eventType, filename } of watcher) {
79-
if (!second) {
80-
clearInterval(interval);
81-
assert.strictEqual(['rename', 'change'].includes(eventType), true);
82-
assert.strictEqual(filename, testCase.fileName);
83-
second = true;
84-
if (!testCase.secondFileName) break;
85-
} else {
86-
assert.strictEqual(['rename', 'change'].includes(eventType), true);
87-
assert.strictEqual(filename, testCase.secondFileName);
88-
break;
89-
}
61+
clearInterval(interval);
62+
assert.strictEqual(['rename', 'change'].includes(eventType), true);
63+
assert.strictEqual(filename, testCase.fileName);
64+
break;
9065
}
9166

9267
// Waiting on it again is a non-op

0 commit comments

Comments
 (0)