1
1
import chai from 'chai'
2
2
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
3
3
import delay from 'delay'
4
- import Gossipsub , { multicodec } from '../ts'
5
- import { createGossipsubs , createConnectedGossipsubs , expectSet , stopNode , first } from './utils'
4
+ import Gossipsub from '../ts'
5
+ import { createGossipsubs , createPubsubs , createConnectedGossipsubs , expectSet , stopNode , first } from './utils'
6
6
import { RPC } from '../ts/message/rpc'
7
- import { InMessage , PeerId } from 'libp2p-interfaces/src/pubsub'
7
+ import PubsubBaseProtocol , { PeerId } from 'libp2p-interfaces/src/pubsub'
8
+ import { FloodsubID , GossipsubIDv11 } from '../ts/constants'
9
+ import { GossipsubMessage } from '../ts/types'
8
10
9
11
chai . use ( require ( 'dirty-chai' ) )
10
12
chai . use ( require ( 'chai-spies' ) )
@@ -13,6 +15,28 @@ const expect = chai.expect
13
15
const shouldNotHappen = ( ) => expect . fail ( )
14
16
15
17
describe ( '2 nodes' , ( ) => {
18
+ describe ( 'Pubsub dial' , ( ) => {
19
+ let nodes : PubsubBaseProtocol [ ]
20
+
21
+ // Create pubsub nodes
22
+ before ( async ( ) => {
23
+ nodes = await createPubsubs ( { number : 2 } )
24
+ } )
25
+
26
+ after ( ( ) => Promise . all ( nodes . map ( stopNode ) ) )
27
+
28
+ it ( 'Dial from nodeA to nodeB happened with pubsub' , async ( ) => {
29
+ await nodes [ 0 ] . _libp2p . dialProtocol ( nodes [ 1 ] . _libp2p . peerId , FloodsubID )
30
+
31
+ while ( nodes [ 0 ] [ 'peers' ] . size === 0 || nodes [ 1 ] [ 'peers' ] . size === 0 ) {
32
+ await delay ( 10 )
33
+ }
34
+
35
+ expect ( nodes [ 0 ] [ 'peers' ] . size ) . to . be . eql ( 1 )
36
+ expect ( nodes [ 1 ] [ 'peers' ] . size ) . to . be . eql ( 1 )
37
+ } )
38
+ } )
39
+
16
40
describe ( 'basics' , ( ) => {
17
41
let nodes : Gossipsub [ ] = [ ]
18
42
@@ -24,15 +48,14 @@ describe('2 nodes', () => {
24
48
after ( ( ) => Promise . all ( nodes . map ( stopNode ) ) )
25
49
26
50
it ( 'Dial from nodeA to nodeB happened with pubsub' , async ( ) => {
27
- await nodes [ 0 ] . _libp2p . dialProtocol ( nodes [ 1 ] . _libp2p . peerId , multicodec )
28
- await delay ( 10 )
29
- await Promise . all ( [
30
- new Promise ( ( resolve ) => nodes [ 0 ] . once ( 'gossipsub:heartbeat' , resolve ) ) ,
31
- new Promise ( ( resolve ) => nodes [ 1 ] . once ( 'gossipsub:heartbeat' , resolve ) )
32
- ] )
51
+ await nodes [ 0 ] . _libp2p . dialProtocol ( nodes [ 1 ] . _libp2p . peerId , GossipsubIDv11 )
33
52
34
- expect ( nodes [ 0 ] . peers . size ) . to . be . eql ( 1 )
35
- expect ( nodes [ 1 ] . peers . size ) . to . be . eql ( 1 )
53
+ while ( nodes [ 0 ] [ 'peers' ] . size === 0 || nodes [ 1 ] [ 'peers' ] . size === 0 ) {
54
+ await delay ( 10 )
55
+ }
56
+
57
+ expect ( nodes [ 0 ] [ 'peers' ] . size ) . to . be . eql ( 1 )
58
+ expect ( nodes [ 1 ] [ 'peers' ] . size ) . to . be . eql ( 1 )
36
59
} )
37
60
} )
38
61
@@ -47,7 +70,14 @@ describe('2 nodes', () => {
47
70
after ( ( ) => Promise . all ( nodes . map ( stopNode ) ) )
48
71
49
72
it ( 'Subscribe to a topic' , async ( ) => {
50
- const topic = 'Z'
73
+ const topic = 'test_topic'
74
+
75
+ // await subscription change, after calling subscribe
76
+ const subscriptionEventPromise = Promise . all ( [
77
+ new Promise ( ( resolve ) => nodes [ 0 ] . once ( 'pubsub:subscription-change' , ( ...args ) => resolve ( args ) ) ) ,
78
+ new Promise ( ( resolve ) => nodes [ 1 ] . once ( 'pubsub:subscription-change' , ( ...args ) => resolve ( args ) ) )
79
+ ] )
80
+
51
81
nodes [ 0 ] . subscribe ( topic )
52
82
nodes [ 1 ] . subscribe ( topic )
53
83
@@ -61,14 +91,14 @@ describe('2 nodes', () => {
61
91
62
92
const [ changedPeerId , changedSubs ] = evt0 as [ PeerId , RPC . ISubOpts [ ] ]
63
93
64
- expectSet ( nodes [ 0 ] . subscriptions , [ topic ] )
65
- expectSet ( nodes [ 1 ] . subscriptions , [ topic ] )
66
- expect ( nodes [ 0 ] . peers . size ) . to . equal ( 1 )
67
- expect ( nodes [ 1 ] . peers . size ) . to . equal ( 1 )
68
- expectSet ( nodes [ 0 ] . topics . get ( topic ) , [ nodes [ 1 ] . peerId . toB58String ( ) ] )
69
- expectSet ( nodes [ 1 ] . topics . get ( topic ) , [ nodes [ 0 ] . peerId . toB58String ( ) ] )
94
+ expectSet ( nodes [ 0 ] [ ' subscriptions' ] , [ topic ] )
95
+ expectSet ( nodes [ 1 ] [ ' subscriptions' ] , [ topic ] )
96
+ expect ( nodes [ 0 ] [ ' peers' ] . size ) . to . equal ( 1 )
97
+ expect ( nodes [ 1 ] [ ' peers' ] . size ) . to . equal ( 1 )
98
+ expectSet ( nodes [ 0 ] [ ' topics' ] . get ( topic ) , [ nodes [ 1 ] . peerId . toB58String ( ) ] )
99
+ expectSet ( nodes [ 1 ] [ ' topics' ] . get ( topic ) , [ nodes [ 0 ] . peerId . toB58String ( ) ] )
70
100
71
- expect ( changedPeerId . toB58String ( ) ) . to . equal ( first ( nodes [ 0 ] . peers ) . id . toB58String ( ) )
101
+ expect ( changedPeerId . toB58String ( ) ) . to . equal ( first ( nodes [ 0 ] [ ' peers' ] ) . id . toB58String ( ) )
72
102
expect ( changedSubs ) . to . have . lengthOf ( 1 )
73
103
expect ( changedSubs [ 0 ] . topicID ) . to . equal ( topic )
74
104
expect ( changedSubs [ 0 ] . subscribe ) . to . equal ( true )
@@ -79,8 +109,8 @@ describe('2 nodes', () => {
79
109
new Promise ( ( resolve ) => nodes [ 1 ] . once ( 'gossipsub:heartbeat' , resolve ) )
80
110
] )
81
111
82
- expect ( first ( nodes [ 0 ] . mesh . get ( topic ) ) ) . to . equal ( first ( nodes [ 0 ] . peers ) . id . toB58String ( ) )
83
- expect ( first ( nodes [ 1 ] . mesh . get ( topic ) ) ) . to . equal ( first ( nodes [ 1 ] . peers ) . id . toB58String ( ) )
112
+ expect ( first ( nodes [ 0 ] [ ' mesh' ] . get ( topic ) ) ) . to . equal ( first ( nodes [ 0 ] [ ' peers' ] ) . id . toB58String ( ) )
113
+ expect ( first ( nodes [ 1 ] [ ' mesh' ] . get ( topic ) ) ) . to . equal ( first ( nodes [ 1 ] [ ' peers' ] ) . id . toB58String ( ) )
84
114
} )
85
115
} )
86
116
@@ -109,29 +139,29 @@ describe('2 nodes', () => {
109
139
afterEach ( ( ) => Promise . all ( nodes . map ( stopNode ) ) )
110
140
111
141
it ( 'Publish to a topic - nodeA' , async ( ) => {
112
- const promise = new Promise < InMessage > ( ( resolve ) => nodes [ 1 ] . once ( topic , resolve ) )
142
+ const promise = new Promise < GossipsubMessage > ( ( resolve ) => nodes [ 1 ] . once ( topic , resolve ) )
113
143
nodes [ 0 ] . once ( topic , ( m ) => shouldNotHappen )
114
144
115
145
nodes [ 0 ] . publish ( topic , uint8ArrayFromString ( 'hey' ) )
116
146
117
147
const msg = await promise
118
148
119
149
expect ( msg . data . toString ( ) ) . to . equal ( 'hey' )
120
- expect ( msg . from ) . to . be . eql ( nodes [ 0 ] . peerId . toB58String ( ) )
150
+ expect ( msg . from ) . to . be . eql ( nodes [ 0 ] . peerId . toBytes ( ) )
121
151
122
152
nodes [ 0 ] . removeListener ( topic , shouldNotHappen )
123
153
} )
124
154
125
155
it ( 'Publish to a topic - nodeB' , async ( ) => {
126
- const promise = new Promise < InMessage > ( ( resolve ) => nodes [ 0 ] . once ( topic , resolve ) )
156
+ const promise = new Promise < GossipsubMessage > ( ( resolve ) => nodes [ 0 ] . once ( topic , resolve ) )
127
157
nodes [ 1 ] . once ( topic , shouldNotHappen )
128
158
129
159
nodes [ 1 ] . publish ( topic , uint8ArrayFromString ( 'banana' ) )
130
160
131
161
const msg = await promise
132
162
133
163
expect ( msg . data . toString ( ) ) . to . equal ( 'banana' )
134
- expect ( msg . from ) . to . be . eql ( nodes [ 1 ] . peerId . toB58String ( ) )
164
+ expect ( msg . from ) . to . be . eql ( nodes [ 1 ] . peerId . toBytes ( ) )
135
165
136
166
nodes [ 1 ] . removeListener ( topic , shouldNotHappen )
137
167
} )
@@ -143,11 +173,11 @@ describe('2 nodes', () => {
143
173
144
174
nodes [ 0 ] . on ( topic , receivedMsg )
145
175
146
- function receivedMsg ( msg : InMessage ) {
147
- expect ( msg . data . toString ( ) . startsWith ( 'banana' ) ) . to . be . true
148
- expect ( msg . from ) . to . be . eql ( nodes [ 1 ] . peerId . toB58String ( ) )
176
+ function receivedMsg ( msg : RPC . IMessage ) {
177
+ expect ( msg . data ! . toString ( ) . startsWith ( 'banana' ) ) . to . be . true
178
+ expect ( msg . from ) . to . be . eql ( nodes [ 1 ] . peerId . toBytes ( ) )
149
179
expect ( msg . seqno ) . to . be . a ( 'Uint8Array' )
150
- expect ( msg . topicIDs ) . to . be . eql ( [ topic ] )
180
+ expect ( msg . topic ) . to . be . eql ( topic )
151
181
152
182
if ( ++ counter === 10 ) {
153
183
nodes [ 0 ] . removeListener ( topic , receivedMsg )
@@ -168,7 +198,7 @@ describe('2 nodes', () => {
168
198
169
199
// Create pubsub nodes
170
200
beforeEach ( async ( ) => {
171
- nodes = await createConnectedGossipsubs ( { number : 2 } )
201
+ nodes = await createConnectedGossipsubs ( { number : 2 , options : { allowPublishToZeroPeers : true } } )
172
202
} )
173
203
174
204
// Create subscriptions
@@ -188,16 +218,16 @@ describe('2 nodes', () => {
188
218
189
219
it ( 'Unsubscribe from a topic' , async ( ) => {
190
220
nodes [ 0 ] . unsubscribe ( topic )
191
- expect ( nodes [ 0 ] . subscriptions . size ) . to . equal ( 0 )
221
+ expect ( nodes [ 0 ] [ ' subscriptions' ] . size ) . to . equal ( 0 )
192
222
193
223
const [ changedPeerId , changedSubs ] = await new Promise < [ PeerId , RPC . ISubOpts [ ] ] > ( ( resolve ) => {
194
224
nodes [ 1 ] . once ( 'pubsub:subscription-change' , ( ...args : [ PeerId , RPC . ISubOpts [ ] ] ) => resolve ( args ) )
195
225
} )
196
226
await new Promise ( ( resolve ) => nodes [ 1 ] . once ( 'gossipsub:heartbeat' , resolve ) )
197
227
198
- expect ( nodes [ 1 ] . peers . size ) . to . equal ( 1 )
199
- expectSet ( nodes [ 1 ] . topics . get ( topic ) , [ ] )
200
- expect ( changedPeerId . toB58String ( ) ) . to . equal ( first ( nodes [ 1 ] . peers ) . id . toB58String ( ) )
228
+ expect ( nodes [ 1 ] [ ' peers' ] . size ) . to . equal ( 1 )
229
+ expectSet ( nodes [ 1 ] [ ' topics' ] . get ( topic ) , [ ] )
230
+ expect ( changedPeerId . toB58String ( ) ) . to . equal ( first ( nodes [ 1 ] [ ' peers' ] ) . id . toB58String ( ) )
201
231
expect ( changedSubs ) . to . have . lengthOf ( 1 )
202
232
expect ( changedSubs [ 0 ] . topicID ) . to . equal ( topic )
203
233
expect ( changedSubs [ 0 ] . subscribe ) . to . equal ( false )
@@ -245,10 +275,10 @@ describe('2 nodes', () => {
245
275
nodes [ 0 ] . subscribe ( 'Za' )
246
276
nodes [ 1 ] . subscribe ( 'Zb' )
247
277
248
- expect ( nodes [ 0 ] . peers . size ) . to . equal ( 0 )
249
- expectSet ( nodes [ 0 ] . subscriptions , [ 'Za' ] )
250
- expect ( nodes [ 1 ] . peers . size ) . to . equal ( 0 )
251
- expectSet ( nodes [ 1 ] . subscriptions , [ 'Zb' ] )
278
+ expect ( nodes [ 0 ] [ ' peers' ] . size ) . to . equal ( 0 )
279
+ expectSet ( nodes [ 0 ] [ ' subscriptions' ] , [ 'Za' ] )
280
+ expect ( nodes [ 1 ] [ ' peers' ] . size ) . to . equal ( 0 )
281
+ expectSet ( nodes [ 1 ] [ ' subscriptions' ] , [ 'Zb' ] )
252
282
} )
253
283
254
284
after ( ( ) => Promise . all ( nodes . map ( stopNode ) ) )
@@ -257,20 +287,20 @@ describe('2 nodes', () => {
257
287
this . timeout ( 5000 )
258
288
259
289
await Promise . all ( [
260
- nodes [ 0 ] . _libp2p . dialProtocol ( nodes [ 1 ] . _libp2p . peerId , multicodec ) ,
290
+ nodes [ 0 ] . _libp2p . dialProtocol ( nodes [ 1 ] . _libp2p . peerId , GossipsubIDv11 ) ,
261
291
new Promise ( ( resolve ) => nodes [ 0 ] . once ( 'pubsub:subscription-change' , resolve ) ) ,
262
292
new Promise ( ( resolve ) => nodes [ 1 ] . once ( 'pubsub:subscription-change' , resolve ) )
263
293
] )
264
- expect ( nodes [ 0 ] . peers . size ) . to . equal ( 1 )
265
- expect ( nodes [ 1 ] . peers . size ) . to . equal ( 1 )
294
+ expect ( nodes [ 0 ] [ ' peers' ] . size ) . to . equal ( 1 )
295
+ expect ( nodes [ 1 ] [ ' peers' ] . size ) . to . equal ( 1 )
266
296
267
- expectSet ( nodes [ 0 ] . subscriptions , [ 'Za' ] )
268
- expect ( nodes [ 1 ] . peers . size ) . to . equal ( 1 )
269
- expectSet ( nodes [ 1 ] . topics . get ( 'Za' ) , [ nodes [ 0 ] . peerId . toB58String ( ) ] )
297
+ expectSet ( nodes [ 0 ] [ ' subscriptions' ] , [ 'Za' ] )
298
+ expect ( nodes [ 1 ] [ ' peers' ] . size ) . to . equal ( 1 )
299
+ expectSet ( nodes [ 1 ] [ ' topics' ] . get ( 'Za' ) , [ nodes [ 0 ] . peerId . toB58String ( ) ] )
270
300
271
- expectSet ( nodes [ 1 ] . subscriptions , [ 'Zb' ] )
272
- expect ( nodes [ 0 ] . peers . size ) . to . equal ( 1 )
273
- expectSet ( nodes [ 0 ] . topics . get ( 'Zb' ) , [ nodes [ 1 ] . peerId . toB58String ( ) ] )
301
+ expectSet ( nodes [ 1 ] [ ' subscriptions' ] , [ 'Zb' ] )
302
+ expect ( nodes [ 0 ] [ ' peers' ] . size ) . to . equal ( 1 )
303
+ expectSet ( nodes [ 0 ] [ ' topics' ] . get ( 'Zb' ) , [ nodes [ 1 ] . peerId . toB58String ( ) ] )
274
304
} )
275
305
} )
276
306
@@ -284,8 +314,8 @@ describe('2 nodes', () => {
284
314
285
315
it ( "nodes don't have peers after stopped" , async ( ) => {
286
316
await Promise . all ( nodes . map ( stopNode ) )
287
- expect ( nodes [ 0 ] . peers . size ) . to . equal ( 0 )
288
- expect ( nodes [ 1 ] . peers . size ) . to . equal ( 0 )
317
+ expect ( nodes [ 0 ] [ ' peers' ] . size ) . to . equal ( 0 )
318
+ expect ( nodes [ 1 ] [ ' peers' ] . size ) . to . equal ( 0 )
289
319
} )
290
320
} )
291
321
} )
0 commit comments