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>
13 using NUnit.Framework;
16 using System.IO.Compression;
19 namespace MonoTests.System.IO.Compression
22 public class DeflateStreamTest
24 private static void CopyStream (Stream src, Stream dest)
26 byte[] array = new byte[1024];
28 bytes_read = src.Read (array, 0, 1024);
29 while (bytes_read != 0) {
30 dest.Write (array, 0, bytes_read);
31 bytes_read = src.Read (array, 0, 1024);
35 private static bool compare_buffers (byte[] first, byte[] second, int length)
37 if (first.Length < length || second.Length < length) {
40 for (int i = 0; i < length; i++) {
41 if (first[i] != second[i]) {
49 [ExpectedException (typeof (ArgumentNullException))]
50 public void Constructor_Null ()
52 DeflateStream ds = new DeflateStream (null, CompressionMode.Compress);
56 [ExpectedException (typeof (ArgumentException))]
57 public void Constructor_InvalidCompressionMode ()
59 DeflateStream ds = new DeflateStream (new MemoryStream (), (CompressionMode)Int32.MinValue);
63 public void CheckCompressDecompress ()
65 byte [] data = new byte[100000];
66 for (int i = 0; i < 100000; i++) {
69 MemoryStream dataStream = new MemoryStream (data);
70 MemoryStream backing = new MemoryStream ();
71 DeflateStream compressing = new DeflateStream (backing, CompressionMode.Compress, true);
72 CopyStream (dataStream, compressing);
75 backing.Seek (0, SeekOrigin.Begin);
76 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
77 MemoryStream output = new MemoryStream ();
78 CopyStream (decompressing, output);
79 Assert.IsTrue (compare_buffers (data, output.GetBuffer(), (int) output.Length));
80 decompressing.Close();
85 public void CheckDecompress ()
87 MemoryStream backing = new MemoryStream (compressed_data);
88 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
89 StreamReader reader = new StreamReader (decompressing);
90 Assert.AreEqual ("Hello", reader.ReadLine ());
91 decompressing.Close();
95 [ExpectedException (typeof (ArgumentNullException))]
96 public void CheckNullRead ()
98 MemoryStream backing = new MemoryStream (compressed_data);
99 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
100 decompressing.Read (null, 0, 20);
104 [ExpectedException (typeof (InvalidOperationException))]
105 public void CheckCompressingRead ()
107 byte [] dummy = new byte[20];
108 MemoryStream backing = new MemoryStream ();
109 DeflateStream compressing = new DeflateStream (backing, CompressionMode.Compress);
110 compressing.Read (dummy, 0, 20);
114 [ExpectedException (typeof (ArgumentException))]
115 public void CheckRangeRead ()
117 byte [] dummy = new byte[20];
118 MemoryStream backing = new MemoryStream (compressed_data);
119 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
120 decompressing.Read (dummy, 10, 20);
125 [Category("NotWorking")]
126 [ExpectedException (typeof (InvalidDataException))]
127 public void CheckInvalidDataRead ()
129 byte [] data = {0x11, 0x78, 0x89, 0x91, 0xbe, 0xf3, 0x48, 0xcd, 0xc9, 0xc9, 0xe7, 0x02, 0x00 };
130 byte [] dummy = new byte[20];
131 MemoryStream backing = new MemoryStream (data);
132 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
133 decompressing.Read (dummy, 0, 20);
138 [ExpectedException (typeof (ObjectDisposedException))]
139 public void CheckClosedRead ()
141 byte [] dummy = new byte[20];
142 MemoryStream backing = new MemoryStream (compressed_data);
143 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
144 decompressing.Close ();
145 decompressing.Read (dummy, 0, 20);
149 [ExpectedException (typeof (ObjectDisposedException))]
150 public void CheckClosedFlush ()
152 MemoryStream backing = new MemoryStream ();
153 DeflateStream compressing = new DeflateStream (backing, CompressionMode.Compress);
154 compressing.Close ();
155 compressing.Flush ();
159 [ExpectedException (typeof (NotSupportedException))]
160 public void CheckSeek ()
162 MemoryStream backing = new MemoryStream (compressed_data);
163 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
164 decompressing.Seek (20, SeekOrigin.Current);
168 [ExpectedException (typeof (NotSupportedException))]
169 public void CheckSetLength ()
171 MemoryStream backing = new MemoryStream (compressed_data);
172 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
173 decompressing.SetLength (20);
177 public void CheckGetCanSeekProp ()
179 MemoryStream backing = new MemoryStream (compressed_data);
180 DeflateStream decompress = new DeflateStream (backing, CompressionMode.Decompress);
181 Assert.IsFalse (decompress.CanSeek, "#A1");
182 Assert.IsTrue (backing.CanSeek, "#A2");
183 decompress.Dispose ();
184 Assert.IsFalse (decompress.CanSeek, "#A3");
185 Assert.IsFalse (backing.CanSeek, "#A4");
187 backing = new MemoryStream ();
188 DeflateStream compress = new DeflateStream (backing, CompressionMode.Compress);
189 Assert.IsFalse (compress.CanSeek, "#B1");
190 Assert.IsTrue (backing.CanSeek, "#B2");
192 Assert.IsFalse (decompress.CanSeek, "#B3");
193 Assert.IsFalse (backing.CanSeek, "#B4");
197 public void CheckGetCanReadProp ()
199 MemoryStream backing = new MemoryStream (compressed_data);
200 DeflateStream decompress = new DeflateStream (backing, CompressionMode.Decompress);
201 Assert.IsTrue (decompress.CanRead, "#A1");
202 Assert.IsTrue (backing.CanRead, "#A2");
203 decompress.Dispose ();
204 Assert.IsFalse (decompress.CanRead, "#A3");
205 Assert.IsFalse (backing.CanRead, "#A4");
207 backing = new MemoryStream ();
208 DeflateStream compress = new DeflateStream (backing, CompressionMode.Compress);
209 Assert.IsFalse (compress.CanRead, "#B1");
210 Assert.IsTrue (backing.CanRead, "#B2");
212 Assert.IsFalse (decompress.CanRead, "#B3");
213 Assert.IsFalse (backing.CanRead, "#B4");
217 public void CheckGetCanWriteProp ()
219 MemoryStream backing = new MemoryStream ();
220 DeflateStream decompress = new DeflateStream (backing, CompressionMode.Decompress);
221 Assert.IsFalse (decompress.CanWrite, "#A1");
222 Assert.IsTrue (backing.CanWrite, "#A2");
223 decompress.Dispose ();
224 Assert.IsFalse (decompress.CanWrite, "#A3");
225 Assert.IsFalse (backing.CanWrite, "#A4");
227 backing = new MemoryStream ();
228 DeflateStream compress = new DeflateStream (backing, CompressionMode.Compress);
229 Assert.IsTrue (compress.CanWrite, "#B1");
230 Assert.IsTrue (backing.CanWrite, "#B2");
232 Assert.IsFalse (decompress.CanWrite, "#B3");
233 Assert.IsFalse (backing.CanWrite, "#B4");
237 [ExpectedException (typeof (NotSupportedException))]
238 public void CheckSetLengthProp ()
240 MemoryStream backing = new MemoryStream (compressed_data);
241 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
242 decompressing.SetLength (20);
246 [ExpectedException (typeof (NotSupportedException))]
247 public void CheckGetLengthProp ()
249 MemoryStream backing = new MemoryStream (compressed_data);
250 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
251 long length = decompressing.Length;
255 [ExpectedException (typeof (NotSupportedException))]
256 public void CheckGetPositionProp ()
258 MemoryStream backing = new MemoryStream (compressed_data);
259 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
260 long position = decompressing.Position;
264 public void DisposeTest ()
266 MemoryStream backing = new MemoryStream (compressed_data);
267 DeflateStream decompress = new DeflateStream (backing, CompressionMode.Decompress);
268 decompress.Dispose ();
269 decompress.Dispose ();
272 static byte [] compressed_data = { 0xf3, 0x48, 0xcd, 0xc9, 0xc9,
277 public void JunkAtTheEnd ()
279 // Write a deflated stream, then some additional data...
280 using (MemoryStream ms = new MemoryStream())
282 // The compressed stream
283 using (DeflateStream stream = new DeflateStream(ms, CompressionMode.Compress, true))
292 // Reading: this should not hang
293 using (DeflateStream stream = new DeflateStream(ms, CompressionMode.Decompress))
295 byte[] buffer = new byte[512];
296 int len = stream.Read(buffer, 0, buffer.Length);
297 Console.WriteLine(len == 1);
302 class Bug19313Stream : MemoryStream
304 public Bug19313Stream (byte [] buffer)
309 public override int Read (byte [] buffer, int offset, int count)
311 // Thread was blocking when DeflateStream uses a NetworkStream.
312 // Because the NetworkStream.Read calls Socket.Receive that
313 // blocks the thread waiting for at least a byte to return.
314 // This assert guarantees that Read is called only when there
315 // is something to be read.
316 Assert.IsTrue (Position < Length, "Trying to read empty stream.");
318 return base.Read (buffer, offset, count);
323 public void Bug19313 ()
325 byte [] buffer = new byte [512];
326 using (var backing = new Bug19313Stream (compressed_data))
327 using (var decompressing = new DeflateStream (backing, CompressionMode.Decompress))
328 decompressing.Read (buffer, 0, buffer.Length);
331 public MemoryStream GenerateStreamFromString(string s)
333 return new MemoryStream (Encoding.UTF8.GetBytes (s));
337 public void CheckNet45Overloads () // Xambug #21982
339 MemoryStream dataStream = GenerateStreamFromString("Hello");
340 MemoryStream backing = new MemoryStream ();
341 DeflateStream compressing = new DeflateStream (backing, CompressionLevel.Fastest, true);
342 CopyStream (dataStream, compressing);
346 backing.Seek (0, SeekOrigin.Begin);
347 DeflateStream decompressing = new DeflateStream (backing, CompressionMode.Decompress);
348 StreamReader reader = new StreamReader (decompressing);
349 Assert.AreEqual ("Hello", reader.ReadLine ());
350 decompressing.Close();