UNPKG

deadpool

Version:

Spawn node.js programs with the speed of thought

126 lines (110 loc) 3.12 kB
var assert = require('assert'); var fs = require('fs'); var cp = require('child_process'); var path = require('path'); var net = require('net'); var EventEmitter = require('events'); var through = require('through2'); var bl = require('bl'); var msgpack = require('msgpack5')(); suite('deadpool', function() { var sock = path.join(__dirname, 'deadpool.sock'); var deadpoold, event, conn, received, closed = false; function removeStdioCloseMsgs(received) { var msgs = received.slice(0, received.length - 3); msgs.push(received[received.length -1]); return msgs; } function expect(expected, cb) { event.on('data', function() { try { assert.deepEqual(expected, removeStdioCloseMsgs(received)); event.removeAllListeners('data'); cb(); } catch (err) { return; } }); } function send(msg) { bl().append(msgpack.encode(msg)).pipe(conn, {end: false}); } suiteSetup(function(done) { deadpoold = cp.spawn(process.execPath, [path.join(__dirname, 'daemon.js')], { stdio: ['ignore', 'pipe', 'inherit'] }); deadpoold.stdout.on('data', function() { done(); deadpoold.stdout.removeAllListeners(); }); }); suiteTeardown(function(done) { deadpoold.on('exit', function() { done(); }); deadpoold.kill('SIGTERM'); }); setup(function(done) { received = []; event = new EventEmitter(); (conn = net.connect(sock, done)) .pipe(msgpack.decoder()) .pipe(through.obj(function(msg, enc, cb) { var m = msg[1] if (Buffer.isBuffer(m)) m = m.toString(); if (typeof m === 'string') try {m = JSON.parse(m);} catch(err) {} received.push([msg[0], m]); event.emit('data'); cb(); })); conn.once('close', function(had_error) { closed = !had_error; }); }); teardown(function(done) { if (closed) return done(); conn.once('close', function(had_error) { if (!had_error) done(); }); }); test('exit', function(done) { send({argv: ['exit']}); expect([[1, 'exit'], [3, 0]], done); }); test('error', function(done) { send({argv: ['error']}); expect([[2, 'error'], [3, 1]], done); }); test('echo exit', function(done) { send({argv: ['echo']}); send([0, 'line1']); send([0, 'line1cont\n']); send([0, 'line2\n']); send([0, 'line3\n']); send([0, 'exit\n']); expect([ [1, 'echo: line1line1cont'], [1, 'echo: line2'], [1, 'echo: line3'], [1, 'exit'], [3, 0] ], done); }); test('echo error', function(done) { send({argv: ['echo']}); send([0, 'line1\n']); send([0, 'line2\n']); send([0, 'error\n']); expect([ [1, 'echo: line1'], [1, 'echo: line2'], [2, 'error'], [3, 1] ], done); }); test('argument parsing', function(done) { send({argv: ['args', '-x', '3', '-n5', '-abc', '--with-test=node', 'a1', 'a2']}); expect([ [1, {_: ['a1', 'a2'], x: 3, n: 5, a: true, b: true, c: true, 'with-test': 'node'}], [3, 0] ], done); }); });