1+ import AsyncStreaming
12@testable import HTTPServer
23import HTTPTypes
34import NIOCore
@@ -26,7 +27,7 @@ struct HTTPRequestConcludingAsyncReaderTests {
2627
2728 _ = try await requestReader. consumeAndConclude { bodyReader in
2829 var bodyReader = bodyReader
29- try await bodyReader. read { element in ( ) }
30+ try await bodyReader. read ( maximumCount : nil ) { element in ( ) }
3031 }
3132 }
3233 }
@@ -54,20 +55,16 @@ struct HTTPRequestConcludingAsyncReaderTests {
5455 var bodyReader = bodyReader
5556
5657 var buffer = ByteBuffer ( )
57- // Read just once: we only sent one body chunk
58- try await bodyReader. read { element in
59- if let element {
60- buffer. writeBytes ( element. bytes)
61- } else {
62- Issue . record ( " Unexpectedly failed to read the client's request body " )
63- }
58+ // Read the body chunk
59+ try await bodyReader. read ( maximumCount: nil ) { element in
60+ buffer. writeBytes ( element. bytes)
61+ return
6462 }
6563
66- // Attempting to read again should result in a `nil` element (we only sent one body chunk)
67- try await bodyReader. read { element in
68- if element != nil {
69- Issue . record ( " Received a non-nil value after the request body was completely read " )
70- }
64+ // Now read the trailer. We should get back an empty element here, but the trailer should be available in
65+ // the tuple returned by `consumeAndConclude`
66+ try await bodyReader. read ( maximumCount: nil ) { element in
67+ #expect( element. count == 0 )
7168 }
7269
7370 return buffer
@@ -80,7 +77,6 @@ struct HTTPRequestConcludingAsyncReaderTests {
8077 @Test (
8178 " Streamed request with concluding element " ,
8279 arguments: [
83- ( 0 ..< 10 ) . map { i in ByteBuffer ( ) } , // 10 empty ByteBuffers
8480 ( 0 ..< 100 ) . map { i in ByteBuffer ( bytes: [ i] ) } // 100 single-byte ByteBuffers
8581 ] ,
8682 [
@@ -107,25 +103,15 @@ struct HTTPRequestConcludingAsyncReaderTests {
107103 iterator: stream. makeAsyncIterator ( ) ,
108104 readerState: . init( )
109105 )
110- let finalElement = try await requestReader. consumeAndConclude { bodyReader in
111- var bodyReader = bodyReader
112-
113- for chunk in bodyChunks {
114- try await bodyReader. read { element in
115- if let element {
116- var buffer = ByteBuffer ( )
117- buffer. writeBytes ( element. bytes)
118- #expect( chunk == buffer)
119- } else {
120- Issue . record ( " Received a nil element before the request body was completely read " )
121- }
122- }
123- }
124-
125- try await bodyReader. read { element in
126- if element != nil {
127- Issue . record ( " Received a non-nil element after the request body was completely read " )
128- }
106+ let ( _, finalElement) = try await requestReader. consumeAndConclude { bodyReader in
107+ // Read all body chunks
108+ var chunksProcessed = 0
109+ try await bodyReader. forEach { element in
110+ var buffer = ByteBuffer ( )
111+ buffer. writeBytes ( element. bytes)
112+ #expect( bodyChunks [ chunksProcessed] == buffer)
113+
114+ chunksProcessed += 1
129115 }
130116 }
131117
@@ -146,18 +132,22 @@ struct HTTPRequestConcludingAsyncReaderTests {
146132 source. yield ( . end( [ . cookie: " test " ] ) )
147133 source. finish ( )
148134
149- // Check that the read error is propagated
150- try await #require( throws: TestError . errorWhileReading) {
151- let requestReader = HTTPRequestConcludingAsyncReader (
152- iterator: stream. makeAsyncIterator ( ) ,
153- readerState: . init( )
154- )
135+ let requestReader = HTTPRequestConcludingAsyncReader (
136+ iterator: stream. makeAsyncIterator ( ) ,
137+ readerState: . init( )
138+ )
155139
156- _ = try await requestReader. consumeAndConclude { bodyReader in
157- var bodyReader = bodyReader
140+ _ = await requestReader. consumeAndConclude { bodyReader in
141+ var bodyReader = bodyReader
158142
159- try await bodyReader. read { element in
160- throw TestError . errorWhileReading
143+ // Check that the read error is propagated
144+ await #expect( throws: TestError . errorWhileReading) {
145+ do {
146+ try await bodyReader. read ( maximumCount: nil ) { ( element) throws ( TestError) in
147+ throw TestError . errorWhileReading
148+ }
149+ } catch let eitherError as EitherError < Error , TestError > {
150+ try eitherError. unwrap ( )
161151 }
162152 }
163153 }
@@ -166,19 +156,19 @@ struct HTTPRequestConcludingAsyncReaderTests {
166156 @available ( macOS 26 . 0 , iOS 26 . 0 , watchOS 26 . 0 , tvOS 26 . 0 , visionOS 26 . 0 , * )
167157 @Test ( " More bytes available than consumption limit " )
168158 func testCollectMoreBytesThanAvailable( ) async throws {
169- let ( stream, source) = NIOAsyncChannelInboundStream< HTTPRequestPart> . makeTestingStream( )
159+ await #expect( processExitsWith: . failure) {
160+ let ( stream, source) = NIOAsyncChannelInboundStream< HTTPRequestPart> . makeTestingStream( )
170161
171- // Write 10 bytes
172- source. yield ( . body( . init( repeating: 5 , count: 10 ) ) )
173- source. finish ( )
162+ // Write 10 bytes
163+ source. yield ( . body( . init( repeating: 5 , count: 10 ) ) )
164+ source. finish ( )
174165
175- let requestReader = HTTPRequestConcludingAsyncReader ( iterator: stream. makeAsyncIterator ( ) , readerState: . init( ) )
166+ let requestReader = HTTPRequestConcludingAsyncReader ( iterator: stream. makeAsyncIterator ( ) , readerState: . init( ) )
176167
177- _ = try await requestReader. consumeAndConclude { requestBodyReader in
178- var requestBodyReader = requestBodyReader
168+ _ = try await requestReader. consumeAndConclude { requestBodyReader in
169+ var requestBodyReader = requestBodyReader
179170
180- // Attempting to collect a maximum of 9 bytes should result in a LimitExceeded error.
181- await #expect( throws: LimitExceeded . self) {
171+ // Since there are more bytes than requested, this should fail.
182172 try await requestBodyReader. collect ( upTo: 9 ) { element in
183173 ( )
184174 }
0 commit comments