Implemented IPC system with minimal testing.
Large naming refactoring. Added some more tests.
This commit is contained in:
		@@ -15,7 +15,7 @@
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ProjectReference Include="..\..\src\GameServiceWarden.Core\GameServiceWarden.Core.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\..\src\GameServiceWarden.ModuleAPI\GameServiceWarden.ModuleAPI.csproj" />
 | 
			
		||||
    <ProjectReference Include="..\..\src\GameServiceWarden.API.Module\GameServiceWarden.API.Module.csproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
</Project>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,47 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using GameServiceWarden.ModuleAPI;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    public class FakeGameService : IGameService
 | 
			
		||||
    {
 | 
			
		||||
        public IReadOnlyCollection<IGameConfigurable> Configurables { get; set; }
 | 
			
		||||
 | 
			
		||||
        public event EventHandler<ServiceState> StateChangeEvent;
 | 
			
		||||
 | 
			
		||||
        public ServiceState CurrentState { get; private set; } = ServiceState.Stopped;
 | 
			
		||||
 | 
			
		||||
        private TextWriter consoleStream;
 | 
			
		||||
 | 
			
		||||
        public FakeGameService(params IGameConfigurable[] configurables)
 | 
			
		||||
        {
 | 
			
		||||
            HashSet<IGameConfigurable> modifiable = new HashSet<IGameConfigurable>();
 | 
			
		||||
            foreach (IGameConfigurable configurable in configurables)
 | 
			
		||||
            {
 | 
			
		||||
                modifiable.Add(configurable);
 | 
			
		||||
            }
 | 
			
		||||
            this.Configurables = modifiable;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public void ElegantShutdown()
 | 
			
		||||
        {
 | 
			
		||||
            CurrentState = ServiceState.Stopped;
 | 
			
		||||
            StateChangeEvent?.Invoke(this, CurrentState);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void ExecuteCommand(string command)
 | 
			
		||||
        {
 | 
			
		||||
            consoleStream.WriteLine(command);
 | 
			
		||||
            consoleStream.Flush();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void InitializeService(TextWriter stream)
 | 
			
		||||
        {
 | 
			
		||||
            CurrentState = ServiceState.Running;
 | 
			
		||||
            StateChangeEvent?.Invoke(this, CurrentState);
 | 
			
		||||
            this.consoleStream = stream;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -36,7 +36,7 @@ namespace GameServiceWarden.Core.Tests.Modules
 | 
			
		||||
            backing.Add(item);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void Add(string key, GameServiceInfo value)
 | 
			
		||||
        public void Add(string key, ServiceDescriptor value)
 | 
			
		||||
        {
 | 
			
		||||
            throw new System.NotImplementedException();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,56 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using GameServiceWarden.API.Module;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    public class FakeService : IService
 | 
			
		||||
    {
 | 
			
		||||
        public IReadOnlyCollection<IServiceConfigurable> Configurables { get; set; }
 | 
			
		||||
 | 
			
		||||
        public event EventHandler<bool> StateChangeEvent;
 | 
			
		||||
        public ServiceState CurrentState { get; private set; } = ServiceState.Stopped;
 | 
			
		||||
 | 
			
		||||
        private StreamWriter consoleWriter;
 | 
			
		||||
        private Stack<Task> taskStack = new Stack<Task>();
 | 
			
		||||
 | 
			
		||||
        public FakeService(params IServiceConfigurable[] configurables)
 | 
			
		||||
        {
 | 
			
		||||
            HashSet<IServiceConfigurable> modifiable = new HashSet<IServiceConfigurable>();
 | 
			
		||||
            foreach (IServiceConfigurable configurable in configurables)
 | 
			
		||||
            {
 | 
			
		||||
                modifiable.Add(configurable);
 | 
			
		||||
            }
 | 
			
		||||
            this.Configurables = modifiable;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        public void ElegantShutdown()
 | 
			
		||||
        {
 | 
			
		||||
            CurrentState = ServiceState.Stopped;
 | 
			
		||||
            StateChangeEvent?.Invoke(this, false);
 | 
			
		||||
            Task task;
 | 
			
		||||
            while(taskStack.TryPop(out task)) {
 | 
			
		||||
                if (task.IsCompleted) {
 | 
			
		||||
                    task.Wait();
 | 
			
		||||
                } else {
 | 
			
		||||
                    throw new InvalidOperationException("A task was not completed.");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void ExecuteCommand(string command)
 | 
			
		||||
        {
 | 
			
		||||
            taskStack.Push(consoleWriter.WriteLineAsync(command));
 | 
			
		||||
            taskStack.Push(consoleWriter.FlushAsync());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void InitializeService(Stream stream)
 | 
			
		||||
        {
 | 
			
		||||
            CurrentState = ServiceState.Running;
 | 
			
		||||
            this.consoleWriter = new StreamWriter(stream);
 | 
			
		||||
            StateChangeEvent?.Invoke(this, true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,13 +1,13 @@
 | 
			
		||||
using GameServiceWarden.ModuleAPI;
 | 
			
		||||
using GameServiceWarden.API.Module;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    public class FakeGameConfigurable : IGameConfigurable
 | 
			
		||||
    public class FakeServiceConfigurable : IServiceConfigurable
 | 
			
		||||
    {
 | 
			
		||||
        private string value;
 | 
			
		||||
        public string OptionName { get; private set; }
 | 
			
		||||
 | 
			
		||||
        public FakeGameConfigurable(string optionName)
 | 
			
		||||
        public FakeServiceConfigurable(string optionName)
 | 
			
		||||
        {
 | 
			
		||||
            this.OptionName = optionName;
 | 
			
		||||
        }
 | 
			
		||||
@@ -0,0 +1,28 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using GameServiceWarden.API.Games;
 | 
			
		||||
using GameServiceWarden.Core.Games;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    public class FakeServiceManagerMonitor : IServiceManagerMonitor
 | 
			
		||||
    {
 | 
			
		||||
        public List<ServiceManagerState> states = new List<ServiceManagerState>();
 | 
			
		||||
        public ServiceManagerState this[int i]
 | 
			
		||||
        {
 | 
			
		||||
            get
 | 
			
		||||
            {
 | 
			
		||||
                return states[i];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        public void Present(ServiceManagerState state)
 | 
			
		||||
        {
 | 
			
		||||
            states.Add(state);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public ServiceManagerState GetLastState()
 | 
			
		||||
        {
 | 
			
		||||
            return states[states.Count - 1];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,25 +1,25 @@
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using GameServiceWarden.ModuleAPI;
 | 
			
		||||
using GameServiceWarden.API.Module;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    public class FakeGameServiceModule : IGameServiceModule
 | 
			
		||||
    public class FakeServiceModule : IServiceModule
 | 
			
		||||
    {
 | 
			
		||||
        public string Name => "FakeModule";
 | 
			
		||||
 | 
			
		||||
        public string Description => "A fake module for testing.";
 | 
			
		||||
 | 
			
		||||
        private IGameConfigurable[] configurables;
 | 
			
		||||
        public FakeGameServiceModule(params IGameConfigurable[] configurables)
 | 
			
		||||
        private IServiceConfigurable[] configurables;
 | 
			
		||||
        public FakeServiceModule(params IServiceConfigurable[] configurables)
 | 
			
		||||
        {
 | 
			
		||||
            this.configurables = configurables;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public IEnumerable<string> Authors { get; private set; } = new string[] { "FakeAuthor", "FakeAuthor2" };
 | 
			
		||||
 | 
			
		||||
        public IGameService InstantiateGameService(string workspace, bool clean)
 | 
			
		||||
        public IService InstantiateService(string workspace, bool clean)
 | 
			
		||||
        {
 | 
			
		||||
            return new FakeGameService(configurables);
 | 
			
		||||
            return new FakeService(configurables);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,155 +0,0 @@
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using GameServiceWarden.Core.Games;
 | 
			
		||||
using GameServiceWarden.ModuleAPI;
 | 
			
		||||
using Xunit;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    // 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 GameServiceInfoTest
 | 
			
		||||
    {
 | 
			
		||||
        //MethodTested_ScenarioTested_ExpectedBehavior
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Start_FromStopped_StateIsRunning()
 | 
			
		||||
        {
 | 
			
		||||
            //Arrange, Act, Assert
 | 
			
		||||
            IGameService stubGameService = new FakeGameService();
 | 
			
		||||
            GameServiceInfo serviceInfo = new GameServiceInfo(stubGameService, "FakeModule", "FakeAssembly");
 | 
			
		||||
            serviceInfo.Start();
 | 
			
		||||
            Assert.Equal(ServiceState.Running, serviceInfo.GetServiceState());
 | 
			
		||||
            serviceInfo.Dispose();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Stop_FromStart_Stopped()
 | 
			
		||||
        {
 | 
			
		||||
            IGameService stubService = new FakeGameService();
 | 
			
		||||
            GameServiceInfo serviceInfo = new GameServiceInfo(stubService, "FakeModule", "FakeAssembly");
 | 
			
		||||
            serviceInfo.Start();
 | 
			
		||||
            serviceInfo.Stop();
 | 
			
		||||
            Assert.Equal(ServiceState.Stopped, serviceInfo.GetServiceState());
 | 
			
		||||
            serviceInfo.Dispose();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetConfigurableOptions_ServiceStopped_ReturnsConfigurables()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            FakeGameService stubService = new FakeGameService();
 | 
			
		||||
            FakeGameConfigurable stubConfigurable = new FakeGameConfigurable("Option");
 | 
			
		||||
            HashSet<IGameConfigurable> configurables = new HashSet<IGameConfigurable>();
 | 
			
		||||
            configurables.Add(stubConfigurable);
 | 
			
		||||
            stubService.Configurables = configurables;
 | 
			
		||||
            GameServiceInfo serviceInfo = new GameServiceInfo(stubService, "FakeModule", "FakeAssembly");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Contains<string>(stubConfigurable.OptionName, serviceInfo.GetConfigurableOptions());
 | 
			
		||||
            serviceInfo.Dispose();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void SetAndGetConfigurationValue_ServiceStopped_AppropriateValueReturned()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            FakeGameService stubService = new FakeGameService();
 | 
			
		||||
            FakeGameConfigurable stubConfigurable = new FakeGameConfigurable("Option");
 | 
			
		||||
            HashSet<IGameConfigurable> configurables = new HashSet<IGameConfigurable>();
 | 
			
		||||
            configurables.Add(stubConfigurable);
 | 
			
		||||
            stubService.Configurables = configurables;
 | 
			
		||||
            GameServiceInfo serviceInfo = new GameServiceInfo(stubService, "FakeModule", "FakeAssembly");
 | 
			
		||||
            //When
 | 
			
		||||
            serviceInfo.SetConfigurableValue(stubConfigurable.OptionName, "success");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True("success".Equals(serviceInfo.GetConfigurableValue(stubConfigurable.OptionName)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceState_ServiceNotStarted_ReturnsStoppedState()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            IGameService stubService = new FakeGameService();
 | 
			
		||||
            GameServiceInfo serviceInfo = new GameServiceInfo(stubService, "FakeModule", "FakeAssembly");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Equal(ServiceState.Stopped, serviceInfo.GetServiceState());
 | 
			
		||||
            serviceInfo.Dispose();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceState_ServiceStarted_ReturnsRunningState()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            IGameService stubService = new FakeGameService();
 | 
			
		||||
            GameServiceInfo serviceInfo = new GameServiceInfo(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 FakeGameService();
 | 
			
		||||
            GameServiceInfo serviceInfo = new GameServiceInfo(stubService, MODULE_NAME, "FakeAssembly");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Equal(MODULE_NAME, serviceInfo.ModuleName);
 | 
			
		||||
            serviceInfo.Dispose();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetAssemblyName_ServiceNotStarted_ReturnsSetAssemblyName()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            IGameService stubService = new FakeGameService();
 | 
			
		||||
            GameServiceInfo serviceInfo = new GameServiceInfo(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 FakeGameService();
 | 
			
		||||
            GameServiceInfo serviceInfo = new GameServiceInfo(stubService, "FakeModule", "FakeAssemblyName");
 | 
			
		||||
            //When
 | 
			
		||||
            serviceInfo.ServiceName = SERVICE_NAME;
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True(SERVICE_NAME.Equals(serviceInfo.ServiceName));
 | 
			
		||||
            serviceInfo.Dispose();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void ServiceConsoleStream_ServiceNotStarted_NullReturned()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            IGameService stubService = new FakeGameService();
 | 
			
		||||
            GameServiceInfo serviceInfo = new GameServiceInfo(stubService, "FakeModule", "FakeAssembly");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Null(serviceInfo.ServiceConsoleStream);
 | 
			
		||||
            serviceInfo.Dispose();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void ServiceConsoleStream_ServiceStarted_StreamReturned()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            IGameService stubService = new FakeGameService();
 | 
			
		||||
            GameServiceInfo serviceInfo = new GameServiceInfo(stubService, "FakeModule", "FakeAssembly");
 | 
			
		||||
            //When
 | 
			
		||||
            serviceInfo.Start();
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.IsAssignableFrom<Stream>(serviceInfo.ServiceConsoleStream);
 | 
			
		||||
            serviceInfo.Dispose();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,252 +0,0 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using GameServiceWarden.Core.Games;
 | 
			
		||||
using GameServiceWarden.ModuleAPI;
 | 
			
		||||
using Xunit;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    public class GameServiceManagerTest
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void CreateService_NewManager_NewServiceCreated()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "FakeService";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            FakePersistence<GameServiceInfo> stubPersistentServiceDictionary = new FakePersistence<GameServiceInfo>();
 | 
			
		||||
            GameServiceManager serviceManager = new GameServiceManager(stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            IGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubGameServiceModule.Name, stubGameServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubGameServiceModule.Name);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Contains<string>(FAKE_SERVICE_NAME, serviceManager.GetServiceNames());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void CreateService_OneService_ServiceDeleted()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "FakeService";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            FakePersistence<GameServiceInfo> stubPersistentServiceDictionary = new FakePersistence<GameServiceInfo>();
 | 
			
		||||
            GameServiceManager serviceManager = new GameServiceManager(stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            IGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubGameServiceModule.Name, stubGameServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubGameServiceModule.Name);
 | 
			
		||||
            serviceManager.DeleteService(FAKE_SERVICE_NAME);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.DoesNotContain<string>(FAKE_SERVICE_NAME, serviceManager.GetServiceNames());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceNames_MultipleServices_AllCorrectNames()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_PREFIX = "FakeService_";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            FakePersistence<GameServiceInfo> stubPersistentServiceDictionary = new FakePersistence<GameServiceInfo>();
 | 
			
		||||
            GameServiceManager serviceManager = new GameServiceManager(stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            IGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubGameServiceModule.Name, stubGameServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            for (int i = 0; i < 100; i++)
 | 
			
		||||
            {
 | 
			
		||||
                serviceManager.CreateService(FAKE_SERVICE_PREFIX + i, ASSEMBLY_NAME, stubGameServiceModule.Name);
 | 
			
		||||
            }
 | 
			
		||||
            //Then
 | 
			
		||||
            for (int i = 0; i < 100; i++)
 | 
			
		||||
            {
 | 
			
		||||
                Assert.Contains<string>(FAKE_SERVICE_PREFIX + i, serviceManager.GetServiceNames());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceOptions_ThreeOptionService_CorrectOptions()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "FakeService";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            FakePersistence<GameServiceInfo> stubPersistentServiceDictionary = new FakePersistence<GameServiceInfo>();
 | 
			
		||||
            GameServiceManager serviceManager = new GameServiceManager(stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            IGameServiceModule stubGameServiceModule = new FakeGameServiceModule(
 | 
			
		||||
                new FakeGameConfigurable("A"),
 | 
			
		||||
                new FakeGameConfigurable("B"),
 | 
			
		||||
                new FakeGameConfigurable("C")
 | 
			
		||||
            );
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubGameServiceModule.Name, stubGameServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubGameServiceModule.Name);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Contains<string>("A", serviceManager.GetServiceOptions(FAKE_SERVICE_NAME));
 | 
			
		||||
            Assert.Contains<string>("B", serviceManager.GetServiceOptions(FAKE_SERVICE_NAME));
 | 
			
		||||
            Assert.Contains<string>("C", serviceManager.GetServiceOptions(FAKE_SERVICE_NAME));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void SetandGetServiceOptionValue_OneOption_OptionChanged()
 | 
			
		||||
        {
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "FakeService";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            FakePersistence<GameServiceInfo> stubPersistentServiceDictionary = new FakePersistence<GameServiceInfo>();
 | 
			
		||||
            GameServiceManager serviceManager = new GameServiceManager(stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            IGameServiceModule stubGameServiceModule = new FakeGameServiceModule(
 | 
			
		||||
                new FakeGameConfigurable("A")
 | 
			
		||||
            );
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubGameServiceModule.Name, stubGameServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubGameServiceModule.Name);
 | 
			
		||||
            serviceManager.SetServiceOptionValue(FAKE_SERVICE_NAME, "A", "Test");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True("Test".Equals(serviceManager.GetServiceOptionValue(FAKE_SERVICE_NAME, "A")));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceState_NotRunning_ReturnsNotRunningState()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "FakeService";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            FakePersistence<GameServiceInfo> stubPersistentServiceDictionary = new FakePersistence<GameServiceInfo>();
 | 
			
		||||
            GameServiceManager serviceManager = new GameServiceManager(stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            IGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubGameServiceModule.Name, stubGameServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubGameServiceModule.Name);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Equal<ServiceState>(ServiceState.Stopped, serviceManager.GetServiceState(FAKE_SERVICE_NAME));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceState_Running_ReturnsNotRunningState()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "FakeService";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            FakePersistence<GameServiceInfo> stubPersistentServiceDictionary = new FakePersistence<GameServiceInfo>();
 | 
			
		||||
            GameServiceManager serviceManager = new GameServiceManager(stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            IGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubGameServiceModule.Name, stubGameServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubGameServiceModule.Name);
 | 
			
		||||
            serviceManager.StartService(FAKE_SERVICE_NAME);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Equal<ServiceState>(ServiceState.Running, serviceManager.GetServiceState(FAKE_SERVICE_NAME));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void StartService_NotStarted_SuccessfulStart()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "FakeService";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            FakePersistence<GameServiceInfo> stubPersistentServiceDictionary = new FakePersistence<GameServiceInfo>();
 | 
			
		||||
            GameServiceManager serviceManager = new GameServiceManager(stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            IGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubGameServiceModule.Name, stubGameServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubGameServiceModule.Name);
 | 
			
		||||
            serviceManager.StartService(FAKE_SERVICE_NAME);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Equal<ServiceState>(ServiceState.Running, serviceManager.GetServiceState(FAKE_SERVICE_NAME));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void StopService_Stopped_StateUpdated()
 | 
			
		||||
        {
 | 
			
		||||
            //Given        
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "FakeService";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            FakePersistence<GameServiceInfo> stubPersistentServiceDictionary = new FakePersistence<GameServiceInfo>();
 | 
			
		||||
            GameServiceManager serviceManager = new GameServiceManager(stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            IGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubGameServiceModule.Name, stubGameServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubGameServiceModule.Name);
 | 
			
		||||
            serviceManager.StartService(FAKE_SERVICE_NAME);
 | 
			
		||||
            serviceManager.StopService(FAKE_SERVICE_NAME);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Equal<ServiceState>(ServiceState.Stopped, serviceManager.GetServiceState(FAKE_SERVICE_NAME));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void ExecuteCommand_ServiceStarted_CommandLogged()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "FakeService";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            FakePersistence<GameServiceInfo> stubPersistentServiceDictionary = new FakePersistence<GameServiceInfo>();
 | 
			
		||||
            GameServiceManager serviceManager = new GameServiceManager(stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            IGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubGameServiceModule.Name, stubGameServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubGameServiceModule.Name);
 | 
			
		||||
            serviceManager.StartService(FAKE_SERVICE_NAME);
 | 
			
		||||
            serviceManager.ExecuteCommand(FAKE_SERVICE_NAME, "Test");
 | 
			
		||||
            //Then
 | 
			
		||||
            Stream stream = serviceManager.GetServiceConsoleStream(FAKE_SERVICE_NAME);
 | 
			
		||||
            stream.Position = 0;
 | 
			
		||||
            using (StreamReader reader = new StreamReader(stream))
 | 
			
		||||
            {
 | 
			
		||||
                Assert.True("Test".Equals(reader.ReadLine()));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceConsoleStream_ServiceStopped_ExceptionThrown()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "FakeService";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            FakePersistence<GameServiceInfo> stubPersistentServiceDictionary = new FakePersistence<GameServiceInfo>();
 | 
			
		||||
            GameServiceManager serviceManager = new GameServiceManager(stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            IGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubGameServiceModule.Name, stubGameServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubGameServiceModule.Name);
 | 
			
		||||
            //Then
 | 
			
		||||
            Action action = delegate()
 | 
			
		||||
            {
 | 
			
		||||
                serviceManager.GetServiceConsoleStream(FAKE_SERVICE_NAME);
 | 
			
		||||
            };
 | 
			
		||||
            Assert.Throws<InvalidOperationException>(action);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,170 @@
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using GameServiceWarden.Core.Games;
 | 
			
		||||
using GameServiceWarden.Core.Logging;
 | 
			
		||||
using GameServiceWarden.API.Module;
 | 
			
		||||
using Xunit;
 | 
			
		||||
using Xunit.Abstractions;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    // 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.
 | 
			
		||||
    [CollectionDefinition("Service", DisableParallelization = true)]
 | 
			
		||||
    public class ServiceDescriptorTest
 | 
			
		||||
    {
 | 
			
		||||
        private readonly ITestOutputHelper output;
 | 
			
		||||
        private readonly XUnitLogger logger;
 | 
			
		||||
 | 
			
		||||
        public ServiceDescriptorTest(ITestOutputHelper output)
 | 
			
		||||
        {
 | 
			
		||||
            this.output = output;
 | 
			
		||||
            logger = new XUnitLogger(output);
 | 
			
		||||
            Logger.AddLogListener(logger);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //MethodTested_ScenarioTested_ExpectedBehavior
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Start_FromStopped_StateIsRunning()
 | 
			
		||||
        {
 | 
			
		||||
            //Arrange, Act, Assert
 | 
			
		||||
            const string SERVICE_NAME = "Start_FromStopped_StateIsRunning";
 | 
			
		||||
            IService stubService = new FakeService();
 | 
			
		||||
            ServiceDescriptor serviceInfo = new ServiceDescriptor(stubService, SERVICE_NAME, "FakeModule", "FakeAssembly");
 | 
			
		||||
            serviceInfo.Start();
 | 
			
		||||
            Assert.Equal(true, serviceInfo.GetServiceState());
 | 
			
		||||
            serviceInfo.Stop();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Stop_FromStart_Stopped()
 | 
			
		||||
        {
 | 
			
		||||
            const string SERVICE_NAME = "Stop_FromStart_Stopped";
 | 
			
		||||
            IService stubService = new FakeService();
 | 
			
		||||
            ServiceDescriptor serviceInfo = new ServiceDescriptor(stubService, SERVICE_NAME, "FakeModule", "FakeAssembly");
 | 
			
		||||
            serviceInfo.Start();
 | 
			
		||||
            serviceInfo.Stop();
 | 
			
		||||
            Assert.Equal(false, serviceInfo.GetServiceState());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetConfigurableOptions_ServiceStopped_ReturnsConfigurables()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string SERVICE_NAME = "GetConfigurableOptions_ServiceStopped_ReturnsConfigurables";
 | 
			
		||||
            FakeService stubService = new FakeService();
 | 
			
		||||
            FakeServiceConfigurable stubConfigurable = new FakeServiceConfigurable("Option");
 | 
			
		||||
            HashSet<IServiceConfigurable> configurables = new HashSet<IServiceConfigurable>();
 | 
			
		||||
            configurables.Add(stubConfigurable);
 | 
			
		||||
            stubService.Configurables = configurables;
 | 
			
		||||
            ServiceDescriptor serviceInfo = new ServiceDescriptor(stubService, SERVICE_NAME, "FakeModule", "FakeAssembly");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Contains<string>(stubConfigurable.OptionName, serviceInfo.GetConfigurableOptions());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void SetAndGetConfigurationValue_ServiceStopped_AppropriateValueReturned()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string SERVICE_NAME = "SetAndGetConfigurationValue_ServiceStopped_AppropriateValueReturned";
 | 
			
		||||
            FakeService stubService = new FakeService();
 | 
			
		||||
            FakeServiceConfigurable stubConfigurable = new FakeServiceConfigurable("Option");
 | 
			
		||||
            HashSet<IServiceConfigurable> configurables = new HashSet<IServiceConfigurable>();
 | 
			
		||||
            configurables.Add(stubConfigurable);
 | 
			
		||||
            stubService.Configurables = configurables;
 | 
			
		||||
            ServiceDescriptor serviceInfo = new ServiceDescriptor(stubService, SERVICE_NAME, "FakeModule", "FakeAssembly");
 | 
			
		||||
            //When
 | 
			
		||||
            serviceInfo.SetConfigurableValue(stubConfigurable.OptionName, "success");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True("success".Equals(serviceInfo.GetConfigurableValue(stubConfigurable.OptionName)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceState_ServiceNotStarted_ReturnsStoppedState()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string SERVICE_NAME = "GetServiceState_ServiceNotStarted_ReturnsStoppedState";
 | 
			
		||||
            IService stubService = new FakeService();
 | 
			
		||||
            ServiceDescriptor serviceInfo = new ServiceDescriptor(stubService, SERVICE_NAME, "FakeModule", "FakeAssembly");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Equal(false, serviceInfo.GetServiceState());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceState_ServiceStarted_ReturnsRunningState()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string SERVICE_NAME = "GetServiceState_ServiceStarted_ReturnsRunningState";
 | 
			
		||||
            IService stubService = new FakeService();
 | 
			
		||||
            ServiceDescriptor serviceInfo = new ServiceDescriptor(stubService, SERVICE_NAME, "FakeModule", "FakeAssembly");
 | 
			
		||||
            //When
 | 
			
		||||
            serviceInfo.Start();
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Equal(true, serviceInfo.GetServiceState());
 | 
			
		||||
            serviceInfo.Stop();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetModuleName_ServiceNotStarted_ReturnsSetName()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string SERVICE_NAME = "GetModuleName_ServiceNotStarted_ReturnsSetName";
 | 
			
		||||
            const string MODULE_NAME = "FakeModule";
 | 
			
		||||
            IService stubService = new FakeService();
 | 
			
		||||
            ServiceDescriptor serviceInfo = new ServiceDescriptor(stubService, SERVICE_NAME, MODULE_NAME, "FakeAssembly");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Equal(MODULE_NAME, serviceInfo.GetModuleName());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetAssemblyName_ServiceNotStarted_ReturnsSetAssemblyName()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string SERVICE_NAME = "GetAssemblyName_ServiceNotStarted_ReturnsSetAssemblyName";
 | 
			
		||||
            IService stubService = new FakeService();
 | 
			
		||||
            ServiceDescriptor serviceInfo = new ServiceDescriptor(stubService, SERVICE_NAME, "FakeModule", ASSEMBLY_NAME);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Equal(ASSEMBLY_NAME, serviceInfo.GetAssemblyName());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceName_ServiceNotStartedSingleThread_ServiceNameReturned()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string SERVICE_NAME = "GetServiceName_ServiceNotStartedSingleThread_ServiceNameReturned";
 | 
			
		||||
            IService stubService = new FakeService();
 | 
			
		||||
            //When
 | 
			
		||||
            ServiceDescriptor serviceInfo = new ServiceDescriptor(stubService, SERVICE_NAME, "FakeModule", "FakeAssemblyName");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True(SERVICE_NAME.Equals(serviceInfo.ServiceName));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void ServiceLogPipeName_ServiceNotStarted_NullReturned()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string SERVICE_NAME = "ServiceLogPipeName_ServiceNotStarted_NullReturned";
 | 
			
		||||
            IService stubService = new FakeService();
 | 
			
		||||
            ServiceDescriptor serviceInfo = new ServiceDescriptor(stubService, SERVICE_NAME, "FakeModule", "FakeAssembly");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.NotNull(serviceInfo.ServiceLogPipeName);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void ServiceLogPipeName_ServiceStarted_StreamReturned()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string SERVICE_NAME = "ServiceLogPipeName_ServiceStarted_StreamReturned";
 | 
			
		||||
            IService stubService = new FakeService();
 | 
			
		||||
            ServiceDescriptor serviceInfo = new ServiceDescriptor(stubService, SERVICE_NAME, "FakeModule", "FakeAssembly");
 | 
			
		||||
            //When
 | 
			
		||||
            serviceInfo.Start();
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.NotNull(serviceInfo.ServiceLogPipeName);
 | 
			
		||||
            serviceInfo.Stop();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,337 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.IO.Pipes;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using GameServiceWarden.Core.Games;
 | 
			
		||||
using GameServiceWarden.Core.Logging;
 | 
			
		||||
using GameServiceWarden.API.Module;
 | 
			
		||||
using Xunit;
 | 
			
		||||
using Xunit.Abstractions;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.Modules.Games
 | 
			
		||||
{
 | 
			
		||||
    [CollectionDefinition("Service")]
 | 
			
		||||
    public class ServiceManagerTest
 | 
			
		||||
    {
 | 
			
		||||
        private readonly ITestOutputHelper output;
 | 
			
		||||
        private readonly XUnitLogger logger;
 | 
			
		||||
 | 
			
		||||
        public ServiceManagerTest(ITestOutputHelper output)
 | 
			
		||||
        {
 | 
			
		||||
            this.output = output;
 | 
			
		||||
            logger = new XUnitLogger(output);
 | 
			
		||||
            Logger.AddLogListener(logger);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void CreateService_NewManager_NewServiceCreated()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "CreateService_NewManager_NewServiceCreated";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Contains<string>(FAKE_SERVICE_NAME, stubMonitor.GetLastState().services);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void CreateService_OneService_ServiceDeleted()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "CreateService_OneService_ServiceDeleted";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            serviceManager.DeleteService(FAKE_SERVICE_NAME);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True(stubMonitor.GetLastState().delta);
 | 
			
		||||
            Assert.True(stubMonitor.GetLastState().subtract);
 | 
			
		||||
            Assert.Contains(FAKE_SERVICE_NAME, stubMonitor.GetLastState().services);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceNames_MultipleServices_AllCorrectNames()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_PREFIX = "GetServiceNames_MultipleServices_AllCorrectNames_";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            for (int i = 0; i < 100; i++)
 | 
			
		||||
            {
 | 
			
		||||
                serviceManager.CreateService(FAKE_SERVICE_PREFIX + i, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            }
 | 
			
		||||
            //Then
 | 
			
		||||
            for (int i = 0; i < 100; i++)
 | 
			
		||||
            {
 | 
			
		||||
                Assert.Contains<string>(FAKE_SERVICE_PREFIX + i, serviceManager.GetServiceNames());
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceOptions_ThreeOptionService_CorrectOptions()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "GetServiceOptions_ThreeOptionService_CorrectOptions";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule(
 | 
			
		||||
                new FakeServiceConfigurable("A"),
 | 
			
		||||
                new FakeServiceConfigurable("B"),
 | 
			
		||||
                new FakeServiceConfigurable("C")
 | 
			
		||||
            );
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Contains<string>("A", serviceManager.GetOptions()[FAKE_SERVICE_NAME].Keys);
 | 
			
		||||
            Assert.Contains<string>("B", serviceManager.GetOptions()[FAKE_SERVICE_NAME].Keys);
 | 
			
		||||
            Assert.Contains<string>("C", serviceManager.GetOptions()[FAKE_SERVICE_NAME].Keys);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void SetandGetServiceOptionValue_OneOption_OptionChanged()
 | 
			
		||||
        {
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "SetandGetServiceOptionValue_OneOption_OptionChanged";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule(
 | 
			
		||||
                new FakeServiceConfigurable("A")
 | 
			
		||||
            );
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            serviceManager.SetServiceOptionValue(FAKE_SERVICE_NAME, "A", "Test");
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True("Test".Equals(serviceManager.GetOptions()[FAKE_SERVICE_NAME]["A"]));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceState_NotRunning_ReturnsNotRunningState()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "GetServiceState_NotRunning_ReturnsNotRunningState";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.DoesNotContain(FAKE_SERVICE_NAME, serviceManager.GetRunningServiceNames());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void StartService_NotStarted_SuccessfulStart()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "StartService_NotStarted_SuccessfulStart";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            serviceManager.StartService(FAKE_SERVICE_NAME);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Contains(FAKE_SERVICE_NAME, serviceManager.GetRunningServiceNames());
 | 
			
		||||
            serviceManager.StopService(FAKE_SERVICE_NAME);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void StopService_Stopped_StateUpdated()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "StopService_Stopped_StateUpdated";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            serviceManager.StartService(FAKE_SERVICE_NAME);
 | 
			
		||||
            serviceManager.StopService(FAKE_SERVICE_NAME);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.DoesNotContain(FAKE_SERVICE_NAME, serviceManager.GetRunningServiceNames());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void ExecuteCommand_CommandExecutedBeforeConnected_CommandLogged()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "ExecuteCommand_CommandExecutedBeforeConnected_CommandLogged";
 | 
			
		||||
            const string COMMAND = "TEST";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            serviceManager.StartService(FAKE_SERVICE_NAME);
 | 
			
		||||
            string pipeName = serviceManager.GetLogPipeNames()[FAKE_SERVICE_NAME];
 | 
			
		||||
            NamedPipeClientStream clientStream = new NamedPipeClientStream(".", pipeName, PipeDirection.In);
 | 
			
		||||
            serviceManager.ExecuteCommand(FAKE_SERVICE_NAME, COMMAND);
 | 
			
		||||
            clientStream.Connect(1000);
 | 
			
		||||
            Thread.Sleep(1000);
 | 
			
		||||
            //Then
 | 
			
		||||
            byte[] buffer = new byte[1024 * 8];
 | 
			
		||||
            CancellationTokenSource cancelToken = new CancellationTokenSource();
 | 
			
		||||
            ValueTask<int> task = clientStream.ReadAsync(buffer, cancelToken.Token);
 | 
			
		||||
            Assert.False(task.AsTask().Wait(1000));
 | 
			
		||||
            serviceManager.StopService(FAKE_SERVICE_NAME);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void ExecuteCommand_CommandExecutedAfterConnected_CommandLogged()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "ExecuteCommand_CommandExecutedAfterConnected_CommandLogged";
 | 
			
		||||
            const string COMMAND = "TEST";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            serviceManager.StartService(FAKE_SERVICE_NAME);
 | 
			
		||||
            string pipeName = serviceManager.GetLogPipeNames()[FAKE_SERVICE_NAME];
 | 
			
		||||
            NamedPipeClientStream clientStream = new NamedPipeClientStream(".", pipeName, PipeDirection.In);
 | 
			
		||||
            clientStream.Connect(1000);
 | 
			
		||||
            Thread.Sleep(1000);
 | 
			
		||||
            serviceManager.ExecuteCommand(FAKE_SERVICE_NAME, COMMAND);
 | 
			
		||||
            //Then
 | 
			
		||||
            using (StreamReader reader = new StreamReader(clientStream))
 | 
			
		||||
            {
 | 
			
		||||
                CancellationTokenSource cancelToken = new CancellationTokenSource();
 | 
			
		||||
                string message = null;
 | 
			
		||||
                Task task = Task.Run(() => message = reader.ReadLine(), cancelToken.Token);
 | 
			
		||||
                Assert.True(task.Wait(1000));
 | 
			
		||||
                Assert.True(COMMAND.Equals(message), $"Received message \"{message}\" when expecting \"{COMMAND}\"");
 | 
			
		||||
            }
 | 
			
		||||
            serviceManager.StopService(FAKE_SERVICE_NAME);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
[Fact]
 | 
			
		||||
        public void ExecuteCommand_CommandExecutedAfterMultipleLogListenersConnected_CommandLogged()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "ExecuteCommand_CommandExecutedAfterMultipleLogListenersConnected_CommandLogged";
 | 
			
		||||
            const string COMMAND = "TEST";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            serviceManager.StartService(FAKE_SERVICE_NAME);
 | 
			
		||||
            string pipeName = serviceManager.GetLogPipeNames()[FAKE_SERVICE_NAME];
 | 
			
		||||
            NamedPipeClientStream[] clientStreams = new NamedPipeClientStream[5];
 | 
			
		||||
            for (int i = 0; i < clientStreams.Length; i++)
 | 
			
		||||
            {
 | 
			
		||||
                clientStreams[i] = new NamedPipeClientStream(".", pipeName, PipeDirection.In);
 | 
			
		||||
                clientStreams[i].Connect(1000);
 | 
			
		||||
            }
 | 
			
		||||
            Thread.Sleep(1000);
 | 
			
		||||
            serviceManager.ExecuteCommand(FAKE_SERVICE_NAME, COMMAND);
 | 
			
		||||
            //Then
 | 
			
		||||
            for (int i = 0; i < clientStreams.Length; i++)
 | 
			
		||||
            {
 | 
			
		||||
                using (StreamReader reader = new StreamReader(clientStreams[i]))
 | 
			
		||||
                {
 | 
			
		||||
                    CancellationTokenSource cancelToken = new CancellationTokenSource();
 | 
			
		||||
                    string message = null;
 | 
			
		||||
                    Task task = Task.Run(() => message = reader.ReadLine(), cancelToken.Token);
 | 
			
		||||
                    Assert.True(task.Wait(10000));
 | 
			
		||||
                    Assert.True(COMMAND.Equals(message), $"Received message \"{message}\" when expecting \"{COMMAND}\"");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            serviceManager.StopService(FAKE_SERVICE_NAME);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetServiceConsoleStream_ServiceStopped_ExceptionThrown()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string ASSEMBLY_NAME = "FakeAssembly";
 | 
			
		||||
            const string FAKE_SERVICE_NAME = "GetServiceConsoleStream_ServiceStopped_ExceptionThrown";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubPersistentModuleDictionary = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            FakePersistence<ServiceDescriptor> stubPersistentServiceDictionary = new FakePersistence<ServiceDescriptor>();
 | 
			
		||||
            FakeServiceManagerMonitor stubMonitor = new FakeServiceManagerMonitor();
 | 
			
		||||
            ServiceManager serviceManager = new ServiceManager(stubMonitor, stubPersistentServiceDictionary, stubPersistentModuleDictionary);
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyModulesDictionary = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            IServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
            stubAssemblyModulesDictionary.Add(stubServiceModule.Name, stubServiceModule);
 | 
			
		||||
            stubPersistentModuleDictionary.AddToPersistence(ASSEMBLY_NAME, stubAssemblyModulesDictionary);
 | 
			
		||||
            //When
 | 
			
		||||
            serviceManager.CreateService(FAKE_SERVICE_NAME, ASSEMBLY_NAME, stubServiceModule.Name);
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Throws<KeyNotFoundException>(() => serviceManager.GetLogPipeNames()[FAKE_SERVICE_NAME]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,95 +0,0 @@
 | 
			
		||||
using System.Collections;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using GameServiceWarden.Core.Games;
 | 
			
		||||
using GameServiceWarden.Core.Persistence;
 | 
			
		||||
using GameServiceWarden.Core.Tests.Modules;
 | 
			
		||||
using GameServiceWarden.Core.Tests.Modules.Games;
 | 
			
		||||
using GameServiceWarden.ModuleAPI;
 | 
			
		||||
using Xunit;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.Persistence
 | 
			
		||||
{
 | 
			
		||||
    public class PersistedGameServiceInfosTest
 | 
			
		||||
    {
 | 
			
		||||
        //MethodTested_ScenarioTested_ExpectedBehavior
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetPathForKey_PathGen_ExpectedPathResult()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string TEST_DIR = "services";
 | 
			
		||||
            const string MODULE_NAME = "fake_module";
 | 
			
		||||
            const string ASSEMBLY_NAME = "fake_assembly";
 | 
			
		||||
            const string SERVICE_NAME = "fake_service";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubModulesPersistence = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyDict = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            FakeGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
 | 
			
		||||
            stubAssemblyDict[MODULE_NAME] = stubGameServiceModule;
 | 
			
		||||
            stubModulesPersistence[ASSEMBLY_NAME] = stubAssemblyDict;
 | 
			
		||||
 | 
			
		||||
            PersistedGameServiceInfos persistedGameServices = new PersistedGameServiceInfos(TEST_DIR, stubModulesPersistence);
 | 
			
		||||
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True(persistedGameServices.GetPathForKey(SERVICE_NAME).Equals(Path.Combine(TEST_DIR, SERVICE_NAME)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Save_SavingService_FileCreated()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string TEST_DIR = "services";
 | 
			
		||||
            const string MODULE_NAME = "fake_module";
 | 
			
		||||
            const string ASSEMBLY_NAME = "fake_assembly";
 | 
			
		||||
            const string SERVICE_NAME = "fake_service";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubModulesPersistence = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyDict = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            FakeGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
 | 
			
		||||
            stubAssemblyDict[MODULE_NAME] = stubGameServiceModule;
 | 
			
		||||
            stubModulesPersistence[ASSEMBLY_NAME] = stubAssemblyDict;
 | 
			
		||||
 | 
			
		||||
            PersistedGameServiceInfos persistedGameServiceInfos = new PersistedGameServiceInfos(TEST_DIR, stubModulesPersistence);
 | 
			
		||||
 | 
			
		||||
            GameServiceInfo stubGameServiceInfo = new GameServiceInfo(stubModulesPersistence[ASSEMBLY_NAME][MODULE_NAME].InstantiateGameService(persistedGameServiceInfos.GetPathForKey(SERVICE_NAME), true), MODULE_NAME, ASSEMBLY_NAME);
 | 
			
		||||
            //When
 | 
			
		||||
            persistedGameServiceInfos[SERVICE_NAME] = stubGameServiceInfo;
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True(Directory.Exists(TEST_DIR));
 | 
			
		||||
            Assert.True(Directory.Exists(persistedGameServiceInfos.GetPathForKey(SERVICE_NAME)));
 | 
			
		||||
            string[] files = Directory.GetFiles(persistedGameServiceInfos.GetPathForKey(SERVICE_NAME));
 | 
			
		||||
            Assert.True(files.Length == 1);
 | 
			
		||||
            Assert.StartsWith(SERVICE_NAME, Path.GetFileName(files[0]));
 | 
			
		||||
 | 
			
		||||
            Directory.Delete(TEST_DIR, true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Save_ReadingService_MetadataRead()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string TEST_DIR = "services";
 | 
			
		||||
            const string MODULE_NAME = "fake_module";
 | 
			
		||||
            const string ASSEMBLY_NAME = "fake_assembly";
 | 
			
		||||
            const string SERVICE_NAME = "fake_service";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>> stubModulesPersistence = new FakePersistence<IReadOnlyDictionary<string, IGameServiceModule>>();
 | 
			
		||||
            Dictionary<string, IGameServiceModule> stubAssemblyDict = new Dictionary<string, IGameServiceModule>();
 | 
			
		||||
            FakeGameServiceModule stubGameServiceModule = new FakeGameServiceModule();
 | 
			
		||||
 | 
			
		||||
            stubAssemblyDict[MODULE_NAME] = stubGameServiceModule;
 | 
			
		||||
            stubModulesPersistence[ASSEMBLY_NAME] = stubAssemblyDict;
 | 
			
		||||
 | 
			
		||||
            PersistedGameServiceInfos persistedGameServices = new PersistedGameServiceInfos(TEST_DIR, stubModulesPersistence);
 | 
			
		||||
 | 
			
		||||
            GameServiceInfo stubGameServiceInfo = new GameServiceInfo(stubModulesPersistence[ASSEMBLY_NAME][MODULE_NAME].InstantiateGameService(persistedGameServices.GetPathForKey(SERVICE_NAME), true), MODULE_NAME, ASSEMBLY_NAME);
 | 
			
		||||
            persistedGameServices[SERVICE_NAME] = stubGameServiceInfo;
 | 
			
		||||
            //When
 | 
			
		||||
            GameServiceInfo loadedService = persistedGameServices[SERVICE_NAME];
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True(loadedService.ModuleName.Equals(MODULE_NAME));
 | 
			
		||||
            Assert.True(loadedService.GetAssemblyName().Equals(ASSEMBLY_NAME));
 | 
			
		||||
 | 
			
		||||
            Directory.Delete(TEST_DIR, true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,95 @@
 | 
			
		||||
using System.Collections;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using GameServiceWarden.Core.Games;
 | 
			
		||||
using GameServiceWarden.Core.Persistence;
 | 
			
		||||
using GameServiceWarden.Core.Tests.Modules;
 | 
			
		||||
using GameServiceWarden.Core.Tests.Modules.Games;
 | 
			
		||||
using GameServiceWarden.API.Module;
 | 
			
		||||
using Xunit;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.Persistence
 | 
			
		||||
{
 | 
			
		||||
    public class ServiceDescriptorPersistenceTest
 | 
			
		||||
    {
 | 
			
		||||
        //MethodTested_ScenarioTested_ExpectedBehavior
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void GetPathForKey_PathGen_ExpectedPathResult()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string TEST_DIR = "services";
 | 
			
		||||
            const string MODULE_NAME = "fake_module";
 | 
			
		||||
            const string ASSEMBLY_NAME = "fake_assembly";
 | 
			
		||||
            const string SERVICE_NAME = "fake_service";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubModulesPersistence = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyDict = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            FakeServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
 | 
			
		||||
            stubAssemblyDict[MODULE_NAME] = stubServiceModule;
 | 
			
		||||
            stubModulesPersistence[ASSEMBLY_NAME] = stubAssemblyDict;
 | 
			
		||||
 | 
			
		||||
            ServiceDescriptorPersistence persistedServices = new ServiceDescriptorPersistence(TEST_DIR, stubModulesPersistence);
 | 
			
		||||
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True(persistedServices.GetPathForKey(SERVICE_NAME).Equals(Path.Combine(TEST_DIR, SERVICE_NAME)));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Save_SavingService_FileCreated()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string TEST_DIR = "services";
 | 
			
		||||
            const string MODULE_NAME = "fake_module";
 | 
			
		||||
            const string ASSEMBLY_NAME = "fake_assembly";
 | 
			
		||||
            const string SERVICE_NAME = "fake_service";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubModulesPersistence = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyDict = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            FakeServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
 | 
			
		||||
            stubAssemblyDict[MODULE_NAME] = stubServiceModule;
 | 
			
		||||
            stubModulesPersistence[ASSEMBLY_NAME] = stubAssemblyDict;
 | 
			
		||||
 | 
			
		||||
            ServiceDescriptorPersistence persistedServiceInfos = new ServiceDescriptorPersistence(TEST_DIR, stubModulesPersistence);
 | 
			
		||||
 | 
			
		||||
            ServiceDescriptor stubServiceInfo = new ServiceDescriptor(stubModulesPersistence[ASSEMBLY_NAME][MODULE_NAME].InstantiateService(persistedServiceInfos.GetPathForKey(SERVICE_NAME), true), SERVICE_NAME, MODULE_NAME, ASSEMBLY_NAME);
 | 
			
		||||
            //When
 | 
			
		||||
            persistedServiceInfos[SERVICE_NAME] = stubServiceInfo;
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True(Directory.Exists(TEST_DIR));
 | 
			
		||||
            Assert.True(Directory.Exists(persistedServiceInfos.GetPathForKey(SERVICE_NAME)));
 | 
			
		||||
            string[] files = Directory.GetFiles(persistedServiceInfos.GetPathForKey(SERVICE_NAME));
 | 
			
		||||
            Assert.True(files.Length == 1);
 | 
			
		||||
            Assert.StartsWith(SERVICE_NAME, Path.GetFileName(files[0]));
 | 
			
		||||
 | 
			
		||||
            Directory.Delete(TEST_DIR, true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Save_ReadingService_MetadataRead()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string TEST_DIR = "services";
 | 
			
		||||
            const string MODULE_NAME = "fake_module";
 | 
			
		||||
            const string ASSEMBLY_NAME = "fake_assembly";
 | 
			
		||||
            const string SERVICE_NAME = "fake_service";
 | 
			
		||||
            FakePersistence<IReadOnlyDictionary<string, IServiceModule>> stubModulesPersistence = new FakePersistence<IReadOnlyDictionary<string, IServiceModule>>();
 | 
			
		||||
            Dictionary<string, IServiceModule> stubAssemblyDict = new Dictionary<string, IServiceModule>();
 | 
			
		||||
            FakeServiceModule stubServiceModule = new FakeServiceModule();
 | 
			
		||||
 | 
			
		||||
            stubAssemblyDict[MODULE_NAME] = stubServiceModule;
 | 
			
		||||
            stubModulesPersistence[ASSEMBLY_NAME] = stubAssemblyDict;
 | 
			
		||||
 | 
			
		||||
            ServiceDescriptorPersistence persistedServices = new ServiceDescriptorPersistence(TEST_DIR, stubModulesPersistence);
 | 
			
		||||
 | 
			
		||||
            ServiceDescriptor stubServiceInfo = new ServiceDescriptor(stubModulesPersistence[ASSEMBLY_NAME][MODULE_NAME].InstantiateService(persistedServices.GetPathForKey(SERVICE_NAME), true), SERVICE_NAME, MODULE_NAME, ASSEMBLY_NAME);
 | 
			
		||||
            persistedServices[SERVICE_NAME] = stubServiceInfo;
 | 
			
		||||
            //When
 | 
			
		||||
            ServiceDescriptor loadedService = persistedServices[SERVICE_NAME];
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True(loadedService.GetModuleName().Equals(MODULE_NAME));
 | 
			
		||||
            Assert.True(loadedService.GetAssemblyName().Equals(ASSEMBLY_NAME));
 | 
			
		||||
 | 
			
		||||
            Directory.Delete(TEST_DIR, true);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										47
									
								
								tests/GameServiceWarden.Core.Tests/UI/IPCMediatorTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								tests/GameServiceWarden.Core.Tests/UI/IPCMediatorTest.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
using System;
 | 
			
		||||
using GameServiceWarden.Core.UI;
 | 
			
		||||
using Xunit;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests.UI
 | 
			
		||||
{
 | 
			
		||||
    public class IPCMediatorTest
 | 
			
		||||
    {
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Open_Closed_Opened()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string NAME = "MEDIATOR";
 | 
			
		||||
            IPCMediator mediator = new IPCMediator(NAME);
 | 
			
		||||
            //When
 | 
			
		||||
            mediator.Open();
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True(mediator.IsRunning);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Open_AlreadyOpened_Exception()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string NAME = "MEDIATOR";
 | 
			
		||||
            IPCMediator mediator = new IPCMediator(NAME);
 | 
			
		||||
            //When
 | 
			
		||||
            mediator.Open();
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.Throws<InvalidOperationException>(() => mediator.Open());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void Close_Opened_Closed()
 | 
			
		||||
        {
 | 
			
		||||
            //Given
 | 
			
		||||
            const string NAME = "MEDIATOR";
 | 
			
		||||
            IPCMediator mediator = new IPCMediator(NAME);
 | 
			
		||||
            //When
 | 
			
		||||
            mediator.Open();
 | 
			
		||||
            //Then
 | 
			
		||||
            Assert.True(mediator.IsRunning);
 | 
			
		||||
            mediator.Close();
 | 
			
		||||
            Assert.False(mediator.IsRunning);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								tests/GameServiceWarden.Core.Tests/XUnitLogger.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								tests/GameServiceWarden.Core.Tests/XUnitLogger.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
using System;
 | 
			
		||||
using GameServiceWarden.Core.Logging;
 | 
			
		||||
using Xunit.Abstractions;
 | 
			
		||||
 | 
			
		||||
namespace GameServiceWarden.Core.Tests
 | 
			
		||||
{
 | 
			
		||||
    public class XUnitLogger : ILogReceiver
 | 
			
		||||
    {
 | 
			
		||||
        public LogLevel Level => LogLevel.DEBUG;
 | 
			
		||||
 | 
			
		||||
        public string Identifier => GetType().Name;
 | 
			
		||||
 | 
			
		||||
        private ITestOutputHelper outputHelper;
 | 
			
		||||
 | 
			
		||||
        public XUnitLogger(ITestOutputHelper output)
 | 
			
		||||
        {
 | 
			
		||||
            this.outputHelper = output;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void Flush()
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void LogMessage(string message, DateTime time, LogLevel level)
 | 
			
		||||
        {
 | 
			
		||||
            outputHelper.WriteLine($"[{time.ToShortTimeString()}][{level.ToString()}]: {message}");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user