diff --git a/test/fixtures/module-require-symlink/symlinked.js b/test/fixtures/module-require-symlink/symlinked.js index ced901b2466ac5..8ec2f7b0aaeb99 100644 --- a/test/fixtures/module-require-symlink/symlinked.js +++ b/test/fixtures/module-require-symlink/symlinked.js @@ -1,11 +1,12 @@ 'use strict'; const assert = require('assert'); +const path = require('path'); + const foo = require('./foo'); -const fixtures = require('../../common/fixtures'); -const linkScriptTarget = fixtures.path('module-require-symlink', 'symlinked.js'); +const linkScriptEnding = path.join('module-require-symlink', 'symlinked.js'); assert.strictEqual(foo.dep1.bar.version, 'CORRECT_VERSION'); assert.strictEqual(foo.dep2.bar.version, 'CORRECT_VERSION'); -assert.strictEqual(__filename, linkScriptTarget); +assert(__filename.endsWith(linkScriptEnding)); assert(__filename in require.cache); diff --git a/test/parallel/test-require-symlink.js b/test/parallel/test-require-symlink.js index 4dd9bf51ed9213..7dde2a1a974087 100644 --- a/test/parallel/test-require-symlink.js +++ b/test/parallel/test-require-symlink.js @@ -1,52 +1,66 @@ // Flags: --preserve-symlinks 'use strict'; const common = require('../common'); + +if (!common.canCreateSymLink()) + common.skip('insufficient privileges'); + const assert = require('assert'); -const path = require('path'); +const { spawn } = require('child_process'); const fs = require('fs'); -const { exec, spawn } = require('child_process'); +const path = require('path'); +const process = require('process'); + +// Setup: Copy fixtures to tmp directory. + const fixtures = require('../common/fixtures'); +const dirName = 'module-require-symlink'; +const fixtureSource = fixtures.path(dirName); +const tmpDirTarget = path.join(common.tmpDir, dirName); +// Copy fixtureSource to linkTarget recursively. common.refreshTmpDir(); -const linkTarget = fixtures.path('module-require-symlink', - 'node_modules', - 'dep2'); +function copyDir(source, target) { + fs.mkdirSync(target); + fs.readdirSync(source).forEach((entry) => { + const fullPathSource = path.join(source, entry); + const fullPathTarget = path.join(target, entry); + const stats = fs.statSync(fullPathSource); + if (stats.isDirectory()) { + copyDir(fullPathSource, fullPathTarget); + } else { + fs.copyFileSync(fullPathSource, fullPathTarget); + } + }); +} + +copyDir(fixtureSource, tmpDirTarget); -const linkDir = fixtures.path('module-require-symlink', - 'node_modules', - 'dep1', - 'node_modules', - 'dep2'); +// Move to tmp dir and do everything with relative paths there so that the test +// doesn't incorrectly fail due to a symlink somewhere else in the absolte path. +process.chdir(common.tmpDir); -const linkScriptTarget = fixtures.path('module-require-symlink', - 'symlinked.js'); +const linkDir = path.join(dirName, + 'node_modules', + 'dep1', + 'node_modules', + 'dep2'); -const linkScript = path.join(common.tmpDir, 'module-require-symlink.js'); +const linkTarget = path.join('..', '..', 'dep2'); -if (common.isWindows) { - // On Windows, creating symlinks requires admin privileges. - // We'll only try to run symlink test if we have enough privileges. - exec('whoami /priv', function(err, o) { - if (err || !o.includes('SeCreateSymbolicLinkPrivilege')) - common.skip('insufficient privileges'); +const linkScript = 'linkscript.js'; - test(); - }); -} else { - test(); -} +const linkScriptTarget = path.join(dirName, 'symlinked.js'); -function test() { - process.on('exit', function() { - fs.unlinkSync(linkDir); - }); +test(); +function test() { fs.symlinkSync(linkTarget, linkDir); fs.symlinkSync(linkScriptTarget, linkScript); // load symlinked-module - const fooModule = require(fixtures.path('/module-require-symlink/foo.js')); + const fooModule = require(path.join(tmpDirTarget, 'foo.js')); assert.strictEqual(fooModule.dep1.bar.version, 'CORRECT_VERSION'); assert.strictEqual(fooModule.dep2.bar.version, 'CORRECT_VERSION');