owpengram-server/internal/store/redisstore/redis_test.go
2026-09-09 02:49:30 +03:00

72 lines
1.5 KiB
Go

package redisstore
import (
"context"
"net"
"testing"
"time"
)
func TestOpenBoundsStalledRedisPing(t *testing.T) {
address, stop := startStalledRedis(t)
defer stop()
started := time.Now()
client, err := open(context.Background(), address, "", 0, 50*time.Millisecond)
if client != nil {
_ = client.Close()
}
if err == nil {
t.Fatal("open() succeeded against a stalled Redis endpoint")
}
if elapsed := time.Since(started); elapsed > time.Second {
t.Fatalf("open() took %s, want at most 1s", elapsed)
}
}
func TestOpenPreservesEarlierCallerDeadline(t *testing.T) {
address, stop := startStalledRedis(t)
defer stop()
ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond)
defer cancel()
started := time.Now()
client, err := open(ctx, address, "", 0, time.Second)
if client != nil {
_ = client.Close()
}
if err == nil {
t.Fatal("open() succeeded against a stalled Redis endpoint")
}
if elapsed := time.Since(started); elapsed > time.Second {
t.Fatalf("open() took %s, want at most 1s", elapsed)
}
}
func startStalledRedis(t *testing.T) (string, func()) {
t.Helper()
listener, err := net.Listen("tcp", "127.0.0.1:0")
if err != nil {
t.Fatalf("listen: %v", err)
}
stop := make(chan struct{})
done := make(chan struct{})
go func() {
defer close(done)
for {
conn, err := listener.Accept()
if err != nil {
return
}
go func() {
<-stop
_ = conn.Close()
}()
}
}()
return listener.Addr().String(), func() {
close(stop)
_ = listener.Close()
<-done
}
}