Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit f35784e

Browse files
authored
Start adding alternate data stream tests (#27931)
* Start adding alternate data stream tests Also fill out ExampleTests. * Skip on NetFX
1 parent 1126fc2 commit f35784e

File tree

3 files changed

+217
-18
lines changed

3 files changed

+217
-18
lines changed

src/System.IO.FileSystem/tests/Enumeration/ExampleTests.netcoreapp.cs

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,20 @@
44

55
using System.Collections.Generic;
66
using System.IO.Enumeration;
7+
using System.Linq;
78
using Xunit;
89

910
namespace System.IO.Tests.Enumeration
1011
{
11-
// For tests that cover examples from documentation, blog posts, etc.
12+
// For tests that cover examples from documentation, blog posts, etc. While these overlap with
13+
// existing tests, having explicit coverage here is extra insurance we are covering the
14+
// examples we've given out publicly.
1215
public class ExampleTests : FileSystemTest
1316
{
1417
[Fact]
1518
public void GetFileNamesEnumerable()
1619
{
20+
// https://blogs.msdn.microsoft.com/jeremykuhne/2018/03/09/custom-directory-enumeration-in-net-core-2-1/
1721
DirectoryInfo testDirectory = Directory.CreateDirectory(GetTestFilePath());
1822
File.Create(Path.Join(testDirectory.FullName, "one")).Dispose();
1923
File.Create(Path.Join(testDirectory.FullName, "two")).Dispose();
@@ -29,5 +33,109 @@ public void GetFileNamesEnumerable()
2933

3034
FSAssert.EqualWhenOrdered(new string[] { "one", "two" }, fileNames);
3135
}
36+
37+
private static IEnumerable<FileInfo> GetFilesWithExtensions(string directory,
38+
bool recursive, params string[] extensions)
39+
{
40+
return new FileSystemEnumerable<FileInfo>(
41+
directory,
42+
(ref FileSystemEntry entry) => (FileInfo)entry.ToFileSystemInfo(),
43+
new EnumerationOptions() { RecurseSubdirectories = recursive })
44+
{
45+
ShouldIncludePredicate = (ref FileSystemEntry entry) =>
46+
{
47+
if (entry.IsDirectory)
48+
return false;
49+
foreach (string extension in extensions)
50+
{
51+
if (Path.GetExtension(entry.FileName).SequenceEqual(extension))
52+
return true;
53+
}
54+
return false;
55+
}
56+
};
57+
}
58+
59+
[Fact]
60+
public void TestGetFilesWithExtensions()
61+
{
62+
// https://blogs.msdn.microsoft.com/jeremykuhne/2018/03/09/custom-directory-enumeration-in-net-core-2-1/
63+
DirectoryInfo testDirectory = Directory.CreateDirectory(GetTestFilePath());
64+
File.Create(Path.Join(testDirectory.FullName, "file.one")).Dispose();
65+
File.Create(Path.Join(testDirectory.FullName, "file.two")).Dispose();
66+
File.Create(Path.Join(testDirectory.FullName, "file.three")).Dispose();
67+
DirectoryInfo subDirectory = testDirectory.CreateSubdirectory("three.one");
68+
File.Create(Path.Join(subDirectory.FullName, "subfile.one")).Dispose();
69+
70+
FSAssert.EqualWhenOrdered(
71+
new string[] { "file.one", "file.three" },
72+
GetFilesWithExtensions(testDirectory.FullName, false, ".one", ".three").Select(f => f.Name));
73+
74+
FSAssert.EqualWhenOrdered(
75+
new string[] { "file.one", "file.three", "subfile.one" },
76+
GetFilesWithExtensions(testDirectory.FullName, true, ".one", ".three").Select(f => f.Name));
77+
}
78+
79+
private static int CountFiles(string directory, bool recursive)
80+
{
81+
return (new FileSystemEnumerable<int>(
82+
directory,
83+
(ref FileSystemEntry entry) => 1,
84+
new EnumerationOptions() { RecurseSubdirectories = recursive })
85+
{
86+
ShouldIncludePredicate = (ref FileSystemEntry entry) => !entry.IsDirectory
87+
}).Count();
88+
}
89+
90+
[Fact]
91+
public void TestCountFiles()
92+
{
93+
// https://blogs.msdn.microsoft.com/jeremykuhne/2018/03/09/custom-directory-enumeration-in-net-core-2-1/
94+
DirectoryInfo testDirectory = Directory.CreateDirectory(GetTestFilePath());
95+
File.Create(Path.Join(testDirectory.FullName, "file.one")).Dispose();
96+
File.Create(Path.Join(testDirectory.FullName, "file.two")).Dispose();
97+
File.Create(Path.Join(testDirectory.FullName, "file.three")).Dispose();
98+
DirectoryInfo subDirectory = testDirectory.CreateSubdirectory("three.one");
99+
File.Create(Path.Join(subDirectory.FullName, "subfile.one")).Dispose();
100+
101+
Assert.Equal(3, CountFiles(testDirectory.FullName, false));
102+
103+
Assert.Equal(4, CountFiles(testDirectory.FullName, true));
104+
}
105+
106+
private static long CountFileBytes(string directory, bool recursive)
107+
{
108+
return (new FileSystemEnumerable<long>(
109+
directory,
110+
(ref FileSystemEntry entry) => entry.Length,
111+
new EnumerationOptions() { RecurseSubdirectories = recursive })
112+
{
113+
ShouldIncludePredicate = (ref FileSystemEntry entry) => !entry.IsDirectory
114+
}).Sum();
115+
}
116+
117+
[Fact]
118+
public void TestCountFileBytes()
119+
{
120+
// https://blogs.msdn.microsoft.com/jeremykuhne/2018/03/09/custom-directory-enumeration-in-net-core-2-1/
121+
DirectoryInfo testDirectory = Directory.CreateDirectory(GetTestFilePath());
122+
FileInfo firstFile = new FileInfo(Path.Join(testDirectory.FullName, "file.one"));
123+
using (var writer = firstFile.CreateText())
124+
{
125+
for (int i = 0; i < 100; i++)
126+
writer.WriteLine("The quick brown fox jumped over the lazy dog.");
127+
}
128+
129+
firstFile.CopyTo(Path.Join(testDirectory.FullName, "file.two"));
130+
firstFile.CopyTo(Path.Join(testDirectory.FullName, "file.three"));
131+
DirectoryInfo subDirectory = testDirectory.CreateSubdirectory("three.one");
132+
firstFile.CopyTo(Path.Join(subDirectory.FullName, "subfile.one"));
133+
134+
firstFile.Refresh();
135+
Assert.True(firstFile.Length > 0, "The file we wrote should have a length.");
136+
Assert.Equal(firstFile.Length * 3, CountFileBytes(testDirectory.FullName, false));
137+
138+
Assert.Equal(firstFile.Length * 4, CountFileBytes(testDirectory.FullName, true));
139+
}
32140
}
33141
}

src/System.IO.FileSystem/tests/File/Copy.cs

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,17 @@
44

55
using System.Collections.Generic;
66
using System.Linq;
7-
using System.Runtime.InteropServices;
87
using Xunit;
98

109
namespace System.IO.Tests
1110
{
1211
public partial class File_Copy_str_str : FileSystemTest
1312
{
14-
#region Utilities
15-
16-
public static TheoryData WindowsInvalidUnixValid = new TheoryData<string> { " ", };
1713
public virtual void Copy(string source, string dest)
1814
{
1915
File.Copy(source, dest);
2016
}
2117

22-
#endregion
23-
2418
#region UniversalTests
2519

2620
[Fact]
@@ -223,13 +217,43 @@ public void UnixInvalidWindowsPaths(string valid)
223217
Assert.True(File.Exists(testFile));
224218
Assert.True(File.Exists(Path.Combine(TestDirectory, valid)));
225219
}
220+
221+
[Theory,
222+
InlineData("", ":bar"),
223+
InlineData("", ":bar:$DATA"),
224+
InlineData("::$DATA", ":bar"),
225+
InlineData("::$DATA", ":bar:$DATA")]
226+
[PlatformSpecific(TestPlatforms.Windows)]
227+
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
228+
public void WindowsAlternateDataStream(string defaultStream, string alternateStream)
229+
{
230+
DirectoryInfo testDirectory = Directory.CreateDirectory(GetTestFilePath());
231+
string testFile = Path.Combine(testDirectory.FullName, GetTestFileName());
232+
string testFileDefaultStream = testFile + defaultStream;
233+
string testFileAlternateStream = testFile + alternateStream;
234+
235+
// Copy the default stream into an alternate stream
236+
File.WriteAllText(testFileDefaultStream, "Foo");
237+
Copy(testFileDefaultStream, testFileAlternateStream);
238+
Assert.Equal(testFile, testDirectory.GetFiles().Single().FullName);
239+
Assert.Equal("Foo", File.ReadAllText(testFileDefaultStream));
240+
Assert.Equal("Foo", File.ReadAllText(testFileAlternateStream));
241+
242+
// Copy another file over the alternate stream
243+
string testFile2 = Path.Combine(testDirectory.FullName, GetTestFileName());
244+
string testFile2DefaultStream = testFile2 + defaultStream;
245+
File.WriteAllText(testFile2DefaultStream, "Bar");
246+
Assert.Throws<IOException>(() => Copy(testFile2DefaultStream, testFileAlternateStream));
247+
248+
// This always throws as you can't copy an alternate stream out (oddly)
249+
Assert.Throws<IOException>(() => Copy(testFileAlternateStream, testFile2));
250+
Assert.Throws<IOException>(() => Copy(testFileAlternateStream, testFile2 + alternateStream));
251+
}
226252
#endregion
227253
}
228254

229255
public class File_Copy_str_str_b : File_Copy_str_str
230256
{
231-
#region Utilities
232-
233257
public override void Copy(string source, string dest)
234258
{
235259
File.Copy(source, dest, false);
@@ -240,10 +264,6 @@ public virtual void Copy(string source, string dest, bool overwrite)
240264
File.Copy(source, dest, overwrite);
241265
}
242266

243-
#endregion
244-
245-
#region UniversalTests
246-
247267
[Fact]
248268
public void OverwriteTrue()
249269
{
@@ -296,6 +316,38 @@ public void OverwriteFalse()
296316
}
297317
}
298318

299-
#endregion
319+
[Theory,
320+
InlineData("", ":bar"),
321+
InlineData("", ":bar:$DATA"),
322+
InlineData("::$DATA", ":bar"),
323+
InlineData("::$DATA", ":bar:$DATA")]
324+
[PlatformSpecific(TestPlatforms.Windows)]
325+
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
326+
public void WindowsAlternateDataStreamOverwrite(string defaultStream, string alternateStream)
327+
{
328+
DirectoryInfo testDirectory = Directory.CreateDirectory(GetTestFilePath());
329+
string testFile = Path.Combine(testDirectory.FullName, GetTestFileName());
330+
string testFileDefaultStream = testFile + defaultStream;
331+
string testFileAlternateStream = testFile + alternateStream;
332+
333+
// Copy the default stream into an alternate stream
334+
File.WriteAllText(testFileDefaultStream, "Foo");
335+
Copy(testFileDefaultStream, testFileAlternateStream);
336+
Assert.Equal(testFile, testDirectory.GetFiles().Single().FullName);
337+
Assert.Equal("Foo", File.ReadAllText(testFileDefaultStream));
338+
Assert.Equal("Foo", File.ReadAllText(testFileAlternateStream));
339+
340+
// Copy another file over the alternate stream
341+
string testFile2 = Path.Combine(testDirectory.FullName, GetTestFileName());
342+
string testFile2DefaultStream = testFile2 + defaultStream;
343+
File.WriteAllText(testFile2DefaultStream, "Bar");
344+
Copy(testFile2DefaultStream, testFileAlternateStream, overwrite: true);
345+
Assert.Equal("Foo", File.ReadAllText(testFileDefaultStream));
346+
Assert.Equal("Bar", File.ReadAllText(testFileAlternateStream));
347+
348+
// This always throws as you can't copy an alternate stream out (oddly)
349+
Assert.Throws<IOException>(() => Copy(testFileAlternateStream, testFile2, overwrite: true));
350+
Assert.Throws<IOException>(() => Copy(testFileAlternateStream, testFile2 + alternateStream, overwrite: true));
351+
}
300352
}
301353
}

