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