From 9b7c8af96b6c0926dc50005b23ce7cee1320699e Mon Sep 17 00:00:00 2001 From: David Dias Date: Fri, 6 May 2016 12:02:42 +0100 Subject: [PATCH] gen bitswap network --- package.json | 7 +- src/network/index.js | 2 +- test/network/gen-bitswap-network.node.js | 72 +++++++++++++++++++ test/node.js | 1 + test/utils.js | 91 ++++++++++++++++++++++++ 5 files changed, 169 insertions(+), 4 deletions(-) create mode 100644 test/network/gen-bitswap-network.node.js diff --git a/package.json b/package.json index 4961b646..bd5ded3c 100644 --- a/package.json +++ b/package.json @@ -39,14 +39,15 @@ "fs-blob-store": "^5.2.1", "idb-plus-blob-store": "^1.1.2", "ipfs-repo": "^0.8.0", + "libp2p-ipfs": "^0.3.6", "lodash": "^4.11.2", - "libp2p-ipfs": "^0.3.5", "multiaddr": "^1.4.1", "ncp": "^2.0.0", "peer-book": "^0.1.0", "peer-id": "^0.6.6", "peer-info": "^0.6.2", - "rimraf": "^2.5.2" + "rimraf": "^2.5.2", + "run-parallel": "^1.1.6" }, "dependencies": { "async": "^2.0.0-rc.4", @@ -71,4 +72,4 @@ "David Dias ", "Friedel Ziegelmayer " ] -} \ No newline at end of file +} diff --git a/src/network/index.js b/src/network/index.js index 15944c1f..4afe361d 100644 --- a/src/network/index.js +++ b/src/network/index.js @@ -86,7 +86,7 @@ module.exports = class Network { return done(err) } - const conn = this.libp2p.swarm.dial(peerInfo, '/ipfs/bitswap/1.0.0', (err) => { + const conn = this.libp2p.swarm.dial(peerInfo, PROTOCOL_IDENTIFIER, (err) => { if (err) { return done(err) } diff --git a/test/network/gen-bitswap-network.node.js b/test/network/gen-bitswap-network.node.js new file mode 100644 index 00000000..67b8fb0d --- /dev/null +++ b/test/network/gen-bitswap-network.node.js @@ -0,0 +1,72 @@ +/* eslint-env mocha */ + +'use strict' + +const expect = require('chai').expect +const utils = require('../utils') +const async = require('async') +const parallel = require('run-parallel') + +describe('gen Bitswap network', function () { + this.timeout(300 * 1000) + + it('gen a network with 2 bitswap nodes', (done) => { + const n = 2 + utils.genBitswapNetwork(n, (err, nodeArr) => { + expect(err).to.not.exist + nodeArr.forEach((node) => { + expect(node.bitswap).to.exist + expect(node.peerInfo).to.exist + expect(node.libp2p).to.exist + expect(Object.keys(node.libp2p.swarm.muxedConns).length).to.equal(n - 1) + expect(node.repo).to.exist + }) + cleanUp(nodeArr) + }) + + function cleanUp (nodeArr) { + // setTimeout is used to avoid closing the TCP socket while spdy is + // still sending a ton of signalling data + setTimeout(() => { + async.each(nodeArr, (node, callback) => { + node.libp2p.swarm.close(callback) + }, done) + }, 1000) + } + }) + + it('gen a network with 3 bitswap nodes', (done) => { + const n = 3 + utils.genBitswapNetwork(n, (err, nodeArr) => { + expect(err).to.not.exist + nodeArr.forEach((node) => { + expect(node.bitswap).to.exist + expect(node.peerInfo).to.exist + expect(node.libp2p).to.exist + expect(Object.keys(node.libp2p.swarm.conns).length).to.equal(0) + expect(Object.keys(node.libp2p.swarm.muxedConns).length).to.equal(n - 1) + expect(node.repo).to.exist + }) + cleanUp(nodeArr) + }) + + function cleanUp (nodeArr) { + // setTimeout is used to avoid closing the TCP socket while spdy is + // still sending a ton of signalling data + console.log('cleaning') + + const tasks = nodeArr.map((node) => { + return (cb) => { + node.libp2p.swarm.close(() => { + console.log('->', node.peerInfo.id.toB58String()) + cb() + }) + } + }) + + setTimeout(() => { + parallel(tasks, done) + }, 1000) + } + }) +}) diff --git a/test/node.js b/test/node.js index 6d15a90b..2842a8f6 100644 --- a/test/node.js +++ b/test/node.js @@ -37,3 +37,4 @@ const repo = { require('./index-test')(repo) require('./decision/engine-test')(repo) require('./network/network.node.js') +require('./network/gen-bitswap-network.node.js') diff --git a/test/utils.js b/test/utils.js index bf194a5b..a30890e4 100644 --- a/test/utils.js +++ b/test/utils.js @@ -3,7 +3,14 @@ const async = require('async') const _ = require('lodash') const PeerId = require('peer-id') +const PeerInfo = require('peer-info') +const PeerBook = require('peer-book') +const multiaddr = require('multiaddr') const Bitswap = require('../src') +const libp2p = require('libp2p-ipfs') +const os = require('os') +const Repo = require('ipfs-repo') +const fsBS = require('fs-blob-store') exports.mockNetwork = (calls, done) => { done = done || (() => {}) @@ -84,3 +91,87 @@ exports.applyNetwork = (bs, n) => { bs.wm.network = n bs.engine.network = n } + +exports.genBitswapNetwork = (n, callback) => { + const netArray = [] // bitswap, peerBook, libp2p, peerInfo, repo + const basePort = 12000 + + // create PeerInfo and libp2p.Node for each + _.range(n).forEach((i) => { + const p = new PeerInfo() + const mh1 = multiaddr('/ip4/127.0.0.1/tcp/' + (basePort + i)) + const mh2 = multiaddr('/ip4/127.0.0.1/tcp/' + (basePort + i + 2000) + '/websockets') + + p.multiaddr.add(mh1) + p.multiaddr.add(mh2) + + const l = new libp2p.Node(p) + netArray.push({peerInfo: p, libp2p: l}) + }) + + // create PeerBook and populate peerBook + netArray.forEach((net, i) => { + const pb = new PeerBook() + netArray.forEach((net, j) => { + if (i === j) { + return + } + pb.put(net.peerInfo) + }) + netArray[i].peerBook = pb + }) + + // create the repos + const tmpDir = os.tmpdir() + netArray.forEach((net, i) => { + const repoPath = tmpDir + '/' + net.peerInfo.id.toB58String() + net.repo = new Repo(repoPath, { stores: fsBS }) + }) + + // start every libp2pNode + async.each(netArray, (net, cb) => { + net.libp2p.start(cb) + }, (err) => { + if (err) { + throw err + } + createBitswaps() + }) + + // create every BitSwap + function createBitswaps () { + netArray.forEach((net) => { + net.bitswap = new Bitswap(net.peerInfo, net.libp2p, net.repo, net.peerBook) + }) + establishLinks() + } + + // connect all the nodes between each other + function establishLinks () { + async.eachLimit(netArray, 1, (from, cbI) => { + async.eachLimit(netArray, 1, (to, cbJ) => { + if (from.peerInfo.id.toB58String() === + to.peerInfo.id.toB58String()) { + return cbJ() + } + from.libp2p.swarm.dial(to.peerInfo, cbJ) + }, (err) => { + if (err) { + throw err + } + cbI() + }) + }, (err) => { + if (err) { + throw err + } + finish() + }) + } + + // callback with netArray + function finish () { + callback(null, netArray) + } +} +