| var sinon = require('sinon') |
| var chai = require('chai') |
| chai.use(require('sinon-chai')) |
| var expect = chai.expect |
| |
| var ms = require('../../lib/wire/messagestream') |
| |
| describe('MessageStream', function() { |
| describe('DelimitedStream', function() { |
| it('should emit complete varint-delimited chunks', function() { |
| var ds = new ms.DelimitedStream() |
| var spy = sinon.spy() |
| ds.on('data', spy) |
| ds.write(new Buffer([1, 0x61, 2, 0x62, 0x63])) |
| expect(spy).to.have.been.calledTwice |
| expect(spy.firstCall.args).to.eql([new Buffer([0x61])]) |
| expect(spy.secondCall.args).to.eql([new Buffer([0x62, 0x63])]) |
| }) |
| |
| it('should wait for more data', function() { |
| var ds = new ms.DelimitedStream() |
| var spy = sinon.spy() |
| ds.on('data', spy) |
| ds.write(new Buffer([3])) |
| expect(spy).to.not.have.been.called |
| ds.write(new Buffer([0x66])) |
| expect(spy).to.not.have.been.called |
| ds.write(new Buffer([0x65])) |
| expect(spy).to.not.have.been.called |
| ds.write(new Buffer([0x64])) |
| expect(spy).to.have.been.calledOnce |
| expect(spy.firstCall.args).to.eql([new Buffer([0x66, 0x65, 0x64])]) |
| }) |
| |
| it('should read varint32 properly', function() { |
| var ds = new ms.DelimitedStream() |
| var spy = sinon.spy() |
| ds.on('data', spy) |
| ds.write(new Buffer([172, 2])) // 300 |
| var data = new Buffer(300) |
| data.fill(0) |
| ds.write(data) |
| expect(spy).to.have.been.calledOnce |
| expect(spy.firstCall.args).to.eql([data]) |
| }) |
| |
| it('should emit "end"', function(done) { |
| var ds = new ms.DelimitedStream() |
| var spy = sinon.spy() |
| ds.on('data', sinon.spy()) |
| ds.on('end', spy) |
| ds.write(new Buffer([1])) |
| ds.end() |
| setImmediate(function() { |
| expect(spy).to.have.been.called |
| done() |
| }) |
| }) |
| }) |
| |
| describe('DelimitingStream', function() { |
| it('should add delimiter chunks to stream', function() { |
| var ds = new ms.DelimitingStream() |
| var spy = sinon.spy() |
| ds.on('data', spy) |
| ds.write(new Buffer([0x66, 0x6f, 0x6f])) |
| expect(spy).to.have.been.calledTwice |
| expect(spy.firstCall.args).to.eql([new Buffer([0x03])]) |
| expect(spy.secondCall.args).to.eql([new Buffer([0x66, 0x6f, 0x6f])]) |
| }) |
| |
| it('should write proper varints', function() { |
| var ds = new ms.DelimitingStream() |
| var spy = sinon.spy() |
| ds.on('data', spy) |
| var data = new Buffer(300) |
| data.fill(0) |
| ds.write(data) |
| expect(spy).to.have.been.calledTwice |
| expect(spy.firstCall.args).to.eql([new Buffer([172, 2])]) |
| expect(spy.secondCall.args).to.eql([data]) |
| }) |
| |
| it('should emit "end"', function(done) { |
| var ds = new ms.DelimitingStream() |
| var spy = sinon.spy() |
| ds.on('data', sinon.spy()) |
| ds.on('end', spy) |
| ds.write(new Buffer([1])) |
| ds.end() |
| setImmediate(function() { |
| expect(spy).to.have.been.called |
| done() |
| }) |
| }) |
| }) |
| }) |