package rootparticipation import ( "context" "encoding/json" "errors" "testing" ) func TestHoldUpdateRefusesAcquisitionsWithoutACensus(t *testing.T) { l := censusFixture(t) refused := errors.New("census refused") l.VerifyLaunches = func(context.Context, uint64) error { return refused } // BeginUpdate cannot hold: its census refuses and it withdraws the record. if err := l.BeginUpdate(t.Context(), "tx-1"); !errors.Is(err, refused) { t.Fatalf("BeginUpdate = %v", err) } if err := l.Acquire(t.Context(), func() error { return nil }); err != nil { t.Fatalf("fixture: acquisition refused before the hold: %v", err) } if err := l.HoldUpdate(t.Context(), "tx-1"); err != nil { t.Fatal(err) } if id, err := l.UpdateID(); err != nil || id != "tx-1" { t.Fatalf("held record = %q, %v", id, err) } if err := l.Acquire(t.Context(), func() error { return nil }); !errors.Is(err, ErrUnavailable) { t.Fatalf("acquisition under the hold = %v, want refused", err) } // A second hold keeps the record as it is; only EndUpdateWith, with its // census, removes it. if err := l.HoldUpdate(t.Context(), "tx-2"); err != nil { t.Fatal(err) } if id, _ := l.UpdateID(); id != "tx-1" { t.Fatalf("a second hold replaced the record with %q", id) } if err := l.EndUpdateWith(t.Context(), "tx-1", nil); !errors.Is(err, refused) { t.Fatalf("EndUpdateWith under a refusing census = %v", err) } l.VerifyLaunches = func(context.Context, uint64) error { return nil } if err := l.EndUpdateWith(t.Context(), "tx-1", nil); err != nil { t.Fatal(err) } if err := l.Acquire(t.Context(), func() error { return nil }); err != nil { t.Fatalf("acquisition after settlement = %v", err) } if err := l.HoldUpdate(t.Context(), "bad id"); !errors.Is(err, ErrUnavailable) { t.Fatalf("invalid id = %v", err) } } func TestHoldUpdateLeavesAPendingAcquisitionCensusAlone(t *testing.T) { l := censusFixture(t) b, _ := json.Marshal(Census{Schema: 1, Box: "box", Enrollment: "en", Migration: 1, Revision: 2, Complete: true, LaunchRevision: 1, Pending: "acquisition"}) if err := l.State.Write("census.json", b); err != nil { t.Fatal(err) } if err := l.HoldUpdate(t.Context(), "tx-1"); err != nil { t.Fatal(err) } if _, err := l.State.Read("update.json"); err == nil { t.Fatal("hold wrote a record over a pending acquisition") } if err := l.Acquire(t.Context(), func() error { return nil }); err == nil { t.Fatal("a pending acquisition census accepted a new acquisition") } }