Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(12)

Side by Side Diff: net/quic/quic_network_transaction_unittest.cc

Issue 110853010: Enable support for QUIC 13. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cleanup Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698