diff --git a/.aegir.js b/.aegir.js index e7fff53c0e..5422a010df 100644 --- a/.aegir.js +++ b/.aegir.js @@ -1,49 +1,63 @@ 'use strict' -const Node = require('./test/nodejs-bundle/nodejs-bundle.js') const PeerInfo = require('peer-info') const PeerId = require('peer-id') const pull = require('pull-stream') +const parallel = require('async/parallel') +const rawPeer = require('./test/fixtures/test-peer.json') +const Node = require('./test/utils/bundle.node.js') const sigServer = require('libp2p-webrtc-star/src/sig-server') -let server +const WebSocketStarRendezvous = require('libp2p-websocket-star-rendezvous') +let wrtcRendezvous +let wsRendezvous let node -const rawPeer = require('./test/browser-bundle/peer.json') const before = (done) => { - let count = 0 - const ready = () => ++count === 2 ? done() : null + parallel([ + (cb) => { + sigServer.start({ port: 15555 }, (err, server) => { + if (err) { return cb(err) } + wrtcRendezvous = server + cb() + }) + }, + (cb) => { + WebSocketStarRendezvous.start({ + port: 14444, + refreshPeerListIntervalMS: 1000, + strictMultiaddr: false, + cryptoChallenge: false + }, (err, _server) => { + if (err) { return cb(err) } + wsRendezvous = _server + cb() + }) + }, + (cb) => { + PeerId.createFromJSON(rawPeer, (err, peerId) => { + if (err) { + return done(err) + } + const peer = new PeerInfo(peerId) - sigServer.start({ port: 15555 }, (err, _server) => { - if (err) { - throw err - } - server = _server - ready() - }) + peer.multiaddrs.add('/ip4/127.0.0.1/tcp/9200/ws') - PeerId.createFromJSON(rawPeer, (err, peerId) => { - if (err) { - return done(err) + node = new Node(peer) + node.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn)) + node.start(cb) + }) } - const peer = new PeerInfo(peerId) - - peer.multiaddrs.add('/ip4/127.0.0.1/tcp/9200/ws') - - node = new Node(peer) - node.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn)) - node.start(() => ready()) - }) + ], done) } const after = (done) => { - setTimeout(() => node.stop((err) => { - if (err) { - return done(err) - } - server.stop(done) - }), 2000) + setTimeout(() => parallel( + [node, wrtcRendezvous, wsRendezvous].map((s) => { + return (cb) => s.stop(cb) + }) + , done), 2000) } module.exports = { @@ -52,4 +66,3 @@ module.exports = { post: after } } - diff --git a/package.json b/package.json index a093eb1909..6944812e86 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "dependencies": { "async": "^2.6.0", "libp2p-ping": "~0.6.0", - "libp2p-swarm": "~0.33.1", + "libp2p-swarm": "~0.33.2", "mafmt": "^3.0.2", "multiaddr": "^3.0.1", "peer-book": "~0.5.1", @@ -47,7 +47,7 @@ "peer-info": "~0.11.1" }, "devDependencies": { - "aegir": "^12.1.3", + "aegir": "^12.2.0", "chai": "^4.1.2", "cids": "~0.5.2", "dirty-chai": "^2.0.1", @@ -62,6 +62,8 @@ "libp2p-tcp": "~0.11.1", "libp2p-webrtc-star": "~0.13.2", "libp2p-websockets": "~0.10.4", + "libp2p-websocket-star": "~0.5.1", + "libp2p-websocket-star-rendezvous": "~0.2.1", "lodash.times": "^4.3.2", "pre-commit": "^1.2.2", "pull-goodbye": "0.0.2", diff --git a/test/browser-bundle/webrtc-star-only.js b/test/browser-bundle/webrtc-star-only.js deleted file mode 100644 index 6697507f03..0000000000 --- a/test/browser-bundle/webrtc-star-only.js +++ /dev/null @@ -1,121 +0,0 @@ -/* eslint-env mocha */ -'use strict' - -const chai = require('chai') -chai.use(require('dirty-chai')) -const expect = chai.expect -const PeerInfo = require('peer-info') -const PeerId = require('peer-id') -const parallel = require('async/parallel') -const pull = require('pull-stream') - -const Node = require('./browser-bundle') - -describe('libp2p-ipfs-browser (webrtc only)', () => { - let peer1 - let peer2 - let node1 - let node2 - - it('create two peerInfo with webrtc-star addrs', (done) => { - parallel([ - (cb) => PeerId.create({ bits: 1024 }, cb), - (cb) => PeerId.create({ bits: 1024 }, cb) - ], (err, ids) => { - expect(err).to.not.exist() - - peer1 = new PeerInfo(ids[0]) - const ma1 = '/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/ipfs/' + ids[0].toB58String() - peer1.multiaddrs.add(ma1) - - peer2 = new PeerInfo(ids[1]) - const ma2 = '/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/ipfs/' + ids[1].toB58String() - peer2.multiaddrs.add(ma2) - - done() - }) - }) - - it('create two libp2p nodes with those peers', (done) => { - node1 = new Node(peer1, null, { webRTCStar: true }) - node2 = new Node(peer2, null, { webRTCStar: true }) - done() - }) - - it('listen on the two libp2p nodes', (done) => { - parallel([ - (cb) => node1.start(cb), - (cb) => node2.start(cb) - ], done) - }) - - it('handle a protocol on the first node', () => { - node2.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn)) - }) - - it('dial from the second node to the first node', (done) => { - node1.dial(peer2, '/echo/1.0.0', (err, conn) => { - expect(err).to.not.exist() - setTimeout(check, 500) - - function check () { - const text = 'hello' - const peers1 = node1.peerBook.getAll() - expect(Object.keys(peers1)).to.have.length(1) - - const peers2 = node2.peerBook.getAll() - expect(Object.keys(peers2)).to.have.length(1) - - pull( - pull.values([Buffer.from(text)]), - conn, - pull.collect((err, data) => { - expect(err).to.not.exist() - expect(data[0].toString()).to.equal(text) - done() - }) - ) - } - }) - }) - - it('node1 hangUp node2', (done) => { - node1.hangUp(peer2, (err) => { - expect(err).to.not.exist() - setTimeout(check, 500) - - function check () { - const peers = node1.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(node1.swarm.muxedConns)).to.have.length(0) - done() - } - }) - }) - - it('create a third node and check that discovery works', (done) => { - let counter = 0 - - function check () { - if (++counter === 3) { - expect(Object.keys(node1.swarm.muxedConns).length).to.equal(1) - expect(Object.keys(node2.swarm.muxedConns).length).to.equal(1) - done() - } - } - - PeerId.create((err, id3) => { - expect(err).to.not.exist() - - const peer3 = new PeerInfo(id3) - const ma3 = '/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/ipfs/' + id3.toB58String() - peer3.multiaddrs.add(ma3) - - node1.on('peer:discovery', (peerInfo) => node1.dial(peerInfo, check)) - node2.on('peer:discovery', (peerInfo) => node2.dial(peerInfo, check)) - - const node3 = new Node(peer3, null, { webRTCStar: true }) - node3.start(check) - }) - }) -}) diff --git a/test/browser-bundle/websockets-only.js b/test/browser-bundle/websockets-only.js deleted file mode 100644 index 34b7ea3aaa..0000000000 --- a/test/browser-bundle/websockets-only.js +++ /dev/null @@ -1,201 +0,0 @@ -/* eslint max-nested-callbacks: ["error", 8] */ -/* eslint-env mocha */ -'use strict' - -const chai = require('chai') -chai.use(require('dirty-chai')) -const expect = chai.expect -const PeerInfo = require('peer-info') -const PeerId = require('peer-id') -const pull = require('pull-stream') -const goodbye = require('pull-goodbye') -const serializer = require('pull-serializer') -const Buffer = require('safe-buffer').Buffer - -const Node = require('./browser-bundle') -const rawPeer = require('./peer.json') - -describe('libp2p-ipfs-browser (websockets only)', () => { - let peerB - let nodeA - - before((done) => { - const ma = '/ip4/127.0.0.1/tcp/9200/ws/ipfs/' + rawPeer.id - - PeerId.createFromPrivKey(rawPeer.privKey, (err, id) => { - if (err) { - return done(err) - } - - peerB = new PeerInfo(id) - peerB.multiaddrs.add(ma) - done() - }) - }) - - after((done) => nodeA.stop(done)) - - it('create libp2pNode', (done) => { - PeerInfo.create((err, peerInfo) => { - expect(err).to.not.exist() - peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0') - - nodeA = new Node(peerInfo) - done() - }) - }) - - it('create libp2pNode with multiplex only', (done) => { - PeerInfo.create((err, peerInfo) => { - expect(err).to.not.exist() - - const b = new Node(peerInfo, null, { muxer: ['multiplex'] }) - expect(b.modules.connection.muxer).to.eql([require('libp2p-multiplex')]) - done() - }) - }) - - it('start libp2pNode', (done) => { - nodeA.start(done) - }) - - // General connectivity tests - - it('libp2p.dial using Multiaddr nodeA to nodeB', (done) => { - nodeA.dial(peerB.multiaddrs.toArray()[0], (err) => { - expect(err).to.not.exist() - - setTimeout(check, 500) // Some time for Identify to finish - - function check () { - const peers = nodeA.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - done() - } - }) - }) - - it('libp2p.dial using Multiaddr on Protocol nodeA to nodeB', (done) => { - nodeA.dial(peerB.multiaddrs.toArray()[0], '/echo/1.0.0', (err, conn) => { - expect(err).to.not.exist() - - const peers = nodeA.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - - pull( - pull.values([Buffer.from('hey')]), - conn, - pull.collect((err, data) => { - expect(err).to.not.exist() - expect(data).to.eql([Buffer.from('hey')]) - done() - }) - ) - }) - }) - - it('libp2p.hangUp using Multiaddr nodeA to nodeB', (done) => { - nodeA.hangUp(peerB.multiaddrs.toArray()[0], (err) => { - expect(err).to.not.exist() - - setTimeout(check, 500) - - function check () { - const peers = nodeA.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(0) - done() - } - }) - }) - - it('libp2p.dial using PeerInfo nodeA to nodeB', (done) => { - nodeA.dial(peerB, (err) => { - expect(err).to.not.exist() - - setTimeout(check, 500) // Some time for Identify to finish - - function check () { - const peers = nodeA.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - done() - } - }) - }) - - it('libp2p.dial using PeerInfo on Protocol nodeA to nodeB', (done) => { - nodeA.dial(peerB, '/echo/1.0.0', (err, conn) => { - expect(err).to.not.exist() - const peers = nodeA.peerBook.getAll() - expect(err).to.not.exist() - expect(Object.keys(peers)).to.have.length(1) - - pull( - pull.values([Buffer.from('hey')]), - conn, - pull.collect((err, data) => { - expect(err).to.not.exist() - expect(data).to.eql([Buffer.from('hey')]) - done() - }) - ) - }) - }) - - it('libp2p.hangUp using PeerInfo nodeA to nodeB', (done) => { - nodeA.hangUp(peerB, (err) => { - expect(err).to.not.exist() - setTimeout(check, 500) - - function check () { - const peers = nodeA.peerBook.getAll() - expect(err).to.not.exist() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(0) - done() - } - }) - }) - - describe('stress', () => { - it('one big write', (done) => { - nodeA.dial(peerB, '/echo/1.0.0', (err, conn) => { - expect(err).to.not.exist() - const rawMessage = Buffer.alloc(100000) - rawMessage.fill('a') - - const s = serializer(goodbye({ - source: pull.values([rawMessage]), - sink: pull.collect((err, results) => { - expect(err).to.not.exist() - expect(results).to.have.length(1) - expect(Buffer.from(results[0])).to.have.length(rawMessage.length) - done() - }) - })) - pull(s, conn, s) - }) - }) - - it('many writes', (done) => { - nodeA.dial(peerB, '/echo/1.0.0', (err, conn) => { - expect(err).to.not.exist() - - const s = serializer(goodbye({ - source: pull( - pull.infinite(), - pull.take(1000), - pull.map((val) => Buffer.from(val.toString())) - ), - sink: pull.collect((err, result) => { - expect(err).to.not.exist() - expect(result).to.have.length(1000) - done() - }) - })) - - pull(s, conn, s) - }) - }) - }) -}) diff --git a/test/browser.js b/test/browser.js index 6bbaf816a9..41357c9e57 100644 --- a/test/browser.js +++ b/test/browser.js @@ -1,7 +1,4 @@ 'use strict' -const w = require('webrtcsupport') - require('./base') -require('./browser-bundle/websockets-only') -if (w.support) { require('./browser-bundle/webrtc-star-only') } +require('./transports.browser') diff --git a/test/nodejs-bundle/circuit.js b/test/circuit-relay.node.js similarity index 83% rename from test/nodejs-bundle/circuit.js rename to test/circuit-relay.node.js index c90ed91f36..09e0af530c 100644 --- a/test/nodejs-bundle/circuit.js +++ b/test/circuit-relay.node.js @@ -5,7 +5,7 @@ const pull = require('pull-stream') const waterfall = require('async/waterfall') const series = require('async/series') const parallel = require('async/parallel') -const utils = require('./utils') +const utils = require('./utils/node') const Circuit = require('libp2p-circuit') const multiaddr = require('multiaddr') @@ -15,7 +15,7 @@ chai.use(require('dirty-chai')) const expect = chai.expect const sinon = require('sinon') -describe(`circuit`, function () { +describe('circuit relay', function () { let handlerSpies = [] let relayNode1 let relayNode2 @@ -51,8 +51,8 @@ describe(`circuit`, function () { waterfall([ // set up passive relay (cb) => setupNode([ - `/ip4/0.0.0.0/tcp/0/ws`, - `/ip4/0.0.0.0/tcp/0` + '/ip4/0.0.0.0/tcp/0/ws', + '/ip4/0.0.0.0/tcp/0' ], { relay: { enabled: true, @@ -67,8 +67,8 @@ describe(`circuit`, function () { }), // setup active relay (cb) => setupNode([ - `/ip4/0.0.0.0/tcp/0/ws`, - `/ip4/0.0.0.0/tcp/0` + '/ip4/0.0.0.0/tcp/0/ws', + '/ip4/0.0.0.0/tcp/0' ], { relay: { enabled: true, @@ -83,7 +83,7 @@ describe(`circuit`, function () { }), // setup node with WS (cb) => setupNode([ - `/ip4/0.0.0.0/tcp/0/ws` + '/ip4/0.0.0.0/tcp/0/ws' ], { relay: { enabled: true @@ -94,7 +94,7 @@ describe(`circuit`, function () { }), // setup node with WS (cb) => setupNode([ - `/ip4/0.0.0.0/tcp/0/ws` + '/ip4/0.0.0.0/tcp/0/ws' ], { relay: { enabled: true @@ -105,7 +105,7 @@ describe(`circuit`, function () { }), // set up node with TCP and listening on relay1 (cb) => setupNode([ - `/ip4/0.0.0.0/tcp/0`, + '/ip4/0.0.0.0/tcp/0', `/ipfs/${relayNode1.peerInfo.id.toB58String()}/p2p-circuit` ], { relay: { @@ -117,7 +117,7 @@ describe(`circuit`, function () { }), // set up node with TCP and listening on relay2 over TCP transport (cb) => setupNode([ - `/ip4/0.0.0.0/tcp/0`, + '/ip4/0.0.0.0/tcp/0', `/ip4/0.0.0.0/tcp/0/ipfs/${relayNode2.peerInfo.id.toB58String()}/p2p-circuit` ], { relay: { @@ -150,9 +150,10 @@ describe(`circuit`, function () { ], done) }) - describe(`any relay`, function () { - this.timeout(20000) - it('should dial from WS1 to TCP1 over any R', function (done) { + describe('any relay', function () { + this.timeout(20 * 1000) + + it('should dial from WS1 to TCP1 over any R', (done) => { nodeWS1.dial(nodeTCP1.peerInfo, '/echo/1.0.0', (err, conn) => { expect(err).to.not.exist() expect(conn).to.exist() @@ -160,8 +161,8 @@ describe(`circuit`, function () { pull( pull.values(['hello']), conn, - pull.collect((e, result) => { - expect(e).to.not.exist() + pull.collect((err, result) => { + expect(err).to.not.exist() expect(result[0].toString()).to.equal('hello') done() }) @@ -169,7 +170,7 @@ describe(`circuit`, function () { }) }) - it(`should not dial - no R from WS2 to TCP1`, function (done) { + it('should not dial - no R from WS2 to TCP1', (done) => { nodeWS2.dial(nodeTCP2.peerInfo, '/echo/1.0.0', (err, conn) => { expect(err).to.exist() expect(conn).to.not.exist() @@ -178,9 +179,10 @@ describe(`circuit`, function () { }) }) - describe(`explicit relay`, function () { - this.timeout(20000) - it('should dial from WS1 to TCP1 over R1', function (done) { + describe('explicit relay', function () { + this.timeout(20 * 1000) + + it('should dial from WS1 to TCP1 over R1', (done) => { nodeWS1.dial(nodeTCP1.peerInfo, '/echo/1.0.0', (err, conn) => { expect(err).to.not.exist() expect(conn).to.exist() @@ -188,8 +190,8 @@ describe(`circuit`, function () { pull( pull.values(['hello']), conn, - pull.collect((e, result) => { - expect(e).to.not.exist() + pull.collect((err, result) => { + expect(err).to.not.exist() expect(result[0].toString()).to.equal('hello') const addr = multiaddr(handlerSpies[0].args[2][0].dstPeer.addrs[0]).toString() @@ -200,7 +202,7 @@ describe(`circuit`, function () { }) }) - it(`should dial from WS1 to TCP2 over R2`, function (done) { + it('should dial from WS1 to TCP2 over R2', (done) => { nodeWS1.dial(nodeTCP2.peerInfo, '/echo/1.0.0', (err, conn) => { expect(err).to.not.exist() expect(conn).to.exist() @@ -208,8 +210,8 @@ describe(`circuit`, function () { pull( pull.values(['hello']), conn, - pull.collect((e, result) => { - expect(e).to.not.exist() + pull.collect((err, result) => { + expect(err).to.not.exist() expect(result[0].toString()).to.equal('hello') const addr = multiaddr(handlerSpies[1].args[2][0].dstPeer.addrs[0]).toString() diff --git a/test/nodejs-bundle/content-routing.js b/test/content-routing.node.js similarity index 97% rename from test/nodejs-bundle/content-routing.js rename to test/content-routing.node.js index bc47148e50..389dc0e59f 100644 --- a/test/nodejs-bundle/content-routing.js +++ b/test/content-routing.node.js @@ -7,10 +7,10 @@ const chai = require('chai') chai.use(require('dirty-chai')) const expect = chai.expect const parallel = require('async/parallel') -const utils = require('./utils') -const createNode = utils.createNode const _times = require('lodash.times') const CID = require('cids') +const utils = require('./utils/node') +const createNode = utils.createNode describe('.contentRouting', () => { let nodeA @@ -20,7 +20,7 @@ describe('.contentRouting', () => { let nodeE before(function (done) { - this.timeout(5000) + this.timeout(5 * 1000) const tasks = _times(5, () => (cb) => { createNode('/ip4/0.0.0.0/tcp/0', { mdns: false, diff --git a/test/nodejs-bundle/test-data/test-id.json b/test/fixtures/test-data/test-id.json similarity index 100% rename from test/nodejs-bundle/test-data/test-id.json rename to test/fixtures/test-data/test-id.json diff --git a/test/browser-bundle/peer.json b/test/fixtures/test-peer.json similarity index 100% rename from test/browser-bundle/peer.json rename to test/fixtures/test-peer.json diff --git a/test/node.js b/test/node.js index 2c579ab89c..6bde025de1 100644 --- a/test/node.js +++ b/test/node.js @@ -1,11 +1,9 @@ 'use strict' require('./base') -require('./nodejs-bundle/tcp') -require('./nodejs-bundle/tcp+websockets') -require('./nodejs-bundle/tcp+websockets+webrtc-star') -require('./nodejs-bundle/stream-muxing') -require('./nodejs-bundle/discovery') -require('./nodejs-bundle/peer-routing') -require('./nodejs-bundle/content-routing') -require('./nodejs-bundle/circuit') +require('./transports.node') +require('./stream-muxing.node') +require('./peer-discovery.node') +require('./peer-routing.node') +require('./content-routing.node') +require('./circuit-relay.node') diff --git a/test/nodejs-bundle/spawn-libp2p-node.js b/test/nodejs-bundle/spawn-libp2p-node.js deleted file mode 100755 index cd412074cb..0000000000 --- a/test/nodejs-bundle/spawn-libp2p-node.js +++ /dev/null @@ -1,30 +0,0 @@ -#! /usr/bin/env node - -'use strict' - -const Node = require('./nodejs-bundle') -const PeerInfo = require('peer-info') -const PeerId = require('peer-id') -const pull = require('pull-stream') - -const idBak = require('./test-data/test-id.json') - -PeerId.createFromJSON(idBak, (err, peerId) => { - if (err) { - throw err - } - - const peerInfo = new PeerInfo(peerId) - - peerInfo.multiaddrs.add('/ip4/127.0.0.1/tcp/12345') - - const node = new Node(peerInfo) - - node.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn)) - - node.start((err) => { - if (err) { throw err } - - console.log('Spawned node started, env:', process.env.LIBP2P_MUXER) - }) -}) diff --git a/test/nodejs-bundle/tcp+websockets+webrtc-star.js b/test/nodejs-bundle/tcp+websockets+webrtc-star.js deleted file mode 100644 index e4b1e183f5..0000000000 --- a/test/nodejs-bundle/tcp+websockets+webrtc-star.js +++ /dev/null @@ -1,248 +0,0 @@ -/* eslint-env mocha */ -'use strict' - -const chai = require('chai') -chai.use(require('dirty-chai')) -const expect = chai.expect -const parallel = require('async/parallel') -const signalling = require('libp2p-webrtc-star/src/sig-server') -const WStar = require('libp2p-webrtc-star') -const wrtc = require('wrtc') -const utils = require('./utils') -const createNode = utils.createNode -const echo = utils.echo - -describe('TCP + WebSockets + WebRTCStar', () => { - let nodeAll - let nodeTCP - let nodeWS - let nodeWStar - - let ss - - before(function (done) { - this.timeout(5000) - parallel([ - (cb) => { - signalling.start({ port: 24642 }, (err, server) => { - expect(err).to.not.exist() - ss = server - cb() - }) - }, - (cb) => { - const wstar = new WStar({wrtc: wrtc}) - createNode([ - '/ip4/0.0.0.0/tcp/0', - '/ip4/127.0.0.1/tcp/25011/ws', - '/ip4/127.0.0.1/tcp/24642/ws/p2p-webrtc-star' - ], { - modules: { - transport: [wstar], - discovery: [wstar.discovery] - } - }, (err, node) => { - expect(err).to.not.exist() - nodeAll = node - node.handle('/echo/1.0.0', echo) - node.start(cb) - }) - }, - (cb) => createNode([ - '/ip4/0.0.0.0/tcp/0' - ], (err, node) => { - expect(err).to.not.exist() - nodeTCP = node - node.handle('/echo/1.0.0', echo) - node.start(cb) - }), - (cb) => createNode([ - '/ip4/127.0.0.1/tcp/25022/ws' - ], (err, node) => { - expect(err).to.not.exist() - nodeWS = node - node.handle('/echo/1.0.0', echo) - node.start(cb) - }), - - (cb) => { - const wstar = new WStar({wrtc: wrtc}) - - createNode([ - '/ip4/127.0.0.1/tcp/24642/ws/p2p-webrtc-star' - ], { - modules: { - transport: [wstar], - discovery: [wstar.discovery] - } - }, (err, node) => { - expect(err).to.not.exist() - nodeWStar = node - node.handle('/echo/1.0.0', echo) - node.start(cb) - }) - } - ], done) - }) - - after((done) => { - parallel([ - (cb) => nodeAll.stop(cb), - (cb) => nodeTCP.stop(cb), - (cb) => nodeWS.stop(cb), - (cb) => nodeWStar.stop(cb), - (cb) => ss.stop(done) - ], done) - }) - - it('nodeAll.dial nodeTCP using PeerInfo', (done) => { - nodeAll.dial(nodeTCP.peerInfo, (err) => { - expect(err).to.not.exist() - - // Some time for Identify to finish - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeAll.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeAll.swarm.muxedConns)).to.have.length(1) - cb() - }, - (cb) => { - const peers = nodeTCP.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeTCP.swarm.muxedConns)).to.have.length(1) - cb() - } - ], done) - } - }) - }) - - it('nodeAll.hangUp nodeTCP using PeerInfo', (done) => { - nodeAll.hangUp(nodeTCP.peerInfo, (err) => { - expect(err).to.not.exist() - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeAll.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeAll.swarm.muxedConns)).to.have.length(0) - cb() - }, - (cb) => { - const peers = nodeTCP.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeTCP.swarm.muxedConns)).to.have.length(0) - cb() - } - ], done) - } - }) - }) - - it('nodeAll.dial nodeWS using PeerInfo', (done) => { - nodeAll.dial(nodeWS.peerInfo, (err) => { - expect(err).to.not.exist() - - // Some time for Identify to finish - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeAll.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(2) - expect(Object.keys(nodeAll.swarm.muxedConns)).to.have.length(1) - cb() - }, - (cb) => { - const peers = nodeWS.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeWS.swarm.muxedConns)).to.have.length(1) - cb() - } - ], done) - } - }) - }) - - it('nodeAll.hangUp nodeWS using PeerInfo', (done) => { - nodeAll.hangUp(nodeWS.peerInfo, (err) => { - expect(err).to.not.exist() - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeAll.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(2) - expect(Object.keys(nodeAll.swarm.muxedConns)).to.have.length(0) - cb() - }, - (cb) => { - const peers = nodeWS.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeWS.swarm.muxedConns)).to.have.length(0) - cb() - } - ], done) - } - }) - }) - - it('nodeAll.dial nodeWStar using PeerInfo', function (done) { - this.timeout(10000) - nodeAll.dial(nodeWStar.peerInfo, (err) => { - expect(err).to.not.exist() - - // Some time for Identify to finish - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeAll.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(3) - expect(Object.keys(nodeAll.swarm.muxedConns)).to.have.length(1) - cb() - }, - (cb) => { - const peers = nodeWStar.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeAll.swarm.muxedConns)).to.have.length(1) - cb() - } - ], done) - } - }) - }) - - it('nodeAll.hangUp nodeWStar using PeerInfo', (done) => { - nodeAll.hangUp(nodeWStar.peerInfo, (err) => { - expect(err).to.not.exist() - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeAll.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(3) - expect(Object.keys(nodeAll.swarm.muxedConns)).to.have.length(0) - cb() - }, - (cb) => { - const peers = nodeWStar.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeWStar.swarm.muxedConns)).to.have.length(0) - cb() - } - ], done) - } - }) - }) -}) diff --git a/test/nodejs-bundle/tcp+websockets.js b/test/nodejs-bundle/tcp+websockets.js deleted file mode 100644 index 609eedea27..0000000000 --- a/test/nodejs-bundle/tcp+websockets.js +++ /dev/null @@ -1,167 +0,0 @@ -/* eslint-env mocha */ -'use strict' - -const chai = require('chai') -chai.use(require('dirty-chai')) -const expect = chai.expect -const parallel = require('async/parallel') -// const multiaddr = require('multiaddr') -// const pull = require('pull-stream') -const utils = require('./utils') -const createNode = utils.createNode -const echo = utils.echo - -describe('TCP + WebSockets', () => { - let nodeTCP - let nodeTCPnWS - let nodeWS - - before((done) => { - parallel([ - (cb) => createNode([ - '/ip4/0.0.0.0/tcp/0' - ], (err, node) => { - expect(err).to.not.exist() - nodeTCP = node - node.handle('/echo/1.0.0', echo) - node.start(cb) - }), - (cb) => createNode([ - '/ip4/0.0.0.0/tcp/0', - '/ip4/127.0.0.1/tcp/25011/ws' - ], (err, node) => { - expect(err).to.not.exist() - nodeTCPnWS = node - node.handle('/echo/1.0.0', echo) - node.start(cb) - }), - (cb) => createNode([ - '/ip4/127.0.0.1/tcp/25022/ws' - ], (err, node) => { - expect(err).to.not.exist() - nodeWS = node - node.handle('/echo/1.0.0', echo) - node.start(cb) - }) - ], done) - }) - - after((done) => { - parallel([ - (cb) => nodeTCP.stop(cb), - (cb) => nodeTCPnWS.stop(cb), - (cb) => nodeWS.stop(cb) - ], done) - }) - - it('nodeTCP.dial nodeTCPnWS using PeerInfo', (done) => { - nodeTCP.dial(nodeTCPnWS.peerInfo, (err) => { - expect(err).to.not.exist() - - // Some time for Identify to finish - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeTCP.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeTCP.swarm.muxedConns)).to.have.length(1) - cb() - }, - (cb) => { - const peers = nodeTCPnWS.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeTCPnWS.swarm.muxedConns)).to.have.length(1) - cb() - } - ], done) - } - }) - }) - - it('nodeTCP.hangUp nodeTCPnWS using PeerInfo', (done) => { - nodeTCP.hangUp(nodeTCPnWS.peerInfo, (err) => { - expect(err).to.not.exist() - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeTCP.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeTCP.swarm.muxedConns)).to.have.length(0) - - cb() - }, - (cb) => { - const peers = nodeTCPnWS.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeTCPnWS.swarm.muxedConns)).to.have.length(0) - cb() - } - ], done) - } - }) - }) - - it('nodeTCPnWS.dial nodeWS using PeerInfo', (done) => { - nodeTCPnWS.dial(nodeWS.peerInfo, (err) => { - expect(err).to.not.exist() - - // Some time for Identify to finish - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeTCPnWS.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(2) - expect(Object.keys(nodeTCPnWS.swarm.muxedConns)).to.have.length(1) - cb() - }, - (cb) => { - const peers = nodeWS.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeWS.swarm.muxedConns)).to.have.length(1) - cb() - } - ], done) - } - }) - }) - - it('nodeTCPnWS.hangUp nodeWS using PeerInfo', (done) => { - nodeTCPnWS.hangUp(nodeWS.peerInfo, (err) => { - expect(err).to.not.exist() - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeTCPnWS.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(2) - expect(Object.keys(nodeTCPnWS.swarm.muxedConns)).to.have.length(0) - - cb() - }, - (cb) => { - const peers = nodeWS.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeWS.swarm.muxedConns)).to.have.length(0) - cb() - } - ], done) - } - }) - }) - - // Until https://github.com/libp2p/js-libp2p/issues/46 is resolved - // Everynode will be able to dial in WebSockets - it.skip('nodeTCP.dial nodeWS using PeerInfo is unsuccesful', (done) => { - nodeTCP.dial(nodeWS.peerInfo, (err) => { - expect(err).to.exist() - done() - }) - }) -}) diff --git a/test/nodejs-bundle/tcp.js b/test/nodejs-bundle/tcp.js deleted file mode 100644 index a8b4cb4aae..0000000000 --- a/test/nodejs-bundle/tcp.js +++ /dev/null @@ -1,234 +0,0 @@ -/* eslint-env mocha */ -'use strict' - -const chai = require('chai') -chai.use(require('dirty-chai')) -const expect = chai.expect -const parallel = require('async/parallel') -const series = require('async/series') -const pull = require('pull-stream') -const utils = require('./utils') -const createNode = utils.createNode -const echo = utils.echo - -describe('TCP only', () => { - let nodeA - let nodeB - - before((done) => { - parallel([ - (cb) => createNode('/ip4/0.0.0.0/tcp/0', (err, node) => { - expect(err).to.not.exist() - nodeA = node - node.handle('/echo/1.0.0', echo) - node.start(cb) - }), - (cb) => createNode('/ip4/0.0.0.0/tcp/0', (err, node) => { - expect(err).to.not.exist() - nodeB = node - node.handle('/echo/1.0.0', echo) - node.start(cb) - }) - ], done) - }) - - after((done) => { - parallel([ - (cb) => nodeA.stop(cb), - (cb) => nodeB.stop(cb) - ], done) - }) - - it('nodeA.dial nodeB using PeerInfo without proto (warmup)', (done) => { - nodeA.dial(nodeB.peerInfo, (err) => { - expect(err).to.not.exist() - - // Some time for Identify to finish - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeA.peerBook.getAll() - expect(err).to.not.exist() - expect(Object.keys(peers)).to.have.length(1) - cb() - }, - (cb) => { - const peers = nodeB.peerBook.getAll() - expect(err).to.not.exist() - expect(Object.keys(peers)).to.have.length(1) - cb() - } - ], done) - } - }) - }) - - it('nodeA.dial nodeB using PeerInfo', (done) => { - nodeA.dial(nodeB.peerInfo, '/echo/1.0.0', (err, conn) => { - expect(err).to.not.exist() - - pull( - pull.values([Buffer.from('hey')]), - conn, - pull.collect((err, data) => { - expect(err).to.not.exist() - expect(data).to.be.eql([Buffer.from('hey')]) - done() - }) - ) - }) - }) - - it('nodeA.hangUp nodeB using PeerInfo (first)', (done) => { - nodeA.hangUp(nodeB.peerInfo, (err) => { - expect(err).to.not.exist() - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeA.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(0) - cb() - }, - (cb) => { - const peers = nodeB.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - - expect(Object.keys(nodeB.swarm.muxedConns)).to.have.length(0) - cb() - } - ], done) - } - }) - }) - - it('nodeA.dial nodeB using multiaddr', (done) => { - nodeA.dial(nodeB.peerInfo.multiaddrs.toArray()[0], '/echo/1.0.0', (err, conn) => { - // Some time for Identify to finish - setTimeout(check, 500) - - function check () { - expect(err).to.not.exist() - series([ - (cb) => { - const peers = nodeA.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - - expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(1) - cb() - }, - (cb) => { - const peers = nodeB.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - - expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(1) - cb() - } - ], () => { - pull( - pull.values([Buffer.from('hey')]), - conn, - pull.collect((err, data) => { - expect(err).to.not.exist() - expect(data).to.be.eql([Buffer.from('hey')]) - done() - }) - ) - }) - } - }) - }) - - it('nodeA.hangUp nodeB using multiaddr (second)', (done) => { - nodeA.hangUp(nodeB.peerInfo.multiaddrs.toArray()[0], (err) => { - expect(err).to.not.exist() - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeA.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - - expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(0) - cb() - }, - (cb) => { - const peers = nodeB.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - - expect(Object.keys(nodeB.swarm.muxedConns)).to.have.length(0) - cb() - } - ], done) - } - }) - }) - - it('nodeA.dial nodeB using PeerId', (done) => { - nodeA.dial(nodeB.peerInfo.id, '/echo/1.0.0', (err, conn) => { - // Some time for Identify to finish - setTimeout(check, 500) - - function check () { - expect(err).to.not.exist() - series([ - (cb) => { - const peers = nodeA.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - - expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(1) - cb() - }, - (cb) => { - const peers = nodeB.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - - expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(1) - cb() - } - ], () => { - pull( - pull.values([Buffer.from('hey')]), - conn, - pull.collect((err, data) => { - expect(err).to.not.exist() - expect(data).to.be.eql([Buffer.from('hey')]) - done() - }) - ) - }) - } - }) - }) - - it('nodeA.hangUp nodeB using PeerId (third)', (done) => { - nodeA.hangUp(nodeB.peerInfo.multiaddrs.toArray()[0], (err) => { - expect(err).to.not.exist() - setTimeout(check, 500) - - function check () { - parallel([ - (cb) => { - const peers = nodeA.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - - expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(0) - cb() - }, - (cb) => { - const peers = nodeB.peerBook.getAll() - expect(Object.keys(peers)).to.have.length(1) - - expect(Object.keys(nodeB.swarm.muxedConns)).to.have.length(0) - cb() - } - ], done) - } - }) - }) -}) diff --git a/test/nodejs-bundle/discovery.js b/test/peer-discovery.node.js similarity index 93% rename from test/nodejs-bundle/discovery.js rename to test/peer-discovery.node.js index bdaf5ad858..d82b4e4c95 100644 --- a/test/nodejs-bundle/discovery.js +++ b/test/peer-discovery.node.js @@ -6,11 +6,11 @@ chai.use(require('dirty-chai')) const expect = chai.expect const signalling = require('libp2p-webrtc-star/src/sig-server') const parallel = require('async/parallel') -const utils = require('./utils') +const utils = require('./utils/node') const createNode = utils.createNode const echo = utils.echo -describe('discovery', () => { +describe('peer discovery', () => { let nodeA let nodeB let port = 24642 @@ -61,7 +61,8 @@ describe('discovery', () => { setup({ mdns: true }) it('find a peer', function (done) { - this.timeout(15000) + this.timeout(15 * 1000) + nodeA.once('peer:discovery', (peerInfo) => { expect(nodeB.peerInfo.id.toB58String()) .to.eql(peerInfo.id.toB58String()) @@ -75,7 +76,7 @@ describe('discovery', () => { setup({ webRTCStar: true }) it('find a peer', function (done) { - this.timeout(15000) + this.timeout(15 * 1000) nodeA.once('peer:discovery', (peerInfo) => { expect(nodeB.peerInfo.id.toB58String()) .to.eql(peerInfo.id.toB58String()) @@ -91,7 +92,7 @@ describe('discovery', () => { }) it('find a peer', function (done) { - this.timeout(15000) + this.timeout(15 * 1000) nodeA.once('peer:discovery', (peerInfo) => { expect(nodeB.peerInfo.id.toB58String()) .to.eql(peerInfo.id.toB58String()) diff --git a/test/nodejs-bundle/peer-routing.js b/test/peer-routing.node.js similarity index 97% rename from test/nodejs-bundle/peer-routing.js rename to test/peer-routing.node.js index fb2e5611bd..ec34eb7f24 100644 --- a/test/nodejs-bundle/peer-routing.js +++ b/test/peer-routing.node.js @@ -7,9 +7,9 @@ const chai = require('chai') chai.use(require('dirty-chai')) const expect = chai.expect const parallel = require('async/parallel') -const utils = require('./utils') -const createNode = utils.createNode const _times = require('lodash.times') +const utils = require('./utils/node') +const createNode = utils.createNode describe('.peerRouting', () => { let nodeA @@ -19,7 +19,8 @@ describe('.peerRouting', () => { let nodeE before(function (done) { - this.timeout(5000) + this.timeout(5 * 1000) + const tasks = _times(5, () => (cb) => { createNode('/ip4/0.0.0.0/tcp/0', { mdns: false, diff --git a/test/nodejs-bundle/stream-muxing.js b/test/stream-muxing.node.js similarity index 98% rename from test/nodejs-bundle/stream-muxing.js rename to test/stream-muxing.node.js index bf9eb5aeb4..1c00722d8c 100644 --- a/test/nodejs-bundle/stream-muxing.js +++ b/test/stream-muxing.node.js @@ -7,7 +7,7 @@ const expect = chai.expect const parallel = require('async/parallel') const series = require('async/series') const pull = require('pull-stream') -const utils = require('./utils') +const utils = require('./utils/node') const createNode = utils.createNode const echo = utils.echo @@ -36,7 +36,7 @@ function teardown (nodeA, nodeB, callback) { describe('stream muxing', () => { it('spdy only', function (done) { - this.timeout(5000) + this.timeout(5 * 1000) let nodeA let nodeB diff --git a/test/transports.browser.js b/test/transports.browser.js new file mode 100644 index 0000000000..01808df20f --- /dev/null +++ b/test/transports.browser.js @@ -0,0 +1,424 @@ +/* eslint max-nested-callbacks: ["error", 8] */ +/* eslint-env mocha */ +'use strict' + +const chai = require('chai') +chai.use(require('dirty-chai')) +const expect = chai.expect +const PeerInfo = require('peer-info') +const PeerId = require('peer-id') +const pull = require('pull-stream') +const parallel = require('async/parallel') +const goodbye = require('pull-goodbye') +const serializer = require('pull-serializer') +const w = require('webrtcsupport') + +const Node = require('./utils/bundle.browser') +const rawPeer = require('./fixtures/test-peer.json') + +describe('transports', () => { + describe('websockets', () => { + let peerB + let nodeA + + before((done) => { + const ma = '/ip4/127.0.0.1/tcp/9200/ws/ipfs/' + rawPeer.id + + PeerId.createFromPrivKey(rawPeer.privKey, (err, id) => { + if (err) { + return done(err) + } + + peerB = new PeerInfo(id) + peerB.multiaddrs.add(ma) + done() + }) + }) + + after((done) => nodeA.stop(done)) + + it('create libp2pNode', (done) => { + PeerInfo.create((err, peerInfo) => { + expect(err).to.not.exist() + peerInfo.multiaddrs.add('/ip4/0.0.0.0/tcp/0') + + nodeA = new Node(peerInfo) + done() + }) + }) + + it('create libp2pNode with multiplex only', (done) => { + PeerInfo.create((err, peerInfo) => { + expect(err).to.not.exist() + + const b = new Node(peerInfo, null, { muxer: ['multiplex'] }) + expect(b.modules.connection.muxer).to.eql([require('libp2p-multiplex')]) + done() + }) + }) + + it('start libp2pNode', (done) => { + nodeA.start(done) + }) + + // General connectivity tests + + it('libp2p.dial using Multiaddr nodeA to nodeB', (done) => { + nodeA.dial(peerB.multiaddrs.toArray()[0], (err) => { + expect(err).to.not.exist() + + setTimeout(check, 500) // Some time for Identify to finish + + function check () { + const peers = nodeA.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + done() + } + }) + }) + + it('libp2p.dial using Multiaddr on Protocol nodeA to nodeB', (done) => { + nodeA.dial(peerB.multiaddrs.toArray()[0], '/echo/1.0.0', (err, conn) => { + expect(err).to.not.exist() + + const peers = nodeA.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + + pull( + pull.values([Buffer.from('hey')]), + conn, + pull.collect((err, data) => { + expect(err).to.not.exist() + expect(data).to.eql([Buffer.from('hey')]) + done() + }) + ) + }) + }) + + it('libp2p.hangUp using Multiaddr nodeA to nodeB', (done) => { + nodeA.hangUp(peerB.multiaddrs.toArray()[0], (err) => { + expect(err).to.not.exist() + + setTimeout(check, 500) + + function check () { + const peers = nodeA.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(0) + done() + } + }) + }) + + it('libp2p.dial using PeerInfo nodeA to nodeB', (done) => { + nodeA.dial(peerB, (err) => { + expect(err).to.not.exist() + + setTimeout(check, 500) // Some time for Identify to finish + + function check () { + const peers = nodeA.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + done() + } + }) + }) + + it('libp2p.dial using PeerInfo on Protocol nodeA to nodeB', (done) => { + nodeA.dial(peerB, '/echo/1.0.0', (err, conn) => { + expect(err).to.not.exist() + const peers = nodeA.peerBook.getAll() + expect(err).to.not.exist() + expect(Object.keys(peers)).to.have.length(1) + + pull( + pull.values([Buffer.from('hey')]), + conn, + pull.collect((err, data) => { + expect(err).to.not.exist() + expect(data).to.eql([Buffer.from('hey')]) + done() + }) + ) + }) + }) + + it('libp2p.hangUp using PeerInfo nodeA to nodeB', (done) => { + nodeA.hangUp(peerB, (err) => { + expect(err).to.not.exist() + setTimeout(check, 500) + + function check () { + const peers = nodeA.peerBook.getAll() + expect(err).to.not.exist() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(0) + done() + } + }) + }) + + describe('stress', () => { + it('one big write', (done) => { + nodeA.dial(peerB, '/echo/1.0.0', (err, conn) => { + expect(err).to.not.exist() + const rawMessage = Buffer.alloc(100000) + rawMessage.fill('a') + + const s = serializer(goodbye({ + source: pull.values([rawMessage]), + sink: pull.collect((err, results) => { + expect(err).to.not.exist() + expect(results).to.have.length(1) + expect(Buffer.from(results[0])).to.have.length(rawMessage.length) + done() + }) + })) + pull(s, conn, s) + }) + }) + + it('many writes', (done) => { + nodeA.dial(peerB, '/echo/1.0.0', (err, conn) => { + expect(err).to.not.exist() + + const s = serializer(goodbye({ + source: pull( + pull.infinite(), + pull.take(1000), + pull.map((val) => Buffer.from(val.toString())) + ), + sink: pull.collect((err, result) => { + expect(err).to.not.exist() + expect(result).to.have.length(1000) + done() + }) + })) + + pull(s, conn, s) + }) + }) + }) + }) + + describe('webrtc-star', () => { + if (!w.support) { return console.log('NO WEBRTC SUPPORT') } + + let peer1 + let peer2 + let node1 + let node2 + + it('create two peerInfo with webrtc-star addrs', (done) => { + parallel([ + (cb) => PeerId.create({ bits: 1024 }, cb), + (cb) => PeerId.create({ bits: 1024 }, cb) + ], (err, ids) => { + expect(err).to.not.exist() + + peer1 = new PeerInfo(ids[0]) + const ma1 = '/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/ipfs/' + ids[0].toB58String() + peer1.multiaddrs.add(ma1) + + peer2 = new PeerInfo(ids[1]) + const ma2 = '/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/ipfs/' + ids[1].toB58String() + peer2.multiaddrs.add(ma2) + + done() + }) + }) + + it('create two libp2p nodes with those peers', (done) => { + node1 = new Node(peer1, null, { webRTCStar: true }) + node2 = new Node(peer2, null, { webRTCStar: true }) + done() + }) + + it('listen on the two libp2p nodes', (done) => { + parallel([ + (cb) => node1.start(cb), + (cb) => node2.start(cb) + ], done) + }) + + it('handle a protocol on the first node', () => { + node2.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn)) + }) + + it('dial from the second node to the first node', (done) => { + node1.dial(peer2, '/echo/1.0.0', (err, conn) => { + expect(err).to.not.exist() + setTimeout(check, 500) + + function check () { + const text = 'hello' + const peers1 = node1.peerBook.getAll() + expect(Object.keys(peers1)).to.have.length(1) + + const peers2 = node2.peerBook.getAll() + expect(Object.keys(peers2)).to.have.length(1) + + pull( + pull.values([Buffer.from(text)]), + conn, + pull.collect((err, data) => { + expect(err).to.not.exist() + expect(data[0].toString()).to.equal(text) + done() + }) + ) + } + }) + }) + + it('node1 hangUp node2', (done) => { + node1.hangUp(peer2, (err) => { + expect(err).to.not.exist() + setTimeout(check, 500) + + function check () { + const peers = node1.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(node1.swarm.muxedConns)).to.have.length(0) + done() + } + }) + }) + + it('create a third node and check that discovery works', (done) => { + let counter = 0 + + function check () { + if (++counter === 3) { + expect(Object.keys(node1.swarm.muxedConns).length).to.equal(1) + expect(Object.keys(node2.swarm.muxedConns).length).to.equal(1) + done() + } + } + + PeerId.create((err, id3) => { + expect(err).to.not.exist() + + const peer3 = new PeerInfo(id3) + const ma3 = '/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/ipfs/' + id3.toB58String() + peer3.multiaddrs.add(ma3) + + node1.on('peer:discovery', (peerInfo) => node1.dial(peerInfo, check)) + node2.on('peer:discovery', (peerInfo) => node2.dial(peerInfo, check)) + + const node3 = new Node(peer3, null, { webRTCStar: true }) + node3.start(check) + }) + }) + }) + + describe('websocket-star', () => { + let peer1 + let peer2 + let node1 + let node2 + + it('create two peerInfo with websocket-star addrs', (done) => { + parallel([ + (cb) => PeerId.create({ bits: 1024 }, cb), + (cb) => PeerId.create({ bits: 1024 }, cb) + ], (err, ids) => { + expect(err).to.not.exist() + + peer1 = new PeerInfo(ids[0]) + const ma1 = '/ip4/127.0.0.1/tcp/14444/ws/p2p-websocket-star/' + peer1.multiaddrs.add(ma1) + + peer2 = new PeerInfo(ids[1]) + const ma2 = '/ip4/127.0.0.1/tcp/14444/ws/p2p-websocket-star/' + peer2.multiaddrs.add(ma2) + + done() + }) + }) + + it('create two libp2p nodes with those peers', (done) => { + node1 = new Node(peer1, null, { wsStar: true }) + node2 = new Node(peer2, null, { wsStar: true }) + done() + }) + + it('listen on the two libp2p nodes', (done) => { + parallel([ + (cb) => node1.start(cb), + (cb) => node2.start(cb) + ], done) + }) + + it('handle a protocol on the first node', () => { + node2.handle('/echo/1.0.0', (protocol, conn) => pull(conn, conn)) + }) + + it('dial from the second node to the first node', (done) => { + node1.dial(peer2, '/echo/1.0.0', (err, conn) => { + expect(err).to.not.exist() + setTimeout(check, 500) + + function check () { + const text = 'hello' + const peers1 = node1.peerBook.getAll() + expect(Object.keys(peers1)).to.have.length(1) + + const peers2 = node2.peerBook.getAll() + expect(Object.keys(peers2)).to.have.length(1) + + pull( + pull.values([Buffer.from(text)]), + conn, + pull.collect((err, data) => { + expect(err).to.not.exist() + expect(data[0].toString()).to.equal(text) + done() + }) + ) + } + }) + }) + + it('node1 hangUp node2', (done) => { + node1.hangUp(peer2, (err) => { + expect(err).to.not.exist() + setTimeout(check, 500) + + function check () { + const peers = node1.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(node1.swarm.muxedConns)).to.have.length(0) + done() + } + }) + }) + + it('create a third node and check that discovery works', (done) => { + let counter = 0 + + function check () { + if (++counter === 3) { + expect(Object.keys(node1.swarm.muxedConns).length).to.equal(1) + expect(Object.keys(node2.swarm.muxedConns).length).to.equal(1) + done() + } + } + + PeerId.create((err, id3) => { + expect(err).to.not.exist() + + const peer3 = new PeerInfo(id3) + const ma3 = '/ip4/127.0.0.1/tcp/14444/ws/p2p-websocket-star/ipfs/' + id3.toB58String() + peer3.multiaddrs.add(ma3) + + node1.on('peer:discovery', (peerInfo) => node1.dial(peerInfo, check)) + node2.on('peer:discovery', (peerInfo) => node2.dial(peerInfo, check)) + + const node3 = new Node(peer3, null, { wsStar: true }) + node3.start(check) + }) + }) + }) +}) diff --git a/test/transports.node.js b/test/transports.node.js new file mode 100644 index 0000000000..413f27939e --- /dev/null +++ b/test/transports.node.js @@ -0,0 +1,678 @@ +/* eslint-env mocha */ +'use strict' + +const chai = require('chai') +chai.use(require('dirty-chai')) +const expect = chai.expect +const parallel = require('async/parallel') +const series = require('async/series') +const pull = require('pull-stream') +const utils = require('./utils/node.js') +const signalling = require('libp2p-webrtc-star/src/sig-server') +const rendezvous = require('libp2p-websocket-star-rendezvous') +const WSStar = require('libp2p-websocket-star') +const WRTCStar = require('libp2p-webrtc-star') +const wrtc = require('wrtc') + +const createNode = utils.createNode +const echo = utils.echo + +describe('transports', () => { + describe('TCP only', () => { + let nodeA + let nodeB + + before((done) => { + parallel([ + (cb) => createNode('/ip4/0.0.0.0/tcp/0', (err, node) => { + expect(err).to.not.exist() + nodeA = node + node.handle('/echo/1.0.0', echo) + node.start(cb) + }), + (cb) => createNode('/ip4/0.0.0.0/tcp/0', (err, node) => { + expect(err).to.not.exist() + nodeB = node + node.handle('/echo/1.0.0', echo) + node.start(cb) + }) + ], done) + }) + + after((done) => { + parallel([ + (cb) => nodeA.stop(cb), + (cb) => nodeB.stop(cb) + ], done) + }) + + it('nodeA.dial nodeB using PeerInfo without proto (warmup)', (done) => { + nodeA.dial(nodeB.peerInfo, (err) => { + expect(err).to.not.exist() + + // Some time for Identify to finish + setTimeout(check, 500) + + function check () { + parallel([ + (cb) => { + const peers = nodeA.peerBook.getAll() + expect(err).to.not.exist() + expect(Object.keys(peers)).to.have.length(1) + cb() + }, + (cb) => { + const peers = nodeB.peerBook.getAll() + expect(err).to.not.exist() + expect(Object.keys(peers)).to.have.length(1) + cb() + } + ], done) + } + }) + }) + + it('nodeA.dial nodeB using PeerInfo', (done) => { + nodeA.dial(nodeB.peerInfo, '/echo/1.0.0', (err, conn) => { + expect(err).to.not.exist() + + pull( + pull.values([Buffer.from('hey')]), + conn, + pull.collect((err, data) => { + expect(err).to.not.exist() + expect(data).to.be.eql([Buffer.from('hey')]) + done() + }) + ) + }) + }) + + it('nodeA.hangUp nodeB using PeerInfo (first)', (done) => { + nodeA.hangUp(nodeB.peerInfo, (err) => { + expect(err).to.not.exist() + setTimeout(check, 500) + + function check () { + parallel([ + (cb) => { + const peers = nodeA.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(0) + cb() + }, + (cb) => { + const peers = nodeB.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + + expect(Object.keys(nodeB.swarm.muxedConns)).to.have.length(0) + cb() + } + ], done) + } + }) + }) + + it('nodeA.dial nodeB using multiaddr', (done) => { + nodeA.dial(nodeB.peerInfo.multiaddrs.toArray()[0], '/echo/1.0.0', (err, conn) => { + // Some time for Identify to finish + setTimeout(check, 500) + + function check () { + expect(err).to.not.exist() + series([ + (cb) => { + const peers = nodeA.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + + expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(1) + cb() + }, + (cb) => { + const peers = nodeB.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + + expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(1) + cb() + } + ], () => { + pull( + pull.values([Buffer.from('hey')]), + conn, + pull.collect((err, data) => { + expect(err).to.not.exist() + expect(data).to.be.eql([Buffer.from('hey')]) + done() + }) + ) + }) + } + }) + }) + + it('nodeA.hangUp nodeB using multiaddr (second)', (done) => { + nodeA.hangUp(nodeB.peerInfo.multiaddrs.toArray()[0], (err) => { + expect(err).to.not.exist() + setTimeout(check, 500) + + function check () { + parallel([ + (cb) => { + const peers = nodeA.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + + expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(0) + cb() + }, + (cb) => { + const peers = nodeB.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + + expect(Object.keys(nodeB.swarm.muxedConns)).to.have.length(0) + cb() + } + ], done) + } + }) + }) + + it('nodeA.dial nodeB using PeerId', (done) => { + nodeA.dial(nodeB.peerInfo.id, '/echo/1.0.0', (err, conn) => { + // Some time for Identify to finish + setTimeout(check, 500) + + function check () { + expect(err).to.not.exist() + series([ + (cb) => { + const peers = nodeA.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(1) + cb() + }, + (cb) => { + const peers = nodeB.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(1) + cb() + } + ], () => { + pull( + pull.values([Buffer.from('hey')]), + conn, + pull.collect((err, data) => { + expect(err).to.not.exist() + expect(data).to.eql([Buffer.from('hey')]) + done() + }) + ) + }) + } + }) + }) + + it('nodeA.hangUp nodeB using PeerId (third)', (done) => { + nodeA.hangUp(nodeB.peerInfo.multiaddrs.toArray()[0], (err) => { + expect(err).to.not.exist() + setTimeout(check, 500) + + function check () { + parallel([ + (cb) => { + const peers = nodeA.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeA.swarm.muxedConns)).to.have.length(0) + cb() + }, + (cb) => { + const peers = nodeB.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeB.swarm.muxedConns)).to.have.length(0) + cb() + } + ], done) + } + }) + }) + }) + + describe('TCP + WebSockets', () => { + let nodeTCP + let nodeTCPnWS + let nodeWS + + before((done) => { + parallel([ + (cb) => createNode([ + '/ip4/0.0.0.0/tcp/0' + ], (err, node) => { + expect(err).to.not.exist() + nodeTCP = node + node.handle('/echo/1.0.0', echo) + node.start(cb) + }), + (cb) => createNode([ + '/ip4/0.0.0.0/tcp/0', + '/ip4/127.0.0.1/tcp/25011/ws' + ], (err, node) => { + expect(err).to.not.exist() + nodeTCPnWS = node + node.handle('/echo/1.0.0', echo) + node.start(cb) + }), + (cb) => createNode([ + '/ip4/127.0.0.1/tcp/25022/ws' + ], (err, node) => { + expect(err).to.not.exist() + nodeWS = node + node.handle('/echo/1.0.0', echo) + node.start(cb) + }) + ], done) + }) + + after((done) => { + parallel([ + (cb) => nodeTCP.stop(cb), + (cb) => nodeTCPnWS.stop(cb), + (cb) => nodeWS.stop(cb) + ], done) + }) + + it('nodeTCP.dial nodeTCPnWS using PeerInfo', (done) => { + nodeTCP.dial(nodeTCPnWS.peerInfo, (err) => { + expect(err).to.not.exist() + + // Some time for Identify to finish + setTimeout(check, 500) + + function check () { + parallel([ + (cb) => { + const peers = nodeTCP.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeTCP.swarm.muxedConns)).to.have.length(1) + cb() + }, + (cb) => { + const peers = nodeTCPnWS.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeTCPnWS.swarm.muxedConns)).to.have.length(1) + cb() + } + ], done) + } + }) + }) + + it('nodeTCP.hangUp nodeTCPnWS using PeerInfo', (done) => { + nodeTCP.hangUp(nodeTCPnWS.peerInfo, (err) => { + expect(err).to.not.exist() + setTimeout(check, 500) + + function check () { + parallel([ + (cb) => { + const peers = nodeTCP.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeTCP.swarm.muxedConns)).to.have.length(0) + + cb() + }, + (cb) => { + const peers = nodeTCPnWS.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeTCPnWS.swarm.muxedConns)).to.have.length(0) + cb() + } + ], done) + } + }) + }) + + it('nodeTCPnWS.dial nodeWS using PeerInfo', (done) => { + nodeTCPnWS.dial(nodeWS.peerInfo, (err) => { + expect(err).to.not.exist() + + // Some time for Identify to finish + setTimeout(check, 500) + + function check () { + parallel([ + (cb) => { + const peers = nodeTCPnWS.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(2) + expect(Object.keys(nodeTCPnWS.swarm.muxedConns)).to.have.length(1) + cb() + }, + (cb) => { + const peers = nodeWS.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeWS.swarm.muxedConns)).to.have.length(1) + cb() + } + ], done) + } + }) + }) + + it('nodeTCPnWS.hangUp nodeWS using PeerInfo', (done) => { + nodeTCPnWS.hangUp(nodeWS.peerInfo, (err) => { + expect(err).to.not.exist() + setTimeout(check, 500) + + function check () { + parallel([ + (cb) => { + const peers = nodeTCPnWS.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(2) + expect(Object.keys(nodeTCPnWS.swarm.muxedConns)).to.have.length(0) + + cb() + }, + (cb) => { + const peers = nodeWS.peerBook.getAll() + expect(Object.keys(peers)).to.have.length(1) + expect(Object.keys(nodeWS.swarm.muxedConns)).to.have.length(0) + cb() + } + ], done) + } + }) + }) + + // Until https://github.com/libp2p/js-libp2p/issues/46 is resolved + // Everynode will be able to dial in WebSockets + it.skip('nodeTCP.dial nodeWS using PeerInfo is unsuccesful', (done) => { + nodeTCP.dial(nodeWS.peerInfo, (err) => { + expect(err).to.exist() + done() + }) + }) + }) + + describe('TCP + WebSockets + WebRTCStar', () => { + let nodeAll + let nodeTCP + let nodeWS + let nodeWStar + + let ss + + before(function (done) { + this.timeout(5 * 1000) + + parallel([ + (cb) => { + signalling.start({ port: 24642 }, (err, server) => { + expect(err).to.not.exist() + ss = server + cb() + }) + }, + (cb) => { + const wstar = new WRTCStar({wrtc: wrtc}) + createNode([ + '/ip4/0.0.0.0/tcp/0', + '/ip4/127.0.0.1/tcp/25011/ws', + '/ip4/127.0.0.1/tcp/24642/ws/p2p-webrtc-star' + ], { + modules: { + transport: [wstar], + discovery: [wstar.discovery] + } + }, (err, node) => { + expect(err).to.not.exist() + nodeAll = node + node.handle('/echo/1.0.0', echo) + node.start(cb) + }) + }, + (cb) => createNode([ + '/ip4/0.0.0.0/tcp/0' + ], (err, node) => { + expect(err).to.not.exist() + nodeTCP = node + node.handle('/echo/1.0.0', echo) + node.start(cb) + }), + (cb) => createNode([ + '/ip4/127.0.0.1/tcp/25022/ws' + ], (err, node) => { + expect(err).to.not.exist() + nodeWS = node + node.handle('/echo/1.0.0', echo) + node.start(cb) + }), + + (cb) => { + const wstar = new WRTCStar({wrtc: wrtc}) + + createNode([ + '/ip4/127.0.0.1/tcp/24642/ws/p2p-webrtc-star' + ], { + modules: { + transport: [wstar], + discovery: [wstar.discovery] + } + }, (err, node) => { + expect(err).to.not.exist() + nodeWStar = node + node.handle('/echo/1.0.0', echo) + node.start(cb) + }) + } + ], done) + }) + + after((done) => { + parallel([ + (cb) => nodeAll.stop(cb), + (cb) => nodeTCP.stop(cb), + (cb) => nodeWS.stop(cb), + (cb) => nodeWStar.stop(cb), + (cb) => ss.stop(cb) + ], done) + }) + + function check (otherNode, muxed, peers, callback) { + let i = 1; + [nodeAll, otherNode].forEach((node) => { + expect(Object.keys(node.peerBook.getAll())).to.have.length(i-- ? peers : 1) + expect(Object.keys(node.swarm.muxedConns)).to.have.length(muxed) + }) + callback() + } + + it('nodeAll.dial nodeTCP using PeerInfo', (done) => { + nodeAll.dial(nodeTCP.peerInfo, (err) => { + expect(err).to.not.exist() + // Some time for Identify to finish + setTimeout(() => check(nodeTCP, 1, 1, done), 500) + }) + }) + + it('nodeAll.hangUp nodeTCP using PeerInfo', (done) => { + nodeAll.hangUp(nodeTCP.peerInfo, (err) => { + expect(err).to.not.exist() + // Some time for Identify to finish + setTimeout(() => check(nodeTCP, 0, 1, done), 500) + }) + }) + + it('nodeAll.dial nodeWS using PeerInfo', (done) => { + nodeAll.dial(nodeWS.peerInfo, (err) => { + expect(err).to.not.exist() + // Some time for Identify to finish + setTimeout(() => check(nodeWS, 1, 2, done), 500) + }) + }) + + it('nodeAll.hangUp nodeWS using PeerInfo', (done) => { + nodeAll.hangUp(nodeWS.peerInfo, (err) => { + expect(err).to.not.exist() + // Some time for Identify to finish + setTimeout(() => check(nodeWS, 0, 2, done), 500) + }) + }) + + it('nodeAll.dial nodeWStar using PeerInfo', function (done) { + this.timeout(10 * 1000) + + nodeAll.dial(nodeWStar.peerInfo, (err) => { + expect(err).to.not.exist() + // Some time for Identify to finish + setTimeout(() => check(nodeWStar, 1, 3, done), 500) + }) + }) + + it('nodeAll.hangUp nodeWStar using PeerInfo', (done) => { + nodeAll.hangUp(nodeWStar.peerInfo, (err) => { + expect(err).to.not.exist() + setTimeout(() => check(nodeWStar, 0, 3, done), 500) + }) + }) + }) + + describe('TCP + WebSockets + WebSocketStar', () => { + let nodeAll + let nodeTCP + let nodeWS + let nodeWStar + + let ss + + before((done) => { + parallel([ + (cb) => { + rendezvous.start({ port: 24642 }, (err, server) => { + expect(err).to.not.exist() + ss = server + cb() + }) + }, + (cb) => { + const wstar = new WSStar() + createNode([ + '/ip4/0.0.0.0/tcp/0', + '/ip4/127.0.0.1/tcp/25011/ws', + '/ip4/127.0.0.1/tcp/24642/ws/p2p-websocket-star' + ], { + modules: { + transport: [wstar], + discovery: [wstar.discovery] + } + }, (err, node) => { + expect(err).to.not.exist() + nodeAll = node + wstar.lazySetId(node.peerInfo.id) + node.handle('/echo/1.0.0', echo) + node.start(cb) + }) + }, + (cb) => createNode([ + '/ip4/0.0.0.0/tcp/0' + ], (err, node) => { + expect(err).to.not.exist() + nodeTCP = node + node.handle('/echo/1.0.0', echo) + node.start(cb) + }), + (cb) => createNode([ + '/ip4/127.0.0.1/tcp/25022/ws' + ], (err, node) => { + expect(err).to.not.exist() + nodeWS = node + node.handle('/echo/1.0.0', echo) + node.start(cb) + }), + + (cb) => { + const wstar = new WSStar({}) + + createNode([ + '/ip4/127.0.0.1/tcp/24642/ws/p2p-websocket-star' + ], { + modules: { + transport: [wstar], + discovery: [wstar.discovery] + } + }, (err, node) => { + expect(err).to.not.exist() + nodeWStar = node + wstar.lazySetId(node.peerInfo.id) + node.handle('/echo/1.0.0', echo) + node.start(cb) + }) + } + ], done) + }) + + after((done) => { + parallel([ + (cb) => nodeAll.stop(cb), + (cb) => nodeTCP.stop(cb), + (cb) => nodeWS.stop(cb), + (cb) => nodeWStar.stop(cb), + (cb) => ss.stop(cb) + ], done) + }) + + function check (otherNode, muxed, peers, done) { + let i = 1; + [nodeAll, otherNode].forEach((node) => { + expect(Object.keys(node.peerBook.getAll())).to.have.length(i-- ? peers : 1) + expect(Object.keys(node.swarm.muxedConns)).to.have.length(muxed) + }) + done() + } + + it('nodeAll.dial nodeTCP using PeerInfo', (done) => { + nodeAll.dial(nodeTCP.peerInfo, (err) => { + expect(err).to.not.exist() + // Some time for Identify to finish + setTimeout(() => check(nodeTCP, 1, 1, done), 500) + }) + }) + + it('nodeAll.hangUp nodeTCP using PeerInfo', (done) => { + nodeAll.hangUp(nodeTCP.peerInfo, (err) => { + expect(err).to.not.exist() + // Some time for Identify to finish + setTimeout(() => check(nodeTCP, 0, 1, done), 500) + }) + }) + + it('nodeAll.dial nodeWS using PeerInfo', (done) => { + nodeAll.dial(nodeWS.peerInfo, (err) => { + expect(err).to.not.exist() + // Some time for Identify to finish + setTimeout(() => check(nodeWS, 1, 2, done), 500) + }) + }) + + it('nodeAll.hangUp nodeWS using PeerInfo', (done) => { + nodeAll.hangUp(nodeWS.peerInfo, (err) => { + expect(err).to.not.exist() + // Some time for Identify to finish + setTimeout(() => check(nodeWS, 0, 2, done), 500) + }) + }) + + it('nodeAll.dial nodeWStar using PeerInfo', (done) => { + nodeAll.dial(nodeWStar.peerInfo, (err) => { + expect(err).to.not.exist() + // Some time for Identify to finish + setTimeout(() => check(nodeWStar, 1, 3, done), 500) + }) + }) + + it('nodeAll.hangUp nodeWStar using PeerInfo', (done) => { + nodeAll.hangUp(nodeWStar.peerInfo, (err) => { + expect(err).to.not.exist() + // Some time for Identify to finish + setTimeout(() => check(nodeWStar, 0, 3, done), 500) + }) + }) + }) +}) diff --git a/test/nodejs-bundle/turbolence.js b/test/turbolence.node.js similarity index 96% rename from test/nodejs-bundle/turbolence.js rename to test/turbolence.node.js index 527e73ef47..8c4dee4c50 100644 --- a/test/nodejs-bundle/turbolence.js +++ b/test/turbolence.node.js @@ -7,9 +7,8 @@ const expect = chai.expect const multiaddr = require('multiaddr') const spawn = require('child_process').spawn const path = require('path') -// const map = require('async/map') const pull = require('pull-stream') -const utils = require('./utils') +const utils = require('./utils/node') const createNode = utils.createNode const echo = utils.echo diff --git a/test/browser-bundle/browser-bundle.js b/test/utils/bundle.browser.js similarity index 86% rename from test/browser-bundle/browser-bundle.js rename to test/utils/bundle.browser.js index 9d80ad1948..5e85aef983 100644 --- a/test/browser-bundle/browser-bundle.js +++ b/test/utils/bundle.browser.js @@ -2,6 +2,7 @@ const WS = require('libp2p-websockets') const WebRTCStar = require('libp2p-webrtc-star') +const WebSocketStar = require('libp2p-websocket-star') const spdy = require('libp2p-spdy') const multiplex = require('libp2p-multiplex') const secio = require('libp2p-secio') @@ -36,11 +37,13 @@ class Node extends libp2p { constructor (peerInfo, peerBook, options) { options = options || {} const webRTCStar = new WebRTCStar() + const wsStar = new WebSocketStar() const modules = { transport: [ new WS(), - webRTCStar + webRTCStar, + wsStar ], connection: { muxer: getMuxers(options.muxer), @@ -55,6 +58,10 @@ class Node extends libp2p { modules.discovery.push(webRTCStar.discovery) } + if (options.wsStar) { + modules.discovery.push(wsStar.discovery) + } + if (options.bootstrap) { const r = new Railing(options.bootstrap) modules.discovery.push(r) diff --git a/test/nodejs-bundle/nodejs-bundle.js b/test/utils/bundle.node.js similarity index 100% rename from test/nodejs-bundle/nodejs-bundle.js rename to test/utils/bundle.node.js diff --git a/test/nodejs-bundle/utils.js b/test/utils/node.js similarity index 95% rename from test/nodejs-bundle/utils.js rename to test/utils/node.js index 6a89ed7861..4343207a71 100644 --- a/test/nodejs-bundle/utils.js +++ b/test/utils/node.js @@ -3,7 +3,7 @@ const chai = require('chai') chai.use(require('dirty-chai')) -const Node = require('./nodejs-bundle') +const Node = require('./bundle.node') const PeerInfo = require('peer-info') const PeerId = require('peer-id') const waterfall = require('async/waterfall')