|
|
|
@ -130,12 +130,12 @@ namespace Grpc.IntegrationTesting |
|
|
|
|
client.HeaderInterceptor = OAuth2InterceptorFactory.Create(credential); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
RunTestCase(options.testCase, client); |
|
|
|
|
RunTestCaseAsync(options.testCase, client).Wait(); |
|
|
|
|
} |
|
|
|
|
GrpcEnvironment.Shutdown(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void RunTestCase(string testCase, TestService.TestServiceClient client) |
|
|
|
|
private async Task RunTestCaseAsync(string testCase, TestService.TestServiceClient client) |
|
|
|
|
{ |
|
|
|
|
switch (testCase) |
|
|
|
|
{ |
|
|
|
@ -146,16 +146,16 @@ namespace Grpc.IntegrationTesting |
|
|
|
|
RunLargeUnary(client); |
|
|
|
|
break; |
|
|
|
|
case "client_streaming": |
|
|
|
|
RunClientStreaming(client); |
|
|
|
|
await RunClientStreamingAsync(client); |
|
|
|
|
break; |
|
|
|
|
case "server_streaming": |
|
|
|
|
RunServerStreaming(client); |
|
|
|
|
await RunServerStreamingAsync(client); |
|
|
|
|
break; |
|
|
|
|
case "ping_pong": |
|
|
|
|
RunPingPong(client); |
|
|
|
|
await RunPingPongAsync(client); |
|
|
|
|
break; |
|
|
|
|
case "empty_stream": |
|
|
|
|
RunEmptyStream(client); |
|
|
|
|
await RunEmptyStreamAsync(client); |
|
|
|
|
break; |
|
|
|
|
case "service_account_creds": |
|
|
|
|
RunServiceAccountCreds(client); |
|
|
|
@ -170,10 +170,10 @@ namespace Grpc.IntegrationTesting |
|
|
|
|
RunPerRpcCreds(client); |
|
|
|
|
break; |
|
|
|
|
case "cancel_after_begin": |
|
|
|
|
RunCancelAfterBegin(client); |
|
|
|
|
await RunCancelAfterBeginAsync(client); |
|
|
|
|
break; |
|
|
|
|
case "cancel_after_first_response": |
|
|
|
|
RunCancelAfterFirstResponse(client); |
|
|
|
|
await RunCancelAfterFirstResponseAsync(client); |
|
|
|
|
break; |
|
|
|
|
case "benchmark_empty_unary": |
|
|
|
|
RunBenchmarkEmptyUnary(client); |
|
|
|
@ -207,118 +207,106 @@ namespace Grpc.IntegrationTesting |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void RunClientStreaming(TestService.ITestServiceClient client) |
|
|
|
|
public static async Task RunClientStreamingAsync(TestService.ITestServiceClient client) |
|
|
|
|
{ |
|
|
|
|
Task.Run(async () => |
|
|
|
|
{ |
|
|
|
|
Console.WriteLine("running client_streaming"); |
|
|
|
|
Console.WriteLine("running client_streaming"); |
|
|
|
|
|
|
|
|
|
var bodySizes = new List<int> { 27182, 8, 1828, 45904 }.ConvertAll((size) => StreamingInputCallRequest.CreateBuilder().SetPayload(CreateZerosPayload(size)).Build()); |
|
|
|
|
var bodySizes = new List<int> { 27182, 8, 1828, 45904 }.ConvertAll((size) => StreamingInputCallRequest.CreateBuilder().SetPayload(CreateZerosPayload(size)).Build()); |
|
|
|
|
|
|
|
|
|
using (var call = client.StreamingInputCall()) |
|
|
|
|
{ |
|
|
|
|
await call.RequestStream.WriteAll(bodySizes); |
|
|
|
|
using (var call = client.StreamingInputCall()) |
|
|
|
|
{ |
|
|
|
|
await call.RequestStream.WriteAll(bodySizes); |
|
|
|
|
|
|
|
|
|
var response = await call.ResponseAsync; |
|
|
|
|
Assert.AreEqual(74922, response.AggregatedPayloadSize); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
}).Wait(); |
|
|
|
|
var response = await call.ResponseAsync; |
|
|
|
|
Assert.AreEqual(74922, response.AggregatedPayloadSize); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void RunServerStreaming(TestService.ITestServiceClient client) |
|
|
|
|
public static async Task RunServerStreamingAsync(TestService.ITestServiceClient client) |
|
|
|
|
{ |
|
|
|
|
Task.Run(async () => |
|
|
|
|
{ |
|
|
|
|
Console.WriteLine("running server_streaming"); |
|
|
|
|
Console.WriteLine("running server_streaming"); |
|
|
|
|
|
|
|
|
|
var bodySizes = new List<int> { 31415, 9, 2653, 58979 }; |
|
|
|
|
var bodySizes = new List<int> { 31415, 9, 2653, 58979 }; |
|
|
|
|
|
|
|
|
|
var request = StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddRangeResponseParameters(bodySizes.ConvertAll( |
|
|
|
|
(size) => ResponseParameters.CreateBuilder().SetSize(size).Build())) |
|
|
|
|
.Build(); |
|
|
|
|
var request = StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddRangeResponseParameters(bodySizes.ConvertAll( |
|
|
|
|
(size) => ResponseParameters.CreateBuilder().SetSize(size).Build())) |
|
|
|
|
.Build(); |
|
|
|
|
|
|
|
|
|
using (var call = client.StreamingOutputCall(request)) |
|
|
|
|
using (var call = client.StreamingOutputCall(request)) |
|
|
|
|
{ |
|
|
|
|
var responseList = await call.ResponseStream.ToList(); |
|
|
|
|
foreach (var res in responseList) |
|
|
|
|
{ |
|
|
|
|
var responseList = await call.ResponseStream.ToList(); |
|
|
|
|
foreach (var res in responseList) |
|
|
|
|
{ |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, res.Payload.Type); |
|
|
|
|
} |
|
|
|
|
CollectionAssert.AreEqual(bodySizes, responseList.ConvertAll((item) => item.Payload.Body.Length)); |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, res.Payload.Type); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
}).Wait(); |
|
|
|
|
CollectionAssert.AreEqual(bodySizes, responseList.ConvertAll((item) => item.Payload.Body.Length)); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void RunPingPong(TestService.ITestServiceClient client) |
|
|
|
|
public static async Task RunPingPongAsync(TestService.ITestServiceClient client) |
|
|
|
|
{ |
|
|
|
|
Task.Run(async () => |
|
|
|
|
{ |
|
|
|
|
Console.WriteLine("running ping_pong"); |
|
|
|
|
Console.WriteLine("running ping_pong"); |
|
|
|
|
|
|
|
|
|
using (var call = client.FullDuplexCall()) |
|
|
|
|
{ |
|
|
|
|
await call.RequestStream.WriteAsync(StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(31415)) |
|
|
|
|
.SetPayload(CreateZerosPayload(27182)).Build()); |
|
|
|
|
using (var call = client.FullDuplexCall()) |
|
|
|
|
{ |
|
|
|
|
await call.RequestStream.WriteAsync(StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(31415)) |
|
|
|
|
.SetPayload(CreateZerosPayload(27182)).Build()); |
|
|
|
|
|
|
|
|
|
Assert.IsTrue(await call.ResponseStream.MoveNext()); |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); |
|
|
|
|
Assert.AreEqual(31415, call.ResponseStream.Current.Payload.Body.Length); |
|
|
|
|
Assert.IsTrue(await call.ResponseStream.MoveNext()); |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); |
|
|
|
|
Assert.AreEqual(31415, call.ResponseStream.Current.Payload.Body.Length); |
|
|
|
|
|
|
|
|
|
await call.RequestStream.WriteAsync(StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(9)) |
|
|
|
|
.SetPayload(CreateZerosPayload(8)).Build()); |
|
|
|
|
await call.RequestStream.WriteAsync(StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(9)) |
|
|
|
|
.SetPayload(CreateZerosPayload(8)).Build()); |
|
|
|
|
|
|
|
|
|
Assert.IsTrue(await call.ResponseStream.MoveNext()); |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); |
|
|
|
|
Assert.AreEqual(9, call.ResponseStream.Current.Payload.Body.Length); |
|
|
|
|
Assert.IsTrue(await call.ResponseStream.MoveNext()); |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); |
|
|
|
|
Assert.AreEqual(9, call.ResponseStream.Current.Payload.Body.Length); |
|
|
|
|
|
|
|
|
|
await call.RequestStream.WriteAsync(StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(2653)) |
|
|
|
|
.SetPayload(CreateZerosPayload(1828)).Build()); |
|
|
|
|
await call.RequestStream.WriteAsync(StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(2653)) |
|
|
|
|
.SetPayload(CreateZerosPayload(1828)).Build()); |
|
|
|
|
|
|
|
|
|
Assert.IsTrue(await call.ResponseStream.MoveNext()); |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); |
|
|
|
|
Assert.AreEqual(2653, call.ResponseStream.Current.Payload.Body.Length); |
|
|
|
|
Assert.IsTrue(await call.ResponseStream.MoveNext()); |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); |
|
|
|
|
Assert.AreEqual(2653, call.ResponseStream.Current.Payload.Body.Length); |
|
|
|
|
|
|
|
|
|
await call.RequestStream.WriteAsync(StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(58979)) |
|
|
|
|
.SetPayload(CreateZerosPayload(45904)).Build()); |
|
|
|
|
await call.RequestStream.WriteAsync(StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(58979)) |
|
|
|
|
.SetPayload(CreateZerosPayload(45904)).Build()); |
|
|
|
|
|
|
|
|
|
Assert.IsTrue(await call.ResponseStream.MoveNext()); |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); |
|
|
|
|
Assert.AreEqual(58979, call.ResponseStream.Current.Payload.Body.Length); |
|
|
|
|
Assert.IsTrue(await call.ResponseStream.MoveNext()); |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); |
|
|
|
|
Assert.AreEqual(58979, call.ResponseStream.Current.Payload.Body.Length); |
|
|
|
|
|
|
|
|
|
await call.RequestStream.CompleteAsync(); |
|
|
|
|
await call.RequestStream.CompleteAsync(); |
|
|
|
|
|
|
|
|
|
Assert.IsFalse(await call.ResponseStream.MoveNext()); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
}).Wait(); |
|
|
|
|
Assert.IsFalse(await call.ResponseStream.MoveNext()); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void RunEmptyStream(TestService.ITestServiceClient client) |
|
|
|
|
public static async Task RunEmptyStreamAsync(TestService.ITestServiceClient client) |
|
|
|
|
{ |
|
|
|
|
Task.Run(async () => |
|
|
|
|
Console.WriteLine("running empty_stream"); |
|
|
|
|
using (var call = client.FullDuplexCall()) |
|
|
|
|
{ |
|
|
|
|
Console.WriteLine("running empty_stream"); |
|
|
|
|
using (var call = client.FullDuplexCall()) |
|
|
|
|
{ |
|
|
|
|
await call.RequestStream.CompleteAsync(); |
|
|
|
|
await call.RequestStream.CompleteAsync(); |
|
|
|
|
|
|
|
|
|
var responseList = await call.ResponseStream.ToList(); |
|
|
|
|
Assert.AreEqual(0, responseList.Count); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
}).Wait(); |
|
|
|
|
var responseList = await call.ResponseStream.ToList(); |
|
|
|
|
Assert.AreEqual(0, responseList.Count); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void RunServiceAccountCreds(TestService.ITestServiceClient client) |
|
|
|
@ -406,65 +394,59 @@ namespace Grpc.IntegrationTesting |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void RunCancelAfterBegin(TestService.ITestServiceClient client) |
|
|
|
|
public static async Task RunCancelAfterBeginAsync(TestService.ITestServiceClient client) |
|
|
|
|
{ |
|
|
|
|
Task.Run(async () => |
|
|
|
|
Console.WriteLine("running cancel_after_begin"); |
|
|
|
|
|
|
|
|
|
var cts = new CancellationTokenSource(); |
|
|
|
|
using (var call = client.StreamingInputCall(cancellationToken: cts.Token)) |
|
|
|
|
{ |
|
|
|
|
Console.WriteLine("running cancel_after_begin"); |
|
|
|
|
// TODO(jtattermusch): we need this to ensure call has been initiated once we cancel it. |
|
|
|
|
await Task.Delay(1000); |
|
|
|
|
cts.Cancel(); |
|
|
|
|
|
|
|
|
|
var cts = new CancellationTokenSource(); |
|
|
|
|
using (var call = client.StreamingInputCall(cancellationToken: cts.Token)) |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
// TODO(jtattermusch): we need this to ensure call has been initiated once we cancel it. |
|
|
|
|
await Task.Delay(1000); |
|
|
|
|
cts.Cancel(); |
|
|
|
|
|
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
var response = await call.ResponseAsync; |
|
|
|
|
Assert.Fail(); |
|
|
|
|
} |
|
|
|
|
catch (RpcException e) |
|
|
|
|
{ |
|
|
|
|
Assert.AreEqual(StatusCode.Cancelled, e.Status.StatusCode); |
|
|
|
|
} |
|
|
|
|
var response = await call.ResponseAsync; |
|
|
|
|
Assert.Fail(); |
|
|
|
|
} |
|
|
|
|
catch (RpcException e) |
|
|
|
|
{ |
|
|
|
|
Assert.AreEqual(StatusCode.Cancelled, e.Status.StatusCode); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
}).Wait(); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void RunCancelAfterFirstResponse(TestService.ITestServiceClient client) |
|
|
|
|
public static async Task RunCancelAfterFirstResponseAsync(TestService.ITestServiceClient client) |
|
|
|
|
{ |
|
|
|
|
Task.Run(async () => |
|
|
|
|
{ |
|
|
|
|
Console.WriteLine("running cancel_after_first_response"); |
|
|
|
|
Console.WriteLine("running cancel_after_first_response"); |
|
|
|
|
|
|
|
|
|
var cts = new CancellationTokenSource(); |
|
|
|
|
using (var call = client.FullDuplexCall(cancellationToken: cts.Token)) |
|
|
|
|
{ |
|
|
|
|
await call.RequestStream.WriteAsync(StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(31415)) |
|
|
|
|
.SetPayload(CreateZerosPayload(27182)).Build()); |
|
|
|
|
var cts = new CancellationTokenSource(); |
|
|
|
|
using (var call = client.FullDuplexCall(cancellationToken: cts.Token)) |
|
|
|
|
{ |
|
|
|
|
await call.RequestStream.WriteAsync(StreamingOutputCallRequest.CreateBuilder() |
|
|
|
|
.SetResponseType(PayloadType.COMPRESSABLE) |
|
|
|
|
.AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(31415)) |
|
|
|
|
.SetPayload(CreateZerosPayload(27182)).Build()); |
|
|
|
|
|
|
|
|
|
Assert.IsTrue(await call.ResponseStream.MoveNext()); |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); |
|
|
|
|
Assert.AreEqual(31415, call.ResponseStream.Current.Payload.Body.Length); |
|
|
|
|
Assert.IsTrue(await call.ResponseStream.MoveNext()); |
|
|
|
|
Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type); |
|
|
|
|
Assert.AreEqual(31415, call.ResponseStream.Current.Payload.Body.Length); |
|
|
|
|
|
|
|
|
|
cts.Cancel(); |
|
|
|
|
cts.Cancel(); |
|
|
|
|
|
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
await call.ResponseStream.MoveNext(); |
|
|
|
|
Assert.Fail(); |
|
|
|
|
} |
|
|
|
|
catch (RpcException e) |
|
|
|
|
{ |
|
|
|
|
Assert.AreEqual(StatusCode.Cancelled, e.Status.StatusCode); |
|
|
|
|
} |
|
|
|
|
try |
|
|
|
|
{ |
|
|
|
|
await call.ResponseStream.MoveNext(); |
|
|
|
|
Assert.Fail(); |
|
|
|
|
} |
|
|
|
|
catch (RpcException e) |
|
|
|
|
{ |
|
|
|
|
Assert.AreEqual(StatusCode.Cancelled, e.Status.StatusCode); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
}).Wait(); |
|
|
|
|
} |
|
|
|
|
Console.WriteLine("Passed!"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// This is not an official interop test, but it's useful. |
|
|
|
|