From 483d245298a2fe330a2c7579f9a58d6ecad8214f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Nie=C3=9Fen?= Date: Fri, 30 Jun 2017 20:46:11 +0200 Subject: [PATCH 1/2] child_process: use internal/errors --- lib/internal/child_process.js | 27 ++++++++------ .../test-child-process-constructor.js | 36 ++++++++++++++----- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/lib/internal/child_process.js b/lib/internal/child_process.js index 9bbc5ff70f5c38..c3a88fc725bb67 100644 --- a/lib/internal/child_process.js +++ b/lib/internal/child_process.js @@ -256,8 +256,10 @@ ChildProcess.prototype.spawn = function(options) { var ipcFd; var i; - if (options === null || typeof options !== 'object') - throw new TypeError('"options" must be an object'); + if (options === null || typeof options !== 'object') { + throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'object', + options); + } // If no `stdio` option was given - use default var stdio = options.stdio || 'pipe'; @@ -272,23 +274,27 @@ ChildProcess.prototype.spawn = function(options) { // Let child process know about opened IPC channel if (options.envPairs === undefined) options.envPairs = []; - else if (!Array.isArray(options.envPairs)) - throw new TypeError('"envPairs" must be an array'); + else if (!Array.isArray(options.envPairs)) { + throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options.envPairs', + 'array', options.envPairs); + } options.envPairs.push('NODE_CHANNEL_FD=' + ipcFd); } - if (typeof options.file === 'string') - this.spawnfile = options.file; - else - throw new TypeError('"file" must be a string'); + if (typeof options.file !== 'string') { + throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options.file', 'string', + options.file); + } + this.spawnfile = options.file; if (Array.isArray(options.args)) this.spawnargs = options.args; else if (options.args === undefined) this.spawnargs = []; else - throw new TypeError('"args" must be an array'); + throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options.args', 'array', + options.args); var err = this._handle.spawn(options); @@ -545,7 +551,8 @@ function setupChannel(target, channel) { options = undefined; } else if (options !== undefined && (options === null || typeof options !== 'object')) { - throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'Object'); + throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'Object', + options); } options = Object.assign({swallowErrors: false}, options); diff --git a/test/parallel/test-child-process-constructor.js b/test/parallel/test-child-process-constructor.js index 54052d9f7140dd..ea81f806060cb6 100644 --- a/test/parallel/test-child-process-constructor.js +++ b/test/parallel/test-child-process-constructor.js @@ -5,51 +5,71 @@ const assert = require('assert'); const { ChildProcess } = require('child_process'); assert.strictEqual(typeof ChildProcess, 'function'); +function typeName(value) { + return value === null ? 'null' : typeof value; +} + { // Verify that invalid options to spawn() throw. const child = new ChildProcess(); - const re = /^TypeError: "options" must be an object$/; [undefined, null, 'foo', 0, 1, NaN, true, false].forEach((options) => { assert.throws(() => { child.spawn(options); - }, re); + }, common.expectsError({ + code: 'ERR_INVALID_ARG_TYPE', + type: TypeError, + message: 'The "options" argument must be of type object. Received type ' + + typeName(options) + })); }); } { // Verify that spawn throws if file is not a string. const child = new ChildProcess(); - const re = /^TypeError: "file" must be a string$/; [undefined, null, 0, 1, NaN, true, false, {}].forEach((file) => { assert.throws(() => { child.spawn({ file }); - }, re); + }, common.expectsError({ + code: 'ERR_INVALID_ARG_TYPE', + type: TypeError, + message: 'The "options.file" property must be of type string. Received ' + + 'type ' + typeName(file) + })); }); } { // Verify that spawn throws if envPairs is not an array or undefined. const child = new ChildProcess(); - const re = /^TypeError: "envPairs" must be an array$/; [null, 0, 1, NaN, true, false, {}, 'foo'].forEach((envPairs) => { assert.throws(() => { child.spawn({ envPairs, stdio: ['ignore', 'ignore', 'ignore', 'ipc'] }); - }, re); + }, common.expectsError({ + code: 'ERR_INVALID_ARG_TYPE', + type: TypeError, + message: 'The "options.envPairs" property must be of type array. ' + + 'Received type ' + typeName(envPairs) + })); }); } { // Verify that spawn throws if args is not an array or undefined. const child = new ChildProcess(); - const re = /^TypeError: "args" must be an array$/; [null, 0, 1, NaN, true, false, {}, 'foo'].forEach((args) => { assert.throws(() => { child.spawn({ file: 'foo', args }); - }, re); + }, common.expectsError({ + code: 'ERR_INVALID_ARG_TYPE', + type: TypeError, + message: 'The "options.args" property must be of type array. Received ' + + 'type ' + typeName(args) + })); }); } From 81f13fb8672115fe961bbacda30d38231fec0e77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Nie=C3=9Fen?= Date: Sun, 2 Jul 2017 14:24:52 +0200 Subject: [PATCH 2/2] Fix capitalization --- lib/internal/child_process.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/internal/child_process.js b/lib/internal/child_process.js index c3a88fc725bb67..795091f1bb0758 100644 --- a/lib/internal/child_process.js +++ b/lib/internal/child_process.js @@ -551,7 +551,7 @@ function setupChannel(target, channel) { options = undefined; } else if (options !== undefined && (options === null || typeof options !== 'object')) { - throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'Object', + throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'options', 'object', options); }