Files
go-sip/internal/store/local_v04_discovery_test.go
T

101 lines
4.1 KiB
Go

package store
import (
"errors"
"testing"
"time"
)
func eventTask(id, status string, revision int64) LocalDiscoveredTask {
return LocalDiscoveredTask{TaskID: id, TenantID: "tenant-a", TenantKey: "tenant-key-a", Status: status, TaskRevision: revision}
}
func TestV04CompleteSnapshotReplacesMembershipWithoutReopeningPause(t *testing.T) {
st := openLocalDiscoveryTestStore(t)
now := time.Now().UTC()
if err := st.ApplyLocalTaskSnapshot("d-1", []LocalDiscoveredTask{eventTask("a", "running", 1), eventTask("b", "running", 1)}, now); err != nil {
t.Fatal(err)
}
if _, err := st.LocalDiscoveredTaskForConfig("d-1", "a", "tenant-a"); !errors.Is(err, ErrLocalDiscoveryUnavailable) {
t.Fatalf("snapshot allowed admission before control backlog: %v", err)
}
if err := st.MarkLocalTaskDiscoveryReadyV04("d-1", now); err != nil {
t.Fatal(err)
}
if _, err := st.SetLocalTaskAdmissionBarrier("d-1", "a", "tenant-a", "tenant-key-a", "paused"); err != nil {
t.Fatal(err)
}
if err := st.CloseLocalTaskDiscoveryAdmissionV04("d-1"); err != nil {
t.Fatal(err)
}
if err := st.ApplyLocalTaskSnapshot("d-1", []LocalDiscoveredTask{eventTask("a", "paused", 2)}, now.Add(time.Second)); err != nil {
t.Fatal(err)
}
a, err := st.LocalTaskAssignment("d-1", "a")
if err != nil || a.AdmissionState != "paused" || a.TaskRevision != 2 {
t.Fatalf("snapshot reopened paused task: %+v %v", a, err)
}
b, err := st.LocalTaskAssignment("d-1", "b")
if err != nil || !b.Removed || b.AdmissionState != "removed" {
t.Fatalf("snapshot failed to revoke missing task: %+v %v", b, err)
}
if err := st.MarkLocalTaskDiscoveryReadyV04("d-1", now.Add(time.Second)); err != nil {
t.Fatal(err)
}
if _, err := st.LocalDiscoveredTaskForConfig("d-1", "a", "tenant-a"); err != nil {
t.Fatalf("completed snapshot+control catch-up not ready: %v", err)
}
}
func TestV04InvalidSnapshotDoesNotPartiallyCommitOrOpenAdmission(t *testing.T) {
st := openLocalDiscoveryTestStore(t)
now := time.Now().UTC()
if err := st.ApplyLocalTaskSnapshot("d-1", []LocalDiscoveredTask{eventTask("a", "running", 1)}, now); err != nil {
t.Fatal(err)
}
if err := st.CloseLocalTaskDiscoveryAdmissionV04("d-1"); err != nil {
t.Fatal(err)
}
bad := eventTask("b", "running", 1)
bad.TenantKey = "changed-binding"
if err := st.ApplyLocalTaskSnapshot("d-1", []LocalDiscoveredTask{eventTask("a", "running", 2), bad}, now.Add(time.Second)); err == nil {
t.Fatal("conflicting tenant binding accepted")
}
if _, err := st.LocalDiscoveredTaskForConfig("d-1", "a", "tenant-a"); !errors.Is(err, ErrLocalDiscoveryUnavailable) {
t.Fatalf("failed snapshot opened admission: %v", err)
}
if _, err := st.LocalTaskAssignment("d-1", "b"); err == nil {
t.Fatal("failed snapshot partially inserted task b")
}
a, err := st.LocalTaskAssignment("d-1", "a")
if err != nil || a.TaskRevision != 1 {
t.Fatalf("failed snapshot changed a: %+v %v", a, err)
}
}
func TestV04LiveChangesOnlyManageMembershipNotExistingStatus(t *testing.T) {
st := openLocalDiscoveryTestStore(t)
now := time.Now().UTC()
if err := st.ApplyLocalTaskSnapshot("d-1", []LocalDiscoveredTask{eventTask("a", "running", 1), eventTask("b", "running", 1)}, now); err != nil {
t.Fatal(err)
}
if _, err := st.SetLocalTaskAdmissionBarrier("d-1", "a", "tenant-a", "tenant-key-a", "paused"); err != nil {
t.Fatal(err)
}
if err := st.ApplyLocalTaskChanges("d-1", []LocalDiscoveredTask{eventTask("a", "running", 2), eventTask("b", "removed", 2), eventTask("c", "running", 1)}, now.Add(time.Second)); err != nil {
t.Fatal(err)
}
for taskID, want := range map[string]string{"a": "paused", "b": "removed", "c": "running"} {
row, err := st.LocalTaskAssignment("d-1", taskID)
if err != nil || row.AdmissionState != want {
t.Fatalf("task %s state=%+v err=%v", taskID, row, err)
}
}
if err := st.ApplyLocalTaskChanges("d-1", []LocalDiscoveredTask{eventTask("a", "stopped", 3)}, now.Add(2*time.Second)); !errors.Is(err, ErrLocalDiscoveryUnavailable) {
t.Fatalf("incremental status switched without MQ: %v", err)
}
if _, err := st.LocalDiscoveredTaskForConfig("d-1", "a", "tenant-a"); !errors.Is(err, ErrLocalDiscoveryUnavailable) {
t.Fatalf("status conflict should close admission: %v", err)
}
}