blob: 0df4ee35ba99335ecf1aba4db2bff391e257a4fe [file] [log] [blame]
Jan Tattermuscha7fff862015-02-13 11:08:08 -08001#region Copyright notice and license
2
Jan Tattermuschaf77b3d2015-02-13 11:22:21 -08003// Copyright 2015, Google Inc.
Jan Tattermuscha7fff862015-02-13 11:08:08 -08004// All rights reserved.
Craig Tiller190d3602015-02-18 09:23:38 -08005//
Jan Tattermuscha7fff862015-02-13 11:08:08 -08006// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions are
8// met:
Craig Tiller190d3602015-02-18 09:23:38 -08009//
Jan Tattermuscha7fff862015-02-13 11:08:08 -080010// * Redistributions of source code must retain the above copyright
11// notice, this list of conditions and the following disclaimer.
12// * Redistributions in binary form must reproduce the above
13// copyright notice, this list of conditions and the following disclaimer
14// in the documentation and/or other materials provided with the
15// distribution.
16// * Neither the name of Google Inc. nor the names of its
17// contributors may be used to endorse or promote products derived from
18// this software without specific prior written permission.
Craig Tiller190d3602015-02-18 09:23:38 -080019//
Jan Tattermuscha7fff862015-02-13 11:08:08 -080020// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32#endregion
33
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -080034using System;
Jan Tattermuschd233d3a2015-02-06 14:15:00 -080035using System.Collections.Generic;
Jan Tattermusch74f39e12015-09-23 20:14:56 -070036using System.IO;
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -080037using System.Text.RegularExpressions;
Jan Tattermusche5c44602015-05-01 11:12:34 -070038using System.Threading;
Jan Tattermuscha5272b62015-04-30 11:56:46 -070039using System.Threading.Tasks;
Jan Tattermusch1ca56b92015-04-27 11:03:06 -070040
Jan Tattermuschb26972f2015-09-03 17:47:14 -070041using CommandLine;
Jan Tattermusch74f39e12015-09-23 20:14:56 -070042using CommandLine.Text;
Jan Tattermusch67c45872015-08-27 18:12:39 -070043using Google.Apis.Auth.OAuth2;
44using Google.Protobuf;
Jan Tattermuschdca6e882015-04-22 16:56:27 -070045using Grpc.Auth;
Jan Tattermusch30868622015-02-19 09:22:33 -080046using Grpc.Core;
47using Grpc.Core.Utils;
Jan Tattermusch8644aea2015-08-03 10:21:18 -070048using Grpc.Testing;
Jan Tattermusch30868622015-02-19 09:22:33 -080049using NUnit.Framework;
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -080050
Jan Tattermusch8b86b152015-02-19 21:01:05 -080051namespace Grpc.IntegrationTesting
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -080052{
Jan Tattermusch503bbac2015-02-26 18:19:47 -080053 public class InteropClient
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -080054 {
55 private class ClientOptions
56 {
Jan Tattermuschb26972f2015-09-03 17:47:14 -070057 [Option("server_host", DefaultValue = "127.0.0.1")]
58 public string ServerHost { get; set; }
59
60 [Option("server_host_override", DefaultValue = TestCredentials.DefaultHostOverride)]
61 public string ServerHostOverride { get; set; }
62
63 [Option("server_port", Required = true)]
64 public int ServerPort { get; set; }
65
66 [Option("test_case", DefaultValue = "large_unary")]
67 public string TestCase { get; set; }
68
69 [Option("use_tls")]
70 public bool UseTls { get; set; }
71
72 [Option("use_test_ca")]
73 public bool UseTestCa { get; set; }
74
75 [Option("default_service_account", Required = false)]
76 public string DefaultServiceAccount { get; set; }
77
78 [Option("oauth_scope", Required = false)]
79 public string OAuthScope { get; set; }
80
81 [Option("service_account_key_file", Required = false)]
82 public string ServiceAccountKeyFile { get; set; }
83
84 [HelpOption]
85 public string GetUsage()
86 {
87 var help = new HelpText
88 {
89 Heading = "gRPC C# interop testing client",
90 AddDashesToOption = true
91 };
92 help.AddPreOptionsLine("Usage:");
93 help.AddOptions(this);
94 return help;
95 }
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -080096 }
97
98 ClientOptions options;
99
Jan Tattermusch503bbac2015-02-26 18:19:47 -0800100 private InteropClient(ClientOptions options)
Jan Tattermusch392d1e02015-02-09 11:13:51 -0800101 {
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800102 this.options = options;
103 }
104
Jan Tattermusch503bbac2015-02-26 18:19:47 -0800105 public static void Run(string[] args)
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800106 {
Jan Tattermuschb26972f2015-09-03 17:47:14 -0700107 var options = new ClientOptions();
108 if (!Parser.Default.ParseArguments(args, options))
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800109 {
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800110 Environment.Exit(1);
111 }
112
Jan Tattermusch503bbac2015-02-26 18:19:47 -0800113 var interopClient = new InteropClient(options);
Jan Tattermusch0c140a82015-08-02 00:54:02 -0700114 interopClient.Run().Wait();
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800115 }
116
Jan Tattermusch0c140a82015-08-02 00:54:02 -0700117 private async Task Run()
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800118 {
Jan Tattermusch9e5e7e92015-09-24 10:34:05 -0700119 var credentials = await CreateCredentialsAsync();
120
121 List<ChannelOption> channelOptions = null;
122 if (!string.IsNullOrEmpty(options.ServerHostOverride))
123 {
124 channelOptions = new List<ChannelOption>
125 {
126 new ChannelOption(ChannelOptions.SslTargetNameOverride, options.ServerHostOverride)
127 };
128 }
129 var channel = new Channel(options.ServerHost, options.ServerPort, credentials, channelOptions);
130 TestService.TestServiceClient client = new TestService.TestServiceClient(channel);
131 await RunTestCaseAsync(client, options);
132 await channel.ShutdownAsync();
133 }
134
Jan Tattermusch5bd70052015-10-06 16:47:49 -0700135 private async Task<ChannelCredentials> CreateCredentialsAsync()
Jan Tattermusch9e5e7e92015-09-24 10:34:05 -0700136 {
Jan Tattermusch5bd70052015-10-06 16:47:49 -0700137 var credentials = options.UseTls ? TestCredentials.CreateTestClientCredentials(options.UseTestCa) : ChannelCredentials.Insecure;
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700138
139 if (options.TestCase == "jwt_token_creds")
140 {
141 var googleCredential = await GoogleCredential.GetApplicationDefaultAsync();
142 Assert.IsTrue(googleCredential.IsCreateScopedRequired);
Jan Tattermusch5bd70052015-10-06 16:47:49 -0700143 credentials = ChannelCredentials.Create(credentials, googleCredential.ToGrpcCredentials());
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700144 }
145
146 if (options.TestCase == "compute_engine_creds")
147 {
148 var googleCredential = await GoogleCredential.GetApplicationDefaultAsync();
149 Assert.IsFalse(googleCredential.IsCreateScopedRequired);
Jan Tattermusch5bd70052015-10-06 16:47:49 -0700150 credentials = ChannelCredentials.Create(credentials, googleCredential.ToGrpcCredentials());
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700151 }
Jan Tattermusch9e5e7e92015-09-24 10:34:05 -0700152 return credentials;
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800153 }
154
Jan Tattermuschb26972f2015-09-03 17:47:14 -0700155 private async Task RunTestCaseAsync(TestService.TestServiceClient client, ClientOptions options)
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800156 {
Jan Tattermuschb26972f2015-09-03 17:47:14 -0700157 switch (options.TestCase)
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800158 {
159 case "empty_unary":
160 RunEmptyUnary(client);
161 break;
162 case "large_unary":
163 RunLargeUnary(client);
164 break;
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800165 case "client_streaming":
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700166 await RunClientStreamingAsync(client);
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800167 break;
168 case "server_streaming":
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700169 await RunServerStreamingAsync(client);
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800170 break;
171 case "ping_pong":
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700172 await RunPingPongAsync(client);
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800173 break;
174 case "empty_stream":
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700175 await RunEmptyStreamAsync(client);
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800176 break;
Jan Tattermusch0bbfa382015-04-27 16:11:59 -0700177 case "compute_engine_creds":
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700178 RunComputeEngineCreds(client, options.DefaultServiceAccount, options.OAuthScope);
Jan Tattermusch0c140a82015-08-02 00:54:02 -0700179 break;
180 case "jwt_token_creds":
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700181 RunJwtTokenCreds(client, options.DefaultServiceAccount);
Jan Tattermusch0bbfa382015-04-27 16:11:59 -0700182 break;
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700183 case "oauth2_auth_token":
Jan Tattermuschb26972f2015-09-03 17:47:14 -0700184 await RunOAuth2AuthTokenAsync(client, options.DefaultServiceAccount, options.OAuthScope);
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700185 break;
186 case "per_rpc_creds":
Jan Tattermuschbea7cbd2015-09-04 14:08:19 -0700187 await RunPerRpcCredsAsync(client, options.DefaultServiceAccount, options.OAuthScope);
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700188 break;
Jan Tattermusche5c44602015-05-01 11:12:34 -0700189 case "cancel_after_begin":
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700190 await RunCancelAfterBeginAsync(client);
Jan Tattermusche5c44602015-05-01 11:12:34 -0700191 break;
192 case "cancel_after_first_response":
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700193 await RunCancelAfterFirstResponseAsync(client);
Jan Tattermusche5c44602015-05-01 11:12:34 -0700194 break;
Jan Tattermusche4134dd2015-08-12 14:54:40 -0700195 case "timeout_on_sleeping_server":
196 await RunTimeoutOnSleepingServerAsync(client);
197 break;
Jan Tattermusch50faa8f2015-02-21 17:51:52 -0800198 case "benchmark_empty_unary":
199 RunBenchmarkEmptyUnary(client);
200 break;
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800201 default:
Jan Tattermuschb26972f2015-09-03 17:47:14 -0700202 throw new ArgumentException("Unknown test case " + options.TestCase);
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800203 }
204 }
205
Jan Tattermusch7eb3a762015-05-07 14:26:13 -0700206 public static void RunEmptyUnary(TestService.ITestServiceClient client)
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800207 {
208 Console.WriteLine("running empty_unary");
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700209 var response = client.EmptyCall(new Empty());
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800210 Assert.IsNotNull(response);
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800211 Console.WriteLine("Passed!");
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800212 }
213
Jan Tattermusch7eb3a762015-05-07 14:26:13 -0700214 public static void RunLargeUnary(TestService.ITestServiceClient client)
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800215 {
216 Console.WriteLine("running large_unary");
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700217 var request = new SimpleRequest
218 {
219 ResponseType = PayloadType.COMPRESSABLE,
220 ResponseSize = 314159,
221 Payload = CreateZerosPayload(271828)
222 };
Craig Tiller190d3602015-02-18 09:23:38 -0800223
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800224 var response = client.UnaryCall(request);
225
226 Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type);
227 Assert.AreEqual(314159, response.Payload.Body.Length);
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800228 Console.WriteLine("Passed!");
229 }
230
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700231 public static async Task RunClientStreamingAsync(TestService.ITestServiceClient client)
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800232 {
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700233 Console.WriteLine("running client_streaming");
234
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700235 var bodySizes = new List<int> { 27182, 8, 1828, 45904 }.ConvertAll((size) => new StreamingInputCallRequest { Payload = CreateZerosPayload(size) });
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700236
237 using (var call = client.StreamingInputCall())
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800238 {
Jan Tattermuschf22abfb2015-08-09 16:15:34 -0700239 await call.RequestStream.WriteAllAsync(bodySizes);
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800240
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700241 var response = await call.ResponseAsync;
242 Assert.AreEqual(74922, response.AggregatedPayloadSize);
243 }
244 Console.WriteLine("Passed!");
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800245 }
246
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700247 public static async Task RunServerStreamingAsync(TestService.ITestServiceClient client)
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800248 {
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700249 Console.WriteLine("running server_streaming");
250
251 var bodySizes = new List<int> { 31415, 9, 2653, 58979 };
252
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700253 var request = new StreamingOutputCallRequest
254 {
255 ResponseType = PayloadType.COMPRESSABLE,
256 ResponseParameters = { bodySizes.ConvertAll((size) => new ResponseParameters { Size = size }) }
257 };
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700258
259 using (var call = client.StreamingOutputCall(request))
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700260 {
Jan Tattermuschf22abfb2015-08-09 16:15:34 -0700261 var responseList = await call.ResponseStream.ToListAsync();
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700262 foreach (var res in responseList)
263 {
264 Assert.AreEqual(PayloadType.COMPRESSABLE, res.Payload.Type);
265 }
266 CollectionAssert.AreEqual(bodySizes, responseList.ConvertAll((item) => item.Payload.Body.Length));
267 }
268 Console.WriteLine("Passed!");
269 }
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800270
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700271 public static async Task RunPingPongAsync(TestService.ITestServiceClient client)
272 {
273 Console.WriteLine("running ping_pong");
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800274
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700275 using (var call = client.FullDuplexCall())
276 {
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700277 await call.RequestStream.WriteAsync(new StreamingOutputCallRequest
278 {
279 ResponseType = PayloadType.COMPRESSABLE,
280 ResponseParameters = { new ResponseParameters { Size = 31415 } },
281 Payload = CreateZerosPayload(27182)
282 });
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800283
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700284 Assert.IsTrue(await call.ResponseStream.MoveNext());
285 Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type);
286 Assert.AreEqual(31415, call.ResponseStream.Current.Payload.Body.Length);
287
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700288 await call.RequestStream.WriteAsync(new StreamingOutputCallRequest
289 {
290 ResponseType = PayloadType.COMPRESSABLE,
291 ResponseParameters = { new ResponseParameters { Size = 9 } },
292 Payload = CreateZerosPayload(8)
293 });
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700294
295 Assert.IsTrue(await call.ResponseStream.MoveNext());
296 Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type);
297 Assert.AreEqual(9, call.ResponseStream.Current.Payload.Body.Length);
298
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700299 await call.RequestStream.WriteAsync(new StreamingOutputCallRequest
300 {
301 ResponseType = PayloadType.COMPRESSABLE,
302 ResponseParameters = { new ResponseParameters { Size = 2653 } },
303 Payload = CreateZerosPayload(1828)
304 });
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700305
306 Assert.IsTrue(await call.ResponseStream.MoveNext());
307 Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type);
308 Assert.AreEqual(2653, call.ResponseStream.Current.Payload.Body.Length);
309
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700310 await call.RequestStream.WriteAsync(new StreamingOutputCallRequest
311 {
312 ResponseType = PayloadType.COMPRESSABLE,
313 ResponseParameters = { new ResponseParameters { Size = 58979 } },
314 Payload = CreateZerosPayload(45904)
315 });
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700316
317 Assert.IsTrue(await call.ResponseStream.MoveNext());
318 Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type);
319 Assert.AreEqual(58979, call.ResponseStream.Current.Payload.Body.Length);
320
321 await call.RequestStream.CompleteAsync();
322
323 Assert.IsFalse(await call.ResponseStream.MoveNext());
324 }
325 Console.WriteLine("Passed!");
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800326 }
327
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700328 public static async Task RunEmptyStreamAsync(TestService.ITestServiceClient client)
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800329 {
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700330 Console.WriteLine("running empty_stream");
331 using (var call = client.FullDuplexCall())
Jan Tattermuscha5272b62015-04-30 11:56:46 -0700332 {
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700333 await call.RequestStream.CompleteAsync();
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800334
Jan Tattermuschf22abfb2015-08-09 16:15:34 -0700335 var responseList = await call.ResponseStream.ToListAsync();
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700336 Assert.AreEqual(0, responseList.Count);
337 }
338 Console.WriteLine("Passed!");
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800339 }
340
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700341 public static void RunComputeEngineCreds(TestService.TestServiceClient client, string defaultServiceAccount, string oauthScope)
Jan Tattermusch0bbfa382015-04-27 16:11:59 -0700342 {
343 Console.WriteLine("running compute_engine_creds");
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700344
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700345 var request = new SimpleRequest
346 {
347 ResponseType = PayloadType.COMPRESSABLE,
348 ResponseSize = 314159,
349 Payload = CreateZerosPayload(271828),
350 FillUsername = true,
351 FillOauthScope = true
352 };
Jan Tattermusch0bbfa382015-04-27 16:11:59 -0700353
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700354 // not setting credentials here because they were set on channel already
Jan Tattermusch0bbfa382015-04-27 16:11:59 -0700355 var response = client.UnaryCall(request);
356
357 Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type);
358 Assert.AreEqual(314159, response.Payload.Body.Length);
Jan Tattermuschb26972f2015-09-03 17:47:14 -0700359 Assert.False(string.IsNullOrEmpty(response.OauthScope));
360 Assert.True(oauthScope.Contains(response.OauthScope));
361 Assert.AreEqual(defaultServiceAccount, response.Username);
Jan Tattermusch0bbfa382015-04-27 16:11:59 -0700362 Console.WriteLine("Passed!");
363 }
364
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700365 public static void RunJwtTokenCreds(TestService.TestServiceClient client, string defaultServiceAccount)
Jan Tattermusch0c140a82015-08-02 00:54:02 -0700366 {
367 Console.WriteLine("running jwt_token_creds");
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700368
Jan Tattermusch46e85b02015-08-13 10:31:05 -0700369 var request = new SimpleRequest
370 {
371 ResponseType = PayloadType.COMPRESSABLE,
372 ResponseSize = 314159,
373 Payload = CreateZerosPayload(271828),
374 FillUsername = true,
Jan Tattermusch46e85b02015-08-13 10:31:05 -0700375 };
Jan Tattermusch0c140a82015-08-02 00:54:02 -0700376
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700377 // not setting credentials here because they were set on channel already
Jan Tattermusch0c140a82015-08-02 00:54:02 -0700378 var response = client.UnaryCall(request);
379
380 Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type);
381 Assert.AreEqual(314159, response.Payload.Body.Length);
Jan Tattermuschb26972f2015-09-03 17:47:14 -0700382 Assert.AreEqual(defaultServiceAccount, response.Username);
Jan Tattermusch0c140a82015-08-02 00:54:02 -0700383 Console.WriteLine("Passed!");
384 }
385
Jan Tattermuschb26972f2015-09-03 17:47:14 -0700386 public static async Task RunOAuth2AuthTokenAsync(TestService.TestServiceClient client, string defaultServiceAccount, string oauthScope)
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700387 {
388 Console.WriteLine("running oauth2_auth_token");
Jan Tattermuschb26972f2015-09-03 17:47:14 -0700389 ITokenAccess credential = (await GoogleCredential.GetApplicationDefaultAsync()).CreateScoped(new[] { oauthScope });
Jan Tattermusch0c140a82015-08-02 00:54:02 -0700390 string oauth2Token = await credential.GetAccessTokenForRequestAsync();
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700391
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700392 var credentials = GrpcCredentials.FromAccessToken(oauth2Token);
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700393 var request = new SimpleRequest
394 {
395 FillUsername = true,
396 FillOauthScope = true
397 };
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700398
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700399 var response = client.UnaryCall(request, new CallOptions(credentials: credentials));
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700400
Jan Tattermuschb26972f2015-09-03 17:47:14 -0700401 Assert.False(string.IsNullOrEmpty(response.OauthScope));
402 Assert.True(oauthScope.Contains(response.OauthScope));
403 Assert.AreEqual(defaultServiceAccount, response.Username);
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700404 Console.WriteLine("Passed!");
405 }
406
Jan Tattermuschbea7cbd2015-09-04 14:08:19 -0700407 public static async Task RunPerRpcCredsAsync(TestService.TestServiceClient client, string defaultServiceAccount, string oauthScope)
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700408 {
409 Console.WriteLine("running per_rpc_creds");
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700410 ITokenAccess googleCredential = (await GoogleCredential.GetApplicationDefaultAsync()).CreateScoped(new[] { oauthScope });
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700411
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700412 var credentials = GrpcCredentials.Create(googleCredential);
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700413 var request = new SimpleRequest
414 {
415 FillUsername = true,
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700416 };
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700417
Jan Tattermusch74f39e12015-09-23 20:14:56 -0700418 var response = client.UnaryCall(request, new CallOptions(credentials: credentials));
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700419
Jan Tattermuschb26972f2015-09-03 17:47:14 -0700420 Assert.AreEqual(defaultServiceAccount, response.Username);
Jan Tattermusch7b4a31f2015-07-20 17:08:13 -0700421 Console.WriteLine("Passed!");
422 }
423
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700424 public static async Task RunCancelAfterBeginAsync(TestService.ITestServiceClient client)
Jan Tattermusche5c44602015-05-01 11:12:34 -0700425 {
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700426 Console.WriteLine("running cancel_after_begin");
427
428 var cts = new CancellationTokenSource();
429 using (var call = client.StreamingInputCall(cancellationToken: cts.Token))
Jan Tattermusche5c44602015-05-01 11:12:34 -0700430 {
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700431 // TODO(jtattermusch): we need this to ensure call has been initiated once we cancel it.
432 await Task.Delay(1000);
433 cts.Cancel();
Jan Tattermusche5c44602015-05-01 11:12:34 -0700434
Jan Tattermuschc8d7b842015-08-07 20:52:21 -0700435 var ex = Assert.Throws<RpcException>(async () => await call.ResponseAsync);
436 Assert.AreEqual(StatusCode.Cancelled, ex.Status.StatusCode);
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700437 }
438 Console.WriteLine("Passed!");
Jan Tattermusche5c44602015-05-01 11:12:34 -0700439 }
440
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700441 public static async Task RunCancelAfterFirstResponseAsync(TestService.ITestServiceClient client)
Jan Tattermusche5c44602015-05-01 11:12:34 -0700442 {
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700443 Console.WriteLine("running cancel_after_first_response");
444
445 var cts = new CancellationTokenSource();
446 using (var call = client.FullDuplexCall(cancellationToken: cts.Token))
Jan Tattermusche5c44602015-05-01 11:12:34 -0700447 {
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700448 await call.RequestStream.WriteAsync(new StreamingOutputCallRequest
449 {
450 ResponseType = PayloadType.COMPRESSABLE,
451 ResponseParameters = { new ResponseParameters { Size = 31415 } },
452 Payload = CreateZerosPayload(27182)
453 });
Jan Tattermusche5c44602015-05-01 11:12:34 -0700454
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700455 Assert.IsTrue(await call.ResponseStream.MoveNext());
456 Assert.AreEqual(PayloadType.COMPRESSABLE, call.ResponseStream.Current.Payload.Type);
457 Assert.AreEqual(31415, call.ResponseStream.Current.Payload.Body.Length);
458
459 cts.Cancel();
460
Jan Tattermuschc8d7b842015-08-07 20:52:21 -0700461 var ex = Assert.Throws<RpcException>(async () => await call.ResponseStream.MoveNext());
462 Assert.AreEqual(StatusCode.Cancelled, ex.Status.StatusCode);
Jan Tattermuschb98e1dd2015-07-24 21:30:14 -0700463 }
464 Console.WriteLine("Passed!");
Jan Tattermusche5c44602015-05-01 11:12:34 -0700465 }
466
Jan Tattermusche4134dd2015-08-12 14:54:40 -0700467 public static async Task RunTimeoutOnSleepingServerAsync(TestService.ITestServiceClient client)
468 {
469 Console.WriteLine("running timeout_on_sleeping_server");
470
471 var deadline = DateTime.UtcNow.AddMilliseconds(1);
472 using (var call = client.FullDuplexCall(deadline: deadline))
473 {
474 try
475 {
Jan Tattermusch0608a002015-08-26 08:50:19 -0700476 await call.RequestStream.WriteAsync(new StreamingOutputCallRequest { Payload = CreateZerosPayload(27182) });
Jan Tattermusche4134dd2015-08-12 14:54:40 -0700477 }
478 catch (InvalidOperationException)
479 {
480 // Deadline was reached before write has started. Eat the exception and continue.
481 }
482
483 var ex = Assert.Throws<RpcException>(async () => await call.ResponseStream.MoveNext());
484 Assert.AreEqual(StatusCode.DeadlineExceeded, ex.Status.StatusCode);
485 }
486 Console.WriteLine("Passed!");
487 }
488
Jan Tattermusch50faa8f2015-02-21 17:51:52 -0800489 // This is not an official interop test, but it's useful.
Jan Tattermusch7eb3a762015-05-07 14:26:13 -0700490 public static void RunBenchmarkEmptyUnary(TestService.ITestServiceClient client)
Jan Tattermusch50faa8f2015-02-21 17:51:52 -0800491 {
492 BenchmarkUtil.RunBenchmark(10000, 10000,
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700493 () => { client.EmptyCall(new Empty()); });
Jan Tattermusch50faa8f2015-02-21 17:51:52 -0800494 }
Jan Tattermuschd233d3a2015-02-06 14:15:00 -0800495
Jan Tattermusch075dde42015-03-11 18:21:00 -0700496 private static Payload CreateZerosPayload(int size)
497 {
Jan Tattermusch8644aea2015-08-03 10:21:18 -0700498 return new Payload { Body = ByteString.CopyFrom(new byte[size]) };
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800499 }
Jan Tattermuscheb3e76e2015-02-06 11:43:13 -0800500 }
501}