Skip to content

Commit f722681

Browse files
Copilotstephentoub
andcommitted
Add comprehensive IO tests for problematic filename characters
Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com>
1 parent 36ad43e commit f722681

File tree

6 files changed

+365
-0
lines changed

6 files changed

+365
-0
lines changed

src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/Directory/GetFiles.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,5 +192,41 @@ public void DirectoryWithTrailingSeparators(string trailing)
192192
string[] files = GetEntries(root + (IsDirectoryInfo ? trailing : ""), "*", SearchOption.AllDirectories);
193193
FSAssert.EqualWhenOrdered(new string[] { rootFile, nestedFile }, files);
194194
}
195+
196+
[Fact]
197+
[PlatformSpecific(TestPlatforms.AnyUnix)]
198+
public void EnumerateFilesWithProblematicNames_Unix()
199+
{
200+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
201+
File.Create(Path.Combine(testDir.FullName, " leading")).Dispose();
202+
File.Create(Path.Combine(testDir.FullName, ".leading")).Dispose();
203+
File.Create(Path.Combine(testDir.FullName, "-")).Dispose();
204+
File.Create(Path.Combine(testDir.FullName, "--")).Dispose();
205+
File.Create(Path.Combine(testDir.FullName, "file\tname")).Dispose();
206+
207+
string[] files = GetEntries(testDir.FullName);
208+
Assert.Equal(5, files.Length);
209+
Assert.Contains(files, f => Path.GetFileName(f) == " leading");
210+
Assert.Contains(files, f => Path.GetFileName(f) == ".leading");
211+
Assert.Contains(files, f => Path.GetFileName(f) == "-");
212+
Assert.Contains(files, f => Path.GetFileName(f) == "--");
213+
Assert.Contains(files, f => Path.GetFileName(f) == "file\tname");
214+
}
215+
216+
[Fact]
217+
[PlatformSpecific(TestPlatforms.Windows)]
218+
public void EnumerateFilesWithProblematicNames_Windows()
219+
{
220+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
221+
File.Create(Path.Combine(testDir.FullName, " leading")).Dispose();
222+
File.Create(Path.Combine(testDir.FullName, ".leading")).Dispose();
223+
File.Create(Path.Combine(testDir.FullName, "..leading")).Dispose();
224+
225+
string[] files = GetEntries(testDir.FullName);
226+
Assert.Equal(3, files.Length);
227+
Assert.Contains(files, f => Path.GetFileName(f) == " leading");
228+
Assert.Contains(files, f => Path.GetFileName(f) == ".leading");
229+
Assert.Contains(files, f => Path.GetFileName(f) == "..leading");
230+
}
195231
}
196232
}

src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/File/Copy.cs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -422,6 +422,80 @@ public void DestinationFileIsTruncatedWhenItsLargerThanSourceFile()
422422

