OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/quic_http_stream.h" | 5 #include "net/quic/quic_http_stream.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
10 #include "net/base/test_completion_callback.h" | 10 #include "net/base/test_completion_callback.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 namespace test { | 37 namespace test { |
38 namespace { | 38 namespace { |
39 | 39 |
40 const char kUploadData[] = "hello world!"; | 40 const char kUploadData[] = "hello world!"; |
41 | 41 |
42 class TestQuicConnection : public QuicConnection { | 42 class TestQuicConnection : public QuicConnection { |
43 public: | 43 public: |
44 TestQuicConnection(QuicGuid guid, | 44 TestQuicConnection(QuicGuid guid, |
45 IPEndPoint address, | 45 IPEndPoint address, |
46 QuicConnectionHelper* helper) | 46 QuicConnectionHelper* helper) |
47 : QuicConnection(guid, address, helper) { | 47 : QuicConnection(guid, address, helper, false) { |
48 } | 48 } |
49 | 49 |
50 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { | 50 void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { |
51 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); | 51 QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); |
52 } | 52 } |
53 | 53 |
54 void SetReceiveAlgorithm(ReceiveAlgorithmInterface* receive_algorithm) { | 54 void SetReceiveAlgorithm(ReceiveAlgorithmInterface* receive_algorithm) { |
55 QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm); | 55 QuicConnectionPeer::SetReceiveAlgorithm(this, receive_algorithm); |
56 } | 56 } |
57 }; | 57 }; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 QuicEncryptedPacket* packet; | 111 QuicEncryptedPacket* packet; |
112 }; | 112 }; |
113 | 113 |
114 QuicHttpStreamTest() | 114 QuicHttpStreamTest() |
115 : net_log_(BoundNetLog()), | 115 : net_log_(BoundNetLog()), |
116 use_closing_stream_(false), | 116 use_closing_stream_(false), |
117 read_buffer_(new IOBufferWithSize(4096)), | 117 read_buffer_(new IOBufferWithSize(4096)), |
118 guid_(2), | 118 guid_(2), |
119 framer_(kQuicVersion1, | 119 framer_(kQuicVersion1, |
120 QuicDecrypter::Create(kNULL), | 120 QuicDecrypter::Create(kNULL), |
121 QuicEncrypter::Create(kNULL)), | 121 QuicEncrypter::Create(kNULL), |
122 creator_(guid_, &framer_, &random_) { | 122 false), |
| 123 creator_(guid_, &framer_, &random_, false) { |
123 IPAddressNumber ip; | 124 IPAddressNumber ip; |
124 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip)); | 125 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip)); |
125 peer_addr_ = IPEndPoint(ip, 443); | 126 peer_addr_ = IPEndPoint(ip, 443); |
126 self_addr_ = IPEndPoint(ip, 8435); | 127 self_addr_ = IPEndPoint(ip, 8435); |
127 } | 128 } |
128 | 129 |
129 ~QuicHttpStreamTest() { | 130 ~QuicHttpStreamTest() { |
130 for (size_t i = 0; i < writes_.size(); i++) { | 131 for (size_t i = 0; i < writes_.size(); i++) { |
131 delete writes_[i].packet; | 132 delete writes_[i].packet; |
132 } | 133 } |
(...skipping 28 matching lines...) Expand all Loading... |
161 | 162 |
162 socket_data_.reset(new StaticSocketDataProvider(NULL, 0, mock_writes_.get(), | 163 socket_data_.reset(new StaticSocketDataProvider(NULL, 0, mock_writes_.get(), |
163 writes_.size())); | 164 writes_.size())); |
164 | 165 |
165 MockUDPClientSocket* socket = new MockUDPClientSocket(socket_data_.get(), | 166 MockUDPClientSocket* socket = new MockUDPClientSocket(socket_data_.get(), |
166 net_log_.net_log()); | 167 net_log_.net_log()); |
167 socket->Connect(peer_addr_); | 168 socket->Connect(peer_addr_); |
168 runner_ = new TestTaskRunner(&clock_); | 169 runner_ = new TestTaskRunner(&clock_); |
169 send_algorithm_ = new MockSendAlgorithm(); | 170 send_algorithm_ = new MockSendAlgorithm(); |
170 receive_algorithm_ = new TestReceiveAlgorithm(NULL); | 171 receive_algorithm_ = new TestReceiveAlgorithm(NULL); |
171 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)). | 172 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _)). |
172 WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); | 173 WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); |
173 helper_ = new QuicConnectionHelper(runner_.get(), &clock_, | 174 helper_ = new QuicConnectionHelper(runner_.get(), &clock_, |
174 &random_generator_, socket); | 175 &random_generator_, socket); |
175 connection_ = new TestQuicConnection(guid_, peer_addr_, helper_); | 176 connection_ = new TestQuicConnection(guid_, peer_addr_, helper_); |
176 connection_->set_visitor(&visitor_); | 177 connection_->set_visitor(&visitor_); |
177 connection_->SetSendAlgorithm(send_algorithm_); | 178 connection_->SetSendAlgorithm(send_algorithm_); |
178 connection_->SetReceiveAlgorithm(receive_algorithm_); | 179 connection_->SetReceiveAlgorithm(receive_algorithm_); |
179 session_.reset(new QuicClientSession(connection_, helper_, NULL, | 180 session_.reset(new QuicClientSession(connection_, helper_, NULL, |
180 "www.google.com", NULL)); | 181 "www.google.com", NULL)); |
181 CryptoHandshakeMessage message = | 182 scoped_ptr<QuicPacket> shlo(ConstructServerHelloPacket( |
182 CreateShloMessage(&clock_, &random_generator_, "www.google.com"); | 183 guid_, &clock_, &random_generator_, "www.google.com")); |
| 184 scoped_ptr<QuicEncryptedPacket> shlo_packet( |
| 185 framer_.EncryptPacket(1, *shlo)); |
183 session_->GetCryptoStream()->CryptoConnect(); | 186 session_->GetCryptoStream()->CryptoConnect(); |
184 session_->GetCryptoStream()->OnHandshakeMessage(message); | 187 ProcessPacket(*shlo_packet); |
185 EXPECT_TRUE(session_->IsCryptoHandshakeComplete()); | 188 EXPECT_TRUE(session_->IsCryptoHandshakeComplete()); |
186 QuicReliableClientStream* stream = | 189 QuicReliableClientStream* stream = |
187 session_->CreateOutgoingReliableStream(); | 190 session_->CreateOutgoingReliableStream(); |
188 stream_.reset(use_closing_stream_ ? | 191 stream_.reset(use_closing_stream_ ? |
189 new AutoClosingStream(stream) : | 192 new AutoClosingStream(stream) : |
190 new QuicHttpStream(stream)); | 193 new QuicHttpStream(stream)); |
191 } | 194 } |
192 | 195 |
193 void SetRequestString(const std::string& method, const std::string& path) { | 196 void SetRequestString(const std::string& method, const std::string& path) { |
194 SpdyHeaderBlock headers; | 197 SpdyHeaderBlock headers; |
(...skipping 17 matching lines...) Expand all Loading... |
212 size_t len = SpdyFramer::GetSerializedLength(3, &headers); | 215 size_t len = SpdyFramer::GetSerializedLength(3, &headers); |
213 SpdyFrameBuilder builder(len); | 216 SpdyFrameBuilder builder(len); |
214 SpdyFramer::WriteHeaderBlock(&builder, 3, &headers); | 217 SpdyFramer::WriteHeaderBlock(&builder, 3, &headers); |
215 scoped_ptr<SpdyFrame> frame(builder.take()); | 218 scoped_ptr<SpdyFrame> frame(builder.take()); |
216 return std::string(frame->data(), len); | 219 return std::string(frame->data(), len); |
217 } | 220 } |
218 | 221 |
219 QuicEncryptedPacket* ConstructChloPacket() { | 222 QuicEncryptedPacket* ConstructChloPacket() { |
220 scoped_ptr<QuicPacket> chlo( | 223 scoped_ptr<QuicPacket> chlo( |
221 ConstructClientHelloPacket(guid_, &clock_, &random_generator_, | 224 ConstructClientHelloPacket(guid_, &clock_, &random_generator_, |
222 "www.google.com")); | 225 "www.google.com", true)); |
223 return framer_.EncryptPacket(1, *chlo); | 226 return framer_.EncryptPacket(1, *chlo); |
224 } | 227 } |
225 | 228 |
226 // Returns a newly created packet to send kData on stream 1. | 229 // Returns a newly created packet to send kData on stream 1. |
227 QuicEncryptedPacket* ConstructDataPacket( | 230 QuicEncryptedPacket* ConstructDataPacket( |
228 QuicPacketSequenceNumber sequence_number, | 231 QuicPacketSequenceNumber sequence_number, |
229 bool fin, | 232 bool fin, |
230 QuicStreamOffset offset, | 233 QuicStreamOffset offset, |
231 base::StringPiece data) { | 234 base::StringPiece data) { |
232 InitializeHeader(sequence_number); | 235 InitializeHeader(sequence_number); |
233 QuicStreamFrame frame(3, fin, offset, data); | 236 QuicStreamFrame frame(3, fin, offset, data); |
234 return ConstructPacket(header_, QuicFrame(&frame)); | 237 return ConstructPacket(header_, QuicFrame(&frame)); |
235 } | 238 } |
236 | 239 |
237 // Returns a newly created packet to send ack data. | 240 // Returns a newly created packet to send ack data. |
238 QuicEncryptedPacket* ConstructAckPacket( | 241 QuicEncryptedPacket* ConstructAckPacket( |
239 QuicPacketSequenceNumber sequence_number, | 242 QuicPacketSequenceNumber sequence_number, |
240 QuicPacketSequenceNumber largest_received, | 243 QuicPacketSequenceNumber largest_received, |
241 QuicPacketSequenceNumber least_unacked) { | 244 QuicPacketSequenceNumber least_unacked) { |
242 InitializeHeader(sequence_number); | 245 InitializeHeader(sequence_number); |
243 | 246 |
244 QuicAckFrame ack(largest_received, least_unacked); | 247 QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked); |
245 ack.sent_info.entropy_hash = 0; | 248 ack.sent_info.entropy_hash = 0; |
246 ack.received_info.entropy_hash = 0; | 249 ack.received_info.entropy_hash = 0; |
247 | 250 |
248 return ConstructPacket(header_, QuicFrame(&ack)); | 251 return ConstructPacket(header_, QuicFrame(&ack)); |
249 } | 252 } |
250 | 253 |
251 // Returns a newly created packet to send ack data. | 254 // Returns a newly created packet to send ack data. |
252 QuicEncryptedPacket* ConstructRstPacket( | 255 QuicEncryptedPacket* ConstructRstPacket( |
253 QuicPacketSequenceNumber sequence_number, | 256 QuicPacketSequenceNumber sequence_number, |
254 QuicStreamId stream_id) { | 257 QuicStreamId stream_id) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 AddWrite(SYNCHRONOUS, ConstructChloPacket()); | 336 AddWrite(SYNCHRONOUS, ConstructChloPacket()); |
334 Initialize(); | 337 Initialize(); |
335 EXPECT_FALSE(stream_->IsConnectionReusable()); | 338 EXPECT_FALSE(stream_->IsConnectionReusable()); |
336 } | 339 } |
337 | 340 |
338 TEST_F(QuicHttpStreamTest, GetRequest) { | 341 TEST_F(QuicHttpStreamTest, GetRequest) { |
339 SetRequestString("GET", "/"); | 342 SetRequestString("GET", "/"); |
340 AddWrite(SYNCHRONOUS, ConstructChloPacket()); | 343 AddWrite(SYNCHRONOUS, ConstructChloPacket()); |
341 AddWrite(SYNCHRONOUS, ConstructDataPacket(2, kFin, 0, | 344 AddWrite(SYNCHRONOUS, ConstructDataPacket(2, kFin, 0, |
342 request_data_)); | 345 request_data_)); |
343 AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 2)); | 346 AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1)); |
344 Initialize(); | 347 Initialize(); |
345 | 348 |
346 request_.method = "GET"; | 349 request_.method = "GET"; |
347 request_.url = GURL("http://www.google.com/"); | 350 request_.url = GURL("http://www.google.com/"); |
348 | 351 |
349 EXPECT_EQ(OK, stream_->InitializeStream(&request_, net_log_, | 352 EXPECT_EQ(OK, stream_->InitializeStream(&request_, net_log_, |
350 callback_.callback())); | 353 callback_.callback())); |
351 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, | 354 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, |
352 callback_.callback())); | 355 callback_.callback())); |
353 EXPECT_EQ(&response_, stream_->GetResponseInfo()); | 356 EXPECT_EQ(&response_, stream_->GetResponseInfo()); |
(...skipping 22 matching lines...) Expand all Loading... |
376 read_buffer_->size(), | 379 read_buffer_->size(), |
377 callback_.callback())); | 380 callback_.callback())); |
378 EXPECT_TRUE(stream_->IsResponseBodyComplete()); | 381 EXPECT_TRUE(stream_->IsResponseBodyComplete()); |
379 EXPECT_TRUE(AtEof()); | 382 EXPECT_TRUE(AtEof()); |
380 } | 383 } |
381 | 384 |
382 TEST_F(QuicHttpStreamTest, GetRequestFullResponseInSinglePacket) { | 385 TEST_F(QuicHttpStreamTest, GetRequestFullResponseInSinglePacket) { |
383 SetRequestString("GET", "/"); | 386 SetRequestString("GET", "/"); |
384 AddWrite(SYNCHRONOUS, ConstructChloPacket()); | 387 AddWrite(SYNCHRONOUS, ConstructChloPacket()); |
385 AddWrite(SYNCHRONOUS, ConstructDataPacket(2, kFin, 0, request_data_)); | 388 AddWrite(SYNCHRONOUS, ConstructDataPacket(2, kFin, 0, request_data_)); |
386 AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 2)); | 389 AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 1)); |
387 Initialize(); | 390 Initialize(); |
388 | 391 |
389 request_.method = "GET"; | 392 request_.method = "GET"; |
390 request_.url = GURL("http://www.google.com/"); | 393 request_.url = GURL("http://www.google.com/"); |
391 | 394 |
392 EXPECT_EQ(OK, stream_->InitializeStream(&request_, net_log_, | 395 EXPECT_EQ(OK, stream_->InitializeStream(&request_, net_log_, |
393 callback_.callback())); | 396 callback_.callback())); |
394 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, | 397 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, |
395 callback_.callback())); | 398 callback_.callback())); |
396 EXPECT_EQ(&response_, stream_->GetResponseInfo()); | 399 EXPECT_EQ(&response_, stream_->GetResponseInfo()); |
(...skipping 25 matching lines...) Expand all Loading... |
422 EXPECT_TRUE(stream_->IsResponseBodyComplete()); | 425 EXPECT_TRUE(stream_->IsResponseBodyComplete()); |
423 EXPECT_TRUE(AtEof()); | 426 EXPECT_TRUE(AtEof()); |
424 } | 427 } |
425 | 428 |
426 TEST_F(QuicHttpStreamTest, SendPostRequest) { | 429 TEST_F(QuicHttpStreamTest, SendPostRequest) { |
427 SetRequestString("POST", "/"); | 430 SetRequestString("POST", "/"); |
428 AddWrite(SYNCHRONOUS, ConstructChloPacket()); | 431 AddWrite(SYNCHRONOUS, ConstructChloPacket()); |
429 AddWrite(SYNCHRONOUS, ConstructDataPacket(2, !kFin, 0, request_data_)); | 432 AddWrite(SYNCHRONOUS, ConstructDataPacket(2, !kFin, 0, request_data_)); |
430 AddWrite(SYNCHRONOUS, ConstructDataPacket(3, kFin, request_data_.length(), | 433 AddWrite(SYNCHRONOUS, ConstructDataPacket(3, kFin, request_data_.length(), |
431 kUploadData)); | 434 kUploadData)); |
432 AddWrite(SYNCHRONOUS, ConstructAckPacket(4, 2, 3)); | 435 AddWrite(SYNCHRONOUS, ConstructAckPacket(4, 2, 1)); |
433 | 436 |
434 Initialize(); | 437 Initialize(); |
435 | 438 |
436 ScopedVector<UploadElementReader> element_readers; | 439 ScopedVector<UploadElementReader> element_readers; |
437 element_readers.push_back( | 440 element_readers.push_back( |
438 new UploadBytesElementReader(kUploadData, strlen(kUploadData))); | 441 new UploadBytesElementReader(kUploadData, strlen(kUploadData))); |
439 UploadDataStream upload_data_stream(&element_readers, 0); | 442 UploadDataStream upload_data_stream(&element_readers, 0); |
440 request_.method = "POST"; | 443 request_.method = "POST"; |
441 request_.url = GURL("http://www.google.com/"); | 444 request_.url = GURL("http://www.google.com/"); |
442 request_.upload_data_stream = &upload_data_stream; | 445 request_.upload_data_stream = &upload_data_stream; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 TEST_F(QuicHttpStreamTest, SendChunkedPostRequest) { | 485 TEST_F(QuicHttpStreamTest, SendChunkedPostRequest) { |
483 SetRequestString("POST", "/"); | 486 SetRequestString("POST", "/"); |
484 size_t chunk_size = strlen(kUploadData); | 487 size_t chunk_size = strlen(kUploadData); |
485 AddWrite(SYNCHRONOUS, ConstructChloPacket()); | 488 AddWrite(SYNCHRONOUS, ConstructChloPacket()); |
486 AddWrite(SYNCHRONOUS, ConstructDataPacket(2, !kFin, 0, request_data_)); | 489 AddWrite(SYNCHRONOUS, ConstructDataPacket(2, !kFin, 0, request_data_)); |
487 AddWrite(SYNCHRONOUS, ConstructDataPacket(3, !kFin, request_data_.length(), | 490 AddWrite(SYNCHRONOUS, ConstructDataPacket(3, !kFin, request_data_.length(), |
488 kUploadData)); | 491 kUploadData)); |
489 AddWrite(SYNCHRONOUS, ConstructDataPacket(4, kFin, | 492 AddWrite(SYNCHRONOUS, ConstructDataPacket(4, kFin, |
490 request_data_.length() + chunk_size, | 493 request_data_.length() + chunk_size, |
491 kUploadData)); | 494 kUploadData)); |
492 AddWrite(SYNCHRONOUS, ConstructAckPacket(5, 2, 3)); | 495 AddWrite(SYNCHRONOUS, ConstructAckPacket(5, 2, 1)); |
493 | 496 |
494 Initialize(); | 497 Initialize(); |
495 | 498 |
496 UploadDataStream upload_data_stream(UploadDataStream::CHUNKED, 0); | 499 UploadDataStream upload_data_stream(UploadDataStream::CHUNKED, 0); |
497 upload_data_stream.AppendChunk(kUploadData, chunk_size, false); | 500 upload_data_stream.AppendChunk(kUploadData, chunk_size, false); |
498 | 501 |
499 request_.method = "POST"; | 502 request_.method = "POST"; |
500 request_.url = GURL("http://www.google.com/"); | 503 request_.url = GURL("http://www.google.com/"); |
501 request_.upload_data_stream = &upload_data_stream; | 504 request_.upload_data_stream = &upload_data_stream; |
502 ASSERT_EQ(OK, request_.upload_data_stream->Init(CompletionCallback())); | 505 ASSERT_EQ(OK, request_.upload_data_stream->Init(CompletionCallback())); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 | 541 |
539 EXPECT_TRUE(stream_->IsResponseBodyComplete()); | 542 EXPECT_TRUE(stream_->IsResponseBodyComplete()); |
540 EXPECT_TRUE(AtEof()); | 543 EXPECT_TRUE(AtEof()); |
541 } | 544 } |
542 | 545 |
543 TEST_F(QuicHttpStreamTest, DestroyedEarly) { | 546 TEST_F(QuicHttpStreamTest, DestroyedEarly) { |
544 SetRequestString("GET", "/"); | 547 SetRequestString("GET", "/"); |
545 AddWrite(SYNCHRONOUS, ConstructChloPacket()); | 548 AddWrite(SYNCHRONOUS, ConstructChloPacket()); |
546 AddWrite(SYNCHRONOUS, ConstructDataPacket(2, kFin, 0, request_data_)); | 549 AddWrite(SYNCHRONOUS, ConstructDataPacket(2, kFin, 0, request_data_)); |
547 AddWrite(SYNCHRONOUS, ConstructRstPacket(3, 3)); | 550 AddWrite(SYNCHRONOUS, ConstructRstPacket(3, 3)); |
548 AddWrite(SYNCHRONOUS, ConstructAckPacket(4, 2, 2)); | 551 AddWrite(SYNCHRONOUS, ConstructAckPacket(4, 2, 1)); |
549 use_closing_stream_ = true; | 552 use_closing_stream_ = true; |
550 Initialize(); | 553 Initialize(); |
551 | 554 |
552 request_.method = "GET"; | 555 request_.method = "GET"; |
553 request_.url = GURL("http://www.google.com/"); | 556 request_.url = GURL("http://www.google.com/"); |
554 | 557 |
555 EXPECT_EQ(OK, stream_->InitializeStream(&request_, net_log_, | 558 EXPECT_EQ(OK, stream_->InitializeStream(&request_, net_log_, |
556 callback_.callback())); | 559 callback_.callback())); |
557 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, | 560 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, |
558 callback_.callback())); | 561 callback_.callback())); |
(...skipping 13 matching lines...) Expand all Loading... |
572 | 575 |
573 // In the course of processing this packet, the QuicHttpStream close itself. | 576 // In the course of processing this packet, the QuicHttpStream close itself. |
574 ProcessPacket(*resp); | 577 ProcessPacket(*resp); |
575 | 578 |
576 EXPECT_TRUE(AtEof()); | 579 EXPECT_TRUE(AtEof()); |
577 } | 580 } |
578 | 581 |
579 } // namespace test | 582 } // namespace test |
580 | 583 |
581 } // namespace net | 584 } // namespace net |
OLD | NEW |