Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,14 @@ public abstract class BaseGetSetTimes<T> : FileSystemTest
public delegate void SetTime(T item, DateTime time);
public delegate DateTime GetTime(T item);
// AppContainer restricts access to DriveFormat (::GetVolumeInformation)
private static string driveFormat = PlatformDetection.IsInAppContainer ? string.Empty : new DriveInfo(Path.GetTempPath()).DriveFormat;
private static string driveFormat = TempDriveFormat;

private static bool isHFS => driveFormat != null && driveFormat.Equals("hfs", StringComparison.InvariantCultureIgnoreCase);
private static bool isFat32 => IsTempPathOnFat32;
private static int TemporalResolutionSafeSecond => isFat32 ? 4 : 3;

protected static bool SecondTemporalResolution => true;
protected static bool MilliSecondTemporalResolution => SecondTemporalResolution && !isHFS; // HFS only supports temporal resolution of 1 second
protected static bool MilliSecondTemporalResolution => SecondTemporalResolution && !isHFS && !isFat32; // HFS and FAT32 have low temporal resolution
protected static bool NanoSecondTemporalResolution => MilliSecondTemporalResolution && !PlatformDetection.IsBrowser; // Browser does not support nanosecond resolution
protected static bool NotMilliSecondTemporalResolution => !MilliSecondTemporalResolution;
protected static bool NotNanoSecondTemporalResolution => !NanoSecondTemporalResolution;
Expand Down Expand Up @@ -73,7 +75,7 @@ private void SettingUpdatesPropertiesCore(T item, T? linkTarget = default)
bool isLink = linkTarget is not null;

// Checking that milliseconds are not dropped after setter.
DateTime dt = new DateTime(2014, 12, 1, 12, 3, 3, NotMilliSecondTemporalResolution ? 0 : 321, function.Kind);
DateTime dt = new DateTime(2014, 12, 1, 12, 3, TemporalResolutionSafeSecond, NotMilliSecondTemporalResolution ? 0 : 321, function.Kind);
function.Setter(item, dt);

T getTarget = !isLink || ApiTargetsLink ? item : linkTarget;
Expand Down Expand Up @@ -114,7 +116,7 @@ public void SettingUpdatesPropertiesWhenReadOnly()
SettingUpdatesPropertiesCore(item);
}

[ConditionalTheory(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))]
[ConditionalTheory(typeof(FileSystemTest), nameof(TempPathSupportsSymbolicLinks))]
[PlatformSpecific(~TestPlatforms.Browser)] // Browser is excluded as it doesn't support symlinks
[InlineData(false)]
[InlineData(true)]
Expand Down Expand Up @@ -207,9 +209,9 @@ public void SettingUpdatesPropertiesAfterAnother()
bool reverse = functions.reverse;