423423
Assert.Equal(content, File.ReadAllBytes(destPath));
424424
}
425+
426+
[Theory]
427+
[InlineData(" leading", "destination")]
428+
[InlineData("source", " leading")]
429+
[InlineData(" leading", " leadingdest")]
430+
[PlatformSpecific(TestPlatforms.AnyUnix)]
431+
public void UnixCopyWithLeadingSpaces(string sourceFileName, string destFileName)
432+
{
433+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
434+
string sourcePath = Path.Combine(testDir.FullName, sourceFileName);
435+
string destPath = Path.Combine(testDir.FullName, destFileName);
436+
437+
File.Create(sourcePath).Dispose();
438+
Copy(sourcePath, destPath);
439+
440+
Assert.True(File.Exists(sourcePath));
441+
Assert.True(File.Exists(destPath));
442+
}
443+
444+
[Theory]
445+
[InlineData(".leading", "destination")]
446+
[InlineData("source", ".leading")]
447+
[InlineData("-", "destination")]
448+
[InlineData("source", "-")]
449+
[InlineData("--", "destination")]
450+
[PlatformSpecific(TestPlatforms.AnyUnix)]
451+
public void UnixCopyWithProblematicNames(string sourceFileName, string destFileName)
452+
{
453+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
454+
string sourcePath = Path.Combine(testDir.FullName, sourceFileName);
455+
string destPath = Path.Combine(testDir.FullName, destFileName);
456+
457+
File.Create(sourcePath).Dispose();
458+
Copy(sourcePath, destPath);
459+
460+
Assert.True(File.Exists(sourcePath));
461+
Assert.True(File.Exists(destPath));
462+
}
463+
464+
[Theory]
465+
[InlineData("file\tname", "destination")]
466+
[InlineData("source", "file\tname")]
467+
[PlatformSpecific(TestPlatforms.AnyUnix)]
468+
public void UnixCopyWithEmbeddedControlCharacters(string sourceFileName, string destFileName)
469+
{
470+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
471+
string sourcePath = Path.Combine(testDir.FullName, sourceFileName);
472+
string destPath = Path.Combine(testDir.FullName, destFileName);
473+
474+
File.Create(sourcePath).Dispose();
475+
Copy(sourcePath, destPath);
476+
477+
Assert.True(File.Exists(sourcePath));
478+
Assert.True(File.Exists(destPath));
479+
}
480+
481+
[Theory]
482+
[InlineData(" leading", "destination")]
483+
[InlineData("source", " leading")]
484+
[InlineData(".leading", "destination")]
485+
[InlineData("source", ".leading")]
486+
[PlatformSpecific(TestPlatforms.Windows)]
487+
public void WindowsCopyWithProblematicNames(string sourceFileName, string destFileName)
488+
{
489+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
490+
string sourcePath = Path.Combine(testDir.FullName, sourceFileName);
491+
string destPath = Path.Combine(testDir.FullName, destFileName);
492+
493+
File.Create(sourcePath).Dispose();
494+
Copy(sourcePath, destPath);
495+
496+
Assert.True(File.Exists(sourcePath));
497+
Assert.True(File.Exists(destPath));
498+
}
425499
}
426500

427501
/// <summary>

src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/File/Create.cs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,96 @@ public void WindowsAlternateDataStream_OnExisting(string streamName)
341341
}
342342
}
343343

344+
[Theory]
345+
[InlineData(" leading")]
346+
[InlineData(" leading")]
347+
[InlineData(" leading")]
348+
[PlatformSpecific(TestPlatforms.AnyUnix)]
349+
public void UnixLeadingSpace(string fileName)
350+
{
351+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
352+
string filePath = Path.Combine(testDir.FullName, fileName);
353+
using (Create(filePath))
354+
{
355+
Assert.True(File.Exists(filePath));
356+
}
357+
}
358+
359+
[Theory]
360+
[InlineData(".leading")]
361+
[InlineData("..leading")]
362+
[InlineData("...leading")]
363+
[PlatformSpecific(TestPlatforms.AnyUnix)]
364+
public void UnixLeadingDot(string fileName)
365+
{
366+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
367+
string filePath = Path.Combine(testDir.FullName, fileName);
368+
using (Create(filePath))
369+
{
370+
Assert.True(File.Exists(filePath));
371+
}
372+
}
373+
374+
[Theory]
375+
[InlineData("-")]
376+
[InlineData("--")]
377+
[InlineData("-filename")]
378+
[InlineData("--filename")]
379+
[PlatformSpecific(TestPlatforms.AnyUnix)]
380+
public void UnixDashPrefixedNames(string fileName)
381+
{
382+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
383+
string filePath = Path.Combine(testDir.FullName, fileName);
384+
using (Create(filePath))
385+
{
386+
Assert.True(File.Exists(filePath));
387+
}
388+
}
389+
390+
[Theory]
391+
[InlineData("file\tname")]
392+
[InlineData("file\rname")]
393+
[InlineData("file\vname")]
394+
[InlineData("file\fname")]
395+
[PlatformSpecific(TestPlatforms.AnyUnix)]
396+
public void UnixEmbeddedControlCharacters(string fileName)
397+
{
398+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
399+
string filePath = Path.Combine(testDir.FullName, fileName);
400+
using (Create(filePath))
401+
{
402+
Assert.True(File.Exists(filePath));
403+
}
404+
}
405+
406+
[Theory]
407+
[InlineData(" leading")]
408+
[InlineData(" leading")]
409+
[PlatformSpecific(TestPlatforms.Windows)]
410+
public void WindowsLeadingSpace(string fileName)
411+
{
412+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
413+
string filePath = Path.Combine(testDir.FullName, fileName);
414+
using (Create(filePath))
415+
{
416+
Assert.True(File.Exists(filePath));
417+
}
418+
}
419+
420+
[Theory]
421+
[InlineData(".leading")]
422+
[InlineData("..leading")]
423+
[PlatformSpecific(TestPlatforms.Windows)]
424+
public void WindowsLeadingDot(string fileName)
425+
{
426+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
427+
string filePath = Path.Combine(testDir.FullName, fileName);
428+
using (Create(filePath))
429+
{
430+
Assert.True(File.Exists(filePath));
431+
}
432+
}
433+
344434
#endregion
345435
}
346436

