Procházet zdrojové kódy

test: Compression_ReadGz

龙腾猫跃 před 5 měsíci
rodič
revize
70983c3bfa

+ 2 - 1
Shared/Utils/FileUtils.cs

@@ -185,6 +185,7 @@ public static class FileUtils {
             using var fileStream = FileUtils.ReadAsStream(compressionFile);
             using var gzipStream = new GZipStream(fileStream, CompressionMode.Decompress);
             FileUtils.Write(Path.Combine(outputDirectory, Path.GetFileNameWithoutExtension(compressionFile)), gzipStream);
+            progressHandler?.Invoke(1);
             return;
         }
         // 解压 zip
@@ -193,7 +194,7 @@ public static class FileUtils {
         int doneCount = 0;
         foreach (var entry in archive.Entries) {
             doneCount++;
-            if (progressHandler != null && totalCount > 0) progressHandler((double) doneCount / totalCount);
+            if (totalCount > 0) progressHandler?.Invoke((double) doneCount / totalCount);
             if (string.IsNullOrEmpty(entry.Name)) continue; // 跳过文件夹条目(ZipArchive 会将文件夹也作为一个 entry,但它们的 Name 为空)
             // ZipSlip 修复
             string outputFilePath = PathUtils.WithLongPath(Path.GetFullPath(Path.Combine(outputDirectory, entry.FullName)));

+ 5 - 0
Tests/MeloongCore.Tests.csproj

@@ -14,6 +14,8 @@
 	<ItemGroup>
 	  <None Remove="TestFiles\FileUtils\Corrupted.zip" />
 	  <None Remove="TestFiles\FileUtils\GB Encoding.zip" />
+	  <None Remove="TestFiles\FileUtils\GZ.gz" />
+	  <None Remove="TestFiles\FileUtils\Gzip.gz" />
 	  <None Remove="TestFiles\FileUtils\Not zip.zip" />
 	  <None Remove="TestFiles\FileUtils\UTF8 Encoding.zip" />
 	</ItemGroup>
@@ -39,6 +41,9 @@
 	  <Content Include="TestFiles\FileUtils\GB Encoding.zip">
 	    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
 	  </Content>
+	  <Content Include="TestFiles\FileUtils\GZ.gz">
+	    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+	  </Content>
 	  <Content Include="TestFiles\FileUtils\UTF8 Encoding.zip">
 	    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
 	  </Content>

binární
Tests/TestFiles/FileUtils/GZ.gz


+ 2 - 2
Tests/TestUtils.cs

@@ -8,9 +8,9 @@ public abstract class TestWithFolder {
 
     /// <summary>
     /// 测试用的临时文件夹路径。
-    /// 这是一个包含特殊字符的长路径,以 \ 结尾。
+    /// 这是一个包含特殊字符的长路径,不以 \\?\ 开头,以 \ 结尾。
     /// </summary>
-    private readonly string tempFolder;
+    public readonly string tempFolder;
     public TestWithFolder() {
         tempFolder = Path.Combine(
             Path.GetTempPath(), "PCL", "Tests",

+ 22 - 117
Tests/Utils/FileUtilsTest.cs

@@ -1,5 +1,3 @@
-using System.IO.Compression;
-
 namespace MeloongCore.Tests;
 public class FileUtilsTest : TestWithFolder {
 
@@ -8,108 +6,32 @@ public class FileUtilsTest : TestWithFolder {
     [Theory]
     [InlineData("GB Encoding.zip")]
     [InlineData("UTF8 Encoding.zip")]
-    public void OpenZip_Successful(string testFile) {
-        using var archive = FileUtils.OpenZip(GetTestFile(testFile));
-        Assert.Contains(archive.Entries, e => e.Name == "中文文件.txt");
-        Assert.Contains(archive.Entries, e => e.Name == "fabricloader.log");
-        Assert.DoesNotContain(archive.Entries, e => e.Name == "fabricloader.log2");
+    public void Compression_ReadZip(string testFile) {
+        double progress = 0;
+        string output = Path.Combine(tempFolder, "Extracted");
+        FileUtils.ExtractToDirectory(GetTestFile(testFile), output, p => progress = p);
+        Assert.Equal(1, progress);
+        Assert.True(DirectoryUtils.Exists(Path.Combine(output, "文件夹")));
+        Assert.False(DirectoryUtils.Exists(Path.Combine(output, "空文件夹")));
+        Assert.Contains("FabricLoader", File.ReadAllText(PathUtils.WithLongPath(Path.Combine(output, "fabricloader.log"))));
+        Assert.Contains("测试内容", File.ReadAllText(PathUtils.WithLongPath(Path.Combine(output, "文件夹", "中文文件.txt"))));
     }
 
     [Theory]
-    [InlineData("Corrupted.zip")]
-    [InlineData("Not zip.zip")]
-    public void OpenZip_Corrupted(string testFile) {
-        Assert.Throws<InvalidDataException>(() => FileUtils.OpenZip(GetTestFile(testFile)));
+    [InlineData("GZ.gz", "LTCat")]
+    public void Compression_ReadGz(string testFile, string containsText) {
+        double progress = 0;
+        string output = Path.Combine(tempFolder, "Extracted");
+        FileUtils.ExtractToDirectory(GetTestFile(testFile), output, p => progress = p);
+        Assert.Equal(1, progress);
+        Assert.Contains(containsText, File.ReadAllText(PathUtils.WithLongPath(Path.Combine(output, Path.GetFileNameWithoutExtension(testFile)))));
     }
 
-    [Fact(DisplayName = nameof(ExtractToDirectory))]
-    public void ExtractToDirectory() {
-
-
-
-
-
-        //const string fileContent = "hello extract";
-        //string zipPath = CreateZipWithEncoding("single.zip", new UTF8Encoding(false, true),
-        //    ("file.txt", fileContent));
-        //string outDir = Path.Combine(_tempDir, "out_single");
-        //
-        //FileUtils.ExtractToDirectory(zipPath, outDir);
-        //
-        //string extractedFile = Path.Combine(outDir, "file.txt");
-        //Assert.True(File.Exists(extractedFile));
-        //Assert.Equal(fileContent, ReadFile(extractedFile));
-        //
-        //string zipPath = CreateZipWithEncoding("multi_extract.zip", new UTF8Encoding(false, true),
-        //    ("a.txt", "aaa"),
-        //    ("b.txt", "bbb"));
-        //string outDir = Path.Combine(_tempDir, "out_multi");
-        //
-        //FileUtils.ExtractToDirectory(zipPath, outDir);
-        //
-        //Assert.True(File.Exists(Path.Combine(outDir, "a.txt")));
-        //Assert.True(File.Exists(Path.Combine(outDir, "b.txt")));
-        //
-        //string zipPath = CreateZipWithEncoding("subdir.zip", new UTF8Encoding(false, true),
-        //    ("subdir/nested.txt", "nested content"));
-        //string outDir = Path.Combine(_tempDir, "out_subdir");
-        //
-        //FileUtils.ExtractToDirectory(zipPath, outDir);
-        //
-        //string nestedFile = Path.Combine(outDir, "subdir", "nested.txt");
-        //Assert.True(File.Exists(nestedFile));
-        //Assert.Equal("nested content", ReadFile(nestedFile));
-        //
-        //string zipPath = CreateZipWithEncoding("autocreate.zip", new UTF8Encoding(false, true),
-        //    ("f.txt", "x"));
-        //string outDir = Path.Combine(_tempDir, "nonexistent", "deep", "dir");
-        //
-        //FileUtils.ExtractToDirectory(zipPath, outDir);
-        //
-        //Assert.True(Directory.Exists(outDir));
-        //
-        //string zipPath = CreateZipWithEncoding("overwrite.zip", new UTF8Encoding(false, true),
-        //    ("f.txt", "new content"));
-        //string outDir = Path.Combine(_tempDir, "out_overwrite");
-        //Directory.CreateDirectory(outDir);
-        //File.WriteAllText(Path.Combine(outDir, "f.txt"), "old content");
-        //
-        //FileUtils.ExtractToDirectory(zipPath, outDir);
-        //
-        //Assert.Equal("new content", ReadFile(Path.Combine(outDir, "f.txt")));
-        //
-        //// 手动构造一个包含路径穿越条目(../../evil.txt)的 zip
-        //string zipPath = Path.Combine(_tempDir, "zipslip.zip");
-        //using (var stream = File.Create(zipPath))
-        //using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, leaveOpen: false, new UTF8Encoding(false, true))) {
-        //    var entry = archive.CreateEntry("../../evil.txt");
-        //    using var writer = new StreamWriter(entry.Open());
-        //    writer.Write("pwned");
-        //}
-        //string outDir = Path.Combine(_tempDir, "out_zipslip");
-        //Directory.CreateDirectory(outDir);
-        //
-        //Assert.Throws<UnauthorizedAccessException>(() => FileUtils.ExtractToDirectory(zipPath, outDir));
-        //
-        //const string innerContent = "gzip content";
-        //const string innerFileName = "inner.txt";
-        //string gzPath = CreateGzFile(innerFileName, innerContent);
-        //string outDir = Path.Combine(_tempDir, "out_gz");
-        //
-        //FileUtils.ExtractToDirectory(gzPath, outDir);
-        //
-        //string extractedFile = Path.Combine(outDir, innerFileName);
-        //Assert.True(File.Exists(extractedFile));
-        //Assert.Equal(innerContent, ReadFile(extractedFile));
-        //
-        //// jar 文件实际上是 zip 格式
-        //string zipPath = CreateZipWithEncoding("app.jar", new UTF8Encoding(false, true),
-        //    ("META-INF/MANIFEST.MF", "Manifest-Version: 1.0\r\n"));
-        //string outDir = Path.Combine(_tempDir, "out_jar");
-        //
-        //FileUtils.ExtractToDirectory(zipPath, outDir);
-        //
-        //Assert.True(File.Exists(Path.Combine(outDir, "META-INF", "MANIFEST.MF")));
+    [Theory]
+    [InlineData("Corrupted.zip")]
+    [InlineData("Not zip.zip")]
+    public void Compression_ReadBad(string testFile) {
+        Assert.Throws<InvalidDataException>(() => FileUtils.ExtractToDirectory(GetTestFile(testFile), tempFolder));
     }
 
     #endregion
@@ -118,24 +40,7 @@ public class FileUtilsTest : TestWithFolder {
 
 
     /*
-    #region 辅助方法
-
-    /// <summary>
-    /// 创建一个包含若干文件的临时文件夹,并返回该文件夹路径。
-    /// </summary>
-    private string CreateSourceDirectory(params (string relativePath, string content)[] files) {
-        string dir = Path.Combine(_tempDir, "src_" + Guid.NewGuid().ToString("N"));
-        Directory.CreateDirectory(dir);
-        foreach (var (relativePath, content) in files) {
-            string fullPath = Path.Combine(dir, relativePath);
-            Directory.CreateDirectory(Path.GetDirectoryName(fullPath)!);
-            File.WriteAllText(fullPath, content, Encoding.UTF8);
-        }
-        return dir;
-    }
-
-    #endregion
-
+     * 
     #region CreateZipFromDirectory 测试