@@ -3,6 +3,8 @@ package limiter
33import (
44 "context"
55 "strings"
6+ "sync"
7+ "sync/atomic"
68 "testing"
79 "time"
810
@@ -16,23 +18,22 @@ func TestDeadlineLimiter(t *testing.T) {
1618 t .Run ("Unblocked" , func (t2 * testing.T ) {
1719 asrt := assert .New (t2 )
1820 l := limit .NewSettableLimit ("test" , 10 , nil )
19- noopLogger := limit.NoopLimitLogger {}
2021 defaultLimiter , err := NewDefaultLimiter (
2122 l ,
2223 defaultMinWindowTime ,
2324 defaultMaxWindowTime ,
2425 defaultMinRTTThreshold ,
2526 defaultWindowSize ,
2627 strategy .NewSimpleStrategy (10 ),
27- noopLogger ,
28+ nil ,
2829 core .EmptyMetricRegistryInstance ,
2930 )
3031 if ! asrt .NoError (err ) {
3132 asrt .FailNow ("" )
3233 }
3334 asrt .NotNil (defaultLimiter )
34- deadline := time .Now ().Add (time .Second * 15 )
35- deadlineLimiter := NewDeadlineLimiter (defaultLimiter , deadline , noopLogger )
35+ deadline := time .Now ().Add (time .Second * 15 )
36+ deadlineLimiter := NewDeadlineLimiter (defaultLimiter , deadline , nil )
3637 // stringer
3738 asrt .True (strings .Contains (deadlineLimiter .String (), "DeadlineLimiter{delegate=DefaultLimiter{" ))
3839
@@ -71,7 +72,7 @@ func TestDeadlineLimiter(t *testing.T) {
7172 asrt .FailNow ("" )
7273 }
7374 asrt .NotNil (defaultLimiter )
74- deadline := time .Now ().Add (time .Second * 1 )
75+ deadline := time .Now ().Add (time .Second * 1 )
7576 deadlineLimiter := NewDeadlineLimiter (defaultLimiter , deadline , noopLogger )
7677
7778 i := 1
@@ -94,5 +95,48 @@ func TestDeadlineLimiter(t *testing.T) {
9495 asrt .True (deadlineFound , "expected deadline to be reached but not after %d attempts" , i )
9596 asrt .Equal (2 , i , "expected deadline to be exceeded on second attempt" )
9697 })
97- }
9898
99+ t .Run ("limit reached" , func (t2 * testing.T ) {
100+ asrt := assert .New (t2 )
101+ l := limit .NewFixedLimit ("test" , 1 , nil )
102+ noopLogger := limit.BuiltinLimitLogger {}
103+ defaultLimiter , err := NewDefaultLimiter (
104+ l ,
105+ defaultMinWindowTime ,
106+ defaultMaxWindowTime ,
107+ defaultMinRTTThreshold ,
108+ defaultWindowSize ,
109+ strategy .NewSimpleStrategy (1 ),
110+ noopLogger ,
111+ core .EmptyMetricRegistryInstance ,
112+ )
113+ if ! asrt .NoError (err ) {
114+ asrt .FailNow ("" )
115+ }
116+ asrt .NotNil (defaultLimiter )
117+ deadline := time .Now ().Add (time .Second * 1 )
118+ deadlineLimiter := NewDeadlineLimiter (defaultLimiter , deadline , noopLogger )
119+
120+ var deadlineFound atomic.Value
121+ deadlineFound .Store (false )
122+ var wg sync.WaitGroup
123+ wg .Add (3 )
124+
125+ for i := 0 ; i < 3 ; i ++ {
126+ go func (c int ) {
127+ defer wg .Done ()
128+ listener , ok := deadlineLimiter .Acquire (context .Background ())
129+ if ok && listener != nil {
130+ time .Sleep (time .Second )
131+ listener .OnSuccess ()
132+ } else {
133+ deadlineFound .Store (true )
134+ }
135+ }(i )
136+ time .Sleep (time .Millisecond * 5 )
137+ }
138+ wg .Wait ()
139+
140+ asrt .True (deadlineFound .Load ().(bool ), "expected deadline limit to be reached but not after 2 attempts" )
141+ })
142+ }
0 commit comments