clone

a self-hosted multitenant nostr relay with sites, file storage, git hosting, and inbox and outbox delivery

feat/ui-updates
tinyrelay / internal / syncprotocol / syncprotocol_test.go
syncprotocol_test.go 1.7K
1package syncprotocol23import (4 "strings"5 "testing"67 "github.com/FelineStateMachine/tinyrelay/internal/event"8)910func TestHLLOffsetAndRegisters(t *testing.T) {11 f := event.Filter{Tags: map[string][]string{"d": {"30000:" + strings.Repeat("a", 64) + ":x"}}}12 offset, ok := HLLFilterOffset(f)13 if !ok || offset < 8 || offset > 23 {14 t.Fatalf("unexpected offset %d, ok=%v", offset, ok)15 }16 h := NewHLL(offset)17 if err := h.Add(strings.Repeat("b", 64)); err != nil {18 t.Fatalf("add pubkey: %v", err)19 }20 if len(h.Hex()) != 512 {21 t.Fatalf("HLL must encode 256 registers, got %d hex chars", len(h.Hex()))22 }23 if err := h.MergeHex(h.Hex()); err != nil {24 t.Fatalf("merge own registers: %v", err)25 }26}2728func TestNegentropyReconcilesBothDirections(t *testing.T) {29 left, err := NewSession([]Item{{Timestamp: 1, ID: strings.Repeat("a", 64)}, {Timestamp: 2, ID: strings.Repeat("b", 64)}}, true)30 if err != nil {31 t.Fatal(err)32 }33 right, err := NewSession([]Item{{Timestamp: 2, ID: strings.Repeat("b", 64)}, {Timestamp: 3, ID: strings.Repeat("c", 64)}}, false)34 if err != nil {35 t.Fatal(err)36 }37 msg, err := left.Start()38 if err != nil {39 t.Fatal(err)40 }41 for i := 0; i < 20 && msg != ""; i++ {42 server, err := right.Reconcile(msg)43 if err != nil {44 t.Fatalf("server reconcile: %v", err)45 }46 msg = server.Response47 if msg == "" {48 break49 }50 client, err := left.Reconcile(msg)51 if err != nil {52 t.Fatalf("client reconcile: %v", err)53 }54 msg = client.Response55 if client.Done {56 if len(client.Have) != 1 || client.Have[0] != strings.Repeat("a", 64) || len(client.Need) != 1 || client.Need[0] != strings.Repeat("c", 64) {57 t.Fatalf("unexpected diff: have=%v need=%v", client.Have, client.Need)58 }59 return60 }61 }62 t.Fatal("negentropy did not finish")63}