mirror of
https://github.com/fluencelabs/js-libp2p
synced 2025-03-30 06:11:05 +00:00
153 lines
4.7 KiB
JavaScript
153 lines
4.7 KiB
JavaScript
/* eslint-env mocha */
|
|
'use strict'
|
|
|
|
const chai = require('chai')
|
|
const dirtyChai = require('dirty-chai')
|
|
const expect = chai.expect
|
|
chai.use(dirtyChai)
|
|
const parallel = require('async/parallel')
|
|
const TCP = require('libp2p-tcp')
|
|
const multiplex = require('pull-mplex')
|
|
const pull = require('pull-stream')
|
|
const PeerBook = require('peer-book')
|
|
const secio = require('libp2p-secio')
|
|
const Protector = require('../../src/pnet')
|
|
|
|
const utils = require('./utils')
|
|
const createInfos = utils.createInfos
|
|
const tryEcho = utils.tryEcho
|
|
const Switch = require('../../src/switch')
|
|
|
|
const generatePSK = Protector.generate
|
|
|
|
const psk = Buffer.alloc(95)
|
|
const psk2 = Buffer.alloc(95)
|
|
generatePSK(psk)
|
|
generatePSK(psk2)
|
|
|
|
describe('Private Network', function () {
|
|
let switchA
|
|
let switchB
|
|
let switchC
|
|
let switchD
|
|
|
|
before((done) => createInfos(4, (err, infos) => {
|
|
expect(err).to.not.exist()
|
|
|
|
const peerA = infos[0]
|
|
const peerB = infos[1]
|
|
const peerC = infos[2]
|
|
const peerD = infos[3]
|
|
|
|
peerA.multiaddrs.add('/ip4/127.0.0.1/tcp/9001')
|
|
peerB.multiaddrs.add('/ip4/127.0.0.1/tcp/9002')
|
|
peerC.multiaddrs.add('/ip4/127.0.0.1/tcp/9003')
|
|
peerD.multiaddrs.add('/ip4/127.0.0.1/tcp/9004')
|
|
|
|
switchA = new Switch(peerA, new PeerBook(), {
|
|
protector: new Protector(psk)
|
|
})
|
|
switchB = new Switch(peerB, new PeerBook(), {
|
|
protector: new Protector(psk)
|
|
})
|
|
// alternative way to add the protector
|
|
switchC = new Switch(peerC, new PeerBook())
|
|
switchC.protector = new Protector(psk)
|
|
// Create a switch on a different private network
|
|
switchD = new Switch(peerD, new PeerBook(), {
|
|
protector: new Protector(psk2)
|
|
})
|
|
|
|
switchA.transport.add('tcp', new TCP())
|
|
switchB.transport.add('tcp', new TCP())
|
|
switchC.transport.add('tcp', new TCP())
|
|
switchD.transport.add('tcp', new TCP())
|
|
|
|
switchA.connection.crypto(secio.tag, secio.encrypt)
|
|
switchB.connection.crypto(secio.tag, secio.encrypt)
|
|
switchC.connection.crypto(secio.tag, secio.encrypt)
|
|
switchD.connection.crypto(secio.tag, secio.encrypt)
|
|
|
|
switchA.connection.addStreamMuxer(multiplex)
|
|
switchB.connection.addStreamMuxer(multiplex)
|
|
switchC.connection.addStreamMuxer(multiplex)
|
|
switchD.connection.addStreamMuxer(multiplex)
|
|
|
|
parallel([
|
|
(cb) => switchA.transport.listen('tcp', {}, null, cb),
|
|
(cb) => switchB.transport.listen('tcp', {}, null, cb),
|
|
(cb) => switchC.transport.listen('tcp', {}, null, cb),
|
|
(cb) => switchD.transport.listen('tcp', {}, null, cb)
|
|
], done)
|
|
}))
|
|
|
|
after(function (done) {
|
|
parallel([
|
|
(cb) => switchA.stop(cb),
|
|
(cb) => switchB.stop(cb),
|
|
(cb) => switchC.stop(cb),
|
|
(cb) => switchD.stop(cb)
|
|
], done)
|
|
})
|
|
|
|
it('should handle + dial on protocol', (done) => {
|
|
switchB.handle('/abacaxi/1.0.0', (protocol, conn) => pull(conn, conn))
|
|
|
|
switchA.dial(switchB._peerInfo, '/abacaxi/1.0.0', (err, conn) => {
|
|
expect(err).to.not.exist()
|
|
expect(switchA.connection.getAll()).to.have.length(1)
|
|
tryEcho(conn, done)
|
|
})
|
|
})
|
|
|
|
it('should dial to warm conn', (done) => {
|
|
switchB.dial(switchA._peerInfo, (err) => {
|
|
expect(err).to.not.exist()
|
|
expect(Object.keys(switchB.conns).length).to.equal(0)
|
|
expect(switchB.connection.getAll()).to.have.length(1)
|
|
done()
|
|
})
|
|
})
|
|
|
|
it('should dial on protocol, reuseing warmed conn', (done) => {
|
|
switchA.handle('/papaia/1.0.0', (protocol, conn) => pull(conn, conn))
|
|
|
|
switchB.dial(switchA._peerInfo, '/papaia/1.0.0', (err, conn) => {
|
|
expect(err).to.not.exist()
|
|
expect(Object.keys(switchB.conns).length).to.equal(0)
|
|
expect(switchB.connection.getAll()).to.have.length(1)
|
|
tryEcho(conn, done)
|
|
})
|
|
})
|
|
|
|
it('should enable identify to reuse incomming muxed conn', (done) => {
|
|
switchA.connection.reuse()
|
|
switchC.connection.reuse()
|
|
|
|
switchC.dial(switchA._peerInfo, (err) => {
|
|
expect(err).to.not.exist()
|
|
setTimeout(() => {
|
|
expect(switchC.connection.getAll()).to.have.length(1)
|
|
expect(switchA.connection.getAll()).to.have.length(2)
|
|
done()
|
|
}, 500)
|
|
})
|
|
})
|
|
|
|
/**
|
|
* This test is being skipped until a related issue with pull-reader overreading can be resolved
|
|
* Currently this test will time out instead of returning an error properly. This is the same issue
|
|
* in ipfs/interop, https://github.com/ipfs/interop/pull/24/commits/179978996ecaef39e78384091aa9669dcdb94cc0
|
|
*/
|
|
it('should fail to talk to a switch on a different private network', function (done) {
|
|
switchD.dial(switchA._peerInfo, (err) => {
|
|
expect(err).to.exist()
|
|
})
|
|
|
|
// A successful connection will return in well under 2 seconds
|
|
setTimeout(() => {
|
|
done()
|
|
}, 2000)
|
|
})
|
|
})
|