From 4b474564748823d3ec75e7e551ef9765e1109d95 Mon Sep 17 00:00:00 2001 From: Ivy Gooch Date: Tue, 9 Jan 2024 20:58:20 +0000 Subject: [PATCH] Adds Counter to CSharp SDK --- build/includes/sdk.mk | 4 ++- sdks/csharp/sdk/Alpha.cs | 29 ++++++++++++++++--- sdks/csharp/sdk/IAgonesAlphaSDK.cs | 1 + sdks/csharp/test/AgonesAlphaSDKClientTests.cs | 14 +++++++++ test/sdk/csharp/Program.cs | 20 ++++++++++++- 5 files changed, 62 insertions(+), 6 deletions(-) diff --git a/build/includes/sdk.mk b/build/includes/sdk.mk index 50e3a831ba..98d2e5541b 100644 --- a/build/includes/sdk.mk +++ b/build/includes/sdk.mk @@ -38,6 +38,8 @@ DEFAULT_CONFORMANCE_TESTS = ready,allocate,setlabel,setannotation,gameserver,hea ALPHA_CONFORMANCE_TESTS = getplayercapacity,setplayercapacity,playerconnect,playerdisconnect,getplayercount,isplayerconnected,getconnectedplayers # TODO: Move Counter and List tests into ALPHA_CONFORMANCE_TESTS once the they are written for all SDKs COUNTS_AND_LISTS_TESTS = getcounter,updatecounter,setcountcounter,setcapacitycounter,getlist,updatelist,addlistvalue,removelistvalue +# TODO: Remove +COUNTERS_TESTS = getcounter .PHONY: test-sdks test-sdk build-sdks build-sdk gen-all-sdk-grpc gen-sdk-grpc run-all-sdk-command run-sdk-command build-example @@ -187,7 +189,7 @@ run-sdk-conformance-test-csharp: # run without feature flags $(MAKE) run-sdk-conformance-test SDK_FOLDER=csharp GRPC_PORT=9005 HTTP_PORT=9105 # run with feature flags enabled - $(MAKE) run-sdk-conformance-test SDK_FOLDER=csharp GRPC_PORT=9005 HTTP_PORT=9105 FEATURE_GATES=PlayerTracking=true TESTS=$(DEFAULT_CONFORMANCE_TESTS),$(ALPHA_CONFORMANCE_TESTS) + $(MAKE) run-sdk-conformance-test SDK_FOLDER=csharp GRPC_PORT=9005 HTTP_PORT=9105 FEATURE_GATES=PlayerTracking=true TESTS=$(DEFAULT_CONFORMANCE_TESTS),$(ALPHA_CONFORMANCE_TESTS),$(COUNTERS_TESTS) run-sdk-conformance-test-rest: # (note: the restapi folder doesn't use GRPC_PORT but run-sdk-conformance-no-build defaults it, so we supply a unique value here) diff --git a/sdks/csharp/sdk/Alpha.cs b/sdks/csharp/sdk/Alpha.cs index 29b0fa0f6d..cda1766652 100644 --- a/sdks/csharp/sdk/Alpha.cs +++ b/sdks/csharp/sdk/Alpha.cs @@ -49,7 +49,7 @@ public Alpha( { _logger = logger; RequestTimeoutSec = requestTimeoutSec; - + if (cancellationTokenSource == null) { cts = new CancellationTokenSource(); @@ -60,7 +60,7 @@ public Alpha( cts = cancellationTokenSource; ownsCts = false; } - + ctoken = cts.Token; client = new SDK.SDKClient(channel); } @@ -210,6 +210,27 @@ public async Task> GetConnectedPlayersAsync() } } + /// + /// GetCounterCountAsync returns the Count for a Counter, given the Counter's key (name). + /// Will error if the key was not predefined in the GameServer resource on creation. + /// + /// The Counter's Count + public async Task GetCounterCountAsync(string key) + { + try + { + var count = await client.GetCounterAsync(new GetCounterRequest() { + name_ = key + }, deadline: DateTime.UtcNow.AddSeconds(RequestTimeoutSec), cancellationToken: ctoken); + return Counter.count_; + } + catch (RpcException ex) + { + LogError(ex, "Unable to invoke GetCounterCount."); + throw; + } + } + public void Dispose() { if (_disposed) @@ -218,12 +239,12 @@ public void Dispose() } cts.Cancel(); - + if (ownsCts) { cts.Dispose(); } - + _disposed = true; GC.SuppressFinalize(this); } diff --git a/sdks/csharp/sdk/IAgonesAlphaSDK.cs b/sdks/csharp/sdk/IAgonesAlphaSDK.cs index 0117920b52..0b16a6263d 100644 --- a/sdks/csharp/sdk/IAgonesAlphaSDK.cs +++ b/sdks/csharp/sdk/IAgonesAlphaSDK.cs @@ -28,5 +28,6 @@ public interface IAgonesAlphaSDK : IDisposable Task GetPlayerCountAsync(); Task IsPlayerConnectedAsync(string id); Task> GetConnectedPlayersAsync(); + Task GetCounterCountAsync(string key); } } diff --git a/sdks/csharp/test/AgonesAlphaSDKClientTests.cs b/sdks/csharp/test/AgonesAlphaSDKClientTests.cs index 141696143c..0be53e9833 100644 --- a/sdks/csharp/test/AgonesAlphaSDKClientTests.cs +++ b/sdks/csharp/test/AgonesAlphaSDKClientTests.cs @@ -135,6 +135,20 @@ public async Task GetConnectedPlayers_Sends_OK() CollectionAssert.AreEquivalent(expected, result); } + [TestMethod] + public async Task GetCounterCount_Sends_OK() + { + var mockClient = new Mock(); + var mockSdk = new AgonesSDK(); + var expected = new Count() { Count_ = 1 }; + mockClient.Setup(m => m.GetCounterCountAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns( + (Empty _, Metadata _, DateTime? _, CancellationToken _) => new AsyncUnaryCall(Task.FromResult(expected), Task.FromResult(new Metadata()), () => Status.DefaultSuccess, () => new Metadata(), () => { })); + mockSdk.alpha.client = mockClient.Object; + + var result = await mockSdk.Alpha().GetCounterCountAsync(); + Assert.AreEqual(expected.Count_, result); + } + [TestMethod] public void InstantiateWithParameters_OK() { diff --git a/test/sdk/csharp/Program.cs b/test/sdk/csharp/Program.cs index 33ab6e0c18..a3d3cc6ff9 100644 --- a/test/sdk/csharp/Program.cs +++ b/test/sdk/csharp/Program.cs @@ -166,6 +166,24 @@ } } +if (featureGates.Contains("CountsAndLists")) +{ + var alpha = sdk.Alpha(); + var key = "conformanceTestCounter"; + var count = 1; + { + var counter = await alpha.GetCounterAsync(new GetCounterRequest() { + name_ = key + }); + if (counter.Count_ != count) + { + Console.Error.WriteLine( + $"Counter count should be {count}, but is {counter.count_}"); + Environment.Exit(1); + } + } +} + var shutDownStatus = await sdk.ShutDownAsync(); if (shutDownStatus.StatusCode != StatusCode.OK) { @@ -174,4 +192,4 @@ Environment.Exit(1); } -Console.WriteLine("Finish all tests"); \ No newline at end of file +Console.WriteLine("Finish all tests");