Skip to content
Closed
Changes from all commits
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
206 changes: 100 additions & 106 deletions test/sequential/test-fs-watch.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,127 +21,121 @@

'use strict';
const common = require('../common');

const assert = require('assert');
const path = require('path');
const fs = require('fs');
const path = require('path');

const expectFilePath = common.isWindows ||
common.isLinux ||
common.isOSX ||
common.isAIX;

let watchSeenOne = 0;
let watchSeenTwo = 0;
let watchSeenThree = 0;

const testDir = common.tmpDir;

const filenameOne = 'watch.txt';
const filepathOne = path.join(testDir, filenameOne);

const filenameTwo = 'hasOwnProperty';
const filepathTwo = filenameTwo;
const filepathTwoAbs = path.join(testDir, filenameTwo);

process.on('exit', function() {
assert.ok(watchSeenOne > 0);
assert.ok(watchSeenTwo > 0);
assert.ok(watchSeenThree > 0);
});

common.refreshTmpDir();

fs.writeFileSync(filepathOne, 'hello');

assert.doesNotThrow(
function() {
const watcher = fs.watch(filepathOne);
watcher.on('change', function(event, filename) {
assert.strictEqual(event, 'change');

if (expectFilePath) {
assert.strictEqual(filename, 'watch.txt');
}
watcher.close();
++watchSeenOne;
});
}
);

setImmediate(function() {
fs.writeFileSync(filepathOne, 'world');
});


process.chdir(testDir);

fs.writeFileSync(filepathTwoAbs, 'howdy');

assert.doesNotThrow(
function() {
const watcher = fs.watch(filepathTwo, function(event, filename) {
assert.strictEqual(event, 'change');

if (expectFilePath) {
assert.strictEqual(filename, 'hasOwnProperty');
}
watcher.close();
++watchSeenTwo;
});
}
);

setImmediate(function() {
fs.writeFileSync(filepathTwoAbs, 'pardner');
});

const filenameThree = 'newfile.txt';
const testsubdir = fs.mkdtempSync(testDir + path.sep);
const filepathThree = path.join(testsubdir, filenameThree);

assert.doesNotThrow(
function() {
const watcher = fs.watch(testsubdir, function(event, filename) {
const renameEv = common.isSunOS || common.isAIX ? 'change' : 'rename';
assert.strictEqual(event, renameEv);
if (expectFilePath) {
assert.strictEqual(filename, 'newfile.txt');
} else {
assert.strictEqual(filename, null);
}
watcher.close();
++watchSeenThree;
});
}
);

setImmediate(function() {
const fd = fs.openSync(filepathThree, 'w');
fs.closeSync(fd);
});
{
const filepath = path.join(testDir, 'watch.txt');

fs.writeFileSync(filepath, 'hello');

assert.doesNotThrow(
function() {
const watcher = fs.watch(filepath);
watcher.on('change', common.mustCall(function(event, filename) {
assert.strictEqual(event, 'change');

if (expectFilePath) {
assert.strictEqual(filename, 'watch.txt');
}
watcher.close();
}));
}
);

setImmediate(function() {
fs.writeFileSync(filepath, 'world');
});
}

{
const filepathAbs = path.join(testDir, 'hasOwnProperty');

process.chdir(testDir);

fs.writeFileSync(filepathAbs, 'howdy');

assert.doesNotThrow(
function() {
const watcher =
fs.watch('hasOwnProperty', common.mustCall(function(event, filename) {
assert.strictEqual(event, 'change');

if (expectFilePath) {
assert.strictEqual(filename, 'hasOwnProperty');
}
watcher.close();
}));
}
);

setImmediate(function() {
fs.writeFileSync(filepathAbs, 'pardner');
});
}

{
const testsubdir = fs.mkdtempSync(testDir + path.sep);
const filepath = path.join(testsubdir, 'newfile.txt');

assert.doesNotThrow(
function() {
const watcher =
fs.watch(testsubdir, common.mustCall(function(event, filename) {
const renameEv = common.isSunOS || common.isAIX ? 'change' : 'rename';
assert.strictEqual(event, renameEv);
if (expectFilePath) {
assert.strictEqual(filename, 'newfile.txt');
} else {
assert.strictEqual(filename, null);
}
watcher.close();
}));
}
);

setImmediate(function() {
const fd = fs.openSync(filepath, 'w');
fs.closeSync(fd);
});

}

// https://github.com/joyent/node/issues/2293 - non-persistent watcher should
// not block the event loop
fs.watch(__filename, { persistent: false }, function() {
assert(0);
});
{
fs.watch(__filename, { persistent: false }, common.mustNotCall());
}

// whitebox test to ensure that wrapped FSEvent is safe
// https://github.com/joyent/node/issues/6690
let oldhandle;
assert.throws(function() {
const w = fs.watch(__filename, common.mustNotCall());
oldhandle = w._handle;
w._handle = { close: w._handle.close };
w.close();
}, /^TypeError: Illegal invocation$/);
oldhandle.close(); // clean up

assert.throws(function() {
const w = fs.watchFile(__filename, { persistent: false },
common.mustNotCall());
oldhandle = w._handle;
w._handle = { stop: w._handle.stop };
w.stop();
}, /^TypeError: Illegal invocation$/);
oldhandle.stop(); // clean up
{
let oldhandle;
assert.throws(function() {
const w = fs.watch(__filename, common.mustNotCall());
oldhandle = w._handle;
w._handle = { close: w._handle.close };
w.close();
}, /^TypeError: Illegal invocation$/);
oldhandle.close(); // clean up

assert.throws(function() {
const w = fs.watchFile(__filename, { persistent: false },
common.mustNotCall());
oldhandle = w._handle;
w._handle = { stop: w._handle.stop };
w.stop();
}, /^TypeError: Illegal invocation$/);
oldhandle.stop(); // clean up
}