FileUtilsTest.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. namespace MeloongCore.Tests;
  2. public class FileUtilsTest : TestWithFolder {
  3. [Test]
  4. public async Task 文件可用性_只读与占用() {
  5. string path = Path.Combine(tempFolder, "available.txt");
  6. await Assert.That(FileUtils.IsAvailable(path)).IsTrue();
  7. FileUtils.Write(path, "test");
  8. string apiPath = PathUtils.ForApi(path);
  9. File.SetAttributes(apiPath, FileAttributes.ReadOnly);
  10. try {
  11. await Assert.That(FileUtils.IsAvailable(path)).IsTrue();
  12. await Assert.That((File.GetAttributes(apiPath) & FileAttributes.ReadOnly) != 0).IsTrue();
  13. } finally {
  14. File.SetAttributes(apiPath, FileAttributes.Normal);
  15. }
  16. using (var stream = new FileStream(apiPath, FileMode.Open, FileAccess.Read, FileShare.None)) {
  17. await Assert.That(FileUtils.IsAvailable(path)).IsFalse();
  18. }
  19. await Assert.That(FileUtils.IsAvailable(path)).IsTrue();
  20. }
  21. [Test]
  22. public async Task 文件可用性_短暂占用后重试() {
  23. string path = Path.Combine(tempFolder, "temporary-lock.txt");
  24. FileUtils.Write(path, "test");
  25. using var stream = new FileStream(PathUtils.ForApi(path), FileMode.Open, FileAccess.Read, FileShare.None);
  26. var release = Task.Run(async () => {
  27. await Task.Delay(100);
  28. stream.Dispose();
  29. });
  30. bool available = FileUtils.IsAvailable(path);
  31. await release;
  32. await Assert.That(available).IsTrue();
  33. }
  34. #region 解压
  35. [Test]
  36. [Arguments("GB Encoding.zip")]
  37. [Arguments("UTF8 Encoding.zip")]
  38. public async Task 解压_ReadZip(string testFile) {
  39. string output = Path.Combine(tempFolder, "Extracted");
  40. var p = new ProgressProvider();
  41. FileUtils.ExtractToDirectory(GetTestFile(testFile), output, p: p);
  42. await Assert.That(p.IsFinished).IsTrue();
  43. await Assert.That(DirectoryUtils.Exists(Path.Combine(output, "文件夹"))).IsTrue();
  44. await Assert.That(DirectoryUtils.Exists(Path.Combine(output, "空文件夹"))).IsFalse();
  45. await Assert.That(File.ReadAllText(PathUtils.ToExtendedFormat(Path.Combine(output, "fabricloader.log")))).Contains("FabricLoader");
  46. await Assert.That(File.ReadAllText(PathUtils.ToExtendedFormat(Path.Combine(output, "文件夹", "中文文件.txt")))).Contains("测试内容");
  47. }
  48. [Test]
  49. [Arguments("GZ.gz", "LTCat")]
  50. public async Task 解压_ReadGz(string testFile, string containsText) {
  51. string output = Path.Combine(tempFolder, "Extracted");
  52. var p = new ProgressProvider();
  53. FileUtils.ExtractToDirectory(GetTestFile(testFile), output, p: p);
  54. await Assert.That(p.IsFinished).IsTrue();
  55. await Assert.That(File.ReadAllText(PathUtils.ToExtendedFormat(Path.Combine(output, PathUtils.GetFileNameWithoutExtension(testFile))))).Contains(containsText);
  56. }
  57. [Test]
  58. [Arguments("Corrupted.zip")]
  59. [Arguments("Not zip.zip")]
  60. [Arguments("DotDot ZipSlip.zip")]
  61. [Arguments("AbsPath ZipSlip.zip")]
  62. public void 解压_ReadBad(string testFile)
  63. => Assert.Throws<InvalidDataException>(() => FileUtils.ExtractToDirectory(GetTestFile(testFile), tempFolder));
  64. #endregion
  65. }