-
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.
test: add test for loading from global folders
Test executes with a copy of the node executable since $PREFIX/lib/node is relative to the executable location. PR-URL: #9283 Reviewed-By: Sam Roberts <vieuxtech@gmail.com> Reviewed-By: Gibson Fahnestock <gibfahn@gmail.com> Reviewed-By: João Reis <reis@janeasystems.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
- Loading branch information
1 parent
c01c7a4
commit aaf8536
Showing
8 changed files
with
109 additions
and
0 deletions.
There are no files selected for viewing
1 change: 1 addition & 0 deletions
1
test/fixtures/test-module-loading-globalpaths/home-pkg-in-both/.node_libraries/foo.js
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 @@ | ||
exports.string = '$HOME/.node_libraries'; |
1 change: 1 addition & 0 deletions
1
test/fixtures/test-module-loading-globalpaths/home-pkg-in-both/.node_modules/foo.js
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
1 change: 1 addition & 0 deletions
1
...ixtures/test-module-loading-globalpaths/home-pkg-in-node_libraries/.node_libraries/foo.js
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 @@ | ||
exports.string = '$HOME/.node_libraries'; |
1 change: 1 addition & 0 deletions
1
test/fixtures/test-module-loading-globalpaths/home-pkg-in-node_modules/.node_modules/foo.js
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
1 change: 1 addition & 0 deletions
1
test/fixtures/test-module-loading-globalpaths/local-pkg/node_modules/foo.js
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
2 changes: 2 additions & 0 deletions
2
test/fixtures/test-module-loading-globalpaths/local-pkg/test.js
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,2 @@ | ||
'use strict'; | ||
console.log(require('foo').string); |
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 @@ | ||
exports.string = '$NODE_PATH'; |
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,101 @@ | ||
'use strict'; | ||
const common = require('../common'); | ||
const assert = require('assert'); | ||
const path = require('path'); | ||
const fs = require('fs'); | ||
const child_process = require('child_process'); | ||
const pkgName = 'foo'; | ||
|
||
if (process.argv[2] === 'child') { | ||
console.log(require(pkgName).string); | ||
} else { | ||
common.refreshTmpDir(); | ||
|
||
// Copy node binary into a test $PREFIX directory. | ||
const prefixPath = path.join(common.tmpDir, 'install'); | ||
fs.mkdirSync(prefixPath); | ||
let testExecPath; | ||
if (common.isWindows) { | ||
testExecPath = path.join(prefixPath, path.basename(process.execPath)); | ||
} else { | ||
const prefixBinPath = path.join(prefixPath, 'bin'); | ||
fs.mkdirSync(prefixBinPath); | ||
testExecPath = path.join(prefixBinPath, path.basename(process.execPath)); | ||
} | ||
const mode = fs.statSync(process.execPath).mode; | ||
fs.writeFileSync(testExecPath, fs.readFileSync(process.execPath)); | ||
fs.chmodSync(testExecPath, mode); | ||
|
||
const runTest = (expectedString, env) => { | ||
const child = child_process.execFileSync(testExecPath, | ||
[ __filename, 'child' ], | ||
{ encoding: 'utf8', env: env }); | ||
assert.strictEqual(child.trim(), expectedString); | ||
}; | ||
|
||
const testFixturesDir = path.join(common.fixturesDir, | ||
path.basename(__filename, '.js')); | ||
|
||
const env = Object.assign({}, process.env); | ||
// Turn on module debug to aid diagnosing failures. | ||
env['NODE_DEBUG'] = 'module'; | ||
// Unset NODE_PATH. | ||
delete env['NODE_PATH']; | ||
|
||
// Test empty global path. | ||
const noPkgHomeDir = path.join(common.tmpDir, 'home-no-pkg'); | ||
fs.mkdirSync(noPkgHomeDir); | ||
env['HOME'] = env['USERPROFILE'] = noPkgHomeDir; | ||
assert.throws( | ||
() => { | ||
child_process.execFileSync(testExecPath, [ __filename, 'child' ], | ||
{ encoding: 'utf8', env: env }); | ||
}, | ||
new RegExp('Cannot find module \'' + pkgName + '\'')); | ||
|
||
// Test module in $HOME/.node_modules. | ||
const modHomeDir = path.join(testFixturesDir, 'home-pkg-in-node_modules'); | ||
env['HOME'] = env['USERPROFILE'] = modHomeDir; | ||
runTest('$HOME/.node_modules', env); | ||
|
||
// Test module in $HOME/.node_libraries. | ||
const libHomeDir = path.join(testFixturesDir, 'home-pkg-in-node_libraries'); | ||
env['HOME'] = env['USERPROFILE'] = libHomeDir; | ||
runTest('$HOME/.node_libraries', env); | ||
|
||
// Test module both $HOME/.node_modules and $HOME/.node_libraries. | ||
const bothHomeDir = path.join(testFixturesDir, 'home-pkg-in-both'); | ||
env['HOME'] = env['USERPROFILE'] = bothHomeDir; | ||
runTest('$HOME/.node_modules', env); | ||
|
||
// Test module in $PREFIX/lib/node. | ||
// Write module into $PREFIX/lib/node. | ||
const expectedString = '$PREFIX/lib/node'; | ||
const prefixLibPath = path.join(prefixPath, 'lib'); | ||
fs.mkdirSync(prefixLibPath); | ||
const prefixLibNodePath = path.join(prefixLibPath, 'node'); | ||
fs.mkdirSync(prefixLibNodePath); | ||
const pkgPath = path.join(prefixLibNodePath, pkgName + '.js'); | ||
fs.writeFileSync(pkgPath, 'exports.string = \'' + expectedString + '\';'); | ||
|
||
env['HOME'] = env['USERPROFILE'] = noPkgHomeDir; | ||
runTest(expectedString, env); | ||
|
||
// Test module in all global folders. | ||
env['HOME'] = env['USERPROFILE'] = bothHomeDir; | ||
runTest('$HOME/.node_modules', env); | ||
|
||
// Test module in NODE_PATH is loaded ahead of global folders. | ||
env['HOME'] = env['USERPROFILE'] = bothHomeDir; | ||
env['NODE_PATH'] = path.join(testFixturesDir, 'node_path'); | ||
runTest('$NODE_PATH', env); | ||
|
||
// Test module in local folder is loaded ahead of global folders. | ||
const localDir = path.join(testFixturesDir, 'local-pkg'); | ||
env['HOME'] = env['USERPROFILE'] = bothHomeDir; | ||
env['NODE_PATH'] = path.join(testFixturesDir, 'node_path'); | ||
const child = child_process.execFileSync(testExecPath, | ||
[ path.join(localDir, 'test.js') ], | ||
{ encoding: 'utf8', env: env }); | ||
assert.strictEqual(child.trim(), 'local'); | ||
} |