@@ -36,19 +36,49 @@ public function testConsume()
36
36
{
37
37
$ limiter1 = $ this ->createLimiter (4 , new \DateInterval ('PT1S ' ));
38
38
$ limiter2 = $ this ->createLimiter (8 , new \DateInterval ('PT10S ' ));
39
- $ limiter3 = $ this ->createLimiter (12 , new \DateInterval ('PT30S ' ));
39
+ $ limiter3 = $ this ->createLimiter (16 , new \DateInterval ('PT30S ' ));
40
40
$ limiter = new CompoundLimiter ([$ limiter1 , $ limiter2 , $ limiter3 ]);
41
41
42
- $ this ->assertEquals (0 , $ limiter ->consume (4 )->getRemainingTokens (), 'Limiter 1 reached the limit ' );
42
+ $ rateLimit = $ limiter ->consume (4 );
43
+ $ this ->assertEquals (0 , $ rateLimit ->getRemainingTokens (), 'Limiter 1 reached the limit ' );
44
+ $ this ->assertTrue ($ rateLimit ->isAccepted (), 'All limiters accept (exact limit on limiter 1) ' );
45
+
46
+ $ rateLimit = $ limiter ->consume (1 );
47
+ $ this ->assertEquals (0 , $ rateLimit ->getRemainingTokens (), 'Limiter 1 reached the limit ' );
48
+ $ this ->assertFalse ($ rateLimit ->isAccepted (), 'Limiter 1 did not accept limit ' );
49
+
43
50
sleep (1 ); // reset limiter1's window
44
- $ this ->assertTrue ($ limiter ->consume (3 )->isAccepted ());
45
51
46
- $ this ->assertEquals (0 , $ limiter ->consume ()->getRemainingTokens (), 'Limiter 2 has no remaining tokens left ' );
47
- sleep (10 ); // reset limiter2's window
48
- $ this ->assertTrue ($ limiter ->consume (3 )->isAccepted ());
52
+ $ rateLimit = $ limiter ->consume (3 );
53
+ $ this ->assertEquals (0 , $ rateLimit ->getRemainingTokens (), 'Limiter 2 consumed exactly the remaining tokens ' );
54
+ $ this ->assertTrue ($ rateLimit ->isAccepted (), 'All accept the request (exact limit on limiter 2) ' );
55
+
56
+ $ rateLimit = $ limiter ->consume (1 );
57
+ $ this ->assertEquals (0 , $ rateLimit ->getRemainingTokens (), 'Limiter 2 had remaining tokens left ' );
58
+ $ this ->assertFalse ($ rateLimit ->isAccepted (), 'Limiter 2 did not accept the request ' );
59
+
60
+ sleep (1 ); // reset limiter1's window again, to make sure that the limiter2 overrides limiter1
61
+
62
+ // make sure to consume all allowed by limiter1, limiter2 already had 0 remaining
63
+ $ rateLimit = $ limiter ->consume (4 );
64
+ $ this ->assertEquals (
65
+ 0 ,
66
+ $ rateLimit ->getRemainingTokens (),
67
+ 'Limiter 1 consumed the remaining tokens (accept), Limiter 2 did not have any remaining (not accept) '
68
+ );
69
+ $ this ->assertFalse ($ rateLimit ->isAccepted (), 'Limiter 2 reached the limit already ' );
70
+
71
+ sleep (10 ); // reset limiter2's window (also limiter1)
72
+
73
+ $ rateLimit = $ limiter ->consume (3 );
74
+ $ this ->assertEquals (0 , $ rateLimit ->getRemainingTokens (), 'Limiter 3 had exactly 3 tokens (accept) ' );
75
+ $ this ->assertTrue ($ rateLimit ->isAccepted ());
76
+
77
+ $ rateLimit = $ limiter ->consume (1 );
78
+ $ this ->assertFalse ($ rateLimit ->isAccepted (), 'Limiter 3 reached the limit previously ' );
79
+
80
+ sleep (30 ); // reset limiter3's window (also limiter1 and limiter2)
49
81
50
- $ this ->assertEquals (0 , $ limiter ->consume ()->getRemainingTokens (), 'Limiter 3 reached the limit ' );
51
- sleep (20 ); // reset limiter3's window
52
82
$ this ->assertTrue ($ limiter ->consume ()->isAccepted ());
53
83
}
54
84
0 commit comments