proxy-pool/internal/gateway/snapshot/store_test.go

81 lines
2.2 KiB
Go

package snapshot
import (
"errors"
"testing"
proxyDomain "github.com/proxy-pool/proxy-pool/internal/domain/proxy"
)
func TestStoreAppliesCompleteSnapshotsInOrder(t *testing.T) {
store := NewStore("cluster-a", "worker-a")
first := Envelope{
ClusterID: "cluster-a",
WorkerID: "worker-a",
Epoch: 1,
Version: 1,
Full: true,
Proxies: []proxyDomain.Proxy{{
ID: "p1",
Scheme: proxyDomain.SchemeHTTP,
Host: "127.0.0.1",
Port: 18080,
MaxConcurrency: 2,
State: proxyDomain.StateAvailable,
}},
}
first.Checksum = Checksum(first.Proxies)
if err := store.Apply(first); err != nil {
t.Fatalf("Apply(first): %v", err)
}
view := store.Current()
if view == nil || view.Version != 1 || len(view.Entries) != 1 {
t.Fatalf("Current() = %+v", view)
}
if view.Entries[0].Runtime == nil {
t.Fatal("snapshot entry has no local runtime capacity")
}
second := first
second.Version = 2
second.Proxies = append([]proxyDomain.Proxy(nil), first.Proxies...)
second.Proxies[0].Host = "localhost"
second.Checksum = Checksum(second.Proxies)
if err := store.Apply(second); err != nil {
t.Fatalf("Apply(second): %v", err)
}
if got := store.Current().Entries[0].Proxy.Host; got != "localhost" {
t.Fatalf("host = %q, want localhost", got)
}
}
func TestStoreRejectsWrongWorkerVersionGapAndChecksum(t *testing.T) {
store := NewStore("cluster-a", "worker-a")
base := Envelope{ClusterID: "cluster-a", WorkerID: "worker-a", Epoch: 1, Version: 1, Full: true}
base.Checksum = Checksum(base.Proxies)
if err := store.Apply(base); err != nil {
t.Fatalf("Apply(base): %v", err)
}
wrongWorker := base
wrongWorker.Version = 2
wrongWorker.WorkerID = "worker-b"
if err := store.Apply(wrongWorker); !errors.Is(err, ErrWrongTarget) {
t.Fatalf("wrong worker error = %v, want ErrWrongTarget", err)
}
gap := base
gap.Version = 3
if err := store.Apply(gap); !errors.Is(err, ErrResyncRequired) {
t.Fatalf("version gap error = %v, want ErrResyncRequired", err)
}
badChecksum := base
badChecksum.Version = 2
badChecksum.Checksum = "bad"
if err := store.Apply(badChecksum); !errors.Is(err, ErrChecksumMismatch) {
t.Fatalf("checksum error = %v, want ErrChecksumMismatch", err)
}
}