package host import ( "context" "errors" "github.com/carlosframework/platform/internal/hostguard" "github.com/carlosframework/platform/internal/stopevidence" "testing" ) type fix1WritersScan struct { stopKernelFunc scan func() } func (k fix1WritersScan) VerifyWritersStopped(context.Context, hostguard.FenceTarget, StopInventory, StopPeer, []stopevidence.DescriptorHint) (WritersKernelEvidence, error) { if k.scan != nil { k.scan() } return WritersKernelEvidence{}, nil } func TestPlan11Fix1WritersMustRemainClosed(t *testing.T) { for _, shape := range []string{"open", "unit-appears", "closed"} { t.Run(shape, func(t *testing.T) { f := newLaunchFixture(t, servingOp()) if shape != "open" { if err := f.journal.CloseWriters(t.Context(), f.target); err != nil { t.Fatal(err) } } scans := 0 k := claimUnitStopKernel{Journal: f.journal, Units: f.units, Inner: fix1WritersScan{scan: func() { scans++ if shape == "unit-appears" { f.units.goneErr = errors.New("unit started during scan") } }}} _, err := k.VerifyWritersStopped(t.Context(), f.target, StopInventory{}, f.peer, nil) if shape == "closed" { if err != nil || scans != 1 { t.Fatalf("closed: %v, scans=%d", err, scans) } return } if err == nil { t.Fatal("writers-stopped accepted an open writer boundary") } if shape == "open" && scans != 0 { t.Fatal("scanned before writers closed") } }) } }