@@ -7,6 +7,8 @@ const sinon = require('sinon')
7
7
const multiaddr = require ( 'multiaddr' )
8
8
const { Resolver } = require ( 'multiaddr/src/resolvers/dns' )
9
9
10
+ const { codes : ErrorCodes } = require ( '../../src/errors' )
11
+
10
12
const peerUtils = require ( '../utils/creators/peer' )
11
13
const baseOptions = require ( '../utils/base-options.browser' )
12
14
@@ -88,10 +90,10 @@ describe('Dialing (resolvable addresses)', () => {
88
90
89
91
// Resolver stub
90
92
const stub = sinon . stub ( Resolver . prototype , 'resolveTxt' )
91
- let alreadyCalled = false
93
+ let firstCall = false
92
94
stub . callsFake ( ( ) => {
93
- if ( ! alreadyCalled ) {
94
- alreadyCalled = true
95
+ if ( ! firstCall ) {
96
+ firstCall = true
95
97
// Return an array of dnsaddr
96
98
return Promise . resolve ( getDnsaddrStub ( remoteId ) )
97
99
}
@@ -108,6 +110,7 @@ describe('Dialing (resolvable addresses)', () => {
108
110
} )
109
111
110
112
// TODO: Temporary solution does not resolve dns4/dns6
113
+ // Resolver just returns the received multiaddrs
111
114
it ( 'stops recursive resolve if finds dns4/dns6 and dials it' , async ( ) => {
112
115
const remoteId = remoteLibp2p . peerId . toB58String ( )
113
116
const dialAddr = multiaddr ( `/dnsaddr/remote.libp2p.io/p2p/${ remoteId } ` )
@@ -128,4 +131,58 @@ describe('Dialing (resolvable addresses)', () => {
128
131
129
132
await libp2p . dial ( dialAddr )
130
133
} )
134
+
135
+ it ( 'resolves a dnsaddr recursively not failing if one address fails to resolve' , async ( ) => {
136
+ const remoteId = remoteLibp2p . peerId . toB58String ( )
137
+ const dialAddr = multiaddr ( `/dnsaddr/remote.libp2p.io/p2p/${ remoteId } ` )
138
+ const relayedAddrFetched = multiaddr ( relayedAddr ( remoteId ) )
139
+
140
+ // Transport spy
141
+ const transport = libp2p . transportManager . _transports . get ( 'Circuit' )
142
+ sinon . spy ( transport , 'dial' )
143
+
144
+ // Resolver stub
145
+ let firstCall = false
146
+ let secondCall = false
147
+
148
+ const stub = sinon . stub ( Resolver . prototype , 'resolveTxt' )
149
+ stub . callsFake ( ( ) => {
150
+ if ( ! firstCall ) {
151
+ firstCall = true
152
+ // Return an array of dnsaddr
153
+ return Promise . resolve ( getDnsaddrStub ( remoteId ) )
154
+ } else if ( ! secondCall ) {
155
+ secondCall = true
156
+ // Address failed to resolve
157
+ return Promise . reject ( new Error ( ) )
158
+ }
159
+ return Promise . resolve ( getDnsRelayedAddrStub ( remoteId ) )
160
+ } )
161
+
162
+ // Dial with address resolve
163
+ const connection = await libp2p . dial ( dialAddr )
164
+ expect ( connection ) . to . exist ( )
165
+ expect ( connection . remoteAddr . equals ( relayedAddrFetched ) )
166
+
167
+ const dialArgs = transport . dial . firstCall . args
168
+ expect ( dialArgs [ 0 ] . equals ( relayedAddrFetched ) ) . to . eql ( true )
169
+ } )
170
+
171
+ it ( 'fails to dial if resolve fails and there are no addresses to dial' , async ( ) => {
172
+ const remoteId = remoteLibp2p . peerId . toB58String ( )
173
+ const dialAddr = multiaddr ( `/dnsaddr/remote.libp2p.io/p2p/${ remoteId } ` )
174
+
175
+ // Stub resolver
176
+ const stubResolve = sinon . stub ( Resolver . prototype , 'resolveTxt' )
177
+ stubResolve . returns ( Promise . reject ( new Error ( ) ) )
178
+
179
+ // Stub transport
180
+ const transport = libp2p . transportManager . _transports . get ( 'WebSockets' )
181
+ const spy = sinon . spy ( transport , 'dial' )
182
+
183
+ await expect ( libp2p . dial ( dialAddr ) )
184
+ . to . eventually . be . rejectedWith ( Error )
185
+ . and . to . have . nested . property ( '.code' , ErrorCodes . ERR_NO_VALID_ADDRESSES )
186
+ expect ( spy . callCount ) . to . eql ( 0 )
187
+ } )
131
188
} )
0 commit comments