child_process: support stdio option in fork() · nodejs/node@ff3ce11
1+'use strict';
2+const common = require('../common');
3+const assert = require('assert');
4+const cp = require('child_process');
5+const net = require('net');
6+7+if (process.argv[2] === 'child') {
8+process.stdout.write('this should be ignored');
9+process.stderr.write('this should not be ignored');
10+11+const pipe = new net.Socket({ fd: 4 });
12+13+process.on('disconnect', () => {
14+pipe.unref();
15+});
16+17+pipe.setEncoding('utf8');
18+pipe.on('data', (data) => {
19+process.send(data);
20+});
21+} else {
22+assert.throws(() => {
23+cp.fork(__filename, {stdio: ['pipe', 'pipe', 'pipe', 'pipe']});
24+}, /Forked processes must have an IPC channel/);
25+26+let ipc = '';
27+let stderr = '';
28+const buf = Buffer.from('data to send via pipe');
29+const child = cp.fork(__filename, ['child'], {
30+stdio: [0, 'ignore', 'pipe', 'ipc', 'pipe']
31+});
32+33+assert.strictEqual(child.stdout, null);
34+35+child.on('message', (msg) => {
36+ipc += msg;
37+38+if (ipc === buf.toString()) {
39+child.disconnect();
40+}
41+});
42+43+child.stderr.on('data', (chunk) => {
44+stderr += chunk;
45+});
46+47+child.on('exit', common.mustCall((code, signal) => {
48+assert.strictEqual(code, 0);
49+assert.strictEqual(signal, null);
50+assert.strictEqual(stderr, 'this should not be ignored');
51+}));
52+53+child.stdio[4].write(buf);
54+}