Skip to content
This repository was archived by the owner on Oct 19, 2022. It is now read-only.

test: Increase test coverage #9

Merged
merged 1 commit into from
Apr 18, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions src/lib/silent.js
Original file line number Diff line number Diff line change
Expand Up @@ -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}`))
}
})
}
Expand All @@ -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}`))
Copy link
Member

@daviddias daviddias Apr 18, 2016

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why remove this call? Closing the stream is the signal that the protocol was not supported in this scenario.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because the error means the protocol is not supported?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ignore my last message. We don't want to end the stream, just because one (of possible multiple handlers) errors, is my understanding of this.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It can be interpreted differently, but since there is ambiguity from the spec (as it is more of a implementation details) and I have no strong use case for it to close. Let's continue this way then.

}
})
}
Expand Down
154 changes: 117 additions & 37 deletions test/impl/interactive.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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')
})
})
})
51 changes: 51 additions & 0 deletions test/impl/one-way.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
})
Expand All @@ -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)
Expand All @@ -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')
})
})