package registry import ( "path/filepath" "testing" ) func TestClaimTimerRegistrationWritesKeepOwnership(t *testing.T) { reg, err := Open(filepath.Join(t.TempDir(), "registry.db")) if err != nil { t.Fatal(err) } defer reg.Close() owner := ClaimOwnership{"inc", 3, "owner", "route"} host := "shop.example" if err = reg.Upsert(Route{Host: host, ClaimOwnership: owner}); err != nil { t.Fatal(err) } timer := Timer{Host: host, Name: "tick", Kind: "schedule", Spec: "every 1h0m0s", Path: "/tick", NextAt: 100} first, err := reg.UpsertTimerRegistration(timer, "") if err != nil { t.Fatal(err) } if first.ClaimOwner != owner.ClaimOwner || first.ClaimStamp != 3 || first.ClaimRowID != first.Registration { t.Fatalf("unowned timer: %+v", first) } timer.NextAt = 0 unchanged, err := reg.UpsertTimerRegistration(timer, first.Registration) if err != nil { t.Fatal(err) } if unchanged.Registration != first.Registration || unchanged.ClaimRowID != first.ClaimRowID { t.Fatal("no-op replaced registration") } if err = reg.FireTimerNowRegistration(host, "tick", first.Registration, 200); err != nil { t.Fatal(err) } current, err := reg.GetTimer(host, "tick") if err != nil { t.Fatal(err) } if current.Registration == first.Registration || current.ClaimRowID != current.Registration || current.ClaimOwner != owner.ClaimOwner { t.Fatalf("lost ownership: %+v", current) } if _, err = reg.UpsertTimerRegistration(timer, first.Registration); err == nil { t.Fatal("stale registration accepted") } }