diff --git a/tests/Tgstation.Server.Host.Tests/Components/Repository/TestRepositoryManager.cs b/tests/Tgstation.Server.Host.Tests/Components/Repository/TestRepositoryManager.cs new file mode 100644 index 0000000000..c4a17f5140 --- /dev/null +++ b/tests/Tgstation.Server.Host.Tests/Components/Repository/TestRepositoryManager.cs @@ -0,0 +1,133 @@ +using System; +using System.IO.Pipelines; +using System.Threading; +using System.Threading.Tasks; + +using LibGit2Sharp; + +using Microsoft.Extensions.Logging; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +using Moq; + +using Remora.Rest.Core; + +using Tgstation.Server.Host.Components.Events; +using Tgstation.Server.Host.Configuration; +using Tgstation.Server.Host.IO; + +namespace Tgstation.Server.Host.Components.Repository.Tests +{ + [TestClass] + public sealed class TestRepositoryManager + { + const string TestRepoPath = "adfiwurjwhouerfiunfjdfn"; + + RepositoryManager repositoryManager; + Mock mockRepoFactory; + Mock mockCommands; + Mock mockIOManager; + Mock mockGitRemoteFeaturesFactory; + + [TestInitialize] + public void Initialize() + { + mockIOManager = new Mock(); + mockRepoFactory = new Mock(); + mockCommands = new Mock(); + mockGitRemoteFeaturesFactory = new Mock(); + + mockIOManager.Setup(x => x.ResolvePath()).Returns(TestRepoPath); + + repositoryManager = new RepositoryManager( + mockRepoFactory.Object, + mockCommands.Object, + mockIOManager.Object, + Mock.Of(), + Mock.Of(), + mockGitRemoteFeaturesFactory.Object, + Mock.Of>(), + Mock.Of>(), + new GeneralConfiguration()); + } + + [TestCleanup] + public void TestCleanup() => repositoryManager.Dispose(); + + [TestMethod] + public async Task TestCloneAbortsIfRepoExists() + { + mockIOManager.Setup(x => x.DirectoryExists(TestRepoPath, It.IsAny())).ReturnsAsync(true).Verifiable(); + + using var cloneResult = await repositoryManager.CloneRepository( + new Uri("https://github.com/Cyberboss/common_core"), + null, + null, + null, + null, + false, + CancellationToken.None); + + Assert.IsNull(cloneResult); + + mockIOManager.VerifyAll(); + } + + [TestMethod] + public async Task TestBasicClone() + { + mockIOManager.Setup(x => x.DirectoryExists(TestRepoPath, It.IsAny())).ReturnsAsync(false).Verifiable(); + var mockRepo = new Mock(); + + mockRepoFactory.Setup(x => x.CreateFromPath(TestRepoPath, It.IsAny())).ReturnsAsync(mockRepo.Object).Verifiable(); + + using var cloneResult = await repositoryManager.CloneRepository( + new Uri("https://github.com/Cyberboss/common_core"), + null, + null, + null, + null, + false, + CancellationToken.None); + + Assert.IsNotNull(cloneResult); + + mockRepoFactory.VerifyAll(); + mockIOManager.VerifyAll(); + } + + [TestMethod] + public async Task TestBasicLoad() + { + mockIOManager.Setup(x => x.DirectoryExists(TestRepoPath, It.IsAny())).ReturnsAsync(false).Verifiable(Times.Never); + var mockRepo = new Mock(); + + mockRepoFactory.Setup(x => x.CreateFromPath(TestRepoPath, It.IsAny())).ReturnsAsync(mockRepo.Object).Verifiable(); + + using var loadResult = await repositoryManager.LoadRepository( + CancellationToken.None); + + Assert.IsNotNull(loadResult); + + mockRepoFactory.VerifyAll(); + mockIOManager.VerifyAll(); + } + + [TestMethod] + public async Task TestLoadFailsIfRepoDoesntExist() + { + mockIOManager.Setup(x => x.DirectoryExists(TestRepoPath, It.IsAny())).ReturnsAsync(false).Verifiable(Times.Never); + var mockRepo = new Mock(); + + mockRepoFactory.Setup(x => x.CreateFromPath(TestRepoPath, It.IsAny())).ThrowsAsync(new RepositoryNotFoundException()).Verifiable(); + + using var loadResult = await repositoryManager.LoadRepository( + CancellationToken.None); + + Assert.IsNull(loadResult); + + mockRepoFactory.VerifyAll(); + mockIOManager.VerifyAll(); + } + } +} diff --git a/tests/Tgstation.Server.Tests/Live/TestLiveServer.cs b/tests/Tgstation.Server.Tests/Live/TestLiveServer.cs index f4d9295c59..cbd5181b56 100644 --- a/tests/Tgstation.Server.Tests/Live/TestLiveServer.cs +++ b/tests/Tgstation.Server.Tests/Live/TestLiveServer.cs @@ -1006,6 +1006,8 @@ namespace Tgstation.Server.Tests.Live using var hardCancellationTokenSource = new CancellationTokenSource(TimeSpan.FromMinutes(maximumTestMinutes)); var hardCancellationToken = hardCancellationTokenSource.Token; + hardCancellationToken.Register(() => Console.WriteLine("TGS TEST CANCELLED TOKEN DUE TO TIMEOUT")); + ServiceCollectionExtensions.UseAdditionalLoggerProvider(); var failureTask = HardFailLoggerProvider.FailureSource; @@ -1016,6 +1018,7 @@ namespace Tgstation.Server.Tests.Live if (!internalTask.IsCompleted) { + Console.WriteLine("TGS TEST CANCELLING TOKEN DUE TO ERROR"); hardCancellationTokenSource.Cancel(); try { @@ -1441,6 +1444,7 @@ namespace Tgstation.Server.Tests.Live } finally { + Console.WriteLine("TGS TEST CANCELLING TOKEN AS FINAL STEP"); serverCts.Cancel(); try {