public MyHost(IShutdown shutdown, ConsoleWriterQueue consoleWriterQueue, WaitBlock waitBlock, IRuntimeSettings runtimeSettings)
 {
     _shutdown                     = shutdown;
     _consoleWriterQueue           = consoleWriterQueue;
     _waitBlock                    = waitBlock;
     _shouldHandleAsWindowsService = string.Equals(Boolean.TrueString, runtimeSettings["ShouldHandleAsWindowsService"]);
 }
 private static void Execute(WaitBlock waitBlock, ConsoleWriterQueue consoleWriterQueue, bool asWindowsService = false)
 {
     using (IApplicationContext context = ApplicationContext.Create(application => application
                                                                    .ConfigureForUnitTest()
                                                                    .WithWaitBlock(waitBlock, consoleWriterQueue)
                                                                    .UseConsoleHost()
                                                                    .Hosts(hosts => hosts
                                                                           .Clear()
                                                                           .Host <MyHost>())
                                                                    .Services(services => services
                                                                              .Advanced(advanced => advanced
                                                                                        .Register <IRuntimeSettings>(kernel => new InMemoryRuntimeSettings()
                                                                                                                     .Set("ShouldHandleAsWindowsService", asWindowsService ? Boolean.TrueString : Boolean.FalseString))
                                                                                        .Register <IWindowsServiceHandler, FakeWindowsServiceHandler>()
                                                                                        )
                                                                              )
                                                                    ))
     {
         context.Execute(nameof(MyHost));
     }
 }
        public void ExecuteHost_InWindowsServiceContext_AssertExecutionOrder()
        {
            var consoleWriterQueue = new ConsoleWriterQueue();

            using (var waitBlock = new WaitBlock())
            {
                Execute(waitBlock, consoleWriterQueue, asWindowsService: true);
            }

            StringAssert.Contains("[Integration Service]: Started", consoleWriterQueue.Dequeue());
            StringAssert.Contains("WindowsService.Starting", consoleWriterQueue.Dequeue());
            StringAssert.Contains("WindowsService.Running", consoleWriterQueue.Dequeue());
            StringAssert.Contains("Host.Handling", consoleWriterQueue.Dequeue());
            StringAssert.Contains("WindowsService.Stopping", consoleWriterQueue.Dequeue());
            StringAssert.Contains("[Integration Service]: Shutdown requested.", consoleWriterQueue.Dequeue());
            StringAssert.Contains("Host.Handled", consoleWriterQueue.Dequeue());
            StringAssert.Contains("WindowsService.Stopped", consoleWriterQueue.Dequeue());
            StringAssert.Contains("[Integration Service]: Shutting down", consoleWriterQueue.Dequeue());
            StringAssert.Contains("[Integration Service]: Shut down.", consoleWriterQueue.Dequeue());

            Assert.That(consoleWriterQueue.Count, Is.Zero);
        }
        public void ExecuteHost_NotInWindowsServiceContext_AssertExecutionOrder()
        {
            var consoleWriterQueue = new ConsoleWriterQueue();

            using (var waitBlock = new WaitBlock())
            {
                Execute(waitBlock, consoleWriterQueue);
            }

            StringAssert.Contains("[Integration Service]: Started", consoleWriterQueue.Dequeue());
            StringAssert.Contains("NotWindowsService", consoleWriterQueue.Dequeue());
            StringAssert.Contains("Host.Handling", consoleWriterQueue.Dequeue());
            StringAssert.Contains("Host.ManuallyRelease", consoleWriterQueue.Dequeue());
            StringAssert.Contains("Shutdown.Waiting", consoleWriterQueue.Dequeue());
            StringAssert.Contains("Shutdown.Waited", consoleWriterQueue.Dequeue());
            StringAssert.Contains("[Integration Service]: Shutdown requested.", consoleWriterQueue.Dequeue());
            StringAssert.Contains("Host.Handled", consoleWriterQueue.Dequeue());
            StringAssert.Contains("[Integration Service]: Shutting down", consoleWriterQueue.Dequeue());
            StringAssert.Contains("[Integration Service]: Shut down.", consoleWriterQueue.Dequeue());

            Assert.That(consoleWriterQueue.Count, Is.Zero);
        }
 public FakeWindowsServiceHandler(ConsoleWriterQueue consoleWriterQueue, IRuntimeSettings runtimeSettings)
 {
     _consoleWriterQueue           = consoleWriterQueue;
     _shouldHandleAsWindowsService = string.Equals(Boolean.TrueString, runtimeSettings["ShouldHandleAsWindowsService"]);
 }