package host import ( "encoding/json" "strings" "testing" "github.com/carlosframework/platform/internal/hostclaim" ) func servingStopFixture(t *testing.T) (ClaimStopCoordinator, StopRequest) { c, req, _ := claimStopFixture(t) observed, err := c.Claims.Read(t.Context(), req.Host) if err != nil { t.Fatal(err) } observed.Claim.Op = hostclaim.Op{Kind: hostclaim.KindServing} observed.Claim.Holder.WriterBox = req.Box observed.Claim.Holder.Generation = "generation-1" observed.Claim.Holder.Admissions = []hostclaim.AdmissionRecord{{Region: "eu-west-1", Box: req.Box, Session: req.WriterSession, Generation: "generation-1"}} c.Claims = stopClaimReader{observed} c.Guard.Claims = stopClaimReader{observed} req.Region = "eu-west-1" req.OperationID = "" req.Phase = "" req.ObligationID = "" return c, req } func TestClaimStopOrdinaryServingUsesHolderAuthority(t *testing.T) { c, req := servingStopFixture(t) result, err := c.FenceAndStop(t.Context(), req) if err != nil { t.Fatal(err) } if !strings.Contains(result.Key, "/serving-evidence/") { t.Fatalf("serving evidence entered operation namespace: %s", result.Key) } var receipt StopReceipt if err := json.Unmarshal(result.Bytes, &receipt); err != nil { t.Fatal(err) } if receipt.OperationID != "" || receipt.Phase != "" || receipt.ObligationID != "" || receipt.Region != req.Region { t.Fatalf("serving receipt grants operation authority: %+v", receipt) } } func TestClaimStopServingRefusesDifferentHolderScope(t *testing.T) { for _, change := range []func(*StopRequest){func(r *StopRequest) { r.Region = "elsewhere" }, func(r *StopRequest) { r.Box = "other-box" }, func(r *StopRequest) { r.OperationID = "invented" r.Phase = "stop" r.ObligationID = "invented-obligation" }} { c, req := servingStopFixture(t) change(&req) if _, err := c.FenceAndStop(t.Context(), req); err == nil { t.Fatal("accepted wrong serving authority") } } c, req := servingStopFixture(t) req.WriterSession = 0 // A holder past session zero never takes the no-process witness (R4). if _, err := c.FenceAndStop(t.Context(), req); err == nil { t.Fatal("a session-zero request stopped a holder at session 13") } }