diff options
author | hefangshi <hefangshi@gmail.com> | 2016-05-10 16:16:49 +0800 |
---|---|---|
committer | Evan Lucas <evanlucas@me.com> | 2016-08-09 05:46:40 -0500 |
commit | 55852e14212f81b3849508e7e8862b3077316a99 (patch) | |
tree | 2526a983c4ca4d9236575ed2e7b3c8750f2d88cb /test/parallel/test-module-nodemodulepaths.js | |
parent | 5111e789e62174a72cdbe6963ed5c6e9210a7049 (diff) | |
download | android-node-v8-55852e14212f81b3849508e7e8862b3077316a99.tar.gz android-node-v8-55852e14212f81b3849508e7e8862b3077316a99.tar.bz2 android-node-v8-55852e14212f81b3849508e7e8862b3077316a99.zip |
module: fix node_modules search path in edge case
The `p < nmLen` condition will fail when a module's name is end with
`node_modules` like `foo_node_modules`. The old logic will miss the
`foo_node_modules/node_modules` in node_modules paths.
TL;TR, a module named like `foo_node_modules` can't require any module
in the node_modules folder.
Fixes: https://github.com/nodejs/node/issues/6679
PR-URL: https://github.com/nodejs/node/pull/6670
Reviewed-By: Evan Lucas <evanlucas@me.com>
Diffstat (limited to 'test/parallel/test-module-nodemodulepaths.js')
-rw-r--r-- | test/parallel/test-module-nodemodulepaths.js | 117 |
1 files changed, 101 insertions, 16 deletions
diff --git a/test/parallel/test-module-nodemodulepaths.js b/test/parallel/test-module-nodemodulepaths.js index 0c70de9f28..02ea79b49e 100644 --- a/test/parallel/test-module-nodemodulepaths.js +++ b/test/parallel/test-module-nodemodulepaths.js @@ -1,20 +1,105 @@ 'use strict'; -var common = require('../common'); -var assert = require('assert'); -var module = require('module'); +const common = require('../common'); +const assert = require('assert'); +const _module = require('module'); -var file, delimiter, paths; +const cases = { + 'WIN': [{ + file: 'C:\\Users\\hefangshi\\AppData\\Roaming\ +\\npm\\node_modules\\npm\\node_modules\\minimatch', + expect: [ + 'C:\\Users\\hefangshi\\AppData\\Roaming\ +\\npm\\node_modules\\npm\\node_modules\\minimatch\\node_modules', + 'C:\\Users\\hefangshi\\AppData\\Roaming\ +\\npm\\node_modules\\npm\\node_modules', + 'C:\\Users\\hefangshi\\AppData\\Roaming\\npm\\node_modules', + 'C:\\Users\\hefangshi\\AppData\\Roaming\\node_modules', + 'C:\\Users\\hefangshi\\AppData\\node_modules', + 'C:\\Users\\hefangshi\\node_modules', + 'C:\\Users\\node_modules', + 'C:\\node_modules' + ] + }, { + file: 'C:\\Users\\Rocko Artischocko\\node_stuff\\foo', + expect: [ + 'C:\\Users\\Rocko Artischocko\\node_stuff\\foo\\node_modules', + 'C:\\Users\\Rocko Artischocko\\node_stuff\\node_modules', + 'C:\\Users\\Rocko Artischocko\\node_modules', + 'C:\\Users\\node_modules', + 'C:\\node_modules' + ] + }, { + file: 'C:\\Users\\Rocko Artischocko\\node_stuff\\foo_node_modules', + expect: [ + 'C:\\Users\\Rocko \ +Artischocko\\node_stuff\\foo_node_modules\\node_modules', + 'C:\\Users\\Rocko Artischocko\\node_stuff\\node_modules', + 'C:\\Users\\Rocko Artischocko\\node_modules', + 'C:\\Users\\node_modules', + 'C:\\node_modules' + ] + }, { + file: 'C:\\node_modules', + expect: [ + 'C:\\node_modules' + ] + }, { + file: 'C:\\', + expect: [ + 'C:\\node_modules' + ] + }], + 'POSIX': [{ + file: '/usr/lib/node_modules/npm/node_modules/\ +node-gyp/node_modules/glob/node_modules/minimatch', + expect: [ + '/usr/lib/node_modules/npm/node_modules/\ +node-gyp/node_modules/glob/node_modules/minimatch/node_modules', + '/usr/lib/node_modules/npm/node_modules/\ +node-gyp/node_modules/glob/node_modules', + '/usr/lib/node_modules/npm/node_modules/node-gyp/node_modules', + '/usr/lib/node_modules/npm/node_modules', + '/usr/lib/node_modules', + '/usr/node_modules', + '/node_modules' + ] + }, { + file: '/usr/test/lib/node_modules/npm/foo', + expect: [ + '/usr/test/lib/node_modules/npm/foo/node_modules', + '/usr/test/lib/node_modules/npm/node_modules', + '/usr/test/lib/node_modules', + '/usr/test/node_modules', + '/usr/node_modules', + '/node_modules' + ] + }, { + file: '/usr/test/lib/node_modules/npm/foo_node_modules', + expect: [ + '/usr/test/lib/node_modules/npm/foo_node_modules/node_modules', + '/usr/test/lib/node_modules/npm/node_modules', + '/usr/test/lib/node_modules', + '/usr/test/node_modules', + '/usr/node_modules', + '/node_modules' + ] + }, { + file: '/node_modules', + expect: [ + '/node_modules' + ] + }, { + file: '/', + expect: [ + '/node_modules' + ] + }] +}; -if (common.isWindows) { - file = 'C:\\Users\\Rocko Artischocko\\node_stuff\\foo'; - delimiter = '\\'; -} else { - file = '/usr/test/lib/node_modules/npm/foo'; - delimiter = '/'; -} - -paths = module._nodeModulePaths(file); - -assert.ok(paths.indexOf(file + delimiter + 'node_modules') !== -1); -assert.ok(Array.isArray(paths)); +const platformCases = common.isWindows ? cases.WIN : cases.POSIX; +platformCases.forEach((c) => { + const paths = _module._nodeModulePaths(c.file); + assert.deepStrictEqual(c.expect, paths, 'case ' + c.file + + ' failed, actual paths is ' + JSON.stringify(paths)); +}); |