mirror of https://github.com/lukechilds/node.git
Browse Source
PR-URL: https://github.com/nodejs/node/pull/13411 Refs: https://github.com/nodejs/node/pull/13385 Refs: https://github.com/nodejs/node/issues/13248 Refs: https://github.com/nodejs/node/issues/13377 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>v6
Refael Ackermann
7 years ago
1 changed files with 77 additions and 0 deletions
@ -0,0 +1,77 @@ |
|||
'use strict'; |
|||
const common = require('../common'); |
|||
|
|||
// tests if `filename` is provided to watcher on supported platforms
|
|||
|
|||
const fs = require('fs'); |
|||
const assert = require('assert'); |
|||
const { join } = require('path'); |
|||
|
|||
class WatchTestCase { |
|||
constructor(shouldInclude, dirName, fileName, field) { |
|||
this.dirName = dirName; |
|||
this.fileName = fileName; |
|||
this.field = field; |
|||
this.shouldSkip = !shouldInclude; |
|||
} |
|||
get dirPath() { return join(common.tmpDir, this.dirName); } |
|||
get filePath() { return join(this.dirPath, this.fileName); } |
|||
} |
|||
|
|||
const cases = [ |
|||
// Watch on a directory should callback with a filename on supported systems
|
|||
new WatchTestCase( |
|||
common.isLinux || common.isOSX || common.isWindows || common.isAix, |
|||
'watch1', |
|||
'foo', |
|||
'filePath' |
|||
), |
|||
// Watch on a file should callback with a filename on supported systems
|
|||
new WatchTestCase( |
|||
common.isLinux || common.isOSX || common.isWindows, |
|||
'watch2', |
|||
'bar', |
|||
'dirPath' |
|||
) |
|||
]; |
|||
|
|||
common.refreshTmpDir(); |
|||
|
|||
for (const testCase of cases) { |
|||
if (testCase.shouldSkip) continue; |
|||
fs.mkdirSync(testCase.dirPath); |
|||
// long content so it's actually flushed.
|
|||
const content1 = Date.now() + testCase.fileName.toLowerCase().repeat(1e4); |
|||
fs.writeFileSync(testCase.filePath, content1); |
|||
|
|||
let interval; |
|||
const watcher = fs.watch(testCase[testCase.field]); |
|||
watcher.on('error', (err) => { |
|||
if (interval) { |
|||
clearInterval(interval); |
|||
interval = null; |
|||
} |
|||
assert.fail(err); |
|||
}); |
|||
watcher.on('change', common.mustCall(function(eventType, argFilename) { |
|||
if (interval) { |
|||
clearInterval(interval); |
|||
interval = null; |
|||
} |
|||
if (common.isOSX) |
|||
assert.strictEqual(['rename', 'change'].includes(eventType), true); |
|||
else |
|||
assert.strictEqual(eventType, 'change'); |
|||
assert.strictEqual(argFilename, testCase.fileName); |
|||
|
|||
// end of test case
|
|||
watcher.close(); |
|||
})); |
|||
|
|||
// long content so it's actually flushed. toUpperCase so there's real change.
|
|||
const content2 = Date.now() + testCase.fileName.toUpperCase().repeat(1e4); |
|||
interval = setInterval(() => { |
|||
fs.writeFileSync(testCase.filePath, ''); |
|||
fs.writeFileSync(testCase.filePath, content2); |
|||
}, 100); |
|||
} |
Loading…
Reference in new issue