using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; using System.IO; using System.Threading; using System.Threading.Tasks; using Tgstation.Server.Host.Common; using Tgstation.Server.Host.IO; using Tgstation.Server.Host.System; namespace Tgstation.Server.Host.Tests { /// /// Tests for . /// [TestClass] public sealed class TestProgram { [TestMethod] public async Task TestIncompatibleWatchdog() { await Assert.ThrowsExceptionAsync(() => Program.Main(new string[] { "garbage", "0.0.1" })); } [TestMethod] public async Task TestStandardRun() { var mockServer = new Mock(); mockServer.Setup(x => x.Run(It.IsAny())).Returns(ValueTask.CompletedTask); mockServer.SetupGet(x => x.RestartRequested).Returns(false); var mockServerFactory = new Mock(); mockServerFactory.Setup(x => x.CreateServer(It.IsNotNull(), It.IsAny(), It.IsAny())).ReturnsAsync(mockServer.Object); var program = new Program { ServerFactory = mockServerFactory.Object }; var result = await program.Main(Array.Empty(), null); Assert.AreEqual(HostExitCode.CompleteExecution, result); } [TestMethod] public async Task TestStandardRunWithRestart() { var mockServer = new Mock(); mockServer.Setup(x => x.Run(It.IsAny())).Returns(ValueTask.CompletedTask); mockServer.SetupGet(x => x.RestartRequested).Returns(true); var mockServerFactory = new Mock(); mockServerFactory.Setup(x => x.CreateServer(It.IsNotNull(), It.IsAny(), It.IsAny())).ReturnsAsync(mockServer.Object); var program = new Program { ServerFactory = mockServerFactory.Object }; var result = await program.Main(Array.Empty(), null); Assert.AreEqual(HostExitCode.RestartRequested, result); } [TestMethod] public async Task TestStandardRunWithException() { var mockServer = new Mock(); mockServer.Setup(x => x.Run(It.IsAny())).Throws(new DivideByZeroException()); mockServer.SetupGet(x => x.RestartRequested).Returns(true); var mockServerFactory = new Mock(); mockServerFactory.Setup(x => x.CreateServer(It.IsNotNull(), It.IsAny(), It.IsAny())).ReturnsAsync(mockServer.Object); var program = new Program { ServerFactory = mockServerFactory.Object }; await Assert.ThrowsExceptionAsync(() => program.Main(Array.Empty(), null).AsTask()); } [TestMethod] public async Task TestStandardRunWithExceptionAndWatchdog() { var mockServer = new Mock(); var exception = new DivideByZeroException(); mockServer.Setup(x => x.Run(It.IsAny())).Throws(exception); mockServer.SetupGet(x => x.RestartRequested).Returns(true); var mockServerFactory = new Mock(); mockServerFactory.SetupGet(x => x.IOManager).Returns(new DefaultIOManager()); mockServerFactory.Setup(x => x.CreateServer(It.IsNotNull(), It.IsAny(), It.IsAny())).ReturnsAsync(mockServer.Object); var program = new Program { ServerFactory = mockServerFactory.Object }; var tempFileName = Path.GetTempFileName(); File.Delete(tempFileName); try { var result = await program.Main(Array.Empty(), tempFileName); Assert.AreEqual(HostExitCode.Error, result); Assert.AreEqual(exception.ToString(), File.ReadAllText(tempFileName)); } finally { File.Delete(tempFileName); } } } }