3 using System.Threading;
4 using ICSharpCode.SharpZipLib.Silverlight.GZip;
7 using ICSharpCode.SharpZipLib.Tests.TestSupport;
9 namespace ICSharpCode.SharpZipLib.Tests.GZip
12 /// This class contains test cases for GZip compression
15 public class GZipTestSuite
18 /// Basic compress/decompress test
22 public void TestGZip()
24 MemoryStream ms = new MemoryStream();
25 GZipOutputStream outStream = new GZipOutputStream(ms);
27 byte[] buf = new byte[100000];
28 System.Random rnd = new Random();
31 outStream.Write(buf, 0, buf.Length);
35 ms.Seek(0, SeekOrigin.Begin);
37 GZipInputStream inStream = new GZipInputStream(ms);
38 byte[] buf2 = new byte[buf.Length];
40 int count = buf2.Length;
43 int numRead = inStream.Read(buf2, currentIndex, count);
47 currentIndex += numRead;
51 Assert.AreEqual(0, count);
53 for (int i = 0; i < buf.Length; ++i) {
54 Assert.AreEqual(buf2[i], buf[i]);
59 /// Writing GZip headers is delayed so that this stream can be used with HTTP/IIS.
63 public void DelayedHeaderWriteNoData()
65 MemoryStream ms = new MemoryStream();
66 Assert.AreEqual(0, ms.Length);
68 using (GZipOutputStream outStream = new GZipOutputStream(ms)) {
69 Assert.AreEqual(0, ms.Length);
72 byte[] data = ms.ToArray();
74 Assert.IsTrue(data.Length > 0);
78 /// Writing GZip headers is delayed so that this stream can be used with HTTP/IIS.
82 public void DelayedHeaderWriteWithData()
84 MemoryStream ms = new MemoryStream();
85 Assert.AreEqual(0, ms.Length);
86 using (GZipOutputStream outStream = new GZipOutputStream(ms)) {
87 Assert.AreEqual(0, ms.Length);
88 outStream.WriteByte(45);
90 // Should in fact contain header right now with
91 // 1 byte in the compression pipeline
92 Assert.AreEqual(10, ms.Length);
94 byte[] data = ms.ToArray();
96 Assert.IsTrue(data.Length > 0);
101 public void ZeroLengthInputStream()
103 GZipInputStream gzi = new GZipInputStream(new MemoryStream());
104 bool exception = false;
112 Assert.IsTrue(exception, "reading from an empty stream should cause an exception");
117 public void OutputStreamOwnership()
119 MemoryStreamEx memStream = new MemoryStreamEx();
120 GZipOutputStream s = new GZipOutputStream(memStream);
122 Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
123 Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");
127 Assert.IsTrue(memStream.IsClosed, "Should be closed after parent owner close");
128 Assert.IsTrue(memStream.IsDisposed, "Should be disposed after parent owner close");
130 memStream = new MemoryStreamEx();
131 s = new GZipOutputStream(memStream);
133 Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
134 Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");
136 s.IsStreamOwner = false;
139 Assert.IsFalse(memStream.IsClosed, "Should not be closed after parent owner close");
140 Assert.IsFalse(memStream.IsDisposed, "Should not be disposed after parent owner close");
145 public void InputStreamOwnership()
147 MemoryStreamEx memStream = new MemoryStreamEx();
148 GZipInputStream s = new GZipInputStream(memStream);
150 Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
151 Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");
155 Assert.IsTrue(memStream.IsClosed, "Should be closed after parent owner close");
156 Assert.IsTrue(memStream.IsDisposed, "Should be disposed after parent owner close");
158 memStream = new MemoryStreamEx();
159 s = new GZipInputStream(memStream);
161 Assert.IsFalse(memStream.IsClosed, "Shouldnt be closed initially");
162 Assert.IsFalse(memStream.IsDisposed, "Shouldnt be disposed initially");
164 s.IsStreamOwner = false;
167 Assert.IsFalse(memStream.IsClosed, "Should not be closed after parent owner close");
168 Assert.IsFalse(memStream.IsDisposed, "Should not be disposed after parent owner close");
174 [Category("Long Running")]
175 public void BigStream()
177 window_ = new WindowedStream(0x3ffff);
178 outStream_ = new GZipOutputStream(window_);
179 inStream_ = new GZipInputStream(window_);
181 long target = 0x10000000;
182 readTarget_ = writeTarget_ = target;
184 Thread reader = new Thread(Reader);
185 reader.Name = "Reader";
188 Thread writer = new Thread(Writer);
189 writer.Name = "Writer";
191 DateTime startTime = DateTime.Now;
197 DateTime endTime = DateTime.Now;
199 TimeSpan span = endTime - startTime;
200 Console.WriteLine("Time {0} processes {1} KB/Sec", span, (target / 1024) / span.TotalSeconds);
205 const int Size = 8192;
207 byte[] buffer = new byte[Size];
209 long passifierLevel = readTarget_ - 0x10000000;
211 while ( (readTarget_ > 0) && (readBytes > 0) ) {
213 if (count > readTarget_) {
214 count = (int)readTarget_;
217 readBytes = inStream_.Read(buffer, 0, count);
218 readTarget_ -= readBytes;
220 if (readTarget_ <= passifierLevel) {
221 Console.WriteLine("Reader {0} bytes remaining", readTarget_);
222 passifierLevel = readTarget_ - 0x10000000;
226 Assert.IsTrue(window_.IsClosed, "Window should be closed");
228 // This shouldnt read any data but should read the footer
229 readBytes = inStream_.Read(buffer, 0, 1);
230 Assert.AreEqual(0, readBytes, "Stream should be empty");
231 Assert.AreEqual(0, window_.Length, "Window should be closed");
237 const int Size = 8192;
239 byte[] buffer = new byte[Size];
241 while (writeTarget_ > 0) {
243 if (thisTime > writeTarget_) {
244 thisTime = (int)writeTarget_;
247 outStream_.Write(buffer, 0, thisTime);
248 writeTarget_-= thisTime;
253 WindowedStream window_;
254 GZipOutputStream outStream_;
255 GZipInputStream inStream_;