@@ -30,6 +30,26 @@ public function testCheckArray()
30
30
$ this ->check ($ storage );
31
31
}
32
32
33
+ public function testUpdateAllowanceRedis ()
34
+ {
35
+ $ storage = new \Codeages \RateLimiter \Storage \RedisStorage ();
36
+ $ this ->updateAllowance ($ storage );
37
+ }
38
+
39
+ public function testUpdateAllowanceMySQLPDO ()
40
+ {
41
+ $ pdo = new PDO (getenv ('MYSQL_DSN ' ), getenv ('MYSQL_USER ' ), getenv ('MYSQL_MYSQL_PASSWORD ' ));
42
+ $ pdo ->setAttribute (PDO ::ATTR_ERRMODE , PDO ::ERRMODE_EXCEPTION );
43
+ $ storage = new \Codeages \RateLimiter \Storage \MySQLPDOStorage ($ pdo );
44
+ $ this ->updateAllowance ($ storage );
45
+ }
46
+
47
+ public function testUpdateAllowanceArray ()
48
+ {
49
+ $ storage = new \Codeages \RateLimiter \Storage \ArrayStorage ();
50
+ $ this ->updateAllowance ($ storage );
51
+ }
52
+
33
53
private function check ($ storage )
34
54
{
35
55
$ ip = '127.0.0.1 ' ;
@@ -59,6 +79,23 @@ private function check($storage)
59
79
$ rateLimit ->purge ($ ip );
60
80
}
61
81
82
+ private function updateAllowance ($ storage )
83
+ {
84
+ $ name = 'testUpdateAllowance ' ;
85
+ $ rateLimit = $ this ->getRateLimiter ($ storage );
86
+
87
+ $ this ->assertEquals (self ::MAX_REQUESTS , $ rateLimit ->updateAllowance ($ name , self ::MAX_REQUESTS ));
88
+ $ this ->assertEquals (0 , $ rateLimit ->updateAllowance ($ name , -self ::MAX_REQUESTS ));
89
+ $ this ->assertEquals (0 , $ rateLimit ->updateAllowance ($ name , -self ::MAX_REQUESTS ));
90
+
91
+ for ($ i = 0 , $ j = 0 ; $ i < self ::MAX_REQUESTS ; ++$ i ) {
92
+ $ j += $ i ;
93
+ $ this ->assertEquals ($ j , $ rateLimit ->updateAllowance ($ name , $ i ));
94
+ }
95
+
96
+ $ rateLimit ->purge ($ name );
97
+ }
98
+
62
99
private function getRateLimiter (Storage $ storage )
63
100
{
64
101
return new RateLimiter (self ::NAME , self ::MAX_REQUESTS , self ::PERIOD , $ storage );
0 commit comments