Merge pull request #2024 from BogdanovKirill/webrequesttest
[mono.git] / mcs / class / corlib / Test / System.IO / FileStreamTest.cs
index 08e0b46e09142e95caf4d188b3d29be2575394c8..dca54d652affc4eb71ca1c2c335bc4b7ffdfe327 100644 (file)
@@ -15,6 +15,8 @@ using System;
 using System.IO;
 using System.Runtime.InteropServices;
 using System.Text;
+using System.Threading;
+using Microsoft.Win32.SafeHandles;
 
 namespace MonoTests.System.IO
 {
@@ -86,12 +88,13 @@ namespace MonoTests.System.IO
                [Test]
                public void CtorFileNotFoundException_Mode_Open ()
                {
+                       const string file_name = "thisfileshouldnotexist.test";
                        // absolute path
-                       string path = TempFolder + DSC + "thisfileshouldnotexists.test";
+                       string path = TempFolder + DSC + file_name;
                        DeleteFile (path);
                        FileStream stream = null;
                        try {
-                               stream = new FileStream (TempFolder + DSC + "thisfileshouldnotexists.test", FileMode.Open);
+                               stream = new FileStream (TempFolder + DSC + file_name, FileMode.Open);
                                Assert.Fail ("#A1");
                        } catch (FileNotFoundException ex) {
                                Assert.AreEqual (typeof (FileNotFoundException), ex.GetType (), "#A2");
@@ -110,14 +113,18 @@ namespace MonoTests.System.IO
                        // relative path
                        string orignalCurrentDir = Directory.GetCurrentDirectory ();
                        Directory.SetCurrentDirectory (TempFolder);
+
+                       // If TempFolder is a symlink, Mono will follow it and ex.FileName below will contain
+                       // the real directory name, not that of the TempFolder symlink and the test will fail
+                       // (happens e.g. on Android M)
+                       string realTempDir = Directory.GetCurrentDirectory ();
+                       path = realTempDir + DSC + file_name;
+
                        try {
-                               stream = new FileStream ("thisfileshouldnotexists.test", FileMode.Open);
+                               stream = new FileStream (file_name, FileMode.Open);
                                Assert.Fail ("#B1");
                        } catch (FileNotFoundException ex) {
                                Assert.AreEqual (typeof (FileNotFoundException), ex.GetType (), "#B2");
-                               // under OSX 'var' is a symlink to 'private/var'
-                               if (MacOSX)
-                                       path = "/private" + path;
                                Assert.AreEqual (path, ex.FileName, "#B3");
                                Assert.IsNull (ex.InnerException, "#B4");
                                Assert.IsNotNull (ex.Message, "#B5");
@@ -134,8 +141,9 @@ namespace MonoTests.System.IO
                [Test]
                public void CtorFileNotFoundException_Mode_Truncate ()
                {
+                       const string file_name = "thisfileshouldNOTexist.test";
                        // absolute path
-                       string path = TempFolder + DSC + "thisfileshouldNOTexists.test";
+                       string path = TempFolder + DSC + file_name;
                        DeleteFile (path);
                        FileStream stream = null;
                        try {
@@ -158,14 +166,18 @@ namespace MonoTests.System.IO
                        // relative path
                        string orignalCurrentDir = Directory.GetCurrentDirectory ();
                        Directory.SetCurrentDirectory (TempFolder);
+
+                       // If TempFolder is a symlink, Mono will follow it and ex.FileName below will contain
+                       // the real directory name, not that of the TempFolder symlink and the test will fail
+                       // (happens e.g. on Android M)
+                       string realTempDir = Directory.GetCurrentDirectory ();
+                       path = realTempDir + DSC + file_name;
+
                        try {
-                               stream = new FileStream ("thisfileshouldNOTexists.test", FileMode.Truncate);
+                               stream = new FileStream (file_name, FileMode.Truncate);
                                Assert.Fail ("#B1");
                        } catch (FileNotFoundException ex) {
                                Assert.AreEqual (typeof (FileNotFoundException), ex.GetType (), "#B2");
-                               // under OSX 'var' is a symlink to 'private/var'
-                               if (MacOSX)
-                                       path = "/private" + path;
                                Assert.AreEqual (path, ex.FileName, "#B3");
                                Assert.IsNull (ex.InnerException, "#B4");
                                Assert.IsNotNull (ex.Message, "#B5");
@@ -182,8 +194,9 @@ namespace MonoTests.System.IO
                [Test]
                public void CtorIOException1 ()
                {
+                       const string file_name = "thisfileshouldexists.test";
                        // absolute path
-                       string path = TempFolder + DSC + "thisfileshouldexists.test";
+                       string path = TempFolder + DSC + file_name;
                        FileStream stream = null;
                        DeleteFile (path);
                        try {
@@ -208,11 +221,18 @@ namespace MonoTests.System.IO
                        // relative path
                        string orignalCurrentDir = Directory.GetCurrentDirectory ();
                        Directory.SetCurrentDirectory (TempFolder);
+
+                       // If TempFolder is a symlink, Mono will follow it and ex.FileName below will contain
+                       // the real directory name, not that of the TempFolder symlink and the test will fail
+                       // (happens e.g. on Android M)
+                       string realTempDir = Directory.GetCurrentDirectory ();
+                       path = realTempDir + DSC + file_name;
+
                        try {
-                               stream = new FileStream ("thisfileshouldexists.test", FileMode.CreateNew);
+                               stream = new FileStream (file_name, FileMode.CreateNew);
                                stream.Close ();
                                stream = null;
-                               stream = new FileStream ("thisfileshouldexists.test", FileMode.CreateNew);
+                               stream = new FileStream (file_name, FileMode.CreateNew);
                                Assert.Fail ("#B1");
                        } catch (IOException ex) {
                                Assert.AreEqual (typeof (IOException), ex.GetType (), "#B2");
@@ -326,8 +346,14 @@ namespace MonoTests.System.IO
                {
                        string orignalCurrentDir = Directory.GetCurrentDirectory ();
                        Directory.SetCurrentDirectory (TempFolder);
+
+                       // If TempFolder is a symlink, Mono will follow it and ex.FileName below will contain
+                       // the real directory name, not that of the TempFolder symlink and the test will fail
+                       // (happens e.g. on Android M)
+                       string realTempDir = Directory.GetCurrentDirectory ();
+                       
                        string relativePath = "DirectoryDoesNotExist" + Path.DirectorySeparatorChar + "file.txt";
-                       string fullPath = Path.Combine (TempFolder, relativePath);
+                       string fullPath = Path.Combine (realTempDir, relativePath);
                        try {
                                new FileStream (relativePath, FileMode.Open);
                                Assert.Fail ("#A1");
@@ -705,7 +731,6 @@ namespace MonoTests.System.IO
                        }
                }
 
-#if !TARGET_JVM // No support IntPtr file handles under TARGET_JVM
                [Test, ExpectedException (typeof (IOException))]
                public void CtorIOException2 ()
                {
@@ -717,9 +742,7 @@ namespace MonoTests.System.IO
                                        stream.Close ();
                        }
                }
-#endif // TARGET_JVM
 
-               [Category("TargetJvmNotSupported")] // File sharing not supported for TARGET_JVM
                [Test, ExpectedException (typeof (IOException))]
                public void CtorIOException ()
                {
@@ -767,7 +790,6 @@ namespace MonoTests.System.IO
                }
 
                [Test]
-               [Category("TargetJvmNotSupported")] // File sharing not supported for TARGET_JVM
                [ExpectedException (typeof (IOException))]
                public void CtorAccess1Read2Write ()
                {
@@ -793,7 +815,6 @@ namespace MonoTests.System.IO
                }
 
                [Test]
-               [Category("TargetJvmNotSupported")] // File sharing not supported for TARGET_JVM
                [ExpectedException (typeof (IOException))]
                public void CtorAccess1Write2Write ()
                {
@@ -1021,7 +1042,6 @@ namespace MonoTests.System.IO
                        DeleteFile (path);
                }
 
-               [Category("TargetJvmNotSupported")] // File locking not supported for TARGET_JVM
                public void TestLock ()
                {
                        string path = TempFolder + Path.DirectorySeparatorChar + "TestLock";
@@ -1310,7 +1330,6 @@ namespace MonoTests.System.IO
                        }
                }
 
-#if !TARGET_JVM // No support IntPtr file handles under TARGET_JVM
                // Check that the stream is flushed even when it doesn't own the
                // handle
                [Test]
@@ -1330,7 +1349,6 @@ namespace MonoTests.System.IO
                        Assert.AreEqual ((int) '1', s.ReadByte ());
                        s.Close ();
                }
-#endif // TARGET_JVM
 
                private void DeleteFile (string path)
                {
@@ -1446,14 +1464,12 @@ namespace MonoTests.System.IO
                        }
                }
 
-#if !TARGET_JVM // No support IntPtr file handles under TARGET_JVM
                [Test]
                [ExpectedException (typeof (ArgumentException))]
                public void Constructor_InvalidFileHandle ()
                {
                        new FileStream ((IntPtr) (-1L), FileAccess.Read);
                }
-#endif // TARGET_JVM
 
                [Test]
                public void PositionAfterSetLength ()
@@ -1492,7 +1508,6 @@ namespace MonoTests.System.IO
                }
 
                [Test]
-               [Category("TargetJvmNotSupported")] // Async IO not supported for TARGET_JVM
                [ExpectedException (typeof (ObjectDisposedException))]
                public void BeginRead_Disposed ()
                {
@@ -1504,7 +1519,6 @@ namespace MonoTests.System.IO
                }
 
                [Test]
-               [Category("TargetJvmNotSupported")] // Async IO not supported for TARGET_JVM
                [ExpectedException (typeof (ObjectDisposedException))]
                public void BeginWrite_Disposed ()
                {
@@ -1515,8 +1529,36 @@ namespace MonoTests.System.IO
                        stream.EndWrite (stream.BeginWrite (new byte[8], 0, 8, null, null));
                }
 
+               static IAsyncResult DoBeginWrite(Stream stream, ManualResetEvent mre, byte[] RandomBuffer)
+               {
+                       return stream.BeginWrite (RandomBuffer, 0, RandomBuffer.Length, ar => {
+                               stream.EndWrite (ar);
+
+                               // we don't supply an ManualResetEvent so this will throw an NRE on the second run
+                               // which nunit-console will ignore (but other test runners don't like that)
+                               if (mre == null)
+                                       return;
+
+                               DoBeginWrite (stream, null, RandomBuffer).AsyncWaitHandle.WaitOne ();
+                               mre.Set ();
+                       }, null);
+               }
+
+               [Test]
+               public void BeginWrite_Recursive ()
+               {
+                       string path = TempFolder + Path.DirectorySeparatorChar + "temp";
+                       DeleteFile (path);
+       
+                       using (FileStream stream = new FileStream (path, FileMode.OpenOrCreate, FileAccess.Write)) {
+                               var mre = new ManualResetEvent (false); 
+                               var RandomBuffer = new byte[1024];                      
+                               DoBeginWrite (stream, mre, RandomBuffer);
+                               Assert.IsTrue (mre.WaitOne (5000), "#1");
+                       }
+               }
+
                [Test]
-               [Category("TargetJvmNotSupported")] // File locking not supported for TARGET_JVM
                [ExpectedException (typeof (ObjectDisposedException))]
                public void Lock_Disposed ()
                {
@@ -1528,7 +1570,6 @@ namespace MonoTests.System.IO
                }
 
                [Test]
-               [Category("TargetJvmNotSupported")] // File locking not supported for TARGET_JVM
                [ExpectedException (typeof (ObjectDisposedException))]
                public void Unlock_Disposed ()
                {
@@ -1591,7 +1632,6 @@ namespace MonoTests.System.IO
                        }
                }
 
-               [Category("TargetJvmNotSupported")] // FileOptions.DeleteOnClose not supported for TARGET_JVM
                [Test]
                public void DeleteOnClose ()
                {
@@ -1604,6 +1644,7 @@ namespace MonoTests.System.IO
                        Assert.AreEqual (false, File.Exists (path), "DOC#2");
                        
                }
+
 #if !MOBILE
                [Test]
                public void WriteWithExposedHandle ()
@@ -1638,6 +1679,17 @@ namespace MonoTests.System.IO
                                DeleteFile (path);
                        }
                }
+
+               [Test]
+               public void Ctor_InvalidSafeHandle ()
+               {
+                       var sf = new SafeFileHandle (IntPtr.Zero, true);
+                       try {
+                               new FileStream (sf, FileAccess.ReadWrite);
+                               Assert.Fail ("#1");
+                       } catch (ArgumentException) {
+                       }
+               }
 #endif
        }
 }