@@ -474,6 +474,19 @@ func TestAllowRedisUnsupportedScheme(t *testing.T) {
474474 }
475475}
476476
477+ func TestAllowRedisParseError (t * testing.T ) {
478+ old := * redisAddr
479+ * redisAddr = "://bad"
480+ rl := NewRateLimiter (1 , time .Second , "" )
481+ t .Cleanup (func () {
482+ * redisAddr = old
483+ rl .Stop ()
484+ })
485+ if _ , err := rl .allowRedis ("k" ); err == nil {
486+ t .Fatal ("expected parse error" )
487+ }
488+ }
489+
477490func TestAllowRedisTLSCAError (t * testing.T ) {
478491 oldAddr , oldCA := * redisAddr , * redisCA
479492 * redisAddr = "rediss://localhost:1"
@@ -631,6 +644,42 @@ func TestAllowRedisTokenBucket(t *testing.T) {
631644 <- done
632645}
633646
647+ func TestAllowRedisTokenBucketRefillClamp (t * testing.T ) {
648+ rl := NewRateLimiter (2 , time .Second , "token_bucket" )
649+ t .Cleanup (rl .Stop )
650+ srv , cli := net .Pipe ()
651+ done := make (chan struct {})
652+ go func () {
653+ defer func () { srv .Close (); close (done ) }()
654+ br := bufio .NewReader (srv )
655+ if cmd , args := parseRedisCommand (t , br ); cmd != "GET" || args [0 ] != "k" {
656+ t .Errorf ("unexpected command %s %v" , cmd , args )
657+ return
658+ }
659+ val := fmt .Sprintf ("%f %d" , float64 (rl .limit )+ 5 , time .Now ().Add (- time .Minute ).UnixNano ())
660+ fmt .Fprintf (srv , "$%d\r \n %s\r \n " , len (val ), val )
661+ if cmd , args := parseRedisCommand (t , br ); cmd != "SET" || args [0 ] != "k" {
662+ t .Errorf ("unexpected command %s %v" , cmd , args )
663+ return
664+ }
665+ srv .Write ([]byte ("+OK\r \n " ))
666+ if cmd , _ := parseRedisCommand (t , br ); cmd != "EXPIRE" && cmd != "PEXPIRE" {
667+ t .Errorf ("unexpected command %s" , cmd )
668+ return
669+ }
670+ srv .Write ([]byte (":1\r \n " ))
671+ }()
672+
673+ ok , err := rl .allowRedisTokenBucket (cli , "k" )
674+ if err != nil {
675+ t .Fatalf ("allowRedisTokenBucket error: %v" , err )
676+ }
677+ if ! ok {
678+ t .Fatal ("expected token bucket allow" )
679+ }
680+ <- done
681+ }
682+
634683func TestAllowRedisTokenBucketReject (t * testing.T ) {
635684 rl := NewRateLimiter (1 , time .Hour , "token_bucket" )
636685 t .Cleanup (rl .Stop )
@@ -1060,6 +1109,45 @@ func TestAllowRedisDialError(t *testing.T) {
10601109 }
10611110}
10621111
1112+ func TestAllowRedisAuthError (t * testing.T ) {
1113+ ln , err := net .Listen ("tcp" , "127.0.0.1:0" )
1114+ if err != nil {
1115+ t .Fatal (err )
1116+ }
1117+ defer ln .Close ()
1118+
1119+ done := make (chan struct {})
1120+ go func () {
1121+ defer close (done )
1122+ c , err := ln .Accept ()
1123+ if err != nil {
1124+ return
1125+ }
1126+ defer c .Close ()
1127+ br := bufio .NewReader (c )
1128+ if cmd , args := parseRedisCommand (t , br ); cmd != "AUTH" || len (args ) != 2 || args [0 ] != "user" || args [1 ] != "pw" {
1129+ t .Errorf ("unexpected auth command %s %v" , cmd , args )
1130+ return
1131+ }
1132+ c .Write ([]byte ("-ERR nope\r \n " ))
1133+ }()
1134+
1135+ oldAddr , oldTimeout := * redisAddr , * redisTimeout
1136+ * redisAddr = "redis://user:pw@" + ln .Addr ().String ()
1137+ * redisTimeout = time .Second
1138+ rl := NewRateLimiter (1 , time .Second , "" )
1139+ t .Cleanup (func () {
1140+ * redisAddr = oldAddr
1141+ * redisTimeout = oldTimeout
1142+ rl .Stop ()
1143+ })
1144+
1145+ if _ , err := rl .allowRedis ("k" ); err == nil {
1146+ t .Fatal ("expected auth error" )
1147+ }
1148+ <- done
1149+ }
1150+
10631151// Helper process used for testing main().
10641152func TestMainHelper (t * testing.T ) {
10651153 if os .Getenv ("GO_WANT_MAIN_HELPER" ) != "1" {
0 commit comments