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  }