1 // Licensed to the .NET Foundation under one or more agreements. 2 // The .NET Foundation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using Xunit; 6 7 namespace System.IO.Tests 8 { 9 public class FileInfo_Open_fm : FileStream_ctor_str_fm 10 { CreateFileStream(string path, FileMode mode)11 protected override FileStream CreateFileStream(string path, FileMode mode) 12 { 13 return new FileInfo(path).Open(mode); 14 } 15 16 [Fact] 17 [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "FileInfo.Open(string, filemode) on netfx always uses FileAccess.ReadWrite instead of choosing a FileAccess based on the FileMode. This bug was fixed in netcoreapp.")] FileModeAppend()18 public override void FileModeAppend() 19 { 20 using (FileStream fs = CreateFileStream(GetTestFilePath(), FileMode.Append)) 21 { 22 Assert.Equal(false, fs.CanRead); 23 Assert.Equal(true, fs.CanWrite); 24 } 25 } 26 27 [Fact] 28 [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework, "FileInfo.Open(string, filemode) on netfx always uses FileAccess.ReadWrite instead of choosing a FileAccess based on the FileMode. This bug was fixed in netcoreapp.")] FileModeAppendExisting()29 public override void FileModeAppendExisting() 30 { 31 string fileName = GetTestFilePath(); 32 using (FileStream fs = CreateFileStream(fileName, FileMode.Create)) 33 { 34 fs.WriteByte(0); 35 } 36 37 using (FileStream fs = CreateFileStream(fileName, FileMode.Append)) 38 { 39 // Ensure that the file was re-opened and position set to end 40 Assert.Equal(1L, fs.Length); 41 Assert.Equal(1L, fs.Position); 42 Assert.False(fs.CanRead); 43 Assert.True(fs.CanSeek); 44 Assert.True(fs.CanWrite); 45 Assert.Throws<IOException>(() => fs.Seek(-1, SeekOrigin.Current)); 46 Assert.Throws<NotSupportedException>(() => fs.ReadByte()); 47 } 48 } 49 } 50 51 public class FileInfo_Open_fm_fa : FileStream_ctor_str_fm_fa 52 { CreateFileStream(string path, FileMode mode)53 protected override FileStream CreateFileStream(string path, FileMode mode) 54 { 55 return new FileInfo(path).Open(mode, mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite); 56 } 57 CreateFileStream(string path, FileMode mode, FileAccess access)58 protected override FileStream CreateFileStream(string path, FileMode mode, FileAccess access) 59 { 60 return new FileInfo(path).Open(mode, access); 61 } 62 } 63 64 public class FileInfo_Open_fm_fa_fs : FileStream_ctor_str_fm_fa_fs 65 { CreateFileStream(string path, FileMode mode)66 protected override FileStream CreateFileStream(string path, FileMode mode) 67 { 68 return new FileInfo(path).Open(mode, mode == FileMode.Append ? FileAccess.Write : FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete); 69 } 70 CreateFileStream(string path, FileMode mode, FileAccess access)71 protected override FileStream CreateFileStream(string path, FileMode mode, FileAccess access) 72 { 73 return new FileInfo(path).Open(mode, access, FileShare.ReadWrite | FileShare.Delete); 74 } 75 CreateFileStream(string path, FileMode mode, FileAccess access, FileShare share)76 protected override FileStream CreateFileStream(string path, FileMode mode, FileAccess access, FileShare share) 77 { 78 return new FileInfo(path).Open(mode, access, share); 79 } 80 } 81 82 public class FileInfo_OpenSpecial : FileStream_ctor_str_fm_fa_fs 83 { CreateFileStream(string path, FileMode mode, FileAccess access)84 protected override FileStream CreateFileStream(string path, FileMode mode, FileAccess access) 85 { 86 if (mode == FileMode.Open && access == FileAccess.Read) 87 return new FileInfo(path).OpenRead(); 88 else if (mode == FileMode.OpenOrCreate && access == FileAccess.Write) 89 return new FileInfo(path).OpenWrite(); 90 else 91 return new FileInfo(path).Open(mode, access); 92 } 93 CreateFileStream(string path, FileMode mode, FileAccess access, FileShare share)94 protected override FileStream CreateFileStream(string path, FileMode mode, FileAccess access, FileShare share) 95 { 96 if (mode == FileMode.Open && access == FileAccess.Read && share == FileShare.Read) 97 return new FileInfo(path).OpenRead(); 98 else if (mode == FileMode.OpenOrCreate && access == FileAccess.Write && share == FileShare.None) 99 return new FileInfo(path).OpenWrite(); 100 else 101 return new FileInfo(path).Open(mode, access, share); 102 } 103 } 104 105 public class FileInfo_CreateText : File_ReadWriteAllText 106 { Write(string path, string content)107 protected override void Write(string path, string content) 108 { 109 var writer = new FileInfo(path).CreateText(); 110 writer.Write(content); 111 writer.Dispose(); 112 } 113 } 114 115 public class FileInfo_OpenText : File_ReadWriteAllText 116 { Read(string path)117 protected override string Read(string path) 118 { 119 using (var reader = new FileInfo(path).OpenText()) 120 return reader.ReadToEnd(); 121 } 122 } 123 } 124