diff options
author | Jan Krems <jan.krems@groupon.com> | 2016-12-11 14:37:25 -0800 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-02-13 14:50:29 +0100 |
commit | fc3f0d63b4e94d90d96c914c9e1d7ee6329ea65a (patch) | |
tree | f8b83ed97b951dd5f4bb460ac1c840265a7fab8c /tools | |
parent | 8c9762e150362c9b7f4db8e5c1680f1758f0ef9f (diff) | |
download | node-new-fc3f0d63b4e94d90d96c914c9e1d7ee6329ea65a.tar.gz |
build: add node-inspect integration test
This just adds an additional make target (`make test-node-inspect`) but
will not include the new debugger in releases.
PR-URL: https://github.com/nodejs/node/pull/10187
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/test-npm-package.js | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/tools/test-npm-package.js b/tools/test-npm-package.js new file mode 100755 index 0000000000..951ec5c306 --- /dev/null +++ b/tools/test-npm-package.js @@ -0,0 +1,139 @@ +#!/usr/bin/env node +/** + * Usage: + * test-npm-package.js [--install] [--rebuild] <source> <test-arg>+ + * + * Everything after the <source> directory gets passed to `npm run` to build + * the test command. + * + * If `--install` is passed, we'll run a full `npm install` before running the + * test suite. Same for `--rebuild` and `npm rebuild`. + * + * We always use the node used to spawn this script and the `npm` version + * bundled in `deps/npm`. + * + * If an additional `--logfile=<filename>` option is passed before `<source>`, + * the stdout output of the test script will be written to that file. + */ +'use strict'; +const { spawn, spawnSync } = require('child_process'); +const { createHash } = require('crypto'); +const { createWriteStream, mkdirSync, rmdirSync } = require('fs'); +const path = require('path'); + +const common = require('../test/common'); + +const projectDir = path.resolve(__dirname, '..'); +const npmBin = path.join(projectDir, 'deps', 'npm', 'cli.js'); +const nodePath = path.dirname(process.execPath); + +function spawnCopyDeepSync(source, destination) { + if (common.isWindows) { + mkdirSync(destination); // prevent interactive prompt + return spawnSync('xcopy.exe', ['/E', source, destination]); + } else { + return spawnSync('cp', ['-r', `${source}/`, destination]); + } +} + +function runNPMPackageTests({ srcDir, install, rebuild, testArgs, logfile }) { + // Make sure we don't conflict with concurrent test runs + const srcHash = createHash('md5').update(srcDir).digest('hex'); + common.tmpDir = common.tmpDir + '.npm.' + srcHash; + common.refreshTmpDir(); + + const tmpDir = common.tmpDir; + const npmCache = path.join(tmpDir, 'npm-cache'); + const npmPrefix = path.join(tmpDir, 'npm-prefix'); + const npmTmp = path.join(tmpDir, 'npm-tmp'); + const npmUserconfig = path.join(tmpDir, 'npm-userconfig'); + const pkgDir = path.join(tmpDir, 'pkg'); + + spawnCopyDeepSync(srcDir, pkgDir); + + const npmOptions = { + cwd: pkgDir, + env: Object.assign({}, process.env, { + 'npm_config_cache': npmCache, + 'npm_config_prefix': npmPrefix, + 'npm_config_tmp': npmTmp, + 'npm_config_userconfig': npmUserconfig, + }), + stdio: 'inherit', + }; + + if (common.isWindows) { + npmOptions.env.home = tmpDir; + npmOptions.env.Path = `${nodePath};${process.env.Path}`; + } else { + npmOptions.env.HOME = tmpDir; + npmOptions.env.PATH = `${nodePath}:${process.env.PATH}`; + } + + if (rebuild) { + spawnSync(process.execPath, [ + npmBin, + 'rebuild', + ], npmOptions); + } + + if (install) { + spawnSync(process.execPath, [ + npmBin, + 'install', + '--ignore-scripts', + ], npmOptions); + } + + const testChild = spawn(process.execPath, [ + npmBin, + '--silent', + 'run', + ...testArgs, + ], Object.assign({}, npmOptions, { stdio: 'pipe' })); + + testChild.stdout.pipe(process.stdout); + testChild.stderr.pipe(process.stderr); + + if (logfile) { + const logStream = createWriteStream(logfile); + testChild.stdout.pipe(logStream); + } + + testChild.on('exit', () => { + common.refreshTmpDir(); + rmdirSync(tmpDir); + }); +} + +function parseArgs(args) { + let srcDir; + let rebuild = false; + let install = false; + let logfile = null; + const testArgs = []; + args.forEach((arg) => { + if (srcDir) { + testArgs.push(arg); + return; + } + + if (arg === '--install') { + install = true; + } else if (arg === '--rebuild') { + rebuild = true; + } else if (arg[0] !== '-') { + srcDir = path.resolve(projectDir, arg); + } else if (arg.startsWith('--logfile=')) { + logfile = path.resolve(projectDir, arg.slice('--logfile='.length)); + } else { + throw new Error(`Unrecognized option ${arg}`); + } + }); + if (!srcDir) { + throw new Error('Expected a source directory'); + } + return { srcDir, install, rebuild, testArgs, logfile }; +} + +runNPMPackageTests(parseArgs(process.argv.slice(2))); |