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