Successful unit test setup and tear down

This commit is contained in:
watsonb8 2020-01-20 22:53:33 -05:00
parent 28afcf12e4
commit df2a6b4bfc
8 changed files with 159 additions and 41 deletions

View File

@ -0,0 +1,60 @@
using NUnit.Framework;
using Aurora.Proto.PartyV2;
using Aurora.Services.Server;
using Grpc.Core;
using System.Threading.Tasks;
namespace Aurora.test.ControllerTests
{
public class MemberControllerTests
{
private RemotePartyService.RemotePartyServiceClient _remotePartyService;
private Channel _channel;
[SetUp]
public void Setup()
{
ServerService.Instance.Start("testParty", "asdf");
_channel = new Channel(string.Format("{0}:{1}", ServerService.GetLocalIPAddress(), 8080), ChannelCredentials.Insecure);
_remotePartyService = new RemotePartyService.RemotePartyServiceClient(_channel);
}
[TearDown]
public async Task TearDown()
{
await ServerService.Instance.Stop();
await _channel.ShutdownAsync();
}
[Test]
public void DefaultTest()
{
ListMembersResponse resp = _remotePartyService.ListMembers(new ListMembersRequest()
{
Parent = "party1",
PageSize = 10,
});
Assert.NotNull(resp);
Assert.GreaterOrEqual(resp.Members.Count, 1);
}
[Test]
[TestCase("Alex")]
[TestCase("Alex Goldberg")]
[TestCase("Alex/goldberg")]
[TestCase("alex@welcome.com")]
public void CreateMemberTest(string value)
{
Member member = _remotePartyService.CreateMember(new CreateMemberRequest()
{
Parent = "party1",
Member = new Member()
{
UserName = value,
IpAddress = ServerService.GetLocalIPAddress(),
}
});
Assert.NotNull(member);
}
}
}

View File

@ -1,11 +1,12 @@
using System.Threading.Tasks;
using NUnit.Framework; using NUnit.Framework;
using Aurora.Proto.PartyV2; using Aurora.Proto.PartyV2;
using Aurora.Services.Server; using Aurora.Services.Server;
using Grpc.Core; using Grpc.Core;
namespace Aurora.test namespace Aurora.test.ControllerTests
{ {
public class Tests public class PartyControllerTests
{ {
private RemotePartyService.RemotePartyServiceClient _remotePartyService; private RemotePartyService.RemotePartyServiceClient _remotePartyService;
private Channel _channel; private Channel _channel;
@ -17,15 +18,20 @@ namespace Aurora.test
_remotePartyService = new RemotePartyService.RemotePartyServiceClient(_channel); _remotePartyService = new RemotePartyService.RemotePartyServiceClient(_channel);
} }
[TearDown]
public async Task TearDown()
{
await ServerService.Instance.Stop();
await _channel.ShutdownAsync();
}
[Test] [Test]
public void Test2() public void DefaultTest()
{ {
ListMembersResponse resp = _remotePartyService.ListMembers(new ListMembersRequest() Party party = _remotePartyService.GetParty(new Proto.General.Empty());
{
Parent = "party1", Assert.NotNull(party);
PageSize = 10, Assert.AreEqual(party.Name, "party/party1");
});
Assert.NotNull(resp);
} }
} }
} }

View File

