| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/quic/quic_headers_stream.h" | 5 #include "net/quic/quic_headers_stream.h" |
| 6 | 6 |
| 7 #include "net/quic/quic_utils.h" | 7 #include "net/quic/quic_utils.h" |
| 8 #include "net/quic/spdy_utils.h" | 8 #include "net/quic/spdy_utils.h" |
| 9 #include "net/quic/test_tools/quic_connection_peer.h" | 9 #include "net/quic/test_tools/quic_connection_peer.h" |
| 10 #include "net/quic/test_tools/quic_spdy_session_peer.h" | 10 #include "net/quic/test_tools/quic_spdy_session_peer.h" |
| 11 #include "net/quic/test_tools/quic_test_utils.h" | 11 #include "net/quic/test_tools/quic_test_utils.h" |
| 12 #include "net/quic/test_tools/reliable_quic_stream_peer.h" | 12 #include "net/quic/test_tools/reliable_quic_stream_peer.h" |
| 13 #include "net/spdy/spdy_alt_svc_wire_format.h" | 13 #include "net/spdy/spdy_alt_svc_wire_format.h" |
| 14 #include "net/spdy/spdy_protocol.h" | 14 #include "net/spdy/spdy_protocol.h" |
| 15 #include "net/spdy/spdy_test_utils.h" | 15 #include "net/spdy/spdy_test_utils.h" |
| 16 #include "net/test/gtest_util.h" | 16 #include "net/test/gtest_util.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 18 |
| 19 using base::StringPiece; | 19 using base::StringPiece; |
| 20 using std::ostream; | 20 using std::ostream; |
| 21 using std::string; | 21 using std::string; |
| 22 using std::vector; | 22 using std::vector; |
| 23 using testing::ElementsAre; | 23 using testing::ElementsAre; |
| 24 using testing::InSequence; | 24 using testing::InSequence; |
| 25 using testing::Invoke; | 25 using testing::Invoke; |
| 26 using testing::Return; |
| 26 using testing::StrictMock; | 27 using testing::StrictMock; |
| 27 using testing::WithArgs; | 28 using testing::WithArgs; |
| 28 using testing::_; | 29 using testing::_; |
| 29 | 30 |
| 30 namespace net { | 31 namespace net { |
| 31 namespace test { | 32 namespace test { |
| 32 namespace { | 33 namespace { |
| 33 | 34 |
| 34 // TODO(ckrasic): this workaround is due to absence of std::initializer_list | 35 // TODO(ckrasic): this workaround is due to absence of std::initializer_list |
| 35 const bool kFins[] = {false, true}; | 36 const bool kFins[] = {false, true}; |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 | 156 |
| 156 bool SaveHeaderData(const char* data, int len) { | 157 bool SaveHeaderData(const char* data, int len) { |
| 157 saved_header_data_.append(data, len); | 158 saved_header_data_.append(data, len); |
| 158 return true; | 159 return true; |
| 159 } | 160 } |
| 160 | 161 |
| 161 void SaveHeaderDataStringPiece(StringPiece data) { | 162 void SaveHeaderDataStringPiece(StringPiece data) { |
| 162 saved_header_data_.append(data.data(), data.length()); | 163 saved_header_data_.append(data.data(), data.length()); |
| 163 } | 164 } |
| 164 | 165 |
| 166 void SavePromiseHeaderList(QuicStreamId /* stream_id */, |
| 167 QuicStreamId /* promised_stream_id */, |
| 168 size_t size, |
| 169 const QuicHeaderList& header_list) { |
| 170 SaveToHandler(size, header_list); |
| 171 } |
| 172 |
| 173 void SaveHeaderList(QuicStreamId /* stream_id */, |
| 174 bool /* fin */, |
| 175 size_t size, |
| 176 const QuicHeaderList& header_list) { |
| 177 SaveToHandler(size, header_list); |
| 178 } |
| 179 |
| 180 void SaveToHandler(size_t size, const QuicHeaderList& header_list) { |
| 181 headers_handler_.reset(new TestHeadersHandler); |
| 182 headers_handler_->OnHeaderBlockStart(); |
| 183 for (const auto& p : header_list) { |
| 184 headers_handler_->OnHeader(p.first, p.second); |
| 185 } |
| 186 headers_handler_->OnHeaderBlockEnd(size); |
| 187 } |
| 188 |
| 165 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, | 189 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, |
| 166 bool fin, | 190 bool fin, |
| 167 SpdyPriority priority) { | 191 SpdyPriority priority) { |
| 168 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); | 192 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); |
| 169 } | 193 } |
| 170 | 194 |
| 171 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { | 195 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { |
| 172 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); | 196 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); |
| 173 } | 197 } |
| 174 | 198 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 187 OnHeaders(stream_id, kHasPriority, priority, | 211 OnHeaders(stream_id, kHasPriority, priority, |
| 188 /*parent_stream_id=*/0, | 212 /*parent_stream_id=*/0, |
| 189 /*exclusive=*/false, fin, kFrameComplete)); | 213 /*exclusive=*/false, fin, kFrameComplete)); |
| 190 } else { | 214 } else { |
| 191 EXPECT_CALL(visitor_, | 215 EXPECT_CALL(visitor_, |
| 192 OnHeaders(stream_id, !kHasPriority, | 216 OnHeaders(stream_id, !kHasPriority, |
| 193 /*priority=*/0, | 217 /*priority=*/0, |
| 194 /*parent_stream_id=*/0, | 218 /*parent_stream_id=*/0, |
| 195 /*exclusive=*/false, fin, kFrameComplete)); | 219 /*exclusive=*/false, fin, kFrameComplete)); |
| 196 } | 220 } |
| 197 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 221 headers_handler_.reset(new TestHeadersHandler); |
| 198 .WillRepeatedly(WithArgs<1, 2>( | 222 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id)) |
| 199 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 223 .WillOnce(Return(headers_handler_.get())); |
| 224 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1); |
| 200 if (fin) { | 225 if (fin) { |
| 201 EXPECT_CALL(visitor_, OnStreamEnd(stream_id)); | 226 EXPECT_CALL(visitor_, OnStreamEnd(stream_id)); |
| 202 } | 227 } |
| 203 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); | 228 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
| 204 EXPECT_FALSE(framer_->HasError()) | 229 EXPECT_FALSE(framer_->HasError()) |
| 205 << SpdyFramer::ErrorCodeToString(framer_->error_code()); | 230 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
| 206 | 231 |
| 207 CheckHeaders(); | 232 CheckHeaders(); |
| 208 saved_data_.clear(); | 233 saved_data_.clear(); |
| 209 } | 234 } |
| 210 | 235 |
| 211 void CheckHeaders() { | 236 void CheckHeaders() { |
| 212 SpdyHeaderBlock headers; | 237 EXPECT_EQ(headers_, headers_handler_->decoded_block()); |
| 213 EXPECT_TRUE(framer_->ParseHeaderBlockInBuffer( | 238 headers_handler_.reset(); |
| 214 saved_header_data_.data(), saved_header_data_.length(), &headers)); | |
| 215 EXPECT_EQ(headers_, headers); | |
| 216 saved_header_data_.clear(); | |
| 217 } | 239 } |
| 218 | 240 |
| 219 Perspective perspective() { return GetParam().perspective; } | 241 Perspective perspective() { return GetParam().perspective; } |
| 220 | 242 |
| 221 QuicVersion version() { return GetParam().version; } | 243 QuicVersion version() { return GetParam().version; } |
| 222 | 244 |
| 223 QuicVersionVector GetVersion() { | 245 QuicVersionVector GetVersion() { |
| 224 QuicVersionVector versions; | 246 QuicVersionVector versions; |
| 225 versions.push_back(version()); | 247 versions.push_back(version()); |
| 226 return versions; | 248 return versions; |
| 227 } | 249 } |
| 228 | 250 |
| 229 void TearDownLocalConnectionState() { | 251 void TearDownLocalConnectionState() { |
| 230 QuicConnectionPeer::TearDownLocalConnectionState(connection_); | 252 QuicConnectionPeer::TearDownLocalConnectionState(connection_); |
| 231 } | 253 } |
| 232 | 254 |
| 233 QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } | 255 QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } |
| 234 | 256 |
| 235 static const bool kFrameComplete = true; | 257 static const bool kFrameComplete = true; |
| 236 static const bool kHasPriority = true; | 258 static const bool kHasPriority = true; |
| 237 | 259 |
| 238 MockConnectionHelper helper_; | 260 MockConnectionHelper helper_; |
| 239 MockAlarmFactory alarm_factory_; | 261 MockAlarmFactory alarm_factory_; |
| 240 StrictMock<MockConnection>* connection_; | 262 StrictMock<MockConnection>* connection_; |
| 241 StrictMock<MockQuicSpdySession> session_; | 263 StrictMock<MockQuicSpdySession> session_; |
| 242 QuicHeadersStream* headers_stream_; | 264 QuicHeadersStream* headers_stream_; |
| 243 SpdyHeaderBlock headers_; | 265 SpdyHeaderBlock headers_; |
| 266 std::unique_ptr<TestHeadersHandler> headers_handler_; |
| 244 string body_; | 267 string body_; |
| 245 string saved_data_; | 268 string saved_data_; |
| 246 string saved_header_data_; | 269 string saved_header_data_; |
| 247 std::unique_ptr<SpdyFramer> framer_; | 270 std::unique_ptr<SpdyFramer> framer_; |
| 248 StrictMock<MockVisitor> visitor_; | 271 StrictMock<MockVisitor> visitor_; |
| 249 QuicStreamFrame stream_frame_; | 272 QuicStreamFrame stream_frame_; |
| 250 QuicStreamId next_promised_stream_id_; | 273 QuicStreamId next_promised_stream_id_; |
| 251 }; | 274 }; |
| 252 | 275 |
| 253 INSTANTIATE_TEST_CASE_P(Tests, | 276 INSTANTIATE_TEST_CASE_P(Tests, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 281 if (perspective() == Perspective::IS_SERVER) { | 304 if (perspective() == Perspective::IS_SERVER) { |
| 282 // Write the headers and capture the outgoing data | 305 // Write the headers and capture the outgoing data |
| 283 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, nullptr)) | 306 EXPECT_CALL(session_, WritevData(kHeadersStreamId, _, _, false, nullptr)) |
| 284 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); | 307 .WillOnce(WithArgs<1>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); |
| 285 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, | 308 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, |
| 286 nullptr); | 309 nullptr); |
| 287 | 310 |
| 288 // Parse the outgoing data and check that it matches was was written. | 311 // Parse the outgoing data and check that it matches was was written. |
| 289 EXPECT_CALL(visitor_, | 312 EXPECT_CALL(visitor_, |
| 290 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); | 313 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); |
| 291 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 314 headers_handler_.reset(new TestHeadersHandler); |
| 292 .WillRepeatedly(WithArgs<1, 2>( | 315 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id)) |
| 293 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 316 .WillOnce(Return(headers_handler_.get())); |
| 317 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1); |
| 294 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); | 318 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
| 295 EXPECT_FALSE(framer_->HasError()) | 319 EXPECT_FALSE(framer_->HasError()) |
| 296 << SpdyFramer::ErrorCodeToString(framer_->error_code()); | 320 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
| 297 CheckHeaders(); | 321 CheckHeaders(); |
| 298 saved_data_.clear(); | 322 saved_data_.clear(); |
| 299 } else { | 323 } else { |
| 300 EXPECT_DFATAL(headers_stream_->WritePushPromise( | 324 EXPECT_DFATAL(headers_stream_->WritePushPromise( |
| 301 stream_id, promised_stream_id, headers_, nullptr), | 325 stream_id, promised_stream_id, headers_, nullptr), |
| 302 "Client shouldn't send PUSH_PROMISE"); | 326 "Client shouldn't send PUSH_PROMISE"); |
| 303 } | 327 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 317 headers_frame.set_fin(fin); | 341 headers_frame.set_fin(fin); |
| 318 headers_frame.set_has_priority(true); | 342 headers_frame.set_has_priority(true); |
| 319 frame = framer_->SerializeFrame(headers_frame); | 343 frame = framer_->SerializeFrame(headers_frame); |
| 320 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 344 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
| 321 } else { | 345 } else { |
| 322 SpdyHeadersIR headers_frame(stream_id); | 346 SpdyHeadersIR headers_frame(stream_id); |
| 323 headers_frame.set_header_block(headers_); | 347 headers_frame.set_header_block(headers_); |
| 324 headers_frame.set_fin(fin); | 348 headers_frame.set_fin(fin); |
| 325 frame = framer_->SerializeFrame(headers_frame); | 349 frame = framer_->SerializeFrame(headers_frame); |
| 326 } | 350 } |
| 327 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | |
| 328 .WillRepeatedly(WithArgs<1>(Invoke( | |
| 329 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
| 330 EXPECT_CALL(session_, | 351 EXPECT_CALL(session_, |
| 331 OnStreamHeadersComplete(stream_id, fin, frame.size())); | 352 OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 353 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); |
| 332 stream_frame_.frame_buffer = frame.data(); | 354 stream_frame_.frame_buffer = frame.data(); |
| 333 stream_frame_.frame_length = frame.size(); | 355 stream_frame_.frame_length = frame.size(); |
| 334 headers_stream_->OnStreamFrame(stream_frame_); | 356 headers_stream_->OnStreamFrame(stream_frame_); |
| 335 stream_frame_.offset += frame.size(); | 357 stream_frame_.offset += frame.size(); |
| 336 CheckHeaders(); | 358 CheckHeaders(); |
| 337 } | 359 } |
| 338 } | 360 } |
| 339 } | 361 } |
| 340 } | 362 } |
| 341 | 363 |
| 342 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { | 364 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { |
| 343 if (perspective() == Perspective::IS_SERVER) | 365 if (perspective() == Perspective::IS_SERVER) |
| 344 return; | 366 return; |
| 345 for (QuicStreamId stream_id = kClientDataStreamId1; | 367 for (QuicStreamId stream_id = kClientDataStreamId1; |
| 346 stream_id < kClientDataStreamId3; stream_id += 2) { | 368 stream_id < kClientDataStreamId3; stream_id += 2) { |
| 347 QuicStreamId promised_stream_id = NextPromisedStreamId(); | 369 QuicStreamId promised_stream_id = NextPromisedStreamId(); |
| 348 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); | 370 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); |
| 349 push_promise.set_header_block(headers_); | 371 push_promise.set_header_block(headers_); |
| 350 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); | 372 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); |
| 351 if (perspective() == Perspective::IS_SERVER) { | 373 if (perspective() == Perspective::IS_SERVER) { |
| 352 EXPECT_CALL(*connection_, | 374 EXPECT_CALL(*connection_, |
| 353 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, | 375 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 354 "PUSH_PROMISE not supported.", _)) | 376 "PUSH_PROMISE not supported.", _)) |
| 355 .WillRepeatedly(InvokeWithoutArgs( | 377 .WillRepeatedly(InvokeWithoutArgs( |
| 356 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); | 378 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); |
| 357 } else { | 379 } else { |
| 358 EXPECT_CALL(session_, OnPromiseHeaders(stream_id, _)) | 380 EXPECT_CALL(session_, OnPromiseHeaderList(stream_id, promised_stream_id, |
| 359 .WillRepeatedly(WithArgs<1>( | 381 frame.size(), _)) |
| 360 Invoke(this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | 382 .WillOnce( |
| 361 EXPECT_CALL(session_, OnPromiseHeadersComplete( | 383 Invoke(this, &QuicHeadersStreamTest::SavePromiseHeaderList)); |
| 362 stream_id, promised_stream_id, frame.size())); | |
| 363 } | 384 } |
| 364 stream_frame_.frame_buffer = frame.data(); | 385 stream_frame_.frame_buffer = frame.data(); |
| 365 stream_frame_.frame_length = frame.size(); | 386 stream_frame_.frame_length = frame.size(); |
| 366 headers_stream_->OnStreamFrame(stream_frame_); | 387 headers_stream_->OnStreamFrame(stream_frame_); |
| 367 if (perspective() == Perspective::IS_CLIENT) { | 388 if (perspective() == Perspective::IS_CLIENT) { |
| 368 stream_frame_.offset += frame.size(); | 389 stream_frame_.offset += frame.size(); |
| 369 CheckHeaders(); | 390 CheckHeaders(); |
| 370 } | 391 } |
| 371 } | 392 } |
| 372 } | 393 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 388 headers_frame.set_fin(fin); | 409 headers_frame.set_fin(fin); |
| 389 headers_frame.set_has_priority(true); | 410 headers_frame.set_has_priority(true); |
| 390 frame = framer_->SerializeFrame(headers_frame); | 411 frame = framer_->SerializeFrame(headers_frame); |
| 391 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 412 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
| 392 } else { | 413 } else { |
| 393 SpdyHeadersIR headers_frame(stream_id); | 414 SpdyHeadersIR headers_frame(stream_id); |
| 394 headers_frame.set_header_block(headers_); | 415 headers_frame.set_header_block(headers_); |
| 395 headers_frame.set_fin(fin); | 416 headers_frame.set_fin(fin); |
| 396 frame = framer_->SerializeFrame(headers_frame); | 417 frame = framer_->SerializeFrame(headers_frame); |
| 397 } | 418 } |
| 398 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)); | 419 EXPECT_CALL(session_, OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 399 EXPECT_CALL(session_, | 420 .Times(1); |
| 400 OnStreamHeadersComplete(stream_id, fin, frame.size())); | |
| 401 stream_frame_.frame_buffer = frame.data(); | 421 stream_frame_.frame_buffer = frame.data(); |
| 402 stream_frame_.frame_length = frame.size(); | 422 stream_frame_.frame_length = frame.size(); |
| 403 headers_stream_->OnStreamFrame(stream_frame_); | 423 headers_stream_->OnStreamFrame(stream_frame_); |
| 404 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 424 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
| 405 stream_frame_.offset += frame.size(); | 425 stream_frame_.offset += frame.size(); |
| 406 } | 426 } |
| 407 } | 427 } |
| 408 | 428 |
| 409 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { | 429 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { |
| 410 if (!FLAGS_quic_measure_headers_hol_blocking_time) { | 430 if (!FLAGS_quic_measure_headers_hol_blocking_time) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 432 headers_frame.set_fin(fin); | 452 headers_frame.set_fin(fin); |
| 433 frames[stream_num] = framer_->SerializeFrame(headers_frame); | 453 frames[stream_num] = framer_->SerializeFrame(headers_frame); |
| 434 } | 454 } |
| 435 stream_frames[stream_num].stream_id = stream_frame_.stream_id; | 455 stream_frames[stream_num].stream_id = stream_frame_.stream_id; |
| 436 stream_frames[stream_num].offset = stream_frame_.offset; | 456 stream_frames[stream_num].offset = stream_frame_.offset; |
| 437 stream_frames[stream_num].frame_buffer = frames[stream_num].data(); | 457 stream_frames[stream_num].frame_buffer = frames[stream_num].data(); |
| 438 stream_frames[stream_num].frame_length = frames[stream_num].size(); | 458 stream_frames[stream_num].frame_length = frames[stream_num].size(); |
| 439 DVLOG(1) << "make frame for stream " << stream_num << " offset " | 459 DVLOG(1) << "make frame for stream " << stream_num << " offset " |
| 440 << stream_frames[stream_num].offset; | 460 << stream_frames[stream_num].offset; |
| 441 stream_frame_.offset += frames[stream_num].size(); | 461 stream_frame_.offset += frames[stream_num].size(); |
| 442 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)).Times(1); | 462 EXPECT_CALL(session_, OnStreamHeaderList(stream_id, fin, _, _)).Times(1); |
| 443 EXPECT_CALL(session_, OnStreamHeadersComplete(stream_id, fin, _)) | |
| 444 .Times(1); | |
| 445 } | 463 } |
| 446 } | 464 } |
| 447 | 465 |
| 448 // Actually writing the frames in reverse order will cause HOL blocking. | 466 // Actually writing the frames in reverse order will cause HOL blocking. |
| 449 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(9); | 467 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(9); |
| 450 | 468 |
| 451 for (int stream_num = 9; stream_num >= 0; --stream_num) { | 469 for (int stream_num = 9; stream_num >= 0; --stream_num) { |
| 452 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset " | 470 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset " |
| 453 << stream_frames[stream_num].offset; | 471 << stream_frames[stream_num].offset; |
| 454 headers_stream_->OnStreamFrame(stream_frames[stream_num]); | 472 headers_stream_->OnStreamFrame(stream_frames[stream_num]); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 475 headers_frame.set_fin(fin); | 493 headers_frame.set_fin(fin); |
| 476 headers_frame.set_has_priority(true); | 494 headers_frame.set_has_priority(true); |
| 477 frame = framer_->SerializeFrame(headers_frame); | 495 frame = framer_->SerializeFrame(headers_frame); |
| 478 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 496 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
| 479 } else { | 497 } else { |
| 480 SpdyHeadersIR headers_frame(stream_id); | 498 SpdyHeadersIR headers_frame(stream_id); |
| 481 headers_frame.set_header_block(headers_); | 499 headers_frame.set_header_block(headers_); |
| 482 headers_frame.set_fin(fin); | 500 headers_frame.set_fin(fin); |
| 483 frame = framer_->SerializeFrame(headers_frame); | 501 frame = framer_->SerializeFrame(headers_frame); |
| 484 } | 502 } |
| 485 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | |
| 486 .WillRepeatedly(WithArgs<1>(Invoke( | |
| 487 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
| 488 EXPECT_CALL(session_, | 503 EXPECT_CALL(session_, |
| 489 OnStreamHeadersComplete(stream_id, fin, frame.size())); | 504 OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 505 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); |
| 490 stream_frame_.frame_buffer = frame.data(); | 506 stream_frame_.frame_buffer = frame.data(); |
| 491 stream_frame_.frame_length = frame.size(); | 507 stream_frame_.frame_length = frame.size(); |
| 492 headers_stream_->OnStreamFrame(stream_frame_); | 508 headers_stream_->OnStreamFrame(stream_frame_); |
| 493 stream_frame_.offset += frame.size(); | 509 stream_frame_.offset += frame.size(); |
| 494 CheckHeaders(); | 510 CheckHeaders(); |
| 495 } | 511 } |
| 496 } | 512 } |
| 497 } | 513 } |
| 498 } | 514 } |
| 499 | 515 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 583 } | 599 } |
| 584 | 600 |
| 585 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { | 601 TEST_P(QuicHeadersStreamTest, NoConnectionLevelFlowControl) { |
| 586 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl( | 602 EXPECT_FALSE(ReliableQuicStreamPeer::StreamContributesToConnectionFlowControl( |
| 587 headers_stream_)); | 603 headers_stream_)); |
| 588 } | 604 } |
| 589 | 605 |
| 590 } // namespace | 606 } // namespace |
| 591 } // namespace test | 607 } // namespace test |
| 592 } // namespace net | 608 } // namespace net |
| OLD | NEW |