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