@ -0,0 +1,39 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Grpc.Core;
namespace Aurora.test.Models
{
public class CallContext : ServerCallContext
{
protected override string MethodCore => throw new NotImplementedException();
protected override string HostCore => throw new NotImplementedException();
protected override string PeerCore => throw new NotImplementedException();
protected override DateTime DeadlineCore => throw new NotImplementedException();
protected override Metadata RequestHeadersCore => throw new NotImplementedException();
protected override CancellationToken CancellationTokenCore => throw new NotImplementedException();
protected override Metadata ResponseTrailersCore => throw new NotImplementedException();
protected override Status StatusCore { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
protected override WriteOptions WriteOptionsCore { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
protected override AuthContext AuthContextCore => throw new NotImplementedException();
protected override ContextPropagationToken CreatePropagationTokenCore(ContextPropagationOptions options)
{
throw new NotImplementedException();
}
protected override Task WriteResponseHeadersAsyncCore(Metadata responseHeaders)
{
throw new NotImplementedException();
}
}
}

View File

@ -94,10 +94,11 @@ message LeavePartyResponse {
} }
message Member { message Member {
//Resource name of the party member to be returned //Resource name of the party member to be returned (Added by server)
string name = 1; string name = 1;
string userName = 2; string userName = 2;
string ipAddress = 3; string ipAddress = 3;
//Added by server
google.protobuf.Timestamp addedOn = 4; google.protobuf.Timestamp addedOn = 4;
} }
@ -112,7 +113,6 @@ message ListMembersResponse {
repeated Member members = 1; repeated Member members = 1;
string nextPageToken = 2; string nextPageToken = 2;
} }
message GetMemberRequest { message GetMemberRequest {
//Resource name of the member to be returned //Resource name of the member to be returned
string name = 1; string name = 1;

View File

@ -1,11 +1,11 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections;
using Aurora.Proto.PartyV2; using Aurora.Proto.PartyV2;
using Aurora.Proto.General; using Aurora.Proto.General;
using Aurora.Utils; using Aurora.Utils;
using Grpc.Core; using Grpc.Core;
using Google.Protobuf.WellKnownTypes;
namespace Aurora.Services.Server.Controllers namespace Aurora.Services.Server.Controllers
{ {
@ -62,8 +62,8 @@ namespace Aurora.Services.Server.Controllers
public override Task<Member> CreateMember(CreateMemberRequest request, Grpc.Core.ServerCallContext context) public override Task<Member> CreateMember(CreateMemberRequest request, Grpc.Core.ServerCallContext context)
{ {
//Generate Guid //Generate Guid
string memberNameGuid = HashUtil.GetHashGuid(new string[] { context.Peer, request.Member.UserName }).ToString(); string resourceName = GetNewMemberResourceName(request.Parent, context.Peer, request.Member.UserName);
string resourceName = string.Format("{0}/members/{1}", request.Parent, memberNameGuid);
//Check if already added //Check if already added
if (_memberList.ContainsKey(resourceName)) if (_memberList.ContainsKey(resourceName))
{ {
@ -71,6 +71,8 @@ namespace Aurora.Services.Server.Controllers
} }
request.Member.Name = resourceName; request.Member.Name = resourceName;
request.Member.AddedOn = Timestamp.FromDateTime(DateTime.UtcNow);
request.Member.IpAddress = context.Host;
_memberList.Add(resourceName, request.Member); _memberList.Add(resourceName, request.Member);
@ -89,7 +91,7 @@ namespace Aurora.Services.Server.Controllers
return Task.FromResult(request.Member); return Task.FromResult(request.Member);
} }
public override Task<Empty> DeleteMember(DeleteMemberRequest request, Grpc.Core.ServerCallContext context) public override Task<Aurora.Proto.General.Empty> DeleteMember(DeleteMemberRequest request, Grpc.Core.ServerCallContext context)
{ {
string memberResourceName = request.Name; string memberResourceName = request.Name;
//Check if member exists //Check if member exists
@ -113,7 +115,13 @@ namespace Aurora.Services.Server.Controllers
_eventManager.RemoveAllSubscriptions(memberResourceName); _eventManager.RemoveAllSubscriptions(memberResourceName);
_eventManager.CancelEventStream(memberResourceName); _eventManager.CancelEventStream(memberResourceName);
return Task.FromResult(new Empty()); return Task.FromResult(new Aurora.Proto.General.Empty());
}
private string GetNewMemberResourceName(string parent, string contextPeer, string userName)
{
string memberNameGuid = HashUtil.GetHash(new string[] { contextPeer, userName }).ToString();
return string.Format("{0}/members/{1}", parent, memberNameGuid);
} }
} }
} }

View File

