Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc

Issue 2354653003: Implements BidirectionalStreamQuicImpl::GetLoadTimingInfo (Closed)
Patch Set: Rebased Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/chromium/bidirectional_stream_quic_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/quic/chromium/bidirectional_stream_quic_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698