fixjs
Version:
FIX Protocol library
258 lines (190 loc) • 6.72 kB
JavaScript
/// test admin commands
var assert = require('assert');
var after = require('after');
var through = require('through2');
var duplexer = require('duplexer2');
var fix = require('..');
var Msgs = fix.Msgs;
suite('admin');
test('logon', function(done) {
var self = this;
done = after(2, done);
var stream_server = through();
var stream_client = through();
var server = fix.createServer();
server.attach(duplexer(stream_client, stream_server));
var client = fix.createClient(duplexer(stream_server, stream_client));
server.on('session', function(session) {
session.on('logon', done);
});
var session = client.session('initiator', 'acceptor');
session.on('logon', done);
session.logon();
});
test('logout', function(done) {
var self = this;
done = after(3, done);
var stream_server = through();
var stream_client = through();
var server = fix.createServer();
server.attach(duplexer(stream_client, stream_server));
var client = fix.createClient(duplexer(stream_server, stream_client));
server.on('session', function(session) {
session.on('logon', done);
});
var session = client.session('initiator', 'acceptor');
session.on('logon', function() {
done();
session.logout();
});
// when the server responds with a clean logout
session.on('logout', done);
// login to the server
session.logon();
});
test('spoof', function(done) {
var stream_server = through();
var stream_client = through();
var server = fix.createServer();
server.attach(duplexer(stream_client, stream_server));
var client = fix.createClient(duplexer(stream_server, stream_client));
var stream_server2 = through();
var stream_client2 = through();
server.attach(duplexer(stream_client2, stream_server2));
var client2 = fix.createClient(duplexer(stream_server2, stream_client2));
var session = client.session('initiator', 'acceptor');
session.on('logon', function() {
// try to open another connection with same session
var session = client2.session('initiator', 'acceptor');
// we expect to be disconnected by the server
client2.stream.on('end', function() {
done();
});
// trying to reuse a session on a different connection should boot us
session.logon();
});
session.logon();
});
test('test request', function(done) {
done = after(2, done);
var stream_server = through();
var stream_client = through();
var server = fix.createServer();
server.attach(duplexer(stream_client, stream_server));
var client = fix.createClient(duplexer(stream_server, stream_client));
server.on('session', function(session) {
session.on('logon', done);
});
var session = client.session('initiator', 'acceptor');
session.on('logon', function() {
var msg = new Msgs.TestRequest();
msg.TestReqID = 1337;
session.send(msg);
});
session.on('Heartbeat', function(msg, next) {
assert.equal(this, session);
assert.equal(1337, msg.TestReqID);
next();
done();
});
// login to the server
session.logon();
});
test('reject logon', function(done) {
var stream_server = through();
var stream_client = through();
var server = fix.createServer();
server.attach(duplexer(stream_client, stream_server));
var client = fix.createClient(duplexer(stream_server, stream_client));
server.on('session', function(session) {
session.on('logon', function() {
test.false(); //invalid call specifically to fail test
});
session.on('Logon', function(msg, next) {
return next(new Error('testing login reject'));
});
});
var session = client.session('initiator', 'acceptor');
session.on('logon', function() {
assert.ok(false); //invalid call specifically to fail test
});
// a bad login will just terminate the session
session.on('end', function() {
done();
});
// login to the server
session.logon();
});
test('unsupported message', function(done) {
done = after(2, done);
var stream_server = through();
var stream_client = through();
var server = fix.createServer();
server.attach(duplexer(stream_client, stream_server));
var client = fix.createClient(duplexer(stream_server, stream_client));
server.on('session', function(session) {
session.on('logon', done);
});
var session = client.session('initiator', 'acceptor');
session.on('logon', function() {
session.send(new Msgs.NewOrderSingle());
});
session.on('error', function(err) {
assert.equal('unsupported message type: D', err.message);
done();
});
// login to the server
session.logon();
});
test('resend request', function(done) {
done = after(2, done);
var stream_server = through();
var stream_client = through();
var server = fix.createServer();
server.attach(duplexer(stream_client, stream_server));
var client = fix.createClient(duplexer(stream_server, stream_client));
server.on('session', function(session) {
session.on('logon', done);
});
var session = client.session('initiator', 'acceptor');
session.on('logon', function() {
var resend = new Msgs.ResendRequest();
resend.BeginSeqNo = '1';
resend.EndSeqNo = '10';
session.send(resend);
});
session.on('SequenceReset', function(msg, next) {
assert.equal(this, session);
assert.equal('10', msg.NewSeqNo);
assert.equal('N', msg.GapFillFlag);
next();
done();
});
session.logon();
});
test('sequence reset', function(done) {
done = after(2, done);
var stream_server = through();
var stream_client = through();
var server = fix.createServer();
server.attach(duplexer(stream_client, stream_server));
var client = fix.createClient(duplexer(stream_server, stream_client));
server.on('session', function(session) {
session.on('logon', done)
session.on('Heartbeat', function(msg, next) {
assert.equal('10', msg.MsgSeqNum);
next();
done();
});
});
var session = client.session('initiator', 'acceptor');
session.on('logon', function() {
var reset = new Msgs.SequenceReset();
reset.NewSeqNo = '10';
reset.GapFillFlag = 'N';
session.send(reset);
session.outgoing_seq_num = 10;
session.send(new Msgs.Heartbeat());
});
session.logon();
});