1
1
/* eslint-env mocha */
2
2
3
- import { expect } from 'aegir/chai'
4
- import sinon from 'sinon'
5
- import { tcp } from '@libp2p/tcp'
6
3
import { mplex } from '@libp2p/mplex'
7
- import { plaintext } from '../../src/insecure/index.js '
4
+ import { tcp } from '@libp2p/tcp '
8
5
import type { Multiaddr } from '@multiformats/multiaddr'
9
6
import { multiaddr } from '@multiformats/multiaddr'
7
+ import { expect } from 'aegir/chai'
8
+ import sinon from 'sinon'
9
+ import { plaintext } from '../../src/insecure/index.js'
10
10
11
+ import { Connection , isConnection } from '@libp2p/interface-connection'
12
+ import { mockConnection , mockConnectionGater , mockDuplex , mockMultiaddrConnection , mockUpgrader } from '@libp2p/interface-mocks'
13
+ import type { PeerId } from '@libp2p/interface-peer-id'
14
+ import { AbortError } from '@libp2p/interfaces/errors'
15
+ import { createFromJSON } from '@libp2p/peer-id-factory'
16
+ import { PersistentPeerStore } from '@libp2p/peer-store'
17
+ import { MemoryDatastore } from 'datastore-core/memory'
11
18
import delay from 'delay'
19
+ import { pipe } from 'it-pipe'
20
+ import { pushable } from 'it-pushable'
12
21
import pDefer from 'p-defer'
13
22
import pSettle , { PromiseResult } from 'p-settle'
14
23
import pWaitFor from 'p-wait-for'
15
- import { pipe } from 'it-pipe'
16
- import { pushable } from 'it-pushable'
17
- import { Connection , isConnection } from '@libp2p/interface-connection'
18
- import { AbortError } from '@libp2p/interfaces/errors'
19
24
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
20
- import { MemoryDatastore } from 'datastore-core/memory'
21
- import { DefaultDialer } from '../../src/connection-manager/dialer/index.js'
22
25
import { DefaultAddressManager } from '../../src/address-manager/index.js'
23
- import { PersistentPeerStore } from '@libp2p/peer-store'
24
- import { DefaultTransportManager } from '../../src/transport-manager.js'
26
+ import { DefaultComponents } from '../../src/components.js'
27
+ import { DefaultDialer } from '../../src/connection-manager/dialer/index.js'
28
+ import { DefaultConnectionManager } from '../../src/connection-manager/index.js'
25
29
import { codes as ErrorCodes } from '../../src/errors.js'
26
- import { mockConnectionGater , mockDuplex , mockMultiaddrConnection , mockUpgrader , mockConnection } from '@libp2p/interface-mocks'
27
- import Peers from '../fixtures/peers.js'
28
- import { createFromJSON } from '@libp2p/peer-id-factory'
29
- import type { PeerId } from '@libp2p/interface-peer-id'
30
30
import { createLibp2pNode , Libp2pNode } from '../../src/libp2p.js'
31
31
import { preSharedKey } from '../../src/pnet/index.js'
32
+ import { DefaultTransportManager } from '../../src/transport-manager.js'
33
+ import Peers from '../fixtures/peers.js'
32
34
import swarmKey from '../fixtures/swarm.key.js'
33
- import { DefaultConnectionManager } from '../../src/connection-manager/index.js'
34
- import { DefaultComponents } from '../../src/components.js'
35
+ import { getPeer } from '../../src/get-peer.js'
35
36
36
37
const swarmKeyBuffer = uint8ArrayFromString ( swarmKey )
37
38
const listenAddr = multiaddr ( '/ip4/127.0.0.1/tcp/0' )
@@ -43,8 +44,10 @@ describe('Dialing (direct, TCP)', () => {
43
44
let remoteAddr : Multiaddr
44
45
let remoteComponents : DefaultComponents
45
46
let localComponents : DefaultComponents
47
+ let resolver : sinon . SinonStub < [ Multiaddr ] , Promise < string [ ] > >
46
48
47
49
beforeEach ( async ( ) => {
50
+ resolver = sinon . stub < [ Multiaddr ] , Promise < string [ ] > > ( )
48
51
const [ localPeerId , remotePeerId ] = await Promise . all ( [
49
52
createFromJSON ( Peers [ 0 ] ) ,
50
53
createFromJSON ( Peers [ 1 ] )
@@ -103,6 +106,19 @@ describe('Dialing (direct, TCP)', () => {
103
106
await connection . close ( )
104
107
} )
105
108
109
+ it ( 'should be able to connect to remote node with duplicated addresses' , async ( ) => {
110
+ const dnsaddr = multiaddr ( `/dnsaddr/remote.libp2p.io/p2p/${ remoteAddr . getPeerId ( ) ?? '' } ` )
111
+ await localComponents . peerStore . addressBook . add ( getPeer ( remoteAddr ) . id , [ dnsaddr ] )
112
+ const dialer = new DefaultDialer ( localComponents , { resolvers : { dnsaddr : resolver } , maxAddrsToDial : 1 } )
113
+
114
+ // Resolver stub
115
+ resolver . onCall ( 1 ) . resolves ( [ remoteAddr . toString ( ) ] )
116
+
117
+ const connection = await dialer . dial ( remoteAddr )
118
+ expect ( connection ) . to . exist ( )
119
+ await connection . close ( )
120
+ } )
121
+
106
122
it ( 'should fail to connect to an unsupported multiaddr' , async ( ) => {
107
123
const dialer = new DefaultDialer ( localComponents )
108
124
0 commit comments