72 lines
1.5 KiB
Go
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
|
|
}
|
|
}
|