-
Notifications
You must be signed in to change notification settings - Fork 67
/
Copy pathresolvers.spec.ts
137 lines (106 loc) · 5.46 KB
/
resolvers.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/* eslint-env mocha */
import { expect } from 'aegir/chai'
import sinon from 'sinon'
import { multiaddr, resolvers } from '../src/index.js'
import * as resolversInternal from '../src/resolvers/index.js'
import Resolver from '../src/resolvers/dns.js'
const dnsaddrStub1 = [
['dnsaddr=/dnsaddr/ams-1.bootstrap.libp2p.io/p2p/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd'],
['dnsaddr=/dnsaddr/ams-2.bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb'],
['dnsaddr=/dnsaddr/lon-1.bootstrap.libp2p.io/p2p/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3'],
['dnsaddr=/dnsaddr/nrt-1.bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt'],
['dnsaddr=/dnsaddr/nyc-1.bootstrap.libp2p.io/p2p/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm'],
['dnsaddr=/dnsaddr/sfo-2.bootstrap.libp2p.io/p2p/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z']
]
const dnsaddrStub2 = [
['dnsaddr=/ip4/147.75.83.83/tcp/4001/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb'],
['dnsaddr=/ip4/147.75.83.83/tcp/443/wss/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb'],
['dnsaddr=/ip4/147.75.83.83/udp/4001/quic/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb'],
['dnsaddr=/ip6/2604:1380:2000:7a00::1/tcp/4001/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb'],
['dnsaddr=/ip6/2604:1380:2000:7a00::1/tcp/443/wss/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb'],
['dnsaddr=/ip6/2604:1380:2000:7a00::1/udp/4001/quic/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb']
]
const dnsaddrStub3 = [
['dnsaddr=/dnsaddr/sv15.bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN'],
['dnsaddr=/dnsaddr/ny5.bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa'],
['dnsaddr_record_value'],
['dnsaddr=/dnsaddr/am6.bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb'],
['dnsaddr=/dnsaddr/sg1.bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt']
]
describe('multiaddr resolve', () => {
it('should throw if no resolver is available', async () => {
const ma = multiaddr('/dnsaddr/bootstrap.libp2p.io')
// Resolve
await expect(ma.resolve()).to.eventually.be.rejected()
.and.to.have.property('code', 'ERR_NO_AVAILABLE_RESOLVER')
})
describe('dnsaddr', () => {
before(() => {
// Set resolvers
resolvers.set('dnsaddr', resolversInternal.dnsaddrResolver)
})
afterEach(() => {
sinon.restore()
})
it('can resolve dnsaddr without no peerId', async () => {
const ma = multiaddr('/dnsaddr/bootstrap.libp2p.io')
const stub = sinon.stub(Resolver.prototype, 'resolveTxt')
stub.onCall(0).returns(Promise.resolve(dnsaddrStub1))
// Resolve
const resolvedMas = await ma.resolve()
expect(resolvedMas).to.have.length(dnsaddrStub1.length)
resolvedMas.forEach((ma, index) => {
const stubAddr = dnsaddrStub1[index][0].split('=')[1]
expect(ma.equals(multiaddr(stubAddr))).to.equal(true)
})
})
it('can resolve dnsaddr with peerId', async () => {
const ma = multiaddr('/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb')
const stub = sinon.stub(Resolver.prototype, 'resolveTxt')
stub.onCall(0).returns(Promise.resolve(dnsaddrStub1))
stub.onCall(1).returns(Promise.resolve(dnsaddrStub2))
// Resolve
const resolvedMas = await ma.resolve()
expect(resolvedMas).to.have.length(1)
expect(resolvedMas[0].equals(multiaddr('/dnsaddr/ams-2.bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb'))).to.eql(true)
})
it('can resolve dnsaddr with peerId two levels', async () => {
const ma = multiaddr('/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb')
const stub = sinon.stub(Resolver.prototype, 'resolveTxt')
stub.onCall(0).returns(Promise.resolve(dnsaddrStub1))
stub.onCall(1).returns(Promise.resolve(dnsaddrStub2))
// Resolve
const resolvedInitialMas = await ma.resolve()
const resolvedSecondMas = await Promise.all(resolvedInitialMas.map(async nm => {
// nm.resolvers.set('dnsaddr', resolvers.dnsaddrResolver)
return await nm.resolve()
}))
const resolvedMas = resolvedSecondMas.flat()
expect(resolvedMas).to.have.length(dnsaddrStub2.length)
resolvedMas.forEach((ma, index) => {
const stubAddr = dnsaddrStub2[index][0].split('=')[1]
expect(ma.equals(multiaddr(stubAddr))).to.equal(true)
})
})
it('can resolve dnsaddr with bad record', async () => {
const ma = multiaddr('/dnsaddr/am6.bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb')
const stub = sinon.stub(Resolver.prototype, 'resolveTxt')
stub.onCall(0).returns(Promise.resolve(dnsaddrStub3))
// Resolve
const resolvedMas = await ma.resolve()
// Should only have one address with the same peer id and should ignore the bad record
expect(resolvedMas).to.have.lengthOf(1)
expect(resolvedMas[0].toString()).to.equal(ma.toString())
})
it('can cancel resolving', async () => {
const ma = multiaddr('/dnsaddr/bootstrap.libp2p.ii/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nc')
const controller = new AbortController()
// Resolve
const resolvePromise = ma.resolve({
signal: controller.signal
})
controller.abort()
await expect(resolvePromise).to.eventually.be.rejected().with.property('code', 'ECANCELLED')
})
})
})