diff --git a/src/lib/silent.js b/src/lib/silent.js index b7fd88e..c7bd691 100644 --- a/src/lib/silent.js +++ b/src/lib/silent.js @@ -25,7 +25,7 @@ function Silent () { callback() } else { duplexStream.end() - callback(new Error('Received non supported MultiStream version' + msg)) + callback(new Error(`Received non supported MultiStream version ${msg}`)) } }) } @@ -36,8 +36,7 @@ function Silent () { if (msg === protocol) { return callback(null, self.duplexStream) } else { - self.duplexStream.end() - callback(new Error('Received non supported Protocol or Version: ' + msg)) + callback(new Error(`Received non supported Protocol or Version: ${msg}`)) } }) } diff --git a/test/impl/interactive.spec.js b/test/impl/interactive.spec.js index a498147..63c3129 100644 --- a/test/impl/interactive.spec.js +++ b/test/impl/interactive.spec.js @@ -4,6 +4,8 @@ var expect = require('chai').expect var streamPair = require('stream-pair') var MultiStream = require('../../src/') +var lpm = require('length-prefixed-message') +var PROTOCOLID = require('../../src/lib/protocol-id') describe('Implmentation: interactive', function () { var msS @@ -18,57 +20,135 @@ describe('Implmentation: interactive', function () { listener = pair.other }) - it('create a Select MultiStream', function () { - msS = new MultiStream.Select() - expect(msS).to.be.an.instanceof(MultiStream.Select) - }) + describe('basics', () => { + it('create a Select MultiStream', function () { + msS = new MultiStream.Select() + expect(msS).to.be.an.instanceof(MultiStream.Select) + }) - it('create a Interactive MultiStream()', function () { - msI = new MultiStream.Interactive() - expect(msI).to.be.an.instanceof(MultiStream.Interactive) - }) + it('create a Select MultiStream via function', function () { + expect( + MultiStream.Select.createSelect() + ).to.be.an.instanceof( + MultiStream.Select + ) + }) - it('attach a duplex stream to Select MultiStream', function () { - msS.handle(listener) - }) + it('throw an error if Select function is misused', function () { + expect( + () => MultiStream.Select() + ).to.throw( + 'Select must be called with new, or used with createSelect' + ) + }) - it('register two handlers', function () { - msS.addHandler('/dogs/0.1.0', function (ds) { - dogsDS = ds + it('create a Interactive MultiStream()', function () { + msI = new MultiStream.Interactive() + expect(msI).to.be.an.instanceof(MultiStream.Interactive) }) - msS.addHandler('/cats/1.2.11', function (ds) {}) - }) + it('attach a duplex stream to Select MultiStream', function () { + msS.handle(listener) + }) + + it('create a Interactive MultiStream() via utility function', function () { + expect( + MultiStream.Interactive.createInteractive() + ).to.be.an.instanceof( + MultiStream.Interactive + ) + }) + + it('throw an error if Interactive function is misused', function () { + expect( + () => MultiStream.Interactive() + ).to.throw( + 'MultiStream must be called with new, or used with createMultiStream' + ) + }) + + it('register two handlers', function () { + msS.addHandler('/dogs/0.1.0', function (ds) { + dogsDS = ds + }) + + msS.addHandler('/cats/1.2.11', function (ds) {}) + }) - it('ls', function (done) { - msI.handle(dialer, () => { - msI.ls((err, ls) => { - expect(err).to.not.exist - ls = JSON.parse(ls) - expect(ls[0]).to.equal('/dogs/0.1.0') - expect(ls[1]).to.equal('/cats/1.2.11') + it('ls', function (done) { + msI.handle(dialer, () => { + msI.ls((err, ls) => { + expect(err).to.not.exist + ls = JSON.parse(ls) + expect(ls[0]).to.equal('/dogs/0.1.0') + expect(ls[1]).to.equal('/cats/1.2.11') + done() + }) + }) + }) + + it('select one non existing protocol->handler', function (done) { + msI.select('/mouse/1.1.0', function (err, ds) { + expect(err).to.be.an.instanceof(Error) done() }) }) - }) - it('select one non existing protocol->handler', function (done) { - msI.select('/mouse/1.1.0', function (err, ds) { - expect(err).to.be.an.instanceof(Error) - done() + it('select one of the protocol->handler', function (done) { + msI.select('/dogs/0.1.0', function (err, ds) { + if (err) { + return console.log(err) + } + ds.write('hey') + dogsDS.on('data', function (data) { + expect(data.toString()).to.equal('hey') + done() + }) + }) }) }) - it('select one of the protocol->handler', function (done) { - msI.select('/dogs/0.1.0', function (err, ds) { - if (err) { - return console.log(err) - } - ds.write('hey') - dogsDS.on('data', function (data) { - expect(data.toString()).to.equal('hey') - done() + describe('varying connections', () => { + beforeEach(() => { + const pair = streamPair.create() + dialer = pair + listener = pair.other + }) + + it('Select closes connection for non supported protocol', function (done) { + var select = new MultiStream.Select() + select.handle(listener) + listener.on('finish', done) + + lpm.write(dialer, PROTOCOLID + '\n') + lpm.write(dialer, 'na\n') + }) + + it('Interactive responds with `na` for wrong protocol', function (done) { + var interactive = new MultiStream.Interactive() + interactive.handle(listener) + + dialer.on('data', (chunk) => { + if (chunk.toString().indexOf('na\n') > -1) { + done() + } }) + lpm.write(dialer, '/garbage/1.2.3\n') + }) + + it('Interactive handles `na` handler response', function (done) { + var interactive = new MultiStream.Interactive() + interactive.handle(listener, () => { + interactive.select('skipping') + interactive.select('whatever', (err) => { + expect(err.message).to.equal('whatever not supported') + done() + }) + }) + + lpm.write(dialer, PROTOCOLID + '\n') + lpm.write(dialer, 'nan\n') + lpm.write(dialer, 'na\n') }) }) }) diff --git a/test/impl/one-way.spec.js b/test/impl/one-way.spec.js index 6551e84..cc6e82b 100644 --- a/test/impl/one-way.spec.js +++ b/test/impl/one-way.spec.js @@ -4,6 +4,7 @@ var expect = require('chai').expect var streamPair = require('stream-pair') var MultiStream = require('../../src/') +var lpm = require('length-prefixed-message') describe('Implementation: one-way', function () { var msB @@ -27,6 +28,22 @@ describe('Implementation: one-way', function () { expect(msS).to.be.an.instanceof(MultiStream.Silent) }) + it('create a Broadcast MultiStream via utility function', function () { + expect( + MultiStream.Broadcast.createBroadcast() + ).to.be.an.instanceof( + MultiStream.Broadcast + ) + }) + + it('throw an error if Broadcast function is misused', function () { + expect( + () => MultiStream.Broadcast() + ).to.throw( + 'Broadcast must be called with new, or used with Broadcast' + ) + }) + it('attach a stream to Broadcast MultiStream (tcp server)', function () { msB.handle(listener) }) @@ -35,6 +52,22 @@ describe('Implementation: one-way', function () { msS.handle(dialer, done) }) + it('create a Silent MultiStream via utility function', function () { + expect( + MultiStream.Silent.createSilent() + ).to.be.an.instanceof( + MultiStream.Silent + ) + }) + + it('throw an error if Silent function is misused', function () { + expect( + () => MultiStream.Silent() + ).to.throw( + 'Silent must be called with new, or used with Silent' + ) + }) + it('register a handler', function (done) { msS.addHandler('/bird/3.2.1', function (err, ds) { expect(err).to.equal(null) @@ -48,4 +81,22 @@ describe('Implementation: one-way', function () { ds.write('hey, how is it going?') }) }) + + it('closing socket for unsupported protocol', function (done) { + const acc = new MultiStream.Silent() + const pair = streamPair.create() + dialer = pair + listener = pair.other + + acc.handle(listener, (err) => { + expect( + err.message + ).to.equal( + 'Received non supported MultiStream version /garbage/1.0.0' + ) + done() + }) + + lpm.write(dialer, '/garbage/1.0.0\n') + }) })