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);
}
}
}
}