agones.dev/agones@v1.54.0/sdks/csharp/test/AgonesBetaSDKClientTests.cs (about) 1 // Copyright 2020 Google LLC All Rights Reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 using Agones.Dev.Sdk.Beta; 16 using Grpc.Core; 17 using System.Collections.Generic; 18 using System.Linq; 19 using System.Threading; 20 using System.Threading.Tasks; 21 using Microsoft.VisualStudio.TestTools.UnitTesting; 22 using Moq; 23 using System; 24 using Grpc.Net.Client; 25 using Microsoft.Extensions.Logging; 26 using gProto = Google.Protobuf.WellKnownTypes; 27 28 namespace Agones.Tests 29 { 30 [TestClass] 31 public class AgonesBetaSDKClientTests 32 { 33 [TestMethod] 34 public async Task GetCounterCountAsync_Sends_OK() 35 { 36 var mockClient = new Mock<SDK.SDKClient>(); 37 var mockSdk = new AgonesSDK(); 38 var key = "counterKey"; 39 long wantCount = 1; 40 var counter = new Counter() 41 { 42 Name = key, 43 Count = wantCount, 44 }; 45 var expected = new GetCounterRequest() 46 { 47 Name = key, 48 }; 49 // TODO: Remove comments 50 // https://github.com/devlooped/moq/wiki/Quickstart#async-methods 51 // Task<bool> DoSomethingAsync(); 52 // mock.Setup(foo => foo.DoSomethingAsync().Result).Returns(true); 53 // https://grpc.github.io/grpc/csharp/api/Grpc.Core.AsyncUnaryCall-1.html 54 // public AsyncUnaryCall(Task<TResponse> responseAsync, Task<Metadata> responseHeadersAsync, Func<Status> getStatusFunc, Func<Metadata> getTrailersFunc, Action disposeAction) 55 mockClient.Setup(m => m.GetCounterAsync(expected, It.IsAny<Metadata>(), 56 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 57 (GetCounterRequest _, Metadata _, DateTime? _, CancellationToken _) => 58 new AsyncUnaryCall<Counter>(Task.FromResult(counter), Task.FromResult(new Metadata()), 59 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 60 mockSdk.beta.client = mockClient.Object; 61 62 var response = await mockSdk.Beta().GetCounterCountAsync(key); 63 Assert.AreEqual(wantCount, response); 64 } 65 66 [TestMethod] 67 public async Task IncrementCounterAsync_Sends_OK() 68 { 69 var mockClient = new Mock<SDK.SDKClient>(); 70 var mockSdk = new AgonesSDK(); 71 var key = "counterKey"; 72 var amount = 9; 73 var counter = new Counter(); 74 var updateReq = new CounterUpdateRequest() 75 { 76 Name = key, 77 CountDiff = amount, 78 }; 79 var expected = new UpdateCounterRequest() 80 { 81 CounterUpdateRequest = updateReq, 82 }; 83 84 mockClient.Setup(m => m.UpdateCounterAsync(expected, It.IsAny<Metadata>(), 85 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 86 (UpdateCounterRequest _, Metadata _, DateTime? _, CancellationToken _) => 87 new AsyncUnaryCall<Counter>(Task.FromResult(counter), Task.FromResult(new Metadata()), 88 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 89 mockSdk.beta.client = mockClient.Object; 90 91 await mockSdk.Beta().IncrementCounterAsync(key, amount); 92 } 93 94 [TestMethod] 95 public async Task DecrementCounterAsync_Sends_OK() 96 { 97 var mockClient = new Mock<SDK.SDKClient>(); 98 var mockSdk = new AgonesSDK(); 99 var key = "counterKey"; 100 var counter = new Counter(); 101 var updateReq = new CounterUpdateRequest() 102 { 103 Name = key, 104 CountDiff = -9, 105 }; 106 var expected = new UpdateCounterRequest() 107 { 108 CounterUpdateRequest = updateReq, 109 }; 110 111 mockClient.Setup(m => m.UpdateCounterAsync(expected, It.IsAny<Metadata>(), 112 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 113 (UpdateCounterRequest _, Metadata _, DateTime? _, CancellationToken _) => 114 new AsyncUnaryCall<Counter>(Task.FromResult(counter), Task.FromResult(new Metadata()), 115 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 116 mockSdk.beta.client = mockClient.Object; 117 118 await mockSdk.Beta().DecrementCounterAsync(key, 9); 119 } 120 121 [TestMethod] 122 public async Task SetCounterCountAsync_Sends_OK() 123 { 124 var mockClient = new Mock<SDK.SDKClient>(); 125 var mockSdk = new AgonesSDK(); 126 var key = "counterKey"; 127 var amount = 99; 128 var counter = new Counter(); 129 var updateReq = new CounterUpdateRequest() 130 { 131 Name = key, 132 Count = amount, 133 }; 134 var expected = new UpdateCounterRequest() 135 { 136 CounterUpdateRequest = updateReq, 137 }; 138 139 mockClient.Setup(m => m.UpdateCounterAsync(expected, It.IsAny<Metadata>(), 140 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 141 (UpdateCounterRequest _, Metadata _, DateTime? _, CancellationToken _) => 142 new AsyncUnaryCall<Counter>(Task.FromResult(counter), Task.FromResult(new Metadata()), 143 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 144 mockSdk.beta.client = mockClient.Object; 145 146 await mockSdk.Beta().SetCounterCountAsync(key, amount); 147 } 148 149 [TestMethod] 150 public async Task GetCounterCapacityAsync_Sends_OK() 151 { 152 var mockClient = new Mock<SDK.SDKClient>(); 153 var mockSdk = new AgonesSDK(); 154 var key = "counterKey"; 155 long wantCapacity = 11; 156 var counter = new Counter() 157 { 158 Name = key, 159 Capacity = wantCapacity, 160 }; 161 var expected = new GetCounterRequest() 162 { 163 Name = key, 164 }; 165 166 mockClient.Setup(m => m.GetCounterAsync(expected, It.IsAny<Metadata>(), 167 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 168 (GetCounterRequest _, Metadata _, DateTime? _, CancellationToken _) => 169 new AsyncUnaryCall<Counter>(Task.FromResult(counter), Task.FromResult(new Metadata()), 170 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 171 mockSdk.beta.client = mockClient.Object; 172 173 var response = await mockSdk.Beta().GetCounterCapacityAsync(key); 174 Assert.AreEqual(wantCapacity, response); 175 } 176 177 [TestMethod] 178 public async Task SetCounterCapacityAsync_Sends_OK() 179 { 180 var mockClient = new Mock<SDK.SDKClient>(); 181 var mockSdk = new AgonesSDK(); 182 var key = "counterKey"; 183 var amount = 99; 184 var counter = new Counter(); 185 var updateReq = new CounterUpdateRequest() 186 { 187 Name = key, 188 Capacity = amount, 189 }; 190 var expected = new UpdateCounterRequest() 191 { 192 CounterUpdateRequest = updateReq, 193 }; 194 195 mockClient.Setup(m => m.UpdateCounterAsync(expected, It.IsAny<Metadata>(), 196 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 197 (UpdateCounterRequest _, Metadata _, DateTime? _, CancellationToken _) => 198 new AsyncUnaryCall<Counter>(Task.FromResult(counter), Task.FromResult(new Metadata()), 199 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 200 mockSdk.beta.client = mockClient.Object; 201 202 await mockSdk.Beta().SetCounterCapacityAsync(key, amount); 203 } 204 205 [TestMethod] 206 public async Task GetListCapacityAsync_Sends_OK() 207 { 208 var mockClient = new Mock<SDK.SDKClient>(); 209 var mockSdk = new AgonesSDK(); 210 var key = "listKey"; 211 long wantCapacity = 999; 212 var list = new List() 213 { 214 Name = key, 215 Capacity = wantCapacity, 216 }; 217 var expected = new GetListRequest() 218 { 219 Name = key, 220 }; 221 222 mockClient.Setup(m => m.GetListAsync(expected, It.IsAny<Metadata>(), 223 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 224 (GetListRequest _, Metadata _, DateTime? _, CancellationToken _) => 225 new AsyncUnaryCall<List>(Task.FromResult(list), Task.FromResult(new Metadata()), 226 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 227 mockSdk.beta.client = mockClient.Object; 228 229 var response = await mockSdk.Beta().GetListCapacityAsync(key); 230 Assert.AreEqual(wantCapacity, response); 231 } 232 233 [TestMethod] 234 public async Task SetListCapacityAsync_Sends_OK() 235 { 236 var mockClient = new Mock<SDK.SDKClient>(); 237 var mockSdk = new AgonesSDK(); 238 var key = "listKey"; 239 var amount = 99; 240 var list = new List() 241 { 242 Name = key, 243 Capacity = amount, 244 }; 245 var updateMask = new gProto.FieldMask() 246 { 247 Paths = { "capacity" }, 248 }; 249 var expected = new UpdateListRequest() 250 { 251 List = list, 252 UpdateMask = updateMask, 253 }; 254 255 mockClient.Setup(m => m.UpdateListAsync(expected, It.IsAny<Metadata>(), 256 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 257 (UpdateListRequest _, Metadata _, DateTime? _, CancellationToken _) => 258 new AsyncUnaryCall<List>(Task.FromResult(list), Task.FromResult(new Metadata()), 259 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 260 mockSdk.beta.client = mockClient.Object; 261 262 await mockSdk.Beta().SetListCapacityAsync(key, amount); 263 } 264 265 [TestMethod] 266 public async Task ListContainsAsync_Sends_OK() 267 { 268 var mockClient = new Mock<SDK.SDKClient>(); 269 var mockSdk = new AgonesSDK(); 270 var key = "listKey"; 271 var value = "foo"; 272 var list = new List() 273 { 274 Name = key, 275 }; 276 list.Values.Add(value); 277 var expected = new GetListRequest() 278 { 279 Name = key, 280 }; 281 282 mockClient.Setup(m => m.GetListAsync(expected, It.IsAny<Metadata>(), 283 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 284 (GetListRequest _, Metadata _, DateTime? _, CancellationToken _) => 285 new AsyncUnaryCall<List>(Task.FromResult(list), Task.FromResult(new Metadata()), 286 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 287 mockSdk.beta.client = mockClient.Object; 288 289 var response = await mockSdk.Beta().ListContainsAsync(key, value); 290 Assert.AreEqual(true, response); 291 } 292 293 [TestMethod] 294 public async Task AppendListValueAsync_Sends_OK() 295 { 296 var mockClient = new Mock<SDK.SDKClient>(); 297 var mockSdk = new AgonesSDK(); 298 var key = "listKey"; 299 var value = "foo"; 300 var list = new List() 301 { 302 Name = key, 303 }; 304 var expected = new AddListValueRequest() 305 { 306 Name = key, 307 Value = value, 308 }; 309 310 mockClient.Setup(m => m.AddListValueAsync(expected, It.IsAny<Metadata>(), 311 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 312 (AddListValueRequest _, Metadata _, DateTime? _, CancellationToken _) => 313 new AsyncUnaryCall<List>(Task.FromResult(list), Task.FromResult(new Metadata()), 314 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 315 mockSdk.beta.client = mockClient.Object; 316 317 await mockSdk.Beta().AppendListValueAsync(key, value); 318 } 319 320 [TestMethod] 321 public async Task DeleteListValueAsync_Sends_OK() 322 { 323 var mockClient = new Mock<SDK.SDKClient>(); 324 var mockSdk = new AgonesSDK(); 325 var key = "listKey"; 326 var value = "foo"; 327 var list = new List() 328 { 329 Name = key, 330 }; 331 var expected = new RemoveListValueRequest() 332 { 333 Name = key, 334 Value = value, 335 }; 336 337 mockClient.Setup(m => m.RemoveListValueAsync(expected, It.IsAny<Metadata>(), 338 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 339 (RemoveListValueRequest _, Metadata _, DateTime? _, CancellationToken _) => 340 new AsyncUnaryCall<List>(Task.FromResult(list), Task.FromResult(new Metadata()), 341 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 342 mockSdk.beta.client = mockClient.Object; 343 344 await mockSdk.Beta().DeleteListValueAsync(key, value); 345 } 346 347 [TestMethod] 348 public async Task GetListLengthAsync_Sends_OK() 349 { 350 var mockClient = new Mock<SDK.SDKClient>(); 351 var mockSdk = new AgonesSDK(); 352 var key = "listKey"; 353 long wantLength = 3; 354 var values = new string[] { "foo", "bar", "baz" }; 355 var list = new List() 356 { 357 Name = key, 358 }; 359 list.Values.Add(values); 360 var expected = new GetListRequest() 361 { 362 Name = key, 363 }; 364 365 mockClient.Setup(m => m.GetListAsync(expected, It.IsAny<Metadata>(), 366 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 367 (GetListRequest _, Metadata _, DateTime? _, CancellationToken _) => 368 new AsyncUnaryCall<List>(Task.FromResult(list), Task.FromResult(new Metadata()), 369 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 370 mockSdk.beta.client = mockClient.Object; 371 372 var response = await mockSdk.Beta().GetListLengthAsync(key); 373 Assert.AreEqual(wantLength, response); 374 } 375 376 [TestMethod] 377 public async Task GetListValuesAsync_Sends_OK() 378 { 379 var mockClient = new Mock<SDK.SDKClient>(); 380 var mockSdk = new AgonesSDK(); 381 var key = "listKey"; 382 IList<string> wantValues = new List<string> { "foo", "bar", "baz" }; 383 var list = new List() 384 { 385 Name = key, 386 }; 387 list.Values.Add(wantValues); 388 var expected = new GetListRequest() 389 { 390 Name = key, 391 }; 392 393 mockClient.Setup(m => m.GetListAsync(expected, It.IsAny<Metadata>(), 394 It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 395 (GetListRequest _, Metadata _, DateTime? _, CancellationToken _) => 396 new AsyncUnaryCall<List>(Task.FromResult(list), Task.FromResult(new Metadata()), 397 () => Status.DefaultSuccess, () => new Metadata(), () => { })); 398 mockSdk.beta.client = mockClient.Object; 399 400 401 var response = await mockSdk.Beta().GetListValuesAsync(key); 402 Assert.IsTrue(Enumerable.SequenceEqual(wantValues, response)); 403 } 404 405 [TestMethod] 406 public void InstantiateWithParameters_OK() 407 { 408 var mockSdk = new AgonesSDK(); 409 //var mockChannel = new Channel(mockSdk.Host, mockSdk.Port, ChannelCredentials.Insecure); 410 var mockChannel = GrpcChannel.ForAddress($"http://{mockSdk.Host}:{mockSdk.Port}"); 411 ILogger mockLogger = new Mock<ILogger>().Object; 412 CancellationTokenSource mockCancellationTokenSource = new Mock<CancellationTokenSource>().Object; 413 bool exceptionOccured = false; 414 try 415 { 416 new Beta( 417 channel: mockChannel, 418 requestTimeoutSec: 15, 419 cancellationTokenSource: mockCancellationTokenSource, 420 logger: mockLogger 421 ); 422 } 423 catch 424 { 425 exceptionOccured = true; 426 } 427 428 Assert.IsFalse(exceptionOccured); 429 } 430 } 431 }