'use strict'; const common = require('../common'); const { watch, writeFileSync } = require('node:fs'); const { join } = require('node:path'); const tmpdir = require('../common/tmpdir.js'); const assert = require('assert'); if (common.isIBMi) common.skip('IBMi does not support `fs.watch()`'); // 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.'); tmpdir.refresh(); const tmpDir = tmpdir.path; const filename = join(tmpDir, 'test.file'); const keepalive = setTimeout(() => { throw new Error('timed out'); }, common.platformTimeout(30_000)); function doWatch() { const watcher = watch(tmpDir, { recursive: true }, common.mustCall((eventType, _filename) => { clearTimeout(keepalive); watcher.close(); assert.strictEqual(eventType, 'rename'); assert.strictEqual(join(tmpDir, _filename), filename); })); // Do the write with a delay to ensure that the OS is ready to notify us. setTimeout(() => { writeFileSync(filename, 'foobar2'); }, common.platformTimeout(200)); } if (common.isMacOS) { // On macOS delay watcher start to avoid leaking previous events. // Refs: https://github.com/libuv/libuv/pull/4503 setTimeout(doWatch, common.platformTimeout(100)); } else { doWatch(); }