| 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 | 33 |
| 33 class MockHpackDebugVisitor : public QuicHeadersStream::HpackDebugVisitor { | 34 class MockHpackDebugVisitor : public QuicHeadersStream::HpackDebugVisitor { |
| 34 public: | 35 public: |
| 35 explicit MockHpackDebugVisitor() : HpackDebugVisitor() {} | 36 explicit MockHpackDebugVisitor() : HpackDebugVisitor() {} |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 | 169 |
| 169 bool SaveHeaderData(const char* data, int len) { | 170 bool SaveHeaderData(const char* data, int len) { |
| 170 saved_header_data_.append(data, len); | 171 saved_header_data_.append(data, len); |
| 171 return true; | 172 return true; |
| 172 } | 173 } |
| 173 | 174 |
| 174 void SaveHeaderDataStringPiece(StringPiece data) { | 175 void SaveHeaderDataStringPiece(StringPiece data) { |
| 175 saved_header_data_.append(data.data(), data.length()); | 176 saved_header_data_.append(data.data(), data.length()); |
| 176 } | 177 } |
| 177 | 178 |
| 179 void SavePromiseHeaderList(QuicStreamId /* stream_id */, |
| 180 QuicStreamId /* promised_stream_id */, |
| 181 size_t size, |
| 182 const QuicHeaderList& header_list) { |
| 183 SaveToHandler(size, header_list); |
| 184 } |
| 185 |
| 186 void SaveHeaderList(QuicStreamId /* stream_id */, |
| 187 bool /* fin */, |
| 188 size_t size, |
| 189 const QuicHeaderList& header_list) { |
| 190 SaveToHandler(size, header_list); |
| 191 } |
| 192 |
| 193 void SaveToHandler(size_t size, const QuicHeaderList& header_list) { |
| 194 headers_handler_.reset(new TestHeadersHandler); |
| 195 headers_handler_->OnHeaderBlockStart(); |
| 196 for (const auto& p : header_list) { |
| 197 headers_handler_->OnHeader(p.first, p.second); |
| 198 } |
| 199 headers_handler_->OnHeaderBlockEnd(size); |
| 200 } |
| 201 |
| 178 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, | 202 void WriteHeadersAndExpectSynStream(QuicStreamId stream_id, |
| 179 bool fin, | 203 bool fin, |
| 180 SpdyPriority priority) { | 204 SpdyPriority priority) { |
| 181 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); | 205 WriteHeadersAndCheckData(stream_id, fin, priority, SYN_STREAM); |
| 182 } | 206 } |
| 183 | 207 |
| 184 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { | 208 void WriteHeadersAndExpectSynReply(QuicStreamId stream_id, bool fin) { |
| 185 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); | 209 WriteHeadersAndCheckData(stream_id, fin, 0, SYN_REPLY); |
| 186 } | 210 } |
| 187 | 211 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 201 OnHeaders(stream_id, kHasPriority, priority, | 225 OnHeaders(stream_id, kHasPriority, priority, |
| 202 /*parent_stream_id=*/0, | 226 /*parent_stream_id=*/0, |
| 203 /*exclusive=*/false, fin, kFrameComplete)); | 227 /*exclusive=*/false, fin, kFrameComplete)); |
| 204 } else { | 228 } else { |
| 205 EXPECT_CALL(visitor_, | 229 EXPECT_CALL(visitor_, |
| 206 OnHeaders(stream_id, !kHasPriority, | 230 OnHeaders(stream_id, !kHasPriority, |
| 207 /*priority=*/0, | 231 /*priority=*/0, |
| 208 /*parent_stream_id=*/0, | 232 /*parent_stream_id=*/0, |
| 209 /*exclusive=*/false, fin, kFrameComplete)); | 233 /*exclusive=*/false, fin, kFrameComplete)); |
| 210 } | 234 } |
| 211 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 235 headers_handler_.reset(new TestHeadersHandler); |
| 212 .WillRepeatedly(WithArgs<1, 2>( | 236 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id)) |
| 213 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 237 .WillOnce(Return(headers_handler_.get())); |
| 238 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1); |
| 214 if (fin) { | 239 if (fin) { |
| 215 EXPECT_CALL(visitor_, OnStreamEnd(stream_id)); | 240 EXPECT_CALL(visitor_, OnStreamEnd(stream_id)); |
| 216 } | 241 } |
| 217 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); | 242 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
| 218 EXPECT_FALSE(framer_->HasError()) | 243 EXPECT_FALSE(framer_->HasError()) |
| 219 << SpdyFramer::ErrorCodeToString(framer_->error_code()); | 244 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
| 220 | 245 |
| 221 CheckHeaders(); | 246 CheckHeaders(); |
| 222 saved_data_.clear(); | 247 saved_data_.clear(); |
| 223 } | 248 } |
| 224 | 249 |
| 225 void CheckHeaders() { | 250 void CheckHeaders() { |
| 226 SpdyHeaderBlock headers; | 251 EXPECT_EQ(headers_, headers_handler_->decoded_block()); |
| 227 EXPECT_TRUE(framer_->ParseHeaderBlockInBuffer( | 252 headers_handler_.reset(); |
| 228 saved_header_data_.data(), saved_header_data_.length(), &headers)); | |
| 229 EXPECT_EQ(headers_, headers); | |
| 230 saved_header_data_.clear(); | |
| 231 } | 253 } |
| 232 | 254 |
| 233 Perspective perspective() { return GetParam().perspective; } | 255 Perspective perspective() { return GetParam().perspective; } |
| 234 | 256 |
| 235 QuicVersion version() { return GetParam().version; } | 257 QuicVersion version() { return GetParam().version; } |
| 236 | 258 |
| 237 QuicVersionVector GetVersion() { | 259 QuicVersionVector GetVersion() { |
| 238 QuicVersionVector versions; | 260 QuicVersionVector versions; |
| 239 versions.push_back(version()); | 261 versions.push_back(version()); |
| 240 return versions; | 262 return versions; |
| 241 } | 263 } |
| 242 | 264 |
| 243 void TearDownLocalConnectionState() { | 265 void TearDownLocalConnectionState() { |
| 244 QuicConnectionPeer::TearDownLocalConnectionState(connection_); | 266 QuicConnectionPeer::TearDownLocalConnectionState(connection_); |
| 245 } | 267 } |
| 246 | 268 |
| 247 QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } | 269 QuicStreamId NextPromisedStreamId() { return next_promised_stream_id_ += 2; } |
| 248 | 270 |
| 249 static const bool kFrameComplete = true; | 271 static const bool kFrameComplete = true; |
| 250 static const bool kHasPriority = true; | 272 static const bool kHasPriority = true; |
| 251 | 273 |
| 252 MockQuicConnectionHelper helper_; | 274 MockQuicConnectionHelper helper_; |
| 253 MockAlarmFactory alarm_factory_; | 275 MockAlarmFactory alarm_factory_; |
| 254 StrictMock<MockQuicConnection>* connection_; | 276 StrictMock<MockQuicConnection>* connection_; |
| 255 StrictMock<MockQuicSpdySession> session_; | 277 StrictMock<MockQuicSpdySession> session_; |
| 256 QuicHeadersStream* headers_stream_; | 278 QuicHeadersStream* headers_stream_; |
| 257 SpdyHeaderBlock headers_; | 279 SpdyHeaderBlock headers_; |
| 280 std::unique_ptr<TestHeadersHandler> headers_handler_; |
| 258 string body_; | 281 string body_; |
| 259 string saved_data_; | 282 string saved_data_; |
| 260 string saved_header_data_; | 283 string saved_header_data_; |
| 261 std::unique_ptr<SpdyFramer> framer_; | 284 std::unique_ptr<SpdyFramer> framer_; |
| 262 StrictMock<MockVisitor> visitor_; | 285 StrictMock<MockVisitor> visitor_; |
| 263 std::unique_ptr<StrictMock<MockHpackDebugVisitor>> hpack_encoder_visitor_; | 286 std::unique_ptr<StrictMock<MockHpackDebugVisitor>> hpack_encoder_visitor_; |
| 264 std::unique_ptr<StrictMock<MockHpackDebugVisitor>> hpack_decoder_visitor_; | 287 std::unique_ptr<StrictMock<MockHpackDebugVisitor>> hpack_decoder_visitor_; |
| 265 QuicStreamFrame stream_frame_; | 288 QuicStreamFrame stream_frame_; |
| 266 QuicStreamId next_promised_stream_id_; | 289 QuicStreamId next_promised_stream_id_; |
| 267 }; | 290 }; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 298 // Write the headers and capture the outgoing data | 321 // Write the headers and capture the outgoing data |
| 299 EXPECT_CALL(session_, WritevData(headers_stream_, kHeadersStreamId, _, _, | 322 EXPECT_CALL(session_, WritevData(headers_stream_, kHeadersStreamId, _, _, |
| 300 false, nullptr)) | 323 false, nullptr)) |
| 301 .WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); | 324 .WillOnce(WithArgs<2>(Invoke(this, &QuicHeadersStreamTest::SaveIov))); |
| 302 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, | 325 headers_stream_->WritePushPromise(stream_id, promised_stream_id, headers_, |
| 303 nullptr); | 326 nullptr); |
| 304 | 327 |
| 305 // Parse the outgoing data and check that it matches was was written. | 328 // Parse the outgoing data and check that it matches was was written. |
| 306 EXPECT_CALL(visitor_, | 329 EXPECT_CALL(visitor_, |
| 307 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); | 330 OnPushPromise(stream_id, promised_stream_id, kFrameComplete)); |
| 308 EXPECT_CALL(visitor_, OnControlFrameHeaderData(stream_id, _, _)) | 331 headers_handler_.reset(new TestHeadersHandler); |
| 309 .WillRepeatedly(WithArgs<1, 2>( | 332 EXPECT_CALL(visitor_, OnHeaderFrameStart(stream_id)) |
| 310 Invoke(this, &QuicHeadersStreamTest::SaveHeaderData))); | 333 .WillOnce(Return(headers_handler_.get())); |
| 334 EXPECT_CALL(visitor_, OnHeaderFrameEnd(stream_id, true)).Times(1); |
| 311 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); | 335 framer_->ProcessInput(saved_data_.data(), saved_data_.length()); |
| 312 EXPECT_FALSE(framer_->HasError()) | 336 EXPECT_FALSE(framer_->HasError()) |
| 313 << SpdyFramer::ErrorCodeToString(framer_->error_code()); | 337 << SpdyFramer::ErrorCodeToString(framer_->error_code()); |
| 314 CheckHeaders(); | 338 CheckHeaders(); |
| 315 saved_data_.clear(); | 339 saved_data_.clear(); |
| 316 } else { | 340 } else { |
| 317 EXPECT_DFATAL(headers_stream_->WritePushPromise( | 341 EXPECT_DFATAL(headers_stream_->WritePushPromise( |
| 318 stream_id, promised_stream_id, headers_, nullptr), | 342 stream_id, promised_stream_id, headers_, nullptr), |
| 319 "Client shouldn't send PUSH_PROMISE"); | 343 "Client shouldn't send PUSH_PROMISE"); |
| 320 } | 344 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 334 headers_frame.set_fin(fin); | 358 headers_frame.set_fin(fin); |
| 335 headers_frame.set_has_priority(true); | 359 headers_frame.set_has_priority(true); |
| 336 frame = framer_->SerializeFrame(headers_frame); | 360 frame = framer_->SerializeFrame(headers_frame); |
| 337 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 361 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
| 338 } else { | 362 } else { |
| 339 SpdyHeadersIR headers_frame(stream_id); | 363 SpdyHeadersIR headers_frame(stream_id); |
| 340 headers_frame.set_header_block(headers_); | 364 headers_frame.set_header_block(headers_); |
| 341 headers_frame.set_fin(fin); | 365 headers_frame.set_fin(fin); |
| 342 frame = framer_->SerializeFrame(headers_frame); | 366 frame = framer_->SerializeFrame(headers_frame); |
| 343 } | 367 } |
| 344 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | |
| 345 .WillRepeatedly(WithArgs<1>(Invoke( | |
| 346 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
| 347 EXPECT_CALL(session_, | 368 EXPECT_CALL(session_, |
| 348 OnStreamHeadersComplete(stream_id, fin, frame.size())); | 369 OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 370 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); |
| 349 stream_frame_.data_buffer = frame.data(); | 371 stream_frame_.data_buffer = frame.data(); |
| 350 stream_frame_.data_length = frame.size(); | 372 stream_frame_.data_length = frame.size(); |
| 351 headers_stream_->OnStreamFrame(stream_frame_); | 373 headers_stream_->OnStreamFrame(stream_frame_); |
| 352 stream_frame_.offset += frame.size(); | 374 stream_frame_.offset += frame.size(); |
| 353 CheckHeaders(); | 375 CheckHeaders(); |
| 354 } | 376 } |
| 355 } | 377 } |
| 356 } | 378 } |
| 357 } | 379 } |
| 358 | 380 |
| 359 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { | 381 TEST_P(QuicHeadersStreamTest, ProcessPushPromise) { |
| 360 if (perspective() == Perspective::IS_SERVER) | 382 if (perspective() == Perspective::IS_SERVER) |
| 361 return; | 383 return; |
| 362 for (QuicStreamId stream_id = kClientDataStreamId1; | 384 for (QuicStreamId stream_id = kClientDataStreamId1; |
| 363 stream_id < kClientDataStreamId3; stream_id += 2) { | 385 stream_id < kClientDataStreamId3; stream_id += 2) { |
| 364 QuicStreamId promised_stream_id = NextPromisedStreamId(); | 386 QuicStreamId promised_stream_id = NextPromisedStreamId(); |
| 365 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); | 387 SpdyPushPromiseIR push_promise(stream_id, promised_stream_id); |
| 366 push_promise.set_header_block(headers_); | 388 push_promise.set_header_block(headers_); |
| 367 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); | 389 SpdySerializedFrame frame(framer_->SerializeFrame(push_promise)); |
| 368 if (perspective() == Perspective::IS_SERVER) { | 390 if (perspective() == Perspective::IS_SERVER) { |
| 369 EXPECT_CALL(*connection_, | 391 EXPECT_CALL(*connection_, |
| 370 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, | 392 CloseConnection(QUIC_INVALID_HEADERS_STREAM_DATA, |
| 371 "PUSH_PROMISE not supported.", _)) | 393 "PUSH_PROMISE not supported.", _)) |
| 372 .WillRepeatedly(InvokeWithoutArgs( | 394 .WillRepeatedly(InvokeWithoutArgs( |
| 373 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); | 395 this, &QuicHeadersStreamTest::TearDownLocalConnectionState)); |
| 374 } else { | 396 } else { |
| 375 EXPECT_CALL(session_, OnPromiseHeaders(stream_id, _)) | 397 EXPECT_CALL(session_, OnPromiseHeaderList(stream_id, promised_stream_id, |
| 376 .WillRepeatedly(WithArgs<1>( | 398 frame.size(), _)) |
| 377 Invoke(this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | 399 .WillOnce( |
| 378 EXPECT_CALL(session_, OnPromiseHeadersComplete( | 400 Invoke(this, &QuicHeadersStreamTest::SavePromiseHeaderList)); |
| 379 stream_id, promised_stream_id, frame.size())); | |
| 380 } | 401 } |
| 381 stream_frame_.data_buffer = frame.data(); | 402 stream_frame_.data_buffer = frame.data(); |
| 382 stream_frame_.data_length = frame.size(); | 403 stream_frame_.data_length = frame.size(); |
| 383 headers_stream_->OnStreamFrame(stream_frame_); | 404 headers_stream_->OnStreamFrame(stream_frame_); |
| 384 if (perspective() == Perspective::IS_CLIENT) { | 405 if (perspective() == Perspective::IS_CLIENT) { |
| 385 stream_frame_.offset += frame.size(); | 406 stream_frame_.offset += frame.size(); |
| 386 CheckHeaders(); | 407 CheckHeaders(); |
| 387 } | 408 } |
| 388 } | 409 } |
| 389 } | 410 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 405 headers_frame.set_fin(fin); | 426 headers_frame.set_fin(fin); |
| 406 headers_frame.set_has_priority(true); | 427 headers_frame.set_has_priority(true); |
| 407 frame = framer_->SerializeFrame(headers_frame); | 428 frame = framer_->SerializeFrame(headers_frame); |
| 408 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 429 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
| 409 } else { | 430 } else { |
| 410 SpdyHeadersIR headers_frame(stream_id); | 431 SpdyHeadersIR headers_frame(stream_id); |
| 411 headers_frame.set_header_block(headers_); | 432 headers_frame.set_header_block(headers_); |
| 412 headers_frame.set_fin(fin); | 433 headers_frame.set_fin(fin); |
| 413 frame = framer_->SerializeFrame(headers_frame); | 434 frame = framer_->SerializeFrame(headers_frame); |
| 414 } | 435 } |
| 415 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)); | 436 EXPECT_CALL(session_, OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 416 EXPECT_CALL(session_, | 437 .Times(1); |
| 417 OnStreamHeadersComplete(stream_id, fin, frame.size())); | |
| 418 stream_frame_.data_buffer = frame.data(); | 438 stream_frame_.data_buffer = frame.data(); |
| 419 stream_frame_.data_length = frame.size(); | 439 stream_frame_.data_length = frame.size(); |
| 420 headers_stream_->OnStreamFrame(stream_frame_); | 440 headers_stream_->OnStreamFrame(stream_frame_); |
| 421 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 441 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
| 422 stream_frame_.offset += frame.size(); | 442 stream_frame_.offset += frame.size(); |
| 423 } | 443 } |
| 424 } | 444 } |
| 425 | 445 |
| 426 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { | 446 TEST_P(QuicHeadersStreamTest, NonEmptyHeaderHOLBlockedTime) { |
| 427 if (!FLAGS_quic_measure_headers_hol_blocking_time) { | 447 if (!FLAGS_quic_measure_headers_hol_blocking_time) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 449 headers_frame.set_fin(fin); | 469 headers_frame.set_fin(fin); |
| 450 frames[stream_num] = framer_->SerializeFrame(headers_frame); | 470 frames[stream_num] = framer_->SerializeFrame(headers_frame); |
| 451 } | 471 } |
| 452 stream_frames[stream_num].stream_id = stream_frame_.stream_id; | 472 stream_frames[stream_num].stream_id = stream_frame_.stream_id; |
| 453 stream_frames[stream_num].offset = stream_frame_.offset; | 473 stream_frames[stream_num].offset = stream_frame_.offset; |
| 454 stream_frames[stream_num].data_buffer = frames[stream_num].data(); | 474 stream_frames[stream_num].data_buffer = frames[stream_num].data(); |
| 455 stream_frames[stream_num].data_length = frames[stream_num].size(); | 475 stream_frames[stream_num].data_length = frames[stream_num].size(); |
| 456 DVLOG(1) << "make frame for stream " << stream_num << " offset " | 476 DVLOG(1) << "make frame for stream " << stream_num << " offset " |
| 457 << stream_frames[stream_num].offset; | 477 << stream_frames[stream_num].offset; |
| 458 stream_frame_.offset += frames[stream_num].size(); | 478 stream_frame_.offset += frames[stream_num].size(); |
| 459 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)).Times(1); | 479 EXPECT_CALL(session_, OnStreamHeaderList(stream_id, fin, _, _)).Times(1); |
| 460 EXPECT_CALL(session_, OnStreamHeadersComplete(stream_id, fin, _)) | |
| 461 .Times(1); | |
| 462 } | 480 } |
| 463 } | 481 } |
| 464 | 482 |
| 465 // Actually writing the frames in reverse order will cause HOL blocking. | 483 // Actually writing the frames in reverse order will cause HOL blocking. |
| 466 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(9); | 484 EXPECT_CALL(session_, OnHeadersHeadOfLineBlocking(_)).Times(9); |
| 467 | 485 |
| 468 for (int stream_num = 9; stream_num >= 0; --stream_num) { | 486 for (int stream_num = 9; stream_num >= 0; --stream_num) { |
| 469 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset " | 487 DVLOG(1) << "OnStreamFrame for stream " << stream_num << " offset " |
| 470 << stream_frames[stream_num].offset; | 488 << stream_frames[stream_num].offset; |
| 471 headers_stream_->OnStreamFrame(stream_frames[stream_num]); | 489 headers_stream_->OnStreamFrame(stream_frames[stream_num]); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 492 headers_frame.set_fin(fin); | 510 headers_frame.set_fin(fin); |
| 493 headers_frame.set_has_priority(true); | 511 headers_frame.set_has_priority(true); |
| 494 frame = framer_->SerializeFrame(headers_frame); | 512 frame = framer_->SerializeFrame(headers_frame); |
| 495 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 513 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
| 496 } else { | 514 } else { |
| 497 SpdyHeadersIR headers_frame(stream_id); | 515 SpdyHeadersIR headers_frame(stream_id); |
| 498 headers_frame.set_header_block(headers_); | 516 headers_frame.set_header_block(headers_); |
| 499 headers_frame.set_fin(fin); | 517 headers_frame.set_fin(fin); |
| 500 frame = framer_->SerializeFrame(headers_frame); | 518 frame = framer_->SerializeFrame(headers_frame); |
| 501 } | 519 } |
| 502 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | |
| 503 .WillRepeatedly(WithArgs<1>(Invoke( | |
| 504 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
| 505 EXPECT_CALL(session_, | 520 EXPECT_CALL(session_, |
| 506 OnStreamHeadersComplete(stream_id, fin, frame.size())); | 521 OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 522 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); |
| 507 stream_frame_.data_buffer = frame.data(); | 523 stream_frame_.data_buffer = frame.data(); |
| 508 stream_frame_.data_length = frame.size(); | 524 stream_frame_.data_length = frame.size(); |
| 509 headers_stream_->OnStreamFrame(stream_frame_); | 525 headers_stream_->OnStreamFrame(stream_frame_); |
| 510 stream_frame_.offset += frame.size(); | 526 stream_frame_.offset += frame.size(); |
| 511 CheckHeaders(); | 527 CheckHeaders(); |
| 512 } | 528 } |
| 513 } | 529 } |
| 514 } | 530 } |
| 515 } | 531 } |
| 516 | 532 |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 headers_frame.set_fin(fin); | 652 headers_frame.set_fin(fin); |
| 637 headers_frame.set_has_priority(true); | 653 headers_frame.set_has_priority(true); |
| 638 frame = framer_->SerializeFrame(headers_frame); | 654 frame = framer_->SerializeFrame(headers_frame); |
| 639 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); | 655 EXPECT_CALL(session_, OnStreamHeadersPriority(stream_id, 0)); |
| 640 } else { | 656 } else { |
| 641 SpdyHeadersIR headers_frame(stream_id); | 657 SpdyHeadersIR headers_frame(stream_id); |
| 642 headers_frame.set_header_block(headers_); | 658 headers_frame.set_header_block(headers_); |
| 643 headers_frame.set_fin(fin); | 659 headers_frame.set_fin(fin); |
| 644 frame = framer_->SerializeFrame(headers_frame); | 660 frame = framer_->SerializeFrame(headers_frame); |
| 645 } | 661 } |
| 646 EXPECT_CALL(session_, OnStreamHeaders(stream_id, _)) | |
| 647 .WillRepeatedly(WithArgs<1>(Invoke( | |
| 648 this, &QuicHeadersStreamTest::SaveHeaderDataStringPiece))); | |
| 649 EXPECT_CALL(session_, | 662 EXPECT_CALL(session_, |
| 650 OnStreamHeadersComplete(stream_id, fin, frame.size())); | 663 OnStreamHeaderList(stream_id, fin, frame.size(), _)) |
| 664 .WillOnce(Invoke(this, &QuicHeadersStreamTest::SaveHeaderList)); |
| 651 stream_frame_.data_buffer = frame.data(); | 665 stream_frame_.data_buffer = frame.data(); |
| 652 stream_frame_.data_length = frame.size(); | 666 stream_frame_.data_length = frame.size(); |
| 653 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 667 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
| 654 headers_stream_->OnStreamFrame(stream_frame_); | 668 headers_stream_->OnStreamFrame(stream_frame_); |
| 655 stream_frame_.offset += frame.size(); | 669 stream_frame_.offset += frame.size(); |
| 656 CheckHeaders(); | 670 CheckHeaders(); |
| 657 } | 671 } |
| 658 } | 672 } |
| 659 } | 673 } |
| 660 } | 674 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 691 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); | 705 connection_->AdvanceTime(QuicTime::Delta::FromMilliseconds(1)); |
| 692 } | 706 } |
| 693 } | 707 } |
| 694 } | 708 } |
| 695 } | 709 } |
| 696 } | 710 } |
| 697 | 711 |
| 698 } // namespace | 712 } // namespace |
| 699 } // namespace test | 713 } // namespace test |
| 700 } // namespace net | 714 } // namespace net |
| OLD | NEW |