From 41284fbc5bc0d25d6fb2710e0fd6b3c475dd87ee Mon Sep 17 00:00:00 2001 From: cjihrig Date: Fri, 27 Jan 2017 15:04:25 -0500 Subject: [PATCH] test: cover thrown errors from exec() kill This commit adds code coverage for the scenario where exec() kills a child process, but the call to ChildProcess#kill() throws an exception. PR-URL: https://github.com/nodejs/node/pull/11038 Reviewed-By: Sam Roberts Reviewed-By: James M Snell Reviewed-By: Franziska Hinkelmann --- .../test-child-process-exec-kill-throws.js | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 test/parallel/test-child-process-exec-kill-throws.js diff --git a/test/parallel/test-child-process-exec-kill-throws.js b/test/parallel/test-child-process-exec-kill-throws.js new file mode 100644 index 00000000000000..d9473222a4551a --- /dev/null +++ b/test/parallel/test-child-process-exec-kill-throws.js @@ -0,0 +1,29 @@ +'use strict'; +// Flags: --expose_internals +const common = require('../common'); +const assert = require('assert'); +const cp = require('child_process'); +const internalCp = require('internal/child_process'); + +if (process.argv[2] === 'child') { + // Keep the process alive and printing to stdout. + setInterval(() => { console.log('foo'); }, 1); +} else { + // Monkey patch ChildProcess#kill() to kill the process and then throw. + const kill = internalCp.ChildProcess.prototype.kill; + + internalCp.ChildProcess.prototype.kill = function() { + kill.apply(this, arguments); + throw new Error('mock error'); + }; + + const cmd = `${process.execPath} ${__filename} child`; + const options = { maxBuffer: 0 }; + const child = cp.exec(cmd, options, common.mustCall((err, stdout, stderr) => { + // Verify that if ChildProcess#kill() throws, the error is reported. + assert(/^Error: mock error$/.test(err)); + assert.strictEqual(stdout, ''); + assert.strictEqual(stderr, ''); + assert.strictEqual(child.killed, true); + })); +}