Skip to content

Commit ff559a8

Browse files
committed
add some basic async unit tests for the deflator streams
1 parent a11665d commit ff559a8

File tree

1 file changed

+119
-44
lines changed

1 file changed

+119
-44
lines changed

test/ICSharpCode.SharpZipLib.Tests/Base/InflaterDeflaterTests.cs

+119-44
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.IO;
77
using System.Security;
88
using System.Text;
9+
using System.Threading.Tasks;
910

1011
namespace ICSharpCode.SharpZipLib.Tests.Base
1112
{
@@ -15,19 +16,50 @@ namespace ICSharpCode.SharpZipLib.Tests.Base
1516
[TestFixture]
1617
public class InflaterDeflaterTestSuite
1718
{
18-
private void Inflate(MemoryStream ms, byte[] original, int level, bool zlib)
19+
private void VerifyInflatedData(byte[] original, byte[] buf2, int level, bool zlib)
1920
{
20-
ms.Seek(0, SeekOrigin.Begin);
21+
for (int i = 0; i < original.Length; ++i)
22+
{
23+
if (buf2[i] != original[i])
24+
{
25+
string description = string.Format("Difference at {0} level {1} zlib {2} ", i, level, zlib);
26+
if (original.Length < 2048)
27+
{
28+
var builder = new StringBuilder(description);
29+
for (int d = 0; d < original.Length; ++d)
30+
{
31+
builder.AppendFormat("{0} ", original[d]);
32+
}
33+
34+
Assert.Fail(builder.ToString());
35+
}
36+
else
37+
{
38+
Assert.Fail(description);
39+
}
40+
}
41+
}
42+
}
43+
44+
private static InflaterInputStream GetInflaterInputStream(Stream compressedStream, bool zlib)
45+
{
46+
compressedStream.Seek(0, SeekOrigin.Begin);
2147

2248
var inflater = new Inflater(!zlib);
23-
var inStream = new InflaterInputStream(ms, inflater);
24-
byte[] buf2 = new byte[original.Length];
49+
var inStream = new InflaterInputStream(compressedStream, inflater);
2550

26-
int currentIndex = 0;
27-
int count = buf2.Length;
51+
return inStream;
52+
}
2853

29-
try
54+
private void Inflate(MemoryStream ms, byte[] original, int level, bool zlib)
55+
{
56+
byte[] buf2 = new byte[original.Length];
57+
58+
using (var inStream = GetInflaterInputStream(ms, zlib))
3059
{
60+
int currentIndex = 0;
61+
int count = buf2.Length;
62+
3163
while (true)
3264
{
3365
int numRead = inStream.Read(buf2, currentIndex, count);
@@ -38,40 +70,37 @@ private void Inflate(MemoryStream ms, byte[] original, int level, bool zlib)
3870
currentIndex += numRead;
3971
count -= numRead;
4072
}
41-
}
42-
catch (Exception ex)
43-
{
44-
Console.WriteLine("Unexpected exception - '{0}'", ex.Message);
45-
throw;
46-
}
4773

48-
if (currentIndex != original.Length)
49-
{
50-
Console.WriteLine("Original {0}, new {1}", original.Length, currentIndex);
51-
Assert.Fail("Lengths different");
74+
Assert.That(currentIndex, Is.EqualTo(original.Length), "Decompressed data must have the same length as the original data");
5275
}
5376

54-
for (int i = 0; i < original.Length; ++i)
77+
VerifyInflatedData(original, buf2, level, zlib);
78+
}
79+
80+
private async Task InflateAsync(MemoryStream ms, byte[] original, int level, bool zlib)
81+
{
82+
byte[] buf2 = new byte[original.Length];
83+
84+
using (var inStream = GetInflaterInputStream(ms, zlib))
5585
{
56-
if (buf2[i] != original[i])
57-
{
58-
string description = string.Format("Difference at {0} level {1} zlib {2} ", i, level, zlib);
59-
if (original.Length < 2048)
60-
{
61-
var builder = new StringBuilder(description);
62-
for (int d = 0; d < original.Length; ++d)
63-
{
64-
builder.AppendFormat("{0} ", original[d]);
65-
}
86+
int currentIndex = 0;
87+
int count = buf2.Length;
6688

67-
Assert.Fail(builder.ToString());
68-
}
69-
else
89+
while (true)
90+
{
91+
int numRead = await inStream.ReadAsync(buf2, currentIndex, count);
92+
if (numRead <= 0)
7093
{
71-
Assert.Fail(description);
94+
break;
7295
}
96+
currentIndex += numRead;
97+
count -= numRead;
7398
}
99+
100+
Assert.That(currentIndex, Is.EqualTo(original.Length), "Decompressed data must have the same length as the original data");
74101
}
102+
103+
VerifyInflatedData(original, buf2, level, zlib);
75104
}
76105

77106
private MemoryStream Deflate(byte[] data, int level, bool zlib)
@@ -89,35 +118,73 @@ private MemoryStream Deflate(byte[] data, int level, bool zlib)
89118
return memoryStream;
90119
}
91120

92-
private void RandomDeflateInflate(int size, int level, bool zlib)
121+
private async Task<MemoryStream> DeflateAsync(byte[] data, int level, bool zlib)
122+
{
123+
var memoryStream = new MemoryStream();
124+
125+
var deflater = new Deflater(level, !zlib);
126+
using (DeflaterOutputStream outStream = new DeflaterOutputStream(memoryStream, deflater))
127+
{
128+
outStream.IsStreamOwner = false;
129+
await outStream.WriteAsync(data, 0, data.Length);
130+
await outStream.FlushAsync();
131+
outStream.Finish();
132+
}
133+
return memoryStream;
134+
}
135+
136+
private static byte[] GetRandomTestData(int size)
93137
{
94138
byte[] buffer = new byte[size];
95139
var rnd = new Random();
96140
rnd.NextBytes(buffer);
97141

142+
return buffer;
143+
}
144+
145+
private void RandomDeflateInflate(int size, int level, bool zlib)
146+
{
147+
byte[] buffer = GetRandomTestData(size);
148+
98149
MemoryStream ms = Deflate(buffer, level, zlib);
99150
Inflate(ms, buffer, level, zlib);
100151
}
101152

153+
private async Task RandomDeflateInflateAsync(int size, int level, bool zlib)
154+
{
155+
byte[] buffer = GetRandomTestData(size);
156+
157+
MemoryStream ms = await DeflateAsync(buffer, level, zlib);
158+
await InflateAsync(ms, buffer, level, zlib);
159+
}
160+
102161
/// <summary>
103162
/// Basic inflate/deflate test
104163
/// </summary>
105164
[Test]
106165
[Category("Base")]
107-
public void InflateDeflateZlib()
166+
public void InflateDeflateZlib([Range(0, 9)] int level)
108167
{
109-
for (int level = 0; level < 10; ++level)
110-
{
111-
RandomDeflateInflate(100000, level, true);
112-
}
168+
RandomDeflateInflate(100000, level, true);
169+
}
170+
171+
/// <summary>
172+
/// Basic async inflate/deflate test
173+
/// </summary>
174+
[Test]
175+
[Category("Base")]
176+
[Category("Async")]
177+
public async Task InflateDeflateZlibAsync([Range(0, 9)] int level)
178+
{
179+
await RandomDeflateInflateAsync(100000, level, true);
113180
}
114181

115182
private delegate void RunCompress(byte[] buffer);
116183

117184
private int runLevel;
118185
private bool runZlib;
119186
private long runCount;
120-
private Random runRandom = new Random(5);
187+
private readonly Random runRandom = new Random(5);
121188

122189
private void DeflateAndInflate(byte[] buffer)
123190
{
@@ -167,12 +234,20 @@ private void TryManyVariants(int level, bool zlib, RunCompress test, byte[] buff
167234
/// </summary>
168235
[Test]
169236
[Category("Base")]
170-
public void InflateDeflateNonZlib()
237+
public void InflateDeflateNonZlib([Range(0, 9)] int level)
171238
{
172-
for (int level = 0; level < 10; ++level)
173-
{
174-
RandomDeflateInflate(100000, level, false);
175-
}
239+
RandomDeflateInflate(100000, level, false);
240+
}
241+
242+
/// <summary>
243+
/// Basic async inflate/deflate test
244+
/// </summary>
245+
[Test]
246+
[Category("Base")]
247+
[Category("Async")]
248+
public async Task InflateDeflateNonZlibAsync([Range(0, 9)] int level)
249+
{
250+
await RandomDeflateInflateAsync (100000, level, false);
176251
}
177252

178253
[Test]

0 commit comments

Comments
 (0)