// Checking that milliseconds are not dropped after setter.
DateTime dt1 = new DateTime(2002, 12, 1, 12, 3, 3, NotMilliSecondTemporalResolution ? 0 : 321, DateTimeKind.Utc);
DateTime dt2 = new DateTime(2001, 12, 1, 12, 3, 3, NotMilliSecondTemporalResolution ? 0 : 321, DateTimeKind.Utc);
DateTime dt3 = new DateTime(2000, 12, 1, 12, 3, 3, NotMilliSecondTemporalResolution ? 0 : 321, DateTimeKind.Utc);
DateTime dt1 = new DateTime(2002, 12, 1, 12, 3, TemporalResolutionSafeSecond, NotMilliSecondTemporalResolution ? 0 : 321, DateTimeKind.Utc);
DateTime dt2 = new DateTime(2001, 12, 1, 12, 3, TemporalResolutionSafeSecond, NotMilliSecondTemporalResolution ? 0 : 321, DateTimeKind.Utc);
DateTime dt3 = new DateTime(2000, 12, 1, 12, 3, TemporalResolutionSafeSecond, NotMilliSecondTemporalResolution ? 0 : 321, DateTimeKind.Utc);
if (reverse) //reverse the order of setting dates
{
(dt1, dt3) = (dt3, dt1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,9 @@ private void AssertSettingInvalidAttributes(string path, FileAttributes attribut
Assert.Equal(FileAttributes.Normal, GetAttributes(path));
}

[Theory,
InlineData(":bar"),
InlineData(":bar:$DATA")]
[ConditionalTheory(typeof(FileSystemTest), nameof(FileSystemTest.SupportsAlternateDataStreams))]
[InlineData(":bar")]
[InlineData(":bar:$DATA")]
[PlatformSpecific(TestPlatforms.Windows)]
public void GettingAndSettingAttributes_AlternateDataStream_Windows(string streamName)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,9 +213,18 @@ public void InvalidPath_Core()
{
case '/':
case '\\':
case ':':
Assert.Throws<DirectoryNotFoundException>(() => GetEntries(badPath));
break;
case ':':
if (SupportsAlternateDataStreams)
{
Assert.Throws<DirectoryNotFoundException>(() => GetEntries(badPath));
}
else
{
Comment thread
Sahithbasani marked this conversation as resolved.
Assert.ThrowsAny<IOException>(() => GetEntries(badPath));
}
break;
case '\0':
Assert.Throws<ArgumentException>(() => GetEntries(badPath));
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,21 @@ public override IEnumerable<TimeFunction> TimeFunctions(bool requiresRoundtrippi
((path) => Directory.GetCreationTimeUtc(path)),
DateTimeKind.Utc);
}
yield return TimeFunction.Create(
((path, time) => Directory.SetLastAccessTime(path, time)),
((path) => Directory.GetLastAccessTime(path)),
DateTimeKind.Local);
yield return TimeFunction.Create(
((path, time) => Directory.SetLastAccessTimeUtc(path, time)),
((path) => Directory.GetLastAccessTimeUtc(path)),
DateTimeKind.Unspecified);
yield return TimeFunction.Create(
((path, time) => Directory.SetLastAccessTimeUtc(path, time)),
((path) => Directory.GetLastAccessTimeUtc(path)),
DateTimeKind.Utc);
if (TempPathSupportsPreciseLastAccessTime)
{
yield return TimeFunction.Create(
((path, time) => Directory.SetLastAccessTime(path, time)),
((path) => Directory.GetLastAccessTime(path)),
DateTimeKind.Local);
yield return TimeFunction.Create(
((path, time) => Directory.SetLastAccessTimeUtc(path, time)),
((path) => Directory.GetLastAccessTimeUtc(path)),
DateTimeKind.Unspecified);
yield return TimeFunction.Create(
((path, time) => Directory.SetLastAccessTimeUtc(path, time)),
((path) => Directory.GetLastAccessTimeUtc(path)),
DateTimeKind.Utc);
}
yield return TimeFunction.Create(
((path, time) => Directory.SetLastWriteTime(path, time)),
((path) => Directory.GetLastWriteTime(path)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,18 +36,21 @@ public override IEnumerable<TimeFunction> TimeFunctions(bool requiresRoundtrippi
((testDir) => testDir.CreationTimeUtc),
DateTimeKind.Utc);
}
yield return TimeFunction.Create(
((testDir, time) => {testDir.LastAccessTime = time; }),
((testDir) => testDir.LastAccessTime),
DateTimeKind.Local);
yield return TimeFunction.Create(
((testDir, time) => {testDir.LastAccessTimeUtc = time; }),
((testDir) => testDir.LastAccessTimeUtc),
DateTimeKind.Unspecified);
yield return TimeFunction.Create(
((testDir, time) => { testDir.LastAccessTimeUtc = time; }),
((testDir) => testDir.LastAccessTimeUtc),
DateTimeKind.Utc);
if (TempPathSupportsPreciseLastAccessTime)
{
yield return TimeFunction.Create(
((testDir, time) => {testDir.LastAccessTime = time; }),
((testDir) => testDir.LastAccessTime),
DateTimeKind.Local);
yield return TimeFunction.Create(
((testDir, time) => {testDir.LastAccessTimeUtc = time; }),
((testDir) => testDir.LastAccessTimeUtc),
DateTimeKind.Unspecified);
yield return TimeFunction.Create(
((testDir, time) => { testDir.LastAccessTimeUtc = time; }),
((testDir) => testDir.LastAccessTimeUtc),
DateTimeKind.Utc);
}
yield return TimeFunction.Create(
((testDir, time) => {testDir.LastWriteTime = time; }),
((testDir) => testDir.LastWriteTime),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,8 +141,12 @@ public void CopyFileWithData(char[] data, bool readOnly)
AssertExtensions.Equal(data, readData);
}

// Ensure last write/access time on the new file is appropriate
Assert.InRange(File.GetLastWriteTimeUtc(testFileDest), lastWriteTime.AddSeconds(-1), lastWriteTime.AddSeconds(1));
// Ensure last write/access time on the new file is appropriate.
TimeSpan tolerance = IsTempPathOnFat32 ? TimeSpan.FromSeconds(3) : TimeSpan.FromSeconds(1);
Assert.InRange(
File.GetLastWriteTimeUtc(testFileDest),
lastWriteTime.Subtract(tolerance),
lastWriteTime.Add(tolerance));

Assert.Equal(readOnly, (File.GetAttributes(testFileDest) & FileAttributes.ReadOnly) != 0);
if (readOnly)
Expand Down Expand Up @@ -203,11 +207,11 @@ public void UnixInvalidWindowsPaths(string valid)
Assert.True(File.Exists(Path.Combine(TestDirectory, valid)));
}

[Theory,
InlineData("", ":bar"),
InlineData("", ":bar:$DATA"),
InlineData("::$DATA", ":bar"),
InlineData("::$DATA", ":bar:$DATA")]
[ConditionalTheory(typeof(FileSystemTest), nameof(FileSystemTest.SupportsAlternateDataStreams))]
[InlineData("", ":bar")]
[InlineData("", ":bar:$DATA")]
[InlineData("::$DATA", ":bar")]
[InlineData("::$DATA", ":bar:$DATA")]
[PlatformSpecific(TestPlatforms.Windows)]
public void WindowsAlternateDataStream(string defaultStream, string alternateStream)
{
Expand Down Expand Up @@ -347,11 +351,11 @@ public void OverwriteFalse()
}
}

[Theory,
InlineData("", ":bar"),
InlineData("", ":bar:$DATA"),
InlineData("::$DATA", ":bar"),
InlineData("::$DATA", ":bar:$DATA")]
[ConditionalTheory(typeof(FileSystemTest), nameof(FileSystemTest.SupportsAlternateDataStreams))]
[InlineData("", ":bar")]
[InlineData("", ":bar:$DATA")]
[InlineData("::$DATA", ":bar")]
[InlineData("::$DATA", ":bar:$DATA")]
[PlatformSpecific(TestPlatforms.Windows)]
[ActiveIssue("https://github.com/dotnet/runtime/issues/83659", typeof(PlatformDetection), nameof(PlatformDetection.IsWindows), nameof(PlatformDetection.IsArm64Process))]
public void WindowsAlternateDataStreamOverwrite(string defaultStream, string alternateStream)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -301,10 +301,10 @@ public void UnixWhitespacePath(string path)
}
}

