FileUtilsTest.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. namespace MeloongCore.Tests;
  2. public class FileUtilsTest : TestWithFolder {
  3. [Test]
  4. [Arguments(false)]
  5. [Arguments(true)]
  6. public async Task 土耳其语_文件同源及仅改大小写保留内容(bool copy) {
  7. var originalCulture = System.Globalization.CultureInfo.CurrentCulture;
  8. string root = tempFolder;
  9. string source = Path.Combine(root, "FILE.txt");
  10. string destination = Path.Combine(root, "file.txt");
  11. try {
  12. System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("tr-TR");
  13. DirectoryUtils.Create(root);
  14. FileUtils.Write(source, "文件内容");
  15. if (copy) {
  16. FileUtils.Copy(source, source);
  17. FileUtils.Copy(source, destination);
  18. } else {
  19. FileUtils.Move(source, source);
  20. FileUtils.Move(source, destination);
  21. }
  22. await Assert.That(FileUtils.ReadAsString(destination)).IsEqualTo("文件内容");
  23. await Assert.That(Directory.GetFiles(PathUtils.ForApi(root)).Select(Path.GetFileName).Single()).IsEqualTo("file.txt");
  24. } finally {
  25. System.Globalization.CultureInfo.CurrentCulture = originalCulture;
  26. DirectoryUtils.Delete(root);
  27. }
  28. }
  29. [Test]
  30. public async Task 文件可用性_只读与占用() {
  31. string path = Path.Combine(tempFolder, "available.txt");
  32. await Assert.That(FileUtils.IsAvailable(path)).IsTrue();
  33. FileUtils.Write(path, "test");
  34. string apiPath = PathUtils.ForApi(path);
  35. File.SetAttributes(apiPath, FileAttributes.ReadOnly);
  36. try {
  37. await Assert.That(FileUtils.IsAvailable(path)).IsTrue();
  38. await Assert.That((File.GetAttributes(apiPath) & FileAttributes.ReadOnly) != 0).IsTrue();
  39. } finally {
  40. File.SetAttributes(apiPath, FileAttributes.Normal);
  41. }
  42. using (var stream = new FileStream(apiPath, FileMode.Open, FileAccess.Read, FileShare.None)) {
  43. await Assert.That(FileUtils.IsAvailable(path)).IsFalse();
  44. }
  45. await Assert.That(FileUtils.IsAvailable(path)).IsTrue();
  46. }
  47. [Test]
  48. public async Task 文件可用性_短暂占用后重试() {
  49. string path = Path.Combine(tempFolder, "temporary-lock.txt");
  50. FileUtils.Write(path, "test");
  51. using var stream = new FileStream(PathUtils.ForApi(path), FileMode.Open, FileAccess.Read, FileShare.None);
  52. var release = Task.Run(async () => {
  53. await Task.Delay(100);
  54. stream.Dispose();
  55. });
  56. bool available = FileUtils.IsAvailable(path);
  57. await release;
  58. await Assert.That(available).IsTrue();
  59. }
  60. #region 解压
  61. [Test]
  62. [Arguments("GB Encoding.zip")]
  63. [Arguments("UTF8 Encoding.zip")]
  64. public async Task 解压_ReadZip(string testFile) {
  65. string output = Path.Combine(tempFolder, "Extracted");
  66. var p = new ProgressProvider();
  67. FileUtils.ExtractToDirectory(GetTestFile(testFile), output, p: p);
  68. await Assert.That(p.IsFinished).IsTrue();
  69. await Assert.That(DirectoryUtils.Exists(Path.Combine(output, "文件夹"))).IsTrue();
  70. await Assert.That(DirectoryUtils.Exists(Path.Combine(output, "空文件夹"))).IsFalse();
  71. await Assert.That(File.ReadAllText(PathUtils.ToExtendedFormat(Path.Combine(output, "fabricloader.log")))).Contains("FabricLoader");
  72. await Assert.That(File.ReadAllText(PathUtils.ToExtendedFormat(Path.Combine(output, "文件夹", "中文文件.txt")))).Contains("测试内容");
  73. }
  74. [Test]
  75. [Arguments("GZ.gz", "LTCat")]
  76. public async Task 解压_ReadGz(string testFile, string containsText) {
  77. string output = Path.Combine(tempFolder, "Extracted");
  78. var p = new ProgressProvider();
  79. FileUtils.ExtractToDirectory(GetTestFile(testFile), output, p: p);
  80. await Assert.That(p.IsFinished).IsTrue();
  81. await Assert.That(File.ReadAllText(PathUtils.ToExtendedFormat(Path.Combine(output, PathUtils.GetFileNameWithoutExtension(testFile))))).Contains(containsText);
  82. }
  83. [Test]
  84. [Arguments("Corrupted.zip")]
  85. [Arguments("Not zip.zip")]
  86. [Arguments("DotDot ZipSlip.zip")]
  87. [Arguments("AbsPath ZipSlip.zip")]
  88. public void 解压_ReadBad(string testFile)
  89. => Assert.Throws<InvalidDataException>(() => FileUtils.ExtractToDirectory(GetTestFile(testFile), tempFolder));
  90. #endregion
  91. }