-
Notifications
You must be signed in to change notification settings - Fork 30.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Module._stat landed in #44537 without a test, so this change adds one. Signed-off-by: Darshan Sen <raisinten@gmail.com> PR-URL: #44713 Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com>
- Loading branch information
1 parent
0ae9f2e
commit 84b8725
Showing
2 changed files
with
113 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
'use strict'; | ||
require('../common'); | ||
|
||
// This tests Module._stat. | ||
|
||
const Module = require('module'); | ||
const fs = require('fs'); | ||
const tmpdir = require('../common/tmpdir'); | ||
const { ok, strictEqual } = require('assert'); | ||
const { join } = require('path'); | ||
|
||
const directory = join(tmpdir.path, 'directory'); | ||
const doesNotExist = join(tmpdir.path, 'does-not-exist'); | ||
const file = join(tmpdir.path, 'file.js'); | ||
|
||
tmpdir.refresh(); | ||
fs.writeFileSync(file, "module.exports = { a: 'b' }"); | ||
fs.mkdirSync(directory); | ||
|
||
strictEqual(Module._stat(directory), 1); // Returns 1 for directories. | ||
strictEqual(Module._stat(file), 0); // Returns 0 for files. | ||
ok(Module._stat(doesNotExist) < 0); // Returns a negative integer for any other kind of strings. | ||
|
||
// TODO(RaisinTen): Add tests that make sure that Module._stat() does not crash when called | ||
// with a non-string data type. It crashes currently. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
'use strict'; | ||
const common = require('../common'); | ||
|
||
// This tests the creation of a vfs by monkey-patching fs and Module._stat. | ||
|
||
const Module = require('module'); | ||
const fs = require('fs'); | ||
const tmpdir = require('../common/tmpdir'); | ||
const { deepStrictEqual, ok, strictEqual, throws } = require('assert'); | ||
const { join } = require('path'); | ||
|
||
const directory = join(tmpdir.path, 'directory'); | ||
const doesNotExist = join(tmpdir.path, 'does-not-exist'); | ||
const file = join(tmpdir.path, 'file.js'); | ||
|
||
tmpdir.refresh(); | ||
fs.writeFileSync(file, "module.exports = { a: 'b' }"); | ||
fs.mkdirSync(directory); | ||
|
||
strictEqual(Module._stat(directory), 1); | ||
ok(Module._stat(doesNotExist) < 0); | ||
strictEqual(Module._stat(file), 0); | ||
|
||
const vfsDirectory = join(process.execPath, 'directory'); | ||
const vfsDoesNotExist = join(process.execPath, 'does-not-exist'); | ||
const vfsFile = join(process.execPath, 'file.js'); | ||
|
||
ok(Module._stat(vfsDirectory) < 0); | ||
ok(Module._stat(vfsDoesNotExist) < 0); | ||
ok(Module._stat(vfsFile) < 0); | ||
|
||
deepStrictEqual(require(file), { a: 'b' }); | ||
throws(() => require(vfsFile), { code: 'MODULE_NOT_FOUND' }); | ||
|
||
common.expectWarning( | ||
'ExperimentalWarning', | ||
'Module._stat is an experimental feature. This feature could change at any time'); | ||
|
||
process.on('warning', common.mustCall()); | ||
|
||
const originalStat = Module._stat; | ||
Module._stat = function(filename) { | ||
if (!filename.startsWith(process.execPath)) { | ||
return originalStat(filename); | ||
} | ||
|
||
if (filename === process.execPath) { | ||
return 1; | ||
} | ||
|
||
switch (filename) { | ||
case vfsDirectory: | ||
return 1; | ||
case vfsDoesNotExist: | ||
return -2; | ||
case vfsFile: | ||
return 0; | ||
} | ||
}; | ||
|
||
const originalReadFileSync = fs.readFileSync; | ||
// TODO(aduh95): We'd like to have a better way to achieve this without monkey-patching fs. | ||
fs.readFileSync = function readFileSync(pathArgument, options) { | ||
if (!pathArgument.startsWith(process.execPath)) { | ||
return originalReadFileSync.apply(this, arguments); | ||
} | ||
if (pathArgument === vfsFile) { | ||
return "module.exports = { x: 'y' };"; | ||
} | ||
throw new Error(); | ||
}; | ||
|
||
fs.realpathSync = function realpathSync(pathArgument, options) { | ||
return pathArgument; | ||
}; | ||
|
||
strictEqual(Module._stat(directory), 1); | ||
ok(Module._stat(doesNotExist) < 0); | ||
strictEqual(Module._stat(file), 0); | ||
|
||
strictEqual(Module._stat(vfsDirectory), 1); | ||
ok(Module._stat(vfsDoesNotExist) < 0); | ||
strictEqual(Module._stat(vfsFile), 0); | ||
|
||
strictEqual(Module._stat(process.execPath), 1); | ||
|
||
deepStrictEqual(require(file), { a: 'b' }); | ||
deepStrictEqual(require(vfsFile), { x: 'y' }); |