14
14
15
15
@testable import AsyncHTTPClient
16
16
import NIOCore
17
+ import NIOEmbedded
17
18
import NIOHTTP1
18
19
import NIOSSL
19
20
import XCTest
@@ -94,6 +95,8 @@ class HTTPRequestStateMachineTests: XCTestCase {
94
95
}
95
96
96
97
func testRequestBodyStreamIsCancelledIfServerRespondsWith301( ) {
98
+ let eventLoop = EmbeddedEventLoop ( )
99
+ let promise = eventLoop. makePromise ( of: Void . self)
97
100
var state = HTTPRequestStateMachine ( isChannelWritable: true )
98
101
let requestHead = HTTPRequestHead ( version: . http1_1, method: . POST, uri: " / " , headers: HTTPHeaders ( [ ( " content-length " , " 12 " ) ] ) )
99
102
let metadata = RequestFramingMetadata ( connectionClose: false , body: . fixedSize( 12 ) )
@@ -106,8 +109,9 @@ class HTTPRequestStateMachineTests: XCTestCase {
106
109
XCTAssertEqual ( state. channelRead ( . head( responseHead) ) , . forwardResponseHead( responseHead, pauseRequestBodyStream: true ) )
107
110
XCTAssertEqual ( state. writabilityChanged ( writable: false ) , . wait)
108
111
XCTAssertEqual ( state. writabilityChanged ( writable: true ) , . wait)
109
- XCTAssertEqual ( state. requestStreamPartReceived ( part, promise: nil ) , . wait,
112
+ XCTAssertEqual ( state. requestStreamPartReceived ( part, promise: promise ) , . wait,
110
113
" Expected to drop all stream data after having received a response head, with status >= 300 " )
114
+ XCTAssertThrowsError ( try promise. futureResult. wait ( ) )
111
115
112
116
XCTAssertEqual ( state. channelRead ( . end( nil ) ) , . succeedRequest( . close, . init( ) ) )
113
117
@@ -118,6 +122,18 @@ class HTTPRequestStateMachineTests: XCTestCase {
118
122
" Expected to drop all stream data after having received a response head, with status >= 300 " )
119
123
}
120
124
125
+ func testStreamPartReceived_whenCanceleld( ) {
126
+ let eventLoop = EmbeddedEventLoop ( )
127
+ let promise = eventLoop. makePromise ( of: Void . self)
128
+ var state = HTTPRequestStateMachine ( isChannelWritable: false )
129
+ let part = IOData . byteBuffer ( ByteBuffer ( bytes: [ 0 , 1 , 2 , 3 ] ) )
130
+
131
+ XCTAssertEqual ( state. requestCancelled ( ) , . failRequest( HTTPClientError . cancelled, . none) )
132
+ XCTAssertEqual ( state. requestStreamPartReceived ( part, promise: promise) , . wait,
133
+ " Expected to drop all stream data after having received a response head, with status >= 300 " )
134
+ XCTAssertThrowsError ( try promise. futureResult. wait ( ) )
135
+ }
136
+
121
137
func testRequestBodyStreamIsCancelledIfServerRespondsWith301WhileWriteBackpressure( ) {
122
138
var state = HTTPRequestStateMachine ( isChannelWritable: true )
123
139
let requestHead = HTTPRequestHead ( version: . http1_1, method: . POST, uri: " / " , headers: HTTPHeaders ( [ ( " content-length " , " 12 " ) ] ) )
@@ -144,6 +160,8 @@ class HTTPRequestStateMachineTests: XCTestCase {
144
160
}
145
161
146
162
func testRequestBodyStreamIsContinuedIfServerRespondsWith200( ) {
163
+ let eventLoop = EmbeddedEventLoop ( )
164
+ let promise = eventLoop. makePromise ( of: Void . self)
147
165
var state = HTTPRequestStateMachine ( isChannelWritable: true )
148
166
let requestHead = HTTPRequestHead ( version: . http1_1, method: . POST, uri: " / " , headers: HTTPHeaders ( [ ( " content-length " , " 12 " ) ] ) )
149
167
let metadata = RequestFramingMetadata ( connectionClose: false , body: . fixedSize( 12 ) )
@@ -161,6 +179,9 @@ class HTTPRequestStateMachineTests: XCTestCase {
161
179
let part2 = IOData . byteBuffer ( ByteBuffer ( bytes: 8 ... 11 ) )
162
180
XCTAssertEqual ( state. requestStreamPartReceived ( part2, promise: nil ) , . sendBodyPart( part2, nil ) )
163
181
XCTAssertEqual ( state. requestStreamFinished ( ) , . succeedRequest( . sendRequestEnd, . init( ) ) )
182
+
183
+ XCTAssertEqual ( state. requestStreamPartReceived ( part2, promise: promise) , . wait)
184
+ XCTAssertThrowsError ( try promise. futureResult. wait ( ) )
164
185
}
165
186
166
187
func testRequestBodyStreamIsContinuedIfServerSendHeadWithStatus200( ) {
0 commit comments