blob: de05681500e9cf6bcfc46e5c3183f4b08981ec9b [file] [log] [blame]
package gax
import (
"testing"
"time"
"golang.org/x/net/context"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
)
var (
testCallSettings = []CallOption{
WithRetryCodes([]codes.Code{codes.Unavailable, codes.DeadlineExceeded}),
// initial, max, multiplier
WithDelayTimeoutSettings(100*time.Millisecond, 300*time.Millisecond, 1.5),
WithRPCTimeoutSettings(50*time.Millisecond, 500*time.Millisecond, 3.0),
WithTotalRetryTimeout(1000 * time.Millisecond),
}
)
func TestInvokeWithTimeout(t *testing.T) {
ctx := context.Background()
var ok bool
Invoke(ctx, func(childCtx context.Context) error {
_, ok = childCtx.Deadline()
return nil
}, WithTimeout(10000*time.Millisecond))
if !ok {
t.Errorf("expected call to have an assigned timeout")
}
}
func TestInvokeWithOKResponseWithTimeout(t *testing.T) {
ctx := context.Background()
var resp int
err := Invoke(ctx, func(childCtx context.Context) error {
resp = 42
return nil
}, WithTimeout(10000*time.Millisecond))
if resp != 42 || err != nil {
t.Errorf("expected call to return nil and set resp to 42")
}
}
func TestInvokeWithDeadlineAfterRetries(t *testing.T) {
ctx := context.Background()
count := 0
now := time.Now()
expectedTimeout := []time.Duration{
0,
150 * time.Millisecond,
450 * time.Millisecond,
}
err := Invoke(ctx, func(childCtx context.Context) error {
t.Log("delta:", time.Now().Sub(now.Add(expectedTimeout[count])))
if !time.Now().After(now.Add(expectedTimeout[count])) {
t.Errorf("expected %s to pass before this call", expectedTimeout[count])
}
count += 1
<-childCtx.Done()
// Workaround for `go vet`: https://github.com/grpc/grpc-go/issues/90
errf := grpc.Errorf
return errf(codes.DeadlineExceeded, "")
}, testCallSettings...)
if count != 3 || err == nil {
t.Errorf("expected call to retry 3 times and return an error")
}
}
func TestInvokeWithOKResponseAfterRetries(t *testing.T) {
ctx := context.Background()
count := 0
var resp int
err := Invoke(ctx, func(childCtx context.Context) error {
count += 1
if count == 3 {
resp = 42
return nil
}
<-childCtx.Done()
errf := grpc.Errorf
return errf(codes.DeadlineExceeded, "")
}, testCallSettings...)
if count != 3 || resp != 42 || err != nil {
t.Errorf("expected call to retry 3 times, return nil, and set resp to 42")
}
}