Files
Reticulum-Go/pkg/pathfinder/pathfinder_test.go

135 lines
3.0 KiB
Go

package pathfinder
import (
"testing"
"time"
)
func TestNewPathFinder(t *testing.T) {
pf := NewPathFinder()
if pf == nil {
t.Fatal("NewPathFinder() returned nil")
}
if pf.paths == nil {
t.Error("NewPathFinder() paths map is nil")
}
}
func TestPathFinder_AddPath(t *testing.T) {
pf := NewPathFinder()
destHash := "test-dest-hash"
nextHop := []byte{0x01, 0x02, 0x03, 0x04}
iface := "eth0"
hops := byte(5)
pf.AddPath(destHash, nextHop, iface, hops)
path, exists := pf.GetPath(destHash)
if !exists {
t.Fatal("GetPath() returned false after AddPath()")
}
if string(path.NextHop) != string(nextHop) {
t.Errorf("NextHop = %v, want %v", path.NextHop, nextHop)
}
if path.Interface != iface {
t.Errorf("Interface = %s, want %s", path.Interface, iface)
}
if path.HopCount != hops {
t.Errorf("HopCount = %d, want %d", path.HopCount, hops)
}
if path.LastUpdated == 0 {
t.Error("LastUpdated should be set")
}
}
func TestPathFinder_GetPath(t *testing.T) {
pf := NewPathFinder()
destHash := "test-dest-hash"
_, exists := pf.GetPath(destHash)
if exists {
t.Error("GetPath() should return false for non-existent path")
}
nextHop := []byte{0x01, 0x02}
pf.AddPath(destHash, nextHop, "eth0", 3)
path, exists := pf.GetPath(destHash)
if !exists {
t.Fatal("GetPath() returned false for existing path")
}
if string(path.NextHop) != string(nextHop) {
t.Errorf("NextHop = %v, want %v", path.NextHop, nextHop)
}
}
func TestPathFinder_UpdatePath(t *testing.T) {
pf := NewPathFinder()
destHash := "test-dest-hash"
nextHop1 := []byte{0x01, 0x02}
nextHop2 := []byte{0x03, 0x04}
pf.AddPath(destHash, nextHop1, "eth0", 3)
time.Sleep(10 * time.Millisecond)
firstUpdate := time.Now().Unix()
pf.AddPath(destHash, nextHop2, "eth1", 5)
path, exists := pf.GetPath(destHash)
if !exists {
t.Fatal("GetPath() returned false")
}
if string(path.NextHop) != string(nextHop2) {
t.Errorf("NextHop = %v, want %v", path.NextHop, nextHop2)
}
if path.Interface != "eth1" {
t.Errorf("Interface = %s, want eth1", path.Interface)
}
if path.HopCount != 5 {
t.Errorf("HopCount = %d, want 5", path.HopCount)
}
if path.LastUpdated < firstUpdate {
t.Error("LastUpdated should be updated")
}
}
func TestPathFinder_MultiplePaths(t *testing.T) {
pf := NewPathFinder()
paths := []struct {
hash string
nextHop []byte
iface string
hops byte
}{
{"hash1", []byte{0x01}, "eth0", 1},
{"hash2", []byte{0x02}, "eth1", 2},
{"hash3", []byte{0x03}, "eth2", 3},
}
for _, p := range paths {
pf.AddPath(p.hash, p.nextHop, p.iface, p.hops)
}
for _, p := range paths {
path, exists := pf.GetPath(p.hash)
if !exists {
t.Errorf("GetPath() returned false for %s", p.hash)
continue
}
if string(path.NextHop) != string(p.nextHop) {
t.Errorf("NextHop for %s = %v, want %v", p.hash, path.NextHop, p.nextHop)
}
if path.Interface != p.iface {
t.Errorf("Interface for %s = %s, want %s", p.hash, path.Interface, p.iface)
}
if path.HopCount != p.hops {
t.Errorf("HopCount for %s = %d, want %d", p.hash, path.HopCount, p.hops)
}
}
}