Jan Tattermusch | a7fff86 | 2015-02-13 11:08:08 -0800 | [diff] [blame] | 1 | #region Copyright notice and license |
| 2 | |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 3 | // Copyright 2015 gRPC authors. |
Craig Tiller | 190d360 | 2015-02-18 09:23:38 -0800 | [diff] [blame] | 4 | // |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 5 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | // you may not use this file except in compliance with the License. |
| 7 | // You may obtain a copy of the License at |
Craig Tiller | 190d360 | 2015-02-18 09:23:38 -0800 | [diff] [blame] | 8 | // |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 9 | // http://www.apache.org/licenses/LICENSE-2.0 |
Craig Tiller | 190d360 | 2015-02-18 09:23:38 -0800 | [diff] [blame] | 10 | // |
Jan Tattermusch | 7897ae9 | 2017-06-07 22:57:36 +0200 | [diff] [blame] | 11 | // Unless required by applicable law or agreed to in writing, software |
| 12 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | // See the License for the specific language governing permissions and |
| 15 | // limitations under the License. |
Jan Tattermusch | a7fff86 | 2015-02-13 11:08:08 -0800 | [diff] [blame] | 16 | |
| 17 | #endregion |
| 18 | |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 19 | using System; |
Jan Tattermusch | 3086862 | 2015-02-19 09:22:33 -0800 | [diff] [blame] | 20 | using System.Collections.Generic; |
Jan Tattermusch | 31ba063 | 2015-08-04 22:02:55 -0700 | [diff] [blame] | 21 | using System.Linq; |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 22 | using System.Threading; |
| 23 | using System.Threading.Tasks; |
Jan Tattermusch | 3086862 | 2015-02-19 09:22:33 -0800 | [diff] [blame] | 24 | using Grpc.Core; |
| 25 | using Grpc.Core.Utils; |
| 26 | using NUnit.Framework; |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 27 | |
Jan Tattermusch | 2852631 | 2015-08-03 09:21:38 -0700 | [diff] [blame] | 28 | namespace Math.Tests |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 29 | { |
| 30 | /// <summary> |
| 31 | /// Math client talks to local math server. |
| 32 | /// </summary> |
| 33 | public class MathClientServerTest |
| 34 | { |
Jan Tattermusch | 31ba063 | 2015-08-04 22:02:55 -0700 | [diff] [blame] | 35 | const string Host = "localhost"; |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 36 | Server server; |
| 37 | Channel channel; |
Jan Tattermusch | b533281 | 2015-07-14 19:29:35 -0700 | [diff] [blame] | 38 | Math.MathClient client; |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 39 | |
Jan Tattermusch | b8c77c5 | 2017-08-09 09:05:54 +0200 | [diff] [blame] | 40 | [OneTimeSetUp] |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 41 | public void Init() |
| 42 | { |
Jan Tattermusch | 09d2f55 | 2017-04-20 11:39:37 +0200 | [diff] [blame] | 43 | // Disable SO_REUSEPORT to prevent https://github.com/grpc/grpc/issues/10755 |
| 44 | server = new Server(new[] { new ChannelOption(ChannelOptions.SoReuseport, 0) }) |
Jan Tattermusch | 021df8a | 2015-08-04 20:31:11 -0700 | [diff] [blame] | 45 | { |
Jan Tattermusch | 31ba063 | 2015-08-04 22:02:55 -0700 | [diff] [blame] | 46 | Services = { Math.BindService(new MathServiceImpl()) }, |
| 47 | Ports = { { Host, ServerPort.PickUnused, ServerCredentials.Insecure } } |
Jan Tattermusch | 021df8a | 2015-08-04 20:31:11 -0700 | [diff] [blame] | 48 | }; |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 49 | server.Start(); |
Jan Tattermusch | 5bd7005 | 2015-10-06 16:47:49 -0700 | [diff] [blame] | 50 | channel = new Channel(Host, server.Ports.Single().BoundPort, ChannelCredentials.Insecure); |
Jan Tattermusch | f41ebc3 | 2016-06-22 12:47:14 -0700 | [diff] [blame] | 51 | client = new Math.MathClient(channel); |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 52 | } |
| 53 | |
Jan Tattermusch | b8c77c5 | 2017-08-09 09:05:54 +0200 | [diff] [blame] | 54 | [OneTimeTearDown] |
Jan Tattermusch | 607307d | 2015-02-18 11:05:45 -0800 | [diff] [blame] | 55 | public void Cleanup() |
| 56 | { |
Jan Tattermusch | 2b35795 | 2015-08-20 14:54:33 -0700 | [diff] [blame] | 57 | channel.ShutdownAsync().Wait(); |
Jan Tattermusch | 607307d | 2015-02-18 11:05:45 -0800 | [diff] [blame] | 58 | server.ShutdownAsync().Wait(); |
Jan Tattermusch | 607307d | 2015-02-18 11:05:45 -0800 | [diff] [blame] | 59 | } |
| 60 | |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 61 | [Test] |
| 62 | public void Div1() |
| 63 | { |
Jan Tattermusch | 8644aea | 2015-08-03 10:21:18 -0700 | [diff] [blame] | 64 | DivReply response = client.Div(new DivArgs { Dividend = 10, Divisor = 3 }); |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 65 | Assert.AreEqual(3, response.Quotient); |
| 66 | Assert.AreEqual(1, response.Remainder); |
| 67 | } |
| 68 | |
| 69 | [Test] |
| 70 | public void Div2() |
| 71 | { |
Jan Tattermusch | 8644aea | 2015-08-03 10:21:18 -0700 | [diff] [blame] | 72 | DivReply response = client.Div(new DivArgs { Dividend = 0, Divisor = 1 }); |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 73 | Assert.AreEqual(0, response.Quotient); |
| 74 | Assert.AreEqual(0, response.Remainder); |
| 75 | } |
| 76 | |
Jan Tattermusch | 2d2652d | 2015-05-18 16:23:04 -0700 | [diff] [blame] | 77 | [Test] |
| 78 | public void DivByZero() |
| 79 | { |
Jan Tattermusch | 46e85b0 | 2015-08-13 10:31:05 -0700 | [diff] [blame] | 80 | var ex = Assert.Throws<RpcException>(() => client.Div(new DivArgs { Dividend = 0, Divisor = 0 })); |
Jan Tattermusch | d6a8397 | 2016-05-10 16:38:23 -0700 | [diff] [blame] | 81 | Assert.AreEqual(StatusCode.InvalidArgument, ex.Status.StatusCode); |
Jan Tattermusch | 2d2652d | 2015-05-18 16:23:04 -0700 | [diff] [blame] | 82 | } |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 83 | |
| 84 | [Test] |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 85 | public async Task DivAsync() |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 86 | { |
Jan Tattermusch | 8644aea | 2015-08-03 10:21:18 -0700 | [diff] [blame] | 87 | DivReply response = await client.DivAsync(new DivArgs { Dividend = 10, Divisor = 3 }); |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 88 | Assert.AreEqual(3, response.Quotient); |
| 89 | Assert.AreEqual(1, response.Remainder); |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 90 | } |
| 91 | |
| 92 | [Test] |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 93 | public async Task Fib() |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 94 | { |
Jan Tattermusch | 8644aea | 2015-08-03 10:21:18 -0700 | [diff] [blame] | 95 | using (var call = client.Fib(new FibArgs { Limit = 6 })) |
Jan Tattermusch | a5272b6 | 2015-04-30 11:56:46 -0700 | [diff] [blame] | 96 | { |
Jan Tattermusch | f22abfb | 2015-08-09 16:15:34 -0700 | [diff] [blame] | 97 | var responses = await call.ResponseStream.ToListAsync(); |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 98 | CollectionAssert.AreEqual(new List<long> { 1, 1, 2, 3, 5, 8 }, |
Jan Tattermusch | ec4359d | 2016-04-11 20:55:44 -0700 | [diff] [blame] | 99 | responses.Select((n) => n.Num_)); |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 100 | } |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 101 | } |
| 102 | |
Jan Tattermusch | f7cfc8a | 2015-07-23 17:26:35 -0700 | [diff] [blame] | 103 | [Test] |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 104 | public async Task FibWithCancel() |
Jan Tattermusch | f7cfc8a | 2015-07-23 17:26:35 -0700 | [diff] [blame] | 105 | { |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 106 | var cts = new CancellationTokenSource(); |
| 107 | |
Jan Tattermusch | 8644aea | 2015-08-03 10:21:18 -0700 | [diff] [blame] | 108 | using (var call = client.Fib(new FibArgs { Limit = 0 }, cancellationToken: cts.Token)) |
Jan Tattermusch | f7cfc8a | 2015-07-23 17:26:35 -0700 | [diff] [blame] | 109 | { |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 110 | List<long> responses = new List<long>(); |
Jan Tattermusch | f7cfc8a | 2015-07-23 17:26:35 -0700 | [diff] [blame] | 111 | |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 112 | try |
Jan Tattermusch | f7cfc8a | 2015-07-23 17:26:35 -0700 | [diff] [blame] | 113 | { |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 114 | while (await call.ResponseStream.MoveNext()) |
Jan Tattermusch | f7cfc8a | 2015-07-23 17:26:35 -0700 | [diff] [blame] | 115 | { |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 116 | if (responses.Count == 0) |
Jan Tattermusch | f7cfc8a | 2015-07-23 17:26:35 -0700 | [diff] [blame] | 117 | { |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 118 | cts.CancelAfter(500); // make sure we cancel soon |
Jan Tattermusch | f7cfc8a | 2015-07-23 17:26:35 -0700 | [diff] [blame] | 119 | } |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 120 | responses.Add(call.ResponseStream.Current.Num_); |
Jan Tattermusch | f7cfc8a | 2015-07-23 17:26:35 -0700 | [diff] [blame] | 121 | } |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 122 | Assert.Fail(); |
Jan Tattermusch | f7cfc8a | 2015-07-23 17:26:35 -0700 | [diff] [blame] | 123 | } |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 124 | catch (RpcException e) |
| 125 | { |
| 126 | Assert.IsTrue(responses.Count > 0); |
| 127 | Assert.AreEqual(StatusCode.Cancelled, e.Status.StatusCode); |
| 128 | } |
| 129 | } |
Jan Tattermusch | f7cfc8a | 2015-07-23 17:26:35 -0700 | [diff] [blame] | 130 | } |
| 131 | |
Jan Tattermusch | 4106259 | 2015-07-23 17:30:24 -0700 | [diff] [blame] | 132 | [Test] |
Jan Tattermusch | b8c77c5 | 2017-08-09 09:05:54 +0200 | [diff] [blame] | 133 | public void FibWithDeadline() |
Jan Tattermusch | 4106259 | 2015-07-23 17:30:24 -0700 | [diff] [blame] | 134 | { |
Jan Tattermusch | 8644aea | 2015-08-03 10:21:18 -0700 | [diff] [blame] | 135 | using (var call = client.Fib(new FibArgs { Limit = 0 }, |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 136 | deadline: DateTime.UtcNow.AddMilliseconds(500))) |
Jan Tattermusch | 4106259 | 2015-07-23 17:30:24 -0700 | [diff] [blame] | 137 | { |
Jan Tattermusch | 6c0dee8 | 2016-04-08 12:14:09 -0700 | [diff] [blame] | 138 | var ex = Assert.ThrowsAsync<RpcException>(async () => await call.ResponseStream.ToListAsync()); |
Jan Tattermusch | c8d7b84 | 2015-08-07 20:52:21 -0700 | [diff] [blame] | 139 | |
| 140 | // We can't guarantee the status code always DeadlineExceeded. See issue #2685. |
| 141 | Assert.Contains(ex.Status.StatusCode, new[] { StatusCode.DeadlineExceeded, StatusCode.Internal }); |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 142 | } |
Jan Tattermusch | 4106259 | 2015-07-23 17:30:24 -0700 | [diff] [blame] | 143 | } |
| 144 | |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 145 | // TODO: test Fib with limit=0 and cancellation |
| 146 | [Test] |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 147 | public async Task Sum() |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 148 | { |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 149 | using (var call = client.Sum()) |
Jan Tattermusch | a5272b6 | 2015-04-30 11:56:46 -0700 | [diff] [blame] | 150 | { |
Jan Tattermusch | ec4359d | 2016-04-11 20:55:44 -0700 | [diff] [blame] | 151 | var numbers = new List<long> { 10, 20, 30 }.Select(n => new Num { Num_ = n }); |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 152 | |
Jan Tattermusch | f22abfb | 2015-08-09 16:15:34 -0700 | [diff] [blame] | 153 | await call.RequestStream.WriteAllAsync(numbers); |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 154 | var result = await call.ResponseAsync; |
| 155 | Assert.AreEqual(60, result.Num_); |
| 156 | } |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 157 | } |
| 158 | |
| 159 | [Test] |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 160 | public async Task DivMany() |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 161 | { |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 162 | var divArgsList = new List<DivArgs> |
Jan Tattermusch | 075dde4 | 2015-03-11 18:21:00 -0700 | [diff] [blame] | 163 | { |
Jan Tattermusch | 8644aea | 2015-08-03 10:21:18 -0700 | [diff] [blame] | 164 | new DivArgs { Dividend = 10, Divisor = 3 }, |
| 165 | new DivArgs { Dividend = 100, Divisor = 21 }, |
| 166 | new DivArgs { Dividend = 7, Divisor = 2 } |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 167 | }; |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 168 | |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 169 | using (var call = client.DivMany()) |
| 170 | { |
Jan Tattermusch | f22abfb | 2015-08-09 16:15:34 -0700 | [diff] [blame] | 171 | await call.RequestStream.WriteAllAsync(divArgsList); |
| 172 | var result = await call.ResponseStream.ToListAsync(); |
Jan Tattermusch | 9f550a3 | 2015-05-18 16:00:36 -0700 | [diff] [blame] | 173 | |
Jan Tattermusch | ec4359d | 2016-04-11 20:55:44 -0700 | [diff] [blame] | 174 | CollectionAssert.AreEqual(new long[] { 3, 4, 3 }, result.Select((divReply) => divReply.Quotient)); |
| 175 | CollectionAssert.AreEqual(new long[] { 1, 16, 1 }, result.Select((divReply) => divReply.Remainder)); |
Jan Tattermusch | 9b048e5 | 2015-07-24 21:20:24 -0700 | [diff] [blame] | 176 | } |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 177 | } |
Jan Tattermusch | 15111f5 | 2015-02-05 18:15:14 -0800 | [diff] [blame] | 178 | } |
| 179 | } |