| 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" |
| 11 #include "net/base/upload_bytes_element_reader.h" | 11 #include "net/base/upload_bytes_element_reader.h" |
| 12 #include "net/base/upload_data_stream.h" | 12 #include "net/base/upload_data_stream.h" |
| 13 #include "net/http/http_response_headers.h" | 13 #include "net/http/http_response_headers.h" |
| 14 #include "net/quic/congestion_control/receive_algorithm_interface.h" | 14 #include "net/quic/congestion_control/receive_algorithm_interface.h" |
| 15 #include "net/quic/congestion_control/send_algorithm_interface.h" | 15 #include "net/quic/congestion_control/send_algorithm_interface.h" |
| 16 #include "net/quic/quic_client_session.h" | 16 #include "net/quic/quic_client_session.h" |
| 17 #include "net/quic/quic_connection.h" | 17 #include "net/quic/quic_connection.h" |
| 18 #include "net/quic/quic_connection_helper.h" | 18 #include "net/quic/quic_connection_helper.h" |
| 19 #include "net/quic/test_tools/mock_clock.h" | 19 #include "net/quic/test_tools/mock_clock.h" |
| 20 #include "net/quic/test_tools/mock_random.h" |
| 20 #include "net/quic/test_tools/quic_connection_peer.h" | 21 #include "net/quic/test_tools/quic_connection_peer.h" |
| 21 #include "net/quic/test_tools/quic_test_utils.h" | 22 #include "net/quic/test_tools/quic_test_utils.h" |
| 22 #include "net/quic/test_tools/test_task_runner.h" | 23 #include "net/quic/test_tools/test_task_runner.h" |
| 23 #include "net/socket/socket_test_util.h" | 24 #include "net/socket/socket_test_util.h" |
| 24 #include "net/spdy/spdy_frame_builder.h" | 25 #include "net/spdy/spdy_frame_builder.h" |
| 25 #include "net/spdy/spdy_framer.h" | 26 #include "net/spdy/spdy_framer.h" |
| 26 #include "net/spdy/spdy_http_utils.h" | 27 #include "net/spdy/spdy_http_utils.h" |
| 27 #include "net/spdy/spdy_protocol.h" | 28 #include "net/spdy/spdy_protocol.h" |
| 28 #include "testing/gmock/include/gmock/gmock.h" | 29 #include "testing/gmock/include/gmock/gmock.h" |
| 29 #include "testing/gtest/include/gtest/gtest.h" | 30 #include "testing/gtest/include/gtest/gtest.h" |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 IoMode mode; | 108 IoMode mode; |
| 108 QuicEncryptedPacket* packet; | 109 QuicEncryptedPacket* packet; |
| 109 }; | 110 }; |
| 110 | 111 |
| 111 QuicHttpStreamTest() | 112 QuicHttpStreamTest() |
| 112 : net_log_(BoundNetLog()), | 113 : net_log_(BoundNetLog()), |
| 113 use_closing_stream_(false), | 114 use_closing_stream_(false), |
| 114 read_buffer_(new IOBufferWithSize(4096)), | 115 read_buffer_(new IOBufferWithSize(4096)), |
| 115 guid_(2), | 116 guid_(2), |
| 116 framer_(QuicDecrypter::Create(kNULL), QuicEncrypter::Create(kNULL)), | 117 framer_(QuicDecrypter::Create(kNULL), QuicEncrypter::Create(kNULL)), |
| 117 creator_(guid_, &framer_) { | 118 creator_(guid_, &framer_, &random_) { |
| 118 IPAddressNumber ip; | 119 IPAddressNumber ip; |
| 119 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip)); | 120 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip)); |
| 120 peer_addr_ = IPEndPoint(ip, 443); | 121 peer_addr_ = IPEndPoint(ip, 443); |
| 121 self_addr_ = IPEndPoint(ip, 8435); | 122 self_addr_ = IPEndPoint(ip, 8435); |
| 122 // Do null initialization for simple tests. | 123 // Do null initialization for simple tests. |
| 123 Initialize(); | 124 Initialize(); |
| 124 } | 125 } |
| 125 | 126 |
| 126 ~QuicHttpStreamTest() { | 127 ~QuicHttpStreamTest() { |
| 127 for (size_t i = 0; i < writes_.size(); i++) { | 128 for (size_t i = 0; i < writes_.size(); i++) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 158 | 159 |
| 159 socket_data_.reset(new StaticSocketDataProvider(NULL, 0, mock_writes_.get(), | 160 socket_data_.reset(new StaticSocketDataProvider(NULL, 0, mock_writes_.get(), |
| 160 writes_.size())); | 161 writes_.size())); |
| 161 | 162 |
| 162 MockUDPClientSocket* socket = new MockUDPClientSocket(socket_data_.get(), | 163 MockUDPClientSocket* socket = new MockUDPClientSocket(socket_data_.get(), |
| 163 net_log_.net_log()); | 164 net_log_.net_log()); |
| 164 socket->Connect(peer_addr_); | 165 socket->Connect(peer_addr_); |
| 165 runner_ = new TestTaskRunner(&clock_); | 166 runner_ = new TestTaskRunner(&clock_); |
| 166 send_algorithm_ = new MockSendAlgorithm(); | 167 send_algorithm_ = new MockSendAlgorithm(); |
| 167 receive_algorithm_ = new TestReceiveAlgorithm(NULL); | 168 receive_algorithm_ = new TestReceiveAlgorithm(NULL); |
| 168 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_)). | 169 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)). |
| 169 WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); | 170 WillRepeatedly(testing::Return(QuicTime::Delta::Zero())); |
| 170 helper_ = new QuicConnectionHelper(runner_.get(), &clock_, | 171 helper_ = new QuicConnectionHelper(runner_.get(), &clock_, |
| 171 &random_generator_, socket); | 172 &random_generator_, socket); |
| 172 connection_ = new TestQuicConnection(guid_, peer_addr_, helper_); | 173 connection_ = new TestQuicConnection(guid_, peer_addr_, helper_); |
| 173 connection_->set_visitor(&visitor_); | 174 connection_->set_visitor(&visitor_); |
| 174 connection_->SetSendAlgorithm(send_algorithm_); | 175 connection_->SetSendAlgorithm(send_algorithm_); |
| 175 connection_->SetReceiveAlgorithm(receive_algorithm_); | 176 connection_->SetReceiveAlgorithm(receive_algorithm_); |
| 176 session_.reset(new QuicClientSession(connection_, helper_, NULL, | 177 session_.reset(new QuicClientSession(connection_, helper_, NULL, |
| 177 "www.google.com", NULL)); | 178 "www.google.com", NULL)); |
| 178 CryptoHandshakeMessage message; | 179 CryptoHandshakeMessage message; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 } | 234 } |
| 234 | 235 |
| 235 // Returns a newly created packet to send ack data. | 236 // Returns a newly created packet to send ack data. |
| 236 QuicEncryptedPacket* ConstructAckPacket( | 237 QuicEncryptedPacket* ConstructAckPacket( |
| 237 QuicPacketSequenceNumber sequence_number, | 238 QuicPacketSequenceNumber sequence_number, |
| 238 QuicPacketSequenceNumber largest_received, | 239 QuicPacketSequenceNumber largest_received, |
| 239 QuicPacketSequenceNumber least_unacked) { | 240 QuicPacketSequenceNumber least_unacked) { |
| 240 InitializeHeader(sequence_number); | 241 InitializeHeader(sequence_number); |
| 241 | 242 |
| 242 QuicAckFrame ack(largest_received, least_unacked); | 243 QuicAckFrame ack(largest_received, least_unacked); |
| 244 ack.sent_info.entropy_hash = 0; |
| 245 ack.received_info.entropy_hash = 0; |
| 246 |
| 243 return ConstructPacket(header_, QuicFrame(&ack)); | 247 return ConstructPacket(header_, QuicFrame(&ack)); |
| 244 } | 248 } |
| 245 | 249 |
| 246 // Returns a newly created packet to send ack data. | 250 // Returns a newly created packet to send ack data. |
| 247 QuicEncryptedPacket* ConstructRstPacket( | 251 QuicEncryptedPacket* ConstructRstPacket( |
| 248 QuicPacketSequenceNumber sequence_number, | 252 QuicPacketSequenceNumber sequence_number, |
| 249 QuicStreamId stream_id, | 253 QuicStreamId stream_id) { |
| 250 QuicStreamOffset offset) { | |
| 251 InitializeHeader(sequence_number); | 254 InitializeHeader(sequence_number); |
| 252 | 255 |
| 253 QuicRstStreamFrame rst(stream_id, offset, QUIC_NO_ERROR); | 256 QuicRstStreamFrame rst(stream_id, QUIC_NO_ERROR); |
| 254 return ConstructPacket(header_, QuicFrame(&rst)); | 257 return ConstructPacket(header_, QuicFrame(&rst)); |
| 255 } | 258 } |
| 256 | 259 |
| 257 BoundNetLog net_log_; | 260 BoundNetLog net_log_; |
| 258 bool use_closing_stream_; | 261 bool use_closing_stream_; |
| 259 MockSendAlgorithm* send_algorithm_; | 262 MockSendAlgorithm* send_algorithm_; |
| 260 TestReceiveAlgorithm* receive_algorithm_; | 263 TestReceiveAlgorithm* receive_algorithm_; |
| 261 scoped_refptr<TestTaskRunner> runner_; | 264 scoped_refptr<TestTaskRunner> runner_; |
| 262 scoped_array<MockWrite> mock_writes_; | 265 scoped_array<MockWrite> mock_writes_; |
| 263 MockClock clock_; | 266 MockClock clock_; |
| 264 MockRandom random_generator_; | 267 MockRandom random_generator_; |
| 265 TestQuicConnection* connection_; | 268 TestQuicConnection* connection_; |
| 266 QuicConnectionHelper* helper_; | 269 QuicConnectionHelper* helper_; |
| 267 testing::StrictMock<MockConnectionVisitor> visitor_; | 270 testing::StrictMock<MockConnectionVisitor> visitor_; |
| 268 scoped_ptr<QuicHttpStream> stream_; | 271 scoped_ptr<QuicHttpStream> stream_; |
| 269 scoped_ptr<QuicClientSession> session_; | 272 scoped_ptr<QuicClientSession> session_; |
| 270 TestCompletionCallback callback_; | 273 TestCompletionCallback callback_; |
| 271 HttpRequestInfo request_; | 274 HttpRequestInfo request_; |
| 272 HttpRequestHeaders headers_; | 275 HttpRequestHeaders headers_; |
| 273 HttpResponseInfo response_; | 276 HttpResponseInfo response_; |
| 274 scoped_refptr<IOBufferWithSize> read_buffer_; | 277 scoped_refptr<IOBufferWithSize> read_buffer_; |
| 275 std::string request_data_; | 278 std::string request_data_; |
| 276 std::string response_data_; | 279 std::string response_data_; |
| 277 | 280 |
| 278 private: | 281 private: |
| 279 void InitializeHeader(QuicPacketSequenceNumber sequence_number) { | 282 void InitializeHeader(QuicPacketSequenceNumber sequence_number) { |
| 280 header_.public_header.guid = guid_; | 283 header_.public_header.guid = guid_; |
| 281 header_.public_header.flags = PACKET_PUBLIC_FLAGS_NONE; | 284 header_.public_header.reset_flag = false; |
| 285 header_.public_header.version_flag = false; |
| 282 header_.packet_sequence_number = sequence_number; | 286 header_.packet_sequence_number = sequence_number; |
| 283 header_.fec_group = 0; | 287 header_.fec_group = 0; |
| 284 header_.private_flags = PACKET_PRIVATE_FLAGS_NONE; | 288 header_.fec_entropy_flag = false; |
| 289 header_.entropy_flag = false; |
| 290 header_.fec_flag = false; |
| 285 } | 291 } |
| 286 | 292 |
| 287 QuicEncryptedPacket* ConstructPacket(const QuicPacketHeader& header, | 293 QuicEncryptedPacket* ConstructPacket(const QuicPacketHeader& header, |
| 288 const QuicFrame& frame) { | 294 const QuicFrame& frame) { |
| 289 QuicFrames frames; | 295 QuicFrames frames; |
| 290 frames.push_back(frame); | 296 frames.push_back(frame); |
| 291 scoped_ptr<QuicPacket> packet( | 297 scoped_ptr<QuicPacket> packet( |
| 292 framer_.ConstructFrameDataPacket(header_, frames)); | 298 framer_.ConstructFrameDataPacket(header_, frames).packet); |
| 293 return framer_.EncryptPacket(*packet); | 299 return framer_.EncryptPacket(header.packet_sequence_number, *packet); |
| 294 } | 300 } |
| 295 | 301 |
| 296 const QuicGuid guid_; | 302 const QuicGuid guid_; |
| 297 QuicFramer framer_; | 303 QuicFramer framer_; |
| 298 IPEndPoint self_addr_; | 304 IPEndPoint self_addr_; |
| 299 IPEndPoint peer_addr_; | 305 IPEndPoint peer_addr_; |
| 306 MockRandom random_; |
| 300 QuicPacketCreator creator_; | 307 QuicPacketCreator creator_; |
| 301 QuicPacketHeader header_; | 308 QuicPacketHeader header_; |
| 302 scoped_ptr<StaticSocketDataProvider> socket_data_; | 309 scoped_ptr<StaticSocketDataProvider> socket_data_; |
| 303 std::vector<PacketToWrite> writes_; | 310 std::vector<PacketToWrite> writes_; |
| 304 }; | 311 }; |
| 305 | 312 |
| 306 // All tests are run with two different serializations, HTTP/SPDY | 313 // All tests are run with two different serializations, HTTP/SPDY |
| 307 INSTANTIATE_TEST_CASE_P(QuicHttpStreamTests, | 314 INSTANTIATE_TEST_CASE_P(QuicHttpStreamTests, |
| 308 QuicHttpStreamTest, | 315 QuicHttpStreamTest, |
| 309 ::testing::Values(true, false)); | 316 ::testing::Values(true, false)); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 461 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), | 468 stream_->ReadResponseBody(read_buffer_.get(), read_buffer_->size(), |
| 462 callback_.callback())); | 469 callback_.callback())); |
| 463 | 470 |
| 464 EXPECT_TRUE(stream_->IsResponseBodyComplete()); | 471 EXPECT_TRUE(stream_->IsResponseBodyComplete()); |
| 465 EXPECT_TRUE(AtEof()); | 472 EXPECT_TRUE(AtEof()); |
| 466 } | 473 } |
| 467 | 474 |
| 468 TEST_P(QuicHttpStreamTest, DestroyedEarly) { | 475 TEST_P(QuicHttpStreamTest, DestroyedEarly) { |
| 469 SetRequestString("GET", "/"); | 476 SetRequestString("GET", "/"); |
| 470 AddWrite(SYNCHRONOUS, ConstructDataPacket(1, kFin, 0, request_data_)); | 477 AddWrite(SYNCHRONOUS, ConstructDataPacket(1, kFin, 0, request_data_)); |
| 471 AddWrite(SYNCHRONOUS, ConstructRstPacket(2, 3, request_data_.length())); | 478 AddWrite(SYNCHRONOUS, ConstructRstPacket(2, 3)); |
| 472 AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 2)); | 479 AddWrite(SYNCHRONOUS, ConstructAckPacket(3, 2, 2)); |
| 473 use_closing_stream_ = true; | 480 use_closing_stream_ = true; |
| 474 Initialize(); | 481 Initialize(); |
| 475 | 482 |
| 476 request_.method = "GET"; | 483 request_.method = "GET"; |
| 477 request_.url = GURL("http://www.google.com/"); | 484 request_.url = GURL("http://www.google.com/"); |
| 478 | 485 |
| 479 EXPECT_EQ(OK, stream_->InitializeStream(&request_, net_log_, | 486 EXPECT_EQ(OK, stream_->InitializeStream(&request_, net_log_, |
| 480 callback_.callback())); | 487 callback_.callback())); |
| 481 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, | 488 EXPECT_EQ(OK, stream_->SendRequest(headers_, &response_, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 496 | 503 |
| 497 // In the course of processing this packet, the QuicHttpStream close itself. | 504 // In the course of processing this packet, the QuicHttpStream close itself. |
| 498 ProcessPacket(*resp); | 505 ProcessPacket(*resp); |
| 499 | 506 |
| 500 EXPECT_TRUE(AtEof()); | 507 EXPECT_TRUE(AtEof()); |
| 501 } | 508 } |
| 502 | 509 |
| 503 } // namespace test | 510 } // namespace test |
| 504 | 511 |
| 505 } // namespace net | 512 } // namespace net |
| OLD | NEW |