1 /* -*- Mode: csharp; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3 // DeflateStreamTest.cs - NUnit Test Cases for the System.IO.Compression.DeflateStream class
6 // Christopher James Lahey <clahey@ximian.com>
8 // (C) 2004 Novell, Inc. <http://www.novell.com>
12 using NUnit.Framework;
15 using System.IO.Compression;
18 namespace MonoTests.System.IO.Compression
21 public class DeflateStreamTest
23 private static void CopyStream (Stream src, Stream dest)
25 byte[] array = new byte[1024];
27 bytes_read = src.Read (array, 0, 1024);
28 while (bytes_read != 0) {
29 dest.Write (array, 0, bytes_read);
30 bytes_read = src.Read (array, 0, 1024);
34 private static bool compare_buffers (byte[] first, byte[] second, int length)
36 if (first.Length < length || second.Length < length) {
39 for (int i = 0; i < length; i++) {
40 if (first[i] != second[i]) {
48 [ExpectedException (typeof (ArgumentNullException))]
49 public void Constructor_Null ()
51 DeflateStream ds = new DeflateStream (null, CompressionMode.Compress);
55 [ExpectedException (typeof (ArgumentException))]
56 public void Constructor_InvalidCompressionMode ()
58 DeflateStream ds = new DeflateStream (new MemoryStream (), (CompressionMode)Int32.MinValue);
62 public void CheckCompressDecompress ()
64 byte [] data = new byte[100000];
65 for (int i = 0; i < 100000; i++) {
68 MemoryStream dataStream = new MemoryStream (data);
69 MemoryStream backing = new MemoryStream ();
70 DeflateStream compressing = new DeflateStream (backing, CompressionMode.Compress, true);
71 CopyStream (dataStream, compressing);
74 backing.Seek (0, SeekOrigin.Begin);
75 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
76 MemoryStream output = new MemoryStream ();
77 CopyStream (decompressing, output);
78 Assert.IsTrue (compare_buffers (data, output.GetBuffer(), (int) output.Length));
79 decompressing.Close();
84 public void CheckDecompress ()
86 MemoryStream backing = new MemoryStream (compressed_data);
87 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
88 StreamReader reader = new StreamReader (decompressing);
89 Assert.AreEqual ("Hello", reader.ReadLine ());
90 decompressing.Close();
93 // https://bugzilla.xamarin.com/show_bug.cgi?id=22346
95 public void CheckEmptyRead ()
97 byte [] dummy = new byte[1];
98 byte [] data = new byte[0];
99 MemoryStream backing = new MemoryStream (data);
100 DeflateStream compressing = new DeflateStream (backing, CompressionMode.Decompress);
101 compressing.Read (dummy, 0, 1);
105 [ExpectedException (typeof (ArgumentNullException))]
106 public void CheckNullRead ()
108 MemoryStream backing = new MemoryStream (compressed_data);
109 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
110 decompressing.Read (null, 0, 20);
114 [ExpectedException (typeof (InvalidOperationException))]
115 public void CheckCompressingRead ()
117 byte [] dummy = new byte[20];
118 MemoryStream backing = new MemoryStream ();
119 DeflateStream compressing = new DeflateStream (backing, CompressionMode.Compress);
120 compressing.Read (dummy, 0, 20);
124 [ExpectedException (typeof (ArgumentException))]
125 public void CheckRangeRead ()
127 byte [] dummy = new byte[20];
128 MemoryStream backing = new MemoryStream (compressed_data);
129 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
130 decompressing.Read (dummy, 10, 20);
135 [Category("NotWorking")]
136 [ExpectedException (typeof (InvalidDataException))]
137 public void CheckInvalidDataRead ()
139 byte [] data = {0x11, 0x78, 0x89, 0x91, 0xbe, 0xf3, 0x48, 0xcd, 0xc9, 0xc9, 0xe7, 0x02, 0x00 };
140 byte [] dummy = new byte[20];
141 MemoryStream backing = new MemoryStream (data);
142 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
143 decompressing.Read (dummy, 0, 20);
148 [ExpectedException (typeof (ObjectDisposedException))]
149 public void CheckClosedRead ()
151 byte [] dummy = new byte[20];
152 MemoryStream backing = new MemoryStream (compressed_data);
153 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
154 decompressing.Close ();
155 decompressing.Read (dummy, 0, 20);
159 [ExpectedException (typeof (ObjectDisposedException))]
160 public void CheckClosedFlush ()
162 MemoryStream backing = new MemoryStream ();
163 DeflateStream compressing = new DeflateStream (backing, CompressionMode.Compress);
164 compressing.Close ();
165 compressing.Flush ();
169 [ExpectedException (typeof (NotSupportedException))]
170 public void CheckSeek ()
172 MemoryStream backing = new MemoryStream (compressed_data);
173 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
174 decompressing.Seek (20, SeekOrigin.Current);
178 [ExpectedException (typeof (NotSupportedException))]
179 public void CheckSetLength ()
181 MemoryStream backing = new MemoryStream (compressed_data);
182 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
183 decompressing.SetLength (20);
187 public void CheckGetCanSeekProp ()
189 MemoryStream backing = new MemoryStream (compressed_data);
190 DeflateStream decompress = new DeflateStream (backing, CompressionMode.Decompress);
191 Assert.IsFalse (decompress.CanSeek, "#A1");
192 Assert.IsTrue (backing.CanSeek, "#A2");
193 decompress.Dispose ();
194 Assert.IsFalse (decompress.CanSeek, "#A3");
195 Assert.IsFalse (backing.CanSeek, "#A4");
197 backing = new MemoryStream ();
198 DeflateStream compress = new DeflateStream (backing, CompressionMode.Compress);
199 Assert.IsFalse (compress.CanSeek, "#B1");
200 Assert.IsTrue (backing.CanSeek, "#B2");
202 Assert.IsFalse (decompress.CanSeek, "#B3");
203 Assert.IsFalse (backing.CanSeek, "#B4");
207 public void CheckGetCanReadProp ()
209 MemoryStream backing = new MemoryStream (compressed_data);
210 DeflateStream decompress = new DeflateStream (backing, CompressionMode.Decompress);
211 Assert.IsTrue (decompress.CanRead, "#A1");
212 Assert.IsTrue (backing.CanRead, "#A2");
213 decompress.Dispose ();
214 Assert.IsFalse (decompress.CanRead, "#A3");
215 Assert.IsFalse (backing.CanRead, "#A4");
217 backing = new MemoryStream ();
218 DeflateStream compress = new DeflateStream (backing, CompressionMode.Compress);
219 Assert.IsFalse (compress.CanRead, "#B1");
220 Assert.IsTrue (backing.CanRead, "#B2");
222 Assert.IsFalse (decompress.CanRead, "#B3");
223 Assert.IsFalse (backing.CanRead, "#B4");
227 public void CheckGetCanWriteProp ()
229 MemoryStream backing = new MemoryStream ();
230 DeflateStream decompress = new DeflateStream (backing, CompressionMode.Decompress);
231 Assert.IsFalse (decompress.CanWrite, "#A1");
232 Assert.IsTrue (backing.CanWrite, "#A2");
233 decompress.Dispose ();
234 Assert.IsFalse (decompress.CanWrite, "#A3");
235 Assert.IsFalse (backing.CanWrite, "#A4");
237 backing = new MemoryStream ();
238 DeflateStream compress = new DeflateStream (backing, CompressionMode.Compress);
239 Assert.IsTrue (compress.CanWrite, "#B1");
240 Assert.IsTrue (backing.CanWrite, "#B2");
242 Assert.IsFalse (decompress.CanWrite, "#B3");
243 Assert.IsFalse (backing.CanWrite, "#B4");
247 [ExpectedException (typeof (NotSupportedException))]
248 public void CheckSetLengthProp ()
250 MemoryStream backing = new MemoryStream (compressed_data);
251 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
252 decompressing.SetLength (20);
256 [ExpectedException (typeof (NotSupportedException))]
257 public void CheckGetLengthProp ()
259 MemoryStream backing = new MemoryStream (compressed_data);
260 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
261 long length = decompressing.Length;
265 [ExpectedException (typeof (NotSupportedException))]
266 public void CheckGetPositionProp ()
268 MemoryStream backing = new MemoryStream (compressed_data);
269 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
270 long position = decompressing.Position;
274 public void DisposeTest ()
276 MemoryStream backing = new MemoryStream (compressed_data);
277 DeflateStream decompress = new DeflateStream (backing, CompressionMode.Decompress);
278 decompress.Dispose ();
279 decompress.Dispose ();
282 static byte [] compressed_data = { 0xf3, 0x48, 0xcd, 0xc9, 0xc9,
287 public void JunkAtTheEnd ()
289 // Write a deflated stream, then some additional data...
290 using (MemoryStream ms = new MemoryStream())
292 // The compressed stream
293 using (DeflateStream stream = new DeflateStream(ms, CompressionMode.Compress, true))
302 // Reading: this should not hang
303 using (DeflateStream stream = new DeflateStream(ms, CompressionMode.Decompress))
305 byte[] buffer = new byte[512];
306 int len = stream.Read(buffer, 0, buffer.Length);
307 Console.WriteLine(len == 1);
312 class Bug19313Stream : MemoryStream
314 public Bug19313Stream (byte [] buffer)
319 public override int Read (byte [] buffer, int offset, int count)
321 // Thread was blocking when DeflateStream uses a NetworkStream.
322 // Because the NetworkStream.Read calls Socket.Receive that
323 // blocks the thread waiting for at least a byte to return.
324 // This assert guarantees that Read is called only when there
325 // is something to be read.
326 Assert.IsTrue (Position < Length, "Trying to read empty stream.");
328 return base.Read (buffer, offset, count);
333 public void Bug19313 ()
335 byte [] buffer = new byte [512];
336 using (var backing = new Bug19313Stream (compressed_data))
337 using (var decompressing = new DeflateStream (backing, CompressionMode.Decompress))
338 decompressing.Read (buffer, 0, buffer.Length);
341 public MemoryStream GenerateStreamFromString(string s)
343 return new MemoryStream (Encoding.UTF8.GetBytes (s));
348 public void CheckNet45Overloads () // Xambug #21982
350 MemoryStream dataStream = GenerateStreamFromString("Hello");
351 MemoryStream backing = new MemoryStream ();
352 DeflateStream compressing = new DeflateStream (backing, CompressionLevel.Fastest, true);
353 CopyStream (dataStream, compressing);
357 backing.Seek (0, SeekOrigin.Begin);
358 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
359 StreamReader reader = new StreamReader (decompressing);
360 Assert.AreEqual ("Hello", reader.ReadLine ());
361 decompressing.Close();