@@ -151,10 +151,14 @@ public async Task ReadWithDifferentSettings(int bytesInBuffer, int bufferSize, i
151151 [ Fact ]
152152 public async Task ReadAsyncAfterReceivingCompletedReadResultDoesNotThrow ( )
153153 {
154- var stream = new ThrowAfterZeroByteReadStream ( ) ;
154+ byte [ ] helloBytes = "Hello World"u8 . ToArray ( ) ;
155+ var stream = new MemoryStream ( helloBytes ) ;
155156 PipeReader reader = PipeReader . Create ( stream ) ;
156157 ReadResult readResult = await reader . ReadAsync ( ) ;
157- Assert . True ( readResult . Buffer . IsEmpty ) ;
158+ Assert . Equal ( helloBytes . Length , readResult . Buffer . Length ) ;
159+ reader . AdvanceTo ( readResult . Buffer . End ) ;
160+
161+ readResult = await reader . ReadAsync ( ) ;
158162 Assert . True ( readResult . IsCompleted ) ;
159163 reader . AdvanceTo ( readResult . Buffer . End ) ;
160164
@@ -166,12 +170,38 @@ public async Task ReadAsyncAfterReceivingCompletedReadResultDoesNotThrow()
166170 }
167171
168172 [ Fact ]
169- public async Task BufferingDataPastEndOfStreamCanBeReadAgain ( )
173+ public async Task ReadAsyncAfterReceivingCompletedReadResultAndResettingStreamPositionWorks ( )
170174 {
171175 byte [ ] helloBytes = "Hello World"u8 . ToArray ( ) ;
172- var stream = new ThrowAfterZeroByteReadStream ( helloBytes ) ;
176+ var stream = new MemoryStream ( helloBytes ) ;
173177 PipeReader reader = PipeReader . Create ( stream ) ;
178+ ReadResult readResult = await reader . ReadAsync ( ) ;
179+ Assert . Equal ( helloBytes , readResult . Buffer . ToArray ( ) ) ;
180+ Assert . False ( readResult . IsCompleted ) ;
181+ reader . AdvanceTo ( readResult . Buffer . End ) ;
182+
183+ readResult = await reader . ReadAsync ( ) ;
184+ Assert . True ( readResult . IsCompleted ) ;
185+
186+ // Reset the stream position to the beginning
187+ stream . Position = 0 ;
188+
189+ readResult = await reader . ReadAsync ( ) ;
190+ Assert . Equal ( helloBytes , readResult . Buffer . ToArray ( ) ) ;
191+ Assert . False ( readResult . IsCompleted ) ;
192+ reader . AdvanceTo ( readResult . Buffer . End ) ;
174193
194+ readResult = await reader . ReadAsync ( ) ;
195+ Assert . True ( readResult . IsCompleted ) ;
196+ reader . Complete ( ) ;
197+ }
198+
199+ [ Fact ]
200+ public async Task BufferingDataPastEndOfStreamCanBeReadAgain ( )
201+ {
202+ byte [ ] helloBytes = "Hello World"u8 . ToArray ( ) ;
203+ var stream = new MemoryStream ( helloBytes ) ;
204+ PipeReader reader = PipeReader . Create ( stream ) ;
175205
176206 ReadResult readResult = await reader . ReadAsync ( ) ;
177207 ReadOnlySequence < byte > buffer = readResult . Buffer ;
@@ -669,50 +699,6 @@ public override ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken
669699#endif
670700 }
671701
672- private class ThrowAfterZeroByteReadStream : MemoryStream
673- {
674- public ThrowAfterZeroByteReadStream ( )
675- {
676-
677- }
678-
679- public ThrowAfterZeroByteReadStream ( byte [ ] buffer ) : base ( buffer )
680- {
681-
682- }
683-
684- private bool _throwOnNextCallToRead ;
685- public override async Task < int > ReadAsync ( byte [ ] buffer , int offset , int count , CancellationToken cancellationToken )
686- {
687- if ( _throwOnNextCallToRead )
688- {
689- throw new Exception ( ) ;
690- }
691- var bytes = await base . ReadAsync ( buffer , offset , count , cancellationToken ) ;
692- if ( bytes == 0 )
693- {
694- _throwOnNextCallToRead = true ;
695- }
696- return bytes ;
697- }
698-
699- #if NET
700- public override async ValueTask < int > ReadAsync ( Memory < byte > destination , CancellationToken cancellationToken = default )
701- {
702- if ( _throwOnNextCallToRead )
703- {
704- throw new Exception ( ) ;
705- }
706- var bytes = await base . ReadAsync ( destination , cancellationToken ) ;
707- if ( bytes == 0 )
708- {
709- _throwOnNextCallToRead = true ;
710- }
711- return bytes ;
712- }
713- #endif
714- }
715-
716702 private class DisposalTrackingStream : MemoryStream
717703 {
718704 public bool DisposeCalled { get ; private set ; }
0 commit comments