[Theory,
InlineData(":bar"),
InlineData(":bar:$DATA"),
InlineData("::$DATA")]
[ConditionalTheory(typeof(FileSystemTest), nameof(FileSystemTest.SupportsAlternateDataStreams))]
[InlineData(":bar")]
[InlineData(":bar:$DATA")]
[InlineData("::$DATA")]
[PlatformSpecific(TestPlatforms.Windows)]
public void WindowsAlternateDataStream(string streamName)
{
Expand All @@ -316,9 +316,9 @@ public void WindowsAlternateDataStream(string streamName)
}
}

[Theory,
InlineData(":bar"),
InlineData(":bar:$DATA")]
[ConditionalTheory(typeof(FileSystemTest), nameof(FileSystemTest.SupportsAlternateDataStreams))]
[InlineData(":bar")]
[InlineData(":bar:$DATA")]
[PlatformSpecific(TestPlatforms.Windows)]
public void WindowsAlternateDataStream_OnExisting(string streamName)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,9 @@ public void UnixDeleteReadOnlyFile()
Assert.False(testFile.Exists);
}

[Theory,
InlineData(":bar"),
InlineData(":bar:$DATA")]
[ConditionalTheory(typeof(FileSystemTest), nameof(FileSystemTest.SupportsAlternateDataStreams))]
[InlineData(":bar")]
[InlineData(":bar:$DATA")]
[PlatformSpecific(TestPlatforms.Windows)]
public void WindowsDeleteAlternateDataStream(string streamName)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ public void GetAttributes_MissingFile(char trailingChar)
}

