| @@ -313,7 +313,7 @@ func (r *rpcClient) Call(ctx context.Context, request Request, response interfac | |||||||
| 	ch := make(chan error, callOpts.Retries) | 	ch := make(chan error, callOpts.Retries) | ||||||
| 	var gerr error | 	var gerr error | ||||||
|  |  | ||||||
| 	for i := 0; i < callOpts.Retries; i++ { | 	for i := 0; i <= callOpts.Retries; i++ { | ||||||
| 		go func() { | 		go func() { | ||||||
| 			ch <- call(i) | 			ch <- call(i) | ||||||
| 		}() | 		}() | ||||||
| @@ -411,7 +411,7 @@ func (r *rpcClient) Stream(ctx context.Context, request Request, opts ...CallOpt | |||||||
| 	ch := make(chan response, callOpts.Retries) | 	ch := make(chan response, callOpts.Retries) | ||||||
| 	var grr error | 	var grr error | ||||||
|  |  | ||||||
| 	for i := 0; i < callOpts.Retries; i++ { | 	for i := 0; i <= callOpts.Retries; i++ { | ||||||
| 		go func() { | 		go func() { | ||||||
| 			s, err := call(i) | 			s, err := call(i) | ||||||
| 			ch <- response{s, err} | 			ch <- response{s, err} | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ package client | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"errors" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| @@ -56,6 +57,46 @@ func TestCallAddress(t *testing.T) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestCallRetry(t *testing.T) { | ||||||
|  | 	service := "test.service" | ||||||
|  | 	method := "Test.Method" | ||||||
|  | 	address := "10.1.10.1:8080" | ||||||
|  |  | ||||||
|  | 	var called int | ||||||
|  |  | ||||||
|  | 	wrap := func(cf CallFunc) CallFunc { | ||||||
|  | 		return func(ctx context.Context, addr string, req Request, rsp interface{}, opts CallOptions) error { | ||||||
|  | 			called++ | ||||||
|  | 			if called == 1 { | ||||||
|  | 				return errors.New("retry request") | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			// don't do the call | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	r := mock.NewRegistry() | ||||||
|  | 	c := NewClient( | ||||||
|  | 		Registry(r), | ||||||
|  | 		WrapCall(wrap), | ||||||
|  | 	) | ||||||
|  | 	c.Options().Selector.Init(selector.Registry(r)) | ||||||
|  |  | ||||||
|  | 	req := c.NewRequest(service, method, nil) | ||||||
|  |  | ||||||
|  | 	// test calling remote address | ||||||
|  | 	if err := c.Call(context.Background(), req, nil, WithAddress(address)); err != nil { | ||||||
|  | 		t.Fatal("call with address error", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// num calls | ||||||
|  | 	if called < c.Options().CallOptions.Retries+1 { | ||||||
|  | 		t.Fatal("request not retried") | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func TestCallWrapper(t *testing.T) { | func TestCallWrapper(t *testing.T) { | ||||||
| 	var called bool | 	var called bool | ||||||
| 	id := "test.1" | 	id := "test.1" | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user