From 3596383532f4635d2e3bc3bfc79031190e0e7e02 Mon Sep 17 00:00:00 2001 From: Cyberboss Date: Tue, 2 Oct 2018 15:40:54 -0400 Subject: [PATCH] Add a basic watchdog test --- .../Components/Watchdog/TestWatchdog.cs | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/tests/Tgstation.Server.Host.Tests/Components/Watchdog/TestWatchdog.cs b/tests/Tgstation.Server.Host.Tests/Components/Watchdog/TestWatchdog.cs index 563cca9587..3326386343 100644 --- a/tests/Tgstation.Server.Host.Tests/Components/Watchdog/TestWatchdog.cs +++ b/tests/Tgstation.Server.Host.Tests/Components/Watchdog/TestWatchdog.cs @@ -3,6 +3,9 @@ using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; using Tgstation.Server.Api.Models.Internal; using Tgstation.Server.Host.Components.Chat; using Tgstation.Server.Host.Components.Compiler; @@ -62,5 +65,79 @@ namespace Tgstation.Server.Host.Components.Watchdog.Tests mockServerControl.VerifyAll(); mockChat.VerifyAll(); } + + [TestMethod] + public async Task TestSuccessfulLaunchAndShutdown() + { + var mockChat = new Mock(); + mockChat.Setup(x => x.RegisterCommandHandler(It.IsNotNull())).Verifiable(); + var mockSessionControllerFactory = new Mock(); + var mockDmbFactory = new Mock(); + var mockLogger = new Mock>(); + var mockReattachInfoHandler = new Mock(); + var mockDatabaseContextFactory = new Mock(); + var mockByondTopicSender = new Mock(); + var mockEventConsumer = new Mock(); + var mockJobManager = new Mock(); + var mockRestartRegistration = new Mock(); + mockRestartRegistration.Setup(x => x.Dispose()).Verifiable(); + var mockServerControl = new Mock(); + mockServerControl.Setup(x => x.RegisterForRestart(It.IsNotNull())).Returns(mockRestartRegistration.Object).Verifiable(); + var mockLaunchParameters = new DreamDaemonLaunchParameters(); + var mockInstance = new Models.Instance(); + + using (var wd = new Watchdog(mockChat.Object, mockSessionControllerFactory.Object, mockDmbFactory.Object, mockLogger.Object, mockReattachInfoHandler.Object, mockDatabaseContextFactory.Object, mockByondTopicSender.Object, mockEventConsumer.Object, mockJobManager.Object, mockServerControl.Object, mockLaunchParameters, mockInstance, default)) + using (var cts = new CancellationTokenSource()) + { + var mockCompileJob = new Models.CompileJob(); + var mockDmbProvider = new Mock(); + mockDmbProvider.SetupGet(x => x.CompileJob).Returns(mockCompileJob).Verifiable(); + var mDmbP = mockDmbProvider.Object; + + var infiniteTask = new TaskCompletionSource().Task; + + mockDmbFactory.SetupGet(x => x.OnNewerDmb).Returns(infiniteTask); + mockDmbFactory.Setup(x => x.LockNextDmb(2)).Returns(mDmbP).Verifiable(); + + var sessionsToVerify = new List>(); + + var cancellationToken = cts.Token; + mockSessionControllerFactory.Setup(x => x.LaunchNew(mockLaunchParameters, mDmbP, null, It.IsAny(), It.IsAny(), false, cancellationToken)).Returns(() => + { + var mockSession = new Mock(); + mockSession.SetupGet(x => x.Lifetime).Returns(infiniteTask).Verifiable(); + mockSession.SetupGet(x => x.OnReboot).Returns(infiniteTask).Verifiable(); + mockSession.SetupGet(x => x.Dmb).Returns(mDmbP).Verifiable(); + mockSession.SetupGet(x => x.LaunchResult).Returns(Task.FromResult(new LaunchResult + { + StartupTime = TimeSpan.FromSeconds(1) + })).Verifiable(); + sessionsToVerify.Add(mockSession); + return Task.FromResult(mockSession.Object); + }).Verifiable(); + + cts.CancelAfter(TimeSpan.FromSeconds(15)); + + try + { + await wd.Launch(cancellationToken).ConfigureAwait(false); + await wd.Terminate(false, cancellationToken).ConfigureAwait(false); + } + finally + { + cts.Cancel(); + } + Assert.AreEqual(2, sessionsToVerify.Count); + foreach (var I in sessionsToVerify) + I.VerifyAll(); + mockDmbProvider.VerifyAll(); + } + + mockSessionControllerFactory.VerifyAll(); + mockDmbFactory.VerifyAll(); + mockRestartRegistration.VerifyAll(); + mockServerControl.VerifyAll(); + mockChat.VerifyAll(); + } } }