| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/http/bidirectional_stream.h" | 5 #include "net/http/bidirectional_stream.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 read_buf_len, | 52 read_buf_len, |
| 53 base::WrapUnique(new base::Timer(false, false))) {} | 53 base::WrapUnique(new base::Timer(false, false))) {} |
| 54 | 54 |
| 55 TestDelegateBase(IOBuffer* read_buf, | 55 TestDelegateBase(IOBuffer* read_buf, |
| 56 int read_buf_len, | 56 int read_buf_len, |
| 57 std::unique_ptr<base::Timer> timer) | 57 std::unique_ptr<base::Timer> timer) |
| 58 : read_buf_(read_buf), | 58 : read_buf_(read_buf), |
| 59 read_buf_len_(read_buf_len), | 59 read_buf_len_(read_buf_len), |
| 60 timer_(std::move(timer)), | 60 timer_(std::move(timer)), |
| 61 loop_(nullptr), | 61 loop_(nullptr), |
| 62 received_bytes_(0), |
| 63 sent_bytes_(0), |
| 62 error_(OK), | 64 error_(OK), |
| 63 on_data_read_count_(0), | 65 on_data_read_count_(0), |
| 64 on_data_sent_count_(0), | 66 on_data_sent_count_(0), |
| 65 do_not_start_read_(false), | 67 do_not_start_read_(false), |
| 66 run_until_completion_(false), | 68 run_until_completion_(false), |
| 67 not_expect_callback_(false) {} | 69 not_expect_callback_(false) {} |
| 68 | 70 |
| 69 ~TestDelegateBase() override {} | 71 ~TestDelegateBase() override {} |
| 70 | 72 |
| 71 void OnStreamReady(bool request_headers_sent) override { | 73 void OnStreamReady(bool request_headers_sent) override { |
| 72 // Request headers should always be sent in H2's case, because the | 74 // Request headers should always be sent in H2's case, because the |
| 73 // functionality to combine header frame with data frames is not | 75 // functionality to combine header frame with data frames is not |
| 74 // implemented. | 76 // implemented. |
| 75 EXPECT_TRUE(request_headers_sent); | 77 EXPECT_TRUE(request_headers_sent); |
| 76 if (callback_.is_null()) | 78 if (callback_.is_null()) |
| 77 return; | 79 return; |
| 78 callback_.Run(OK); | 80 callback_.Run(OK); |
| 79 } | 81 } |
| 80 | 82 |
| 81 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { | 83 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { |
| 82 CHECK(!not_expect_callback_); | 84 CHECK(!not_expect_callback_); |
| 83 | 85 |
| 84 response_headers_ = response_headers.Clone(); | 86 response_headers_ = response_headers.Clone(); |
| 87 |
| 85 if (!do_not_start_read_) | 88 if (!do_not_start_read_) |
| 86 StartOrContinueReading(); | 89 StartOrContinueReading(); |
| 87 } | 90 } |
| 88 | 91 |
| 89 void OnDataRead(int bytes_read) override { | 92 void OnDataRead(int bytes_read) override { |
| 90 CHECK(!not_expect_callback_); | 93 CHECK(!not_expect_callback_); |
| 91 | 94 |
| 92 ++on_data_read_count_; | 95 ++on_data_read_count_; |
| 93 CHECK_GE(bytes_read, OK); | 96 CHECK_GE(bytes_read, OK); |
| 94 data_received_.append(read_buf_->data(), bytes_read); | 97 data_received_.append(read_buf_->data(), bytes_read); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 // Calls ReadData on the |stream_| and updates internal states. | 171 // Calls ReadData on the |stream_| and updates internal states. |
| 169 int ReadData() { | 172 int ReadData() { |
| 170 not_expect_callback_ = true; | 173 not_expect_callback_ = true; |
| 171 int rv = stream_->ReadData(read_buf_.get(), read_buf_len_); | 174 int rv = stream_->ReadData(read_buf_.get(), read_buf_len_); |
| 172 not_expect_callback_ = false; | 175 not_expect_callback_ = false; |
| 173 if (rv > 0) | 176 if (rv > 0) |
| 174 data_received_.append(read_buf_->data(), rv); | 177 data_received_.append(read_buf_->data(), rv); |
| 175 return rv; | 178 return rv; |
| 176 } | 179 } |
| 177 | 180 |
| 178 // Cancels |stream_|. | 181 // Deletes |stream_|. |
| 179 void CancelStream() { stream_->Cancel(); } | 182 void DeleteStream() { |
| 183 next_proto_ = stream_->GetProtocol(); |
| 184 received_bytes_ = stream_->GetTotalReceivedBytes(); |
| 185 sent_bytes_ = stream_->GetTotalSentBytes(); |
| 186 stream_.reset(); |
| 187 } |
| 180 | 188 |
| 181 // Deletes |stream_|. | 189 NextProto GetProtocol() const { |
| 182 void DeleteStream() { stream_.reset(); } | 190 if (stream_) |
| 183 | 191 return stream_->GetProtocol(); |
| 184 NextProto GetProtocol() const { return stream_->GetProtocol(); } | 192 return next_proto_; |
| 193 } |
| 185 | 194 |
| 186 int64_t GetTotalReceivedBytes() const { | 195 int64_t GetTotalReceivedBytes() const { |
| 187 return stream_->GetTotalReceivedBytes(); | 196 if (stream_) |
| 197 return stream_->GetTotalReceivedBytes(); |
| 198 return received_bytes_; |
| 188 } | 199 } |
| 189 | 200 |
| 190 int64_t GetTotalSentBytes() const { return stream_->GetTotalSentBytes(); } | 201 int64_t GetTotalSentBytes() const { |
| 202 if (stream_) |
| 203 return stream_->GetTotalSentBytes(); |
| 204 return sent_bytes_; |
| 205 } |
| 191 | 206 |
| 192 // Const getters for internal states. | 207 // Const getters for internal states. |
| 193 const std::string& data_received() const { return data_received_; } | 208 const std::string& data_received() const { return data_received_; } |
| 194 int error() const { return error_; } | 209 int error() const { return error_; } |
| 195 const SpdyHeaderBlock& response_headers() const { return response_headers_; } | 210 const SpdyHeaderBlock& response_headers() const { return response_headers_; } |
| 196 const SpdyHeaderBlock& trailers() const { return trailers_; } | 211 const SpdyHeaderBlock& trailers() const { return trailers_; } |
| 197 int on_data_read_count() const { return on_data_read_count_; } | 212 int on_data_read_count() const { return on_data_read_count_; } |
| 198 int on_data_sent_count() const { return on_data_sent_count_; } | 213 int on_data_sent_count() const { return on_data_sent_count_; } |
| 199 | 214 |
| 200 // Sets whether the delegate should automatically start reading. | 215 // Sets whether the delegate should automatically start reading. |
| (...skipping 12 matching lines...) Expand all Loading... |
| 213 | 228 |
| 214 private: | 229 private: |
| 215 std::unique_ptr<BidirectionalStream> stream_; | 230 std::unique_ptr<BidirectionalStream> stream_; |
| 216 scoped_refptr<IOBuffer> read_buf_; | 231 scoped_refptr<IOBuffer> read_buf_; |
| 217 int read_buf_len_; | 232 int read_buf_len_; |
| 218 std::unique_ptr<base::Timer> timer_; | 233 std::unique_ptr<base::Timer> timer_; |
| 219 std::string data_received_; | 234 std::string data_received_; |
| 220 std::unique_ptr<base::RunLoop> loop_; | 235 std::unique_ptr<base::RunLoop> loop_; |
| 221 SpdyHeaderBlock response_headers_; | 236 SpdyHeaderBlock response_headers_; |
| 222 SpdyHeaderBlock trailers_; | 237 SpdyHeaderBlock trailers_; |
| 238 NextProto next_proto_; |
| 239 int64_t received_bytes_; |
| 240 int64_t sent_bytes_; |
| 223 int error_; | 241 int error_; |
| 224 int on_data_read_count_; | 242 int on_data_read_count_; |
| 225 int on_data_sent_count_; | 243 int on_data_sent_count_; |
| 226 bool do_not_start_read_; | 244 bool do_not_start_read_; |
| 227 bool run_until_completion_; | 245 bool run_until_completion_; |
| 228 // This is to ensure that delegate callback is not invoked synchronously when | 246 // This is to ensure that delegate callback is not invoked synchronously when |
| 229 // calling into |stream_|. | 247 // calling into |stream_|. |
| 230 bool not_expect_callback_; | 248 bool not_expect_callback_; |
| 231 | 249 |
| 232 CompletionCallback callback_; | 250 CompletionCallback callback_; |
| 233 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase); | 251 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase); |
| 234 }; | 252 }; |
| 235 | 253 |
| 236 // A delegate that deletes the stream in a particular callback. | 254 // A delegate that deletes the stream in a particular callback. |
| 237 class CancelOrDeleteStreamDelegate : public TestDelegateBase { | 255 class DeleteStreamDelegate : public TestDelegateBase { |
| 238 public: | 256 public: |
| 239 // Specifies in which callback the stream can be deleted. | 257 // Specifies in which callback the stream can be deleted. |
| 240 enum Phase { | 258 enum Phase { |
| 241 ON_HEADERS_RECEIVED, | 259 ON_HEADERS_RECEIVED, |
| 242 ON_DATA_READ, | 260 ON_DATA_READ, |
| 243 ON_TRAILERS_RECEIVED, | 261 ON_TRAILERS_RECEIVED, |
| 244 ON_FAILED, | 262 ON_FAILED, |
| 245 }; | 263 }; |
| 246 | 264 |
| 247 CancelOrDeleteStreamDelegate(IOBuffer* buf, | 265 DeleteStreamDelegate(IOBuffer* buf, int buf_len, Phase phase) |
| 248 int buf_len, | 266 : TestDelegateBase(buf, buf_len), phase_(phase) {} |
| 249 Phase phase, | 267 ~DeleteStreamDelegate() override {} |
| 250 bool do_cancel) | |
| 251 : TestDelegateBase(buf, buf_len), phase_(phase), do_cancel_(do_cancel) {} | |
| 252 ~CancelOrDeleteStreamDelegate() override {} | |
| 253 | 268 |
| 254 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { | 269 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { |
| 255 TestDelegateBase::OnHeadersReceived(response_headers); | 270 TestDelegateBase::OnHeadersReceived(response_headers); |
| 256 if (phase_ == ON_HEADERS_RECEIVED) { | 271 if (phase_ == ON_HEADERS_RECEIVED) { |
| 257 CancelOrDelete(); | 272 DeleteStream(); |
| 258 QuitLoop(); | 273 QuitLoop(); |
| 259 } | 274 } |
| 260 } | 275 } |
| 261 | 276 |
| 262 void OnDataSent() override { NOTREACHED(); } | 277 void OnDataSent() override { NOTREACHED(); } |
| 263 | 278 |
| 264 void OnDataRead(int bytes_read) override { | 279 void OnDataRead(int bytes_read) override { |
| 265 if (phase_ == ON_HEADERS_RECEIVED) { | 280 if (phase_ == ON_HEADERS_RECEIVED) { |
| 266 NOTREACHED(); | 281 NOTREACHED(); |
| 267 return; | 282 return; |
| 268 } | 283 } |
| 269 TestDelegateBase::OnDataRead(bytes_read); | 284 TestDelegateBase::OnDataRead(bytes_read); |
| 270 if (phase_ == ON_DATA_READ) { | 285 if (phase_ == ON_DATA_READ) { |
| 271 CancelOrDelete(); | 286 DeleteStream(); |
| 272 QuitLoop(); | 287 QuitLoop(); |
| 273 } | 288 } |
| 274 } | 289 } |
| 275 | 290 |
| 276 void OnTrailersReceived(const SpdyHeaderBlock& trailers) override { | 291 void OnTrailersReceived(const SpdyHeaderBlock& trailers) override { |
| 277 if (phase_ == ON_HEADERS_RECEIVED || phase_ == ON_DATA_READ) { | 292 if (phase_ == ON_HEADERS_RECEIVED || phase_ == ON_DATA_READ) { |
| 278 NOTREACHED(); | 293 NOTREACHED(); |
| 279 return; | 294 return; |
| 280 } | 295 } |
| 281 TestDelegateBase::OnTrailersReceived(trailers); | 296 TestDelegateBase::OnTrailersReceived(trailers); |
| 282 if (phase_ == ON_TRAILERS_RECEIVED) { | 297 if (phase_ == ON_TRAILERS_RECEIVED) { |
| 283 CancelOrDelete(); | 298 DeleteStream(); |
| 284 QuitLoop(); | 299 QuitLoop(); |
| 285 } | 300 } |
| 286 } | 301 } |
| 287 | 302 |
| 288 void OnFailed(int error) override { | 303 void OnFailed(int error) override { |
| 289 if (phase_ != ON_FAILED) { | 304 if (phase_ != ON_FAILED) { |
| 290 NOTREACHED(); | 305 NOTREACHED(); |
| 291 return; | 306 return; |
| 292 } | 307 } |
| 293 TestDelegateBase::OnFailed(error); | 308 TestDelegateBase::OnFailed(error); |
| 294 CancelOrDelete(); | 309 DeleteStream(); |
| 295 QuitLoop(); | 310 QuitLoop(); |
| 296 } | 311 } |
| 297 | 312 |
| 298 private: | 313 private: |
| 299 void CancelOrDelete() { | |
| 300 if (do_cancel_) { | |
| 301 CancelStream(); | |
| 302 } else { | |
| 303 DeleteStream(); | |
| 304 } | |
| 305 } | |
| 306 | |
| 307 // Indicates in which callback the delegate should cancel or delete the | 314 // Indicates in which callback the delegate should cancel or delete the |
| 308 // stream. | 315 // stream. |
| 309 Phase phase_; | 316 Phase phase_; |
| 310 // Indicates whether to cancel or delete the stream. | |
| 311 bool do_cancel_; | |
| 312 | 317 |
| 313 DISALLOW_COPY_AND_ASSIGN(CancelOrDeleteStreamDelegate); | 318 DISALLOW_COPY_AND_ASSIGN(DeleteStreamDelegate); |
| 314 }; | 319 }; |
| 315 | 320 |
| 316 // A Timer that does not start a delayed task unless the timer is fired. | 321 // A Timer that does not start a delayed task unless the timer is fired. |
| 317 class MockTimer : public base::MockTimer { | 322 class MockTimer : public base::MockTimer { |
| 318 public: | 323 public: |
| 319 MockTimer() : base::MockTimer(false, false) {} | 324 MockTimer() : base::MockTimer(false, false) {} |
| 320 ~MockTimer() override {} | 325 ~MockTimer() override {} |
| 321 | 326 |
| 322 void Start(const tracked_objects::Location& posted_from, | 327 void Start(const tracked_objects::Location& posted_from, |
| 323 base::TimeDelta delay, | 328 base::TimeDelta delay, |
| (...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1057 EXPECT_EQ("header-value", response_headers.find("header-name")->second); | 1062 EXPECT_EQ("header-value", response_headers.find("header-name")->second); |
| 1058 EXPECT_EQ("bar", delegate->trailers().find("foo")->second); | 1063 EXPECT_EQ("bar", delegate->trailers().find("foo")->second); |
| 1059 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1064 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1060 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 1065 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 1061 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), | 1066 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), |
| 1062 delegate->GetTotalSentBytes()); | 1067 delegate->GetTotalSentBytes()); |
| 1063 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), | 1068 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 1064 delegate->GetTotalReceivedBytes()); | 1069 delegate->GetTotalReceivedBytes()); |
| 1065 } | 1070 } |
| 1066 | 1071 |
| 1067 TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { | 1072 TEST_F(BidirectionalStreamTest, DeleteStreamAfterSendData) { |
| 1068 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 1073 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 1069 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); | 1074 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); |
| 1070 SpdySerializedFrame data_frame(spdy_util_.ConstructSpdyDataFrame( | 1075 SpdySerializedFrame data_frame(spdy_util_.ConstructSpdyDataFrame( |
| 1071 1, kBodyData, kBodyDataSize, /*fin=*/false)); | 1076 1, kBodyData, kBodyDataSize, /*fin=*/false)); |
| 1072 SpdySerializedFrame rst( | 1077 SpdySerializedFrame rst( |
| 1073 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1078 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1074 | 1079 |
| 1075 MockWrite writes[] = { | 1080 MockWrite writes[] = { |
| 1076 CreateMockWrite(req, 0), CreateMockWrite(data_frame, 3), | 1081 CreateMockWrite(req, 0), CreateMockWrite(data_frame, 3), |
| 1077 CreateMockWrite(rst, 5), | 1082 CreateMockWrite(rst, 5), |
| (...skipping 28 matching lines...) Expand all Loading... |
| 1106 // Send the request and receive response headers. | 1111 // Send the request and receive response headers. |
| 1107 sequenced_data_->RunUntilPaused(); | 1112 sequenced_data_->RunUntilPaused(); |
| 1108 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 1113 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 1109 | 1114 |
| 1110 // Send a DATA frame. | 1115 // Send a DATA frame. |
| 1111 scoped_refptr<StringIOBuffer> buf( | 1116 scoped_refptr<StringIOBuffer> buf( |
| 1112 new StringIOBuffer(std::string(kBodyData, kBodyDataSize))); | 1117 new StringIOBuffer(std::string(kBodyData, kBodyDataSize))); |
| 1113 delegate->SendData(buf, buf->size(), false); | 1118 delegate->SendData(buf, buf->size(), false); |
| 1114 sequenced_data_->Resume(); | 1119 sequenced_data_->Resume(); |
| 1115 base::RunLoop().RunUntilIdle(); | 1120 base::RunLoop().RunUntilIdle(); |
| 1116 // Cancel the stream. | 1121 |
| 1117 delegate->CancelStream(); | 1122 delegate->DeleteStream(); |
| 1118 sequenced_data_->Resume(); | 1123 sequenced_data_->Resume(); |
| 1119 base::RunLoop().RunUntilIdle(); | 1124 base::RunLoop().RunUntilIdle(); |
| 1120 | 1125 |
| 1121 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); | 1126 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); |
| 1122 EXPECT_EQ(0, delegate->on_data_read_count()); | 1127 EXPECT_EQ(0, delegate->on_data_read_count()); |
| 1123 // EXPECT_EQ(1, delegate->on_data_send_count()); | |
| 1124 // OnDataSent may or may not have been invoked. | 1128 // OnDataSent may or may not have been invoked. |
| 1125 // Calling after stream is canceled gives kProtoUnknown. | 1129 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 1126 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1130 // Bytes sent excludes the RST frame. |
| 1127 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1131 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1), |
| 1128 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1132 delegate->GetTotalSentBytes()); |
| 1133 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 1134 delegate->GetTotalReceivedBytes()); |
| 1129 } | 1135 } |
| 1130 | 1136 |
| 1131 TEST_F(BidirectionalStreamTest, CancelStreamDuringReadData) { | 1137 TEST_F(BidirectionalStreamTest, DeleteStreamDuringReadData) { |
| 1132 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 1138 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 1133 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); | 1139 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); |
| 1134 SpdySerializedFrame rst( | 1140 SpdySerializedFrame rst( |
| 1135 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1141 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1136 | 1142 |
| 1137 MockWrite writes[] = { | 1143 MockWrite writes[] = { |
| 1138 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), | 1144 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), |
| 1139 }; | 1145 }; |
| 1140 | 1146 |
| 1141 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); | 1147 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1160 | 1166 |
| 1161 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1167 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 1162 std::unique_ptr<TestDelegateBase> delegate( | 1168 std::unique_ptr<TestDelegateBase> delegate( |
| 1163 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 1169 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
| 1164 delegate->set_do_not_start_read(true); | 1170 delegate->set_do_not_start_read(true); |
| 1165 delegate->Start(std::move(request_info), http_session_.get()); | 1171 delegate->Start(std::move(request_info), http_session_.get()); |
| 1166 // Send the request and receive response headers. | 1172 // Send the request and receive response headers. |
| 1167 base::RunLoop().RunUntilIdle(); | 1173 base::RunLoop().RunUntilIdle(); |
| 1168 | 1174 |
| 1169 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); | 1175 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); |
| 1170 // Cancel the stream after ReadData returns ERR_IO_PENDING. | 1176 // Delete the stream after ReadData returns ERR_IO_PENDING. |
| 1171 int rv = delegate->ReadData(); | 1177 int rv = delegate->ReadData(); |
| 1172 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); | 1178 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 1173 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 1179 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 1174 delegate->CancelStream(); | 1180 delegate->DeleteStream(); |
| 1175 sequenced_data_->Resume(); | 1181 sequenced_data_->Resume(); |
| 1176 base::RunLoop().RunUntilIdle(); | 1182 base::RunLoop().RunUntilIdle(); |
| 1177 | 1183 |
| 1178 EXPECT_EQ(0, delegate->on_data_read_count()); | 1184 EXPECT_EQ(0, delegate->on_data_read_count()); |
| 1179 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1185 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1180 // Calling after stream is canceled gives kProtoUnknown. | 1186 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 1181 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1187 // Bytes sent excludes the RST frame. |
| 1182 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1188 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1), |
| 1183 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1189 delegate->GetTotalSentBytes()); |
| 1190 // Response body frame isn't read becase stream is deleted once read returns |
| 1191 // ERR_IO_PENDING. |
| 1192 EXPECT_EQ(CountReadBytes(reads, arraysize(reads) - 2), |
| 1193 delegate->GetTotalReceivedBytes()); |
| 1184 } | 1194 } |
| 1185 | 1195 |
| 1186 // Receiving a header with uppercase ASCII will result in a protocol error, | 1196 // Receiving a header with uppercase ASCII will result in a protocol error, |
| 1187 // which should be propagated via Delegate::OnFailed. | 1197 // which should be propagated via Delegate::OnFailed. |
| 1188 TEST_F(BidirectionalStreamTest, PropagateProtocolError) { | 1198 TEST_F(BidirectionalStreamTest, PropagateProtocolError) { |
| 1189 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( | 1199 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 1190 kDefaultUrl, 1, kBodyDataSize * 3, LOW, nullptr, 0)); | 1200 kDefaultUrl, 1, kBodyDataSize * 3, LOW, nullptr, 0)); |
| 1191 SpdySerializedFrame rst( | 1201 SpdySerializedFrame rst( |
| 1192 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 1202 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 1193 | 1203 |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1244 | 1254 |
| 1245 index = ExpectLogContainsSomewhere(entries, index, | 1255 index = ExpectLogContainsSomewhere(entries, index, |
| 1246 NetLog::TYPE_BIDIRECTIONAL_STREAM_FAILED, | 1256 NetLog::TYPE_BIDIRECTIONAL_STREAM_FAILED, |
| 1247 NetLog::PHASE_NONE); | 1257 NetLog::PHASE_NONE); |
| 1248 entry = entries[index]; | 1258 entry = entries[index]; |
| 1249 int net_error = OK; | 1259 int net_error = OK; |
| 1250 EXPECT_TRUE(entry.params->GetInteger("net_error", &net_error)); | 1260 EXPECT_TRUE(entry.params->GetInteger("net_error", &net_error)); |
| 1251 EXPECT_THAT(net_error, IsError(ERR_SPDY_PROTOCOL_ERROR)); | 1261 EXPECT_THAT(net_error, IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 1252 } | 1262 } |
| 1253 | 1263 |
| 1254 INSTANTIATE_TEST_CASE_P(CancelOrDeleteTests, | 1264 TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnHeadersReceived) { |
| 1255 BidirectionalStreamTest, | |
| 1256 ::testing::Values(true, false)); | |
| 1257 | |
| 1258 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnHeadersReceived) { | |
| 1259 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | 1265 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 1260 | 1266 |
| 1261 SpdySerializedFrame rst( | 1267 SpdySerializedFrame rst( |
| 1262 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1268 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1263 MockWrite writes[] = { | 1269 MockWrite writes[] = { |
| 1264 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), | 1270 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), |
| 1265 }; | 1271 }; |
| 1266 | 1272 |
| 1267 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 1273 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
| 1268 | 1274 |
| 1269 SpdySerializedFrame resp( | 1275 SpdySerializedFrame resp( |
| 1270 spdy_util_.ConstructSpdyGetReply(kExtraResponseHeaders, 1, 1)); | 1276 spdy_util_.ConstructSpdyGetReply(kExtraResponseHeaders, 1, 1)); |
| 1271 | 1277 |
| 1272 MockRead reads[] = { | 1278 MockRead reads[] = { |
| 1273 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3), | 1279 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3), |
| 1274 }; | 1280 }; |
| 1275 | 1281 |
| 1276 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1282 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1277 | 1283 |
| 1278 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1284 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1279 new BidirectionalStreamRequestInfo); | 1285 new BidirectionalStreamRequestInfo); |
| 1280 request_info->method = "GET"; | 1286 request_info->method = "GET"; |
| 1281 request_info->url = default_url_; | 1287 request_info->url = default_url_; |
| 1282 request_info->priority = LOWEST; | 1288 request_info->priority = LOWEST; |
| 1283 request_info->end_stream_on_headers = true; | 1289 request_info->end_stream_on_headers = true; |
| 1284 | 1290 |
| 1285 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1291 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 1286 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( | 1292 std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate( |
| 1287 new CancelOrDeleteStreamDelegate( | 1293 read_buffer.get(), kReadBufferSize, |
| 1288 read_buffer.get(), kReadBufferSize, | 1294 DeleteStreamDelegate::Phase::ON_HEADERS_RECEIVED)); |
| 1289 CancelOrDeleteStreamDelegate::Phase::ON_HEADERS_RECEIVED, | |
| 1290 GetParam())); | |
| 1291 delegate->SetRunUntilCompletion(true); | 1295 delegate->SetRunUntilCompletion(true); |
| 1292 delegate->Start(std::move(request_info), http_session_.get()); | 1296 delegate->Start(std::move(request_info), http_session_.get()); |
| 1293 // Makes sure delegate does not get called. | 1297 // Makes sure delegate does not get called. |
| 1294 base::RunLoop().RunUntilIdle(); | 1298 base::RunLoop().RunUntilIdle(); |
| 1295 const SpdyHeaderBlock& response_headers = delegate->response_headers(); | 1299 const SpdyHeaderBlock& response_headers = delegate->response_headers(); |
| 1296 EXPECT_EQ("200", response_headers.find(":status")->second); | 1300 EXPECT_EQ("200", response_headers.find(":status")->second); |
| 1297 EXPECT_EQ("header-value", response_headers.find("header-name")->second); | 1301 EXPECT_EQ("header-value", response_headers.find("header-name")->second); |
| 1298 EXPECT_EQ(0u, delegate->data_received().size()); | 1302 EXPECT_EQ(0u, delegate->data_received().size()); |
| 1299 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1303 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1300 EXPECT_EQ(0, delegate->on_data_read_count()); | 1304 EXPECT_EQ(0, delegate->on_data_read_count()); |
| 1301 | 1305 |
| 1302 // If stream is destroyed, do not call into stream. | 1306 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 1303 if (!GetParam()) | 1307 // Bytes sent excludes the RST frame. |
| 1304 return; | 1308 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1), |
| 1305 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1309 delegate->GetTotalSentBytes()); |
| 1306 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1310 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 1307 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1311 delegate->GetTotalReceivedBytes()); |
| 1308 } | 1312 } |
| 1309 | 1313 |
| 1310 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnDataRead) { | 1314 TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnDataRead) { |
| 1311 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | 1315 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 1312 | 1316 |
| 1313 SpdySerializedFrame rst( | 1317 SpdySerializedFrame rst( |
| 1314 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1318 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1315 MockWrite writes[] = { | 1319 MockWrite writes[] = { |
| 1316 CreateMockWrite(req, 0), CreateMockWrite(rst, 3), | 1320 CreateMockWrite(req, 0), CreateMockWrite(rst, 3), |
| 1317 }; | 1321 }; |
| 1318 | 1322 |
| 1319 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 1323 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
| 1320 | 1324 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1332 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1336 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1333 | 1337 |
| 1334 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1338 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1335 new BidirectionalStreamRequestInfo); | 1339 new BidirectionalStreamRequestInfo); |
| 1336 request_info->method = "GET"; | 1340 request_info->method = "GET"; |
| 1337 request_info->url = default_url_; | 1341 request_info->url = default_url_; |
| 1338 request_info->priority = LOWEST; | 1342 request_info->priority = LOWEST; |
| 1339 request_info->end_stream_on_headers = true; | 1343 request_info->end_stream_on_headers = true; |
| 1340 | 1344 |
| 1341 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1345 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 1342 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( | 1346 std::unique_ptr<DeleteStreamDelegate> delegate( |
| 1343 new CancelOrDeleteStreamDelegate( | 1347 new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize, |
| 1344 read_buffer.get(), kReadBufferSize, | 1348 DeleteStreamDelegate::Phase::ON_DATA_READ)); |
| 1345 CancelOrDeleteStreamDelegate::Phase::ON_DATA_READ, GetParam())); | |
| 1346 delegate->SetRunUntilCompletion(true); | 1349 delegate->SetRunUntilCompletion(true); |
| 1347 delegate->Start(std::move(request_info), http_session_.get()); | 1350 delegate->Start(std::move(request_info), http_session_.get()); |
| 1348 // Makes sure delegate does not get called. | 1351 // Makes sure delegate does not get called. |
| 1349 base::RunLoop().RunUntilIdle(); | 1352 base::RunLoop().RunUntilIdle(); |
| 1350 const SpdyHeaderBlock& response_headers = delegate->response_headers(); | 1353 const SpdyHeaderBlock& response_headers = delegate->response_headers(); |
| 1351 EXPECT_EQ("200", response_headers.find(":status")->second); | 1354 EXPECT_EQ("200", response_headers.find(":status")->second); |
| 1352 EXPECT_EQ("header-value", response_headers.find("header-name")->second); | 1355 EXPECT_EQ("header-value", response_headers.find("header-name")->second); |
| 1353 EXPECT_EQ(kUploadDataSize * 1, | 1356 EXPECT_EQ(kUploadDataSize * 1, |
| 1354 static_cast<int>(delegate->data_received().size())); | 1357 static_cast<int>(delegate->data_received().size())); |
| 1355 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1358 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1356 | 1359 |
| 1357 // If stream is destroyed, do not call into stream. | 1360 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 1358 if (!GetParam()) | 1361 // Bytes sent excludes the RST frame. |
| 1359 return; | 1362 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1), |
| 1360 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1363 delegate->GetTotalSentBytes()); |
| 1361 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1364 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 1362 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1365 delegate->GetTotalReceivedBytes()); |
| 1363 } | 1366 } |
| 1364 | 1367 |
| 1365 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnTrailersReceived) { | 1368 TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnTrailersReceived) { |
| 1366 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | 1369 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 1367 | 1370 |
| 1368 SpdySerializedFrame rst( | 1371 SpdySerializedFrame rst( |
| 1369 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 1372 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 1370 MockWrite writes[] = { | 1373 MockWrite writes[] = { |
| 1371 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), | 1374 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), |
| 1372 }; | 1375 }; |
| 1373 | 1376 |
| 1374 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; | 1377 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; |
| 1375 | 1378 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1392 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1395 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1393 | 1396 |
| 1394 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1397 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1395 new BidirectionalStreamRequestInfo); | 1398 new BidirectionalStreamRequestInfo); |
| 1396 request_info->method = "GET"; | 1399 request_info->method = "GET"; |
| 1397 request_info->url = default_url_; | 1400 request_info->url = default_url_; |
| 1398 request_info->priority = LOWEST; | 1401 request_info->priority = LOWEST; |
| 1399 request_info->end_stream_on_headers = true; | 1402 request_info->end_stream_on_headers = true; |
| 1400 | 1403 |
| 1401 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1404 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 1402 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( | 1405 std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate( |
| 1403 new CancelOrDeleteStreamDelegate( | 1406 read_buffer.get(), kReadBufferSize, |
| 1404 read_buffer.get(), kReadBufferSize, | 1407 DeleteStreamDelegate::Phase::ON_TRAILERS_RECEIVED)); |
| 1405 CancelOrDeleteStreamDelegate::Phase::ON_TRAILERS_RECEIVED, | |
| 1406 GetParam())); | |
| 1407 delegate->SetRunUntilCompletion(true); | 1408 delegate->SetRunUntilCompletion(true); |
| 1408 delegate->Start(std::move(request_info), http_session_.get()); | 1409 delegate->Start(std::move(request_info), http_session_.get()); |
| 1409 // Makes sure delegate does not get called. | 1410 // Makes sure delegate does not get called. |
| 1410 base::RunLoop().RunUntilIdle(); | 1411 base::RunLoop().RunUntilIdle(); |
| 1411 const SpdyHeaderBlock& response_headers = delegate->response_headers(); | 1412 const SpdyHeaderBlock& response_headers = delegate->response_headers(); |
| 1412 EXPECT_EQ("200", response_headers.find(":status")->second); | 1413 EXPECT_EQ("200", response_headers.find(":status")->second); |
| 1413 EXPECT_EQ("header-value", response_headers.find("header-name")->second); | 1414 EXPECT_EQ("header-value", response_headers.find("header-name")->second); |
| 1414 EXPECT_EQ("bar", delegate->trailers().find("foo")->second); | 1415 EXPECT_EQ("bar", delegate->trailers().find("foo")->second); |
| 1415 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1416 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1416 // OnDataRead may or may not have been fired before the stream is | 1417 // OnDataRead may or may not have been fired before the stream is |
| 1417 // canceled/deleted. | 1418 // deleted. |
| 1418 | 1419 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 1419 // If stream is destroyed, do not call into stream. | 1420 // Bytes sent excludes the RST frame. |
| 1420 if (!GetParam()) | 1421 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1), |
| 1421 return; | 1422 delegate->GetTotalSentBytes()); |
| 1422 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1423 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 1423 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1424 delegate->GetTotalReceivedBytes()); |
| 1424 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | |
| 1425 } | 1425 } |
| 1426 | 1426 |
| 1427 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnFailed) { | 1427 TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnFailed) { |
| 1428 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | 1428 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 1429 | 1429 |
| 1430 SpdySerializedFrame rst( | 1430 SpdySerializedFrame rst( |
| 1431 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); | 1431 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); |
| 1432 | 1432 |
| 1433 MockWrite writes[] = { | 1433 MockWrite writes[] = { |
| 1434 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), | 1434 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), |
| 1435 }; | 1435 }; |
| 1436 | 1436 |
| 1437 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; | 1437 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
| 1438 SpdySerializedFrame resp( | 1438 SpdySerializedFrame resp( |
| 1439 spdy_util_.ConstructSpdyGetReply(kExtraHeaders, 1, 1)); | 1439 spdy_util_.ConstructSpdyGetReply(kExtraHeaders, 1, 1)); |
| 1440 | 1440 |
| 1441 MockRead reads[] = { | 1441 MockRead reads[] = { |
| 1442 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3), | 1442 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3), |
| 1443 }; | 1443 }; |
| 1444 | 1444 |
| 1445 InitSession(reads, arraysize(reads), writes, arraysize(writes)); | 1445 InitSession(reads, arraysize(reads), writes, arraysize(writes)); |
| 1446 | 1446 |
| 1447 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( | 1447 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( |
| 1448 new BidirectionalStreamRequestInfo); | 1448 new BidirectionalStreamRequestInfo); |
| 1449 request_info->method = "GET"; | 1449 request_info->method = "GET"; |
| 1450 request_info->url = default_url_; | 1450 request_info->url = default_url_; |
| 1451 request_info->priority = LOWEST; | 1451 request_info->priority = LOWEST; |
| 1452 request_info->end_stream_on_headers = true; | 1452 request_info->end_stream_on_headers = true; |
| 1453 | 1453 |
| 1454 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1454 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 1455 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( | 1455 std::unique_ptr<DeleteStreamDelegate> delegate( |
| 1456 new CancelOrDeleteStreamDelegate( | 1456 new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize, |
| 1457 read_buffer.get(), kReadBufferSize, | 1457 DeleteStreamDelegate::Phase::ON_FAILED)); |
| 1458 CancelOrDeleteStreamDelegate::Phase::ON_FAILED, GetParam())); | |
| 1459 delegate->SetRunUntilCompletion(true); | 1458 delegate->SetRunUntilCompletion(true); |
| 1460 delegate->Start(std::move(request_info), http_session_.get()); | 1459 delegate->Start(std::move(request_info), http_session_.get()); |
| 1461 // Makes sure delegate does not get called. | 1460 // Makes sure delegate does not get called. |
| 1462 base::RunLoop().RunUntilIdle(); | 1461 base::RunLoop().RunUntilIdle(); |
| 1463 EXPECT_EQ(delegate->response_headers().end(), | 1462 EXPECT_EQ(delegate->response_headers().end(), |
| 1464 delegate->response_headers().find(":status")); | 1463 delegate->response_headers().find(":status")); |
| 1465 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1464 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1466 EXPECT_EQ(0, delegate->on_data_read_count()); | 1465 EXPECT_EQ(0, delegate->on_data_read_count()); |
| 1467 EXPECT_THAT(delegate->error(), IsError(ERR_SPDY_PROTOCOL_ERROR)); | 1466 EXPECT_THAT(delegate->error(), IsError(ERR_SPDY_PROTOCOL_ERROR)); |
| 1468 | 1467 |
| 1469 // If stream is destroyed, do not call into stream. | 1468 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); |
| 1470 if (!GetParam()) | 1469 // Bytes sent excludes the RST frame. |
| 1471 return; | 1470 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1), |
| 1472 EXPECT_EQ(0, delegate->GetTotalSentBytes()); | 1471 delegate->GetTotalSentBytes()); |
| 1473 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); | 1472 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), |
| 1474 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); | 1473 delegate->GetTotalReceivedBytes()); |
| 1475 } | 1474 } |
| 1476 | 1475 |
| 1477 TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { | 1476 TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { |
| 1478 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); | 1477 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); |
| 1479 // Empty DATA frame with an END_STREAM flag. | 1478 // Empty DATA frame with an END_STREAM flag. |
| 1480 SpdySerializedFrame end_stream( | 1479 SpdySerializedFrame end_stream( |
| 1481 spdy_util_.ConstructSpdyDataFrame(1, nullptr, 0, true)); | 1480 spdy_util_.ConstructSpdyDataFrame(1, nullptr, 0, true)); |
| 1482 | 1481 |
| 1483 MockWrite writes[] = {CreateMockWrite(req, 0)}; | 1482 MockWrite writes[] = {CreateMockWrite(req, 0)}; |
| 1484 | 1483 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1530 http_session_->http_server_properties()->GetAlternativeServices( | 1529 http_session_->http_server_properties()->GetAlternativeServices( |
| 1531 url::SchemeHostPort(default_url_)); | 1530 url::SchemeHostPort(default_url_)); |
| 1532 ASSERT_EQ(1u, alternative_service_vector.size()); | 1531 ASSERT_EQ(1u, alternative_service_vector.size()); |
| 1533 EXPECT_EQ(AlternateProtocolFromNextProto(kProtoQUIC1SPDY3), | 1532 EXPECT_EQ(AlternateProtocolFromNextProto(kProtoQUIC1SPDY3), |
| 1534 alternative_service_vector[0].protocol); | 1533 alternative_service_vector[0].protocol); |
| 1535 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); | 1534 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); |
| 1536 EXPECT_EQ(443, alternative_service_vector[0].port); | 1535 EXPECT_EQ(443, alternative_service_vector[0].port); |
| 1537 } | 1536 } |
| 1538 | 1537 |
| 1539 } // namespace net | 1538 } // namespace net |
| OLD | NEW |