js-libp2p/test/switch/transport-manager.spec.js
Jacob Heun fd738f9d51
refactor: add js-libp2p-switch to the libp2p codebase (#388)
Co-authored-by: Alan Shaw <alan.shaw@protocol.ai>
Co-authored-by: Alan Shaw <alan@tableflip.io>
Co-authored-by: Arnaud <arnaud.valensi@gmail.com>
Co-authored-by: David Dias <daviddias.p@gmail.com>
Co-authored-by: David Dias <mail@daviddias.me>
Co-authored-by: Dmitriy Ryajov <dryajov@gmail.com>
Co-authored-by: Francisco Baio Dias <xicombd@gmail.com>
Co-authored-by: Friedel Ziegelmayer <dignifiedquire@gmail.com>
Co-authored-by: Haad <haadcode@users.noreply.github.com>
Co-authored-by: Hugo Dias <mail@hugodias.me>
Co-authored-by: Hugo Dias <hugomrdias@gmail.com>
Co-authored-by: Jacob Heun <jacobheun@gmail.com>
Co-authored-by: Kevin Kwok <antimatter15@gmail.com>
Co-authored-by: Kobi Gurkan <kobigurk@gmail.com>
Co-authored-by: Maciej Krüger <mkg20001@gmail.com>
Co-authored-by: Matteo Collina <matteo.collina@gmail.com>
Co-authored-by: Michael Fakhry <fakhrimichael@live.com>
Co-authored-by: Oli Evans <oli@tableflip.io>
Co-authored-by: Pau Ramon Revilla <masylum@gmail.com>
Co-authored-by: Pedro Teixeira <i@pgte.me>
Co-authored-by: Pius Nyakoojo <piusnyakoojo@gmail.com>
Co-authored-by: Richard Littauer <richard.littauer@gmail.com>
Co-authored-by: Sid Harder <sideharder@gmail.com>
Co-authored-by: Vasco Santos <vasco.santos@ua.pt>
Co-authored-by: harrshasri <35241544+harrshasri@users.noreply.github.com>
Co-authored-by: kumavis <kumavis@users.noreply.github.com>
Co-authored-by: ᴠɪᴄᴛᴏʀ ʙᴊᴇʟᴋʜᴏʟᴍ <victorbjelkholm@gmail.com>
2019-08-08 19:01:16 +02:00

296 lines
8.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 Multiaddr = require('multiaddr')
const PeerInfo = require('peer-info')
const sinon = require('sinon')
const TransportManager = require('libp2p-switch/transport')
describe('Transport Manager', () => {
afterEach(() => {
sinon.restore()
})
describe('dialables', () => {
let peerInfo
const dialAllTransport = { filter: addrs => addrs }
before(function (done) {
this.timeout(10e3)
PeerInfo.create((err, info) => {
if (err) return done(err)
peerInfo = info
done()
})
})
afterEach(() => {
peerInfo.multiaddrs.clear()
})
it('should return all transport addresses when peer info has 0 addrs', () => {
const queryAddrs = [
'/ip4/127.0.0.1/tcp/4002',
'/ip4/192.168.0.3/tcp/4002',
'/ip6/::1/tcp/4001'
].map(a => Multiaddr(a))
const dialableAddrs = TransportManager.dialables(dialAllTransport, queryAddrs, peerInfo)
expect(dialableAddrs).to.have.length(queryAddrs.length)
queryAddrs.forEach(qa => {
expect(dialableAddrs.some(da => da.equals(qa))).to.be.true()
})
})
it('should return all transport addresses when we pass no peer info', () => {
const queryAddrs = [
'/ip4/127.0.0.1/tcp/4002',
'/ip4/192.168.0.3/tcp/4002',
'/ip6/::1/tcp/4001'
].map(a => Multiaddr(a))
const dialableAddrs = TransportManager.dialables(dialAllTransport, queryAddrs)
expect(dialableAddrs).to.have.length(queryAddrs.length)
queryAddrs.forEach(qa => {
expect(dialableAddrs.some(da => da.equals(qa))).to.be.true()
})
})
it('should filter our addresses', () => {
const queryAddrs = [
'/ip4/127.0.0.1/tcp/4002',
'/ip4/192.168.0.3/tcp/4002',
'/ip6/::1/tcp/4001'
].map(a => Multiaddr(a))
const ourAddrs = [
'/ip4/127.0.0.1/tcp/4002',
'/ip4/192.168.0.3/tcp/4002'
]
ourAddrs.forEach(a => peerInfo.multiaddrs.add(a))
const dialableAddrs = TransportManager.dialables(dialAllTransport, queryAddrs, peerInfo)
expect(dialableAddrs).to.have.length(1)
expect(dialableAddrs[0].toString()).to.equal('/ip6/::1/tcp/4001')
})
it('should filter our addresses with peer ID suffix', () => {
const queryAddrs = [
'/ip4/127.0.0.1/tcp/4002/ipfs/QmebzNV1kSzLfaYpSZdShuiABNUxoKT1vJmCdxM2iWsM2j',
'/ip4/192.168.0.3/tcp/4002',
'/ip6/::1/tcp/4001'
].map(a => Multiaddr(a))
const ourAddrs = [
`/ip4/127.0.0.1/tcp/4002`,
`/ip4/192.168.0.3/tcp/4002/ipfs/${peerInfo.id.toB58String()}`
]
ourAddrs.forEach(a => peerInfo.multiaddrs.add(a))
const dialableAddrs = TransportManager.dialables(dialAllTransport, queryAddrs, peerInfo)
expect(dialableAddrs).to.have.length(1)
expect(dialableAddrs[0].toString()).to.equal('/ip6/::1/tcp/4001')
})
it('should filter out our addrs that start with /ipfs/', () => {
const queryAddrs = [
'/ip4/127.0.0.1/tcp/4002/ipfs/QmebzNV1kSzLfaYpSZdShuiABNUxoKT1vJmCdxM2iWsM2j'
].map(a => Multiaddr(a))
const ourAddrs = [
'/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z'
]
ourAddrs.forEach(a => peerInfo.multiaddrs.add(a))
const dialableAddrs = TransportManager.dialables(dialAllTransport, queryAddrs, peerInfo)
expect(dialableAddrs).to.have.length(1)
expect(dialableAddrs[0]).to.eql(queryAddrs[0])
})
it('should filter our addresses over relay/rendezvous', () => {
const peerId = peerInfo.id.toB58String()
const queryAddrs = [
`/p2p-circuit/ipfs/${peerId}`,
`/p2p-circuit/ip4/127.0.0.1/tcp/4002`,
`/p2p-circuit/ip4/192.168.0.3/tcp/4002`,
`/p2p-circuit/ip4/127.0.0.1/tcp/4002/ipfs/${peerId}`,
`/p2p-circuit/ip4/192.168.0.3/tcp/4002/ipfs/${peerId}`,
`/p2p-circuit/ip4/127.0.0.1/tcp/4002/ipfs/QmebzNV1kSzLfaYpSZdShuiABNUxoKT1vJmCdxM2iWsM2j`,
`/p2p-circuit/ip4/192.168.0.3/tcp/4002/ipfs/QmebzNV1kSzLfaYpSZdShuiABNUxoKT1vJmCdxM2iWsM2j`,
`/p2p-webrtc-star/ipfs/${peerId}`,
`/p2p-websocket-star/ipfs/${peerId}`,
`/p2p-stardust/ipfs/${peerId}`,
'/ip6/::1/tcp/4001'
].map(a => Multiaddr(a))
const ourAddrs = [
`/ip4/127.0.0.1/tcp/4002`,
`/ip4/192.168.0.3/tcp/4002/ipfs/${peerInfo.id.toB58String()}`
]
ourAddrs.forEach(a => peerInfo.multiaddrs.add(a))
const dialableAddrs = TransportManager.dialables(dialAllTransport, queryAddrs, peerInfo)
expect(dialableAddrs).to.have.length(1)
expect(dialableAddrs[0].toString()).to.equal('/ip6/::1/tcp/4001')
})
})
describe('listen', () => {
const listener = {
once: function () {},
listen: function () {},
removeListener: function () {},
getAddrs: function () {}
}
it('should allow for multiple addresses with port 0', (done) => {
const mockListener = sinon.stub(listener)
mockListener.listen.callsArg(1)
mockListener.getAddrs.callsArgWith(0, null, [])
const mockSwitch = {
_peerInfo: {
multiaddrs: {
toArray: () => [
Multiaddr('/ip4/127.0.0.1/tcp/0'),
Multiaddr('/ip4/0.0.0.0/tcp/0')
],
replace: () => {}
}
},
_options: {},
_connectionHandler: () => {},
transports: {
TCP: {
filter: (addrs) => addrs,
createListener: () => {
return mockListener
}
}
}
}
const transportManager = new TransportManager(mockSwitch)
transportManager.listen('TCP', null, null, (err) => {
expect(err).to.not.exist()
expect(mockListener.listen.callCount).to.eql(2)
done()
})
})
it('should filter out equal addresses', (done) => {
const mockListener = sinon.stub(listener)
mockListener.listen.callsArg(1)
mockListener.getAddrs.callsArgWith(0, null, [])
const mockSwitch = {
_peerInfo: {
multiaddrs: {
toArray: () => [
Multiaddr('/ip4/127.0.0.1/tcp/0'),
Multiaddr('/ip4/127.0.0.1/tcp/0')
],
replace: () => {}
}
},
_options: {},
_connectionHandler: () => {},
transports: {
TCP: {
filter: (addrs) => addrs,
createListener: () => {
return mockListener
}
}
}
}
const transportManager = new TransportManager(mockSwitch)
transportManager.listen('TCP', null, null, (err) => {
expect(err).to.not.exist()
expect(mockListener.listen.callCount).to.eql(1)
done()
})
})
it('should account for addresses with no port', (done) => {
const mockListener = sinon.stub(listener)
mockListener.listen.callsArg(1)
mockListener.getAddrs.callsArgWith(0, null, [])
const mockSwitch = {
_peerInfo: {
multiaddrs: {
toArray: () => [
Multiaddr('/p2p-circuit'),
Multiaddr('/p2p-websocket-star')
],
replace: () => {}
}
},
_options: {},
_connectionHandler: () => {},
transports: {
TCP: {
filter: (addrs) => addrs,
createListener: () => {
return mockListener
}
}
}
}
const transportManager = new TransportManager(mockSwitch)
transportManager.listen('TCP', null, null, (err) => {
expect(err).to.not.exist()
expect(mockListener.listen.callCount).to.eql(2)
done()
})
})
it('should filter out addresses with the same, non 0, port', (done) => {
const mockListener = sinon.stub(listener)
mockListener.listen.callsArg(1)
mockListener.getAddrs.callsArgWith(0, null, [])
const mockSwitch = {
_peerInfo: {
multiaddrs: {
toArray: () => [
Multiaddr('/ip4/127.0.0.1/tcp/8000'),
Multiaddr('/dnsaddr/libp2p.io/tcp/8000')
],
replace: () => {}
}
},
_options: {},
_connectionHandler: () => {},
transports: {
TCP: {
filter: (addrs) => addrs,
createListener: () => {
return mockListener
}
}
}
}
const transportManager = new TransportManager(mockSwitch)
transportManager.listen('TCP', null, null, (err) => {
expect(err).to.not.exist()
expect(mockListener.listen.callCount).to.eql(1)
done()
})
})
})
})