Merge pull request #1624 from esdrubal/getprocesstimes
[mono.git] / mcs / class / System / Test / System.IO.Compression / DeflateStreamTest.cs
index 61eda5b803005e56480528082438e0396f555563..3a0c7d89e5816ad949edc7f6a32e57d643f7efe2 100644 (file)
@@ -8,12 +8,12 @@
 // (C) 2004 Novell, Inc. <http://www.novell.com>
 // 
 
-#if NET_2_0
 
 using NUnit.Framework;
 using System;
 using System.IO;
 using System.IO.Compression;
+using System.Text;
 
 namespace MonoTests.System.IO.Compression
 {
@@ -90,6 +90,17 @@ namespace MonoTests.System.IO.Compression
                        decompressing.Close();
                }
 
+               // https://bugzilla.xamarin.com/show_bug.cgi?id=22346
+               [Test]
+               public void CheckEmptyRead ()
+               {
+                       byte [] dummy = new byte[1];
+                       byte [] data = new byte[0];
+                       MemoryStream backing = new MemoryStream (data);
+                       DeflateStream compressing = new DeflateStream (backing, CompressionMode.Decompress);
+                       compressing.Read (dummy, 0, 1);
+               }
+
                [Test]
                [ExpectedException (typeof (ArgumentNullException))]
                public void CheckNullRead ()
@@ -297,8 +308,73 @@ namespace MonoTests.System.IO.Compression
                                }
                        }
                }
+               
+               class Bug19313Stream : MemoryStream
+               {
+                       public Bug19313Stream (byte [] buffer)
+                               : base (buffer)
+                       {
+                       }
+
+                       public override int Read (byte [] buffer, int offset, int count)
+                       {
+                               // Thread was blocking when DeflateStream uses a NetworkStream.
+                               // Because the NetworkStream.Read calls Socket.Receive that
+                               // blocks the thread waiting for at least a byte to return.
+                               // This assert guarantees that Read is called only when there 
+                               // is something to be read.
+                               Assert.IsTrue (Position < Length, "Trying to read empty stream.");
+
+                               return base.Read (buffer, offset, count);
+                       }
+               }
+
+               [Test]
+               public void Bug19313 ()
+               {
+                       byte [] buffer  = new byte [512];
+                       using (var backing = new Bug19313Stream (compressed_data))
+                       using (var decompressing = new DeflateStream (backing, CompressionMode.Decompress))
+                               decompressing.Read (buffer, 0, buffer.Length);
+               }
+
+               public MemoryStream GenerateStreamFromString(string s)
+               {
+                       return new MemoryStream (Encoding.UTF8.GetBytes (s));
+               }
+
+#if NET_4_5
+               [Test]
+               public void CheckNet45Overloads () // Xambug #21982
+               {
+                       MemoryStream dataStream = GenerateStreamFromString("Hello");
+                       MemoryStream backing = new MemoryStream ();
+                       DeflateStream compressing = new DeflateStream (backing, CompressionLevel.Fastest, true);
+                       CopyStream (dataStream, compressing);
+                       dataStream.Close();
+                       compressing.Close();
+
+                       backing.Seek (0, SeekOrigin.Begin);
+                       DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
+                       StreamReader reader = new StreamReader (decompressing);
+                       Assert.AreEqual ("Hello", reader.ReadLine ());
+                       decompressing.Close();
+                       backing.Close();
+               }
+#endif 
+
+               [Test]
+               [ExpectedException (typeof (ArgumentException))]
+               public void CheckBufferOverrun ()
+               {
+                       byte[] data = new byte [20];
+                       MemoryStream backing = new MemoryStream ();
+                       DeflateStream compressing = new DeflateStream (backing, CompressionLevel.Fastest, true);
+                       compressing.Write (data, 0, data.Length + 1);
+                       compressing.Close ();
+                       backing.Close ();
+               }
        }
 }
 
-#endif