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/bidirectional_stream_quic_impl.h" | 5 #include "net/quic/bidirectional_stream_quic_impl.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <vector> | 10 #include <vector> |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 TestDelegateBase(IOBuffer* read_buf, | 67 TestDelegateBase(IOBuffer* read_buf, |
68 int read_buf_len, | 68 int read_buf_len, |
69 std::unique_ptr<base::Timer> timer) | 69 std::unique_ptr<base::Timer> timer) |
70 : read_buf_(read_buf), | 70 : read_buf_(read_buf), |
71 read_buf_len_(read_buf_len), | 71 read_buf_len_(read_buf_len), |
72 timer_(std::move(timer)), | 72 timer_(std::move(timer)), |
73 loop_(nullptr), | 73 loop_(nullptr), |
74 error_(OK), | 74 error_(OK), |
75 on_data_read_count_(0), | 75 on_data_read_count_(0), |
76 on_data_sent_count_(0), | 76 on_data_sent_count_(0), |
77 not_expect_callback_(false) { | 77 not_expect_callback_(false), |
| 78 disable_auto_flush_(false) { |
78 loop_.reset(new base::RunLoop); | 79 loop_.reset(new base::RunLoop); |
79 } | 80 } |
80 | 81 |
81 ~TestDelegateBase() override {} | 82 ~TestDelegateBase() override {} |
82 | 83 |
83 void OnHeadersSent() override { | 84 void OnStreamReady() override { |
84 CHECK(!not_expect_callback_); | 85 CHECK(!not_expect_callback_); |
85 loop_->Quit(); | 86 loop_->Quit(); |
86 } | 87 } |
87 | 88 |
88 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { | 89 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { |
89 CHECK(!not_expect_callback_); | 90 CHECK(!not_expect_callback_); |
90 | 91 |
91 response_headers_ = response_headers; | 92 response_headers_ = response_headers; |
92 loop_->Quit(); | 93 loop_->Quit(); |
93 } | 94 } |
(...skipping 28 matching lines...) Expand all Loading... |
122 CHECK_NE(OK, error); | 123 CHECK_NE(OK, error); |
123 | 124 |
124 error_ = error; | 125 error_ = error; |
125 loop_->Quit(); | 126 loop_->Quit(); |
126 } | 127 } |
127 | 128 |
128 void Start(const BidirectionalStreamRequestInfo* request_info, | 129 void Start(const BidirectionalStreamRequestInfo* request_info, |
129 const BoundNetLog& net_log, | 130 const BoundNetLog& net_log, |
130 const base::WeakPtr<QuicChromiumClientSession> session) { | 131 const base::WeakPtr<QuicChromiumClientSession> session) { |
131 stream_job_.reset(new BidirectionalStreamQuicImpl(session)); | 132 stream_job_.reset(new BidirectionalStreamQuicImpl(session)); |
132 stream_job_->Start(request_info, net_log, this, nullptr); | 133 stream_job_->Start(request_info, net_log, disable_auto_flush_, this, |
| 134 nullptr); |
133 } | 135 } |
134 | 136 |
135 void SendData(IOBuffer* data, int length, bool end_of_stream) { | 137 void SendData(IOBuffer* data, int length, bool end_of_stream) { |
136 not_expect_callback_ = true; | 138 not_expect_callback_ = true; |
137 stream_job_->SendData(data, length, end_of_stream); | 139 stream_job_->SendData(data, length, end_of_stream); |
138 not_expect_callback_ = false; | 140 not_expect_callback_ = false; |
139 } | 141 } |
140 | 142 |
| 143 void SendvData(const std::vector<IOBuffer*>& data, |
| 144 const std::vector<int>& lengths, |
| 145 bool end_of_stream) { |
| 146 not_expect_callback_ = true; |
| 147 stream_job_->SendvData(data, lengths, end_of_stream); |
| 148 not_expect_callback_ = false; |
| 149 } |
| 150 |
141 // Waits until next Delegate callback. | 151 // Waits until next Delegate callback. |
142 void WaitUntilNextCallback() { | 152 void WaitUntilNextCallback() { |
143 loop_->Run(); | 153 loop_->Run(); |
144 loop_.reset(new base::RunLoop); | 154 loop_.reset(new base::RunLoop); |
145 } | 155 } |
146 | 156 |
147 // Calls ReadData on the |stream_| and updates |data_received_|. | 157 // Calls ReadData on the |stream_| and updates |data_received_|. |
148 int ReadData(const CompletionCallback& callback) { | 158 int ReadData(const CompletionCallback& callback) { |
149 not_expect_callback_ = true; | 159 not_expect_callback_ = true; |
150 int rv = stream_job_->ReadData(read_buf_.get(), read_buf_len_); | 160 int rv = stream_job_->ReadData(read_buf_.get(), read_buf_len_); |
151 not_expect_callback_ = false; | 161 not_expect_callback_ = false; |
152 if (rv > 0) | 162 if (rv > 0) |
153 data_received_.append(read_buf_->data(), rv); | 163 data_received_.append(read_buf_->data(), rv); |
154 if (rv == ERR_IO_PENDING) | 164 if (rv == ERR_IO_PENDING) |
155 callback_ = callback; | 165 callback_ = callback; |
156 return rv; | 166 return rv; |
157 } | 167 } |
158 | 168 |
159 // Cancels |stream_|. | 169 // Cancels |stream_|. |
160 void CancelStream() { stream_job_->Cancel(); } | 170 void CancelStream() { stream_job_->Cancel(); } |
161 | 171 |
162 NextProto GetProtocol() const { return stream_job_->GetProtocol(); } | 172 NextProto GetProtocol() const { return stream_job_->GetProtocol(); } |
163 | 173 |
164 int64_t GetTotalReceivedBytes() const { | 174 int64_t GetTotalReceivedBytes() const { |
165 return stream_job_->GetTotalReceivedBytes(); | 175 return stream_job_->GetTotalReceivedBytes(); |
166 } | 176 } |
167 | 177 |
168 int64_t GetTotalSentBytes() const { return stream_job_->GetTotalSentBytes(); } | 178 int64_t GetTotalSentBytes() const { return stream_job_->GetTotalSentBytes(); } |
169 | 179 |
| 180 void DisableAutoFlush() { disable_auto_flush_ = true; } |
| 181 |
170 // Const getters for internal states. | 182 // Const getters for internal states. |
171 const std::string& data_received() const { return data_received_; } | 183 const std::string& data_received() const { return data_received_; } |
172 int error() const { return error_; } | 184 int error() const { return error_; } |
173 const SpdyHeaderBlock& response_headers() const { return response_headers_; } | 185 const SpdyHeaderBlock& response_headers() const { return response_headers_; } |
174 const SpdyHeaderBlock& trailers() const { return trailers_; } | 186 const SpdyHeaderBlock& trailers() const { return trailers_; } |
175 int on_data_read_count() const { return on_data_read_count_; } | 187 int on_data_read_count() const { return on_data_read_count_; } |
176 int on_data_sent_count() const { return on_data_sent_count_; } | 188 int on_data_sent_count() const { return on_data_sent_count_; } |
177 | 189 |
178 protected: | 190 protected: |
179 // Quits |loop_|. | 191 // Quits |loop_|. |
(...skipping 11 matching lines...) Expand all Loading... |
191 std::unique_ptr<base::RunLoop> loop_; | 203 std::unique_ptr<base::RunLoop> loop_; |
192 SpdyHeaderBlock response_headers_; | 204 SpdyHeaderBlock response_headers_; |
193 SpdyHeaderBlock trailers_; | 205 SpdyHeaderBlock trailers_; |
194 int error_; | 206 int error_; |
195 int on_data_read_count_; | 207 int on_data_read_count_; |
196 int on_data_sent_count_; | 208 int on_data_sent_count_; |
197 // This is to ensure that delegate callback is not invoked synchronously when | 209 // This is to ensure that delegate callback is not invoked synchronously when |
198 // calling into |stream_|. | 210 // calling into |stream_|. |
199 bool not_expect_callback_; | 211 bool not_expect_callback_; |
200 CompletionCallback callback_; | 212 CompletionCallback callback_; |
| 213 bool disable_auto_flush_; |
201 | 214 |
202 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase); | 215 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase); |
203 }; | 216 }; |
204 | 217 |
205 // A delegate that deletes the stream in a particular callback. | 218 // A delegate that deletes the stream in a particular callback. |
206 class DeleteStreamDelegate : public TestDelegateBase { | 219 class DeleteStreamDelegate : public TestDelegateBase { |
207 public: | 220 public: |
208 // Specifies in which callback the stream can be deleted. | 221 // Specifies in which callback the stream can be deleted. |
209 enum Phase { | 222 enum Phase { |
210 ON_HEADERS_RECEIVED, | 223 ON_HEADERS_RECEIVED, |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 bool should_include_version, | 383 bool should_include_version, |
371 bool fin, | 384 bool fin, |
372 QuicStreamOffset offset, | 385 QuicStreamOffset offset, |
373 base::StringPiece data) { | 386 base::StringPiece data) { |
374 std::unique_ptr<QuicReceivedPacket> packet(maker_.MakeDataPacket( | 387 std::unique_ptr<QuicReceivedPacket> packet(maker_.MakeDataPacket( |
375 packet_number, stream_id_, should_include_version, fin, offset, data)); | 388 packet_number, stream_id_, should_include_version, fin, offset, data)); |
376 DVLOG(2) << "packet(" << packet_number << "): " << std::endl | 389 DVLOG(2) << "packet(" << packet_number << "): " << std::endl |
377 << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece()); | 390 << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece()); |
378 return packet; | 391 return packet; |
379 } | 392 } |
| 393 // Construct a data packet with multiple data frames |
| 394 std::unique_ptr<QuicReceivedPacket> ConstructMultipleDataFramesPacket( |
| 395 QuicPacketNumber packet_number, |
| 396 bool should_include_version, |
| 397 bool fin, |
| 398 QuicStreamOffset offset, |
| 399 const std::vector<std::string>& data_writes) { |
| 400 std::unique_ptr<QuicReceivedPacket> packet( |
| 401 maker_.MakeMultipleDataFramesPacket(packet_number, stream_id_, |
| 402 should_include_version, fin, offset, |
| 403 data_writes)); |
| 404 DVLOG(2) << "packet(" << packet_number << "): " << std::endl |
| 405 << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece()); |
| 406 return packet; |
| 407 } |
380 | 408 |
381 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( | 409 std::unique_ptr<QuicReceivedPacket> ConstructRequestHeadersPacket( |
382 QuicPacketNumber packet_number, | 410 QuicPacketNumber packet_number, |
383 bool fin, | 411 bool fin, |
384 RequestPriority request_priority, | 412 RequestPriority request_priority, |
385 size_t* spdy_headers_frame_length) { | 413 size_t* spdy_headers_frame_length) { |
386 SpdyPriority priority = | 414 SpdyPriority priority = |
387 ConvertRequestPriorityToQuicPriority(request_priority); | 415 ConvertRequestPriorityToQuicPriority(request_priority); |
388 return maker_.MakeRequestHeadersPacket( | 416 return maker_.MakeRequestHeadersPacket( |
389 packet_number, stream_id_, kIncludeVersion, fin, priority, | 417 packet_number, stream_id_, kIncludeVersion, fin, priority, |
390 request_headers_, spdy_headers_frame_length); | 418 request_headers_, spdy_headers_frame_length); |
391 } | 419 } |
392 | 420 |
| 421 std::unique_ptr<QuicReceivedPacket> |
| 422 ConstructRequestHeadersAndMultipleDataFramesPacket( |
| 423 QuicPacketNumber packet_number, |
| 424 bool fin, |
| 425 RequestPriority request_priority, |
| 426 size_t* spdy_headers_frame_length, |
| 427 const std::vector<std::string>& data) { |
| 428 SpdyPriority priority = |
| 429 ConvertRequestPriorityToQuicPriority(request_priority); |
| 430 std::unique_ptr<QuicReceivedPacket> packet( |
| 431 maker_.MakeRequestHeadersAndMultipleDataFramesPacket( |
| 432 packet_number, stream_id_, kIncludeVersion, fin, priority, |
| 433 request_headers_, spdy_headers_frame_length, data)); |
| 434 DVLOG(2) << "packet(" << packet_number << "): " << std::endl |
| 435 << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece()); |
| 436 return packet; |
| 437 } |
| 438 |
393 std::unique_ptr<QuicReceivedPacket> ConstructResponseHeadersPacket( | 439 std::unique_ptr<QuicReceivedPacket> ConstructResponseHeadersPacket( |
394 QuicPacketNumber packet_number, | 440 QuicPacketNumber packet_number, |
395 bool fin, | 441 bool fin, |
396 const SpdyHeaderBlock& response_headers, | 442 const SpdyHeaderBlock& response_headers, |
397 size_t* spdy_headers_frame_length, | 443 size_t* spdy_headers_frame_length, |
398 QuicStreamOffset* offset) { | 444 QuicStreamOffset* offset) { |
399 return maker_.MakeResponseHeadersPacket( | 445 return maker_.MakeResponseHeadersPacket( |
400 packet_number, stream_id_, !kIncludeVersion, fin, response_headers, | 446 packet_number, stream_id_, !kIncludeVersion, fin, response_headers, |
401 spdy_headers_frame_length, offset); | 447 spdy_headers_frame_length, offset); |
402 } | 448 } |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
510 BidirectionalStreamRequestInfo request; | 556 BidirectionalStreamRequestInfo request; |
511 request.method = "GET"; | 557 request.method = "GET"; |
512 request.url = GURL("http://www.google.com/"); | 558 request.url = GURL("http://www.google.com/"); |
513 request.end_stream_on_headers = true; | 559 request.end_stream_on_headers = true; |
514 request.priority = DEFAULT_PRIORITY; | 560 request.priority = DEFAULT_PRIORITY; |
515 | 561 |
516 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 562 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
517 std::unique_ptr<TestDelegateBase> delegate( | 563 std::unique_ptr<TestDelegateBase> delegate( |
518 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 564 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
519 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 565 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
520 delegate->WaitUntilNextCallback(); // OnHeadersSent | 566 delegate->WaitUntilNextCallback(); // OnStreamReady |
521 | 567 |
522 // Server acks the request. | 568 // Server acks the request. |
523 ProcessPacket(ConstructAckPacket(1, 0, 0)); | 569 ProcessPacket(ConstructAckPacket(1, 0, 0)); |
524 | 570 |
525 // Server sends the response headers. | 571 // Server sends the response headers. |
526 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); | 572 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); |
527 | 573 |
528 size_t spdy_response_headers_frame_length; | 574 size_t spdy_response_headers_frame_length; |
529 QuicStreamOffset offset = 0; | 575 QuicStreamOffset offset = 0; |
530 ProcessPacket(ConstructResponseHeadersPacket( | 576 ProcessPacket(ConstructResponseHeadersPacket( |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
581 pos = ExpectLogContainsSomewhere( | 627 pos = ExpectLogContainsSomewhere( |
582 entries, /*min_offset=*/pos, | 628 entries, /*min_offset=*/pos, |
583 NetLog::TYPE_QUIC_CHROMIUM_CLIENT_STREAM_SEND_REQUEST_HEADERS, | 629 NetLog::TYPE_QUIC_CHROMIUM_CLIENT_STREAM_SEND_REQUEST_HEADERS, |
584 NetLog::PHASE_NONE); | 630 NetLog::PHASE_NONE); |
585 ExpectLogContainsSomewhere( | 631 ExpectLogContainsSomewhere( |
586 entries, /*min_offset=*/pos, | 632 entries, /*min_offset=*/pos, |
587 NetLog::TYPE_QUIC_CHROMIUM_CLIENT_STREAM_SEND_REQUEST_HEADERS, | 633 NetLog::TYPE_QUIC_CHROMIUM_CLIENT_STREAM_SEND_REQUEST_HEADERS, |
588 NetLog::PHASE_NONE); | 634 NetLog::PHASE_NONE); |
589 } | 635 } |
590 | 636 |
| 637 TEST_P(BidirectionalStreamQuicImplTest, CoalesceSmallBuffers) { |
| 638 SetRequest("POST", "/", DEFAULT_PRIORITY); |
| 639 size_t spdy_request_headers_frame_length; |
| 640 |
| 641 const char kBody1[] = "here are some data"; |
| 642 const char kBody2[] = "data keep coming"; |
| 643 std::vector<std::string> two_writes = {kBody1, kBody2}; |
| 644 AddWrite(ConstructRequestHeadersAndMultipleDataFramesPacket( |
| 645 1, !kFin, DEFAULT_PRIORITY, &spdy_request_headers_frame_length, |
| 646 two_writes)); |
| 647 // Ack server's data packet. |
| 648 AddWrite(ConstructAckPacket(2, 3, 1)); |
| 649 const char kBody3[] = "hello there"; |
| 650 const char kBody4[] = "another piece of small data"; |
| 651 const char kBody5[] = "really small"; |
| 652 QuicStreamOffset data_offset = strlen(kBody1) + strlen(kBody2); |
| 653 AddWrite(ConstructMultipleDataFramesPacket( |
| 654 3, !kIncludeVersion, kFin, data_offset, {kBody3, kBody4, kBody5})); |
| 655 |
| 656 Initialize(); |
| 657 |
| 658 BidirectionalStreamRequestInfo request; |
| 659 request.method = "POST"; |
| 660 request.url = GURL("http://www.google.com/"); |
| 661 request.end_stream_on_headers = false; |
| 662 request.priority = DEFAULT_PRIORITY; |
| 663 |
| 664 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
| 665 std::unique_ptr<TestDelegateBase> delegate( |
| 666 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
| 667 delegate->DisableAutoFlush(); |
| 668 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
| 669 delegate->WaitUntilNextCallback(); // OnStreamReady |
| 670 |
| 671 // Send a Data packet. |
| 672 scoped_refptr<StringIOBuffer> buf1(new StringIOBuffer(kBody1)); |
| 673 scoped_refptr<StringIOBuffer> buf2(new StringIOBuffer(kBody2)); |
| 674 |
| 675 std::vector<IOBuffer*> buffers = {buf1.get(), buf2.get()}; |
| 676 std::vector<int> lengths = {buf1->size(), buf2->size()}; |
| 677 delegate->SendvData(buffers, lengths, !kFin); |
| 678 delegate->WaitUntilNextCallback(); // OnDataSent |
| 679 |
| 680 // Server acks the request. |
| 681 ProcessPacket(ConstructAckPacket(1, 0, 0)); |
| 682 |
| 683 // Server sends the response headers. |
| 684 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); |
| 685 size_t spdy_response_headers_frame_length; |
| 686 QuicStreamOffset offset = 0; |
| 687 ProcessPacket(ConstructResponseHeadersPacket( |
| 688 2, !kFin, response_headers, &spdy_response_headers_frame_length, |
| 689 &offset)); |
| 690 |
| 691 delegate->WaitUntilNextCallback(); // OnHeadersReceived |
| 692 TestCompletionCallback cb; |
| 693 int rv = delegate->ReadData(cb.callback()); |
| 694 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 695 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); |
| 696 const char kResponseBody[] = "Hello world!"; |
| 697 // Server sends data. |
| 698 ProcessPacket( |
| 699 ConstructDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody)); |
| 700 |
| 701 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult()); |
| 702 |
| 703 // Send a second Data packet. |
| 704 scoped_refptr<StringIOBuffer> buf3(new StringIOBuffer(kBody3)); |
| 705 scoped_refptr<StringIOBuffer> buf4(new StringIOBuffer(kBody4)); |
| 706 scoped_refptr<StringIOBuffer> buf5(new StringIOBuffer(kBody5)); |
| 707 |
| 708 delegate->SendvData({buf3.get(), buf4.get(), buf5.get()}, |
| 709 {buf3->size(), buf4->size(), buf5->size()}, kFin); |
| 710 delegate->WaitUntilNextCallback(); // OnDataSent |
| 711 |
| 712 size_t spdy_trailers_frame_length; |
| 713 SpdyHeaderBlock trailers; |
| 714 trailers["foo"] = "bar"; |
| 715 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(kResponseBody)); |
| 716 // Server sends trailers. |
| 717 ProcessPacket(ConstructResponseTrailersPacket( |
| 718 4, kFin, trailers, &spdy_trailers_frame_length, &offset)); |
| 719 |
| 720 delegate->WaitUntilNextCallback(); // OnTrailersReceived |
| 721 trailers.erase(kFinalOffsetHeaderKey); |
| 722 EXPECT_EQ(trailers, delegate->trailers()); |
| 723 EXPECT_EQ(OK, delegate->ReadData(cb.callback())); |
| 724 |
| 725 EXPECT_EQ(1, delegate->on_data_read_count()); |
| 726 EXPECT_EQ(2, delegate->on_data_sent_count()); |
| 727 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol()); |
| 728 EXPECT_EQ( |
| 729 static_cast<int64_t>(spdy_request_headers_frame_length + strlen(kBody1) + |
| 730 strlen(kBody2) + strlen(kBody3) + strlen(kBody4) + |
| 731 strlen(kBody5)), |
| 732 delegate->GetTotalSentBytes()); |
| 733 EXPECT_EQ( |
| 734 static_cast<int64_t>(spdy_response_headers_frame_length + |
| 735 strlen(kResponseBody) + spdy_trailers_frame_length), |
| 736 delegate->GetTotalReceivedBytes()); |
| 737 } |
| 738 |
591 TEST_P(BidirectionalStreamQuicImplTest, PostRequest) { | 739 TEST_P(BidirectionalStreamQuicImplTest, PostRequest) { |
592 SetRequest("POST", "/", DEFAULT_PRIORITY); | 740 SetRequest("POST", "/", DEFAULT_PRIORITY); |
593 size_t spdy_request_headers_frame_length; | 741 size_t spdy_request_headers_frame_length; |
594 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY, | 742 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY, |
595 &spdy_request_headers_frame_length)); | 743 &spdy_request_headers_frame_length)); |
596 AddWrite(ConstructDataPacket(2, kIncludeVersion, kFin, 0, kUploadData)); | 744 AddWrite(ConstructDataPacket(2, kIncludeVersion, kFin, 0, kUploadData)); |
597 AddWrite(ConstructAckPacket(3, 3, 1)); | 745 AddWrite(ConstructAckPacket(3, 3, 1)); |
598 | 746 |
599 Initialize(); | 747 Initialize(); |
600 | 748 |
601 BidirectionalStreamRequestInfo request; | 749 BidirectionalStreamRequestInfo request; |
602 request.method = "POST"; | 750 request.method = "POST"; |
603 request.url = GURL("http://www.google.com/"); | 751 request.url = GURL("http://www.google.com/"); |
604 request.end_stream_on_headers = false; | 752 request.end_stream_on_headers = false; |
605 request.priority = DEFAULT_PRIORITY; | 753 request.priority = DEFAULT_PRIORITY; |
606 | 754 |
607 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 755 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
608 std::unique_ptr<TestDelegateBase> delegate( | 756 std::unique_ptr<TestDelegateBase> delegate( |
609 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 757 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
610 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 758 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
611 delegate->WaitUntilNextCallback(); // OnHeadersSent | 759 delegate->WaitUntilNextCallback(); // OnStreamReady |
612 | 760 |
613 // Send a DATA frame. | 761 // Send a DATA frame. |
614 scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(kUploadData)); | 762 scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(kUploadData)); |
615 | 763 |
616 delegate->SendData(buf.get(), buf->size(), true); | 764 delegate->SendData(buf.get(), buf->size(), true); |
617 delegate->WaitUntilNextCallback(); // OnDataSent | 765 delegate->WaitUntilNextCallback(); // OnDataSent |
618 | 766 |
619 // Server acks the request. | 767 // Server acks the request. |
620 ProcessPacket(ConstructAckPacket(1, 0, 0)); | 768 ProcessPacket(ConstructAckPacket(1, 0, 0)); |
621 | 769 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
678 BidirectionalStreamRequestInfo request; | 826 BidirectionalStreamRequestInfo request; |
679 request.method = "POST"; | 827 request.method = "POST"; |
680 request.url = GURL("http://www.google.com/"); | 828 request.url = GURL("http://www.google.com/"); |
681 request.end_stream_on_headers = false; | 829 request.end_stream_on_headers = false; |
682 request.priority = DEFAULT_PRIORITY; | 830 request.priority = DEFAULT_PRIORITY; |
683 | 831 |
684 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 832 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
685 std::unique_ptr<TestDelegateBase> delegate( | 833 std::unique_ptr<TestDelegateBase> delegate( |
686 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 834 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
687 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 835 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
688 delegate->WaitUntilNextCallback(); // OnHeadersSent | 836 delegate->WaitUntilNextCallback(); // OnStreamReady |
689 | 837 |
690 // Server acks the request. | 838 // Server acks the request. |
691 ProcessPacket(ConstructAckPacket(1, 0, 0)); | 839 ProcessPacket(ConstructAckPacket(1, 0, 0)); |
692 | 840 |
693 // Server sends the response headers. | 841 // Server sends the response headers. |
694 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); | 842 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); |
695 size_t spdy_response_headers_frame_length; | 843 size_t spdy_response_headers_frame_length; |
696 ProcessPacket(ConstructResponseHeadersPacket( | 844 ProcessPacket(ConstructResponseHeadersPacket( |
697 2, !kFin, response_headers, &spdy_response_headers_frame_length, 0)); | 845 2, !kFin, response_headers, &spdy_response_headers_frame_length, 0)); |
698 | 846 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
755 BidirectionalStreamRequestInfo request; | 903 BidirectionalStreamRequestInfo request; |
756 request.method = "GET"; | 904 request.method = "GET"; |
757 request.url = GURL("http://www.google.com/"); | 905 request.url = GURL("http://www.google.com/"); |
758 request.end_stream_on_headers = true; | 906 request.end_stream_on_headers = true; |
759 request.priority = DEFAULT_PRIORITY; | 907 request.priority = DEFAULT_PRIORITY; |
760 | 908 |
761 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 909 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
762 std::unique_ptr<TestDelegateBase> delegate( | 910 std::unique_ptr<TestDelegateBase> delegate( |
763 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 911 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
764 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 912 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
765 delegate->WaitUntilNextCallback(); // OnHeadersSent | 913 delegate->WaitUntilNextCallback(); // OnStreamReady |
766 | 914 |
767 // Server sends a Rst. | 915 // Server sends a Rst. |
768 ProcessPacket(ConstructRstStreamPacket(1)); | 916 ProcessPacket(ConstructRstStreamPacket(1)); |
769 | 917 |
770 delegate->WaitUntilNextCallback(); // OnFailed | 918 delegate->WaitUntilNextCallback(); // OnFailed |
771 TestCompletionCallback cb; | 919 TestCompletionCallback cb; |
772 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, delegate->ReadData(cb.callback())); | 920 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, delegate->ReadData(cb.callback())); |
773 | 921 |
774 base::MessageLoop::current()->RunUntilIdle(); | 922 base::MessageLoop::current()->RunUntilIdle(); |
775 | 923 |
(...skipping 18 matching lines...) Expand all Loading... |
794 BidirectionalStreamRequestInfo request; | 942 BidirectionalStreamRequestInfo request; |
795 request.method = "GET"; | 943 request.method = "GET"; |
796 request.url = GURL("http://www.google.com/"); | 944 request.url = GURL("http://www.google.com/"); |
797 request.end_stream_on_headers = true; | 945 request.end_stream_on_headers = true; |
798 request.priority = DEFAULT_PRIORITY; | 946 request.priority = DEFAULT_PRIORITY; |
799 | 947 |
800 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 948 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
801 std::unique_ptr<TestDelegateBase> delegate( | 949 std::unique_ptr<TestDelegateBase> delegate( |
802 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 950 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
803 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 951 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
804 delegate->WaitUntilNextCallback(); // OnHeadersSent | 952 delegate->WaitUntilNextCallback(); // OnStreamReady |
805 | 953 |
806 // Server acks the request. | 954 // Server acks the request. |
807 ProcessPacket(ConstructAckPacket(1, 0, 0)); | 955 ProcessPacket(ConstructAckPacket(1, 0, 0)); |
808 | 956 |
809 // Server sends the response headers. | 957 // Server sends the response headers. |
810 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); | 958 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); |
811 | 959 |
812 size_t spdy_response_headers_frame_length; | 960 size_t spdy_response_headers_frame_length; |
813 QuicStreamOffset offset = 0; | 961 QuicStreamOffset offset = 0; |
814 ProcessPacket(ConstructResponseHeadersPacket( | 962 ProcessPacket(ConstructResponseHeadersPacket( |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
851 BidirectionalStreamRequestInfo request; | 999 BidirectionalStreamRequestInfo request; |
852 request.method = "POST"; | 1000 request.method = "POST"; |
853 request.url = GURL("http://www.google.com/"); | 1001 request.url = GURL("http://www.google.com/"); |
854 request.end_stream_on_headers = false; | 1002 request.end_stream_on_headers = false; |
855 request.priority = DEFAULT_PRIORITY; | 1003 request.priority = DEFAULT_PRIORITY; |
856 | 1004 |
857 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1005 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
858 std::unique_ptr<TestDelegateBase> delegate( | 1006 std::unique_ptr<TestDelegateBase> delegate( |
859 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 1007 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
860 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 1008 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
861 delegate->WaitUntilNextCallback(); // OnHeadersSent | 1009 delegate->WaitUntilNextCallback(); // OnStreamReady |
862 | 1010 |
863 // Server acks the request. | 1011 // Server acks the request. |
864 ProcessPacket(ConstructAckPacket(1, 0, 0)); | 1012 ProcessPacket(ConstructAckPacket(1, 0, 0)); |
865 | 1013 |
866 // Server sends the response headers. | 1014 // Server sends the response headers. |
867 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); | 1015 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); |
868 size_t spdy_response_headers_frame_length; | 1016 size_t spdy_response_headers_frame_length; |
869 ProcessPacket(ConstructResponseHeadersPacket( | 1017 ProcessPacket(ConstructResponseHeadersPacket( |
870 2, !kFin, response_headers, &spdy_response_headers_frame_length, 0)); | 1018 2, !kFin, response_headers, &spdy_response_headers_frame_length, 0)); |
871 | 1019 |
(...skipping 29 matching lines...) Expand all Loading... |
901 BidirectionalStreamRequestInfo request; | 1049 BidirectionalStreamRequestInfo request; |
902 request.method = "GET"; | 1050 request.method = "GET"; |
903 request.url = GURL("http://www.google.com/"); | 1051 request.url = GURL("http://www.google.com/"); |
904 request.end_stream_on_headers = true; | 1052 request.end_stream_on_headers = true; |
905 request.priority = DEFAULT_PRIORITY; | 1053 request.priority = DEFAULT_PRIORITY; |
906 | 1054 |
907 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1055 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
908 std::unique_ptr<TestDelegateBase> delegate( | 1056 std::unique_ptr<TestDelegateBase> delegate( |
909 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 1057 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
910 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 1058 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
911 delegate->WaitUntilNextCallback(); // OnHeadersSent | 1059 delegate->WaitUntilNextCallback(); // OnStreamReady |
912 | 1060 |
913 // Server acks the request. | 1061 // Server acks the request. |
914 ProcessPacket(ConstructAckPacket(1, 0, 0)); | 1062 ProcessPacket(ConstructAckPacket(1, 0, 0)); |
915 | 1063 |
916 // Server sends the response headers. | 1064 // Server sends the response headers. |
917 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); | 1065 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); |
918 | 1066 |
919 size_t spdy_response_headers_frame_length; | 1067 size_t spdy_response_headers_frame_length; |
920 QuicStreamOffset offset = 0; | 1068 QuicStreamOffset offset = 0; |
921 ProcessPacket(ConstructResponseHeadersPacket( | 1069 ProcessPacket(ConstructResponseHeadersPacket( |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
955 BidirectionalStreamRequestInfo request; | 1103 BidirectionalStreamRequestInfo request; |
956 request.method = "POST"; | 1104 request.method = "POST"; |
957 request.url = GURL("http://www.google.com/"); | 1105 request.url = GURL("http://www.google.com/"); |
958 request.end_stream_on_headers = false; | 1106 request.end_stream_on_headers = false; |
959 request.priority = DEFAULT_PRIORITY; | 1107 request.priority = DEFAULT_PRIORITY; |
960 | 1108 |
961 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1109 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
962 std::unique_ptr<TestDelegateBase> delegate( | 1110 std::unique_ptr<TestDelegateBase> delegate( |
963 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); | 1111 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); |
964 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 1112 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
965 delegate->WaitUntilNextCallback(); // OnHeadersSent | 1113 delegate->WaitUntilNextCallback(); // OnStreamReady |
966 | 1114 |
967 // Server acks the request. | 1115 // Server acks the request. |
968 ProcessPacket(ConstructAckPacket(1, 0, 0)); | 1116 ProcessPacket(ConstructAckPacket(1, 0, 0)); |
969 | 1117 |
970 // Server sends the response headers. | 1118 // Server sends the response headers. |
971 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); | 1119 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); |
972 size_t spdy_response_headers_frame_length; | 1120 size_t spdy_response_headers_frame_length; |
973 ProcessPacket(ConstructResponseHeadersPacket( | 1121 ProcessPacket(ConstructResponseHeadersPacket( |
974 2, !kFin, response_headers, &spdy_response_headers_frame_length, 0)); | 1122 2, !kFin, response_headers, &spdy_response_headers_frame_length, 0)); |
975 | 1123 |
(...skipping 29 matching lines...) Expand all Loading... |
1005 request.method = "POST"; | 1153 request.method = "POST"; |
1006 request.url = GURL("http://www.google.com/"); | 1154 request.url = GURL("http://www.google.com/"); |
1007 request.end_stream_on_headers = false; | 1155 request.end_stream_on_headers = false; |
1008 request.priority = DEFAULT_PRIORITY; | 1156 request.priority = DEFAULT_PRIORITY; |
1009 | 1157 |
1010 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1158 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1011 std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate( | 1159 std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate( |
1012 read_buffer.get(), kReadBufferSize, | 1160 read_buffer.get(), kReadBufferSize, |
1013 DeleteStreamDelegate::ON_HEADERS_RECEIVED, true)); | 1161 DeleteStreamDelegate::ON_HEADERS_RECEIVED, true)); |
1014 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 1162 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
1015 delegate->WaitUntilNextCallback(); // OnHeadersSent | 1163 delegate->WaitUntilNextCallback(); // OnStreamReady |
1016 | 1164 |
1017 // Server acks the request. | 1165 // Server acks the request. |
1018 ProcessPacket(ConstructAckPacket(1, 0, 0)); | 1166 ProcessPacket(ConstructAckPacket(1, 0, 0)); |
1019 | 1167 |
1020 // Server sends the response headers. | 1168 // Server sends the response headers. |
1021 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); | 1169 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); |
1022 | 1170 |
1023 size_t spdy_response_headers_frame_length; | 1171 size_t spdy_response_headers_frame_length; |
1024 ProcessPacket(ConstructResponseHeadersPacket( | 1172 ProcessPacket(ConstructResponseHeadersPacket( |
1025 2, !kFin, response_headers, &spdy_response_headers_frame_length, | 1173 2, !kFin, response_headers, &spdy_response_headers_frame_length, |
(...skipping 22 matching lines...) Expand all Loading... |
1048 request.method = "POST"; | 1196 request.method = "POST"; |
1049 request.url = GURL("http://www.google.com/"); | 1197 request.url = GURL("http://www.google.com/"); |
1050 request.end_stream_on_headers = false; | 1198 request.end_stream_on_headers = false; |
1051 request.priority = DEFAULT_PRIORITY; | 1199 request.priority = DEFAULT_PRIORITY; |
1052 | 1200 |
1053 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1201 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1054 std::unique_ptr<DeleteStreamDelegate> delegate( | 1202 std::unique_ptr<DeleteStreamDelegate> delegate( |
1055 new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize, | 1203 new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize, |
1056 DeleteStreamDelegate::ON_DATA_READ, true)); | 1204 DeleteStreamDelegate::ON_DATA_READ, true)); |
1057 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 1205 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
1058 delegate->WaitUntilNextCallback(); // OnHeadersSent | 1206 delegate->WaitUntilNextCallback(); // OnStreamReady |
1059 | 1207 |
1060 // Server acks the request. | 1208 // Server acks the request. |
1061 ProcessPacket(ConstructAckPacket(1, 0, 0)); | 1209 ProcessPacket(ConstructAckPacket(1, 0, 0)); |
1062 | 1210 |
1063 // Server sends the response headers. | 1211 // Server sends the response headers. |
1064 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); | 1212 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); |
1065 | 1213 |
1066 size_t spdy_response_headers_frame_length; | 1214 size_t spdy_response_headers_frame_length; |
1067 ProcessPacket(ConstructResponseHeadersPacket( | 1215 ProcessPacket(ConstructResponseHeadersPacket( |
1068 2, !kFin, response_headers, &spdy_response_headers_frame_length, | 1216 2, !kFin, response_headers, &spdy_response_headers_frame_length, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1100 request.method = "GET"; | 1248 request.method = "GET"; |
1101 request.url = GURL("http://www.google.com/"); | 1249 request.url = GURL("http://www.google.com/"); |
1102 request.end_stream_on_headers = true; | 1250 request.end_stream_on_headers = true; |
1103 request.priority = DEFAULT_PRIORITY; | 1251 request.priority = DEFAULT_PRIORITY; |
1104 | 1252 |
1105 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); | 1253 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); |
1106 std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate( | 1254 std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate( |
1107 read_buffer.get(), kReadBufferSize, | 1255 read_buffer.get(), kReadBufferSize, |
1108 DeleteStreamDelegate::ON_TRAILERS_RECEIVED, true)); | 1256 DeleteStreamDelegate::ON_TRAILERS_RECEIVED, true)); |
1109 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); | 1257 delegate->Start(&request, net_log().bound(), session()->GetWeakPtr()); |
1110 delegate->WaitUntilNextCallback(); // OnHeadersSent | 1258 delegate->WaitUntilNextCallback(); // OnStreamReady |
1111 | 1259 |
1112 // Server acks the request. | 1260 // Server acks the request. |
1113 ProcessPacket(ConstructAckPacket(1, 0, 0)); | 1261 ProcessPacket(ConstructAckPacket(1, 0, 0)); |
1114 | 1262 |
1115 // Server sends the response headers. | 1263 // Server sends the response headers. |
1116 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); | 1264 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200"); |
1117 | 1265 |
1118 QuicStreamOffset offset = 0; | 1266 QuicStreamOffset offset = 0; |
1119 size_t spdy_response_headers_frame_length; | 1267 size_t spdy_response_headers_frame_length; |
1120 ProcessPacket(ConstructResponseHeadersPacket( | 1268 ProcessPacket(ConstructResponseHeadersPacket( |
(...skipping 29 matching lines...) Expand all Loading... |
1150 | 1298 |
1151 base::MessageLoop::current()->RunUntilIdle(); | 1299 base::MessageLoop::current()->RunUntilIdle(); |
1152 | 1300 |
1153 EXPECT_EQ(1, delegate->on_data_read_count()); | 1301 EXPECT_EQ(1, delegate->on_data_read_count()); |
1154 EXPECT_EQ(0, delegate->on_data_sent_count()); | 1302 EXPECT_EQ(0, delegate->on_data_sent_count()); |
1155 } | 1303 } |
1156 | 1304 |
1157 } // namespace test | 1305 } // namespace test |
1158 | 1306 |
1159 } // namespace net | 1307 } // namespace net |
OLD | NEW |