using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using System; using System.IO; using System.Threading; using System.Threading.Tasks; 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(Task.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); Program.ServerFactory = mockServerFactory.Object; var result = await Program.Main(Array.Empty()); Assert.AreEqual(0, result); } [TestMethod] public async Task TestStandardRunWithRestart() { var mockServer = new Mock(); mockServer.Setup(x => x.Run(It.IsAny())).Returns(Task.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); Program.ServerFactory = mockServerFactory.Object; var result = await Program.Main(Array.Empty()); Assert.AreEqual(1, 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); Program.ServerFactory = mockServerFactory.Object; await Assert.ThrowsExceptionAsync(() => Program.Main(Array.Empty())); } [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(new AssemblyInformationProvider())); mockServerFactory.Setup(x => x.CreateServer(It.IsNotNull(), It.IsAny(), It.IsAny())).ReturnsAsync(mockServer.Object); Program.ServerFactory = mockServerFactory.Object; var tempFileName = Path.GetTempFileName(); File.Delete(tempFileName); try { var result = await Program.Main(new string[] { tempFileName }); Assert.AreEqual(2, result); Assert.AreEqual(exception.ToString(), File.ReadAllText(tempFileName)); } finally { File.Delete(tempFileName); } } } }