mirror of
https://github.com/netbirdio/netbird.git
synced 2025-08-02 20:49:17 +02:00
- Clients now subscribe to peer status changes. - The server manages and maintains these subscriptions. - Replaced raw string peer IDs with a custom peer ID type for better type safety and clarity.
145 lines
3.0 KiB
Go
145 lines
3.0 KiB
Go
package messages
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
)
|
|
|
|
const (
|
|
testPeerCount = 10
|
|
)
|
|
|
|
// Helper function to generate test PeerIDs
|
|
func generateTestPeerIDs(n int) []PeerID {
|
|
ids := make([]PeerID, n)
|
|
for i := 0; i < n; i++ {
|
|
for j := 0; j < peerIDSize; j++ {
|
|
ids[i][j] = byte(i + j)
|
|
}
|
|
}
|
|
return ids
|
|
}
|
|
|
|
// Helper function to compare slices of PeerID
|
|
func peerIDEqual(a, b []PeerID) bool {
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
for i := range a {
|
|
if !bytes.Equal(a[i][:], b[i][:]) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func TestMarshalUnmarshalSubPeerState(t *testing.T) {
|
|
ids := generateTestPeerIDs(testPeerCount)
|
|
|
|
msgs, err := MarshalSubPeerStateMsg(ids)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
|
|
var allIDs []PeerID
|
|
for _, msg := range msgs {
|
|
decoded, err := UnmarshalSubPeerStateMsg(msg)
|
|
if err != nil {
|
|
t.Fatalf("unmarshal failed: %v", err)
|
|
}
|
|
allIDs = append(allIDs, decoded...)
|
|
}
|
|
|
|
if !peerIDEqual(ids, allIDs) {
|
|
t.Errorf("expected %v, got %v", ids, allIDs)
|
|
}
|
|
}
|
|
|
|
func TestMarshalSubPeerState_EmptyInput(t *testing.T) {
|
|
_, err := MarshalSubPeerStateMsg([]PeerID{})
|
|
if err == nil {
|
|
t.Errorf("expected error for empty input")
|
|
}
|
|
}
|
|
|
|
func TestUnmarshalSubPeerState_Invalid(t *testing.T) {
|
|
// Too short
|
|
_, err := UnmarshalSubPeerStateMsg([]byte{1})
|
|
if err == nil {
|
|
t.Errorf("expected error for short input")
|
|
}
|
|
|
|
// Misaligned length
|
|
buf := make([]byte, sizeOfProtoHeader+1)
|
|
_, err = UnmarshalSubPeerStateMsg(buf)
|
|
if err == nil {
|
|
t.Errorf("expected error for misaligned input")
|
|
}
|
|
}
|
|
|
|
func TestMarshalUnmarshalPeersOnline(t *testing.T) {
|
|
ids := generateTestPeerIDs(testPeerCount)
|
|
|
|
msgs, err := MarshalPeersOnline(ids)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
|
|
var allIDs []PeerID
|
|
for _, msg := range msgs {
|
|
decoded, err := UnmarshalPeersOnlineMsg(msg)
|
|
if err != nil {
|
|
t.Fatalf("unmarshal failed: %v", err)
|
|
}
|
|
allIDs = append(allIDs, decoded...)
|
|
}
|
|
|
|
if !peerIDEqual(ids, allIDs) {
|
|
t.Errorf("expected %v, got %v", ids, allIDs)
|
|
}
|
|
}
|
|
|
|
func TestMarshalPeersOnline_EmptyInput(t *testing.T) {
|
|
_, err := MarshalPeersOnline([]PeerID{})
|
|
if err == nil {
|
|
t.Errorf("expected error for empty input")
|
|
}
|
|
}
|
|
|
|
func TestUnmarshalPeersOnline_Invalid(t *testing.T) {
|
|
_, err := UnmarshalPeersOnlineMsg([]byte{1})
|
|
if err == nil {
|
|
t.Errorf("expected error for short input")
|
|
}
|
|
}
|
|
|
|
func TestMarshalUnmarshalPeersWentOffline(t *testing.T) {
|
|
ids := generateTestPeerIDs(testPeerCount)
|
|
|
|
msgs, err := MarshalPeersWentOffline(ids)
|
|
if err != nil {
|
|
t.Fatalf("unexpected error: %v", err)
|
|
}
|
|
|
|
var allIDs []PeerID
|
|
for _, msg := range msgs {
|
|
// MarshalPeersWentOffline shares no unmarshal function, so reuse PeersOnline
|
|
decoded, err := UnmarshalPeersOnlineMsg(msg)
|
|
if err != nil {
|
|
t.Fatalf("unmarshal failed: %v", err)
|
|
}
|
|
allIDs = append(allIDs, decoded...)
|
|
}
|
|
|
|
if !peerIDEqual(ids, allIDs) {
|
|
t.Errorf("expected %v, got %v", ids, allIDs)
|
|
}
|
|
}
|
|
|
|
func TestMarshalPeersWentOffline_EmptyInput(t *testing.T) {
|
|
_, err := MarshalPeersWentOffline([]PeerID{})
|
|
if err == nil {
|
|
t.Errorf("expected error for empty input")
|
|
}
|
|
}
|