using System; using System.IO; using System.Threading; using System.Threading.Tasks; using LibGit2Sharp; using Microsoft.Extensions.Logging; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; namespace Tgstation.Server.Host.Components.Repository.Tests { /// /// Tests for . /// [TestClass] public sealed class TestRepositoryFactory { static LibGit2RepositoryFactory CreateFactory() => new(Mock.Of>()); static async Task TestRepoLoading( string path, ILibGit2RepositoryFactory repositoryFactory = null) => (await (repositoryFactory ?? CreateFactory()) .CreateFromPath(path, default)); [TestMethod] public void TestConstructionThrows() => Assert.ThrowsExactly(() => new LibGit2RepositoryFactory(null)); [TestMethod] public void TestInMemoryRepoCreation() { new LibGit2RepositoryFactory(Mock.Of>()).CreateInMemory(); } [TestMethod] public async Task TestCloning() { var tempDir = Path.GetTempFileName(); File.Delete(tempDir); try { var factory = CreateFactory(); var cloneOpts = new CloneOptions(); cloneOpts.FetchOptions.CredentialsProvider = await factory.GenerateCredentialsHandler(Mock.Of(), null, null, CancellationToken.None); await factory.Clone( new Uri("https://github.com/Cyberboss/Test"), cloneOpts, tempDir, default); using var repo = await TestRepoLoading(tempDir); var gitObject = repo.Lookup("f636418bf47d238d33b0e4a34f0072b23a8aad0e"); Assert.IsNotNull(gitObject); var commit = gitObject.Peel(); Assert.AreEqual("Update Test.md", commit.Message); } finally { // Takes a while to release the repo handle sometimes... for (var i = 0; i < 5; ++i) { try { Directory.Delete(tempDir, true); break; } catch (UnauthorizedAccessException) { await Task.Delay(TimeSpan.FromSeconds(3)); } } } } } }