test: refactor test/sequential/test-fs-watch.js

* add block scoping
* rename block-scoped identifiers (e.g., filenameTwo -> filename)
* use common.mustCall() instead of exit handler
* use common.mustNotCall() as appropriate
* order modules per test writing guide

PR-URL: https://github.com/nodejs/node/pull/14534
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
Rich Trott 2017-07-28 21:31:48 -07:00
parent 13d6eae5f3
commit 8c2cac650a

View File

@ -21,127 +21,121 @@
'use strict'; 'use strict';
const common = require('../common'); const common = require('../common');
const assert = require('assert'); const assert = require('assert');
const path = require('path');
const fs = require('fs'); const fs = require('fs');
const path = require('path');
const expectFilePath = common.isWindows || const expectFilePath = common.isWindows ||
common.isLinux || common.isLinux ||
common.isOSX || common.isOSX ||
common.isAIX; common.isAIX;
let watchSeenOne = 0;
let watchSeenTwo = 0;
let watchSeenThree = 0;
const testDir = common.tmpDir; 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(); common.refreshTmpDir();
fs.writeFileSync(filepathOne, 'hello'); {
const filepath = path.join(testDir, 'watch.txt');
assert.doesNotThrow( fs.writeFileSync(filepath, 'hello');
function() {
const watcher = fs.watch(filepathOne);
watcher.on('change', function(event, filename) {
assert.strictEqual(event, 'change');
if (expectFilePath) { assert.doesNotThrow(
assert.strictEqual(filename, 'watch.txt'); function() {
} const watcher = fs.watch(filepath);
watcher.close(); watcher.on('change', common.mustCall(function(event, filename) {
++watchSeenOne; assert.strictEqual(event, 'change');
});
}
);
setImmediate(function() { if (expectFilePath) {
fs.writeFileSync(filepathOne, 'world'); assert.strictEqual(filename, 'watch.txt');
}); }
watcher.close();
}));
}
);
setImmediate(function() {
fs.writeFileSync(filepath, 'world');
});
}
process.chdir(testDir); {
const filepathAbs = path.join(testDir, 'hasOwnProperty');
fs.writeFileSync(filepathTwoAbs, 'howdy'); process.chdir(testDir);
assert.doesNotThrow( fs.writeFileSync(filepathAbs, 'howdy');
function() {
const watcher = fs.watch(filepathTwo, function(event, filename) {
assert.strictEqual(event, 'change');
if (expectFilePath) { assert.doesNotThrow(
assert.strictEqual(filename, 'hasOwnProperty'); function() {
} const watcher =
watcher.close(); fs.watch('hasOwnProperty', common.mustCall(function(event, filename) {
++watchSeenTwo; assert.strictEqual(event, 'change');
});
}
);
setImmediate(function() { if (expectFilePath) {
fs.writeFileSync(filepathTwoAbs, 'pardner'); assert.strictEqual(filename, 'hasOwnProperty');
}); }
watcher.close();
}));
}
);
const filenameThree = 'newfile.txt'; setImmediate(function() {
const testsubdir = fs.mkdtempSync(testDir + path.sep); fs.writeFileSync(filepathAbs, 'pardner');
const filepathThree = path.join(testsubdir, filenameThree); });
}
assert.doesNotThrow( {
function() { const testsubdir = fs.mkdtempSync(testDir + path.sep);
const watcher = fs.watch(testsubdir, function(event, filename) { const filepath = path.join(testsubdir, 'newfile.txt');
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() { assert.doesNotThrow(
const fd = fs.openSync(filepathThree, 'w'); function() {
fs.closeSync(fd); 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 // https://github.com/joyent/node/issues/2293 - non-persistent watcher should
// not block the event loop // 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 // whitebox test to ensure that wrapped FSEvent is safe
// https://github.com/joyent/node/issues/6690 // https://github.com/joyent/node/issues/6690
let oldhandle; {
assert.throws(function() { let oldhandle;
const w = fs.watch(__filename, common.mustNotCall()); assert.throws(function() {
oldhandle = w._handle; const w = fs.watch(__filename, common.mustNotCall());
w._handle = { close: w._handle.close }; oldhandle = w._handle;
w.close(); w._handle = { close: w._handle.close };
}, /^TypeError: Illegal invocation$/); w.close();
oldhandle.close(); // clean up }, /^TypeError: Illegal invocation$/);
oldhandle.close(); // clean up
assert.throws(function() { assert.throws(function() {
const w = fs.watchFile(__filename, { persistent: false }, const w = fs.watchFile(__filename, { persistent: false },
common.mustNotCall()); common.mustNotCall());
oldhandle = w._handle; oldhandle = w._handle;
w._handle = { stop: w._handle.stop }; w._handle = { stop: w._handle.stop };
w.stop(); w.stop();
}, /^TypeError: Illegal invocation$/); }, /^TypeError: Illegal invocation$/);
oldhandle.stop(); // clean up oldhandle.stop(); // clean up
}