package hostbox import ( "context" "errors" "github.com/carlosframework/platform/internal/lease" "io" "strings" "testing" "time" ) type budgetStore struct { lease.VersionedStore seen context.Context calls int } func (s *budgetStore) PutIfAbsent(ctx context.Context, _, _ string, _ []byte) (string, error) { s.seen = ctx s.calls++ return "version", nil } func (s *budgetStore) OpenVersion(ctx context.Context, _, _, _ string) (io.ReadCloser, error) { s.seen = ctx s.calls++ return io.NopCloser(strings.NewReader("version")), nil } func TestRequestStoreBudgetAndReadLifetime(t *testing.T) { raw := &budgetStore{} s := RequestStore{Store: raw, Check: func(context.Context) error { return nil }} if _, err := s.PutIfAbsent(context.Background(), "b", "key", nil); err != nil { t.Fatal(err) } deadline, ok := raw.seen.Deadline() if !ok || time.Until(deadline) > RequestLimit { t.Fatal(deadline) } if !errors.Is(raw.seen.Err(), context.Canceled) { t.Fatal("request context not released") } r, err := s.OpenVersion(context.Background(), "b", "key", "v") if err != nil { t.Fatal(err) } if raw.seen.Err() != nil { t.Fatal("stream cancelled before read") } if err := r.Close(); err != nil { t.Fatal(err) } if !errors.Is(raw.seen.Err(), context.Canceled) { t.Fatal("stream context leaked") } s.Check = func(context.Context) error { return ErrChanged } if _, err := s.PutIfAbsent(context.Background(), "b", "key", nil); err == nil || raw.calls != 2 { t.Fatal(err, raw.calls) } }