summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorJan Krems <jan.krems@groupon.com>2016-12-11 14:37:25 -0800
committerAnna Henningsen <anna@addaleax.net>2017-02-13 14:50:29 +0100
commitfc3f0d63b4e94d90d96c914c9e1d7ee6329ea65a (patch)
treef8b83ed97b951dd5f4bb460ac1c840265a7fab8c /tools
parent8c9762e150362c9b7f4db8e5c1680f1758f0ef9f (diff)
downloadnode-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-xtools/test-npm-package.js139
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)));