test: decrease duration of test-cli-syntax

Previously, test/parallel/test-cli-syntax.js was spawning a lot of child
processes, but using spawnSync, which made the test run each child
process serially. This switches most of the test cases to use exec so
that they are asynchronous. Locally, the test went from > 5 seconds to
under 2 seconds.

PR-URL: https://github.com/nodejs/node/pull/14187
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Refael Ackermann <refack@gmail.com>
This commit is contained in:
Evan Lucas 2017-07-12 06:45:29 -05:00 committed by Michael Dawson
parent ac41db4af0
commit a74ddff1d9

View File

@ -2,7 +2,7 @@
const common = require('../common');
const assert = require('assert');
const spawnSync = require('child_process').spawnSync;
const {exec, spawnSync} = require('child_process');
const path = require('path');
const node = process.execPath;
@ -29,12 +29,13 @@ const notFoundRE = /^Error: Cannot find module/m;
// loop each possible option, `-c` or `--check`
syntaxArgs.forEach(function(args) {
const _args = args.concat(file);
const c = spawnSync(node, _args, {encoding: 'utf8'});
// no output should be produced
assert.strictEqual(c.stdout, '', 'stdout produced');
assert.strictEqual(c.stderr, '', 'stderr produced');
assert.strictEqual(c.status, 0, `code === ${c.status}`);
const cmd = [node, ..._args].join(' ');
exec(cmd, common.mustCall((err, stdout, stderr) => {
assert.ifError(err);
assert.strictEqual(stdout, '', 'stdout produced');
assert.strictEqual(stderr, '', 'stderr produced');
}));
});
});
@ -50,18 +51,20 @@ const notFoundRE = /^Error: Cannot find module/m;
// loop each possible option, `-c` or `--check`
syntaxArgs.forEach(function(args) {
const _args = args.concat(file);
const c = spawnSync(node, _args, {encoding: 'utf8'});
const cmd = [node, ..._args].join(' ');
exec(cmd, common.mustCall((err, stdout, stderr) => {
assert.strictEqual(err instanceof Error, true);
assert.strictEqual(err.code, 1, `code === ${err.code}`);
// no stdout should be produced
assert.strictEqual(c.stdout, '', 'stdout produced');
// no stdout should be produced
assert.strictEqual(stdout, '', 'stdout produced');
// stderr should include the filename
assert(c.stderr.startsWith(file), "stderr doesn't start with the filename");
// stderr should have a syntax error message
assert(syntaxErrorRE.test(stderr), 'stderr incorrect');
// stderr should have a syntax error message
assert(syntaxErrorRE.test(c.stderr), 'stderr incorrect');
assert.strictEqual(c.status, 1, `code === ${c.status}`);
// stderr should include the filename
assert(stderr.startsWith(file), "stderr doesn't start with the filename");
}));
});
});
@ -75,15 +78,16 @@ const notFoundRE = /^Error: Cannot find module/m;
// loop each possible option, `-c` or `--check`
syntaxArgs.forEach(function(args) {
const _args = args.concat(file);
const c = spawnSync(node, _args, {encoding: 'utf8'});
const cmd = [node, ..._args].join(' ');
exec(cmd, common.mustCall((err, stdout, stderr) => {
// no stdout should be produced
assert.strictEqual(stdout, '', 'stdout produced');
// no stdout should be produced
assert.strictEqual(c.stdout, '', 'stdout produced');
// stderr should have a module not found error message
assert(notFoundRE.test(stderr), 'stderr incorrect');
// stderr should have a module not found error message
assert(notFoundRE.test(c.stderr), 'stderr incorrect');
assert.strictEqual(c.status, 1, `code === ${c.status}`);
assert.strictEqual(err.code, 1, `code === ${err.code}`);
}));
});
});
@ -122,14 +126,15 @@ syntaxArgs.forEach(function(args) {
['-c', '--check'].forEach(function(checkFlag) {
['-e', '--eval'].forEach(function(evalFlag) {
const args = [checkFlag, evalFlag, 'foo'];
const c = spawnSync(node, args, {encoding: 'utf8'});
assert(
c.stderr.startsWith(
`${node}: either --check or --eval can be used, not both`
)
);
assert.strictEqual(c.status, 9, `code === ${c.status}`);
const cmd = [node, ...args].join(' ');
exec(cmd, common.mustCall((err, stdout, stderr) => {
assert.strictEqual(err instanceof Error, true);
assert.strictEqual(err.code, 9, `code === ${err.code}`);
assert(
stderr.startsWith(
`${node}: either --check or --eval can be used, not both`
)
);
}));
});
});