using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; using System.IO; using System.IO.Abstractions.TestingHelpers; 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.ThrowsExactlyAsync(() => 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.ThrowsExactlyAsync(() => program.Main(Array.Empty(), null).AsTask()); } [TestMethod] public async Task TestStandardRunWithExceptionAndWatchdog() { var mockServer = new Mock(); var mockFs = new MockFileSystem(); 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(mockFs)); mockServerFactory.Setup(x => x.CreateServer(It.IsNotNull(), It.IsAny(), It.IsAny())).ReturnsAsync(mockServer.Object); var program = new Program { ServerFactory = mockServerFactory.Object }; var tempFileName = mockFs.Path.Combine(mockFs.Path.GetTempPath(), mockFs.Path.GetRandomFileName()); mockFs.File.Delete(tempFileName); try { var result = await program.Main(Array.Empty(), tempFileName); Assert.AreEqual(HostExitCode.Error, result); Assert.AreEqual(exception.ToString(), mockFs.File.ReadAllText(tempFileName)); } finally { mockFs.File.Delete(tempFileName); } } } }