81 lines
2.2 KiB
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)
|
|
}
|
|
}
|