@ -9,6 +9,7 @@ namespace Aurora.Services.Server.Controllers
{ {
public partial class RemotePartyController : RemotePartyService.RemotePartyServiceBase public partial class RemotePartyController : RemotePartyService.RemotePartyServiceBase
{ {
private string _partyResourceName = "party/party1";
private string _displayName; private string _displayName;
private string _description; private string _description;
private Member _hostMember; private Member _hostMember;
@ -21,7 +22,7 @@ namespace Aurora.Services.Server.Controllers
/// </summary> /// </summary>
public RemotePartyController(string partyName, string description) public RemotePartyController(string partyName, string description)
{ {
this._startDateTime = DateTime.Now; this._startDateTime = DateTime.UtcNow;
this._displayName = partyName; this._displayName = partyName;
this._description = description; this._description = description;
this._memberList = new SortedList<string, Member>(); this._memberList = new SortedList<string, Member>();
@ -32,7 +33,7 @@ namespace Aurora.Services.Server.Controllers
this._hostMember = new Member() this._hostMember = new Member()
{ {
Name = userName, Name = GetNewMemberResourceName(_partyResourceName, ServerService.GetLocalIPAddress(), userName),
UserName = userName, UserName = userName,
IpAddress = ServerService.GetLocalIPAddress(), IpAddress = ServerService.GetLocalIPAddress(),
}; };
@ -44,7 +45,7 @@ namespace Aurora.Services.Server.Controllers
{ {
Party party = new Party() Party party = new Party()
{ {
Name = "party/party1", Name = _partyResourceName,
DisplayName = this._displayName, DisplayName = this._displayName,
Description = this._description, Description = this._description,
HostIp = ServerService.GetLocalIPAddress(), HostIp = ServerService.GetLocalIPAddress(),

View File

@ -31,11 +31,6 @@ namespace Aurora.Services.Server
} }
_hostname = host; _hostname = host;
_server = new Grpc.Core.Server
{
Ports = { new ServerPort(_hostname, _port, ServerCredentials.Insecure) }
};
} }
public int Port public int Port
@ -68,15 +63,18 @@ namespace Aurora.Services.Server
Console.WriteLine(string.Format("Starting gRPC server at hostname: {0}, port: {1}", _hostname, _port)); Console.WriteLine(string.Format("Starting gRPC server at hostname: {0}, port: {1}", _hostname, _port));
if (!Initialized) _server = new Grpc.Core.Server
{ {
Ports = { new ServerPort(_hostname, _port, ServerCredentials.Insecure) }
};
//Construct implementations //Construct implementations
_remotePartyController = new RemotePartyController(partyName, description); _remotePartyController = new RemotePartyController(partyName, description);
// Register grpc RemoteService with singleton server service // Register grpc RemoteService with singleton server service
RegisterService(RemotePartyService.BindService(_remotePartyController)); RegisterService(RemotePartyService.BindService(_remotePartyController));
}
_server.Start(); _server.Start();
} }
catch (Exception ex) catch (Exception ex)
@ -90,8 +88,16 @@ namespace Aurora.Services.Server
/// </summary> /// </summary>
/// <returns>Task</returns> /// <returns>Task</returns>
public async Task Stop() public async Task Stop()
{
try
{ {
await _server.ShutdownAsync(); await _server.ShutdownAsync();
await _server.ShutdownTask;
}
catch (Exception ex)
{
Console.WriteLine(string.Format("Error stopping gRPC server: {0}", ex.Message));
}
} }
public async Task Reset() public async Task Reset()

View File

@ -6,7 +6,7 @@ namespace Aurora.Utils
{ {
public class HashUtil public class HashUtil
{ {
public static Guid GetHashGuid(string[] inputs) public static Guid GetHash(string[] inputs)
{ {
string input = ""; string input = "";
foreach (string str in inputs) foreach (string str in inputs)
@ -14,14 +14,12 @@ namespace Aurora.Utils
input += str; input += str;
} }
Guid result; byte[] stringbytes = Encoding.UTF8.GetBytes(input);
using (SHA256 sha = SHA256.Create()) byte[] hashedBytes = new System.Security.Cryptography
{ .SHA1CryptoServiceProvider()
byte[] hash = sha.ComputeHash(Encoding.Default.GetBytes(input)); .ComputeHash(stringbytes);
result = new Guid(hash); Array.Resize(ref hashedBytes, 16);
} return new Guid(hashedBytes);
return result;
} }
} }
} }