using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
+using Microsoft.Win32.SafeHandles;
namespace MonoTests.System.IO
{
static IAsyncResult DoBeginWrite(Stream stream, ManualResetEvent mre, byte[] RandomBuffer)
{
return stream.BeginWrite (RandomBuffer, 0, RandomBuffer.Length, ar => {
- stream.EndWrite (ar);
+ IAsyncResult begin_write_recursive_ares;
- // 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;
+ try {
+ stream.EndWrite (ar);
- DoBeginWrite (stream, null, RandomBuffer).AsyncWaitHandle.WaitOne ();
- mre.Set ();
+ // 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;
+
+ begin_write_recursive_ares = DoBeginWrite (stream, null, RandomBuffer);
+ begin_write_recursive_ares.AsyncWaitHandle.WaitOne ();
+
+ mre.Set ();
+ } catch (ObjectDisposedException e) {
+ Console.WriteLine ("stream was disposed: {0}", e);
+ }
}, null);
}
{
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");
+
+ IAsyncResult begin_write_ares = null;
+
+ try {
+ using (FileStream stream = new FileStream (path, FileMode.OpenOrCreate, FileAccess.Write)) {
+ var mre = new ManualResetEvent (false);
+ var RandomBuffer = new byte[1024];
+ begin_write_ares = DoBeginWrite (stream, mre, RandomBuffer);
+ Assert.IsTrue (mre.WaitOne (5000), "#1");
+ }
+ } finally {
+ if (begin_write_ares != null)
+ begin_write_ares.AsyncWaitHandle.WaitOne ();
}
}
}
+ [Test]
+ public void OpenCharDeviceRepeatedly ()
+ {
+ // https://bugzilla.xamarin.com/show_bug.cgi?id=38408
+ try {
+ using (var f = new FileStream ("/dev/zero", FileMode.Open))
+ {
+ }
+ } catch (FileNotFoundException) {
+ // Only run this test on platforms where /dev/zero exists
+ Assert.Ignore();
+ }
+
+ // this shouldn't throw
+ using (var g = new FileStream ("/dev/zero", FileMode.Open))
+ {
+ }
+ }
+
#if !MOBILE
[Test]
public void WriteWithExposedHandle ()
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
+
+ [Test] // Covers #11699
+ public void ReadWriteFileLength ()
+ {
+ int bufferSize = 128;
+ int readLength = 1;
+ int writeLength = bufferSize + 1;
+
+ string path = TempFolder + DSC + "readwritefilelength.tmp";
+
+ try {
+ File.WriteAllBytes (path, new byte [readLength + 1]);
+
+ using (var file = new FileStream (path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read,
+ bufferSize, FileOptions.SequentialScan))
+ {
+ file.Read (new byte [readLength], 0, readLength);
+ file.Write (new byte [writeLength], 0, writeLength);
+
+ Assert.AreEqual (readLength + writeLength, file.Length);
+ }
+ } finally {
+ DeleteFile (path);
+ }
+ }
}
}