From 4c21d2d154a4775e3f706426acc4625f7db0a53a Mon Sep 17 00:00:00 2001 From: Feross Aboukhadijeh Date: Mon, 28 Mar 2016 17:56:02 -0700 Subject: Deprecate bittorrent-swarm, inline into webtorrent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit bittorrent-swarm and the Torrent object in webtorrent are very coupled. It doesn't make much sense to publish them separately, as bittorrent-swarm can't be used independently. --- test/node/swarm-basic.js | 77 +++++++++++++++++++++++++++++++++++++++++ test/node/swarm-reconnect.js | 62 +++++++++++++++++++++++++++++++++ test/node/swarm-timeout.js | 50 +++++++++++++++++++++++++++ test/swarm.js | 82 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 271 insertions(+) create mode 100644 test/node/swarm-basic.js create mode 100644 test/node/swarm-reconnect.js create mode 100644 test/node/swarm-timeout.js create mode 100644 test/swarm.js (limited to 'test') diff --git a/test/node/swarm-basic.js b/test/node/swarm-basic.js new file mode 100644 index 0000000..9e38d0a --- /dev/null +++ b/test/node/swarm-basic.js @@ -0,0 +1,77 @@ +var hat = require('hat') +var portfinder = require('portfinder') +var Swarm = require('../../lib/swarm') +var test = require('tape') + +var infoHash = 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36' +var infoHash2 = 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa37' +var peerId = new Buffer('-WW0001-' + hat(48), 'utf8').toString('hex') +var peerId2 = new Buffer('-WW0001-' + hat(48), 'utf8').toString('hex') + +test('swarm listen (explicit port)', function (t) { + t.plan(1) + + var swarm = new Swarm(infoHash, peerId) + portfinder.getPort(function (err, port) { + if (err) throw err + swarm.listen(port) + swarm.on('listening', function () { + t.equal(port, swarm.address().port) + swarm.destroy() + }) + }) +}) + +test('two swarms listen on same port (explicit)', function (t) { + t.plan(2) + + var swarm1 = new Swarm(infoHash, peerId) + portfinder.getPort(function (err, port) { + if (err) throw err + swarm1.listen(port, function () { + t.equal(swarm1.address().port, port, 'listened on requested port') + + var swarm2 = new Swarm(infoHash2, peerId) + swarm2.listen(port, function () { + t.equal(swarm2.address().port, port, 'listened on requested port') + swarm1.destroy() + swarm2.destroy() + }) + }) + }) +}) + +test('swarm join', function (t) { + t.plan(10) + + var swarm1 = new Swarm(infoHash, peerId) + swarm1.listen(0, function () { + var swarm2 = new Swarm(infoHash, peerId2) + + t.equal(swarm1.wires.length, 0) + t.equal(swarm2.wires.length, 0) + + swarm2.addPeer('127.0.0.1:' + swarm1.address().port) + + swarm1.on('wire', function (wire, addr) { + t.ok(wire, 'Peer join our swarm via listening port') + + t.equal(swarm1.wires.length, 1) + t.ok(/127\.0\.0\.1:\d{1,5}/.test(addr)) + t.equal(wire.peerId.toString('hex'), peerId2) + }) + + swarm2.on('wire', function (wire, addr) { + t.ok(wire, 'Joined swarm, got wire') + + t.equal(swarm2.wires.length, 1) + t.ok(/127\.0\.0\.1:\d{1,5}/.test(addr)) + t.equal(wire.peerId.toString('hex'), peerId) + }) + + t.on('end', function () { + swarm1.destroy() + swarm2.destroy() + }) + }) +}) diff --git a/test/node/swarm-reconnect.js b/test/node/swarm-reconnect.js new file mode 100644 index 0000000..4fad7d0 --- /dev/null +++ b/test/node/swarm-reconnect.js @@ -0,0 +1,62 @@ +var hat = require('hat') +var Swarm = require('../../lib/swarm') +var test = require('tape') + +var infoHash = 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36' +var peerId1 = new Buffer('-WW0001-' + hat(48), 'utf8').toString('hex') +var peerId2 = new Buffer('-WW0001-' + hat(48), 'utf8').toString('hex') + +test('reconnect when peer disconnects', function (t) { + t.plan(10) + + var swarm1 = new Swarm(infoHash, peerId1) + swarm1.listen(0, function () { + var swarm2 = new Swarm(infoHash, peerId2) + + var time1 = 0 + swarm1.on('wire', function (wire) { + if (time1 === 0) { + t.ok(wire, 'Peer joined via listening port') + t.equal(swarm1.wires.length, 1) + + // at some point in future, end wire + setTimeout(function () { + wire.destroy() + }, 100) + + // ...and prevent reconnect + swarm1._drain = function () {} + } else if (time1 === 1) { + t.ok(wire, 'Remote peer reconnected') + t.equal(swarm1.wires.length, 1) + } else { + throw new Error('too many wire events (1)') + } + time1 += 1 + }) + + var time2 = 0 + swarm2.on('wire', function (wire) { + if (time2 === 0) { + t.ok(wire, 'Joined swarm, got wire') + t.equal(swarm2.wires.length, 1) + + wire.on('end', function () { + t.pass('Wire ended by remote peer') + t.equal(swarm1.wires.length, 0) + }) + } else if (time2 === 1) { + t.ok(wire, 'Reconnected to remote peer') + t.equal(swarm2.wires.length, 1) + + swarm1.destroy() + swarm2.destroy() + } else { + throw new Error('too many wire events (2)') + } + time2 += 1 + }) + + swarm2.addPeer('127.0.0.1:' + swarm1.address().port) + }) +}) diff --git a/test/node/swarm-timeout.js b/test/node/swarm-timeout.js new file mode 100644 index 0000000..4341465 --- /dev/null +++ b/test/node/swarm-timeout.js @@ -0,0 +1,50 @@ +var hat = require('hat') +var Swarm = require('../../lib/swarm') +var test = require('tape') + +var infoHash = 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36' +var peerId1 = new Buffer('-WW0001-' + hat(48), 'utf8').toString('hex') +var peerId2 = new Buffer('-WW0001-' + hat(48), 'utf8').toString('hex') + +test('timeout if no handshake in 25 seconds', function (t) { + t.plan(4) + + var swarm1 = new Swarm(infoHash, peerId1) + + var _addIncomingPeer = swarm1._addIncomingPeer + swarm1._addIncomingPeer = function (peer) { + // Nuke the handshake function on swarm1's peer to test swarm2's + // handshake timeout code + peer.wire.handshake = function () {} + _addIncomingPeer.call(swarm1, peer) + } + + swarm1.listen(0, function () { + var swarm2 = new Swarm(infoHash, peerId2) + + var numWires = 0 + swarm1.on('wire', function (wire) { + numWires += 1 + if (numWires === 1) { + t.ok(wire, 'Got wire via listening port') + t.equal(swarm1.wires.length, 1) + + // swarm2 should never get a wire since swarm1 refuses to send it a + // handshake + t.equal(swarm2.wires.length, 0) + } else if (numWires === 2) { + t.pass('swarm2 reconnected after timeout') + swarm1.destroy() + swarm2.destroy() + } else { + t.fail('got wire after destroy') + } + }) + + swarm2.on('wire', function (wire) { + t.fail('Should not get a wire because peer did not handshake') + }) + + swarm2.addPeer('127.0.0.1:' + swarm1.address().port) + }) +}) diff --git a/test/swarm.js b/test/swarm.js new file mode 100644 index 0000000..9662d4d --- /dev/null +++ b/test/swarm.js @@ -0,0 +1,82 @@ +var hat = require('hat') +var Swarm = require('../lib/swarm') +var test = require('tape') + +var infoHash = 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa36' +var infoHash2 = 'd2474e86c95b19b8bcfdb92bc12c9d44667cfa37' +var peerId = new Buffer('-WW0001-' + hat(48), 'utf8').toString('hex') +var peerId2 = new Buffer('-WW0001-' + hat(48), 'utf8').toString('hex') + +test('create swarm, check invariants', function (t) { + var swarm = new Swarm(infoHash, peerId) + + t.equal(swarm.infoHash.toString('hex'), infoHash) + t.equal(swarm.peerId.toString('hex'), peerId) + t.equal(swarm.downloaded, 0) + t.equal(swarm.uploaded, 0) + t.ok(Array.isArray(swarm.wires)) + t.equal(swarm.wires.length, 0) + t.end() +}) + +test('swarm listen(0) selects free port', function (t) { + t.plan(2) + + var swarm = new Swarm(infoHash, peerId) + swarm.listen(0) + swarm.on('listening', function () { + var port = swarm.address().port + t.equal(typeof port, 'number', 'port is a number') + if (process.browser) { + t.equal(port, 0, 'port number is 0') + } else { + t.ok(port > 0 && port < 65535, 'valid port number') + } + swarm.destroy() + }) +}) + +test('two swarms listen on same port (implicit)', function (t) { + t.plan(5) + + // When no port is specified and listen is called twice, they should get assigned the same port. + + var swarm1 = new Swarm(infoHash, peerId) + var swarm2 = new Swarm(infoHash2, peerId2) + + var swarm1Port + var swarm2Port + + function maybeDone () { + if (swarm1.listening && swarm2.listening) { + t.equal(swarm1Port, swarm2Port, 'swarms were given same port') + + t.equal(typeof swarm1Port, 'number', 'port is a number') + if (process.browser) { + t.equal(swarm1Port, 0, 'port number is 0') + } else { + t.ok(swarm1Port > 0 && swarm1Port < 65535, 'valid port number') + } + + t.equal(typeof swarm2Port, 'number', 'port is a number') + if (process.browser) { + t.equal(swarm2Port, 0, 'port number is 0') + } else { + t.ok(swarm2Port > 0 && swarm2Port < 65535, 'valid port number') + } + + swarm1.destroy() + swarm2.destroy() + } + } + + swarm1.listen(0, function () { + swarm1Port = swarm1.address().port + maybeDone() + }) + + swarm2.listen(0, function (port2) { + swarm2Port = swarm2.address().port + maybeDone() + }) +}) -- cgit v1.2.3