From 168d01befd6ed8c5efadcf39a953c4800b128ab5 Mon Sep 17 00:00:00 2001 From: David Dias Date: Wed, 23 Sep 2015 17:25:21 +0100 Subject: [PATCH] stream muxer for connection reuse test --- src/swarm.js | 3 + tests/swarm-test.js | 256 ++++++++++---------------------------------- 2 files changed, 62 insertions(+), 197 deletions(-) diff --git a/src/swarm.js b/src/swarm.js index 0673c391..873bb8e9 100644 --- a/src/swarm.js +++ b/src/swarm.js @@ -34,6 +34,9 @@ function Swarm (peerInfo) { // options: options } self.muxers = {} + // for connection reuse + self.identify = false + // public interface self.addTransport = function (name, transport, options, dialOptions, listenOptions, callback) { diff --git a/tests/swarm-test.js b/tests/swarm-test.js index 8fd474a7..6ea7a45b 100644 --- a/tests/swarm-test.js +++ b/tests/swarm-test.js @@ -291,213 +291,75 @@ experiment('With a SPDY Stream Muxer', function () { } }) test('dial two conns (transport reuse)', function (done) { - done() - }) - test('identify', function (done) { done() }) - }) -}) + var mh1 = multiaddr('/ip4/127.0.0.1/tcp/8010') + var p1 = new Peer(Id.create(), []) + var sw1 = new Swarm(p1) + sw1.addTransport('tcp', tcp, { multiaddr: mh1 }, {}, {port: 8010}, ready) + sw1.addStreamMuxer('spdy', Spdy, {}) -/* OLD -experiment('BASICS', function () { - experiment('Swarm', function () { - test('enforces instantiation with new', function (done) { - expect(function () { - Swarm() - }).to.throw('Swarm must be called with new') - done() - }) + var mh2 = multiaddr('/ip4/127.0.0.1/tcp/8020') + var p2 = new Peer(Id.create(), []) + var sw2 = new Swarm(p2) + sw2.addTransport('tcp', tcp, { multiaddr: mh2 }, {}, {port: 8020}, ready) + sw2.addStreamMuxer('spdy', Spdy, {}) - test('parses $IPFS_SWARM_PORT', function (done) { - process.env.IPFS_SWARM_PORT = 1111 - var swarm = new Swarm() - expect(swarm.port).to.be.equal(1111) - process.env.IPFS_SWARM_PORT = undefined - done() - }) - }) + sw2.handleProtocol('/sparkles/1.0.0', function (conn) { + // formallity so that the conn starts flowing + conn.on('data', function (chunk) {}) - experiment('Swarm.listen', function (done) { - test('handles missing port', function (done) { - var swarm = new Swarm() - swarm.listen(done) - }) + conn.end() + conn.on('end', function () { + expect(Object.keys(sw1.muxedConns).length).to.equal(1) + expect(Object.keys(sw2.muxedConns).length).to.equal(0) + conn.end() - test('handles passed in port', function (done) { - var swarm = new Swarm() - swarm.listen(1234) - expect(swarm.port).to.be.equal(1234) - done() - }) - }) + var cleaningCounter = 0 + sw1.closeConns(cleaningUp) + sw2.closeConns(cleaningUp) - experiment('Swarm.registerHandler', function () { - test('throws when registering a protcol handler twice', function (done) { - var swarm = new Swarm() - swarm.registerHandler('/sparkles/1.1.1', function () {}) - swarm.registerHandler('/sparkles/1.1.1', function (err) { - expect(err).to.be.an.instanceOf(Error) - expect(err.message).to.be.equal('Handle for protocol already exists') - done() - }) - }) - }) + sw1.closeListener('tcp', cleaningUp) + sw2.closeListener('tcp', cleaningUp) - experiment('Swarm.closeConns', function () { - test('calls end on all connections', function (done) { - swarmA.openConnection(peerB, function () { - var key = Object.keys(swarmA.connections)[0] - sinon.spy(swarmA.connections[key].conn, 'end') - swarmA.closeConns(function () { - expect(swarmA.connections[key].conn.end.called).to.be.equal(true) - done() + function cleaningUp () { + cleaningCounter++ + // TODO FIX: here should be 4, but because super wrapping of + // streams, it makes it so hard to properly close the muxed + // streams - https://github.com/indutny/spdy-transport/issues/14 + if (cleaningCounter < 3) { + return + } + + done() + } }) }) + + var count = 0 + + function ready () { + count++ + if (count < 2) { + return + } + + sw1.dial(p2, {}, '/sparkles/1.0.0', function (err, conn) { + // TODO Improve clarity + sw1.dial(p2, {}, '/sparkles/1.0.0', function (err, conn) { + conn.on('data', function () {}) + expect(err).to.equal(null) + expect(Object.keys(sw1.conns).length).to.equal(0) + conn.end() + }) + + conn.on('data', function () {}) + expect(err).to.equal(null) + expect(Object.keys(sw1.conns).length).to.equal(0) + conn.end() + }) + } }) - }) -}) - -experiment('BASE', function () { - test('Open a stream', function (done) { - var protocol = '/sparkles/3.3.3' - var c = new Counter(2, done) - - swarmB.registerHandler(protocol, function (stream) { - c.hit() - }) - - swarmA.openStream(peerB, protocol, function (err, stream) { - expect(err).to.not.be.instanceof(Error) - c.hit() - }) - }) - - test('Reuse connection (from dialer)', function (done) { - var protocol = '/sparkles/3.3.3' - - swarmB.registerHandler(protocol, function (stream) {}) - - swarmA.openStream(peerB, protocol, function (err, stream) { - expect(err).to.not.be.instanceof(Error) - - swarmA.openStream(peerB, protocol, function (err, stream) { - expect(err).to.not.be.instanceof(Error) - expect(swarmA.connections.length === 1) - done() - }) - }) - }) - test('Check for lastSeen', function (done) { - var protocol = '/sparkles/3.3.3' - - swarmB.registerHandler(protocol, function (stream) {}) - - swarmA.openStream(peerB, protocol, function (err, stream) { - expect(err).to.not.be.instanceof(Error) - expect(peerB.lastSeen).to.be.instanceof(Date) + test('identify', function (done) { done() }) }) - }) - -experiment('IDENTIFY', function () { - test('Attach Identify, open a stream, see a peer update', function (done) { - swarmA.on('error', function (err) { - console.log('A - ', err) - }) - - swarmB.on('error', function (err) { - console.log('B - ', err) - }) - - var protocol = '/sparkles/3.3.3' - - var identifyA = new Identify(swarmA, peerA) - var identifyB = new Identify(swarmB, peerB) - setTimeout(function () { - swarmB.registerHandler(protocol, function (stream) {}) - - swarmA.openStream(peerB, protocol, function (err, stream) { - expect(err).to.not.be.instanceof(Error) - }) - - identifyB.on('peer-update', function (answer) { - done() - }) - identifyA.on('peer-update', function (answer) {}) - }, 500) - }) - - test('Attach Identify, open a stream, reuse stream', function (done) { - var protocol = '/sparkles/3.3.3' - - var identifyA = new Identify(swarmA, peerA) - var identifyB = new Identify(swarmB, peerB) - - swarmA.registerHandler(protocol, function (stream) {}) - swarmB.registerHandler(protocol, function (stream) {}) - - swarmA.openStream(peerB, protocol, function (err, stream) { - expect(err).to.not.be.instanceof(Error) - }) - - identifyB.on('peer-update', function (answer) { - expect(Object.keys(swarmB.connections).length).to.equal(1) - swarmB.openStream(peerA, protocol, function (err, stream) { - expect(err).to.not.be.instanceof(Error) - expect(Object.keys(swarmB.connections).length).to.equal(1) - done() - }) - }) - identifyA.on('peer-update', function (answer) {}) - }) - - test('Attach Identify, reuse peer', function (done) { - var protocol = '/sparkles/3.3.3' - - var identifyA = new Identify(swarmA, peerA) - var identifyB = new Identify(swarmB, peerB) // eslint-disable-line no-unused-vars - - swarmA.registerHandler(protocol, function (stream) {}) - swarmB.registerHandler(protocol, function (stream) {}) - - var restartA = function (cb) { - swarmA.openStream(peerB, protocol, function (err, stream) { - expect(err).to.not.be.instanceof(Error) - - stream.end(cb) - }) - } - - restartA(function () { - identifyA.once('peer-update', function () { - expect(peerA.previousObservedAddrs.length).to.be.equal(1) - - var c = new Counter(2, done) - - swarmA.closeConns(c.hit.bind(c)) - swarmB.closeConns(c.hit.bind(c)) - }) - }) - }) -}) - -experiment('HARDNESS', function () {}) - -function Counter (target, callback) { - var c = 0 - this.hit = count - - function count () { - c += 1 - if (c === target) { - callback() - } - } -} -*/ - -// function checkErr (err) { -// console.log('err') -// expect(err).to.be.instanceof(Error) -// }