test: add test-spawn-cmd-named-pipe
authorAlexis Campailla <alexis@janeasystems.com>
Wed, 9 Sep 2015 13:19:24 +0000 (15:19 +0200)
committerJeremiah Senkpiel <fishrock123@rocketmail.com>
Sun, 20 Sep 2015 17:31:26 +0000 (10:31 -0700)
Adding a Windows test to verify that a node process spawned via
cmd with named pipes can access its stdio streams.

Ref: https://github.com/nodejs/node-v0.x-archive/issues/7345

PR-URL: https://github.com/nodejs/node/pull/2770
Reviewed-By: cjihrig - Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: thefourtheye - Sakthipriyan Vairamani <thechargingvolcano@gmail.com>
Reviewed-By: evanlucas - Evan Lucas <evanlucas@me.com>
test/parallel/test-spawn-cmd-named-pipe.js [new file with mode: 0644]

diff --git a/test/parallel/test-spawn-cmd-named-pipe.js b/test/parallel/test-spawn-cmd-named-pipe.js
new file mode 100644 (file)
index 0000000..c664f7f
--- /dev/null
@@ -0,0 +1,58 @@
+'use strict';
+const common = require('../common');
+const assert = require('assert');
+
+// This test is intended for Windows only
+if (!common.isWindows) {
+  console.log('1..0 # Skipped: this test is Windows-specific.');
+  return;
+}
+
+if (!process.argv[2]) {
+  // parent
+  const net = require('net');
+  const spawn = require('child_process').spawn;
+  const path = require('path');
+
+  const pipeNamePrefix = path.basename(__filename) + '.' + process.pid;
+  const stdinPipeName = '\\\\.\\pipe\\' + pipeNamePrefix + '.stdin';
+  const stdoutPipeName = '\\\\.\\pipe\\' + pipeNamePrefix + '.stdout';
+
+  const stdinPipeServer = net.createServer(function(c) {
+    c.on('end', common.mustCall(function() {
+    }));
+    c.end('hello');
+  });
+  stdinPipeServer.listen(stdinPipeName);
+
+  const output = [];
+
+  const stdoutPipeServer = net.createServer(function(c) {
+    c.on('data', function(x) {
+      output.push(x);
+    });
+    c.on('end', common.mustCall(function() {
+      assert.strictEqual(output.join(''), 'hello');
+    }));
+  });
+  stdoutPipeServer.listen(stdoutPipeName);
+
+  const comspec = process.env['comspec'];
+  if (!comspec || comspec.length === 0) {
+    assert.fail('Failed to get COMSPEC');
+  }
+
+  const args = ['/c', process.execPath, __filename, 'child',
+              '<', stdinPipeName, '>', stdoutPipeName];
+
+  const child = spawn(comspec, args);
+
+  child.on('exit', common.mustCall(function(exitCode) {
+    stdinPipeServer.close();
+    stdoutPipeServer.close();
+    assert.strictEqual(exitCode, 0);
+  }));
+} else {
+  // child
+  process.stdin.pipe(process.stdout);
+}