//go:build unix package hostguard import ( "context" "testing" "time" ) func TestPlan14ColdPredecessorAfterRepeatedRootStop(t *testing.T) { f, target, captured := fenceFixture(t) f.g.Root = NewRootAuthority(&rootTestStore{dir: t.TempDir()}) f.obs.Claim.Holder.Account, f.obs.Claim.Holder.App = "bab", "app" in := RootInstallation{Host: target.Host, Incarnation: target.Incarnation, Stamp: target.Stamp, Account: "bab", App: "app", Record: "record", Box: target.Box, Enrollment: target.Enrollment, Migration: 1} if err := f.g.EstablishRoot(t.Context(), in, allow); err != nil { t.Fatal(err) } verify := func(context.Context, FenceTarget, []byte, time.Time) error { return nil } for i := 0; i < 2; i++ { if i == 1 { target.ControllerID = "replacement" target.FenceID = "replacement-fence" } if _, err := f.g.BeginFence(t.Context(), target); err != nil { t.Fatal(err) } if i == 1 { if _, err := f.g.CompletedColdPredecessor(t.Context(), target.Host, captured, target.Session, target.Op, target.Phase); err == nil { t.Fatal("pending stop accepted") } } if err := f.g.CompleteFence(t.Context(), target, []byte(target.FenceID), time.Now(), verify); err != nil { t.Fatal(err) } } r, err := f.g.CompletedColdPredecessor(t.Context(), target.Host, captured, target.Session, target.Op, target.Phase) if err != nil || r.Target != target { t.Fatal("current completed fence not selected", r.Target, err) } if _, err := f.g.CompletedColdPredecessor(t.Context(), target.Host, captured, target.Session+1, target.Op, target.Phase); err == nil { t.Fatal("foreign session accepted") } }