diff options
author | Jeremy Kuhne <jeremy.kuhne@microsoft.com> | 2018-05-01 23:22:42 +0300 |
---|---|---|
committer | Jeremy Kuhne <jeremy.kuhne@microsoft.com> | 2018-05-02 00:47:30 +0300 |
commit | 77732da1052923259a7668540ee62bf48d35956e (patch) | |
tree | 761a1e549c15325d634fa5ed9b39d42cb9e997d9 /src/System.IO.FileSystem/tests | |
parent | 16daef3ad34ca954681a00e9239172baf89e3f2d (diff) |
Port #29413 to release branch
Enumerating strings should retain trailing separators
(#29413)
This is a regression introduced by the enumeration overhaul. We didn't have tests that covered trailing separators in the specified root directory when enumerating. They should be retained as is.
Diffstat (limited to 'src/System.IO.FileSystem/tests')
4 files changed, 53 insertions, 0 deletions
diff --git a/src/System.IO.FileSystem/tests/Directory/GetFiles.cs b/src/System.IO.FileSystem/tests/Directory/GetFiles.cs index 79c22762df..7a8a36bde6 100644 --- a/src/System.IO.FileSystem/tests/Directory/GetFiles.cs +++ b/src/System.IO.FileSystem/tests/Directory/GetFiles.cs @@ -147,6 +147,8 @@ namespace System.IO.Tests public class Directory_GetFiles_str_str_so : Directory_GetFileSystemEntries_str_str_so { + public virtual bool IsDirectoryInfo => false; + protected override bool TestFiles { get { return true; } } protected override bool TestDirectories { get { return false; } } @@ -164,5 +166,32 @@ namespace System.IO.Tests { return Directory.GetFiles(path, searchPattern, option); } + + [Theory, MemberData(nameof(TrailingSeparators))] + public void DirectoryWithTrailingSeparators(string trailing) + { + // When getting strings back we should retain the root path as specified for Directory. + // DirectoryInfo returns the normalized full path in all cases. + + // Add the trailing separator up front for Directory as we want to validate against + // the path _with_ the separator on it. Creation doesn't care about trailing, and + // Path.Combine doesn't change the existing separators, it just adds the canonical + // separator if needed. + string root = GetTestFilePath() + (IsDirectoryInfo ? "" : trailing); + string rootFile = Path.Combine(root, GetTestFileName()); + string subDirectory = Path.Combine(root, GetTestFileName()); + string nestedFile = Path.Combine(subDirectory, GetTestFileName()); + + Directory.CreateDirectory(subDirectory); + File.Create(rootFile).Dispose(); + File.Create(nestedFile).Dispose(); + + // Add the trailing separator if we haven't (for DI) so we can validate that we + // either retain (D) or don't retain (DI) the separators as we specified them. + // Note that some of the cases actually match canonical (one standard separator) + // so they never change. + string[] files = GetEntries(root + (IsDirectoryInfo ? trailing : ""), "*", SearchOption.AllDirectories); + FSAssert.EqualWhenOrdered(new string[] { rootFile, nestedFile }, files); + } } } diff --git a/src/System.IO.FileSystem/tests/DirectoryInfo/EnumerableAPIs.cs b/src/System.IO.FileSystem/tests/DirectoryInfo/EnumerableAPIs.cs index 8be99d828c..dd1875a2d5 100644 --- a/src/System.IO.FileSystem/tests/DirectoryInfo/EnumerableAPIs.cs +++ b/src/System.IO.FileSystem/tests/DirectoryInfo/EnumerableAPIs.cs @@ -32,6 +32,8 @@ namespace System.IO.Tests public class DirectoryInfo_EnumerateFiles_str_str_so : Directory_GetFiles_str_str_so { + public override bool IsDirectoryInfo => true; + public override string[] GetEntries(string path) { return ((new DirectoryInfo(path).EnumerateFiles("*", SearchOption.TopDirectoryOnly).Select(x => x.FullName)).ToArray()); diff --git a/src/System.IO.FileSystem/tests/DirectoryInfo/GetFiles.cs b/src/System.IO.FileSystem/tests/DirectoryInfo/GetFiles.cs index 85fef80609..13970ae34d 100644 --- a/src/System.IO.FileSystem/tests/DirectoryInfo/GetFiles.cs +++ b/src/System.IO.FileSystem/tests/DirectoryInfo/GetFiles.cs @@ -30,6 +30,8 @@ namespace System.IO.Tests public class DirectoryInfo_GetFiles_str_so : Directory_GetFiles_str_str_so { + public override bool IsDirectoryInfo => true; + public override string[] GetEntries(string path) { return ((new DirectoryInfo(path).GetFiles("*", SearchOption.TopDirectoryOnly).Select(x => x.FullName)).ToArray()); diff --git a/src/System.IO.FileSystem/tests/FileSystemTest.cs b/src/System.IO.FileSystem/tests/FileSystemTest.cs index 6f020a00f6..ff21035632 100644 --- a/src/System.IO.FileSystem/tests/FileSystemTest.cs +++ b/src/System.IO.FileSystem/tests/FileSystemTest.cs @@ -33,6 +33,26 @@ namespace System.IO.Tests public static TheoryData ControlWhiteSpace = IOInputs.GetControlWhiteSpace().ToTheoryData(); public static TheoryData NonControlWhiteSpace = IOInputs.GetNonControlWhiteSpace().ToTheoryData(); + public static TheoryData<string> TrailingSeparators + { + get + { + var data = new TheoryData<string>() + { + "", + "" + Path.DirectorySeparatorChar, + "" + Path.DirectorySeparatorChar + Path.DirectorySeparatorChar + }; + + if (PlatformDetection.IsWindows) + { + data.Add("" + Path.AltDirectorySeparatorChar); + } + + return data; + } + } + /// <summary> /// In some cases (such as when running without elevated privileges), /// the symbolic link may fail to create. Only run this test if it creates |