public void TestOnErrorAsync() { var channelManager = new GrpcChannelManager(new string[] { "randomhost" }, TimeSpan.FromMilliseconds(10), maxRetry: 3); var callInvoker = channelManager.GetCallInvoker(); var client = new SampleApi.SampleApiClient(callInvoker); var attemptList = new List <int>(); var errorList = new List <Exception>(); channelManager.OnError += (obj, args) => { attemptList.Add(args.AttemptCount); errorList.Add(args.Error); }; Assert.ThrowsAsync <RpcException>(async() => await client.SampleRpcMethodAsync(new SampleRequest() { Payload = "" })); Assert.AreEqual(attemptList, new List <int>() { 1, 2, 3 }); Assert.IsTrue(errorList.All(e => e is RpcException)); }
public void TestFailureOnRetryTransientErrorAsync() { var attempt = 0; var server = SampleApiMock.CreateLocalServer(() => { attempt++; return(null); }); server.Start(); try { var serverUrl = GrpcServerUtil.GetServerUrl(server); var channelManager = new GrpcChannelManager( new string[] { serverUrl }, timeout: TimeSpan.FromMilliseconds(200), maxRetry: 3); var lbCallInvoker = channelManager.GetCallInvoker(); var client = new SampleApi.SampleApiClient(lbCallInvoker); Assert.ThrowsAsync <RpcException>(async() => await client.SampleRpcMethodAsync(new SampleRequest() { Payload = "" })); Assert.AreEqual(3, attempt); } finally { server.ShutdownAsync().Wait(); } }
public async Task TestSuccessOnRetryAsync() { var attempt = 0; var server = SampleApiMock.CreateLocalServer(() => { if (attempt == 2) { return(Task.FromResult(new SampleResponse() { Payload = "success!" })); } else { attempt++; return(null); } }); server.Start(); try { var serverUrl = GrpcServerUtil.GetServerUrl(server); var channelManager = new GrpcChannelManager( new string[] { serverUrl }, timeout: TimeSpan.FromMilliseconds(200), maxRetry: 3); var lbCallInvoker = channelManager.GetCallInvoker(); var client = new SampleApi.SampleApiClient(lbCallInvoker); var result = await client.SampleRpcMethodAsync(new SampleRequest() { Payload = "" }).ResponseAsync; Assert.AreEqual(2, attempt); Assert.AreEqual("success!", result.Payload); } finally { server.ShutdownAsync().Wait(); } }
public void TestRetryOnDeadlineExceededAsync() { var attempt = 0; var server = SampleApiMock.CreateLocalServer(async() => { attempt++; await Task.Delay(5000); return(new SampleResponse() { Payload = "" }); }); server.Start(); try { var serverUrl = GrpcServerUtil.GetServerUrl(server); var channelManager = new GrpcChannelManager( new string[] { serverUrl }, timeout: TimeSpan.FromMilliseconds(200), maxRetry: 3); var lbCallInvoker = channelManager.GetCallInvoker(); var client = new SampleApi.SampleApiClient(lbCallInvoker); var e = Assert.ThrowsAsync <RpcException>(async() => await client.SampleRpcMethodAsync(new SampleRequest() { Payload = "" })); Assert.AreEqual(e.StatusCode, StatusCode.DeadlineExceeded); Assert.AreEqual(3, attempt); } finally { server.ShutdownAsync().Wait(); } }