Skip to content

Commit

Permalink
gen bitswap network
Browse files Browse the repository at this point in the history
  • Loading branch information
daviddias committed May 9, 2016
1 parent 6ad08e7 commit 20af50b
Show file tree
Hide file tree
Showing 5 changed files with 163 additions and 3 deletions.
5 changes: 3 additions & 2 deletions package.json
Expand Up @@ -33,14 +33,15 @@
},
"homepage": "https://github.com/ipfs/js-ipfs-bitswap#readme",
"devDependencies": {
"abstract-blob-store": "^3.2.0",
"aegir": "^3.0.1",
"buffer-loader": "0.0.1",
"chai": "^3.5.0",
"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",
Expand Down Expand Up @@ -71,4 +72,4 @@
"David Dias <daviddias.p@gmail.com>",
"Friedel Ziegelmayer <dignifiedquire@gmail.com>"
]
}
}
2 changes: 1 addition & 1 deletion src/network/index.js
Expand Up @@ -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)
}
Expand Down
66 changes: 66 additions & 0 deletions test/network/gen-bitswap-network.node.js
@@ -0,0 +1,66 @@
/* eslint-env mocha */

'use strict'

const expect = require('chai').expect
const utils = require('../utils')
const async = require('async')

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
const tasks = nodeArr.map((node) => {
return (cb) => {
node.libp2p.swarm.close(cb)
}
})

setTimeout(() => {
async.parallel(tasks, done)
}, 1000)
}
})
})
1 change: 1 addition & 0 deletions test/node.js
Expand Up @@ -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')
92 changes: 92 additions & 0 deletions test/utils.js
Expand Up @@ -3,7 +3,15 @@
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 bs = require('abstract-blob-store')
// const bs = require('fs-blob-store')

exports.mockNetwork = (calls, done) => {
done = done || (() => {})
Expand Down Expand Up @@ -84,3 +92,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: bs })
})

// 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.eachSeries(netArray, (from, cbI) => {
async.eachSeries(netArray, (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)
}
}

0 comments on commit 20af50b

Please sign in to comment.