@@ -64,3 +64,33 @@ func TestLimiterTracksKindsWithoutDuplicateCounters(t *testing.T) {
|
||||
t.Fatalf("release duplicated or leaked active counters: %+v", status)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLimiterCanRaiseRuntimeLimit(t *testing.T) {
|
||||
l := New(1, 4)
|
||||
release1, err := l.Acquire(context.Background())
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
acquired := make(chan func(), 1)
|
||||
go func() {
|
||||
release, err := l.Acquire(context.Background())
|
||||
if err == nil {
|
||||
acquired <- release
|
||||
}
|
||||
}()
|
||||
time.Sleep(10 * time.Millisecond)
|
||||
if got := l.Status(); got.Active != 1 || got.Waiting != 1 {
|
||||
t.Fatalf("unexpected before resize: %+v", got)
|
||||
}
|
||||
l.SetLimits(2, 8)
|
||||
select {
|
||||
case release2 := <-acquired:
|
||||
release2()
|
||||
case <-time.After(time.Second):
|
||||
t.Fatal("raising limiter did not wake waiter")
|
||||
}
|
||||
release1()
|
||||
if got := l.Status(); got.MaxInflight != 2 || got.QueueSize != 8 || got.Active != 0 {
|
||||
t.Fatalf("unexpected resized status: %+v", got)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user