From 1911dd86b3f9195f8ccb6db0c968b2213bce9957 Mon Sep 17 00:00:00 2001 From: Florian Greinacher Date: Thu, 26 Nov 2020 00:11:25 +0100 Subject: [PATCH] fix: add missing OS platform attributes --- Directory.Build.props | 1 + .../Support/DirectorySupport.cs | 11 ++--------- .../Support/DirectorySupportStatic.cs | 11 ++--------- .../MockDirectory.cs | 4 ++++ .../MockDirectoryData.cs | 4 +++- .../MockFile.cs | 13 +++++++------ .../MockFileData.cs | 2 ++ .../MockFileInfo.cs | 6 +++++- .../Polyfills/SupportedOSPlatformAttribute.cs | 12 ++++++++++++ src/System.IO.Abstractions/DirectoryBase.cs | 4 ++++ src/System.IO.Abstractions/DirectoryInfoWrapper.cs | 5 +++++ src/System.IO.Abstractions/DirectoryWrapper.cs | 5 +++++ src/System.IO.Abstractions/DriveInfoWrapper.cs | 5 ++++- src/System.IO.Abstractions/FileBase.cs | 4 ++++ src/System.IO.Abstractions/FileInfoWrapper.cs | 8 +++++++- src/System.IO.Abstractions/FileWrapper.cs | 6 ++++++ src/System.IO.Abstractions/IFile.cs | 4 ++++ .../Polyfills/SupportedOSPlatformAttribute.cs | 12 ++++++++++++ .../System.IO.Abstractions.Tests/FileSystemTests.cs | 3 +++ 19 files changed, 92 insertions(+), 28 deletions(-) create mode 100644 src/System.IO.Abstractions.TestingHelpers/Polyfills/SupportedOSPlatformAttribute.cs create mode 100644 src/System.IO.Abstractions/Polyfills/SupportedOSPlatformAttribute.cs diff --git a/Directory.Build.props b/Directory.Build.props index 230e4f305..bbbd7977f 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -13,6 +13,7 @@ MIT $(DefineConstants);FEATURE_ASYNC_FILE;FEATURE_ENUMERATION_OPTIONS;FEATURE_ADVANCED_PATH_OPERATIONSFEATURE_PATH_JOIN_WITH_SPAN $(DefineConstants);FEATURE_FILE_MOVE_WITH_OVERWRITE + $(DefineConstants);FEATURE_SUPPORTED_OS_ATTRIBUTE diff --git a/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupport.cs b/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupport.cs index b47ed1a16..f619f9631 100644 --- a/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupport.cs +++ b/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupport.cs @@ -36,15 +36,8 @@ private string GetRandomTempDirectory() public string CreateRandomDirectory() { var randomPath = this.GetRandomTempDirectory(); - try - { - _fileSystem.Directory.CreateDirectory(randomPath); - return randomPath; - } - catch (Exception ex) - { - throw (ex); - } + _fileSystem.Directory.CreateDirectory(randomPath); + return randomPath; } private void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs = true, bool overwrite = true) diff --git a/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupportStatic.cs b/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupportStatic.cs index 4824e1a9f..e623ec7d9 100644 --- a/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupportStatic.cs +++ b/benchmarks/System.IO.Abstractions.Benchmarks/Support/DirectorySupportStatic.cs @@ -16,15 +16,8 @@ private static string GetRandomTempDirectory() public static string CreateDirectory() { var randomPath = GetRandomTempDirectory(); - try - { - Directory.CreateDirectory(randomPath); - return randomPath; - } - catch (Exception ex) - { - throw (ex); - } + Directory.CreateDirectory(randomPath); + return randomPath; } private static void DirectoryCopy(string sourceDirName, string destDirName, bool copySubDirs = true, bool overwrite = true) diff --git a/src/System.IO.Abstractions.TestingHelpers/MockDirectory.cs b/src/System.IO.Abstractions.TestingHelpers/MockDirectory.cs index bc845c1e1..7ae2ac68f 100644 --- a/src/System.IO.Abstractions.TestingHelpers/MockDirectory.cs +++ b/src/System.IO.Abstractions.TestingHelpers/MockDirectory.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Runtime.Versioning; using System.Security.AccessControl; using System.Text.RegularExpressions; @@ -125,6 +126,7 @@ public override bool Exists(string path) } } + [SupportedOSPlatform("windows")] public override DirectorySecurity GetAccessControl(string path) { mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path"); @@ -139,6 +141,7 @@ public override DirectorySecurity GetAccessControl(string path) return directoryData.AccessControl; } + [SupportedOSPlatform("windows")] public override DirectorySecurity GetAccessControl(string path, AccessControlSections includeSections) { return GetAccessControl(path); @@ -442,6 +445,7 @@ public override void Move(string sourceDirName, string destDirName) mockFileDataAccessor.MoveDirectory(fullSourcePath, fullDestPath); } + [SupportedOSPlatform("windows")] public override void SetAccessControl(string path, DirectorySecurity directorySecurity) { mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path"); diff --git a/src/System.IO.Abstractions.TestingHelpers/MockDirectoryData.cs b/src/System.IO.Abstractions.TestingHelpers/MockDirectoryData.cs index f3e342824..b583d98f7 100644 --- a/src/System.IO.Abstractions.TestingHelpers/MockDirectoryData.cs +++ b/src/System.IO.Abstractions.TestingHelpers/MockDirectoryData.cs @@ -1,4 +1,5 @@ -using System.Security.AccessControl; +using System.Runtime.Versioning; +using System.Security.AccessControl; namespace System.IO.Abstractions.TestingHelpers { @@ -16,6 +17,7 @@ public MockDirectoryData() : base(string.Empty) Attributes = FileAttributes.Directory; } + [SupportedOSPlatform("windows")] public new DirectorySecurity AccessControl { get diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFile.cs b/src/System.IO.Abstractions.TestingHelpers/MockFile.cs index 4f571200b..0c6244fa4 100644 --- a/src/System.IO.Abstractions.TestingHelpers/MockFile.cs +++ b/src/System.IO.Abstractions.TestingHelpers/MockFile.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Runtime.Versioning; using System.Security.AccessControl; using System.Text; using System.Threading; @@ -125,9 +126,9 @@ public override void Copy(string sourceFileName, string destFileName, bool overw Create(path, bufferSize, FileOptions.None); public override Stream Create(string path, int bufferSize, FileOptions options) => - CreateInternal(path, options, null); + CreateInternal(path, options); - private Stream CreateInternal(string path, FileOptions options, FileSecurity fileSecurity) + private Stream CreateInternal(string path, FileOptions options) { if (path == null) { @@ -137,10 +138,7 @@ private Stream CreateInternal(string path, FileOptions options, FileSecurity fil mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, nameof(path)); VerifyDirectoryExists(path); - var mockFileData = new MockFileData(new byte[0]) - { - AccessControl = fileSecurity - }; + var mockFileData = new MockFileData(new byte[0]); mockFileDataAccessor.AddFile(path, mockFileData); return OpenWriteInternal(path, options); } @@ -192,6 +190,7 @@ public override bool Exists(string path) return file != null && !file.IsDirectory; } + [SupportedOSPlatform("windows")] public override FileSecurity GetAccessControl(string path) { mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path"); @@ -205,6 +204,7 @@ public override FileSecurity GetAccessControl(string path) return fileData.AccessControl; } + [SupportedOSPlatform("windows")] public override FileSecurity GetAccessControl(string path, AccessControlSections includeSections) { return GetAccessControl(path); @@ -603,6 +603,7 @@ public override void Replace(string sourceFileName, string destinationFileName, Move(sourceFileName, destinationFileName); } + [SupportedOSPlatform("windows")] public override void SetAccessControl(string path, FileSecurity fileSecurity) { mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path"); diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs b/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs index 0ac2d35ec..213c9ed8b 100644 --- a/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs +++ b/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs @@ -1,4 +1,5 @@ using System.Linq; +using System.Runtime.Versioning; using System.Security.AccessControl; using System.Text; @@ -151,6 +152,7 @@ public string TextContents /// /// Gets or sets of the . This is the object that is returned for this when calling . /// + [SupportedOSPlatform("windows")] public FileSecurity AccessControl { get diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFileInfo.cs b/src/System.IO.Abstractions.TestingHelpers/MockFileInfo.cs index a8d65362f..9d53d1c75 100644 --- a/src/System.IO.Abstractions.TestingHelpers/MockFileInfo.cs +++ b/src/System.IO.Abstractions.TestingHelpers/MockFileInfo.cs @@ -1,4 +1,5 @@ -using System.Security.AccessControl; +using System.Runtime.Versioning; +using System.Security.AccessControl; namespace System.IO.Abstractions.TestingHelpers { @@ -215,11 +216,13 @@ public override void Encrypt() MockFileData.Attributes |= FileAttributes.Encrypted; } + [SupportedOSPlatform("windows")] public override FileSecurity GetAccessControl() { return mockFileSystem.File.GetAccessControl(this.path); } + [SupportedOSPlatform("windows")] public override FileSecurity GetAccessControl(AccessControlSections includeSections) { return mockFileSystem.File.GetAccessControl(this.path, includeSections); @@ -281,6 +284,7 @@ public override IFileInfo Replace(string destinationFileName, string destination return mockFileSystem.FileInfo.FromFileName(destinationFileName); } + [SupportedOSPlatform("windows")] public override void SetAccessControl(FileSecurity fileSecurity) { mockFileSystem.File.SetAccessControl(this.path, fileSecurity); diff --git a/src/System.IO.Abstractions.TestingHelpers/Polyfills/SupportedOSPlatformAttribute.cs b/src/System.IO.Abstractions.TestingHelpers/Polyfills/SupportedOSPlatformAttribute.cs new file mode 100644 index 000000000..ef6635b4f --- /dev/null +++ b/src/System.IO.Abstractions.TestingHelpers/Polyfills/SupportedOSPlatformAttribute.cs @@ -0,0 +1,12 @@ +#if !FEATURE_SUPPORTED_OS_ATTRIBUTE +namespace System.Runtime.Versioning +{ + [AttributeUsage(AttributeTargets.All)] + internal class SupportedOSPlatformAttribute : Attribute + { + public SupportedOSPlatformAttribute(string _) + { + } + } +} +#endif diff --git a/src/System.IO.Abstractions/DirectoryBase.cs b/src/System.IO.Abstractions/DirectoryBase.cs index ad53fad6b..8c130c1af 100644 --- a/src/System.IO.Abstractions/DirectoryBase.cs +++ b/src/System.IO.Abstractions/DirectoryBase.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Runtime.Versioning; using System.Security.AccessControl; namespace System.IO.Abstractions @@ -24,6 +25,7 @@ protected DirectoryBase(IFileSystem fileSystem) public abstract IDirectoryInfo CreateDirectory(string path); /// + [SupportedOSPlatform("windows")] public abstract IDirectoryInfo CreateDirectory(string path, DirectorySecurity directorySecurity); /// @@ -36,9 +38,11 @@ protected DirectoryBase(IFileSystem fileSystem) public abstract bool Exists(string path); /// + [SupportedOSPlatform("windows")] public abstract DirectorySecurity GetAccessControl(string path); /// + [SupportedOSPlatform("windows")] public abstract DirectorySecurity GetAccessControl(string path, AccessControlSections includeSections); /// diff --git a/src/System.IO.Abstractions/DirectoryInfoWrapper.cs b/src/System.IO.Abstractions/DirectoryInfoWrapper.cs index 1a64d7737..2557341a6 100644 --- a/src/System.IO.Abstractions/DirectoryInfoWrapper.cs +++ b/src/System.IO.Abstractions/DirectoryInfoWrapper.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Runtime.Versioning; using System.Security.AccessControl; namespace System.IO.Abstractions @@ -91,6 +92,7 @@ public override void Create() instance.Create(); } + [SupportedOSPlatform("windows")] public override void Create(DirectorySecurity directorySecurity) { instance.Create(directorySecurity); @@ -172,11 +174,13 @@ public override IEnumerable EnumerateFileSystemInfos(string sea } #endif + [SupportedOSPlatform("windows")] public override DirectorySecurity GetAccessControl() { return instance.GetAccessControl(); } + [SupportedOSPlatform("windows")] public override DirectorySecurity GetAccessControl(AccessControlSections includeSections) { return instance.GetAccessControl(includeSections); @@ -253,6 +257,7 @@ public override void MoveTo(string destDirName) instance.MoveTo(destDirName); } + [SupportedOSPlatform("windows")] public override void SetAccessControl(DirectorySecurity directorySecurity) { instance.SetAccessControl(directorySecurity); diff --git a/src/System.IO.Abstractions/DirectoryWrapper.cs b/src/System.IO.Abstractions/DirectoryWrapper.cs index 46300f19d..723d985fc 100644 --- a/src/System.IO.Abstractions/DirectoryWrapper.cs +++ b/src/System.IO.Abstractions/DirectoryWrapper.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Runtime.Versioning; using System.Security.AccessControl; namespace System.IO.Abstractions @@ -17,6 +18,7 @@ public override IDirectoryInfo CreateDirectory(string path) return new DirectoryInfoWrapper(FileSystem, directoryInfo); } + [SupportedOSPlatform("windows")] public override IDirectoryInfo CreateDirectory(string path, DirectorySecurity directorySecurity) { var directoryInfo = new DirectoryInfo(path); @@ -39,11 +41,13 @@ public override bool Exists(string path) return Directory.Exists(path); } + [SupportedOSPlatform("windows")] public override DirectorySecurity GetAccessControl(string path) { return new DirectoryInfo(path).GetAccessControl(); } + [SupportedOSPlatform("windows")] public override DirectorySecurity GetAccessControl(string path, AccessControlSections includeSections) { return new DirectoryInfo(path).GetAccessControl(includeSections); @@ -165,6 +169,7 @@ public override void Move(string sourceDirName, string destDirName) Directory.Move(sourceDirName, destDirName); } + [SupportedOSPlatform("windows")] public override void SetAccessControl(string path, DirectorySecurity directorySecurity) { new DirectoryInfo(path).SetAccessControl(directorySecurity); diff --git a/src/System.IO.Abstractions/DriveInfoWrapper.cs b/src/System.IO.Abstractions/DriveInfoWrapper.cs index dfc97b1b0..334c69655 100644 --- a/src/System.IO.Abstractions/DriveInfoWrapper.cs +++ b/src/System.IO.Abstractions/DriveInfoWrapper.cs @@ -1,4 +1,6 @@ -namespace System.IO.Abstractions +using System.Runtime.Versioning; + +namespace System.IO.Abstractions { /// /// The wrapper for a . @@ -151,6 +153,7 @@ public override string VolumeLabel { get { return instance.VolumeLabel; } + [SupportedOSPlatform("windows")] set { instance.VolumeLabel = value; } } diff --git a/src/System.IO.Abstractions/FileBase.cs b/src/System.IO.Abstractions/FileBase.cs index 40c0dd5c9..24a3c04ac 100644 --- a/src/System.IO.Abstractions/FileBase.cs +++ b/src/System.IO.Abstractions/FileBase.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Runtime.Versioning; using System.Security.AccessControl; using System.Text; @@ -92,9 +93,11 @@ protected FileBase(IFileSystem fileSystem) /// + [SupportedOSPlatform("windows")] public abstract FileSecurity GetAccessControl(string path); /// + [SupportedOSPlatform("windows")] public abstract FileSecurity GetAccessControl(string path, AccessControlSections includeSections); @@ -314,6 +317,7 @@ protected FileBase(IFileSystem fileSystem) public abstract void Replace(string sourceFileName, string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors); /// + [SupportedOSPlatform("windows")] public abstract void SetAccessControl(string path, FileSecurity fileSecurity); /// diff --git a/src/System.IO.Abstractions/FileInfoWrapper.cs b/src/System.IO.Abstractions/FileInfoWrapper.cs index 2c23dc5a3..ca31e1910 100644 --- a/src/System.IO.Abstractions/FileInfoWrapper.cs +++ b/src/System.IO.Abstractions/FileInfoWrapper.cs @@ -1,4 +1,5 @@ -using System.Security.AccessControl; +using System.Runtime.Versioning; +using System.Security.AccessControl; namespace System.IO.Abstractions { @@ -109,21 +110,25 @@ public override StreamWriter CreateText() return instance.CreateText(); } + [SupportedOSPlatform("windows")] public override void Decrypt() { instance.Decrypt(); } + [SupportedOSPlatform("windows")] public override void Encrypt() { instance.Encrypt(); } + [SupportedOSPlatform("windows")] public override FileSecurity GetAccessControl() { return instance.GetAccessControl(); } + [SupportedOSPlatform("windows")] public override FileSecurity GetAccessControl(AccessControlSections includeSections) { return instance.GetAccessControl(includeSections); @@ -181,6 +186,7 @@ public override IFileInfo Replace(string destinationFileName, string destination return new FileInfoWrapper(FileSystem, instance.Replace(destinationFileName, destinationBackupFileName, ignoreMetadataErrors)); } + [SupportedOSPlatform("windows")] public override void SetAccessControl(FileSecurity fileSecurity) { instance.SetAccessControl(fileSecurity); diff --git a/src/System.IO.Abstractions/FileWrapper.cs b/src/System.IO.Abstractions/FileWrapper.cs index 1d41f34cb..dc2afdc73 100644 --- a/src/System.IO.Abstractions/FileWrapper.cs +++ b/src/System.IO.Abstractions/FileWrapper.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Runtime.Versioning; using System.Security.AccessControl; using System.Text; @@ -67,6 +68,7 @@ public override StreamWriter CreateText(string path) return File.CreateText(path); } + [SupportedOSPlatform("windows")] public override void Decrypt(string path) { File.Decrypt(path); @@ -77,6 +79,7 @@ public override void Delete(string path) File.Delete(path); } + [SupportedOSPlatform("windows")] public override void Encrypt(string path) { File.Encrypt(path); @@ -87,11 +90,13 @@ public override bool Exists(string path) return File.Exists(path); } + [SupportedOSPlatform("windows")] public override FileSecurity GetAccessControl(string path) { return new FileInfo(path).GetAccessControl(); } + [SupportedOSPlatform("windows")] public override FileSecurity GetAccessControl(string path, AccessControlSections includeSections) { return new FileInfo(path).GetAccessControl(includeSections); @@ -233,6 +238,7 @@ public override void Replace(string sourceFileName, string destinationFileName, } + [SupportedOSPlatform("windows")] public override void SetAccessControl(string path, FileSecurity fileSecurity) { new FileInfo(path).SetAccessControl(fileSecurity); diff --git a/src/System.IO.Abstractions/IFile.cs b/src/System.IO.Abstractions/IFile.cs index dfa45c14f..ebfff17cc 100644 --- a/src/System.IO.Abstractions/IFile.cs +++ b/src/System.IO.Abstractions/IFile.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Runtime.Versioning; using System.Security.AccessControl; using System.Text; @@ -43,8 +44,10 @@ public partial interface IFile bool Exists(string path); /// + [SupportedOSPlatform("windows")] FileSecurity GetAccessControl(string path); /// + [SupportedOSPlatform("windows")] FileSecurity GetAccessControl(string path, AccessControlSections includeSections); /// @@ -98,6 +101,7 @@ public partial interface IFile /// void Replace(string sourceFileName, string destinationFileName, string destinationBackupFileName, bool ignoreMetadataErrors); /// + [SupportedOSPlatform("windows")] void SetAccessControl(string path, FileSecurity fileSecurity); /// void SetAttributes(string path, FileAttributes fileAttributes); diff --git a/src/System.IO.Abstractions/Polyfills/SupportedOSPlatformAttribute.cs b/src/System.IO.Abstractions/Polyfills/SupportedOSPlatformAttribute.cs new file mode 100644 index 000000000..ef6635b4f --- /dev/null +++ b/src/System.IO.Abstractions/Polyfills/SupportedOSPlatformAttribute.cs @@ -0,0 +1,12 @@ +#if !FEATURE_SUPPORTED_OS_ATTRIBUTE +namespace System.Runtime.Versioning +{ + [AttributeUsage(AttributeTargets.All)] + internal class SupportedOSPlatformAttribute : Attribute + { + public SupportedOSPlatformAttribute(string _) + { + } + } +} +#endif diff --git a/tests/System.IO.Abstractions.Tests/FileSystemTests.cs b/tests/System.IO.Abstractions.Tests/FileSystemTests.cs index 61431e482..4905cb453 100644 --- a/tests/System.IO.Abstractions.Tests/FileSystemTests.cs +++ b/tests/System.IO.Abstractions.Tests/FileSystemTests.cs @@ -13,7 +13,10 @@ public void Is_Serializable() var memoryStream = new MemoryStream(); var serializer = new Runtime.Serialization.Formatters.Binary.BinaryFormatter(); + +#pragma warning disable SYSLIB0011 serializer.Serialize(memoryStream, fileSystem); +#pragma warning restore SYSLIB0011 Assert.That(memoryStream.Length > 0, "Length didn't increase after serialization task."); }