Skip to content

Commit d15a4ec

Browse files
authored
Merge pull request #593 from winhowes/codex/add-tests-for-app/main.go-conditions
Add tests for Redis rate limiter edge cases
2 parents 776a66d + 69fdc0e commit d15a4ec

1 file changed

Lines changed: 88 additions & 0 deletions

File tree

app/main_test.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
477490
func 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+
634683
func 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().
10641152
func TestMainHelper(t *testing.T) {
10651153
if os.Getenv("GO_WANT_MAIN_HELPER") != "1" {

0 commit comments

Comments
 (0)