Basic service entity completed and tested.
added UML to guide actual implementation for Host. ModuleLoader, ServiceGateway, are written but untested.
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.5.0" />
|
||||
<PackageReference Include="xunit" Version="2.4.1" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.3" />
|
||||
<PackageReference Include="coverlet.collector" Version="1.2.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\src\GameServiceWarden.Host\GameServiceWarden.Host.csproj" />
|
||||
<ProjectReference Include="..\..\src\GameServiceWarden.ModuleAPI\GameServiceWarden.ModuleAPI.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
@@ -0,0 +1,21 @@
|
||||
using GameServiceWarden.ModuleAPI;
|
||||
|
||||
namespace GameServiceWarden.Host.Tests.Modules
|
||||
{
|
||||
public class FakeConfigurable : IConfigurable
|
||||
{
|
||||
private string value;
|
||||
public string OptionName => "FakeOption";
|
||||
|
||||
public string GetValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
public bool SetValue(string value)
|
||||
{
|
||||
this.value = value;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
32
tests/GameServiceWarden.Host.Tests/Modules/FakeService.cs
Normal file
32
tests/GameServiceWarden.Host.Tests/Modules/FakeService.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using GameServiceWarden.ModuleAPI;
|
||||
|
||||
namespace GameServiceWarden.Host.Tests.Modules
|
||||
{
|
||||
public class FakeService : IGameService
|
||||
{
|
||||
public IReadOnlyCollection<IConfigurable> Configurables { get; set; } = new HashSet<IConfigurable>();
|
||||
|
||||
public event EventHandler<ServiceState> StateChangeEvent;
|
||||
|
||||
public ServiceState CurrentState { get; private set; } = ServiceState.Stopped;
|
||||
|
||||
public void ElegantShutdown()
|
||||
{
|
||||
CurrentState = ServiceState.Stopped;
|
||||
StateChangeEvent?.Invoke(this, CurrentState);
|
||||
}
|
||||
|
||||
public void ExecuteCommand(string command)
|
||||
{
|
||||
}
|
||||
|
||||
public void InitializeService(TextWriter stream)
|
||||
{
|
||||
CurrentState = ServiceState.Running;
|
||||
StateChangeEvent?.Invoke(this, CurrentState);
|
||||
}
|
||||
}
|
||||
}
|
141
tests/GameServiceWarden.Host.Tests/Modules/ServiceInfoTest.cs
Normal file
141
tests/GameServiceWarden.Host.Tests/Modules/ServiceInfoTest.cs
Normal file
@@ -0,0 +1,141 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using GameServiceWarden.Host.Modules;
|
||||
using GameServiceWarden.ModuleAPI;
|
||||
using Xunit;
|
||||
|
||||
namespace GameServiceWarden.Host.Tests.Modules
|
||||
{
|
||||
// Testing convention from: https://docs.microsoft.com/en-us/dotnet/core/testing/unit-testing-best-practices
|
||||
// Fakes are generic test objects,
|
||||
// mocks are the objects being asserted upon,
|
||||
// stubs are objects used as part of the test.
|
||||
public class ServiceInfoTest
|
||||
{
|
||||
//MethodTested_ScenarioTested_ExpectedBehavior
|
||||
[Fact]
|
||||
public void Start_FromStopped_StateIsRunning()
|
||||
{
|
||||
//Arrange, Act, Assert
|
||||
IGameService stubGameService = new FakeService();
|
||||
ServiceInfo serviceInfo = new ServiceInfo(stubGameService, "FakeModule", "FakeAssembly");
|
||||
serviceInfo.Start();
|
||||
Assert.Equal(ServiceState.Running, serviceInfo.GetServiceState());
|
||||
serviceInfo.Dispose();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Stop_FromStart_Stopped()
|
||||
{
|
||||
IGameService stubService = new FakeService();
|
||||
ServiceInfo serviceInfo = new ServiceInfo(stubService, "FakeModule", "FakeAssembly");
|
||||
serviceInfo.Start();
|
||||
serviceInfo.Stop();
|
||||
Assert.Equal(ServiceState.Stopped, serviceInfo.GetServiceState());
|
||||
serviceInfo.Dispose();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetConfigurables_ServiceStopped_ReturnsConfigurables()
|
||||
{
|
||||
//Given
|
||||
FakeService stubService = new FakeService();
|
||||
FakeConfigurable stubConfigurable = new FakeConfigurable();
|
||||
HashSet<IConfigurable> configurables = new HashSet<IConfigurable>();
|
||||
configurables.Add(stubConfigurable);
|
||||
stubService.Configurables = configurables;
|
||||
ServiceInfo serviceInfo = new ServiceInfo(stubService, "FakeModule", "FakeAssembly");
|
||||
//When
|
||||
serviceInfo.Start();
|
||||
//Then
|
||||
Assert.Contains(stubConfigurable, serviceInfo.GetConfigurables().Values);
|
||||
serviceInfo.Dispose();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetServiceState_ServiceNotStarted_ReturnsStoppedState()
|
||||
{
|
||||
//Given
|
||||
IGameService stubService = new FakeService();
|
||||
ServiceInfo serviceInfo = new ServiceInfo(stubService, "FakeModule", "FakeAssembly");
|
||||
//Then
|
||||
Assert.Equal(ServiceState.Stopped, serviceInfo.GetServiceState());
|
||||
serviceInfo.Dispose();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetServiceState_ServiceStarted_ReturnsRunningState()
|
||||
{
|
||||
//Given
|
||||
IGameService stubService = new FakeService();
|
||||
ServiceInfo serviceInfo = new ServiceInfo(stubService, "FakeModule", "FakeAssembly");
|
||||
//When
|
||||
serviceInfo.Start();
|
||||
//Then
|
||||
Assert.Equal(ServiceState.Running, serviceInfo.GetServiceState());
|
||||
serviceInfo.Dispose();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetModuleName_ServiceNotStarted_ReturnsSetName()
|
||||
{
|
||||
//Given
|
||||
const string MODULE_NAME = "FakeModule";
|
||||
IGameService stubService = new FakeService();
|
||||
ServiceInfo serviceInfo = new ServiceInfo(stubService, MODULE_NAME, "FakeAssembly");
|
||||
//Then
|
||||
Assert.Equal(MODULE_NAME, serviceInfo.GetModuleName());
|
||||
serviceInfo.Dispose();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void GetAssemblyName_ServiceNotStarted_ReturnsSetAssemblyName()
|
||||
{
|
||||
//Given
|
||||
const string ASSEMBLY_NAME = "FakeAssembly";
|
||||
IGameService stubService = new FakeService();
|
||||
ServiceInfo serviceInfo = new ServiceInfo(stubService, "FakeModule", ASSEMBLY_NAME);
|
||||
//Then
|
||||
Assert.Equal(ASSEMBLY_NAME, serviceInfo.GetAssemblyName());
|
||||
serviceInfo.Dispose();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SetAndGetServiceName_ServiceNotStartedSingleThread_ServiceNameUpdated()
|
||||
{
|
||||
//Given
|
||||
const string SERVICE_NAME = "Service";
|
||||
IGameService stubService = new FakeService();
|
||||
ServiceInfo serviceInfo = new ServiceInfo(stubService, "FakeModule", "FakeAssemblyName");
|
||||
//When
|
||||
serviceInfo.ServiceName = SERVICE_NAME;
|
||||
//Then
|
||||
Assert.Equal(SERVICE_NAME, serviceInfo.ServiceName);
|
||||
serviceInfo.Dispose();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ServiceConsoleStream_ServiceNotStarted_NullReturned()
|
||||
{
|
||||
//Given
|
||||
IGameService stubService = new FakeService();
|
||||
ServiceInfo serviceInfo = new ServiceInfo(stubService, "FakeModule", "FakeAssembly");
|
||||
//Then
|
||||
Assert.Null(serviceInfo.ServiceConsoleStream);
|
||||
serviceInfo.Dispose();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ServiceConsoleStream_ServiceStarted_StreamReturned()
|
||||
{
|
||||
//Given
|
||||
IGameService stubService = new FakeService();
|
||||
ServiceInfo serviceInfo = new ServiceInfo(stubService, "FakeModule", "FakeAssembly");
|
||||
//When
|
||||
serviceInfo.Start();
|
||||
//Then
|
||||
Assert.IsAssignableFrom<Stream>(serviceInfo.ServiceConsoleStream);
|
||||
serviceInfo.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user