22using System . IO ;
33using System . Linq ;
44using System . Text ;
5+ using System . Threading . Tasks ;
56using Xunit ;
67
78namespace 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