1
1
using System ;
2
2
using System . IO ;
3
+ using System . Threading ;
3
4
4
5
using ICSharpCode . SharpZipLib . Zip . Compression ;
5
6
using ICSharpCode . SharpZipLib . Zip . Compression . Streams ;
6
7
using ICSharpCode . SharpZipLib . GZip ;
7
8
8
9
using NUnit . Framework ;
9
10
11
+ using ICSharpCode . SharpZipLib . Tests . TestSupport ;
12
+
10
13
namespace ICSharpCode . SharpZipLib . Tests . GZip
11
14
{
12
15
/// <summary>
@@ -24,21 +27,22 @@ public void TestGZip()
24
27
{
25
28
MemoryStream ms = new MemoryStream ( ) ;
26
29
GZipOutputStream outStream = new GZipOutputStream ( ms ) ;
27
-
30
+
28
31
byte [ ] buf = new byte [ 100000 ] ;
29
32
System . Random rnd = new Random ( ) ;
30
33
rnd . NextBytes ( buf ) ;
31
-
34
+
32
35
outStream . Write ( buf , 0 , buf . Length ) ;
33
36
outStream . Flush ( ) ;
34
37
outStream . Finish ( ) ;
35
-
38
+
36
39
ms . Seek ( 0 , SeekOrigin . Begin ) ;
37
-
40
+
38
41
GZipInputStream inStream = new GZipInputStream ( ms ) ;
39
42
byte [ ] buf2 = new byte [ buf . Length ] ;
40
- int currentIndex = 0 ;
41
- int count = buf2 . Length ;
43
+ int currentIndex = 0 ;
44
+ int count = buf2 . Length ;
45
+
42
46
while ( true ) {
43
47
int numRead = inStream . Read ( buf2 , currentIndex , count ) ;
44
48
if ( numRead <= 0 ) {
@@ -47,6 +51,8 @@ public void TestGZip()
47
51
currentIndex += numRead ;
48
52
count -= numRead ;
49
53
}
54
+
55
+ Assert . AreEqual ( 0 , count ) ;
50
56
51
57
for ( int i = 0 ; i < buf . Length ; ++ i ) {
52
58
Assert . AreEqual ( buf2 [ i ] , buf [ i ] ) ;
@@ -57,14 +63,16 @@ public void TestGZip()
57
63
/// Writing GZip headers is delayed so that this stream can be used with HTTP/IIS.
58
64
/// </summary>
59
65
[ Test ]
66
+ [ Category ( "GZip" ) ]
60
67
public void DelayedHeaderWriteNoData ( )
61
68
{
62
69
MemoryStream ms = new MemoryStream ( ) ;
63
70
Assert . AreEqual ( 0 , ms . Length ) ;
64
- using ( GZipOutputStream outStream = new GZipOutputStream ( ms ) )
65
- {
71
+
72
+ using ( GZipOutputStream outStream = new GZipOutputStream ( ms ) ) {
66
73
Assert . AreEqual ( 0 , ms . Length ) ;
67
74
}
75
+
68
76
byte [ ] data = ms . ToArray ( ) ;
69
77
70
78
Assert . IsTrue ( data . Length > 0 ) ;
@@ -74,12 +82,12 @@ public void DelayedHeaderWriteNoData()
74
82
/// Writing GZip headers is delayed so that this stream can be used with HTTP/IIS.
75
83
/// </summary>
76
84
[ Test ]
85
+ [ Category ( "GZip" ) ]
77
86
public void DelayedHeaderWriteWithData ( )
78
87
{
79
88
MemoryStream ms = new MemoryStream ( ) ;
80
89
Assert . AreEqual ( 0 , ms . Length ) ;
81
- using ( GZipOutputStream outStream = new GZipOutputStream ( ms ) )
82
- {
90
+ using ( GZipOutputStream outStream = new GZipOutputStream ( ms ) ) {
83
91
Assert . AreEqual ( 0 , ms . Length ) ;
84
92
outStream . WriteByte ( 45 ) ;
85
93
@@ -93,19 +101,163 @@ public void DelayedHeaderWriteWithData()
93
101
}
94
102
95
103
[ Test ]
104
+ [ Category ( "GZip" ) ]
96
105
public void ZeroLengthInputStream ( )
97
106
{
98
107
GZipInputStream gzi = new GZipInputStream ( new MemoryStream ( ) ) ;
99
108
bool exception = false ;
100
109
try {
101
110
gzi . ReadByte ( ) ;
102
111
}
103
- catch
104
- {
112
+ catch {
105
113
exception = true ;
106
114
}
107
-
115
+
108
116
Assert . IsTrue ( exception , "reading from an empty stream should cause an exception" ) ;
109
117
}
118
+
119
+ [ Test ]
120
+ [ Category ( "GZip" ) ]
121
+ public void OutputStreamOwnership ( )
122
+ {
123
+ MemoryStreamEx memStream = new MemoryStreamEx ( ) ;
124
+ GZipOutputStream s = new GZipOutputStream ( memStream ) ;
125
+
126
+ Assert . IsFalse ( memStream . IsClosed , "Shouldnt be closed initially" ) ;
127
+ Assert . IsFalse ( memStream . IsDisposed , "Shouldnt be disposed initially" ) ;
128
+
129
+ s . Close ( ) ;
130
+
131
+ Assert . IsTrue ( memStream . IsClosed , "Should be closed after parent owner close" ) ;
132
+ Assert . IsTrue ( memStream . IsDisposed , "Should be disposed after parent owner close" ) ;
133
+
134
+ memStream = new MemoryStreamEx ( ) ;
135
+ s = new GZipOutputStream ( memStream ) ;
136
+
137
+ Assert . IsFalse ( memStream . IsClosed , "Shouldnt be closed initially" ) ;
138
+ Assert . IsFalse ( memStream . IsDisposed , "Shouldnt be disposed initially" ) ;
139
+
140
+ s . IsStreamOwner = false ;
141
+ s . Close ( ) ;
142
+
143
+ Assert . IsFalse ( memStream . IsClosed , "Should not be closed after parent owner close" ) ;
144
+ Assert . IsFalse ( memStream . IsDisposed , "Should not be disposed after parent owner close" ) ;
145
+ }
146
+
147
+ [ Test ]
148
+ [ Category ( "GZip" ) ]
149
+ public void InputStreamOwnership ( )
150
+ {
151
+ MemoryStreamEx memStream = new MemoryStreamEx ( ) ;
152
+ GZipInputStream s = new GZipInputStream ( memStream ) ;
153
+
154
+ Assert . IsFalse ( memStream . IsClosed , "Shouldnt be closed initially" ) ;
155
+ Assert . IsFalse ( memStream . IsDisposed , "Shouldnt be disposed initially" ) ;
156
+
157
+ s . Close ( ) ;
158
+
159
+ Assert . IsTrue ( memStream . IsClosed , "Should be closed after parent owner close" ) ;
160
+ Assert . IsTrue ( memStream . IsDisposed , "Should be disposed after parent owner close" ) ;
161
+
162
+ memStream = new MemoryStreamEx ( ) ;
163
+ s = new GZipInputStream ( memStream ) ;
164
+
165
+ Assert . IsFalse ( memStream . IsClosed , "Shouldnt be closed initially" ) ;
166
+ Assert . IsFalse ( memStream . IsDisposed , "Shouldnt be disposed initially" ) ;
167
+
168
+ s . IsStreamOwner = false ;
169
+ s . Close ( ) ;
170
+
171
+ Assert . IsFalse ( memStream . IsClosed , "Should not be closed after parent owner close" ) ;
172
+ Assert . IsFalse ( memStream . IsDisposed , "Should not be disposed after parent owner close" ) ;
173
+
174
+ }
175
+
176
+ [ Test ]
177
+ [ Category ( "GZip" ) ]
178
+ [ Category ( "Long Running" ) ]
179
+ public void BigStream ( )
180
+ {
181
+ window_ = new WindowedStream ( 0x3ffff ) ;
182
+ outStream_ = new GZipOutputStream ( window_ ) ;
183
+ inStream_ = new GZipInputStream ( window_ ) ;
184
+
185
+ long target = 0x10000000 ;
186
+ readTarget_ = writeTarget_ = target ;
187
+
188
+ Thread reader = new Thread ( Reader ) ;
189
+ reader . Name = "Reader" ;
190
+ reader . Start ( ) ;
191
+
192
+ Thread writer = new Thread ( Writer ) ;
193
+ writer . Name = "Writer" ;
194
+
195
+ DateTime startTime = DateTime . Now ;
196
+ writer . Start ( ) ;
197
+
198
+ writer . Join ( ) ;
199
+ reader . Join ( ) ;
200
+
201
+ DateTime endTime = DateTime . Now ;
202
+
203
+ TimeSpan span = endTime - startTime ;
204
+ Console . WriteLine ( "Time {0} processes {1} KB/Sec" , span , ( target / 1024 ) / span . TotalSeconds ) ;
205
+ }
206
+
207
+ void Reader ( )
208
+ {
209
+ const int Size = 8192 ;
210
+ int readBytes = 1 ;
211
+ byte [ ] buffer = new byte [ Size ] ;
212
+
213
+ long passifierLevel = readTarget_ - 0x10000000 ;
214
+
215
+ while ( ( readTarget_ > 0 ) && ( readBytes > 0 ) ) {
216
+ int count = Size ;
217
+ if ( count > readTarget_ ) {
218
+ count = ( int ) readTarget_ ;
219
+ }
220
+
221
+ readBytes = inStream_ . Read ( buffer , 0 , count ) ;
222
+ readTarget_ -= readBytes ;
223
+
224
+ if ( readTarget_ <= passifierLevel ) {
225
+ Console . WriteLine ( "Reader {0} bytes remaining" , readTarget_ ) ;
226
+ passifierLevel = readTarget_ - 0x10000000 ;
227
+ }
228
+ }
229
+
230
+ Assert . IsTrue ( window_ . IsClosed , "Window should be closed" ) ;
231
+
232
+ // This shouldnt read any data but should read the footer
233
+ readBytes = inStream_ . Read ( buffer , 0 , 1 ) ;
234
+ Assert . AreEqual ( 0 , readBytes , "Stream should be empty" ) ;
235
+ Assert . AreEqual ( 0 , window_ . Length , "Window should be closed" ) ;
236
+ inStream_ . Close ( ) ;
237
+ }
238
+
239
+ void Writer ( )
240
+ {
241
+ const int Size = 8192 ;
242
+
243
+ byte [ ] buffer = new byte [ Size ] ;
244
+
245
+ while ( writeTarget_ > 0 ) {
246
+ int thisTime = Size ;
247
+ if ( thisTime > writeTarget_ ) {
248
+ thisTime = ( int ) writeTarget_ ;
249
+ }
250
+
251
+ outStream_ . Write ( buffer , 0 , thisTime ) ;
252
+ writeTarget_ -= thisTime ;
253
+ }
254
+ outStream_ . Close ( ) ;
255
+ }
256
+
257
+ WindowedStream window_ ;
258
+ GZipOutputStream outStream_ ;
259
+ GZipInputStream inStream_ ;
260
+ long readTarget_ ;
261
+ long writeTarget_ ;
110
262
}
111
263
}
0 commit comments