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 |