nanomsg
Version:
Node bindings for nanomsg
215 lines (165 loc) • 4.67 kB
JavaScript
// This test suite is a duplicate of inproc.js, but using the ws transport.
var nano = require('../');
var test = require('tape');
test('ws socket pub sub', function (t) {
t.plan(1);
var pub = nano.socket('pub');
var sub = nano.socket('sub');
var addr = 'ws://127.0.0.1:6004';
var msg = 'hello world';
pub.bind(addr);
sub.connect(addr);
sub.on('data', function (buf) {
t.equal(buf.toString(), msg);
pub.close();
sub.close();
});
setTimeout(function () {
pub.send(msg);
}, 300);
});
test('ws socket pairs', function (t) {
t.plan(1);
var s1 = nano.socket('pair');
var s2 = nano.socket('pair');
var addr = 'ws://127.0.0.1:6005';
var msg = 'hello world';
s1.bind(addr);
s2.connect(addr);
s1.on('data', function (buf) {
t.equal(buf.toString(), msg);
s1.close();
s2.close();
});
setTimeout(function () {
s2.send(msg);
}, 300);
});
test('ws socket req rep', function (t) {
t.plan(2);
var req = nano.socket('req');
var rep = nano.socket('rep');
var addr = 'ws://127.0.0.1:6006';
var msg1 = 'knock knock';
var msg2 = "who's there?";
rep.bind(addr);
req.connect(addr);
rep.on('data', function (buf) {
t.equal(buf.toString(), msg1, 'request received');
rep.send(msg2);
});
req.on('data', function (buf) {
t.equal(buf.toString(), msg2, 'reply received');
req.close();
rep.close();
});
setTimeout(function () {
req.send(msg1);
}, 300);
});
test('ws socket survey', function (t) {
t.plan(3);
var sur = nano.socket('surveyor');
var rep1 = nano.socket('respondent');
var rep2 = nano.socket('respondent');
var rep3 = nano.socket('respondent');
var addr = 'ws://127.0.0.1:6007';
var msg1 = 'knock knock';
var msg2 = "who's there?";
sur.bind(addr);
rep1.connect(addr);
rep2.connect(addr);
rep3.connect(addr);
function answer (buf) {
this.send(msg2);
}
rep1.on('data', answer);
rep2.on('data', answer);
rep3.on('data', answer);
var count = 0;
sur.on('data', function (buf) {
t.ok(buf.toString() == msg2, buf.toString() + ' == ' + msg2);
if (++count == 3) {
sur.close();
rep1.close();
rep2.close();
rep3.close();
}
});
setTimeout(function () {
sur.send(msg1);
}, 300);
});
test('ws socket bus', function (t) {
// http://250bpm.com/blog:17
// Number of buses to create.
var count = 3;
var total = count * (count-1), current = 0;
t.plan(count);
// Create buses.
var buses = {};
for (var i = 0; i < count; i++) {
(function (i) {
var bus = nano.socket('bus');
var addr = 'ws://127.0.0.1:' + (6008 + i);
bus.bind(addr);
bus.connect(addr);
buses[addr] = bus;
// Add a "response count" for each bus.
// We want this to equal the number of other buses.
bus.responseCount = 0;
// Tally messages from other buses.
bus.on('data', function (msg) {
//console.error('#', 'received data from', msg.toString(), 'on', addr)
this.responseCount++;
current++;
if (this.responseCount == count - 1) {
// All set! bus received all messages.
t.ok(true, 'all messages received on ' + addr);
}
if (current == total) {
// close all buses.
Object.keys(buses).forEach(function (addr) {
buses[addr].close();
})
}
});
})(i);
}
// Send messages on every bus.
setTimeout(function () {
Object.keys(buses).forEach(function (addr) {
//console.error('#', 'writing on', addr, addr);
buses[addr].send(addr);
});
}, 1500);
});
test('ws multiple socket pub sub', function (t) {
t.plan(3);
var pub = nano.socket('pub');
var sub1 = nano.socket('sub');
var sub2 = nano.socket('sub');
var sub3 = nano.socket('sub');
var addr = 'ws://127.0.0.1:6011';
var msg = 'hello world';
pub.bind(addr);
sub1.connect(addr);
sub2.connect(addr);
sub3.connect(addr);
var responses = 0;
sub1.on('data', resp_handler);
sub2.on('data', resp_handler);
sub3.on('data', resp_handler);
function resp_handler(buf) {
if(++responses == 3) {
pub.close();
sub1.close();
sub2.close();
sub3.close();
}
t.equal(buf.toString(), msg);
};
setTimeout(function () {
pub.send(msg);
}, 300);
});