Chromium Code Reviews| 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 <vector> | |
| 6 | |
| 5 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 6 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 7 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| 9 #include "net/base/capturing_net_log.h" | 11 #include "net/base/capturing_net_log.h" |
| 10 #include "net/base/net_log_unittest.h" | 12 #include "net/base/net_log_unittest.h" |
| 11 #include "net/base/test_completion_callback.h" | 13 #include "net/base/test_completion_callback.h" |
| 12 #include "net/cert/mock_cert_verifier.h" | 14 #include "net/cert/mock_cert_verifier.h" |
| 13 #include "net/dns/mock_host_resolver.h" | 15 #include "net/dns/mock_host_resolver.h" |
| 14 #include "net/http/http_auth_handler_factory.h" | 16 #include "net/http/http_auth_handler_factory.h" |
| 15 #include "net/http/http_network_session.h" | 17 #include "net/http/http_network_session.h" |
| 16 #include "net/http/http_network_transaction.h" | 18 #include "net/http/http_network_transaction.h" |
| 17 #include "net/http/http_server_properties_impl.h" | 19 #include "net/http/http_server_properties_impl.h" |
| 18 #include "net/http/http_stream.h" | 20 #include "net/http/http_stream.h" |
| 19 #include "net/http/http_stream_factory.h" | 21 #include "net/http/http_stream_factory.h" |
| 20 #include "net/http/http_transaction_unittest.h" | 22 #include "net/http/http_transaction_unittest.h" |
| 21 #include "net/http/transport_security_state.h" | 23 #include "net/http/transport_security_state.h" |
| 22 #include "net/proxy/proxy_config_service_fixed.h" | 24 #include "net/proxy/proxy_config_service_fixed.h" |
| 23 #include "net/proxy/proxy_resolver.h" | 25 #include "net/proxy/proxy_resolver.h" |
| 24 #include "net/proxy/proxy_service.h" | 26 #include "net/proxy/proxy_service.h" |
| 25 #include "net/quic/crypto/quic_decrypter.h" | 27 #include "net/quic/crypto/quic_decrypter.h" |
| 26 #include "net/quic/crypto/quic_encrypter.h" | 28 #include "net/quic/crypto/quic_encrypter.h" |
| 27 #include "net/quic/quic_framer.h" | 29 #include "net/quic/quic_framer.h" |
| 28 #include "net/quic/quic_http_utils.h" | 30 #include "net/quic/quic_http_utils.h" |
| 29 #include "net/quic/test_tools/crypto_test_utils.h" | 31 #include "net/quic/test_tools/crypto_test_utils.h" |
| 30 #include "net/quic/test_tools/mock_clock.h" | 32 #include "net/quic/test_tools/mock_clock.h" |
| 31 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h" | 33 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h" |
| 32 #include "net/quic/test_tools/mock_random.h" | 34 #include "net/quic/test_tools/mock_random.h" |
| 35 #include "net/quic/test_tools/quic_test_packet_maker.h" | |
| 33 #include "net/quic/test_tools/quic_test_utils.h" | 36 #include "net/quic/test_tools/quic_test_utils.h" |
| 34 #include "net/socket/client_socket_factory.h" | 37 #include "net/socket/client_socket_factory.h" |
| 35 #include "net/socket/mock_client_socket_pool_manager.h" | 38 #include "net/socket/mock_client_socket_pool_manager.h" |
| 36 #include "net/socket/socket_test_util.h" | 39 #include "net/socket/socket_test_util.h" |
| 37 #include "net/socket/ssl_client_socket.h" | 40 #include "net/socket/ssl_client_socket.h" |
| 38 #include "net/spdy/spdy_frame_builder.h" | 41 #include "net/spdy/spdy_frame_builder.h" |
| 39 #include "net/spdy/spdy_framer.h" | 42 #include "net/spdy/spdy_framer.h" |
| 40 #include "net/ssl/ssl_config_service_defaults.h" | 43 #include "net/ssl/ssl_config_service_defaults.h" |
| 41 #include "testing/gtest/include/gtest/gtest.h" | 44 #include "testing/gtest/include/gtest/gtest.h" |
| 42 #include "testing/platform_test.h" | 45 #include "testing/platform_test.h" |
| 43 | 46 |
| 44 //----------------------------------------------------------------------------- | 47 //----------------------------------------------------------------------------- |
| 45 | 48 |
| 46 namespace { | 49 namespace { |
| 47 | 50 |
| 48 // This is the expected return from a current server advertising QUIC. | 51 // This is the expected return from a current server advertising QUIC. |
| 49 static const char kQuicAlternateProtocolHttpHeader[] = | 52 static const char kQuicAlternateProtocolHttpHeader[] = |
| 50 "Alternate-Protocol: 80:quic\r\n\r\n"; | 53 "Alternate-Protocol: 80:quic\r\n\r\n"; |
| 51 static const char kQuicAlternateProtocolHttpsHeader[] = | 54 static const char kQuicAlternateProtocolHttpsHeader[] = |
| 52 "Alternate-Protocol: 443:quic\r\n\r\n"; | 55 "Alternate-Protocol: 443:quic\r\n\r\n"; |
| 56 | |
| 53 } // namespace | 57 } // namespace |
| 54 | 58 |
| 55 namespace net { | 59 namespace net { |
| 56 namespace test { | 60 namespace test { |
| 57 | 61 |
| 58 class QuicNetworkTransactionTest : public PlatformTest { | 62 // Helper class to encapsulate MockReads and MockWrites for QUIC. |
| 63 // Simplify ownership issues and the interaction with the MockSocketFactory. | |
| 64 class MockQuicData { | |
| 65 public: | |
| 66 ~MockQuicData() { | |
| 67 STLDeleteElements(&packets_); | |
| 68 | |
|
jar (doing other things)
2013/12/20 00:53:12
nit: delete line
Ryan Hamilton
2013/12/20 01:55:02
Done.
| |
| 69 } | |
| 70 | |
| 71 void AddRead(scoped_ptr<QuicEncryptedPacket> packet) { | |
| 72 reads_.push_back(MockRead(SYNCHRONOUS, packet->data(), packet->length(), | |
| 73 sequence_number_++)); | |
| 74 packets_.push_back(packet.release()); | |
| 75 } | |
| 76 | |
| 77 void AddRead(IoMode mode, int rv) { | |
| 78 reads_.push_back(MockRead(mode, rv)); | |
| 79 } | |
| 80 | |
| 81 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) { | |
| 82 writes_.push_back(MockWrite(SYNCHRONOUS, packet->data(), packet->length(), | |
| 83 sequence_number_++)); | |
| 84 packets_.push_back(packet.release()); | |
| 85 } | |
| 86 | |
| 87 void AddDelayedSocketDataToFactory(MockClientSocketFactory* factory, | |
| 88 size_t delay) { | |
| 89 socket_data_.reset(new DelayedSocketData( | |
| 90 delay, reads_.data(), reads_.size(), writes_.data(), writes_.size())); | |
| 91 factory->AddSocketDataProvider(socket_data_.get()); | |
| 92 } | |
| 93 | |
| 94 private: | |
| 95 std::vector<QuicEncryptedPacket*> packets_; | |
| 96 std::vector<MockWrite> writes_; | |
| 97 std::vector<MockRead> reads_; | |
| 98 size_t sequence_number_; | |
| 99 scoped_ptr<SocketDataProvider> socket_data_; | |
| 100 }; | |
| 101 | |
| 102 class QuicNetworkTransactionTest | |
| 103 : public PlatformTest, | |
| 104 public testing::WithParamInterface<QuicVersion> { | |
| 59 protected: | 105 protected: |
| 60 QuicNetworkTransactionTest() | 106 QuicNetworkTransactionTest() |
| 61 : clock_(new MockClock), | 107 : maker_(GetParam(), 0), |
| 108 clock_(new MockClock), | |
| 62 ssl_config_service_(new SSLConfigServiceDefaults), | 109 ssl_config_service_(new SSLConfigServiceDefaults), |
| 63 proxy_service_(ProxyService::CreateDirect()), | 110 proxy_service_(ProxyService::CreateDirect()), |
| 64 compressor_(new QuicSpdyCompressor()), | |
| 65 auth_handler_factory_( | 111 auth_handler_factory_( |
| 66 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), | 112 HttpAuthHandlerFactory::CreateDefault(&host_resolver_)), |
| 67 random_generator_(0), | 113 random_generator_(0), |
| 68 hanging_data_(NULL, 0, NULL, 0) { | 114 hanging_data_(NULL, 0, NULL, 0) { |
| 69 request_.method = "GET"; | 115 request_.method = "GET"; |
| 70 request_.url = GURL("http://www.google.com/"); | 116 request_.url = GURL("http://www.google.com/"); |
| 71 request_.load_flags = 0; | 117 request_.load_flags = 0; |
| 72 } | 118 } |
| 73 | 119 |
| 74 virtual void SetUp() { | 120 virtual void SetUp() { |
| 75 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 121 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 76 base::MessageLoop::current()->RunUntilIdle(); | 122 base::MessageLoop::current()->RunUntilIdle(); |
| 77 } | 123 } |
| 78 | 124 |
| 79 virtual void TearDown() { | 125 virtual void TearDown() { |
| 80 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 126 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 81 // Empty the current queue. | 127 // Empty the current queue. |
| 82 base::MessageLoop::current()->RunUntilIdle(); | 128 base::MessageLoop::current()->RunUntilIdle(); |
| 83 PlatformTest::TearDown(); | 129 PlatformTest::TearDown(); |
| 84 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); | 130 NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); |
| 85 base::MessageLoop::current()->RunUntilIdle(); | 131 base::MessageLoop::current()->RunUntilIdle(); |
| 86 HttpStreamFactory::set_use_alternate_protocols(false); | 132 HttpStreamFactory::set_use_alternate_protocols(false); |
| 87 HttpStreamFactory::SetNextProtos(std::vector<NextProto>()); | 133 HttpStreamFactory::SetNextProtos(std::vector<NextProto>()); |
| 88 } | 134 } |
| 89 | 135 |
| 90 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket( | 136 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket( |
| 91 QuicPacketSequenceNumber num, | 137 QuicPacketSequenceNumber num, |
| 92 QuicStreamId stream_id) { | 138 QuicStreamId stream_id) { |
| 93 QuicPacketHeader header; | 139 return maker_.MakeRstPacket( |
| 94 header.public_header.guid = random_generator_.RandUint64(); | 140 num, false, stream_id, QUIC_STREAM_NO_ERROR); |
| 95 header.public_header.reset_flag = false; | |
| 96 header.public_header.version_flag = false; | |
| 97 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
| 98 header.packet_sequence_number = num; | |
| 99 header.entropy_flag = false; | |
| 100 header.fec_flag = false; | |
| 101 header.fec_group = 0; | |
| 102 | |
| 103 QuicRstStreamFrame rst(stream_id, QUIC_STREAM_NO_ERROR); | |
| 104 return scoped_ptr<QuicEncryptedPacket>( | |
| 105 ConstructPacket(header, QuicFrame(&rst))); | |
| 106 } | 141 } |
| 107 | 142 |
| 108 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( | 143 scoped_ptr<QuicEncryptedPacket> ConstructConnectionClosePacket( |
| 109 QuicPacketSequenceNumber num) { | 144 QuicPacketSequenceNumber num) { |
| 110 QuicPacketHeader header; | 145 return maker_.MakeConnectionClosePacket(num); |
| 111 header.public_header.guid = random_generator_.RandUint64(); | |
| 112 header.public_header.reset_flag = false; | |
| 113 header.public_header.version_flag = false; | |
| 114 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
| 115 header.packet_sequence_number = num; | |
| 116 header.entropy_flag = false; | |
| 117 header.fec_flag = false; | |
| 118 header.fec_group = 0; | |
| 119 | |
| 120 QuicConnectionCloseFrame close; | |
| 121 close.error_code = QUIC_CRYPTO_VERSION_NOT_SUPPORTED; | |
| 122 close.error_details = "Time to panic!"; | |
| 123 return scoped_ptr<QuicEncryptedPacket>( | |
| 124 ConstructPacket(header, QuicFrame(&close))); | |
| 125 } | 146 } |
| 126 | 147 |
| 127 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( | 148 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket( |
| 128 QuicPacketSequenceNumber largest_received, | 149 QuicPacketSequenceNumber largest_received, |
| 129 QuicPacketSequenceNumber least_unacked) { | 150 QuicPacketSequenceNumber least_unacked) { |
| 130 QuicPacketHeader header; | 151 return maker_.MakeAckPacket(2, largest_received, least_unacked, true); |
| 131 header.public_header.guid = random_generator_.RandUint64(); | 152 } |
| 132 header.public_header.reset_flag = false; | |
| 133 header.public_header.version_flag = false; | |
| 134 header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | |
| 135 header.packet_sequence_number = 2; | |
| 136 header.entropy_flag = false; | |
| 137 header.fec_flag = false; | |
| 138 header.fec_group = 0; | |
| 139 | 153 |
| 140 QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked); | 154 SpdyHeaderBlock GetRequestHeaders(const std::string& method, |
| 141 | 155 const std::string& scheme, |
| 142 QuicCongestionFeedbackFrame feedback; | 156 const std::string& path) { |
| 143 feedback.type = kTCP; | 157 return maker_.GetRequestHeaders(method, scheme, path); |
| 144 feedback.tcp.accumulated_number_of_lost_packets = 0; | |
| 145 feedback.tcp.receive_window = 256000; | |
| 146 | |
| 147 QuicFramer framer(QuicSupportedVersions(), QuicTime::Zero(), false); | |
| 148 QuicFrames frames; | |
| 149 frames.push_back(QuicFrame(&ack)); | |
| 150 frames.push_back(QuicFrame(&feedback)); | |
| 151 scoped_ptr<QuicPacket> packet( | |
| 152 framer.BuildUnsizedDataPacket(header, frames).packet); | |
| 153 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( | |
| 154 ENCRYPTION_NONE, header.packet_sequence_number, *packet)); | |
| 155 } | 158 } |
| 156 | 159 |
| 157 std::string GetRequestString(const std::string& method, | 160 std::string GetRequestString(const std::string& method, |
| 158 const std::string& scheme, | 161 const std::string& scheme, |
| 159 const std::string& path) { | 162 const std::string& path) { |
| 160 SpdyHeaderBlock headers; | 163 return maker_.GetRequestString(method, scheme, path); |
| 161 headers[":method"] = method; | 164 } |
| 162 headers[":host"] = "www.google.com"; | 165 |
| 163 headers[":path"] = path; | 166 SpdyHeaderBlock GetResponseHeaders(const std::string& status) { |
| 164 headers[":scheme"] = scheme; | 167 return maker_.GetResponseHeaders(status); |
| 165 headers[":version"] = "HTTP/1.1"; | |
| 166 return SerializeHeaderBlock(headers); | |
| 167 } | 168 } |
| 168 | 169 |
| 169 std::string GetResponseString(const std::string& status, | 170 std::string GetResponseString(const std::string& status, |
| 170 const std::string& body) { | 171 const std::string& body) { |
| 171 SpdyHeaderBlock headers; | 172 return maker_.GetResponseString(status, body); |
| 172 headers[":status"] = status; | |
| 173 headers[":version"] = "HTTP/1.1"; | |
| 174 headers["content-type"] = "text/plain"; | |
| 175 return compressor_->CompressHeaders(headers) + body; | |
| 176 } | 173 } |
| 177 | 174 |
| 178 std::string SerializeHeaderBlock(const SpdyHeaderBlock& headers) { | 175 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket( |
| 179 QuicSpdyCompressor compressor; | |
| 180 return compressor.CompressHeadersWithPriority( | |
| 181 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), headers); | |
| 182 } | |
| 183 | |
| 184 // Returns a newly created packet to send kData on stream 1. | |
| 185 QuicEncryptedPacket* ConstructDataPacket( | |
| 186 QuicPacketSequenceNumber sequence_number, | 176 QuicPacketSequenceNumber sequence_number, |
| 187 QuicStreamId stream_id, | 177 QuicStreamId stream_id, |
| 188 bool should_include_version, | 178 bool should_include_version, |
| 189 bool fin, | 179 bool fin, |
| 190 QuicStreamOffset offset, | 180 QuicStreamOffset offset, |
| 191 base::StringPiece data) { | 181 base::StringPiece data) { |
| 192 InitializeHeader(sequence_number, should_include_version); | 182 return maker_.MakeDataPacket( |
| 193 QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data)); | 183 sequence_number, stream_id, should_include_version, fin, offset, data); |
| 194 return ConstructPacket(header_, QuicFrame(&frame)).release(); | |
| 195 } | 184 } |
| 196 | 185 |
| 197 scoped_ptr<QuicEncryptedPacket> ConstructPacket( | 186 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket( |
| 198 const QuicPacketHeader& header, | 187 QuicPacketSequenceNumber sequence_number, |
| 199 const QuicFrame& frame) { | 188 QuicStreamId stream_id, |
| 200 QuicFramer framer(QuicSupportedVersions(), QuicTime::Zero(), false); | 189 bool should_include_version, |
| 201 QuicFrames frames; | 190 bool fin, |
| 202 frames.push_back(frame); | 191 const SpdyHeaderBlock& headers) { |
| 203 scoped_ptr<QuicPacket> packet( | 192 return maker_.MakeRequestHeadersPacket( |
| 204 framer.BuildUnsizedDataPacket(header, frames).packet); | 193 sequence_number, stream_id, should_include_version, fin, headers); |
| 205 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( | |
| 206 ENCRYPTION_NONE, header.packet_sequence_number, *packet)); | |
| 207 } | 194 } |
| 208 | 195 |
| 209 void InitializeHeader(QuicPacketSequenceNumber sequence_number, | 196 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket( |
| 210 bool should_include_version) { | 197 QuicPacketSequenceNumber sequence_number, |
| 211 header_.public_header.guid = random_generator_.RandUint64(); | 198 QuicStreamId stream_id, |
| 212 header_.public_header.reset_flag = false; | 199 bool should_include_version, |
| 213 header_.public_header.version_flag = should_include_version; | 200 bool fin, |
| 214 header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; | 201 const SpdyHeaderBlock& headers) { |
| 215 header_.packet_sequence_number = sequence_number; | 202 return maker_.MakeResponseHeadersPacket( |
| 216 header_.fec_group = 0; | 203 sequence_number, stream_id, should_include_version, fin, headers); |
| 217 header_.entropy_flag = false; | |
| 218 header_.fec_flag = false; | |
| 219 } | 204 } |
| 220 | 205 |
| 221 void CreateSession() { | 206 void CreateSession() { |
| 222 CreateSessionWithFactory(&socket_factory_); | 207 CreateSessionWithFactory(&socket_factory_); |
| 223 } | 208 } |
| 224 | 209 |
| 225 void CreateSessionWithFactory(ClientSocketFactory* socket_factory) { | 210 void CreateSessionWithFactory(ClientSocketFactory* socket_factory) { |
| 226 params_.enable_quic = true; | 211 params_.enable_quic = true; |
| 227 params_.quic_clock = clock_; | 212 params_.quic_clock = clock_; |
| 228 params_.quic_random = &random_generator_; | 213 params_.quic_random = &random_generator_; |
| 229 params_.client_socket_factory = socket_factory; | 214 params_.client_socket_factory = socket_factory; |
| 230 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; | 215 params_.quic_crypto_client_stream_factory = &crypto_client_stream_factory_; |
| 231 params_.host_resolver = &host_resolver_; | 216 params_.host_resolver = &host_resolver_; |
| 232 params_.cert_verifier = &cert_verifier_; | 217 params_.cert_verifier = &cert_verifier_; |
| 233 params_.transport_security_state = &transport_security_state_; | 218 params_.transport_security_state = &transport_security_state_; |
| 234 params_.proxy_service = proxy_service_.get(); | 219 params_.proxy_service = proxy_service_.get(); |
| 235 params_.ssl_config_service = ssl_config_service_.get(); | 220 params_.ssl_config_service = ssl_config_service_.get(); |
| 236 params_.http_auth_handler_factory = auth_handler_factory_.get(); | 221 params_.http_auth_handler_factory = auth_handler_factory_.get(); |
| 237 params_.http_server_properties = http_server_properties.GetWeakPtr(); | 222 params_.http_server_properties = http_server_properties.GetWeakPtr(); |
| 223 params_.quic_supported_versions = SupportedVersions(GetParam()); | |
| 238 | 224 |
| 239 session_ = new HttpNetworkSession(params_); | 225 session_ = new HttpNetworkSession(params_); |
| 240 session_->quic_stream_factory()->set_require_confirmation(false); | 226 session_->quic_stream_factory()->set_require_confirmation(false); |
| 241 } | 227 } |
| 242 | 228 |
| 243 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) { | 229 void CheckWasQuicResponse(const scoped_ptr<HttpNetworkTransaction>& trans) { |
| 244 const HttpResponseInfo* response = trans->GetResponseInfo(); | 230 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 245 ASSERT_TRUE(response != NULL); | 231 ASSERT_TRUE(response != NULL); |
| 246 ASSERT_TRUE(response->headers.get() != NULL); | 232 ASSERT_TRUE(response->headers.get() != NULL); |
| 247 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 233 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 307 HostPortPair::FromURL(request_.url)); | 293 HostPortPair::FromURL(request_.url)); |
| 308 EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN, alternate.protocol); | 294 EXPECT_EQ(ALTERNATE_PROTOCOL_BROKEN, alternate.protocol); |
| 309 } | 295 } |
| 310 | 296 |
| 311 void AddHangingNonAlternateProtocolSocketData() { | 297 void AddHangingNonAlternateProtocolSocketData() { |
| 312 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); | 298 MockConnect hanging_connect(SYNCHRONOUS, ERR_IO_PENDING); |
| 313 hanging_data_.set_connect_data(hanging_connect); | 299 hanging_data_.set_connect_data(hanging_connect); |
| 314 socket_factory_.AddSocketDataProvider(&hanging_data_); | 300 socket_factory_.AddSocketDataProvider(&hanging_data_); |
| 315 } | 301 } |
| 316 | 302 |
| 317 QuicPacketHeader header_; | 303 QuicTestPacketMaker maker_; |
| 318 scoped_refptr<HttpNetworkSession> session_; | 304 scoped_refptr<HttpNetworkSession> session_; |
| 319 MockClientSocketFactory socket_factory_; | 305 MockClientSocketFactory socket_factory_; |
| 320 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 306 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
| 321 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. | 307 MockClock* clock_; // Owned by QuicStreamFactory after CreateSession. |
| 322 MockHostResolver host_resolver_; | 308 MockHostResolver host_resolver_; |
| 323 MockCertVerifier cert_verifier_; | 309 MockCertVerifier cert_verifier_; |
| 324 TransportSecurityState transport_security_state_; | 310 TransportSecurityState transport_security_state_; |
| 325 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; | 311 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service_; |
| 326 scoped_ptr<ProxyService> proxy_service_; | 312 scoped_ptr<ProxyService> proxy_service_; |
| 327 scoped_ptr<QuicSpdyCompressor> compressor_; | |
| 328 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; | 313 scoped_ptr<HttpAuthHandlerFactory> auth_handler_factory_; |
| 329 MockRandom random_generator_; | 314 MockRandom random_generator_; |
| 330 HttpServerPropertiesImpl http_server_properties; | 315 HttpServerPropertiesImpl http_server_properties; |
| 331 HttpNetworkSession::Params params_; | 316 HttpNetworkSession::Params params_; |
| 332 HttpRequestInfo request_; | 317 HttpRequestInfo request_; |
| 333 CapturingBoundNetLog net_log_; | 318 CapturingBoundNetLog net_log_; |
| 334 StaticSocketDataProvider hanging_data_; | 319 StaticSocketDataProvider hanging_data_; |
| 335 }; | 320 }; |
| 336 | 321 |
| 337 TEST_F(QuicNetworkTransactionTest, ForceQuic) { | 322 INSTANTIATE_TEST_CASE_P(Version, QuicNetworkTransactionTest, |
| 323 ::testing::ValuesIn(QuicSupportedVersions())); | |
| 324 | |
| 325 TEST_P(QuicNetworkTransactionTest, ForceQuic) { | |
| 338 params_.origin_to_force_quic_on = | 326 params_.origin_to_force_quic_on = |
| 339 HostPortPair::FromString("www.google.com:80"); | 327 HostPortPair::FromString("www.google.com:80"); |
| 340 | 328 |
| 341 QuicStreamId stream_id = 3; | 329 QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3; |
| 342 scoped_ptr<QuicEncryptedPacket> req( | 330 MockQuicData mock_quic_data; |
| 343 ConstructDataPacket(1, stream_id, true, true, 0, | 331 if (GetParam() > QUIC_VERSION_12) { |
| 344 GetRequestString("GET", "http", "/"))); | 332 mock_quic_data.AddWrite( |
| 345 scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0)); | 333 ConstructRequestHeadersPacket(1, stream_id, true, true, |
| 334 GetRequestHeaders("GET", "http", "/"))); | |
| 335 mock_quic_data.AddRead( | |
| 336 ConstructResponseHeadersPacket(1, stream_id, false, false, | |
| 337 GetResponseHeaders("200 OK"))); | |
| 338 mock_quic_data.AddRead( | |
| 339 ConstructDataPacket(2, stream_id, false, true, 0, "hello!")); | |
| 340 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | |
| 341 } else { | |
| 342 mock_quic_data.AddWrite( | |
| 343 ConstructDataPacket(1, stream_id, true, true, 0, | |
| 344 GetRequestString("GET", "http", "/"))); | |
| 345 mock_quic_data.AddRead( | |
| 346 ConstructDataPacket(1, stream_id, false, true, 0, | |
| 347 GetResponseString("200 OK", "hello!"))); | |
| 348 mock_quic_data.AddWrite(ConstructAckPacket(1, 0)); | |
| 349 } | |
| 350 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | |
| 346 | 351 |
| 347 MockWrite quic_writes[] = { | 352 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 348 MockWrite(SYNCHRONOUS, req->data(), req->length()), | |
| 349 MockWrite(SYNCHRONOUS, ack->data(), ack->length()), | |
| 350 }; | |
| 351 | |
| 352 scoped_ptr<QuicEncryptedPacket> resp( | |
| 353 ConstructDataPacket( | |
| 354 1, stream_id, false, true, 0, GetResponseString("200 OK", "hello!"))); | |
| 355 MockRead quic_reads[] = { | |
| 356 MockRead(SYNCHRONOUS, resp->data(), resp->length()), | |
| 357 MockRead(ASYNC, OK), // EOF | |
| 358 }; | |
| 359 | |
| 360 DelayedSocketData quic_data( | |
| 361 1, // wait for one write to finish before reading. | |
| 362 quic_reads, arraysize(quic_reads), | |
| 363 quic_writes, arraysize(quic_writes)); | |
| 364 | |
| 365 socket_factory_.AddSocketDataProvider(&quic_data); | |
| 366 | 353 |
| 367 // The non-alternate protocol job needs to hang in order to guarantee that | 354 // The non-alternate protocol job needs to hang in order to guarantee that |
| 368 // the alternate-protocol job will "win". | 355 // the alternate-protocol job will "win". |
| 369 AddHangingNonAlternateProtocolSocketData(); | 356 AddHangingNonAlternateProtocolSocketData(); |
| 370 | 357 |
| 371 CreateSession(); | 358 CreateSession(); |
| 372 | 359 |
| 373 SendRequestAndExpectQuicResponse("hello!"); | 360 SendRequestAndExpectQuicResponse("hello!"); |
| 374 | 361 |
| 375 // Check that the NetLog was filled reasonably. | 362 // Check that the NetLog was filled reasonably. |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 398 | 385 |
| 399 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED. | 386 // ... and also a QUIC_SESSION_STREAM_FRAME_RECEIVED. |
| 400 pos = net::ExpectLogContainsSomewhere( | 387 pos = net::ExpectLogContainsSomewhere( |
| 401 entries, 0, | 388 entries, 0, |
| 402 net::NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED, | 389 net::NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED, |
| 403 net::NetLog::PHASE_NONE); | 390 net::NetLog::PHASE_NONE); |
| 404 EXPECT_LT(0, pos); | 391 EXPECT_LT(0, pos); |
| 405 | 392 |
| 406 int log_stream_id; | 393 int log_stream_id; |
| 407 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id)); | 394 ASSERT_TRUE(entries[pos].GetIntegerValue("stream_id", &log_stream_id)); |
| 408 EXPECT_EQ(stream_id, static_cast<QuicStreamId>(log_stream_id)); | 395 EXPECT_EQ(3, log_stream_id); |
| 409 } | 396 } |
| 410 | 397 |
| 411 TEST_F(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) { | 398 TEST_P(QuicNetworkTransactionTest, ForceQuicWithErrorConnecting) { |
| 412 params_.origin_to_force_quic_on = | 399 params_.origin_to_force_quic_on = |
| 413 HostPortPair::FromString("www.google.com:80"); | 400 HostPortPair::FromString("www.google.com:80"); |
| 414 | 401 |
| 415 MockRead quic_reads[] = { | 402 MockQuicData mock_quic_data; |
| 416 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 403 mock_quic_data.AddRead(ASYNC, ERR_SOCKET_NOT_CONNECTED); |
| 417 }; | 404 |
| 418 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 405 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 0); |
| 419 NULL, 0); | |
| 420 socket_factory_.AddSocketDataProvider(&quic_data); | |
| 421 | 406 |
| 422 CreateSession(); | 407 CreateSession(); |
| 423 | 408 |
| 424 scoped_ptr<HttpNetworkTransaction> trans( | 409 scoped_ptr<HttpNetworkTransaction> trans( |
| 425 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 410 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 426 TestCompletionCallback callback; | 411 TestCompletionCallback callback; |
| 427 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 412 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 428 EXPECT_EQ(ERR_IO_PENDING, rv); | 413 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 429 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); | 414 EXPECT_EQ(ERR_CONNECTION_CLOSED, callback.WaitForResult()); |
| 430 } | 415 } |
| 431 | 416 |
| 432 TEST_F(QuicNetworkTransactionTest, DoNotForceQuicForHttps) { | 417 TEST_P(QuicNetworkTransactionTest, DoNotForceQuicForHttps) { |
| 433 // Attempt to "force" quic on 443, which will not be honored. | 418 // Attempt to "force" quic on 443, which will not be honored. |
| 434 params_.origin_to_force_quic_on = | 419 params_.origin_to_force_quic_on = |
| 435 HostPortPair::FromString("www.google.com:443"); | 420 HostPortPair::FromString("www.google.com:443"); |
| 436 | 421 |
| 437 MockRead http_reads[] = { | 422 MockRead http_reads[] = { |
| 438 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 423 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 439 MockRead("hello world"), | 424 MockRead("hello world"), |
| 440 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 425 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 441 MockRead(ASYNC, OK) | 426 MockRead(ASYNC, OK) |
| 442 }; | 427 }; |
| 443 | 428 |
| 444 StaticSocketDataProvider data(http_reads, arraysize(http_reads), NULL, 0); | 429 StaticSocketDataProvider data(http_reads, arraysize(http_reads), NULL, 0); |
| 445 socket_factory_.AddSocketDataProvider(&data); | 430 socket_factory_.AddSocketDataProvider(&data); |
| 446 SSLSocketDataProvider ssl(ASYNC, OK); | 431 SSLSocketDataProvider ssl(ASYNC, OK); |
| 447 socket_factory_.AddSSLSocketDataProvider(&ssl); | 432 socket_factory_.AddSSLSocketDataProvider(&ssl); |
| 448 | 433 |
| 449 CreateSession(); | 434 CreateSession(); |
| 450 | 435 |
| 451 SendRequestAndExpectHttpResponse("hello world"); | 436 SendRequestAndExpectHttpResponse("hello world"); |
| 452 } | 437 } |
| 453 | 438 |
| 454 TEST_F(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { | 439 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuic) { |
| 455 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | 440 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. |
| 456 | 441 |
| 457 MockRead http_reads[] = { | 442 MockRead http_reads[] = { |
| 458 MockRead("HTTP/1.1 200 OK\r\n"), | 443 MockRead("HTTP/1.1 200 OK\r\n"), |
| 459 MockRead(kQuicAlternateProtocolHttpHeader), | 444 MockRead(kQuicAlternateProtocolHttpHeader), |
| 460 MockRead("hello world"), | 445 MockRead("hello world"), |
| 461 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 446 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 462 MockRead(ASYNC, OK) | 447 MockRead(ASYNC, OK) |
| 463 }; | 448 }; |
| 464 | 449 |
| 465 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 450 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 466 NULL, 0); | 451 NULL, 0); |
| 467 socket_factory_.AddSocketDataProvider(&http_data); | 452 socket_factory_.AddSocketDataProvider(&http_data); |
| 468 | 453 |
| 469 scoped_ptr<QuicEncryptedPacket> req( | 454 QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3; |
| 470 ConstructDataPacket(1, 3, true, true, 0, | 455 MockQuicData mock_quic_data; |
| 471 GetRequestString("GET", "http", "/"))); | 456 if (GetParam() > QUIC_VERSION_12) { |
| 472 scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0)); | 457 mock_quic_data.AddWrite( |
| 458 ConstructRequestHeadersPacket(1, stream_id, true, true, | |
| 459 GetRequestHeaders("GET", "http", "/"))); | |
| 460 mock_quic_data.AddRead( | |
| 461 ConstructResponseHeadersPacket(1, stream_id, false, false, | |
| 462 GetResponseHeaders("200 OK"))); | |
| 463 mock_quic_data.AddRead( | |
| 464 ConstructDataPacket(2, stream_id, false, true, 0, "hello!")); | |
| 465 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | |
| 466 } else { | |
| 467 mock_quic_data.AddWrite( | |
| 468 ConstructDataPacket(1, stream_id, true, true, 0, | |
| 469 GetRequestString("GET", "http", "/"))); | |
| 470 mock_quic_data.AddRead( | |
| 471 ConstructDataPacket(1, stream_id, false, true, 0, | |
| 472 GetResponseString("200 OK", "hello!"))); | |
| 473 mock_quic_data.AddWrite(ConstructAckPacket(1, 0)); | |
| 474 } | |
| 475 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | |
| 473 | 476 |
| 474 MockWrite quic_writes[] = { | 477 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 475 MockWrite(SYNCHRONOUS, req->data(), req->length()), | |
| 476 MockWrite(SYNCHRONOUS, ack->data(), ack->length()), | |
| 477 }; | |
| 478 | |
| 479 scoped_ptr<QuicEncryptedPacket> resp( | |
| 480 ConstructDataPacket( | |
| 481 1, 3, false, true, 0, GetResponseString("200 OK", "hello!"))); | |
| 482 MockRead quic_reads[] = { | |
| 483 MockRead(SYNCHRONOUS, resp->data(), resp->length()), | |
| 484 MockRead(ASYNC, OK), // EOF | |
| 485 }; | |
| 486 | |
| 487 DelayedSocketData quic_data( | |
| 488 1, // wait for one write to finish before reading. | |
| 489 quic_reads, arraysize(quic_reads), | |
| 490 quic_writes, arraysize(quic_writes)); | |
| 491 | |
| 492 socket_factory_.AddSocketDataProvider(&quic_data); | |
| 493 | 478 |
| 494 // The non-alternate protocol job needs to hang in order to guarantee that | 479 // The non-alternate protocol job needs to hang in order to guarantee that |
| 495 // the alternate-protocol job will "win". | 480 // the alternate-protocol job will "win". |
| 496 AddHangingNonAlternateProtocolSocketData(); | 481 AddHangingNonAlternateProtocolSocketData(); |
| 497 | 482 |
| 498 CreateSession(); | 483 CreateSession(); |
| 499 | 484 |
| 500 SendRequestAndExpectHttpResponse("hello world"); | 485 SendRequestAndExpectHttpResponse("hello world"); |
| 501 SendRequestAndExpectQuicResponse("hello!"); | 486 SendRequestAndExpectQuicResponse("hello!"); |
| 502 } | 487 } |
| 503 | 488 |
| 504 TEST_F(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { | 489 TEST_P(QuicNetworkTransactionTest, UseAlternateProtocolForQuicForHttps) { |
| 505 params_.origin_to_force_quic_on = | 490 params_.origin_to_force_quic_on = |
| 506 HostPortPair::FromString("www.google.com:443"); | 491 HostPortPair::FromString("www.google.com:443"); |
| 507 params_.enable_quic_https = true; | 492 params_.enable_quic_https = true; |
| 508 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | 493 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. |
| 509 | 494 |
| 510 MockRead http_reads[] = { | 495 MockRead http_reads[] = { |
| 511 MockRead("HTTP/1.1 200 OK\r\n"), | 496 MockRead("HTTP/1.1 200 OK\r\n"), |
| 512 MockRead(kQuicAlternateProtocolHttpsHeader), | 497 MockRead(kQuicAlternateProtocolHttpsHeader), |
| 513 MockRead("hello world"), | 498 MockRead("hello world"), |
| 514 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 499 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 547 // The non-alternate protocol job needs to hang in order to guarantee that | 532 // The non-alternate protocol job needs to hang in order to guarantee that |
| 548 // the alternate-protocol job will "win". | 533 // the alternate-protocol job will "win". |
| 549 AddHangingNonAlternateProtocolSocketData(); | 534 AddHangingNonAlternateProtocolSocketData(); |
| 550 | 535 |
| 551 CreateSession(); | 536 CreateSession(); |
| 552 | 537 |
| 553 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). | 538 // TODO(rtenneti): Test QUIC over HTTPS, GetSSLInfo(). |
| 554 SendRequestAndExpectHttpResponse("hello world"); | 539 SendRequestAndExpectHttpResponse("hello world"); |
| 555 } | 540 } |
| 556 | 541 |
| 557 TEST_F(QuicNetworkTransactionTest, HungAlternateProtocol) { | 542 TEST_P(QuicNetworkTransactionTest, HungAlternateProtocol) { |
| 558 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | 543 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. |
| 559 crypto_client_stream_factory_.set_handshake_mode( | 544 crypto_client_stream_factory_.set_handshake_mode( |
| 560 MockCryptoClientStream::COLD_START); | 545 MockCryptoClientStream::COLD_START); |
| 561 | 546 |
| 562 MockWrite http_writes[] = { | 547 MockWrite http_writes[] = { |
| 563 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), | 548 MockWrite(SYNCHRONOUS, 0, "GET / HTTP/1.1\r\n"), |
| 564 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), | 549 MockWrite(SYNCHRONOUS, 1, "Host: www.google.com\r\n"), |
| 565 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n") | 550 MockWrite(SYNCHRONOUS, 2, "Connection: keep-alive\r\n\r\n") |
| 566 }; | 551 }; |
| 567 | 552 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 606 // and verify the the transaction continues over HTTP. | 591 // and verify the the transaction continues over HTTP. |
| 607 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes)); | 592 http_data2.StopAfter(arraysize(http_reads) + arraysize(http_writes)); |
| 608 SendRequestAndExpectHttpResponse("hello world"); | 593 SendRequestAndExpectHttpResponse("hello world"); |
| 609 | 594 |
| 610 ASSERT_TRUE(http_data2.at_read_eof()); | 595 ASSERT_TRUE(http_data2.at_read_eof()); |
| 611 ASSERT_TRUE(http_data2.at_write_eof()); | 596 ASSERT_TRUE(http_data2.at_write_eof()); |
| 612 ASSERT_TRUE(!quic_data.at_read_eof()); | 597 ASSERT_TRUE(!quic_data.at_read_eof()); |
| 613 ASSERT_TRUE(!quic_data.at_write_eof()); | 598 ASSERT_TRUE(!quic_data.at_write_eof()); |
| 614 } | 599 } |
| 615 | 600 |
| 616 TEST_F(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) { | 601 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithHttpRace) { |
| 617 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | 602 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. |
| 618 | 603 |
| 619 scoped_ptr<QuicEncryptedPacket> req( | 604 QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3; |
| 620 ConstructDataPacket(1, 3, true, true, 0, | 605 MockQuicData mock_quic_data; |
| 621 GetRequestString("GET", "http", "/"))); | 606 if (GetParam() > QUIC_VERSION_12) { |
| 622 scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0)); | 607 mock_quic_data.AddWrite( |
| 608 ConstructRequestHeadersPacket(1, stream_id, true, true, | |
| 609 GetRequestHeaders("GET", "http", "/"))); | |
| 610 mock_quic_data.AddRead( | |
| 611 ConstructResponseHeadersPacket(1, stream_id, false, false, | |
| 612 GetResponseHeaders("200 OK"))); | |
| 613 mock_quic_data.AddRead( | |
| 614 ConstructDataPacket(2, stream_id, false, true, 0, "hello!")); | |
| 615 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); | |
| 616 } else { | |
| 617 mock_quic_data.AddWrite( | |
| 618 ConstructDataPacket(1, stream_id, true, true, 0, | |
| 619 GetRequestString("GET", "http", "/"))); | |
| 620 mock_quic_data.AddRead( | |
| 621 ConstructDataPacket(1, stream_id, false, true, 0, | |
| 622 GetResponseString("200 OK", "hello!"))); | |
| 623 mock_quic_data.AddWrite(ConstructAckPacket(1, 0)); | |
| 624 } | |
| 625 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF | |
| 623 | 626 |
| 624 MockWrite quic_writes[] = { | 627 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 625 MockWrite(SYNCHRONOUS, req->data(), req->length()), | |
| 626 MockWrite(SYNCHRONOUS, ack->data(), ack->length()), | |
| 627 }; | |
| 628 | |
| 629 scoped_ptr<QuicEncryptedPacket> resp( | |
| 630 ConstructDataPacket( | |
| 631 1, 3, false, true, 0, GetResponseString("200 OK", "hello!"))); | |
| 632 MockRead quic_reads[] = { | |
| 633 MockRead(SYNCHRONOUS, resp->data(), resp->length()), | |
| 634 MockRead(ASYNC, OK), // EOF | |
| 635 }; | |
| 636 | |
| 637 DelayedSocketData quic_data( | |
| 638 1, // wait for one write to finish before reading. | |
| 639 quic_reads, arraysize(quic_reads), | |
| 640 quic_writes, arraysize(quic_writes)); | |
| 641 | |
| 642 socket_factory_.AddSocketDataProvider(&quic_data); | |
| 643 | 628 |
| 644 // The non-alternate protocol job needs to hang in order to guarantee that | 629 // The non-alternate protocol job needs to hang in order to guarantee that |
| 645 // the alternate-protocol job will "win". | 630 // the alternate-protocol job will "win". |
| 646 AddHangingNonAlternateProtocolSocketData(); | 631 AddHangingNonAlternateProtocolSocketData(); |
| 647 | 632 |
| 648 CreateSession(); | 633 CreateSession(); |
| 649 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 634 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 650 SendRequestAndExpectQuicResponse("hello!"); | 635 SendRequestAndExpectQuicResponse("hello!"); |
| 651 } | 636 } |
| 652 | 637 |
| 653 TEST_F(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) { | 638 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithNoHttpRace) { |
| 654 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | 639 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. |
| 655 | 640 |
| 656 scoped_ptr<QuicEncryptedPacket> req( | 641 QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3; |
| 657 ConstructDataPacket(1, 3, true, true, 0, | 642 MockQuicData mock_quic_data; |
| 658 GetRequestString("GET", "http", "/"))); | 643 if (GetParam() > QUIC_VERSION_12) { |
| 659 scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0)); | 644 mock_quic_data.AddWrite( |
| 660 | 645 ConstructRequestHeadersPacket(1, stream_id, true, true, |
| 661 MockWrite quic_writes[] = { | 646 GetRequestHeaders("GET", "http", "/"))); |
| 662 MockWrite(SYNCHRONOUS, req->data(), req->length()), | 647 mock_quic_data.AddRead( |
| 663 MockWrite(SYNCHRONOUS, ack->data(), ack->length()), | 648 ConstructResponseHeadersPacket(1, stream_id, false, false, |
| 664 }; | 649 GetResponseHeaders("200 OK"))); |
| 665 | 650 mock_quic_data.AddRead( |
| 666 scoped_ptr<QuicEncryptedPacket> resp( | 651 ConstructDataPacket(2, stream_id, false, true, 0, "hello!")); |
| 667 ConstructDataPacket( | 652 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 668 1, 3, false, true, 0, GetResponseString("200 OK", "hello!"))); | 653 } else { |
| 669 MockRead quic_reads[] = { | 654 mock_quic_data.AddWrite( |
| 670 MockRead(SYNCHRONOUS, resp->data(), resp->length()), | 655 ConstructDataPacket(1, stream_id, true, true, 0, |
| 671 MockRead(ASYNC, OK), // EOF | 656 GetRequestString("GET", "http", "/"))); |
| 672 }; | 657 mock_quic_data.AddRead( |
| 673 | 658 ConstructDataPacket(1, stream_id, false, true, 0, |
| 674 DelayedSocketData quic_data( | 659 GetResponseString("200 OK", "hello!"))); |
| 675 1, // wait for one write to finish before reading. | 660 mock_quic_data.AddWrite(ConstructAckPacket(1, 0)); |
| 676 quic_reads, arraysize(quic_reads), | 661 } |
| 677 quic_writes, arraysize(quic_writes)); | 662 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 678 | 663 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 679 socket_factory_.AddSocketDataProvider(&quic_data); | |
| 680 | 664 |
| 681 // In order for a new QUIC session to be established via alternate-protocol | 665 // In order for a new QUIC session to be established via alternate-protocol |
| 682 // without racing an HTTP connection, we need the host resolution to happen | 666 // without racing an HTTP connection, we need the host resolution to happen |
| 683 // synchronously. | 667 // synchronously. |
| 684 host_resolver_.set_synchronous_mode(true); | 668 host_resolver_.set_synchronous_mode(true); |
| 685 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); | 669 host_resolver_.rules()->AddIPLiteralRule("www.google.com", "192.168.0.1", ""); |
| 686 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); | 670 HostResolver::RequestInfo info(HostPortPair("www.google.com", 80)); |
| 687 AddressList address; | 671 AddressList address; |
| 688 host_resolver_.Resolve(info, | 672 host_resolver_.Resolve(info, |
| 689 DEFAULT_PRIORITY, | 673 DEFAULT_PRIORITY, |
| 690 &address, | 674 &address, |
| 691 CompletionCallback(), | 675 CompletionCallback(), |
| 692 NULL, | 676 NULL, |
| 693 net_log_.bound()); | 677 net_log_.bound()); |
| 694 | 678 |
| 695 CreateSession(); | 679 CreateSession(); |
| 696 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); | 680 AddQuicAlternateProtocolMapping(MockCryptoClientStream::ZERO_RTT); |
| 697 SendRequestAndExpectQuicResponse("hello!"); | 681 SendRequestAndExpectQuicResponse("hello!"); |
| 698 } | 682 } |
| 699 | 683 |
| 700 TEST_F(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { | 684 TEST_P(QuicNetworkTransactionTest, ZeroRTTWithConfirmationRequired) { |
| 701 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | 685 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. |
| 702 | 686 |
| 703 scoped_ptr<QuicEncryptedPacket> req( | 687 QuicStreamId stream_id = GetParam() > QUIC_VERSION_12 ? 5 : 3; |
| 704 ConstructDataPacket(1, 3, true, true, 0, | 688 MockQuicData mock_quic_data; |
| 705 GetRequestString("GET", "http", "/"))); | 689 if (GetParam() > QUIC_VERSION_12) { |
| 706 scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0)); | 690 mock_quic_data.AddWrite( |
| 707 | 691 ConstructRequestHeadersPacket(1, stream_id, true, true, |
| 708 MockWrite quic_writes[] = { | 692 GetRequestHeaders("GET", "http", "/"))); |
| 709 MockWrite(SYNCHRONOUS, req->data(), req->length()), | 693 mock_quic_data.AddRead( |
| 710 MockWrite(SYNCHRONOUS, ack->data(), ack->length()), | 694 ConstructResponseHeadersPacket(1, stream_id, false, false, |
| 711 }; | 695 GetResponseHeaders("200 OK"))); |
| 712 | 696 mock_quic_data.AddRead( |
| 713 scoped_ptr<QuicEncryptedPacket> resp( | 697 ConstructDataPacket(2, stream_id, false, true, 0, "hello!")); |
| 714 ConstructDataPacket( | 698 mock_quic_data.AddWrite(ConstructAckPacket(2, 1)); |
| 715 1, 3, false, true, 0, GetResponseString("200 OK", "hello!"))); | 699 } else { |
| 716 MockRead quic_reads[] = { | 700 mock_quic_data.AddWrite( |
| 717 MockRead(SYNCHRONOUS, resp->data(), resp->length()), | 701 ConstructDataPacket(1, stream_id, true, true, 0, |
| 718 MockRead(ASYNC, OK), // EOF | 702 GetRequestString("GET", "http", "/"))); |
| 719 }; | 703 mock_quic_data.AddRead( |
| 720 | 704 ConstructDataPacket(1, stream_id, false, true, 0, |
| 721 DelayedSocketData quic_data( | 705 GetResponseString("200 OK", "hello!"))); |
| 722 1, // wait for one write to finish before reading. | 706 mock_quic_data.AddWrite(ConstructAckPacket(1, 0)); |
| 723 quic_reads, arraysize(quic_reads), | 707 } |
| 724 quic_writes, arraysize(quic_writes)); | 708 mock_quic_data.AddRead(SYNCHRONOUS, 0); // EOF |
| 725 | 709 mock_quic_data.AddDelayedSocketDataToFactory(&socket_factory_, 1); |
| 726 socket_factory_.AddSocketDataProvider(&quic_data); | |
| 727 | 710 |
| 728 // The non-alternate protocol job needs to hang in order to guarantee that | 711 // The non-alternate protocol job needs to hang in order to guarantee that |
| 729 // the alternate-protocol job will "win". | 712 // the alternate-protocol job will "win". |
| 730 AddHangingNonAlternateProtocolSocketData(); | 713 AddHangingNonAlternateProtocolSocketData(); |
| 731 | 714 |
| 732 // In order for a new QUIC session to be established via alternate-protocol | 715 // In order for a new QUIC session to be established via alternate-protocol |
| 733 // without racing an HTTP connection, we need the host resolution to happen | 716 // without racing an HTTP connection, we need the host resolution to happen |
| 734 // synchronously. Of course, even though QUIC *could* perform a 0-RTT | 717 // synchronously. Of course, even though QUIC *could* perform a 0-RTT |
| 735 // connection to the the server, in this test we require confirmation | 718 // connection to the the server, in this test we require confirmation |
| 736 // before encrypting so the HTTP job will still start. | 719 // before encrypting so the HTTP job will still start. |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 749 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); | 732 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_.get())); |
| 750 TestCompletionCallback callback; | 733 TestCompletionCallback callback; |
| 751 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); | 734 int rv = trans->Start(&request_, callback.callback(), net_log_.bound()); |
| 752 EXPECT_EQ(ERR_IO_PENDING, rv); | 735 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 753 | 736 |
| 754 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( | 737 crypto_client_stream_factory_.last_stream()->SendOnCryptoHandshakeEvent( |
| 755 QuicSession::HANDSHAKE_CONFIRMED); | 738 QuicSession::HANDSHAKE_CONFIRMED); |
| 756 EXPECT_EQ(OK, callback.WaitForResult()); | 739 EXPECT_EQ(OK, callback.WaitForResult()); |
| 757 } | 740 } |
| 758 | 741 |
| 759 TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocol) { | 742 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocol) { |
| 760 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | 743 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. |
| 761 | 744 |
| 762 // Alternate-protocol job | 745 // Alternate-protocol job |
| 763 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); | 746 scoped_ptr<QuicEncryptedPacket> close(ConstructConnectionClosePacket(1)); |
| 764 MockRead quic_reads[] = { | 747 MockRead quic_reads[] = { |
| 765 MockRead(ASYNC, close->data(), close->length()), | 748 MockRead(ASYNC, close->data(), close->length()), |
| 766 MockRead(ASYNC, OK), // EOF | 749 MockRead(ASYNC, OK), // EOF |
| 767 }; | 750 }; |
| 768 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 751 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 769 NULL, 0); | 752 NULL, 0); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 780 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 763 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 781 NULL, 0); | 764 NULL, 0); |
| 782 socket_factory_.AddSocketDataProvider(&http_data); | 765 socket_factory_.AddSocketDataProvider(&http_data); |
| 783 | 766 |
| 784 CreateSession(); | 767 CreateSession(); |
| 785 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 768 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 786 SendRequestAndExpectHttpResponse("hello from http"); | 769 SendRequestAndExpectHttpResponse("hello from http"); |
| 787 ExpectBrokenAlternateProtocolMapping(); | 770 ExpectBrokenAlternateProtocolMapping(); |
| 788 } | 771 } |
| 789 | 772 |
| 790 TEST_F(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) { | 773 TEST_P(QuicNetworkTransactionTest, BrokenAlternateProtocolReadError) { |
| 791 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | 774 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. |
| 792 | 775 |
| 793 // Alternate-protocol job | 776 // Alternate-protocol job |
| 794 MockRead quic_reads[] = { | 777 MockRead quic_reads[] = { |
| 795 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 778 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 796 }; | 779 }; |
| 797 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 780 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 798 NULL, 0); | 781 NULL, 0); |
| 799 socket_factory_.AddSocketDataProvider(&quic_data); | 782 socket_factory_.AddSocketDataProvider(&quic_data); |
| 800 | 783 |
| 801 // Main job which will succeed even though the alternate job fails. | 784 // Main job which will succeed even though the alternate job fails. |
| 802 MockRead http_reads[] = { | 785 MockRead http_reads[] = { |
| 803 MockRead("HTTP/1.1 200 OK\r\n\r\n"), | 786 MockRead("HTTP/1.1 200 OK\r\n\r\n"), |
| 804 MockRead("hello from http"), | 787 MockRead("hello from http"), |
| 805 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), | 788 MockRead(SYNCHRONOUS, ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ), |
| 806 MockRead(ASYNC, OK) | 789 MockRead(ASYNC, OK) |
| 807 }; | 790 }; |
| 808 | 791 |
| 809 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 792 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), |
| 810 NULL, 0); | 793 NULL, 0); |
| 811 socket_factory_.AddSocketDataProvider(&http_data); | 794 socket_factory_.AddSocketDataProvider(&http_data); |
| 812 | 795 |
| 813 CreateSession(); | 796 CreateSession(); |
| 814 | 797 |
| 815 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); | 798 AddQuicAlternateProtocolMapping(MockCryptoClientStream::COLD_START); |
| 816 SendRequestAndExpectHttpResponse("hello from http"); | 799 SendRequestAndExpectHttpResponse("hello from http"); |
| 817 ExpectBrokenAlternateProtocolMapping(); | 800 ExpectBrokenAlternateProtocolMapping(); |
| 818 } | 801 } |
| 819 | 802 |
| 820 TEST_F(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { | 803 TEST_P(QuicNetworkTransactionTest, FailedZeroRttBrokenAlternateProtocol) { |
| 821 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. | 804 HttpStreamFactory::EnableNpnSpdy3(); // Enables QUIC too. |
| 822 | 805 |
| 823 // Alternate-protocol job | 806 // Alternate-protocol job |
| 824 MockRead quic_reads[] = { | 807 MockRead quic_reads[] = { |
| 825 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), | 808 MockRead(ASYNC, ERR_SOCKET_NOT_CONNECTED), |
| 826 }; | 809 }; |
| 827 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), | 810 StaticSocketDataProvider quic_data(quic_reads, arraysize(quic_reads), |
| 828 NULL, 0); | 811 NULL, 0); |
| 829 socket_factory_.AddSocketDataProvider(&quic_data); | 812 socket_factory_.AddSocketDataProvider(&quic_data); |
| 830 | 813 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 849 SendRequestAndExpectHttpResponse("hello from http"); | 832 SendRequestAndExpectHttpResponse("hello from http"); |
| 850 | 833 |
| 851 ExpectBrokenAlternateProtocolMapping(); | 834 ExpectBrokenAlternateProtocolMapping(); |
| 852 | 835 |
| 853 EXPECT_TRUE(quic_data.at_read_eof()); | 836 EXPECT_TRUE(quic_data.at_read_eof()); |
| 854 EXPECT_TRUE(quic_data.at_write_eof()); | 837 EXPECT_TRUE(quic_data.at_write_eof()); |
| 855 } | 838 } |
| 856 | 839 |
| 857 } // namespace test | 840 } // namespace test |
| 858 } // namespace net | 841 } // namespace net |
| OLD | NEW |