From 0060b766b555e67b321c3554fbf04c6cc202f2d5 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 18 Feb 2022 01:17:17 +0300 Subject: [PATCH] Fix FSUtils.FileNameCorrection Unit tests and fixes --- ZeroLevel.UnitTests/FSUtilsTest.cs | 34 +++++ ZeroLevel/Services/FileSystem/FSUtils.cs | 161 ++++++++++++----------- 2 files changed, 116 insertions(+), 79 deletions(-) create mode 100644 ZeroLevel.UnitTests/FSUtilsTest.cs diff --git a/ZeroLevel.UnitTests/FSUtilsTest.cs b/ZeroLevel.UnitTests/FSUtilsTest.cs new file mode 100644 index 0000000..1e7721f --- /dev/null +++ b/ZeroLevel.UnitTests/FSUtilsTest.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using Xunit; +using ZeroLevel.Services.FileSystem; + +namespace ZeroLevel.UnitTests +{ + public class FSUtilsTest + { + [Fact] + public void FileNameCorrectionTest() + { + // Arrange + var validNames = new List { "CON1", "a.cOn.a", "$PRN", "LPT10", "lpt10.txt", "COM11.ee" }; + var invalidNames = new List { "CON", "cOn", "PRN", "LPT4", "LPT4.", "LPT4.txt", "COM1.ee" }; + var invalidRootNames = new List { "$mft", "$mftmirr", "$logfile", "$volume", "$attrdef", "$bitmap", "$boot", "$badclus", "$secure", "$upcase", "$extend", "$quota", "$objid", "$reparse" }; + // Act + + // Assert + foreach (var validName in validNames) + { + Assert.Equal(validName, FSUtils.FileNameCorrection(validName)); + } + foreach (var invalidName in invalidNames) + { + Assert.NotEqual(invalidName, FSUtils.FileNameCorrection(invalidName)); + } + foreach (var invalidName in invalidRootNames) + { + Assert.NotEqual(invalidName, FSUtils.FileNameCorrection(invalidName, true)); + } + } + } +} diff --git a/ZeroLevel/Services/FileSystem/FSUtils.cs b/ZeroLevel/Services/FileSystem/FSUtils.cs index 9eb0dc3..98f6e9a 100644 --- a/ZeroLevel/Services/FileSystem/FSUtils.cs +++ b/ZeroLevel/Services/FileSystem/FSUtils.cs @@ -59,86 +59,89 @@ namespace ZeroLevel.Services.FileSystem private static HashSet _invalidRootFileNames = new HashSet { "$mft", "$mftmirr", "$logfile", "$volume", "$attrdef", "$bitmap", "$boot", "$badclus", "$secure", "$upcase", "$extend", "$quota", "$objid", "$reparse" }; private static bool StartWithInvalidWindowsPrefix(string name) { - switch (name[0]) + if (name.Length >= 3) { - case 'a': - case 'A': - switch (name[1]) - { - case 'u': - case 'U': - switch (name[2]) - { - case 'x': - case 'X': - return name[3] == '.'; // AUX. - } - break; - } - break; - case 'c': - case 'C': - switch (name[1]) - { - case 'o': - case 'O': - switch (name[2]) - { - case 'n': - case 'N': - return name[3] == '.'; // CON. - case 'm': - case 'M': - return char.IsDigit(name[3]) && name[4] == '.'; // COM0 - COM9 - } - break; - } - break; - case 'l': - case 'L': - switch (name[1]) - { - case 'p': - case 'P': - switch (name[2]) - { - case 't': - case 'T': - return char.IsDigit(name[3]) && name[4] == '.'; // LPT0 - LPT9 - } - break; - } - break; - case 'p': - case 'P': - switch (name[1]) - { - case 'r': - case 'R': - switch (name[2]) - { - case 'n': - case 'N': - return name[3] == '.'; // PRN. - } - break; - } - break; - case 'n': - case 'N': - switch (name[1]) - { - case 'u': - case 'U': - switch (name[2]) - { - case 'l': - case 'L': - return name[3] == '.'; // NUL. - } - break; - } - break; + switch (name[0]) + { + case 'a': + case 'A': + switch (name[1]) + { + case 'u': + case 'U': + switch (name[2]) + { + case 'x': + case 'X': + return name.Length == 3 || name[3] == '.'; // AUX. + } + break; + } + break; + case 'c': + case 'C': + switch (name[1]) + { + case 'o': + case 'O': + switch (name[2]) + { + case 'n': + case 'N': + return name.Length == 3 || name[3] == '.'; // CON. + case 'm': + case 'M': + return name.Length >= 4 && char.IsDigit(name[3]) && (name.Length == 4 || name[4] == '.'); // COM0 - COM9 + } + break; + } + break; + case 'l': + case 'L': + switch (name[1]) + { + case 'p': + case 'P': + switch (name[2]) + { + case 't': + case 'T': + return name.Length >= 4 && char.IsDigit(name[3]) && (name.Length == 4 || name[4] == '.'); // LPT0 - LPT9 + } + break; + } + break; + case 'p': + case 'P': + switch (name[1]) + { + case 'r': + case 'R': + switch (name[2]) + { + case 'n': + case 'N': + return name.Length == 3 || name[3] == '.'; // PRN. + } + break; + } + break; + case 'n': + case 'N': + switch (name[1]) + { + case 'u': + case 'U': + switch (name[2]) + { + case 'l': + case 'L': + return name.Length == 3 || name[3] == '.'; // NUL. + } + break; + } + break; + } } return false; }