mirror of https://gitee.com/openkylin/nodejs.git
72 lines
2.8 KiB
JavaScript
72 lines
2.8 KiB
JavaScript
'use strict';
|
|
|
|
// Flags: --expose-internals
|
|
|
|
const common = require('../common');
|
|
|
|
const assert = require('assert');
|
|
const { BigIntStats } = require('internal/fs/utils');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const tmpdir = require('../common/tmpdir');
|
|
|
|
const enoentFile = path.join(tmpdir.path, 'non-existent-file');
|
|
const expectedStatObject = new BigIntStats(
|
|
0n, // dev
|
|
0n, // mode
|
|
0n, // nlink
|
|
0n, // uid
|
|
0n, // gid
|
|
0n, // rdev
|
|
0n, // blksize
|
|
0n, // ino
|
|
0n, // size
|
|
0n, // blocks
|
|
0n, // atimeMs
|
|
0n, // mtimeMs
|
|
0n, // ctimeMs
|
|
0n, // birthtimeMs
|
|
0n, // atimeNs
|
|
0n, // mtimeNs
|
|
0n, // ctimeNs
|
|
0n // birthtimeNs
|
|
);
|
|
|
|
tmpdir.refresh();
|
|
|
|
// If the file initially didn't exist, and gets created at a later point of
|
|
// time, the callback should be invoked again with proper values in stat object
|
|
let fileExists = false;
|
|
const options = { interval: 0, bigint: true };
|
|
|
|
const watcher =
|
|
fs.watchFile(enoentFile, options, common.mustCall((curr, prev) => {
|
|
if (!fileExists) {
|
|
// If the file does not exist, all the fields should be zero and the date
|
|
// fields should be UNIX EPOCH time
|
|
assert.deepStrictEqual(curr, expectedStatObject);
|
|
assert.deepStrictEqual(prev, expectedStatObject);
|
|
// Create the file now, so that the callback will be called back once the
|
|
// event loop notices it.
|
|
fs.closeSync(fs.openSync(enoentFile, 'w'));
|
|
fileExists = true;
|
|
} else {
|
|
// If the ino (inode) value is greater than zero, it means that the file
|
|
// is present in the filesystem and it has a valid inode number.
|
|
assert(curr.ino > 0n);
|
|
// As the file just got created, previous ino value should be lesser than
|
|
// or equal to zero (non-existent file).
|
|
assert(prev.ino <= 0n);
|
|
// Stop watching the file
|
|
fs.unwatchFile(enoentFile);
|
|
watcher.stop(); // Stopping a stopped watcher should be a noop
|
|
}
|
|
}, 2));
|
|
|
|
// 'stop' should only be emitted once - stopping a stopped watcher should
|
|
// not trigger a 'stop' event.
|
|
watcher.on('stop', common.mustCall(function onStop() {}));
|
|
|
|
watcher.start(); // Starting a started watcher should be a noop
|