ceremonyclient/go-libp2p-blossomsub/blossomsub_feat_test.go
2024-10-12 11:48:25 -07:00

108 lines
2.4 KiB
Go

package blossomsub
import (
"bytes"
"context"
"fmt"
"math/rand"
"testing"
"time"
"github.com/libp2p/go-libp2p/core/protocol"
)
func TestDefaultBlossomSubFeatures(t *testing.T) {
if !BlossomSubDefaultFeatures(BlossomSubFeatureMesh, BlossomSubID_v2) {
t.Fatal("BlossomSub-v2.0 should support Mesh")
}
if !BlossomSubDefaultFeatures(BlossomSubFeaturePX, BlossomSubID_v2) {
t.Fatal("BlossomSub-v2.0 should support PX")
}
}
func TestBlossomSubCustomProtocols(t *testing.T) {
customsub := protocol.ID("customsub/1.0.0")
protos := []protocol.ID{customsub}
features := func(feat BlossomSubFeature, proto protocol.ID) bool {
return proto == customsub
}
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
hosts := getDefaultHosts(t, 3)
bsubs := getBlossomSubs(ctx, hosts[:2], WithBlossomSubProtocols(protos, features))
connectAll(t, hosts)
bitmask := []byte{0x00, 0x80, 0x00, 0x00}
var bitmasks []*Bitmask
var subs []*Subscription
for _, ps := range bsubs {
b, err := ps.Join(bitmask)
if err != nil {
t.Fatal(err)
}
subch, err := ps.Subscribe(bitmask)
if err != nil {
t.Fatal(err)
}
subs = append(subs, subch...)
bitmasks = append(bitmasks, b...)
}
// wait for heartbeats to build mesh
time.Sleep(time.Second * 2)
// check the meshes of the bsubs, the BlossomSub meshes should include each other but not the
// floddsub peer
bsubs[0].eval <- func() {
bs := bsubs[0].rt.(*BlossomSubRouter)
_, ok := bs.mesh[string(bitmask)][hosts[1].ID()]
if !ok {
t.Fatal("expected bs0 to have bs1 in its mesh")
}
_, ok = bs.mesh[string(bitmask)][hosts[2].ID()]
if ok {
t.Fatal("expected bs0 to not have fs in its mesh")
}
}
bsubs[1].eval <- func() {
bs := bsubs[1].rt.(*BlossomSubRouter)
_, ok := bs.mesh[string(bitmask)][hosts[0].ID()]
if !ok {
t.Fatal("expected bs1 to have bs0 in its mesh")
}
_, ok = bs.mesh[string(bitmask)][hosts[2].ID()]
if ok {
t.Fatal("expected bs1 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(bsubs))
bitmasks[owner].Publish(ctx, bitmasks[owner].bitmask, 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!")
}
}
}
}