Skip to content

Commit 08057a8

Browse files
authored
Update test cases to use new AsyncStreaming API (#38)
Motivation: PR #37 introduced subtle changes to `HTTPRequestConcludingAsyncReader`, `RequestBodyAsyncReader`, and `HTTPResponseConcludingAsyncWriter` which led to existing tests failing to compile. Modifications: Updated test cases to use the new APIs. Result: The test target can successfully compile.
1 parent 277b511 commit 08057a8

File tree

3 files changed

+59
-67
lines changed

3 files changed

+59
-67
lines changed

Tests/HTTPServerTests/HTTPRequestConcludingAsyncReaderTests.swift

Lines changed: 42 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import AsyncStreaming
12
@testable import HTTPServer
23
import HTTPTypes
34
import 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
}

Tests/HTTPServerTests/HTTPResponseConcludingAsyncWriterTests.swift

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@ import Testing
66

77
@Suite
88
struct HTTPResponseConcludingAsyncWriterTests {
9-
let bodySampleOne: [UInt8] = [1, 2]
10-
let bodySampleTwo: [UInt8] = [3, 4]
9+
let bodySampleOne: UInt8 = 1
10+
let bodySampleTwo: UInt8 = 2
11+
1112
let trailerSampleOne: HTTPFields = [.serverTiming: "test"]
1213
let trailerSampleTwo: HTTPFields = [.serverTiming: "test", .cookie: "cookie"]
1314

@@ -17,13 +18,14 @@ struct HTTPResponseConcludingAsyncWriterTests {
1718
let (writer, sink) = NIOAsyncChannelOutboundWriter<HTTPResponsePart>.makeTestingWriter()
1819
let responseWriter = HTTPResponseConcludingAsyncWriter(writer: writer, writerState: .init())
1920

20-
try await responseWriter.writeAndConclude(element: self.bodySampleOne.span, finalElement: self.trailerSampleOne)
21+
try await responseWriter.writeAndConclude(self.bodySampleOne, finalElement: self.trailerSampleOne)
2122

2223
// Now read the response
2324
var responseIterator = sink.makeAsyncIterator()
2425

2526
let element = try #require(await responseIterator.next())
26-
#expect(element == .body(.init(bytes: self.bodySampleOne)))
27+
#expect(element == .body(.init(bytes: [self.bodySampleOne])))
28+
2729
let trailer = try #require(await responseIterator.next())
2830
#expect(trailer == .end(self.trailerSampleOne))
2931
}
@@ -38,8 +40,8 @@ struct HTTPResponseConcludingAsyncWriterTests {
3840
var bodyWriter = bodyWriter
3941

4042
// Write multiple elements
41-
try await bodyWriter.write(self.bodySampleOne.span)
42-
try await bodyWriter.write(self.bodySampleTwo.span)
43+
try await bodyWriter.write(self.bodySampleOne)
44+
try await bodyWriter.write(self.bodySampleTwo)
4345

4446
return self.trailerSampleOne
4547
}
@@ -48,8 +50,8 @@ struct HTTPResponseConcludingAsyncWriterTests {
4850

4951
let firstElement = try #require(await responseIterator.next())
5052
let secondElement = try #require(await responseIterator.next())
51-
#expect(firstElement == .body(.init(bytes: self.bodySampleOne)))
52-
#expect(secondElement == .body(.init(bytes: self.bodySampleTwo)))
53+
#expect(firstElement == .body(.init(bytes: [self.bodySampleOne])))
54+
#expect(secondElement == .body(.init(bytes: [self.bodySampleTwo])))
5355

5456
let trailer = try #require(await responseIterator.next())
5557
#expect(trailer == .end(self.trailerSampleOne))
@@ -67,7 +69,7 @@ struct HTTPResponseConcludingAsyncWriterTests {
6769
var bodyWriter = bodyWriter
6870

6971
// Write an element
70-
try await bodyWriter.write(self.bodySampleOne.span)
72+
try await bodyWriter.write(self.bodySampleOne)
7173
// Then throw
7274
throw TestError.errorWhileWriting
7375
}
@@ -76,7 +78,7 @@ struct HTTPResponseConcludingAsyncWriterTests {
7678
var responseIterator = sink.makeAsyncIterator()
7779

7880
let firstElement = try #require(await responseIterator.next())
79-
#expect(firstElement == .body(.init(bytes: self.bodySampleOne)))
81+
#expect(firstElement == .body(.init(bytes: [self.bodySampleOne])))
8082
}
8183

8284
@Test("Write multiple elements and multiple trailers")
@@ -89,8 +91,8 @@ struct HTTPResponseConcludingAsyncWriterTests {
8991
var bodyWriter = bodyWriter
9092

9193
// Write multiple elements
92-
try await bodyWriter.write(self.bodySampleOne.span)
93-
try await bodyWriter.write(self.bodySampleTwo.span)
94+
try await bodyWriter.write(self.bodySampleOne)
95+
try await bodyWriter.write(self.bodySampleTwo)
9496

9597
return self.trailerSampleTwo
9698
}
@@ -99,8 +101,8 @@ struct HTTPResponseConcludingAsyncWriterTests {
99101

100102
let firstElement = try #require(await responseIterator.next())
101103
let secondElement = try #require(await responseIterator.next())
102-
#expect(firstElement == .body(.init(bytes: self.bodySampleOne)))
103-
#expect(secondElement == .body(.init(bytes: self.bodySampleTwo)))
104+
#expect(firstElement == .body(.init(bytes: [self.bodySampleOne])))
105+
#expect(secondElement == .body(.init(bytes: [self.bodySampleTwo])))
104106

105107
let trailer = try #require(await responseIterator.next())
106108
#expect(trailer == .end(self.trailerSampleTwo))

Tests/HTTPServerTests/NIOHTTPServerTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ struct NIOHTTPServerTests {
9191
#expect(request.path == "/")
9292

9393
var buffer = ByteBuffer()
94-
let finalElement = try await reader.consumeAndConclude { bodyReader in
94+
let (_, finalElement) = try await reader.consumeAndConclude { bodyReader in
9595
var bodyReader = bodyReader
9696
return try await bodyReader.collect(upTo: Self.bodyData.readableBytes + 1) { body in
9797
buffer.writeBytes(body.bytes)

0 commit comments

Comments
 (0)