package store import ( "errors" "path/filepath" "sync" "testing" ) func TestIntentReservationConcurrencyAndRestart(t *testing.T) { path := filepath.Join(t.TempDir(), "store.db") s, err := Open(path) if err != nil { t.Fatal(err) } if err = s.EnsureIntents(); err != nil { t.Fatal(err) } var wg sync.WaitGroup result := make(chan error, 30) for n := 0; n < 30; n++ { wg.Add(1) go func(n int) { defer wg.Done() if n%2 == 0 { result <- s.ReserveIntent(Intent{ID: ID(), UID: "u", Name: "test", Version: "1.2.3"}) } else { result <- s.ReserveInstance(Instance{ID: ID(), UID: "u"}) } }(n) } wg.Wait() close(result) ok := 0 for err := range result { if err == nil { ok++ } else if !errors.Is(err, ErrInstanceLimit) { t.Fatal(err) } } if ok != 2 { t.Fatalf("reserved %d", ok) } s.Close() s, err = Open(path) if err != nil { t.Fatal(err) } defer s.Close() if err = s.ReserveIntent(Intent{ID: ID(), UID: "u"}); !errors.Is(err, ErrInstanceLimit) { t.Fatalf("restart lost reservation: %v", err) } } func TestIntentClaimCancelAndVersion(t *testing.T) { s, err := Open(filepath.Join(t.TempDir(), "store.db")) if err != nil { t.Fatal(err) } defer s.Close() if err = s.EnsureIntents(); err != nil { t.Fatal(err) } in := Intent{ID: ID(), UID: "u", Version: "1.2.3"} if err = s.ReserveIntent(in); err != nil { t.Fatal(err) } i := Instance{ID: ID(), UID: "u", Version: "1.2.4"} if err = s.ClaimIntent(in.ID, i); !errors.Is(err, ErrIntentState) { t.Fatal(err) } if err = s.CancelIntent(in.ID, "other"); !errors.Is(err, ErrIntentState) { t.Fatal(err) } i.Version = in.Version if err = s.ClaimIntent(in.ID, i); err != nil { t.Fatal(err) } if err = s.CancelIntent(in.ID, in.UID); !errors.Is(err, ErrIntentState) { t.Fatal(err) } if err = s.ReserveIntent(Intent{ID: "second", UID: "u"}); err != nil { t.Fatal(err) } if err = s.ReserveIntent(Intent{ID: "third", UID: "u"}); !errors.Is(err, ErrInstanceLimit) { t.Fatal(err) } if err = s.CancelIntent("second", "u"); err != nil { t.Fatal(err) } if err = s.ReserveIntent(Intent{ID: "third", UID: "u"}); err != nil { t.Fatal(err) } }