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  }