'use strict'; // This test is a bit more complicated than it ideally needs to be to work // around issues on OS X and SmartOS. // // On OS X, watch events are subject to peculiar timing oddities such that an // event might fire out of order. The synchronous refreshing of the tmp // directory might trigger an event on the watchers that are instantiated after // it! // // On SmartOS, the watch events fire but the filename is null. const common = require('../common'); // fs-watch on folders have limited capability in AIX. // The testcase makes use of folder watching, and causes // hang. This behavior is documented. Skip this for AIX. if (common.isAIX) common.skip('folder watch capability is limited in AIX.'); const fs = require('fs'); const path = require('path'); const tmpdir = require('../common/tmpdir'); tmpdir.refresh(); const fn = '新建文夹件.txt'; const a = path.join(tmpdir.path, fn); const watchers = new Set(); function registerWatcher(watcher) { watchers.add(watcher); } function unregisterWatcher(watcher) { watcher.close(); watchers.delete(watcher); if (watchers.size === 0) { clearInterval(interval); } } { // Test that using the `encoding` option has the expected result. const watcher = fs.watch( tmpdir.path, { encoding: 'hex' }, (event, filename) => { if (['e696b0e5bbbae69687e5a4b9e4bbb62e747874', null].includes(filename)) done(watcher); } ); registerWatcher(watcher); } { // Test that in absence of `encoding` option has the expected result. const watcher = fs.watch( tmpdir.path, (event, filename) => { if ([fn, null].includes(filename)) done(watcher); } ); registerWatcher(watcher); } { // Test that using the `encoding` option has the expected result. const watcher = fs.watch( tmpdir.path, { encoding: 'buffer' }, (event, filename) => { if (filename instanceof Buffer && filename.toString('utf8') === fn) done(watcher); else if (filename === null) done(watcher); } ); registerWatcher(watcher); } const done = common.mustCall(unregisterWatcher, watchers.size); // OS X and perhaps other systems can have surprising race conditions with // file events. So repeat the operation in case it is missed the first time. const interval = setInterval(() => { const fd = fs.openSync(a, 'w+'); fs.closeSync(fd); fs.unlinkSync(a); }, common.platformTimeout(100));