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

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

Powered by Google App Engine
This is Rietveld 408576698