@@ -7,11 +7,18 @@ const { expect } = chai
7
7
const sinon = require ( 'sinon' )
8
8
9
9
const pDefer = require ( 'p-defer' )
10
+ const mergeOptions = require ( 'merge-options' )
11
+
12
+ const Libp2p = require ( '../../src' )
10
13
const PeerStore = require ( '../../src/peer-store' )
11
14
const multiaddr = require ( 'multiaddr' )
12
15
13
- const addr = multiaddr ( '/ip4/127.0.0.1/tcp/8000 ')
16
+ const baseOptions = require ( '../utils/base-options ')
14
17
const peerUtils = require ( '../utils/creators/peer' )
18
+ const mockConnection = require ( '../utils/mockConnection' )
19
+
20
+ const addr = multiaddr ( '/ip4/127.0.0.1/tcp/8000' )
21
+ const listenAddr = multiaddr ( '/ip4/127.0.0.1/tcp/0' )
15
22
16
23
describe ( 'peer-store' , ( ) => {
17
24
let peerStore
@@ -75,49 +82,55 @@ describe('peer-store', () => {
75
82
76
83
it ( 'should emit the "change:multiaddrs" event when a peer has new multiaddrs' , async ( ) => {
77
84
const defer = pDefer ( )
78
- const [ peerInfo ] = await peerUtils . createPeerInfo ( 1 )
85
+ const [ createdPeerInfo ] = await peerUtils . createPeerInfo ( 1 )
79
86
80
87
// Put the peer in the store
81
- peerStore . put ( peerInfo )
88
+ peerStore . put ( createdPeerInfo )
82
89
83
90
// When updating, "change:multiaddrs" event must not be emitted
84
91
peerStore . on ( 'change:multiaddrs' , ( { peerInfo, multiaddrs } ) => {
85
92
expect ( peerInfo ) . to . exist ( )
93
+ expect ( peerInfo . id ) . to . eql ( createdPeerInfo . id )
94
+ expect ( peerInfo . protocols ) . to . eql ( createdPeerInfo . protocols )
86
95
expect ( multiaddrs ) . to . exist ( )
96
+ expect ( multiaddrs ) . to . eql ( createdPeerInfo . multiaddrs . toArray ( ) )
87
97
defer . resolve ( )
88
98
} )
89
99
// If no protocols change, the event should not be emitted
90
100
peerStore . on ( 'change:protocols' , ( ) => {
91
101
throw new Error ( 'should not emit change:protocols' )
92
102
} )
93
103
94
- peerInfo . multiaddrs . add ( addr )
95
- peerStore . put ( peerInfo )
104
+ createdPeerInfo . multiaddrs . add ( addr )
105
+ peerStore . put ( createdPeerInfo )
96
106
97
107
// Wait for peerStore to emit the event
98
108
await defer . promise
99
109
} )
100
110
101
111
it ( 'should emit the "change:protocols" event when a peer has new protocols' , async ( ) => {
102
112
const defer = pDefer ( )
103
- const [ peerInfo ] = await peerUtils . createPeerInfo ( 1 )
113
+ const [ createdPeerInfo ] = await peerUtils . createPeerInfo ( 1 )
104
114
105
115
// Put the peer in the store
106
- peerStore . put ( peerInfo )
116
+ peerStore . put ( createdPeerInfo )
107
117
108
118
// If no multiaddrs change, the event should not be emitted
109
119
peerStore . on ( 'change:multiaddrs' , ( ) => {
110
120
throw new Error ( 'should not emit change:multiaddrs' )
111
121
} )
112
- // When updating, "change:protocols" event must not be emitted
122
+ // When updating, "change:protocols" event must be emitted
113
123
peerStore . on ( 'change:protocols' , ( { peerInfo, protocols } ) => {
114
124
expect ( peerInfo ) . to . exist ( )
125
+ expect ( peerInfo . id ) . to . eql ( createdPeerInfo . id )
126
+ expect ( peerInfo . multiaddrs ) . to . eql ( createdPeerInfo . multiaddrs )
115
127
expect ( protocols ) . to . exist ( )
128
+ expect ( protocols ) . to . eql ( Array . from ( createdPeerInfo . protocols ) )
116
129
defer . resolve ( )
117
130
} )
118
131
119
- peerInfo . protocols . add ( '/new-protocol/1.0.0' )
120
- peerStore . put ( peerInfo )
132
+ createdPeerInfo . protocols . add ( '/new-protocol/1.0.0' )
133
+ peerStore . put ( createdPeerInfo )
121
134
122
135
// Wait for peerStore to emit the event
123
136
await defer . promise
@@ -127,19 +140,17 @@ describe('peer-store', () => {
127
140
const [ peerInfo ] = await peerUtils . createPeerInfo ( 1 )
128
141
const id = peerInfo . id . toB58String ( )
129
142
130
- try {
131
- peerStore . get ( id )
132
- throw new Error ( 'peer should not exist in store' )
133
- } catch ( err ) {
134
- expect ( err ) . to . exist ( )
135
- expect ( err . code ) . to . eql ( 'ERR_NO_PEER_INFO' )
136
- }
143
+ let retrievedPeer = peerStore . get ( id )
144
+ expect ( retrievedPeer ) . to . not . exist ( )
137
145
138
146
// Put the peer in the store
139
147
peerStore . put ( peerInfo )
140
148
141
- const retrievedPeer = peerStore . get ( id )
149
+ retrievedPeer = peerStore . get ( id )
142
150
expect ( retrievedPeer ) . to . exist ( )
151
+ expect ( retrievedPeer . id ) . to . equal ( peerInfo . id )
152
+ expect ( retrievedPeer . multiaddrs ) . to . eql ( peerInfo . multiaddrs )
153
+ expect ( retrievedPeer . protocols ) . to . eql ( peerInfo . protocols )
143
154
} )
144
155
145
156
it ( 'should be able to remove a peer from store through its b58str id' , async ( ) => {
@@ -151,11 +162,59 @@ describe('peer-store', () => {
151
162
152
163
// Put the peer in the store
153
164
peerStore . put ( peerInfo )
154
-
155
- const peers = peerStore . getAllArray ( )
156
- expect ( peers ) . to . have . lengthOf ( 1 )
165
+ expect ( peerStore . peers . size ) . to . equal ( 1 )
157
166
158
167
removed = peerStore . remove ( id )
159
168
expect ( removed ) . to . eql ( true )
169
+ expect ( peerStore . peers . size ) . to . equal ( 0 )
160
170
} )
161
171
} )
172
+
173
+ describe ( 'peer-store on dial' , ( ) => {
174
+ let peerInfo
175
+ let remotePeerInfo
176
+ let libp2p
177
+ let remoteLibp2p
178
+
179
+ before ( async ( ) => {
180
+ [ peerInfo , remotePeerInfo ] = await peerUtils . createPeerInfoFromFixture ( 2 )
181
+ remoteLibp2p = new Libp2p ( mergeOptions ( baseOptions , {
182
+ peerInfo : remotePeerInfo
183
+ } ) )
184
+ } )
185
+
186
+ after ( async ( ) => {
187
+ sinon . restore ( )
188
+ await remoteLibp2p . stop ( )
189
+ libp2p && await libp2p . stop ( )
190
+ } )
191
+
192
+ it ( 'should put the remote peerInfo after dial and emit event' , async ( ) => {
193
+ const remoteId = remotePeerInfo . id . toB58String ( )
194
+
195
+ libp2p = new Libp2p ( mergeOptions ( baseOptions , {
196
+ peerInfo
197
+ } ) )
198
+
199
+ sinon . spy ( libp2p . peerStore , 'put' )
200
+ sinon . spy ( libp2p . peerStore , 'add' )
201
+ sinon . spy ( libp2p . peerStore , 'update' )
202
+ sinon . stub ( libp2p . dialer , 'connectToMultiaddr' ) . returns ( mockConnection ( {
203
+ remotePeer : remotePeerInfo . id
204
+ } ) )
205
+
206
+ const connection = await libp2p . dial ( listenAddr )
207
+ await connection . close ( )
208
+
209
+ expect ( libp2p . peerStore . put . callCount ) . to . equal ( 1 )
210
+ expect ( libp2p . peerStore . add . callCount ) . to . equal ( 1 )
211
+ expect ( libp2p . peerStore . update . callCount ) . to . equal ( 0 )
212
+
213
+ const storedPeer = libp2p . peerStore . get ( remoteId )
214
+ expect ( storedPeer ) . to . exist ( )
215
+ } )
216
+ } )
217
+
218
+ describe ( 'peer-store on discovery' , ( ) => {
219
+ // TODO: implement with discovery
220
+ } )
0 commit comments