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