@@ -8,7 +8,9 @@ import { join } from 'path';
88import { SinonStub , stub } from 'sinon' ;
99import { EnvironmentVars } from '../../common/environmentVars' ;
1010import { Logger } from '../../common/logging/logger' ;
11+ import { upcastPartial } from '../../common/objUtils' ;
1112import { Semver } from '../../common/semver' ;
13+ import { AnyLaunchConfiguration } from '../../configuration' ;
1214import { ErrorCodes } from '../../dap/errors' ;
1315import { ProtocolError } from '../../dap/protocolError' ;
1416import { Capability , NodeBinary , NodeBinaryProvider } from '../../targets/node/nodeBinaryProvider' ;
@@ -20,6 +22,8 @@ describe('NodeBinaryProvider', function() {
2022 this . timeout ( 30 * 1000 ) ; // windows lookups in CI seem to be very slow sometimes
2123
2224 let p : NodeBinaryProvider ;
25+ let dir : string ;
26+
2327 const env = ( name : string ) =>
2428 EnvironmentVars . empty . addToPath ( join ( testWorkspace , 'nodePathProvider' , name ) ) ;
2529 const binaryLocation = ( name : string , binary = 'node' ) =>
@@ -33,11 +37,17 @@ describe('NodeBinaryProvider', function() {
3337 let packageJson : IPackageJsonProvider ;
3438
3539 beforeEach ( ( ) => {
40+ dir = getTestDir ( ) ;
3641 packageJson = {
3742 getPath : ( ) => Promise . resolve ( undefined ) ,
3843 getContents : ( ) => Promise . resolve ( undefined ) ,
3944 } ;
40- p = new NodeBinaryProvider ( Logger . null , fsPromises , packageJson ) ;
45+ p = new NodeBinaryProvider (
46+ Logger . null ,
47+ fsPromises ,
48+ packageJson ,
49+ upcastPartial < AnyLaunchConfiguration > ( { __workspaceFolder : dir } ) ,
50+ ) ;
4151 } ) ;
4252
4353 it ( 'rejects not found' , async ( ) => {
@@ -198,8 +208,38 @@ describe('NodeBinaryProvider', function() {
198208 } ) ;
199209 } ) ;
200210
211+ it ( 'does not recurse upwards past workspace folder' , async ( ) => {
212+ const cwd = join ( dir , 'subdir' ) ;
213+ p = new NodeBinaryProvider (
214+ Logger . null ,
215+ fsPromises ,
216+ packageJson ,
217+ upcastPartial < AnyLaunchConfiguration > ( { __workspaceFolder : cwd } ) ,
218+ ) ;
219+ await fsPromises . mkdir ( cwd , { recursive : true } ) ;
220+
221+ createFileTree ( dir , {
222+ 'node_modules/.bin' : {
223+ 'node.exe' : '' ,
224+ node : '' ,
225+ } ,
226+ } ) ;
227+
228+ try {
229+ const r = await p . resolveAndValidate (
230+ EnvironmentVars . empty . update ( 'PATHEXT' , '.EXE' ) ,
231+ 'node' ,
232+ undefined ,
233+ cwd ,
234+ ) ;
235+ console . log ( r ) ;
236+ } catch ( err ) {
237+ expect ( err ) . to . be . an . instanceOf ( ProtocolError ) ;
238+ expect ( err . cause . id ) . to . equal ( ErrorCodes . CannotFindNodeBinary ) ;
239+ }
240+ } ) ;
241+
201242 it ( 'automatically finds programs in node_modules/.bin' , async ( ) => {
202- const dir = getTestDir ( ) ;
203243 createFileTree ( dir , {
204244 'node_modules/.bin' : {
205245 'mocha.cmd' : '' ,
0 commit comments