From 1b9c591da6c468ac65deae02ba9355e4639f325f Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Tue, 2 Apr 2019 15:18:30 +0100 Subject: [PATCH] fix: listener params and adapter tests License: MIT Signed-off-by: Alan Shaw --- package.json | 6 +- src/listener.js | 7 + test/adapter/compliance.node.js | 4 +- test/adapter/compliance/dial-test.js | 73 ++++++++ test/adapter/compliance/index.js | 12 ++ test/adapter/compliance/listen-test.js | 124 ++++++++++++++ test/adapter/index.js | 2 + test/adapter/node.js | 17 +- test/node.js | 225 ++++++------------------- 9 files changed, 280 insertions(+), 190 deletions(-) create mode 100644 test/adapter/compliance/dial-test.js create mode 100644 test/adapter/compliance/index.js create mode 100644 test/adapter/compliance/listen-test.js create mode 100644 test/adapter/index.js diff --git a/package.json b/package.json index 64e8ea7..c09b80d 100644 --- a/package.json +++ b/package.json @@ -53,9 +53,13 @@ "chai": "^4.1.2", "dirty-chai": "^2.0.1", "interface-transport": "~0.3.6", + "it-goodbye": "^1.0.0", + "it-pipe": "^1.0.0", "multiaddr": "^6.0.3", "pull-goodbye": "0.0.2", - "pull-stream": "^3.6.9" + "pull-serializer": "~0.3.2", + "pull-stream": "^3.6.9", + "streaming-iterables": "^4.0.2" }, "contributors": [ "Chris Campbell ", diff --git a/src/listener.js b/src/listener.js index 8e23760..7b3ed25 100644 --- a/src/listener.js +++ b/src/listener.js @@ -5,6 +5,13 @@ const os = require('os') const createServer = require('it-ws/server') module.exports = (options, handler) => { + if (typeof options === 'function') { + handler = options + options = {} + } + + options = options || {} + const server = createServer(options, socket => { socket.getObservedAddrs = () => [] handler(socket) diff --git a/test/adapter/compliance.node.js b/test/adapter/compliance.node.js index e940090..b309240 100644 --- a/test/adapter/compliance.node.js +++ b/test/adapter/compliance.node.js @@ -1,11 +1,11 @@ /* eslint-env mocha */ 'use strict' -const tests = require('interface-transport') +const tests = require('./compliance') const multiaddr = require('multiaddr') const WS = require('../../src/adapter') -describe('compliance', () => { +describe('adapter compliance', () => { tests({ setup (callback) { let ws = new WS() diff --git a/test/adapter/compliance/dial-test.js b/test/adapter/compliance/dial-test.js new file mode 100644 index 0000000..85c1a6c --- /dev/null +++ b/test/adapter/compliance/dial-test.js @@ -0,0 +1,73 @@ +/* eslint-env mocha */ +'use strict' + +const chai = require('chai') +const dirtyChai = require('dirty-chai') +const expect = chai.expect +chai.use(dirtyChai) +const pull = require('pull-stream') +const goodbye = require('pull-goodbye') +const serializer = require('pull-serializer') + +module.exports = (common) => { + describe('dial', () => { + let addrs + let transport + let listener + + before((done) => { + common.setup((err, _transport, _addrs) => { + if (err) return done(err) + transport = _transport + addrs = _addrs + done() + }) + }) + + after((done) => { + common.teardown(done) + }) + + beforeEach((done) => { + listener = transport.createListener((conn) => { + pull(conn, conn) + }) + listener.listen(addrs[0], done) + }) + + afterEach((done) => { + listener.close(done) + }) + + it('simple', (done) => { + const s = serializer(goodbye({ + source: pull.values(['hey']), + sink: pull.collect((err, values) => { + expect(err).to.not.exist() + expect( + values + ).to.be.eql( + ['hey'] + ) + done() + }) + })) + + pull( + s, + transport.dial(addrs[0]), + s + ) + }) + + it('to non existent listener', (done) => { + pull( + transport.dial(addrs[1]), + pull.onEnd((err) => { + expect(err).to.exist() + done() + }) + ) + }) + }) +} diff --git a/test/adapter/compliance/index.js b/test/adapter/compliance/index.js new file mode 100644 index 0000000..e8173e2 --- /dev/null +++ b/test/adapter/compliance/index.js @@ -0,0 +1,12 @@ +/* eslint-env mocha */ +'use strict' + +const dial = require('./dial-test') +const listen = require('./listen-test') + +module.exports = (common) => { + describe('interface-transport', () => { + dial(common) + listen(common) + }) +} diff --git a/test/adapter/compliance/listen-test.js b/test/adapter/compliance/listen-test.js new file mode 100644 index 0000000..082361a --- /dev/null +++ b/test/adapter/compliance/listen-test.js @@ -0,0 +1,124 @@ +/* eslint max-nested-callbacks: ["error", 8] */ +/* eslint-env mocha */ +'use strict' + +const chai = require('chai') +const dirtyChai = require('dirty-chai') +const expect = chai.expect +chai.use(dirtyChai) + +const pull = require('pull-stream') + +module.exports = (common) => { + describe('listen', () => { + let addrs + let transport + + before((done) => { + common.setup((err, _transport, _addrs) => { + if (err) return done(err) + transport = _transport + addrs = _addrs + done() + }) + }) + + after((done) => { + common.teardown(done) + }) + + it('simple', (done) => { + const listener = transport.createListener((conn) => {}) + listener.listen(addrs[0], () => { + listener.close(done) + }) + }) + + it('close listener with connections, through timeout', (done) => { + const finish = plan(3, done) + const listener = transport.createListener((conn) => { + pull(conn, conn) + }) + + listener.listen(addrs[0], () => { + const socket1 = transport.dial(addrs[0], () => { + listener.close(finish) + }) + + pull( + transport.dial(addrs[0]), + pull.onEnd(() => { + finish() + }) + ) + + pull( + pull.values([Buffer.from('Some data that is never handled')]), + socket1, + pull.onEnd(() => { + finish() + }) + ) + }) + }) + + describe('events', () => { + // eslint-disable-next-line + // TODO: figure out why it fails in the full test suite + it.skip('connection', (done) => { + const finish = plan(2, done) + + const listener = transport.createListener() + + listener.on('connection', (conn) => { + expect(conn).to.exist() + finish() + }) + + listener.listen(addrs[0], () => { + transport.dial(addrs[0], () => { + listener.close(finish) + }) + }) + }) + + it('listening', (done) => { + const listener = transport.createListener() + listener.on('listening', () => { + listener.close(done) + }) + listener.listen(addrs[0]) + }) + + // eslint-disable-next-line + // TODO: how to get the listener to emit an error? + it.skip('error', (done) => { + const listener = transport.createListener() + listener.on('error', (err) => { + expect(err).to.exist() + listener.close(done) + }) + }) + + it('close', (done) => { + const finish = plan(2, done) + const listener = transport.createListener() + listener.on('close', finish) + + listener.listen(addrs[0], () => { + listener.close(finish) + }) + }) + }) + }) +} + +function plan (n, done) { + let i = 0 + return (err) => { + if (err) return done(err) + i++ + + if (i === n) done() + } +} diff --git a/test/adapter/index.js b/test/adapter/index.js new file mode 100644 index 0000000..24be09b --- /dev/null +++ b/test/adapter/index.js @@ -0,0 +1,2 @@ +require('./compliance.node') +require('./node') diff --git a/test/adapter/node.js b/test/adapter/node.js index 7537ba9..9441cbd 100644 --- a/test/adapter/node.js +++ b/test/adapter/node.js @@ -14,14 +14,14 @@ const WS = require('../../src/adapter') require('./compliance.node') -describe('instantiate the transport', () => { +describe('adapter instantiate the transport', () => { it('create', () => { const ws = new WS() expect(ws).to.exist() }) }) -describe('listen', () => { +describe('adapter listen', () => { describe('ip4', () => { let ws const ma = multiaddr('/ip4/127.0.0.1/tcp/9090/ws') @@ -201,7 +201,7 @@ describe('listen', () => { }) }) -describe('dial', () => { +describe('adapter dial', () => { describe('ip4', () => { let ws let listener @@ -305,7 +305,7 @@ describe('dial', () => { }) }) -describe('filter addrs', () => { +describe('adapter filter addrs', () => { let ws before(() => { @@ -440,7 +440,7 @@ describe('filter addrs', () => { }) }) -describe('valid Connection', () => { +describe('adapter valid Connection', () => { const ma = multiaddr('/ip4/127.0.0.1/tcp/9092/ws') it('get observed addrs', (done) => { @@ -554,10 +554,3 @@ describe('valid Connection', () => { } }) }) - -describe.skip('turbolence', () => { - it('dialer - emits error on the other end is terminated abruptly', (done) => { - }) - it('listener - emits error on the other end is terminated abruptly', (done) => { - }) -}) diff --git a/test/node.js b/test/node.js index d67852e..6ff4d48 100644 --- a/test/node.js +++ b/test/node.js @@ -7,12 +7,13 @@ const dirtyChai = require('dirty-chai') const expect = chai.expect chai.use(dirtyChai) const multiaddr = require('multiaddr') -const pull = require('pull-stream') -const goodbye = require('pull-goodbye') +const goodbye = require('it-goodbye') +const { collect, consume } = require('streaming-iterables') +const pipe = require('it-pipe') const WS = require('../src') -require('./compliance.node') +// require('./compliance.node') describe('instantiate the transport', () => { it('create', () => { @@ -180,49 +181,31 @@ describe('dial', () => { let listener const ma = multiaddr('/ip4/127.0.0.1/tcp/9091/ws') - beforeEach((done) => { + beforeEach(() => { ws = new WS() - listener = ws.createListener((conn) => { - pull(conn, conn) - }) - listener.listen(ma, done) + listener = ws.createListener(conn => pipe(conn, conn)) + return listener.listen(ma) }) - afterEach((done) => { - listener.close(done) + afterEach(() => listener.close()) + + it('dial', async () => { + const conn = await ws.dial(ma) + const s = goodbye({ source: ['hey'], sink: collect }) + + const result = await pipe(s, conn, s) + + expect(result).to.be.eql(['hey']) }) - it('dial', (done) => { - const conn = ws.dial(ma) - - const s = goodbye({ - source: pull.values(['hey']), - sink: pull.collect((err, result) => { - expect(err).to.not.exist() - - expect(result).to.be.eql(['hey']) - done() - }) - }) - - pull(s, conn, s) - }) - - it('dial with IPFS Id', (done) => { + it('dial with IPFS Id', async () => { const ma = multiaddr('/ip4/127.0.0.1/tcp/9091/ws/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw') - const conn = ws.dial(ma) + const conn = await ws.dial(ma) + const s = goodbye({ source: ['hey'], sink: collect }) - const s = goodbye({ - source: pull.values(['hey']), - sink: pull.collect((err, result) => { - expect(err).to.not.exist() + const result = await pipe(s, conn, s) - expect(result).to.be.eql(['hey']) - done() - }) - }) - - pull(s, conn, s) + expect(result).to.be.eql(['hey']) }) }) @@ -231,49 +214,34 @@ describe('dial', () => { let listener const ma = multiaddr('/ip6/::1/tcp/9091') - beforeEach((done) => { + beforeEach(() => { ws = new WS() - listener = ws.createListener((conn) => { - pull(conn, conn) - }) - listener.listen(ma, done) + listener = ws.createListener(conn => pipe(conn, conn)) + return listener.listen(ma) }) - afterEach((done) => { - listener.close(done) + afterEach(() => listener.close()) + + it('dial', async () => { + const conn = await ws.dial(ma) + const s = goodbye({ source: ['hey'], sink: collect }) + + const result = await pipe(s, conn, s) + + expect(result).to.be.eql(['hey']) }) - it('dial', (done) => { - const conn = ws.dial(ma) - - const s = goodbye({ - source: pull.values(['hey']), - sink: pull.collect((err, result) => { - expect(err).to.not.exist() - - expect(result).to.be.eql(['hey']) - done() - }) - }) - - pull(s, conn, s) - }) - - it('dial with IPFS Id', (done) => { + it('dial with IPFS Id', async () => { const ma = multiaddr('/ip6/::1/tcp/9091/ws/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw') - const conn = ws.dial(ma) + const conn = await ws.dial(ma) const s = goodbye({ - source: pull.values(['hey']), - sink: pull.collect((err, result) => { - expect(err).to.not.exist() - - expect(result).to.be.eql(['hey']) - done() - }) + source: ['hey'], + sink: collect }) - pull(s, conn, s) + const result = await pipe(s, conn, s) + expect(result).to.be.eql(['hey']) }) }) }) @@ -416,121 +384,28 @@ describe('filter addrs', () => { describe('valid Connection', () => { const ma = multiaddr('/ip4/127.0.0.1/tcp/9092/ws') - it('get observed addrs', (done) => { + it('get observed addrs', async () => { let dialerObsAddrs let listenerObsAddrs const ws = new WS() - const listener = ws.createListener((conn) => { + const listener = ws.createListener(async conn => { expect(conn).to.exist() - - conn.getObservedAddrs((err, addrs) => { - expect(err).to.not.exist() - dialerObsAddrs = addrs - }) - - pull(conn, conn) + dialerObsAddrs = await conn.getObservedAddrs() + pipe(conn, conn) }) - listener.listen(ma, () => { - const conn = ws.dial(ma) + await listener.listen(ma) + const conn = await ws.dial(ma) - pull( - pull.empty(), - conn, - pull.onEnd(onEnd) - ) + await pipe([], conn, consume) - function onEnd () { - conn.getObservedAddrs((err, addrs) => { - expect(err).to.not.exist() - listenerObsAddrs = addrs + listenerObsAddrs = await conn.getObservedAddrs() - listener.close(onClose) + await listener.close() - function onClose () { - expect(listenerObsAddrs[0]).to.deep.equal(ma) - expect(dialerObsAddrs.length).to.equal(0) - done() - } - }) - } - }) - }) - - it('get Peer Info', (done) => { - const ws = new WS() - - const listener = ws.createListener((conn) => { - expect(conn).to.exist() - - conn.getPeerInfo((err, peerInfo) => { - expect(err).to.exist() - }) - - pull(conn, conn) - }) - - listener.listen(ma, () => { - const conn = ws.dial(ma) - - pull( - pull.empty(), - conn, - pull.onEnd(onEnd) - ) - - function onEnd () { - conn.getPeerInfo((err, peerInfo) => { - expect(err).to.exist() - listener.close(done) - }) - } - }) - }) - - it('set Peer Info', (done) => { - const ws = new WS() - - const listener = ws.createListener((conn) => { - expect(conn).to.exist() - conn.setPeerInfo('a') - - conn.getPeerInfo((err, peerInfo) => { - expect(err).to.not.exist() - expect(peerInfo).to.equal('a') - }) - - pull(conn, conn) - }) - - listener.listen(ma, onListen) - - function onListen () { - const conn = ws.dial(ma) - conn.setPeerInfo('b') - - pull( - pull.empty(), - conn, - pull.onEnd(onEnd) - ) - - function onEnd () { - conn.getPeerInfo((err, peerInfo) => { - expect(err).to.not.exist() - expect(peerInfo).to.equal('b') - listener.close(done) - }) - } - } - }) -}) - -describe.skip('turbolence', () => { - it('dialer - emits error on the other end is terminated abruptly', (done) => { - }) - it('listener - emits error on the other end is terminated abruptly', (done) => { + expect(listenerObsAddrs[0]).to.deep.equal(ma) + expect(dialerObsAddrs.length).to.equal(0) }) })