//go:build unix package hostbox import ( "context" "errors" "testing" "github.com/carlosframework/platform/internal/genselect" "github.com/carlosframework/platform/internal/hostclaim" ) func TestWriterRefusesMissingEvidenceAndStaleCAS(t *testing.T) { _, store, obs := workFixture(t) ctx := context.Background() in := hostclaim.Admission{Box: "box", Mode: "cold", NewGeneration: "next", Region: "ie", PredecessorRegion: "ie"} writer := Writer{Claims: store, Box: "box", Region: "ie"} if _, err := writer.Admit(ctx, obs, in, nil); !errors.Is(err, ErrUnsupported) { t.Fatal(err) } checks := 0 writer.AdmissionEvidence = func(context.Context, hostclaim.Observed, hostclaim.Admission, *genselect.Plan) error { checks++ return nil } admitted, err := writer.Admit(ctx, obs, in, nil) if err != nil { t.Fatal(err) } if admitted.Claim.Holder.Session <= obs.Claim.Holder.Session || admitted.Claim.Holder.Generation != "next" { t.Fatal(admitted) } if _, err := writer.Admit(ctx, obs, in, nil); err == nil { t.Fatal("stale observation admitted") } if checks != 2 { t.Fatal(checks) } current, err := hostclaim.Read(ctx, store, obs.Host) if err != nil || current.Claim.Holder.Session != admitted.Claim.Holder.Session { t.Fatal(current, err) } if _, err := writer.Published(ctx, admitted); !errors.Is(err, ErrUnsupported) { t.Fatal(err) } writer.NewID = func() string { return "chore" } writer.PublicationEvidence = func(context.Context, hostclaim.Observed) error { return ErrChanged } if _, err := writer.Published(ctx, admitted); !errors.Is(err, ErrChanged) { t.Fatal(err) } prefix, err := GenerationPrefix(*admitted.Claim.Holder) if err != nil || prefix != "instances/shop.example/g-next/" { t.Fatal(prefix, err) } }