src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/File/Delete.cs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,55 @@ public void WindowsDeleteAlternateDataStream(string streamName)
201201
Assert.True(testFile.Exists);
202202
}
203203

204+
[Theory]
205+
[InlineData(" leading")]
206+
[InlineData(" leading")]
207+
[InlineData(".leading")]
208+
[InlineData("..leading")]
209+
[InlineData("-")]
210+
[InlineData("--")]
211+
[InlineData("-filename")]
212+
[PlatformSpecific(TestPlatforms.AnyUnix)]
213+
public void UnixDeleteProblematicNames(string fileName)
214+
{
215+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
216+
string filePath = Path.Combine(testDir.FullName, fileName);
217+
File.Create(filePath).Dispose();
218+
Assert.True(File.Exists(filePath));
219+
Delete(filePath);
220+
Assert.False(File.Exists(filePath));
221+
}
222+
223+
[Theory]
224+
[InlineData("file\tname")]
225+
[InlineData("file\rname")]
226+
[InlineData("file\vname")]
227+
[PlatformSpecific(TestPlatforms.AnyUnix)]
228+
public void UnixDeleteEmbeddedControlCharacters(string fileName)
229+
{
230+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
231+
string filePath = Path.Combine(testDir.FullName, fileName);
232+
File.Create(filePath).Dispose();
233+
Assert.True(File.Exists(filePath));
234+
Delete(filePath);
235+
Assert.False(File.Exists(filePath));
236+
}
237+
238+
[Theory]
239+
[InlineData(" leading")]
240+
[InlineData(".leading")]
241+
[InlineData("..leading")]
242+
[PlatformSpecific(TestPlatforms.Windows)]
243+
public void WindowsDeleteProblematicNames(string fileName)
244+
{
245+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
246+
string filePath = Path.Combine(testDir.FullName, fileName);
247+
File.Create(filePath).Dispose();
248+
Assert.True(File.Exists(filePath));
249+
Delete(filePath);
250+
Assert.False(File.Exists(filePath));
251+
}
252+
204253
#endregion
205254
}
206255
}

src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/File/Exists.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,49 @@ public void DirectoryWithComponentLongerThanMaxComponentAsPath_ReturnsFalse(stri
230230
Assert.False(Exists(component));
231231
}
232232

233+
[Theory]
234+
[InlineData(" leading")]
235+
[InlineData(" leading")]
236+
[InlineData(".leading")]
237+
[InlineData("..leading")]
238+
[InlineData("-")]
239+
[InlineData("--")]
240+
[InlineData("-filename")]
241+
[PlatformSpecific(TestPlatforms.AnyUnix)]
242+
public void UnixExistsProblematicNames(string fileName)
243+
{
244+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
245+
string filePath = Path.Combine(testDir.FullName, fileName);
246+
File.Create(filePath).Dispose();
247+
Assert.True(Exists(filePath));
248+
}
249+
250+
[Theory]
251+
[InlineData("file\tname")]
252+
[InlineData("file\rname")]
253+
[InlineData("file\vname")]
254+
[PlatformSpecific(TestPlatforms.AnyUnix)]
255+
public void UnixExistsEmbeddedControlCharacters(string fileName)
256+
{
257+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
258+
string filePath = Path.Combine(testDir.FullName, fileName);
259+
File.Create(filePath).Dispose();
260+
Assert.True(Exists(filePath));
261+
}
262+
263+
[Theory]
264+
[InlineData(" leading")]
265+
[InlineData(".leading")]
266+
[InlineData("..leading")]
267+
[PlatformSpecific(TestPlatforms.Windows)]
268+
public void WindowsExistsProblematicNames(string fileName)
269+
{
270+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
271+
string filePath = Path.Combine(testDir.FullName, fileName);
272+
File.Create(filePath).Dispose();
273+
Assert.True(Exists(filePath));
274+
}
275+
233276
#endregion
234277
}
235278

0 commit comments

Comments
 (0)