deadpool
Version:
Spawn node.js programs with the speed of thought
126 lines (110 loc) • 3.12 kB
JavaScript
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);
});
});