package hostguard import ( "errors" "github.com/carlosframework/platform/internal/hostclaim" "testing" ) func TestPlan14RootInventorySettlement(t *testing.T) { for _, change := range []string{"exact", "intent", "stamp", "revision", "callback"} { t.Run(change, func(t *testing.T) { f, target, captured := fenceFixture(t) f.obs.Claim.Holder.Account, f.obs.Claim.Holder.App = "bab", "console" f.g.Root = NewRootAuthority(&rootTestStore{dir: t.TempDir()}) in := RootInstallation{Host: target.Host, Incarnation: captured.Incarnation, Stamp: captured.Stamp, Account: "bab", App: "console", Record: "record", Box: target.Box, Enrollment: target.Enrollment, Migration: 1, InventoryRevision: 1} if err := f.g.EstablishRoot(t.Context(), in, allow); err != nil { t.Fatal(err) } in.InventoryRevision++ if change == "revision" { in.InventoryRevision++ } fault := errors.New("interrupted") if err := f.g.CommitRootInventory(t.Context(), in, []byte("exact"), allow, nil, func(RootInstallation) error { return fault }); !errors.Is(err, fault) { t.Fatal(err) } // No fresh claim is available. Local settlement cannot clear a denial. f.obs.Claim = &hostclaim.Claim{} intent := []byte("exact") if change == "intent" { intent = []byte("forged") } r, err := f.g.Root.read(target.Host) if err != nil { t.Fatal(err) } r.quarantined = true if change == "stamp" { r.ActiveStamp++ } if err := f.g.Root.write(r); err != nil { t.Fatal(err) } calls := 0 err = f.g.SettleRootInventory(t.Context(), target.Host, intent, func(got RootInstallation) error { calls++ if got != in || change == "callback" { return fault } return nil }) if (err == nil) != (change == "exact") { t.Fatal(change, err) } if (change == "intent" || change == "revision" || change == "stamp") && calls != 0 { t.Fatal("unvalidated intent reached effect callback") } r, err = f.g.Root.read(target.Host) if err != nil || !r.quarantined { t.Fatal("settlement cleared denial", err) } pending, e := f.g.Root.PendingInstallations() if e != nil { t.Fatal(e) } if (len(pending) == 0) != (change == "exact") { t.Fatal("pending intention changed", pending) } }) } }