diff --git a/test/fixtures/module-require-symlink/symlinked.js b/test/fixtures/module-require-symlink/symlinked.js index ced901b2466..8ec2f7b0aae 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 foo = require('./foo'); -const fixtures = require('../../common/fixtures'); +const path = require('path'); -const linkScriptTarget = fixtures.path('module-require-symlink', 'symlinked.js'); +const foo = require('./foo'); + +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 4dd9bf51ed9..7dde2a1a974 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'); -const assert = require('assert'); -const path = require('path'); -const fs = require('fs'); -const { exec, spawn } = require('child_process'); -const fixtures = require('../common/fixtures'); +if (!common.canCreateSymLink()) + common.skip('insufficient privileges'); + +const assert = require('assert'); +const { spawn } = require('child_process'); +const fs = require('fs'); +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'); - -const linkDir = fixtures.path('module-require-symlink', - 'node_modules', - 'dep1', - 'node_modules', - 'dep2'); - -const linkScriptTarget = fixtures.path('module-require-symlink', - 'symlinked.js'); - -const linkScript = path.join(common.tmpDir, 'module-require-symlink.js'); - -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'); - - test(); +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); + } }); -} else { - test(); } -function test() { - process.on('exit', function() { - fs.unlinkSync(linkDir); - }); +copyDir(fixtureSource, tmpDirTarget); +// 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 linkDir = path.join(dirName, + 'node_modules', + 'dep1', + 'node_modules', + 'dep2'); + +const linkTarget = path.join('..', '..', 'dep2'); + +const linkScript = 'linkscript.js'; + +const linkScriptTarget = path.join(dirName, 'symlinked.js'); + +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');