agones.dev/agones@v1.54.0/sdks/csharp/test/AgonesSDKClientTests.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; 16 using Grpc.Core; 17 using System.Threading; 18 using System.Threading.Tasks; 19 using Microsoft.VisualStudio.TestTools.UnitTesting; 20 using Moq; 21 using System; 22 using Microsoft.Extensions.Logging; 23 24 namespace Agones.Tests 25 { 26 [TestClass] 27 public class AgonesSDKClientTests 28 { 29 [TestMethod] 30 public async Task Ready_Mock_Returns_OK() 31 { 32 var mockClient = new Mock<SDK.SDKClient>(); 33 var mockSdk = new AgonesSDK(); 34 var expected = StatusCode.OK; 35 mockClient.Setup(m => m.ReadyAsync(It.IsAny<Empty>(), It.IsAny<Metadata>() , It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 36 (Empty _, Metadata _, DateTime? _, CancellationToken _) => new AsyncUnaryCall<Empty>(Task.FromResult(new Empty()), Task.FromResult(new Metadata()), () => new Status(expected, ""), () => new Metadata(), () => { })); 37 mockSdk.client = mockClient.Object; 38 39 var result = await mockSdk.ReadyAsync(); 40 Assert.AreEqual(expected, result.StatusCode); 41 } 42 43 [TestMethod] 44 public async Task Allocate_Mock_Returns_OK() 45 { 46 var mockClient = new Mock<SDK.SDKClient>(); 47 var mockSdk = new AgonesSDK(); 48 var expected = StatusCode.OK; 49 mockClient.Setup(m => m.AllocateAsync(It.IsAny<Empty>(), It.IsAny<Metadata>(), It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 50 (Empty _, Metadata _, DateTime? _, CancellationToken _) => new AsyncUnaryCall<Empty>(Task.FromResult(new Empty()), Task.FromResult(new Metadata()), () => new Status(expected, ""), () => new Metadata(), () => { })); 51 mockSdk.client = mockClient.Object; 52 53 var result = await mockSdk.AllocateAsync(); 54 Assert.AreEqual(expected, result.StatusCode); 55 } 56 57 [TestMethod] 58 public async Task Reserve_Returns_OK() 59 { 60 var mockClient = new Mock<SDK.SDKClient>(); 61 var mockSdk = new AgonesSDK(); 62 var expected = StatusCode.OK; 63 mockClient.Setup(m => m.ReserveAsync(It.IsAny<Duration>(), It.IsAny<Metadata>(), It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 64 (Duration _, Metadata _, DateTime? _, CancellationToken _) => new AsyncUnaryCall<Empty>(Task.FromResult(new Empty()), Task.FromResult(new Metadata()), () => new Status(expected, ""), () => new Metadata(), () => { })); 65 mockSdk.client = mockClient.Object; 66 67 var result = await mockSdk.ReserveAsync(30); 68 Assert.AreEqual(expected, result.StatusCode); 69 } 70 71 [TestMethod] 72 public async Task Reserve_Sends_OK() 73 { 74 var mockClient = new Mock<SDK.SDKClient>(); 75 var mockSdk = new AgonesSDK(); 76 var expectedDuration = new Duration(); 77 expectedDuration.Seconds = 30; 78 Duration actualDuration = null; 79 80 mockClient.Setup(m => m.ReserveAsync(It.IsAny<Duration>(), It.IsAny<Metadata>(), It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 81 (Duration _, Metadata _, DateTime? _, CancellationToken _) => new AsyncUnaryCall<Empty>(Task.FromResult(new Empty()), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })) 82 .Callback( 83 (Duration dur, Metadata md, DateTime? dt, CancellationToken ct) => { 84 actualDuration = dur; 85 }); 86 mockSdk.client = mockClient.Object; 87 88 var result = await mockSdk.ReserveAsync(30); 89 Assert.AreEqual(expectedDuration, actualDuration); 90 } 91 92 [TestMethod] 93 public async Task GetGameServer_Returns_OK() 94 { 95 var mockClient = new Mock<SDK.SDKClient>(); 96 var mockSdk = new AgonesSDK(); 97 var expected = new GameServer(); 98 99 mockClient.Setup(m => m.GetGameServerAsync(It.IsAny<Empty>(), It.IsAny<Metadata>(), It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 100 (Empty _, Metadata _, DateTime? _, CancellationToken _) => new AsyncUnaryCall<GameServer>(Task.FromResult(expected), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })); 101 mockSdk.client = mockClient.Object; 102 103 var result = await mockSdk.GetGameServerAsync(); 104 Assert.AreSame(expected, result); 105 } 106 107 [TestMethod] 108 public void WatchGameServer_Event_Subscribes() 109 { 110 var mockSdk = new AgonesSDK(); 111 Action<GameServer> expected = (gs) => { }; 112 113 mockSdk.isWatchingGameServer = true; 114 mockSdk.WatchGameServer(expected); 115 116 var result = mockSdk.GameServerUpdatedCallbacks[0]; 117 Assert.AreSame(expected, result); 118 } 119 120 [TestMethod] 121 public async Task WatchGameServer_Returns_OK() 122 { 123 var mockClient = new Mock<SDK.SDKClient>(); 124 var mockResponseStream = new Moq.Mock<IAsyncStreamReader<GameServer>>(); 125 var mockSdk = new AgonesSDK(); 126 var expectedWatchReturn = new GameServer(); 127 GameServer actualWatchReturn = null; 128 129 mockClient.Setup(m => m.WatchGameServer(It.IsAny<Empty>(), It.IsAny<Metadata>(), It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 130 (Empty _, Metadata _, DateTime? _, CancellationToken _) => new AsyncServerStreamingCall<GameServer>(mockResponseStream.Object, Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })); 131 mockResponseStream.Setup(m => m.Current).Returns( 132 () => expectedWatchReturn); 133 mockResponseStream.SetupSequence(m => m.MoveNext(It.IsAny<CancellationToken>())) 134 .Returns(Task.FromResult(true)) 135 .Returns(Task.FromResult(false)); 136 mockSdk.client = mockClient.Object; 137 138 mockSdk.WatchGameServer((gs) => { actualWatchReturn = gs; }); 139 140 // Asynchronously wait for our callback to be invoked and actualWatchReturn to be set. 141 // This is because the underlying watch is started through a task so we can't expect the callback to 142 // run synchronously. 143 using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(2))) 144 { 145 while (actualWatchReturn == null) 146 { 147 await Task.Delay(15, cts.Token); 148 } 149 } 150 151 Assert.AreSame(expectedWatchReturn, actualWatchReturn); 152 } 153 154 [TestMethod] 155 public async Task Shutdown_Returns_OK() 156 { 157 var mockClient = new Mock<SDK.SDKClient>(); 158 var mockSdk = new AgonesSDK(); 159 var expected = StatusCode.OK; 160 mockClient.Setup(m => m.ShutdownAsync(It.IsAny<Empty>(), It.IsAny<Metadata>(), It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 161 (Empty _, Metadata _, DateTime? _, CancellationToken _) => new AsyncUnaryCall<Empty>(Task.FromResult(new Empty()), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })); 162 mockSdk.client = mockClient.Object; 163 164 var result = await mockSdk.ShutDownAsync(); 165 Assert.AreEqual(expected, result.StatusCode); 166 } 167 168 [TestMethod] 169 public async Task SetLabel_Returns_OK() 170 { 171 var mockClient = new Mock<SDK.SDKClient>(); 172 var mockSdk = new AgonesSDK(); 173 var expected = StatusCode.OK; 174 mockClient.Setup(m => m.SetLabelAsync(It.IsAny<KeyValue>(), It.IsAny<Metadata>(), It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 175 (KeyValue _, Metadata _, DateTime? _, CancellationToken _) => new AsyncUnaryCall<Empty>(Task.FromResult(new Empty()), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })); 176 mockSdk.client = mockClient.Object; 177 178 var result = await mockSdk.SetLabelAsync("",""); 179 Assert.AreEqual(expected, result.StatusCode); 180 } 181 182 [TestMethod] 183 public async Task SetLabel_Sends_OK() 184 { 185 var mockClient = new Mock<SDK.SDKClient>(); 186 var mockSdk = new AgonesSDK(); 187 KeyValue expectedKeyValue = new KeyValue(); 188 expectedKeyValue.Key = "Test"; 189 expectedKeyValue.Value = "Test"; 190 KeyValue actualKeyValue = null; 191 mockClient.Setup(m => m.SetLabelAsync(It.IsAny<KeyValue>(), It.IsAny<Metadata>(), It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 192 (KeyValue _, Metadata _, DateTime? _, CancellationToken _) => new AsyncUnaryCall<Empty>(Task.FromResult(new Empty()), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })) 193 .Callback( 194 (KeyValue kv, Metadata md,DateTime? dt, CancellationToken ct) => { actualKeyValue = kv; 195 }); 196 mockSdk.client = mockClient.Object; 197 198 var result = await mockSdk.SetLabelAsync(expectedKeyValue.Key, expectedKeyValue.Value); 199 Assert.AreEqual(expectedKeyValue, actualKeyValue); 200 } 201 202 [TestMethod] 203 public async Task SetAnnotation_Returns_OK() 204 { 205 var mockClient = new Mock<SDK.SDKClient>(); 206 var mockSdk = new AgonesSDK(); 207 var expected = StatusCode.OK; 208 mockClient.Setup(m => m.SetAnnotationAsync(It.IsAny<KeyValue>(), It.IsAny<Metadata>(), It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 209 (KeyValue _, Metadata _, DateTime? _, CancellationToken _) => new AsyncUnaryCall<Empty>(Task.FromResult(new Empty()), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })); 210 mockSdk.client = mockClient.Object; 211 212 var result = await mockSdk.SetAnnotationAsync("", ""); 213 Assert.AreEqual(expected, result.StatusCode); 214 } 215 216 [TestMethod] 217 public async Task SetAnnotation_Sends_OK() 218 { 219 var mockClient = new Mock<SDK.SDKClient>(); 220 var mockSdk = new AgonesSDK(); 221 KeyValue expectedKeyValue = new KeyValue(); 222 expectedKeyValue.Key = "Test"; 223 expectedKeyValue.Value = "Test"; 224 KeyValue actualKeyValue = null; 225 226 mockClient.Setup(m => m.SetAnnotationAsync(It.IsAny<KeyValue>(), It.IsAny<Metadata>(), It.IsAny<DateTime?>(), It.IsAny<CancellationToken>())).Returns( 227 (KeyValue _, Metadata _, DateTime? _, CancellationToken _) => new AsyncUnaryCall<Empty>(Task.FromResult(new Empty()), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })) 228 .Callback( 229 (KeyValue kv, Metadata md, DateTime? dt, CancellationToken ct) => { 230 actualKeyValue = kv; 231 }); 232 mockSdk.client = mockClient.Object; 233 234 var result = await mockSdk.SetAnnotationAsync(expectedKeyValue.Key, expectedKeyValue.Value); 235 Assert.AreEqual(expectedKeyValue, actualKeyValue); 236 } 237 238 [TestMethod] 239 public void InstantiateWithParameters_OK() 240 { 241 var mockClient = new Mock<SDK.SDKClient>().Object; 242 ILogger mockLogger = new Mock<ILogger>().Object; 243 CancellationTokenSource mockCancellationTokenSource = new Mock<CancellationTokenSource>().Object; 244 bool exceptionOccured = false; 245 try 246 { 247 new AgonesSDK( 248 requestTimeoutSec: 15, 249 sdkClient: mockClient, 250 cancellationTokenSource: mockCancellationTokenSource, 251 logger: mockLogger 252 ); 253 } 254 catch 255 { 256 exceptionOccured = true; 257 } 258 259 Assert.IsFalse(exceptionOccured); 260 } 261 } 262 }