using System; using System.IO; using System.IO.Abstractions.TestingHelpers; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using Tgstation.Server.Host.Configuration; using Tgstation.Server.Host.IO; using Tgstation.Server.Host.System; using Tgstation.Server.Host.Transfer; namespace Tgstation.Server.Host.Components.StaticFiles.Tests { [TestClass] public sealed class TestConfiguration { /// /// Regression test for https://github.com/tgstation/tgstation-server/issues/1617. /// [TestMethod] public async Task TestListOrdering() { using var loggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); builder.SetMinimumLevel(LogLevel.Trace); }); var mockFs = new MockFileSystem(); var tempPath = Path.GetTempFileName(); File.Delete(tempPath); var ioManager = new DefaultIOManager(mockFs).CreateResolverForSubdirectory(tempPath); await ioManager.CreateDirectory(".", CancellationToken.None); try { await ioManager.WriteAllBytes("a.txt", Array.Empty(), CancellationToken.None); await ioManager.WriteAllBytes("c.txt", Array.Empty(), CancellationToken.None); await ioManager.WriteAllBytes("d.txt", Array.Empty(), CancellationToken.None); await ioManager.CreateDirectory("a", CancellationToken.None); await ioManager.CreateDirectory("c", CancellationToken.None); await ioManager.CreateDirectory("d", CancellationToken.None); var configuration = new Configuration( ioManager, new SynchronousIOManager( mockFs, loggerFactory.CreateLogger()), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of(), Mock.Of>(), Mock.Of>(), loggerFactory.CreateLogger(), new Models.Instance { Path = "Some path", }); await configuration.StartAsync(CancellationToken.None); var listResponse = (await configuration.ListDirectory(".", null, CancellationToken.None)).ToList(); Assert.AreEqual(9, listResponse.Count); Assert.AreEqual("a", listResponse[0].Path[2..]); Assert.AreEqual("c", listResponse[1].Path[2..]); Assert.AreEqual("CodeModifications", listResponse[2].Path[2..]); Assert.AreEqual("d", listResponse[3].Path[2..]); Assert.AreEqual("EventScripts", listResponse[4].Path[2..]); Assert.AreEqual("GameStaticFiles", listResponse[5].Path[2..]); Assert.AreEqual("a.txt", listResponse[6].Path[2..]); Assert.AreEqual("c.txt", listResponse[7].Path[2..]); Assert.AreEqual("d.txt", listResponse[8].Path[2..]); await ioManager.CreateDirectory("GameStaticFiles/config/title_screens", CancellationToken.None); await ioManager.CreateDirectory("GameStaticFiles/config/title_music", CancellationToken.None); await ioManager.WriteAllBytes("GameStaticFiles/config/word_filter.toml", Array.Empty(), CancellationToken.None); await ioManager.WriteAllBytes("GameStaticFiles/config/whitelist.txt", Array.Empty(), CancellationToken.None); await ioManager.WriteAllBytes("GameStaticFiles/config/unbuyableshuttles.txt", Array.Empty(), CancellationToken.None); await ioManager.WriteAllBytes("GameStaticFiles/config/spaceruinblacklist.txt", Array.Empty(), CancellationToken.None); listResponse = (await configuration.ListDirectory("GameStaticFiles/config", null, CancellationToken.None)).ToList(); var substringStart = "GameStaticFiles/config".Length + 1; Assert.AreEqual(6, listResponse.Count); Assert.AreEqual("title_music", listResponse[0].Path[substringStart..]); Assert.AreEqual("title_screens", listResponse[1].Path[substringStart..]); Assert.AreEqual("spaceruinblacklist.txt", listResponse[2].Path[substringStart..]); Assert.AreEqual("unbuyableshuttles.txt", listResponse[3].Path[substringStart..]); Assert.AreEqual("whitelist.txt", listResponse[4].Path[substringStart..]); Assert.AreEqual("word_filter.toml", listResponse[5].Path[substringStart..]); } finally { await ioManager.DeleteDirectory(tempPath, CancellationToken.None); } } } }