Skip to content

Commit 6ba4404

Browse files
committed
Add async tests for RebufferableBinaryReader
1 parent a9a86f2 commit 6ba4404

1 file changed

Lines changed: 192 additions & 0 deletions

File tree

Source/HttpMultipartParser.UnitTests/RebufferableBinaryReaderUnitTests.cs

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.IO;
33
using System.Linq;
44
using System.Text;
5+
using System.Threading.Tasks;
56
using Xunit;
67

78
namespace HttpMultipartParser.UnitTests
@@ -68,6 +69,63 @@ public void CanReadMixedAsciiAndUTFCharactersOverBuffers()
6869

6970
#endregion
7071

72+
#region ReadAsync() Tests
73+
74+
[Fact]
75+
public async Task CanReadSingleCharacterBufferAsync()
76+
{
77+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("abc"), Encoding.UTF8);
78+
79+
Assert.Equal('a', await reader.ReadAsync().ConfigureAwait(false));
80+
Assert.Equal('b', await reader.ReadAsync().ConfigureAwait(false));
81+
Assert.Equal('c', await reader.ReadAsync().ConfigureAwait(false));
82+
}
83+
84+
[Fact]
85+
public async Task CanReadSingleCharacterOverBuffersAsync()
86+
{
87+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("def"), Encoding.UTF8);
88+
reader.Buffer(TestUtil.StringToByteNoBom("abc"));
89+
90+
Assert.Equal('a', await reader.ReadAsync().ConfigureAwait(false));
91+
Assert.Equal('b', await reader.ReadAsync().ConfigureAwait(false));
92+
Assert.Equal('c', await reader.ReadAsync().ConfigureAwait(false));
93+
Assert.Equal('d', await reader.ReadAsync().ConfigureAwait(false));
94+
Assert.Equal('e', await reader.ReadAsync().ConfigureAwait(false));
95+
Assert.Equal('f', await reader.ReadAsync().ConfigureAwait(false));
96+
}
97+
98+
[Fact]
99+
public async Task CanReadMixedAsciiAndUTFCharactersAsync()
100+
{
101+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("abcdèfg"), Encoding.UTF8);
102+
103+
Assert.Equal('a', await reader.ReadAsync().ConfigureAwait(false));
104+
Assert.Equal('b', await reader.ReadAsync().ConfigureAwait(false));
105+
Assert.Equal('c', await reader.ReadAsync().ConfigureAwait(false));
106+
Assert.Equal('d', await reader.ReadAsync().ConfigureAwait(false));
107+
Assert.Equal('è', await reader.ReadAsync().ConfigureAwait(false));
108+
Assert.Equal('f', await reader.ReadAsync().ConfigureAwait(false));
109+
Assert.Equal('g', await reader.ReadAsync().ConfigureAwait(false));
110+
}
111+
112+
[Fact]
113+
public async Task CanReadMixedAsciiAndUTFCharactersOverBuffersAsync()
114+
{
115+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("dèfg"), Encoding.UTF8);
116+
reader.Buffer(TestUtil.StringToByteNoBom("abc"));
117+
118+
Assert.Equal('a', await reader.ReadAsync().ConfigureAwait(false));
119+
Assert.Equal('b', await reader.ReadAsync().ConfigureAwait(false));
120+
Assert.Equal('c', await reader.ReadAsync().ConfigureAwait(false));
121+
Assert.Equal('d', await reader.ReadAsync().ConfigureAwait(false));
122+
Assert.Equal('è', await reader.ReadAsync().ConfigureAwait(false));
123+
Assert.Equal('f', await reader.ReadAsync().ConfigureAwait(false));
124+
Assert.Equal('g', await reader.ReadAsync().ConfigureAwait(false));
125+
}
126+
127+
#endregion
128+
71129
#region Read(buffer, index, count) Tests
72130

73131
[Fact]
@@ -185,6 +243,123 @@ public void ReadCanResumeInterruptedStream()
185243

186244
#endregion
187245