src/System.IO.FileSystem/tests/File/Create.cs

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,11 @@ namespace System.IO.Tests
88
{
99
public class File_Create_str : FileSystemTest
1010
{
11-
#region Utilities
12-
1311
public virtual FileStream Create(string path)
1412
{
1513
return File.Create(path);
1614
}
1715

18-
#endregion
19-
2016
#region UniversalTests
2117

2218
[Fact]
@@ -283,6 +279,49 @@ public void UnixWhitespacePath(string path)
283279
}
284280
}
285281

282+
[Theory,
283+
InlineData(":bar"),
284+
InlineData(":bar:$DATA"),
285+
InlineData("::$DATA")]
286+
[PlatformSpecific(TestPlatforms.Windows)]
287+
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
288+
public void WindowsAlternateDataStream(string streamName)
289+
{
290+
DirectoryInfo testDirectory = Directory.CreateDirectory(GetTestFilePath());
291+
streamName = Path.Combine(testDirectory.FullName, GetTestFileName()) + streamName;
292+
using (Create(streamName))
293+
{
294+
Assert.True(File.Exists(streamName));
295+
}
296+
}
297+
298+
[Theory,
299+
InlineData(":bar"),
300+
InlineData(":bar:$DATA")]
301+
[PlatformSpecific(TestPlatforms.Windows)]
302+
[SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
303+
public void WindowsAlternateDataStream_OnExisting(string streamName)
304+
{
305+
DirectoryInfo testDirectory = Directory.CreateDirectory(GetTestFilePath());
306+
307+
// On closed file
308+
string fileName = Path.Combine(testDirectory.FullName, GetTestFileName());
309+
Create(fileName).Dispose();
310+
streamName = fileName + streamName;
311+
using (Create(streamName))
312+
{
313+
Assert.True(File.Exists(streamName));
314+
}
315+
316+
// On open file
317+
fileName = Path.Combine(testDirectory.FullName, GetTestFileName());
318+
using (Create(fileName))
319+
using (Create(streamName))
320+
{
321+
Assert.True(File.Exists(streamName));
322+
}
323+
}
324+
286325
#endregion
287326
}
288327

0 commit comments

Comments
 (0)