4
4
const chai = require ( 'chai' )
5
5
chai . use ( require ( 'dirty-chai' ) )
6
6
const { expect } = chai
7
+ const sinon = require ( 'sinon' )
7
8
8
9
const multiaddr = require ( 'multiaddr' )
9
10
const { collect } = require ( 'streaming-iterables' )
10
11
const pipe = require ( 'it-pipe' )
11
12
const { createPeerInfoFromFixture } = require ( '../utils/creators/peer' )
12
13
const baseOptions = require ( '../utils/base-options' )
13
14
const Libp2p = require ( '../../src' )
15
+ const { codes : Errors } = require ( '../../src/errors' )
14
16
15
17
describe ( 'Dialing (via relay, TCP)' , ( ) => {
16
18
let srcLibp2p
@@ -51,16 +53,10 @@ describe('Dialing (via relay, TCP)', () => {
51
53
. encapsulate ( `/p2p/${ relayIdString } ` )
52
54
. encapsulate ( `/p2p-circuit/p2p/${ dstLibp2p . peerInfo . id . toString ( ) } ` )
53
55
54
- // Connect the target peer and the relay, since the relay is not active
55
- const destToRelayConn = await dstLibp2p . dial ( relayAddr )
56
- expect ( destToRelayConn ) . to . exist ( )
57
-
58
56
const tcpAddrs = dstLibp2p . transportManager . getAddrs ( )
59
57
await dstLibp2p . transportManager . listen ( [ multiaddr ( `/p2p-circuit${ relayAddr } /p2p/${ relayIdString } ` ) ] )
60
58
expect ( dstLibp2p . transportManager . getAddrs ( ) ) . to . have . deep . members ( [ ...tcpAddrs , dialAddr . decapsulate ( 'p2p' ) ] )
61
59
62
- dstLibp2p . transportManager . getAddrs ( ) . forEach ( addr => console . log ( String ( addr ) ) )
63
-
64
60
const connection = await srcLibp2p . dial ( dialAddr )
65
61
expect ( connection ) . to . exist ( )
66
62
expect ( connection . remotePeer . toBytes ( ) ) . to . eql ( dstLibp2p . peerInfo . id . toBytes ( ) )
@@ -82,4 +78,97 @@ describe('Dialing (via relay, TCP)', () => {
82
78
)
83
79
expect ( output . slice ( ) ) . to . eql ( input )
84
80
} )
81
+
82
+ it ( 'should fail to connect to a peer over a relay with inactive connections' , async ( ) => {
83
+ const relayAddr = relayLibp2p . transportManager . getAddrs ( ) [ 0 ]
84
+ const relayIdString = relayLibp2p . peerInfo . id . toString ( )
85
+
86
+ const dialAddr = relayAddr
87
+ . encapsulate ( `/p2p/${ relayIdString } ` )
88
+ . encapsulate ( `/p2p-circuit/p2p/${ dstLibp2p . peerInfo . id . toString ( ) } ` )
89
+
90
+ try {
91
+ await srcLibp2p . dial ( dialAddr )
92
+ expect . fail ( 'Dial should have failed' )
93
+ } catch ( err ) {
94
+ expect ( err ) . to . exist ( )
95
+ expect ( err ) . to . have . property ( 'code' , Errors . ERR_HOP_REQUEST_FAILED )
96
+ }
97
+ } )
98
+
99
+ it ( 'should not stay connected to a relay when not already connected and HOP fails' , async ( ) => {
100
+ const relayAddr = relayLibp2p . transportManager . getAddrs ( ) [ 0 ]
101
+ const relayIdString = relayLibp2p . peerInfo . id . toString ( )
102
+
103
+ const dialAddr = relayAddr
104
+ . encapsulate ( `/p2p/${ relayIdString } ` )
105
+ . encapsulate ( `/p2p-circuit/p2p/${ dstLibp2p . peerInfo . id . toString ( ) } ` )
106
+
107
+ try {
108
+ await srcLibp2p . dial ( dialAddr )
109
+ expect . fail ( 'Dial should have failed' )
110
+ } catch ( err ) {
111
+ expect ( err ) . to . exist ( )
112
+ expect ( err ) . to . have . property ( 'code' , Errors . ERR_HOP_REQUEST_FAILED )
113
+ }
114
+
115
+ // We should not be connected to the relay, because we weren't before the dial
116
+ const srcToRelayConn = srcLibp2p . registrar . getConnection ( relayLibp2p . peerInfo )
117
+ expect ( srcToRelayConn ) . to . not . exist ( )
118
+ } )
119
+
120
+ it ( 'dialer should stay connected to an already connected relay on hop failure' , async ( ) => {
121
+ const relayAddr = relayLibp2p . transportManager . getAddrs ( ) [ 0 ]
122
+ const relayIdString = relayLibp2p . peerInfo . id . toString ( )
123
+
124
+ const dialAddr = relayAddr
125
+ . encapsulate ( `/p2p/${ relayIdString } ` )
126
+ . encapsulate ( `/p2p-circuit/p2p/${ dstLibp2p . peerInfo . id . toString ( ) } ` )
127
+
128
+ // Connect to the relay first
129
+ await srcLibp2p . dial ( relayAddr )
130
+
131
+ try {
132
+ await srcLibp2p . dial ( dialAddr )
133
+ expect . fail ( 'Dial should have failed' )
134
+ } catch ( err ) {
135
+ expect ( err ) . to . exist ( )
136
+ expect ( err ) . to . have . property ( 'code' , Errors . ERR_HOP_REQUEST_FAILED )
137
+ }
138
+
139
+ const srcToRelayConn = srcLibp2p . registrar . getConnection ( relayLibp2p . peerInfo )
140
+ expect ( srcToRelayConn ) . to . exist ( )
141
+ expect ( srcToRelayConn . stat . status ) . to . equal ( 'open' )
142
+ } )
143
+
144
+ it ( 'destination peer should stay connected to an already connected relay on hop failure' , async ( ) => {
145
+ const relayAddr = relayLibp2p . transportManager . getAddrs ( ) [ 0 ]
146
+ const relayIdString = relayLibp2p . peerInfo . id . toString ( )
147
+
148
+ const dialAddr = relayAddr
149
+ . encapsulate ( `/p2p/${ relayIdString } ` )
150
+ . encapsulate ( `/p2p-circuit/p2p/${ dstLibp2p . peerInfo . id . toString ( ) } ` )
151
+
152
+ // Connect the destination peer and the relay
153
+ const tcpAddrs = dstLibp2p . transportManager . getAddrs ( )
154
+ await dstLibp2p . transportManager . listen ( [ multiaddr ( `/p2p-circuit${ relayAddr } /p2p/${ relayIdString } ` ) ] )
155
+ expect ( dstLibp2p . transportManager . getAddrs ( ) ) . to . have . deep . members ( [ ...tcpAddrs , dialAddr . decapsulate ( 'p2p' ) ] )
156
+
157
+ // Tamper with the our multiaddrs for the circuit message
158
+ sinon . stub ( srcLibp2p . peerInfo . multiaddrs , 'toArray' ) . returns ( [ {
159
+ buffer : Buffer . from ( 'an invalid multiaddr' )
160
+ } ] )
161
+
162
+ try {
163
+ await srcLibp2p . dial ( dialAddr )
164
+ expect . fail ( 'Dial should have failed' )
165
+ } catch ( err ) {
166
+ expect ( err ) . to . exist ( )
167
+ expect ( err ) . to . have . property ( 'code' , Errors . ERR_HOP_REQUEST_FAILED )
168
+ }
169
+
170
+ const dstToRelayConn = dstLibp2p . registrar . getConnection ( relayLibp2p . peerInfo )
171
+ expect ( dstToRelayConn ) . to . exist ( )
172
+ expect ( dstToRelayConn . stat . status ) . to . equal ( 'open' )
173
+ } )
85
174
} )
0 commit comments