// Getting only throws for File, not FileInfo
[Theory,
InlineData(":bar"),
InlineData(":bar:$DATA")]
[ConditionalTheory(typeof(FileSystemTest), nameof(FileSystemTest.SupportsAlternateDataStreams))]
[InlineData(":bar")]
[InlineData(":bar:$DATA")]
[PlatformSpecific(TestPlatforms.Windows)]
public void GetAttributes_MissingAlternateDataStream_Windows(string streamName)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,9 @@ public abstract class File_GetSetTimes : StaticGetSetTimes
{
// OSX has the limitation of setting upto 2262-04-11T23:47:16 (long.Max) date.
// 32bit Unix has time_t up to ~ 2038.
protected static bool SupportsLongMaxDateTime => PlatformDetection.IsWindows || (!PlatformDetection.Is32BitProcess && !PlatformDetection.IsApplePlatform);
protected static bool SupportsLongMaxDateTime =>
!IsTempPathOnFat32 &&
(PlatformDetection.IsWindows || (!PlatformDetection.Is32BitProcess && !PlatformDetection.IsApplePlatform));

protected override bool CanBeReadOnly => true;

Expand Down Expand Up @@ -111,18 +113,21 @@ public override IEnumerable<TimeFunction> TimeFunctions(bool requiresRoundtrippi
GetCreationTimeUtc,
DateTimeKind.Utc);
}
yield return TimeFunction.Create(
SetLastAccessTime,
GetLastAccessTime,
DateTimeKind.Local);
yield return TimeFunction.Create(
SetLastAccessTimeUtc,
GetLastAccessTimeUtc,
DateTimeKind.Unspecified);
yield return TimeFunction.Create(
SetLastAccessTimeUtc,
GetLastAccessTimeUtc,
DateTimeKind.Utc);
if (TempPathSupportsPreciseLastAccessTime)
{
yield return TimeFunction.Create(
SetLastAccessTime,
GetLastAccessTime,
DateTimeKind.Local);
yield return TimeFunction.Create(
SetLastAccessTimeUtc,
GetLastAccessTimeUtc,
DateTimeKind.Unspecified);
yield return TimeFunction.Create(
SetLastAccessTimeUtc,
GetLastAccessTimeUtc,
DateTimeKind.Utc);
}
yield return TimeFunction.Create(
SetLastWriteTime,
GetLastWriteTime,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -325,11 +325,11 @@ public void UnixWhitespacePath(string whitespace)

}

[Theory,
InlineData("", ":bar"),
InlineData("", ":bar:$DATA"),
InlineData("::$DATA", ":bar"),
InlineData("::$DATA", ":bar:$DATA")]
[ConditionalTheory(typeof(FileSystemTest), nameof(FileSystemTest.SupportsAlternateDataStreams))]
[InlineData("", ":bar")]
[InlineData("", ":bar:$DATA")]
[InlineData("::$DATA", ":bar")]
[InlineData("::$DATA", ":bar:$DATA")]
[PlatformSpecific(TestPlatforms.Windows)]
public void WindowsAlternateDataStreamMove(string defaultStream, string alternateStream)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,18 +84,21 @@ public override IEnumerable<TimeFunction> TimeFunctions(bool requiresRoundtrippi
((testFile) => testFile.CreationTimeUtc),
DateTimeKind.Utc);
}
yield return TimeFunction.Create(
((testFile, time) => { testFile.LastAccessTime = time; }),
((testFile) => testFile.LastAccessTime),
DateTimeKind.Local);
yield return TimeFunction.Create(
((testFile, time) => { testFile.LastAccessTimeUtc = time; }),
((testFile) => testFile.LastAccessTimeUtc),
DateTimeKind.Unspecified);
yield return TimeFunction.Create(
((testFile, time) => { testFile.LastAccessTimeUtc = time; }),
((testFile) => testFile.LastAccessTimeUtc),
DateTimeKind.Utc);
if (TempPathSupportsPreciseLastAccessTime)
{
yield return TimeFunction.Create(
((testFile, time) => { testFile.LastAccessTime = time; }),
((testFile) => testFile.LastAccessTime),
DateTimeKind.Local);
yield return TimeFunction.Create(
((testFile, time) => { testFile.LastAccessTimeUtc = time; }),
((testFile) => testFile.LastAccessTimeUtc),
DateTimeKind.Unspecified);
yield return TimeFunction.Create(
((testFile, time) => { testFile.LastAccessTimeUtc = time; }),
((testFile) => testFile.LastAccessTimeUtc),
DateTimeKind.Utc);
}
yield return TimeFunction.Create(
((testFile, time) => { testFile.LastWriteTime = time; }),
((testFile) => testFile.LastWriteTime),
Expand Down
Loading