agones.dev/agones@v1.53.0/test/sdk/csharp/Program.cs (about) 1 // Copyright 2023 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 using Agones; 15 using Grpc.Core; 16 17 using var sdk = new AgonesSDK(); 18 { 19 sdk.WatchGameServer((gameServer) => 20 { 21 Console.WriteLine("Received GameServer update"); 22 Console.WriteLine(gameServer); 23 }); 24 } 25 26 { 27 var status = await sdk.ReadyAsync(); 28 if (status.StatusCode != StatusCode.OK) 29 { 30 Console.Error.WriteLine( 31 $"Could not send ready message. StatusCode={status.StatusCode}, Detail={status.Detail}"); 32 Environment.Exit(1); 33 } 34 } 35 36 { 37 var status = await sdk.ReserveAsync(5); 38 if (status.StatusCode != StatusCode.OK) 39 { 40 Console.Error.WriteLine( 41 $"Could not send reserve command. StatusCode={status.StatusCode}, Detail={status.Detail}"); 42 Environment.Exit(1); 43 } 44 } 45 46 { 47 var status = await sdk.AllocateAsync(); 48 if (status.StatusCode != StatusCode.OK) 49 { 50 Console.Error.WriteLine( 51 $"Err sending allocate request. StatusCode={status.StatusCode}, Detail={status.Detail}"); 52 Environment.Exit(1); 53 } 54 } 55 56 { 57 var status = await sdk.HealthAsync(); 58 if (status.StatusCode != StatusCode.OK) 59 { 60 Console.Error.WriteLine( 61 $"Could not send health check. StatusCode={status.StatusCode}, Detail={status.Detail}"); 62 Environment.Exit(1); 63 } 64 } 65 66 { 67 var gameServer = await sdk.GetGameServerAsync(); 68 Console.WriteLine("Successfully GameServer"); 69 Console.WriteLine(gameServer); 70 { 71 var status = await sdk.SetLabelAsync("creationTimestamp", 72 gameServer.ObjectMeta.CreationTimestamp.ToString()); 73 if (status.StatusCode != StatusCode.OK) 74 { 75 Console.Error.WriteLine( 76 $"Could not set label. StatusCode={status.StatusCode}, Detail={status.Detail}"); 77 Environment.Exit(1); 78 } 79 } 80 { 81 var status = await sdk.SetAnnotationAsync("UID", gameServer.ObjectMeta.Uid); 82 if (status.StatusCode != StatusCode.OK) 83 { 84 Console.Error.WriteLine( 85 $"Could not set annotation. StatusCode={status.StatusCode}, Detail={status.Detail}"); 86 Environment.Exit(1); 87 } 88 } 89 } 90 91 var featureGates = Environment.GetEnvironmentVariable("FEATURE_GATES") ?? ""; 92 if (featureGates.Contains("PlayerTracking")) 93 { 94 var alpha = sdk.Alpha(); 95 var capacity = 10; 96 var playerId = "1234"; 97 98 { 99 var status = await alpha.SetPlayerCapacityAsync(capacity); 100 if (status.StatusCode != StatusCode.OK) 101 { 102 Console.Error.WriteLine( 103 $"Error setting player capacity. StatusCode={status.StatusCode}, Detail={status.Detail}"); 104 Environment.Exit(1); 105 } 106 } 107 108 { 109 var c = await alpha.GetPlayerCapacityAsync(); 110 if (c != capacity) 111 { 112 Console.Error.WriteLine( 113 $"Player Capacity should be {capacity}, but is {c}"); 114 Environment.Exit(1); 115 } 116 } 117 118 { 119 var ok = await alpha.PlayerConnectAsync(playerId); 120 if (!ok) 121 { 122 Console.Error.WriteLine( 123 $"PlayerConnect returned false"); 124 Environment.Exit(1); 125 } 126 } 127 128 { 129 var ok = await alpha.IsPlayerConnectedAsync(playerId); 130 if (!ok) 131 { 132 Console.Error.WriteLine( 133 $"IsPlayerConnected returned false"); 134 Environment.Exit(1); 135 } 136 } 137 138 { 139 var players = await alpha.GetConnectedPlayersAsync(); 140 if (players.Count == 0) 141 { 142 Console.Error.WriteLine( 143 $"No connected players returned"); 144 Environment.Exit(1); 145 } 146 } 147 148 { 149 var ok = await alpha.PlayerDisconnectAsync(playerId); 150 if (!ok) 151 { 152 Console.Error.WriteLine( 153 $"PlayerDisconnect returned false"); 154 Environment.Exit(1); 155 } 156 } 157 158 { 159 var c = await alpha.GetPlayerCountAsync(); 160 if (c != 0) 161 { 162 Console.Error.WriteLine( 163 $"Player Count should be 0, but is {c}"); 164 Environment.Exit(1); 165 } 166 } 167 } 168 169 if (featureGates.Contains("CountsAndLists")) 170 // Tests are expected to run sequentially on the same pre-defined Counter in the localsdk server 171 { 172 var beta = sdk.Beta(); 173 var key = "rooms"; 174 175 { 176 var wantCount = 1; 177 var task = beta.GetCounterCountAsync(key); 178 task.Wait(); 179 var gotCount = task.Result; 180 if (wantCount != gotCount) 181 { 182 Console.Error.WriteLine($"Counter count should be {wantCount}, but is {gotCount}"); 183 Environment.Exit(1); 184 } 185 } 186 187 { 188 var wantCount = 10; 189 var increment = 9; 190 try 191 { 192 var task = beta.IncrementCounterAsync(key, increment); 193 task.Wait(); 194 } 195 catch (Exception e) 196 { 197 Console.Error.WriteLine($"IncrementCounterAsync for Counter {key} did not increment. Error: {e.ToString()}"); 198 Environment.Exit(1); 199 } 200 201 var getTask = beta.GetCounterCountAsync(key); 202 getTask.Wait(); 203 var gotCount = getTask.Result; 204 if (wantCount != gotCount) 205 { 206 Console.Error.WriteLine($"Counter count should be {wantCount}, but is {gotCount}"); 207 Environment.Exit(1); 208 } 209 } 210 211 { 212 var wantCount = 5; 213 var decrement = 5; 214 try 215 { 216 var task = beta.DecrementCounterAsync(key, decrement); 217 task.Wait(); 218 } 219 catch (Exception e) 220 { 221 Console.Error.WriteLine($"DecrementCounterAsync for Counter {key} did not decrement. Error: {e.ToString()}"); 222 Environment.Exit(1); 223 } 224 225 var getTask = beta.GetCounterCountAsync(key); 226 getTask.Wait(); 227 var gotCount = getTask.Result; 228 if (wantCount != gotCount) 229 { 230 Console.Error.WriteLine($"Counter count should be {wantCount}, but is {gotCount}"); 231 Environment.Exit(1); 232 } 233 } 234 235 { 236 var wantCount = 3; 237 try 238 { 239 var task = beta.SetCounterCountAsync(key, wantCount); 240 task.Wait(); 241 } 242 catch (Exception e) 243 { 244 Console.Error.WriteLine($"SetCounterCountAsync for Counter {key} did not set. Error: {e.ToString()}"); 245 Environment.Exit(1); 246 } 247 248 var getTask = beta.GetCounterCountAsync(key); 249 getTask.Wait(); 250 var gotCount = getTask.Result; 251 if (wantCount != gotCount) 252 { 253 Console.Error.WriteLine($"Counter count should be {wantCount}, but is {gotCount}"); 254 Environment.Exit(1); 255 } 256 } 257 258 { 259 var wantCapacity = 10; 260 var task = beta.GetCounterCapacityAsync(key); 261 task.Wait(); 262 var gotCapacity = task.Result; 263 if (wantCapacity != gotCapacity) 264 { 265 Console.Error.WriteLine($"Counter capacity should be {wantCapacity}, but is {gotCapacity}"); 266 Environment.Exit(1); 267 } 268 } 269 270 271 { 272 var wantCapacity = 0; 273 try 274 { 275 var task = beta.SetCounterCapacityAsync(key, wantCapacity); 276 task.Wait(); 277 } 278 catch (Exception e) 279 { 280 Console.Error.WriteLine($"SetCounterCapacityAsync for Counter {key} did not set. Error: {e.ToString()}"); 281 Environment.Exit(1); 282 } 283 284 var getTask = beta.GetCounterCapacityAsync(key); 285 getTask.Wait(); 286 var gotCapacity = getTask.Result; 287 if (wantCapacity != gotCapacity) 288 { 289 Console.Error.WriteLine($"Counter capacity should be {wantCapacity}, but is {gotCapacity}"); 290 Environment.Exit(1); 291 } 292 } 293 } 294 295 if (featureGates.Contains("CountsAndLists")) 296 // Tests are expected to run sequentially on the same pre-defined List in the localsdk server 297 { 298 var beta = sdk.Beta(); 299 var key = "players"; 300 301 { 302 var wantCapacity = 100; 303 var task = beta.GetListCapacityAsync(key); 304 task.Wait(); 305 var gotCapacity = task.Result; 306 if (wantCapacity != gotCapacity) 307 { 308 Console.Error.WriteLine($"List capacity should be {wantCapacity}, but is {gotCapacity}"); 309 Environment.Exit(1); 310 } 311 } 312 313 { 314 var wantCapacity = 10; 315 try 316 { 317 var task = beta.SetListCapacityAsync(key, wantCapacity); 318 task.Wait(); 319 } 320 catch (Exception e) 321 { 322 Console.Error.WriteLine($"SetListCapacityAsync for List {key} did not set. Error: {e.ToString()}"); 323 Environment.Exit(1); 324 } 325 326 var getTask = beta.GetListCapacityAsync(key); 327 getTask.Wait(); 328 var gotCapacity = getTask.Result; 329 if (wantCapacity != gotCapacity) 330 { 331 Console.Error.WriteLine($"List capacity should be {wantCapacity}, but is {gotCapacity}"); 332 Environment.Exit(1); 333 } 334 } 335 336 { 337 var value = "foo"; 338 var want = false; 339 var task = beta.ListContainsAsync(key, value); 340 task.Wait(); 341 var got = task.Result; 342 if (want != got) 343 { 344 Console.Error.WriteLine($"ListContains expected {want} for value {value}, but got {got}"); 345 Environment.Exit(1); 346 } 347 value = "test1"; 348 want = true; 349 task = beta.ListContainsAsync(key, value); 350 task.Wait(); 351 got = task.Result; 352 if (want != got) 353 { 354 Console.Error.WriteLine($"ListContains expected {want} for value {value}, but got {got}"); 355 Environment.Exit(1); 356 } 357 } 358 359 { 360 IList<string> wantValues = new List<string> { "test0", "test1", "test2" }; 361 var task = beta.GetListValuesAsync(key); 362 task.Wait(); 363 var gotValues = task.Result; 364 var equal = Enumerable.SequenceEqual(wantValues, gotValues); 365 if (!equal) 366 { 367 var wantStr = String.Join(" ", wantValues); 368 var gotStr = String.Join(" ", gotValues); 369 Console.Error.WriteLine($"List values should be {wantStr}, but is {gotStr}"); 370 Environment.Exit(1); 371 } 372 } 373 374 { 375 var addValue = "test3"; 376 IList<string> wantValues = new List<string> { "test0", "test1", "test2", "test3" }; 377 try 378 { 379 var task = beta.AppendListValueAsync(key, addValue); 380 task.Wait(); 381 } 382 catch (Exception e) 383 { 384 Console.Error.WriteLine($"AppendListValueAsync for List {key} did not append {addValue}. Error: {e.ToString()}"); 385 Environment.Exit(1); 386 } 387 388 var getTask = beta.GetListValuesAsync(key); 389 getTask.Wait(); 390 var gotValues = getTask.Result; 391 var equal = Enumerable.SequenceEqual(wantValues, gotValues); 392 if (!equal) 393 { 394 var wantStr = String.Join(" ", wantValues); 395 var gotStr = String.Join(" ", gotValues); 396 Console.Error.WriteLine($"List values should be {wantStr}, but is {gotStr}"); 397 Environment.Exit(1); 398 } 399 } 400 401 { 402 var removeValue = "test2"; 403 IList<string> wantValues = new List<string> { "test0", "test1", "test3" }; 404 try 405 { 406 var task = beta.DeleteListValueAsync(key, removeValue); 407 task.Wait(); 408 } 409 catch (Exception e) 410 { 411 Console.Error.WriteLine($"DeleteListValueAsync for List {key} did not delete {removeValue}. Error: {e.ToString()}"); 412 Environment.Exit(1); 413 } 414 415 var getTask = beta.GetListValuesAsync(key); 416 getTask.Wait(); 417 var gotValues = getTask.Result; 418 var equal = Enumerable.SequenceEqual(wantValues, gotValues); 419 if (!equal) 420 { 421 var wantStr = String.Join(" ", wantValues); 422 var gotStr = String.Join(" ", gotValues); 423 Console.Error.WriteLine($"List values should be {wantStr}, but is {gotStr}"); 424 Environment.Exit(1); 425 } 426 } 427 } 428 429 var shutDownStatus = await sdk.ShutDownAsync(); 430 if (shutDownStatus.StatusCode != StatusCode.OK) 431 { 432 Console.Error.WriteLine( 433 $"Could not shutdown GameServer. StatusCode={shutDownStatus.StatusCode}, Detail={shutDownStatus.Detail}"); 434 Environment.Exit(1); 435 } 436 437 Console.WriteLine("Finish all tests");