forked from libp2p/go-libp2p-pubsub
-
Notifications
You must be signed in to change notification settings - Fork 0
/
gossipsub_feat_test.go
134 lines (112 loc) · 3.41 KB
/
gossipsub_feat_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package pubsub
import (
"bytes"
"context"
"fmt"
"math/rand"
"testing"
"time"
"github.com/libp2p/go-libp2p/core/protocol"
)
func TestDefaultGossipSubFeatures(t *testing.T) {
if GossipSubDefaultFeatures(GossipSubFeatureMesh, FloodSubID) {
t.Fatal("floodsub should not support Mesh")
}
if !GossipSubDefaultFeatures(GossipSubFeatureMesh, GossipSubID_v10) {
t.Fatal("gossipsub-v1.0 should support Mesh")
}
if !GossipSubDefaultFeatures(GossipSubFeatureMesh, GossipSubID_v11) {
t.Fatal("gossipsub-v1.1 should support Mesh")
}
if !GossipSubDefaultFeatures(GossipSubFeatureMesh, GossipSubID_v12) {
t.Fatal("gossipsub-v1.2 should support Mesh")
}
if GossipSubDefaultFeatures(GossipSubFeaturePX, FloodSubID) {
t.Fatal("floodsub should not support PX")
}
if GossipSubDefaultFeatures(GossipSubFeaturePX, GossipSubID_v10) {
t.Fatal("gossipsub-v1.0 should not support PX")
}
if !GossipSubDefaultFeatures(GossipSubFeaturePX, GossipSubID_v11) {
t.Fatal("gossipsub-v1.1 should support PX")
}
if !GossipSubDefaultFeatures(GossipSubFeaturePX, GossipSubID_v12) {
t.Fatal("gossipsub-v1.2 should support PX")
}
if GossipSubDefaultFeatures(GossipSubFeatureIdontwant, FloodSubID) {
t.Fatal("floodsub should not support IDONTWANT")
}
if GossipSubDefaultFeatures(GossipSubFeatureIdontwant, GossipSubID_v10) {
t.Fatal("gossipsub-v1.0 should not support IDONTWANT")
}
if GossipSubDefaultFeatures(GossipSubFeatureIdontwant, GossipSubID_v11) {
t.Fatal("gossipsub-v1.1 should not support IDONTWANT")
}
if !GossipSubDefaultFeatures(GossipSubFeatureIdontwant, GossipSubID_v12) {
t.Fatal("gossipsub-v1.2 should support IDONTWANT")
}
}
func TestGossipSubCustomProtocols(t *testing.T) {
customsub := protocol.ID("customsub/1.0.0")
protos := []protocol.ID{customsub, FloodSubID}
features := func(feat GossipSubFeature, proto protocol.ID) bool {
return proto == customsub
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
hosts := getDefaultHosts(t, 3)
gsubs := getGossipsubs(ctx, hosts[:2], WithGossipSubProtocols(protos, features))
fsub := getPubsub(ctx, hosts[2])
psubs := append(gsubs, fsub)
connectAll(t, hosts)
topic := "test"
var subs []*Subscription
for _, ps := range psubs {
subch, err := ps.Subscribe(topic)
if err != nil {
t.Fatal(err)
}
subs = append(subs, subch)
}
// wait for heartbeats to build mesh
time.Sleep(time.Second * 2)
// check the meshes of the gsubs, the gossipsub meshes should include each other but not the
// floddsub peer
gsubs[0].eval <- func() {
gs := gsubs[0].rt.(*GossipSubRouter)
_, ok := gs.mesh[topic][hosts[1].ID()]
if !ok {
t.Fatal("expected gs0 to have gs1 in its mesh")
}
_, ok = gs.mesh[topic][hosts[2].ID()]
if ok {
t.Fatal("expected gs0 to not have fs in its mesh")
}
}
gsubs[1].eval <- func() {
gs := gsubs[1].rt.(*GossipSubRouter)
_, ok := gs.mesh[topic][hosts[0].ID()]
if !ok {
t.Fatal("expected gs1 to have gs0 in its mesh")
}
_, ok = gs.mesh[topic][hosts[2].ID()]
if ok {
t.Fatal("expected gs1 to not have fs in its mesh")
}
}
// send some messages
for i := 0; i < 10; i++ {
msg := []byte(fmt.Sprintf("%d it's not quite a floooooood %d", i, i))
owner := rand.Intn(len(psubs))
psubs[owner].Publish(topic, msg)
for _, sub := range subs {
got, err := sub.Next(ctx)
if err != nil {
t.Fatal(sub.err)
}
if !bytes.Equal(msg, got.Data) {
t.Fatal("got wrong message!")
}
}
}
}