38 lines
1.0 KiB
Go
38 lines
1.0 KiB
Go
package quota
|
|
|
|
import (
|
|
"context"
|
|
"path/filepath"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestQuotaPersistenceRoundTrip(t *testing.T) {
|
|
path := filepath.Join(t.TempDir(), "quota.json")
|
|
a := NewMemory()
|
|
lim := Limits{ActorCreditsPerMinute: 60, ActorBurstCredits: 120, TenantCreditsPerMinute: 300, TenantBurstCredits: 600}
|
|
d, err := a.Reserve(context.Background(), "team", "user", 50, lim)
|
|
if err != nil || !d.Allowed {
|
|
t.Fatalf("reserve allowed=%v err=%v", d.Allowed, err)
|
|
}
|
|
if err := a.SavePersistent(path); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
b := NewMemory()
|
|
if err := b.LoadPersistent(path); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
d2, err := b.Reserve(context.Background(), "team", "user", 80, lim)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
// Actor started with 120, spent 50, so an immediate 80-credit request
|
|
// remains over budget after restart (apart from negligible refill time).
|
|
if d2.Allowed {
|
|
t.Fatalf("quota reset across restart: %#v", d2)
|
|
}
|
|
if d2.RetryAfter <= 0 || d2.RetryAfter > 20*time.Second {
|
|
t.Fatalf("unexpected retry: %v", d2.RetryAfter)
|
|
}
|
|
}
|