246+
#region ReadAsync(buffer, index, count) Tests
247+
248+
[Fact]
249+
public async Task CanReadSingleBufferAsync()
250+
{
251+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("6chars"), Encoding.UTF8);
252+
253+
var buffer = new byte[Encoding.UTF8.GetByteCount("6chars")];
254+
await reader.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
255+
string result = Encoding.UTF8.GetString(buffer);
256+
Assert.Equal("6chars", result);
257+
}
258+
259+
[Fact]
260+
public async Task CanReadAcrossMultipleBuffersAsync()
261+
{
262+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("ars"), Encoding.UTF8);
263+
reader.Buffer(TestUtil.StringToByteNoBom("6ch"));
264+
265+
var buffer = new byte[6];
266+
await reader.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
267+
Assert.Equal("6chars", Encoding.UTF8.GetString(buffer));
268+
}
269+
270+
[Fact]
271+
public async Task CanReadMixedAsciiAndUTF8Async()
272+
{
273+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("5èats"), Encoding.UTF8);
274+
275+
var buffer = new byte[Encoding.UTF8.GetByteCount("5èats")];
276+
await reader.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
277+
string result = Encoding.UTF8.GetString(buffer);
278+
Assert.Equal("5èats", result);
279+
}
280+
281+
[Fact]
282+
public async Task CanReadMixedAsciiAndUTF8AcrossMultipleBuffersAsync()
283+
{
284+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("ts"), Encoding.UTF8);
285+
reader.Buffer(TestUtil.StringToByteNoBom(("5èa")));
286+
287+
var buffer = new byte[Encoding.UTF8.GetByteCount("5èats")];
288+
await reader.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
289+
string result = Encoding.UTF8.GetString(buffer);
290+
Assert.Equal("5èats", result);
291+
}
292+
293+
[Fact]
294+
public async Task ReadCorrectlyHandlesSmallerBufferThenStreamAsync()
295+
{
296+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("6chars"), Encoding.UTF8);
297+
298+
var buffer = new byte[4];
299+
await reader.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
300+
Assert.Equal("6cha", Encoding.UTF8.GetString(buffer));
301+
302+
buffer = new byte[2];
303+
await reader.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
304+
Assert.Equal("rs", Encoding.UTF8.GetString(buffer));
305+
}
306+
307+
[Fact]
308+
public async Task ReadCorrectlyHandlesLargerBufferThenStreamAsync()
309+
{
310+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("6chars"), Encoding.UTF8);
311+
312+
var buffer = new byte[10];
313+
int amountRead = await reader.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
314+
Assert.Equal("6chars\0\0\0\0", Encoding.UTF8.GetString(buffer));
315+
Assert.Equal(6, amountRead);
316+
}
317+
318+
[Fact]
319+
public async Task ReadReturnsZeroOnNoDataAsync()
320+
{
321+
var reader = new RebufferableBinaryReader(new MemoryStream(), Encoding.UTF8);
322+
323+
var buffer = new byte[6];
324+
int amountRead = await reader.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
325+
Assert.Equal("\0\0\0\0\0\0", Encoding.UTF8.GetString(buffer));
326+
Assert.Equal(0, amountRead);
327+
}
328+
329+
[Fact]
330+
public async Task ReadLineReturnsNullOnNoDataAsync()
331+
{
332+
var reader = new RebufferableBinaryReader(new MemoryStream(new byte[6]), Encoding.UTF8);
333+
334+
var s = await reader.ReadLineAsync().ConfigureAwait(false);
335+
Assert.Equal("\0\0\0\0\0\0", s);
336+
Assert.Null(await reader.ReadLineAsync().ConfigureAwait(false));
337+
}
338+
339+
[Fact]
340+
public async Task ReadCanResumeInterruptedStreamAsync()
341+
{
342+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("6chars"), Encoding.UTF8);
343+
344+
var buffer = new byte[4];
345+
int amountRead = await reader.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
346+
Assert.Equal("6cha", Encoding.UTF8.GetString(buffer));
347+
Assert.Equal(4, amountRead);
348+
349+
reader.Buffer(TestUtil.StringToByteNoBom("14intermission"));
350+
buffer = new byte[14];
351+
amountRead = await reader.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
352+
Assert.Equal("14intermission", Encoding.UTF8.GetString(buffer));
353+
Assert.Equal(14, amountRead);
354+
355+
buffer = new byte[2];
356+
amountRead = await reader.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
357+
Assert.Equal("rs", Encoding.UTF8.GetString(buffer));
358+
Assert.Equal(2, amountRead);
359+
}
360+
361+
#endregion
362+
188363
#region ReadByteLine() Tests
189364

190365
[Fact]
@@ -201,5 +376,22 @@ public void CanReadByteLineOnMixedAsciiAndUTF8Text()
201376
}
202377

203378
#endregion
379+
380+
#region ReadByteLineAsync() Tests
381+
382+
[Fact]
383+
public async Task CanReadByteLineOnMixedAsciiAndUTF8TextAsync()
384+
{
385+
var reader = new RebufferableBinaryReader(TestUtil.StringToStreamNoBom("Bonjour poignée"), Encoding.UTF8);
386+
byte[] bytes = await reader.ReadByteLineAsync().ConfigureAwait(false);
387+
var expected = new byte[] { 66, 111, 110, 106, 111, 117, 114, 32, 112, 111, 105, 103, 110, 195, 169, 101 };
388+
389+
foreach (var pair in expected.Zip(bytes, Tuple.Create))
390+
{
391+
Assert.Equal(pair.Item1, pair.Item2);
392+
}
393+
}
394+
395+
#endregion
204396
}
205397
}

0 commit comments

Comments
 (0)