mirror of https://gitee.com/openkylin/nodejs.git
105 lines
3.9 KiB
JavaScript
105 lines
3.9 KiB
JavaScript
'use strict';
|
|
const common = require('../common');
|
|
const fixtures = require('../common/fixtures');
|
|
const assert = require('assert');
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const { COPYFILE_FICLONE } = fs.constants;
|
|
const child_process = require('child_process');
|
|
const pkgName = 'foo';
|
|
const { addLibraryPath } = require('../common/shared-lib-util');
|
|
|
|
addLibraryPath(process.env);
|
|
|
|
if (process.argv[2] === 'child') {
|
|
console.log(require(pkgName).string);
|
|
} else {
|
|
const tmpdir = require('../common/tmpdir');
|
|
tmpdir.refresh();
|
|
|
|
// Copy node binary into a test $PREFIX directory.
|
|
const prefixPath = path.join(tmpdir.path, '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.copyFileSync(process.execPath, testExecPath, COPYFILE_FICLONE);
|
|
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 = fixtures.path(path.basename(__filename, '.js'));
|
|
|
|
const env = { ...process.env };
|
|
// Unset NODE_PATH.
|
|
delete env.NODE_PATH;
|
|
|
|
// Test empty global path.
|
|
const noPkgHomeDir = path.join(tmpdir.path, '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/nodejs';
|
|
const prefixLibPath = path.join(prefixPath, 'lib');
|
|
fs.mkdirSync(prefixLibPath);
|
|
const prefixLibNodePath = path.join(prefixLibPath, 'nodejs');
|
|
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');
|
|
}
|