| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/chromium/bidirectional_stream_quic_impl.h" | 5 #include "net/quic/chromium/bidirectional_stream_quic_impl.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/callback_helpers.h" | 9 #include "base/callback_helpers.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| 11 #include "base/run_loop.h" | 11 #include "base/run_loop.h" |
| 12 #include "base/strings/string_number_conversions.h" | 12 #include "base/strings/string_number_conversions.h" |
| 13 #include "base/time/time.h" |
| 13 #include "net/base/ip_address.h" | 14 #include "net/base/ip_address.h" |
| 15 #include "net/base/load_timing_info.h" |
| 16 #include "net/base/load_timing_info_test_util.h" |
| 14 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" |
| 15 #include "net/http/bidirectional_stream_request_info.h" | 18 #include "net/http/bidirectional_stream_request_info.h" |
| 16 #include "net/http/transport_security_state.h" | 19 #include "net/http/transport_security_state.h" |
| 17 #include "net/log/net_log_event_type.h" | 20 #include "net/log/net_log_event_type.h" |
| 18 #include "net/log/test_net_log.h" | 21 #include "net/log/test_net_log.h" |
| 19 #include "net/log/test_net_log_util.h" | 22 #include "net/log/test_net_log_util.h" |
| 20 #include "net/quic/chromium/quic_chromium_alarm_factory.h" | 23 #include "net/quic/chromium/quic_chromium_alarm_factory.h" |
| 21 #include "net/quic/chromium/quic_chromium_connection_helper.h" | 24 #include "net/quic/chromium/quic_chromium_connection_helper.h" |
| 22 #include "net/quic/chromium/quic_chromium_packet_reader.h" | 25 #include "net/quic/chromium/quic_chromium_packet_reader.h" |
| 23 #include "net/quic/chromium/quic_chromium_packet_writer.h" | 26 #include "net/quic/chromium/quic_chromium_packet_writer.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 TestDelegateBase(IOBuffer* read_buf, | 69 TestDelegateBase(IOBuffer* read_buf, |
| 67 int read_buf_len, | 70 int read_buf_len, |
| 68 std::unique_ptr<base::Timer> timer) | 71 std::unique_ptr<base::Timer> timer) |
| 69 : read_buf_(read_buf), | 72 : read_buf_(read_buf), |
| 70 read_buf_len_(read_buf_len), | 73 read_buf_len_(read_buf_len), |
| 71 timer_(std::move(timer)), | 74 timer_(std::move(timer)), |
| 72 loop_(nullptr), | 75 loop_(nullptr), |
| 73 next_proto_(kProtoUnknown), | 76 next_proto_(kProtoUnknown), |
| 74 received_bytes_(0), | 77 received_bytes_(0), |
| 75 sent_bytes_(0), | 78 sent_bytes_(0), |
| 79 has_load_timing_info_(false), |
| 76 error_(OK), | 80 error_(OK), |
| 77 on_data_read_count_(0), | 81 on_data_read_count_(0), |
| 78 on_data_sent_count_(0), | 82 on_data_sent_count_(0), |
| 79 not_expect_callback_(false), | 83 not_expect_callback_(false), |
| 80 on_failed_called_(false), | 84 on_failed_called_(false), |
| 81 send_request_headers_automatically_(true), | 85 send_request_headers_automatically_(true), |
| 82 is_ready_(false) { | 86 is_ready_(false) { |
| 83 loop_.reset(new base::RunLoop); | 87 loop_.reset(new base::RunLoop); |
| 84 } | 88 } |
| 85 | 89 |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 195 return stream_->GetTotalReceivedBytes(); | 199 return stream_->GetTotalReceivedBytes(); |
| 196 return received_bytes_; | 200 return received_bytes_; |
| 197 } | 201 } |
| 198 | 202 |
| 199 int64_t GetTotalSentBytes() const { | 203 int64_t GetTotalSentBytes() const { |
| 200 if (stream_) | 204 if (stream_) |
| 201 return stream_->GetTotalSentBytes(); | 205 return stream_->GetTotalSentBytes(); |
| 202 return sent_bytes_; | 206 return sent_bytes_; |
| 203 } | 207 } |
| 204 | 208 |
| 209 bool GetLoadTimingInfo(LoadTimingInfo* load_timing_info) { |
| 210 if (stream_) |
| 211 return stream_->GetLoadTimingInfo(load_timing_info); |
| 212 *load_timing_info = load_timing_info_; |
| 213 return has_load_timing_info_; |
| 214 } |
| 215 |
| 205 void DoNotSendRequestHeadersAutomatically() { | 216 void DoNotSendRequestHeadersAutomatically() { |
| 206 send_request_headers_automatically_ = false; | 217 send_request_headers_automatically_ = false; |
| 207 } | 218 } |
| 208 | 219 |
| 209 // Deletes |stream_|. | 220 // Deletes |stream_|. |
| 210 void DeleteStream() { | 221 void DeleteStream() { |
| 211 next_proto_ = stream_->GetProtocol(); | 222 next_proto_ = stream_->GetProtocol(); |
| 212 received_bytes_ = stream_->GetTotalReceivedBytes(); | 223 received_bytes_ = stream_->GetTotalReceivedBytes(); |
| 213 sent_bytes_ = stream_->GetTotalSentBytes(); | 224 sent_bytes_ = stream_->GetTotalSentBytes(); |
| 225 has_load_timing_info_ = stream_->GetLoadTimingInfo(&load_timing_info_); |
| 214 stream_.reset(); | 226 stream_.reset(); |
| 215 } | 227 } |
| 216 | 228 |
| 217 // Const getters for internal states. | 229 // Const getters for internal states. |
| 218 const std::string& data_received() const { return data_received_; } | 230 const std::string& data_received() const { return data_received_; } |
| 219 int error() const { return error_; } | 231 int error() const { return error_; } |
| 220 const SpdyHeaderBlock& response_headers() const { return response_headers_; } | 232 const SpdyHeaderBlock& response_headers() const { return response_headers_; } |
| 221 const SpdyHeaderBlock& trailers() const { return trailers_; } | 233 const SpdyHeaderBlock& trailers() const { return trailers_; } |
| 222 int on_data_read_count() const { return on_data_read_count_; } | 234 int on_data_read_count() const { return on_data_read_count_; } |
| 223 int on_data_sent_count() const { return on_data_sent_count_; } | 235 int on_data_sent_count() const { return on_data_sent_count_; } |
| 224 bool on_failed_called() const { return on_failed_called_; } | 236 bool on_failed_called() const { return on_failed_called_; } |
| 225 bool is_ready() const { return is_ready_; } | 237 bool is_ready() const { return is_ready_; } |
| 226 | 238 |
| 227 protected: | 239 protected: |
| 228 // Quits |loop_|. | 240 // Quits |loop_|. |
| 229 void QuitLoop() { loop_->Quit(); } | 241 void QuitLoop() { loop_->Quit(); } |
| 230 | 242 |
| 231 private: | 243 private: |
| 232 std::unique_ptr<BidirectionalStreamQuicImpl> stream_; | 244 std::unique_ptr<BidirectionalStreamQuicImpl> stream_; |
| 233 scoped_refptr<IOBuffer> read_buf_; | 245 scoped_refptr<IOBuffer> read_buf_; |
| 234 int read_buf_len_; | 246 int read_buf_len_; |
| 235 std::unique_ptr<base::Timer> timer_; | 247 std::unique_ptr<base::Timer> timer_; |
| 236 std::string data_received_; | 248 std::string data_received_; |
| 237 std::unique_ptr<base::RunLoop> loop_; | 249 std::unique_ptr<base::RunLoop> loop_; |
| 238 SpdyHeaderBlock response_headers_; | 250 SpdyHeaderBlock response_headers_; |
| 239 SpdyHeaderBlock trailers_; | 251 SpdyHeaderBlock trailers_; |
| 240 NextProto next_proto_; | 252 NextProto next_proto_; |
| 241 int64_t received_bytes_; | 253 int64_t received_bytes_; |
| 242 int64_t sent_bytes_; | 254 int64_t sent_bytes_; |
| 255 bool has_load_timing_info_; |
| 256 LoadTimingInfo load_timing_info_; |
| 243 int error_; | 257 int error_; |
| 244 int on_data_read_count_; | 258 int on_data_read_count_; |
| 245 int on_data_sent_count_; | 259 int on_data_sent_count_; |
| 246 // This is to ensure that delegate callback is not invoked synchronously when | 260 // This is to ensure that delegate callback is not invoked synchronously when |
| 247 // calling into |stream_|. | 261 // calling into |stream_|. |
| 248 bool not_expect_callback_; | 262 bool not_expect_callback_; |
| 249 bool on_failed_called_; | 263 bool on_failed_called_; |
| 250 CompletionCallback callback_; | 264 CompletionCallback callback_; |
| 251 bool send_request_headers_automatically_; | 265 bool send_request_headers_automatically_; |
| 252 bool is_ready_; | 266 bool is_ready_; |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 391 socket_data_.get(), net_log().bound().net_log())); | 405 socket_data_.get(), net_log().bound().net_log())); |
| 392 socket->Connect(peer_addr_); | 406 socket->Connect(peer_addr_); |
| 393 runner_ = new TestTaskRunner(&clock_); | 407 runner_ = new TestTaskRunner(&clock_); |
| 394 helper_.reset( | 408 helper_.reset( |
| 395 new QuicChromiumConnectionHelper(&clock_, &random_generator_)); | 409 new QuicChromiumConnectionHelper(&clock_, &random_generator_)); |
| 396 alarm_factory_.reset(new QuicChromiumAlarmFactory(runner_.get(), &clock_)); | 410 alarm_factory_.reset(new QuicChromiumAlarmFactory(runner_.get(), &clock_)); |
| 397 connection_ = new QuicConnection( | 411 connection_ = new QuicConnection( |
| 398 connection_id_, peer_addr_, helper_.get(), alarm_factory_.get(), | 412 connection_id_, peer_addr_, helper_.get(), alarm_factory_.get(), |
| 399 new QuicChromiumPacketWriter(socket.get()), true /* owns_writer */, | 413 new QuicChromiumPacketWriter(socket.get()), true /* owns_writer */, |
| 400 Perspective::IS_CLIENT, SupportedVersions(GetParam())); | 414 Perspective::IS_CLIENT, SupportedVersions(GetParam())); |
| 415 base::TimeTicks dns_end = base::TimeTicks::Now(); |
| 416 base::TimeTicks dns_start = dns_end - base::TimeDelta::FromMilliseconds(1); |
| 401 | 417 |
| 402 session_.reset(new QuicChromiumClientSession( | 418 session_.reset(new QuicChromiumClientSession( |
| 403 connection_, std::move(socket), | 419 connection_, std::move(socket), |
| 404 /*stream_factory=*/nullptr, &crypto_client_stream_factory_, &clock_, | 420 /*stream_factory=*/nullptr, &crypto_client_stream_factory_, &clock_, |
| 405 &transport_security_state_, | 421 &transport_security_state_, |
| 406 base::WrapUnique(static_cast<QuicServerInfo*>(nullptr)), | 422 base::WrapUnique(static_cast<QuicServerInfo*>(nullptr)), |
| 407 QuicServerId(kDefaultServerHostName, kDefaultServerPort, | 423 QuicServerId(kDefaultServerHostName, kDefaultServerPort, |
| 408 PRIVACY_MODE_DISABLED), | 424 PRIVACY_MODE_DISABLED), |
| 409 kQuicYieldAfterPacketsRead, | 425 kQuicYieldAfterPacketsRead, |
| 410 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds), | 426 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds), |
| 411 /*cert_verify_flags=*/0, DefaultQuicConfig(), &crypto_config_, | 427 /*cert_verify_flags=*/0, DefaultQuicConfig(), &crypto_config_, |
| 412 "CONNECTION_UNKNOWN", base::TimeTicks::Now(), base::TimeTicks::Now(), | 428 "CONNECTION_UNKNOWN", dns_start, dns_end, &push_promise_index_, |
| 413 &push_promise_index_, base::ThreadTaskRunnerHandle::Get().get(), | 429 base::ThreadTaskRunnerHandle::Get().get(), |
| 414 /*socket_performance_watcher=*/nullptr, net_log().bound().net_log())); | 430 /*socket_performance_watcher=*/nullptr, net_log().bound().net_log())); |
| 415 session_->Initialize(); | 431 session_->Initialize(); |
| 416 session_->GetCryptoStream()->CryptoConnect(); | 432 TestCompletionCallback callback; |
| 433 session_->CryptoConnect(/*require_confirmation=*/false, |
| 434 callback.callback()); |
| 417 EXPECT_TRUE(session_->IsEncryptionEstablished()); | 435 EXPECT_TRUE(session_->IsEncryptionEstablished()); |
| 418 } | 436 } |
| 419 | 437 |
| 420 void ConfirmHandshake() { | 438 void ConfirmHandshake() { |
| 421 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( | 439 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( |
| 422 QuicSession::HANDSHAKE_CONFIRMED); | 440 QuicSession::HANDSHAKE_CONFIRMED); |
| 423 } | 441 } |
| 424 | 442 |
| 425 void SetRequest(const std::string& method, | 443 void SetRequest(const std::string& method, |
| 426 const std::string& path, | 444 const std::string& path, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 DVLOG(2) << "packet(" << packet_number << "): " << std::endl | 488 DVLOG(2) << "packet(" << packet_number << "): " << std::endl |
| 471 << QuicUtils::HexDump(packet->AsStringPiece()); | 489 << QuicUtils::HexDump(packet->AsStringPiece()); |
| 472 return packet; | 490 return packet; |
| 473 } | 491 } |
| 474 | 492 |
| 475 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( | 493 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( |
| 476 QuicPacketNumber packet_number, | 494 QuicPacketNumber packet_number, |
| 477 bool fin, | 495 bool fin, |
| 478 RequestPriority request_priority, | 496 RequestPriority request_priority, |
| 479 size_t* spdy_headers_frame_length) { | 497 size_t* spdy_headers_frame_length) { |
| 498 return ConstructRequestHeadersPacketInner( |
| 499 packet_number, stream_id_, fin, request_priority, |
| 500 spdy_headers_frame_length, /*offset=*/nullptr); |
| 501 } |
| 502 |
| 503 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacketInner( |
| 504 QuicPacketNumber packet_number, |
| 505 QuicStreamId stream_id, |
| 506 bool fin, |
| 507 RequestPriority request_priority, |
| 508 size_t* spdy_headers_frame_length, |
| 509 QuicStreamOffset* offset) { |
| 480 SpdyPriority priority = | 510 SpdyPriority priority = |
| 481 ConvertRequestPriorityToQuicPriority(request_priority); | 511 ConvertRequestPriorityToQuicPriority(request_priority); |
| 482 return client_maker_.MakeRequestHeadersPacket( | 512 std::unique_ptr<QuicReceivedPacket> packet( |
| 483 packet_number, stream_id_, kIncludeVersion, fin, priority, | 513 client_maker_.MakeRequestHeadersPacket( |
| 484 std::move(request_headers_), spdy_headers_frame_length); | 514 packet_number, stream_id, kIncludeVersion, fin, priority, |
| 515 std::move(request_headers_), spdy_headers_frame_length, offset)); |
| 516 DVLOG(2) << "packet(" << packet_number << "): " << std::endl |
| 517 << QuicUtils::HexDump(packet->AsStringPiece()); |
| 518 return packet; |
| 485 } | 519 } |
| 486 | 520 |
| 487 std::unique_ptr<QuicReceivedPacket> | 521 std::unique_ptr<QuicReceivedPacket> |
| 488 ConstructRequestHeadersAndMultipleDataFramesPacket( | 522 ConstructRequestHeadersAndMultipleDataFramesPacket( |
| 489 QuicPacketNumber packet_number, | 523 QuicPacketNumber packet_number, |
| 490 bool fin, | 524 bool fin, |
| 491 RequestPriority request_priority, | 525 RequestPriority request_priority, |
| 492 size_t* spdy_headers_frame_length, | 526 size_t* spdy_headers_frame_length, |
| 493 const std::vector<std::string>& data) { | 527 const std::vector<std::string>& data) { |
| 494 SpdyPriority priority = | 528 SpdyPriority priority = |
| 495 ConvertRequestPriorityToQuicPriority(request_priority); | 529 ConvertRequestPriorityToQuicPriority(request_priority); |
| 496 std::unique_ptr<QuicReceivedPacket> packet( | 530 std::unique_ptr<QuicReceivedPacket> packet( |
| 497 client_maker_.MakeRequestHeadersAndMultipleDataFramesPacket( | 531 client_maker_.MakeRequestHeadersAndMultipleDataFramesPacket( |
| 498 packet_number, stream_id_, kIncludeVersion, fin, priority, | 532 packet_number, stream_id_, kIncludeVersion, fin, priority, |
| 499 std::move(request_headers_), spdy_headers_frame_length, data)); | 533 std::move(request_headers_), spdy_headers_frame_length, data)); |
| 500 DVLOG(2) << "packet(" << packet_number << "): " << std::endl | 534 DVLOG(2) << "packet(" << packet_number << "): " << std::endl |
| 501 << QuicUtils::HexDump(packet->AsStringPiece()); | 535 << QuicUtils::HexDump(packet->AsStringPiece()); |
| 502 return packet; | 536 return packet; |
| 503 } | 537 } |
| 504 | 538 |
| 505 std::unique_ptr<QuicReceivedPacket> ConstructResponseHeadersPacket( | 539 std::unique_ptr<QuicReceivedPacket> ConstructResponseHeadersPacket( |
| 506 QuicPacketNumber packet_number, | 540 QuicPacketNumber packet_number, |
| 507 bool fin, | 541 bool fin, |
| 508 SpdyHeaderBlock response_headers, | 542 SpdyHeaderBlock response_headers, |
| 509 size_t* spdy_headers_frame_length, | 543 size_t* spdy_headers_frame_length, |
| 510 QuicStreamOffset* offset) { | 544 QuicStreamOffset* offset) { |
| 545 return ConstructResponseHeadersPacketInner( |
| 546 packet_number, stream_id_, fin, std::move(response_headers), |
| 547 spdy_headers_frame_length, offset); |
| 548 } |
| 549 |
| 550 std::unique_ptr<QuicReceivedPacket> ConstructResponseHeadersPacketInner( |
| 551 QuicPacketNumber packet_number, |
| 552 QuicStreamId stream_id, |
| 553 bool fin, |
| 554 SpdyHeaderBlock response_headers, |
| 555 size_t* spdy_headers_frame_length, |
| 556 QuicStreamOffset* offset) { |
| 511 return server_maker_.MakeResponseHeadersPacket( | 557 return server_maker_.MakeResponseHeadersPacket( |
| 512 packet_number, stream_id_, !kIncludeVersion, fin, | 558 packet_number, stream_id, !kIncludeVersion, fin, |
| 513 std::move(response_headers), spdy_headers_frame_length, offset); | 559 std::move(response_headers), spdy_headers_frame_length, offset); |
| 514 } | 560 } |
| 515 | 561 |
| 516 std::unique_ptr<QuicReceivedPacket> ConstructResponseTrailersPacket( | 562 std::unique_ptr<QuicReceivedPacket> ConstructResponseTrailersPacket( |
| 517 QuicPacketNumber packet_number, | 563 QuicPacketNumber packet_number, |
| 518 bool fin, | 564 bool fin, |
| 519 SpdyHeaderBlock trailers, | 565 SpdyHeaderBlock trailers, |
| 520 size_t* spdy_headers_frame_length, | 566 size_t* spdy_headers_frame_length, |
| 521 QuicStreamOffset* offset) { | 567 QuicStreamOffset* offset) { |
| 522 return server_maker_.MakeResponseHeadersPacket( | 568 return server_maker_.MakeResponseHeadersPacket( |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 | 631 |
| 586 std::unique_ptr<QuicReceivedPacket> ConstructServerAckPacket( | 632 std::unique_ptr<QuicReceivedPacket> ConstructServerAckPacket( |
| 587 QuicPacketNumber packet_number, | 633 QuicPacketNumber packet_number, |
| 588 QuicPacketNumber largest_received, | 634 QuicPacketNumber largest_received, |
| 589 QuicPacketNumber least_unacked) { | 635 QuicPacketNumber least_unacked) { |
| 590 return server_maker_.MakeAckPacket(packet_number, largest_received, | 636 return server_maker_.MakeAckPacket(packet_number, largest_received, |
| 591 least_unacked, | 637 least_unacked, |
| 592 !kIncludeCongestionFeedback); | 638 !kIncludeCongestionFeedback); |
| 593 } | 639 } |
| 594 | 640 |
| 641 void ExpectLoadTimingValid(const LoadTimingInfo& load_timing_info, |
| 642 bool session_reused) { |
| 643 EXPECT_EQ(session_reused, load_timing_info.socket_reused); |
| 644 |
| 645 if (session_reused) { |
| 646 ExpectConnectTimingHasNoTimes(load_timing_info.connect_timing); |
| 647 } else { |
| 648 ExpectConnectTimingHasTimes( |
| 649 load_timing_info.connect_timing, |
| 650 CONNECT_TIMING_HAS_SSL_TIMES | CONNECT_TIMING_HAS_DNS_TIMES); |
| 651 } |
| 652 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); |
| 653 } |
| 654 |
| 595 const BoundTestNetLog& net_log() const { return net_log_; } | 655 const BoundTestNetLog& net_log() const { return net_log_; } |
| 596 | 656 |
| 597 QuicChromiumClientSession* session() const { return session_.get(); } | 657 QuicChromiumClientSession* session() const { return session_.get(); } |
| 598 | 658 |
| 599 protected: | 659 protected: |
| 600 BoundTestNetLog net_log_; | 660 BoundTestNetLog net_log_; |
| 601 scoped_refptr<TestTaskRunner> runner_; | 661 scoped_refptr<TestTaskRunner> runner_; |
| 602 std::unique_ptr<MockWrite[]> mock_writes_; | 662 std::unique_ptr<MockWrite[]> mock_writes_; |
| 603 MockClock clock_; | 663 MockClock clock_; |
| 604 QuicConnection* connection_; | 664 QuicConnection* connection_; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 request.method = "GET"; | 701 request.method = "GET"; |
| 642 request.url = GURL("http://www.google.com/"); | 702 request.url = GURL("http://www.google.com/"); |
| 643 request.end_stream_on_headers = true; | 703 request.end_stream_on_headers = true; |
| 644 request.priority = DEFAULT_PRIORITY; | 704 request.priority = DEFAULT_PRIORITY; |
| 645 | 705 |
| 646 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 706 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 647 std::unique_ptr<TestDelegateBase> delegate( | 707 std::unique_ptr<TestDelegateBase> delegate( |
| 648 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 708 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
| 649 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 709 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
| 650 delegate->WaitUntilNextCallback(); // OnStreamReady | 710 delegate->WaitUntilNextCallback(); // OnStreamReady |
| 711 ConfirmHandshake(); |
| 651 | 712 |
| 652 // Server acks the request. | 713 // Server acks the request. |
| 653 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); | 714 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); |
| 654 | 715 |
| 655 // Server sends the response headers. | 716 // Server sends the response headers. |
| 656 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); | 717 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); |
| 657 | 718 |
| 658 size_t spdy_response_headers_frame_length; | 719 size_t spdy_response_headers_frame_length; |
| 659 QuicStreamOffset offset = 0; | 720 QuicStreamOffset offset = 0; |
| 660 ProcessPacket(ConstructResponseHeadersPacket( | 721 ProcessPacket(ConstructResponseHeadersPacket( |
| 661 2, !kFin, std::move(response_headers), | 722 2, !kFin, std::move(response_headers), |
| 662 &spdy_response_headers_frame_length, &offset)); | 723 &spdy_response_headers_frame_length, &offset)); |
| 663 | 724 |
| 664 delegate->WaitUntilNextCallback(); // OnHeadersReceived | 725 delegate->WaitUntilNextCallback(); // OnHeadersReceived |
| 726 LoadTimingInfo load_timing_info; |
| 727 EXPECT_TRUE(delegate->GetLoadTimingInfo(&load_timing_info)); |
| 728 ExpectLoadTimingValid(load_timing_info, /*session_reused=*/false); |
| 665 TestCompletionCallback cb; | 729 TestCompletionCallback cb; |
| 666 int rv = delegate->ReadData(cb.callback()); | 730 int rv = delegate->ReadData(cb.callback()); |
| 667 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); | 731 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); |
| 668 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); | 732 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); |
| 669 const char kResponseBody[] = "Hello world!"; | 733 const char kResponseBody[] = "Hello world!"; |
| 670 // Server sends data. | 734 // Server sends data. |
| 671 ProcessPacket( | 735 ProcessPacket( |
| 672 ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody)); | 736 ConstructServerDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody)); |
| 673 EXPECT_EQ(12, cb.WaitForResult()); | 737 EXPECT_EQ(12, cb.WaitForResult()); |
| 674 | 738 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 711 pos = ExpectLogContainsSomewhere( | 775 pos = ExpectLogContainsSomewhere( |
| 712 entries, /*min_offset=*/pos, | 776 entries, /*min_offset=*/pos, |
| 713 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_SEND_REQUEST_HEADERS, | 777 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_SEND_REQUEST_HEADERS, |
| 714 NetLogEventPhase::NONE); | 778 NetLogEventPhase::NONE); |
| 715 ExpectLogContainsSomewhere( | 779 ExpectLogContainsSomewhere( |
| 716 entries, /*min_offset=*/pos, | 780 entries, /*min_offset=*/pos, |
| 717 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_SEND_REQUEST_HEADERS, | 781 NetLogEventType::QUIC_CHROMIUM_CLIENT_STREAM_SEND_REQUEST_HEADERS, |
| 718 NetLogEventPhase::NONE); | 782 NetLogEventPhase::NONE); |
| 719 } | 783 } |
| 720 | 784 |
| 785 TEST_P(BidirectionalStreamQuicImplTest, LoadTimingTwoRequests) { |
| 786 SetRequest("GET", "/", DEFAULT_PRIORITY); |
| 787 QuicStreamOffset offset = 0; |
| 788 AddWrite(ConstructRequestHeadersPacketInner( |
| 789 1, kClientDataStreamId1, kFin, DEFAULT_PRIORITY, nullptr, &offset)); |
| 790 // SetRequest() again for second request as |request_headers_| was moved. |
| 791 SetRequest("GET", "/", DEFAULT_PRIORITY); |
| 792 AddWrite(ConstructRequestHeadersPacketInner( |
| 793 2, kClientDataStreamId2, kFin, DEFAULT_PRIORITY, nullptr, &offset)); |
| 794 AddWrite(ConstructClientAckPacket(3, 3, 1)); |
| 795 Initialize(); |
| 796 |
| 797 BidirectionalStreamRequestInfo request; |
| 798 request.method = "GET"; |
| 799 request.url = GURL("http://www.google.com/"); |
| 800 request.end_stream_on_headers = true; |
| 801 request.priority = DEFAULT_PRIORITY; |
| 802 |
| 803 // Start first request. |
| 804 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 805 std::unique_ptr<TestDelegateBase> delegate( |
| 806 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
| 807 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
| 808 |
| 809 // Start second request. |
| 810 scoped_refptr<IOBuffer> read_buffer2(new IOBuffer(kReadBufferSize)); |
| 811 std::unique_ptr<TestDelegateBase> delegate2( |
| 812 new TestDelegateBase(read_buffer2.get(), kReadBufferSize)); |
| 813 delegate2->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
| 814 |
| 815 delegate->WaitUntilNextCallback(); // OnStreamReady |
| 816 delegate2->WaitUntilNextCallback(); // OnStreamReady |
| 817 |
| 818 ConfirmHandshake(); |
| 819 // Server acks the request. |
| 820 ProcessPacket(ConstructServerAckPacket(1, 0, 0)); |
| 821 |
| 822 // Server sends the response headers. |
| 823 offset = 0; |
| 824 ProcessPacket(ConstructResponseHeadersPacketInner( |
| 825 2, kClientDataStreamId1, kFin, ConstructResponseHeaders("200"), nullptr, |
| 826 &offset)); |
| 827 |
| 828 ProcessPacket(ConstructResponseHeadersPacketInner( |
| 829 3, kClientDataStreamId2, kFin, ConstructResponseHeaders("200"), nullptr, |
| 830 &offset)); |
| 831 |
| 832 delegate->WaitUntilNextCallback(); // OnHeadersReceived |
| 833 delegate2->WaitUntilNextCallback(); // OnHeadersReceived |
| 834 |
| 835 LoadTimingInfo load_timing_info; |
| 836 EXPECT_TRUE(delegate->GetLoadTimingInfo(&load_timing_info)); |
| 837 LoadTimingInfo load_timing_info2; |
| 838 EXPECT_TRUE(delegate2->GetLoadTimingInfo(&load_timing_info2)); |
| 839 ExpectLoadTimingValid(load_timing_info, /*session_reused=*/false); |
| 840 ExpectLoadTimingValid(load_timing_info2, /*session_reused=*/true); |
| 841 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); |
| 842 EXPECT_EQ("200", delegate2->response_headers().find(":status")->second); |
| 843 // No response body. ReadData() should return OK synchronously. |
| 844 TestCompletionCallback dummy_callback; |
| 845 EXPECT_EQ(OK, delegate->ReadData(dummy_callback.callback())); |
| 846 EXPECT_EQ(OK, delegate2->ReadData(dummy_callback.callback())); |
| 847 } |
| 848 |
| 721 // Tests that when request headers are not delayed, only data buffers are | 849 // Tests that when request headers are not delayed, only data buffers are |
| 722 // coalesced. | 850 // coalesced. |
| 723 TEST_P(BidirectionalStreamQuicImplTest, CoalesceDataBuffersNotHeadersFrame) { | 851 TEST_P(BidirectionalStreamQuicImplTest, CoalesceDataBuffersNotHeadersFrame) { |
| 724 SetRequest("POST", "/", DEFAULT_PRIORITY); | 852 SetRequest("POST", "/", DEFAULT_PRIORITY); |
| 725 size_t spdy_request_headers_frame_length; | 853 size_t spdy_request_headers_frame_length; |
| 726 | 854 |
| 727 const char kBody1[] = "here are some data"; | 855 const char kBody1[] = "here are some data"; |
| 728 const char kBody2[] = "data keep coming"; | 856 const char kBody2[] = "data keep coming"; |
| 729 std::vector<std::string> two_writes = {kBody1, kBody2}; | 857 std::vector<std::string> two_writes = {kBody1, kBody2}; |
| 730 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY, | 858 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY, |
| (...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1629 | 1757 |
| 1630 base::RunLoop().RunUntilIdle(); | 1758 base::RunLoop().RunUntilIdle(); |
| 1631 | 1759 |
| 1632 EXPECT_EQ(1, delegate->on_data_read_count()); | 1760 EXPECT_EQ(1, delegate->on_data_read_count()); |
| 1633 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1761 EXPECT_EQ(0, delegate->on_data_sent_count()); |
| 1634 } | 1762 } |
| 1635 | 1763 |
| 1636 } // namespace test | 1764 } // namespace test |
| 1637 | 1765 |
| 1638 } // namespace net | 1766 } // namespace net |
| OLD | NEW |