Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_stream_factory.h" | 5 #include "net/quic/quic_stream_factory.h" |
| 6 | 6 |
| 7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
| 8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
| 9 #include "net/base/test_data_directory.h" | 9 #include "net/base/test_data_directory.h" |
| 10 #include "net/cert/cert_verifier.h" | 10 #include "net/cert/cert_verifier.h" |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 34 | 34 |
| 35 namespace { | 35 namespace { |
| 36 const char kDefaultServerHostName[] = "www.google.com"; | 36 const char kDefaultServerHostName[] = "www.google.com"; |
| 37 const int kDefaultServerPort = 443; | 37 const int kDefaultServerPort = 443; |
| 38 } // namespace anonymous | 38 } // namespace anonymous |
| 39 | 39 |
| 40 class QuicStreamFactoryPeer { | 40 class QuicStreamFactoryPeer { |
| 41 public: | 41 public: |
| 42 static QuicCryptoClientConfig* GetOrCreateCryptoConfig( | 42 static QuicCryptoClientConfig* GetOrCreateCryptoConfig( |
| 43 QuicStreamFactory* factory, | 43 QuicStreamFactory* factory, |
| 44 const HostPortProxyPair& host_port_proxy_pair) { | 44 const HostPortProxyPair& host_port_proxy_pair, |
| 45 return factory->GetOrCreateCryptoConfig(host_port_proxy_pair); | 45 bool is_https) { |
| 46 QuicStreamFactory::SessionKey session_key(host_port_proxy_pair, is_https); | |
| 47 return factory->GetOrCreateCryptoConfig(session_key); | |
| 46 } | 48 } |
| 47 | 49 |
| 48 static bool HasActiveSession(QuicStreamFactory* factory, | 50 static bool HasActiveSession(QuicStreamFactory* factory, |
| 49 const HostPortProxyPair& host_port_proxy_pair) { | 51 const HostPortProxyPair& host_port_proxy_pair, |
| 50 return factory->HasActiveSession(host_port_proxy_pair); | 52 bool is_https) { |
| 53 QuicStreamFactory::SessionKey session_key(host_port_proxy_pair, is_https); | |
| 54 return factory->HasActiveSession(session_key); | |
| 51 } | 55 } |
| 52 | 56 |
| 53 static QuicClientSession* GetActiveSession( | 57 static QuicClientSession* GetActiveSession( |
| 54 QuicStreamFactory* factory, | 58 QuicStreamFactory* factory, |
| 55 const HostPortProxyPair& host_port_proxy_pair) { | 59 const HostPortProxyPair& host_port_proxy_pair, |
| 56 DCHECK(factory->HasActiveSession(host_port_proxy_pair)); | 60 bool is_https) { |
| 57 return factory->active_sessions_[host_port_proxy_pair]; | 61 QuicStreamFactory::SessionKey session_key(host_port_proxy_pair, is_https); |
| 62 DCHECK(factory->HasActiveSession(session_key)); | |
| 63 return factory->active_sessions_[session_key]; | |
| 64 } | |
| 65 | |
| 66 static scoped_ptr<QuicHttpStream> CreateIfSessionExists( | |
| 67 QuicStreamFactory* factory, | |
| 68 const HostPortProxyPair& host_port_proxy_pair, | |
| 69 bool is_https, | |
| 70 const BoundNetLog& net_log) { | |
| 71 QuicStreamFactory::SessionKey session_key(host_port_proxy_pair, is_https); | |
| 72 return factory->CreateIfSessionExists(session_key, net_log); | |
| 58 } | 73 } |
| 59 | 74 |
| 60 static bool IsLiveSession(QuicStreamFactory* factory, | 75 static bool IsLiveSession(QuicStreamFactory* factory, |
| 61 QuicClientSession* session) { | 76 QuicClientSession* session) { |
| 62 for (QuicStreamFactory::SessionSet::iterator it = | 77 for (QuicStreamFactory::SessionSet::iterator it = |
| 63 factory->all_sessions_.begin(); | 78 factory->all_sessions_.begin(); |
| 64 it != factory->all_sessions_.end(); ++it) { | 79 it != factory->all_sessions_.end(); ++it) { |
| 65 if (*it == session) | 80 if (*it == session) |
| 66 return true; | 81 return true; |
| 67 } | 82 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 81 &random_generator_, clock_, kDefaultMaxPacketSize, | 96 &random_generator_, clock_, kDefaultMaxPacketSize, |
| 82 SupportedVersions(GetParam()), true, true), | 97 SupportedVersions(GetParam()), true, true), |
| 83 host_port_proxy_pair_(HostPortPair(kDefaultServerHostName, | 98 host_port_proxy_pair_(HostPortPair(kDefaultServerHostName, |
| 84 kDefaultServerPort), | 99 kDefaultServerPort), |
| 85 ProxyServer::Direct()), | 100 ProxyServer::Direct()), |
| 86 is_https_(false), | 101 is_https_(false), |
| 87 cert_verifier_(CertVerifier::CreateDefault()) { | 102 cert_verifier_(CertVerifier::CreateDefault()) { |
| 88 factory_.set_require_confirmation(false); | 103 factory_.set_require_confirmation(false); |
| 89 } | 104 } |
| 90 | 105 |
| 106 scoped_ptr<QuicHttpStream> CreateIfSessionExists( | |
| 107 const HostPortProxyPair& host_port_proxy_pair, | |
| 108 const BoundNetLog& net_log) { | |
| 109 return QuicStreamFactoryPeer::CreateIfSessionExists( | |
| 110 &factory_, host_port_proxy_pair, false, net_log_); | |
| 111 } | |
| 91 | 112 |
| 92 int GetSourcePortForNewSession(const HostPortProxyPair& destination) { | 113 int GetSourcePortForNewSession(const HostPortProxyPair& destination) { |
| 93 return GetSourcePortForNewSessionInner(destination, false); | 114 return GetSourcePortForNewSessionInner(destination, false); |
| 94 } | 115 } |
| 95 | 116 |
| 96 int GetSourcePortForNewSessionAndGoAway( | 117 int GetSourcePortForNewSessionAndGoAway( |
| 97 const HostPortProxyPair& destination) { | 118 const HostPortProxyPair& destination) { |
| 98 return GetSourcePortForNewSessionInner(destination, true); | 119 return GetSourcePortForNewSessionInner(destination, true); |
| 99 } | 120 } |
| 100 | 121 |
| 101 int GetSourcePortForNewSessionInner(const HostPortProxyPair& destination, | 122 int GetSourcePortForNewSessionInner(const HostPortProxyPair& destination, |
| 102 bool goaway_received) { | 123 bool goaway_received) { |
| 103 // Should only be called if there is no active session for this destination. | 124 // Should only be called if there is no active session for this destination. |
| 104 EXPECT_EQ(NULL, factory_.CreateIfSessionExists(destination, | 125 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get()); |
| 105 net_log_).get()); | |
| 106 size_t socket_count = socket_factory_.udp_client_sockets().size(); | 126 size_t socket_count = socket_factory_.udp_client_sockets().size(); |
| 107 | 127 |
| 108 MockRead reads[] = { | 128 MockRead reads[] = { |
| 109 MockRead(ASYNC, OK, 0) // EOF | 129 MockRead(ASYNC, OK, 0) // EOF |
| 110 }; | 130 }; |
| 111 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); | 131 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); |
| 112 socket_data.StopAfter(1); | 132 socket_data.StopAfter(1); |
| 113 socket_factory_.AddSocketDataProvider(&socket_data); | 133 socket_factory_.AddSocketDataProvider(&socket_data); |
| 114 | 134 |
| 115 QuicStreamRequest request(&factory_); | 135 QuicStreamRequest request(&factory_); |
| 116 EXPECT_EQ(ERR_IO_PENDING, | 136 EXPECT_EQ(ERR_IO_PENDING, |
| 117 request.Request(destination, | 137 request.Request(destination, |
| 118 is_https_, | 138 is_https_, |
| 119 "GET", | 139 "GET", |
| 120 cert_verifier_.get(), | 140 cert_verifier_.get(), |
| 121 net_log_, | 141 net_log_, |
| 122 callback_.callback())); | 142 callback_.callback())); |
| 123 | 143 |
| 124 EXPECT_EQ(OK, callback_.WaitForResult()); | 144 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 125 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | 145 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); |
| 126 EXPECT_TRUE(stream.get()); | 146 EXPECT_TRUE(stream.get()); |
| 127 stream.reset(); | 147 stream.reset(); |
| 128 | 148 |
| 129 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( | 149 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( |
| 130 &factory_, destination); | 150 &factory_, destination, is_https_); |
| 131 | 151 |
| 132 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) { | 152 if (socket_count + 1 != socket_factory_.udp_client_sockets().size()) { |
| 133 EXPECT_TRUE(false); | 153 EXPECT_TRUE(false); |
| 134 return 0; | 154 return 0; |
| 135 } | 155 } |
| 136 | 156 |
| 137 IPEndPoint endpoint; | 157 IPEndPoint endpoint; |
| 138 socket_factory_. | 158 socket_factory_. |
| 139 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint); | 159 udp_client_sockets()[socket_count]->GetLocalAddress(&endpoint); |
| 140 int port = endpoint.port(); | 160 int port = endpoint.port(); |
| 141 if (goaway_received) { | 161 if (goaway_received) { |
| 142 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, ""); | 162 QuicGoAwayFrame goaway(QUIC_NO_ERROR, 1, ""); |
| 143 session->OnGoAway(goaway); | 163 session->OnGoAway(goaway); |
| 144 } | 164 } |
| 145 | 165 |
| 146 factory_.OnSessionClosed(session); | 166 factory_.OnSessionClosed(session); |
| 147 EXPECT_EQ(NULL, factory_.CreateIfSessionExists(destination, | 167 EXPECT_EQ(NULL, CreateIfSessionExists(destination, net_log_).get()); |
|
eroman
2014/03/08 01:04:25
BTW I seem to remember having issues with this pat
| |
| 148 net_log_).get()); | |
| 149 EXPECT_TRUE(socket_data.at_read_eof()); | 168 EXPECT_TRUE(socket_data.at_read_eof()); |
| 150 EXPECT_TRUE(socket_data.at_write_eof()); | 169 EXPECT_TRUE(socket_data.at_write_eof()); |
| 151 return port; | 170 return port; |
| 152 } | 171 } |
| 153 | 172 |
| 154 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { | 173 scoped_ptr<QuicEncryptedPacket> ConstructRstPacket() { |
| 155 QuicStreamId stream_id = 5; | 174 QuicStreamId stream_id = 5; |
| 156 return maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_NO_ERROR); | 175 return maker_.MakeRstPacket(1, true, stream_id, QUIC_STREAM_NO_ERROR); |
| 157 } | 176 } |
| 158 | 177 |
| 159 MockHostResolver host_resolver_; | 178 MockHostResolver host_resolver_; |
| 160 DeterministicMockClientSocketFactory socket_factory_; | 179 DeterministicMockClientSocketFactory socket_factory_; |
| 161 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 180 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
| 162 MockRandom random_generator_; | 181 MockRandom random_generator_; |
| 163 QuicTestPacketMaker maker_; | 182 QuicTestPacketMaker maker_; |
| 164 MockClock* clock_; // Owned by factory_. | 183 MockClock* clock_; // Owned by factory_. |
| 165 QuicStreamFactory factory_; | 184 QuicStreamFactory factory_; |
| 166 HostPortProxyPair host_port_proxy_pair_; | 185 HostPortProxyPair host_port_proxy_pair_; |
| 167 bool is_https_; | 186 bool is_https_; |
| 168 scoped_ptr<CertVerifier> cert_verifier_; | 187 scoped_ptr<CertVerifier> cert_verifier_; |
| 169 BoundNetLog net_log_; | 188 BoundNetLog net_log_; |
| 170 TestCompletionCallback callback_; | 189 TestCompletionCallback callback_; |
| 171 }; | 190 }; |
| 172 | 191 |
| 173 INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest, | 192 INSTANTIATE_TEST_CASE_P(Version, QuicStreamFactoryTest, |
| 174 ::testing::ValuesIn(QuicSupportedVersions())); | 193 ::testing::ValuesIn(QuicSupportedVersions())); |
| 175 | 194 |
| 176 TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) { | 195 TEST_P(QuicStreamFactoryTest, CreateIfSessionExists) { |
| 177 EXPECT_EQ(NULL, factory_.CreateIfSessionExists(host_port_proxy_pair_, | 196 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_proxy_pair_, net_log_).get()); |
| 178 net_log_).get()); | |
| 179 } | 197 } |
| 180 | 198 |
| 181 TEST_P(QuicStreamFactoryTest, Create) { | 199 TEST_P(QuicStreamFactoryTest, Create) { |
| 182 MockRead reads[] = { | 200 MockRead reads[] = { |
| 183 MockRead(ASYNC, OK, 0) // EOF | 201 MockRead(ASYNC, OK, 0) // EOF |
| 184 }; | 202 }; |
| 185 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); | 203 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); |
| 186 socket_factory_.AddSocketDataProvider(&socket_data); | 204 socket_factory_.AddSocketDataProvider(&socket_data); |
| 187 socket_data.StopAfter(1); | 205 socket_data.StopAfter(1); |
| 188 | 206 |
| 189 QuicStreamRequest request(&factory_); | 207 QuicStreamRequest request(&factory_); |
| 190 EXPECT_EQ(ERR_IO_PENDING, | 208 EXPECT_EQ(ERR_IO_PENDING, |
| 191 request.Request(host_port_proxy_pair_, | 209 request.Request(host_port_proxy_pair_, |
| 192 is_https_, | 210 is_https_, |
| 193 "GET", | 211 "GET", |
| 194 cert_verifier_.get(), | 212 cert_verifier_.get(), |
| 195 net_log_, | 213 net_log_, |
| 196 callback_.callback())); | 214 callback_.callback())); |
| 197 | 215 |
| 198 EXPECT_EQ(OK, callback_.WaitForResult()); | 216 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 199 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | 217 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); |
| 200 EXPECT_TRUE(stream.get()); | 218 EXPECT_TRUE(stream.get()); |
| 201 | 219 |
| 202 // Will reset stream 3. | 220 // Will reset stream 3. |
| 203 stream = factory_.CreateIfSessionExists(host_port_proxy_pair_, net_log_); | 221 stream = CreateIfSessionExists(host_port_proxy_pair_, net_log_); |
| 204 EXPECT_TRUE(stream.get()); | 222 EXPECT_TRUE(stream.get()); |
| 205 | 223 |
| 206 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result | 224 // TODO(rtenneti): We should probably have a tests that HTTP and HTTPS result |
| 207 // in streams on different sessions. | 225 // in streams on different sessions. |
| 208 QuicStreamRequest request2(&factory_); | 226 QuicStreamRequest request2(&factory_); |
| 209 EXPECT_EQ(OK, | 227 EXPECT_EQ(OK, |
| 210 request2.Request(host_port_proxy_pair_, | 228 request2.Request(host_port_proxy_pair_, |
| 211 is_https_, | 229 is_https_, |
| 212 "GET", | 230 "GET", |
| 213 cert_verifier_.get(), | 231 cert_verifier_.get(), |
| 214 net_log_, | 232 net_log_, |
| 215 callback_.callback())); | 233 callback_.callback())); |
| 216 stream = request2.ReleaseStream(); // Will reset stream 5. | 234 stream = request2.ReleaseStream(); // Will reset stream 5. |
| 217 stream.reset(); // Will reset stream 7. | 235 stream.reset(); // Will reset stream 7. |
| 218 | 236 |
| 219 EXPECT_TRUE(socket_data.at_read_eof()); | 237 EXPECT_TRUE(socket_data.at_read_eof()); |
| 220 EXPECT_TRUE(socket_data.at_write_eof()); | 238 EXPECT_TRUE(socket_data.at_write_eof()); |
| 221 } | 239 } |
| 222 | 240 |
| 241 TEST_P(QuicStreamFactoryTest, CreateHttpVsHttps) { | |
| 242 MockRead reads[] = { | |
| 243 MockRead(ASYNC, OK, 0) // EOF | |
| 244 }; | |
| 245 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); | |
| 246 DeterministicSocketData socket_data2(reads, arraysize(reads), NULL, 0); | |
| 247 socket_factory_.AddSocketDataProvider(&socket_data1); | |
| 248 socket_factory_.AddSocketDataProvider(&socket_data2); | |
| 249 socket_data1.StopAfter(1); | |
| 250 socket_data2.StopAfter(1); | |
| 251 | |
| 252 QuicStreamRequest request(&factory_); | |
| 253 EXPECT_EQ(ERR_IO_PENDING, | |
| 254 request.Request(host_port_proxy_pair_, | |
| 255 is_https_, | |
| 256 "GET", | |
| 257 cert_verifier_.get(), | |
| 258 net_log_, | |
| 259 callback_.callback())); | |
| 260 | |
| 261 EXPECT_EQ(OK, callback_.WaitForResult()); | |
| 262 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | |
| 263 EXPECT_TRUE(stream.get()); | |
| 264 | |
| 265 QuicStreamRequest request2(&factory_); | |
| 266 EXPECT_EQ(ERR_IO_PENDING, | |
| 267 request2.Request(host_port_proxy_pair_, | |
| 268 !is_https_, | |
| 269 "GET", | |
| 270 cert_verifier_.get(), | |
| 271 net_log_, | |
| 272 callback_.callback())); | |
| 273 EXPECT_EQ(OK, callback_.WaitForResult()); | |
| 274 stream = request2.ReleaseStream(); | |
| 275 EXPECT_TRUE(stream.get()); | |
| 276 stream.reset(); | |
| 277 | |
| 278 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( | |
| 279 &factory_, host_port_proxy_pair_, is_https_), | |
| 280 QuicStreamFactoryPeer::GetActiveSession( | |
| 281 &factory_, host_port_proxy_pair_, !is_https_)); | |
| 282 | |
| 283 EXPECT_TRUE(socket_data1.at_read_eof()); | |
| 284 EXPECT_TRUE(socket_data1.at_write_eof()); | |
| 285 EXPECT_TRUE(socket_data2.at_read_eof()); | |
| 286 EXPECT_TRUE(socket_data2.at_write_eof()); | |
| 287 } | |
| 288 | |
| 223 TEST_P(QuicStreamFactoryTest, Pooling) { | 289 TEST_P(QuicStreamFactoryTest, Pooling) { |
| 224 MockRead reads[] = { | 290 MockRead reads[] = { |
| 225 MockRead(ASYNC, OK, 0) // EOF | 291 MockRead(ASYNC, OK, 0) // EOF |
| 226 }; | 292 }; |
| 227 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); | 293 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); |
| 228 socket_factory_.AddSocketDataProvider(&socket_data); | 294 socket_factory_.AddSocketDataProvider(&socket_data); |
| 229 socket_data.StopAfter(1); | 295 socket_data.StopAfter(1); |
| 230 | 296 |
| 231 HostPortProxyPair server2 = HostPortProxyPair( | 297 HostPortProxyPair server2 = HostPortProxyPair( |
| 232 HostPortPair("mail.google.com", kDefaultServerPort), | 298 HostPortPair("mail.google.com", kDefaultServerPort), |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 255 request2.Request(server2, | 321 request2.Request(server2, |
| 256 is_https_, | 322 is_https_, |
| 257 "GET", | 323 "GET", |
| 258 cert_verifier_.get(), | 324 cert_verifier_.get(), |
| 259 net_log_, | 325 net_log_, |
| 260 callback.callback())); | 326 callback.callback())); |
| 261 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | 327 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); |
| 262 EXPECT_TRUE(stream2.get()); | 328 EXPECT_TRUE(stream2.get()); |
| 263 | 329 |
| 264 EXPECT_EQ( | 330 EXPECT_EQ( |
| 265 QuicStreamFactoryPeer::GetActiveSession(&factory_, host_port_proxy_pair_), | 331 QuicStreamFactoryPeer::GetActiveSession( |
| 266 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2)); | 332 &factory_, host_port_proxy_pair_, is_https_), |
| 333 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2, is_https_)); | |
| 267 | 334 |
| 268 EXPECT_TRUE(socket_data.at_read_eof()); | 335 EXPECT_TRUE(socket_data.at_read_eof()); |
| 269 EXPECT_TRUE(socket_data.at_write_eof()); | 336 EXPECT_TRUE(socket_data.at_write_eof()); |
| 270 } | 337 } |
| 271 | 338 |
| 272 TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) { | 339 TEST_P(QuicStreamFactoryTest, NoPoolingAfterGoAway) { |
| 273 MockRead reads[] = { | 340 MockRead reads[] = { |
| 274 MockRead(ASYNC, OK, 0) // EOF | 341 MockRead(ASYNC, OK, 0) // EOF |
| 275 }; | 342 }; |
| 276 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); | 343 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 306 EXPECT_EQ(OK, | 373 EXPECT_EQ(OK, |
| 307 request2.Request(server2, | 374 request2.Request(server2, |
| 308 is_https_, | 375 is_https_, |
| 309 "GET", | 376 "GET", |
| 310 cert_verifier_.get(), | 377 cert_verifier_.get(), |
| 311 net_log_, | 378 net_log_, |
| 312 callback.callback())); | 379 callback.callback())); |
| 313 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | 380 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); |
| 314 EXPECT_TRUE(stream2.get()); | 381 EXPECT_TRUE(stream2.get()); |
| 315 | 382 |
| 316 factory_.OnSessionGoingAway( | 383 factory_.OnSessionGoingAway(QuicStreamFactoryPeer::GetActiveSession( |
| 317 QuicStreamFactoryPeer::GetActiveSession(&factory_, | 384 &factory_, host_port_proxy_pair_, is_https_)); |
| 318 host_port_proxy_pair_)); | 385 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( |
| 319 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(&factory_, | 386 &factory_, host_port_proxy_pair_, is_https_)); |
| 320 host_port_proxy_pair_)); | 387 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( |
| 321 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(&factory_, server2)); | 388 &factory_, server2, is_https_)); |
| 322 | 389 |
| 323 TestCompletionCallback callback3; | 390 TestCompletionCallback callback3; |
| 324 QuicStreamRequest request3(&factory_); | 391 QuicStreamRequest request3(&factory_); |
| 325 EXPECT_EQ(OK, | 392 EXPECT_EQ(OK, |
| 326 request3.Request(server2, | 393 request3.Request(server2, |
| 327 is_https_, | 394 is_https_, |
| 328 "GET", | 395 "GET", |
| 329 cert_verifier_.get(), | 396 cert_verifier_.get(), |
| 330 net_log_, | 397 net_log_, |
| 331 callback3.callback())); | 398 callback3.callback())); |
| 332 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream(); | 399 scoped_ptr<QuicHttpStream> stream3 = request3.ReleaseStream(); |
| 333 EXPECT_TRUE(stream3.get()); | 400 EXPECT_TRUE(stream3.get()); |
| 334 | 401 |
| 335 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_, server2)); | 402 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession( |
| 403 &factory_, server2, is_https_)); | |
| 336 | 404 |
| 337 EXPECT_TRUE(socket_data1.at_read_eof()); | 405 EXPECT_TRUE(socket_data1.at_read_eof()); |
| 338 EXPECT_TRUE(socket_data1.at_write_eof()); | 406 EXPECT_TRUE(socket_data1.at_write_eof()); |
| 339 EXPECT_TRUE(socket_data2.at_read_eof()); | 407 EXPECT_TRUE(socket_data2.at_read_eof()); |
| 340 EXPECT_TRUE(socket_data2.at_write_eof()); | 408 EXPECT_TRUE(socket_data2.at_write_eof()); |
| 341 } | 409 } |
| 342 | 410 |
| 343 TEST_P(QuicStreamFactoryTest, HttpsPooling) { | 411 TEST_P(QuicStreamFactoryTest, HttpsPooling) { |
| 344 MockRead reads[] = { | 412 MockRead reads[] = { |
| 345 MockRead(ASYNC, OK, 0) // EOF | 413 MockRead(ASYNC, OK, 0) // EOF |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 388 EXPECT_EQ(OK, | 456 EXPECT_EQ(OK, |
| 389 request2.Request(server2, | 457 request2.Request(server2, |
| 390 is_https_, | 458 is_https_, |
| 391 "GET", | 459 "GET", |
| 392 cert_verifier_.get(), | 460 cert_verifier_.get(), |
| 393 net_log_, | 461 net_log_, |
| 394 callback_.callback())); | 462 callback_.callback())); |
| 395 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | 463 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); |
| 396 EXPECT_TRUE(stream2.get()); | 464 EXPECT_TRUE(stream2.get()); |
| 397 | 465 |
| 398 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession(&factory_, server1), | 466 EXPECT_EQ(QuicStreamFactoryPeer::GetActiveSession( |
| 399 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2)); | 467 &factory_, server1, is_https_), |
| 468 QuicStreamFactoryPeer::GetActiveSession( | |
| 469 &factory_, server2, is_https_)); | |
| 400 | 470 |
| 401 EXPECT_TRUE(socket_data.at_read_eof()); | 471 EXPECT_TRUE(socket_data.at_read_eof()); |
| 402 EXPECT_TRUE(socket_data.at_write_eof()); | 472 EXPECT_TRUE(socket_data.at_write_eof()); |
| 403 } | 473 } |
| 404 | 474 |
| 405 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) { | 475 TEST_P(QuicStreamFactoryTest, NoHttpsPoolingWithCertMismatch) { |
| 406 MockRead reads[] = { | 476 MockRead reads[] = { |
| 407 MockRead(ASYNC, OK, 0) // EOF | 477 MockRead(ASYNC, OK, 0) // EOF |
| 408 }; | 478 }; |
| 409 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); | 479 DeterministicSocketData socket_data1(reads, arraysize(reads), NULL, 0); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 454 EXPECT_EQ(OK, | 524 EXPECT_EQ(OK, |
| 455 request2.Request(server2, | 525 request2.Request(server2, |
| 456 is_https_, | 526 is_https_, |
| 457 "GET", | 527 "GET", |
| 458 cert_verifier_.get(), | 528 cert_verifier_.get(), |
| 459 net_log_, | 529 net_log_, |
| 460 callback_.callback())); | 530 callback_.callback())); |
| 461 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | 531 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); |
| 462 EXPECT_TRUE(stream2.get()); | 532 EXPECT_TRUE(stream2.get()); |
| 463 | 533 |
| 464 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession(&factory_, server1), | 534 EXPECT_NE(QuicStreamFactoryPeer::GetActiveSession( |
| 465 QuicStreamFactoryPeer::GetActiveSession(&factory_, server2)); | 535 &factory_, server1, is_https_), |
| 536 QuicStreamFactoryPeer::GetActiveSession( | |
| 537 &factory_, server2, is_https_)); | |
| 466 | 538 |
| 467 EXPECT_TRUE(socket_data1.at_read_eof()); | 539 EXPECT_TRUE(socket_data1.at_read_eof()); |
| 468 EXPECT_TRUE(socket_data1.at_write_eof()); | 540 EXPECT_TRUE(socket_data1.at_write_eof()); |
| 469 EXPECT_TRUE(socket_data2.at_read_eof()); | 541 EXPECT_TRUE(socket_data2.at_read_eof()); |
| 470 EXPECT_TRUE(socket_data2.at_write_eof()); | 542 EXPECT_TRUE(socket_data2.at_write_eof()); |
| 471 } | 543 } |
| 472 | 544 |
| 473 TEST_P(QuicStreamFactoryTest, Goaway) { | 545 TEST_P(QuicStreamFactoryTest, Goaway) { |
| 474 MockRead reads[] = { | 546 MockRead reads[] = { |
| 475 MockRead(ASYNC, OK, 0) // EOF | 547 MockRead(ASYNC, OK, 0) // EOF |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 490 net_log_, | 562 net_log_, |
| 491 callback_.callback())); | 563 callback_.callback())); |
| 492 | 564 |
| 493 EXPECT_EQ(OK, callback_.WaitForResult()); | 565 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 494 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | 566 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); |
| 495 EXPECT_TRUE(stream.get()); | 567 EXPECT_TRUE(stream.get()); |
| 496 | 568 |
| 497 // Mark the session as going away. Ensure that while it is still alive | 569 // Mark the session as going away. Ensure that while it is still alive |
| 498 // that it is no longer active. | 570 // that it is no longer active. |
| 499 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( | 571 QuicClientSession* session = QuicStreamFactoryPeer::GetActiveSession( |
| 500 &factory_, host_port_proxy_pair_); | 572 &factory_, host_port_proxy_pair_, is_https_); |
| 501 factory_.OnSessionGoingAway(session); | 573 factory_.OnSessionGoingAway(session); |
| 502 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); | 574 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); |
| 503 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession(&factory_, | 575 EXPECT_FALSE(QuicStreamFactoryPeer::HasActiveSession( |
| 504 host_port_proxy_pair_)); | 576 &factory_, host_port_proxy_pair_, is_https_)); |
| 505 EXPECT_EQ(NULL, factory_.CreateIfSessionExists(host_port_proxy_pair_, | 577 EXPECT_EQ(NULL, CreateIfSessionExists(host_port_proxy_pair_, net_log_).get()); |
| 506 net_log_).get()); | |
| 507 | 578 |
| 508 // Create a new request for the same destination and verify that a | 579 // Create a new request for the same destination and verify that a |
| 509 // new session is created. | 580 // new session is created. |
| 510 QuicStreamRequest request2(&factory_); | 581 QuicStreamRequest request2(&factory_); |
| 511 EXPECT_EQ(ERR_IO_PENDING, | 582 EXPECT_EQ(ERR_IO_PENDING, |
| 512 request2.Request(host_port_proxy_pair_, | 583 request2.Request(host_port_proxy_pair_, |
| 513 is_https_, | 584 is_https_, |
| 514 "GET", | 585 "GET", |
| 515 cert_verifier_.get(), | 586 cert_verifier_.get(), |
| 516 net_log_, | 587 net_log_, |
| 517 callback_.callback())); | 588 callback_.callback())); |
| 518 EXPECT_EQ(OK, callback_.WaitForResult()); | 589 EXPECT_EQ(OK, callback_.WaitForResult()); |
| 519 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); | 590 scoped_ptr<QuicHttpStream> stream2 = request2.ReleaseStream(); |
| 520 EXPECT_TRUE(stream2.get()); | 591 EXPECT_TRUE(stream2.get()); |
| 521 | 592 |
| 522 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_, | 593 EXPECT_TRUE(QuicStreamFactoryPeer::HasActiveSession(&factory_, |
| 523 host_port_proxy_pair_)); | 594 host_port_proxy_pair_, |
| 595 is_https_)); | |
| 524 EXPECT_NE(session, | 596 EXPECT_NE(session, |
| 525 QuicStreamFactoryPeer::GetActiveSession( | 597 QuicStreamFactoryPeer::GetActiveSession( |
| 526 &factory_, host_port_proxy_pair_)); | 598 &factory_, host_port_proxy_pair_, is_https_)); |
| 527 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); | 599 EXPECT_EQ(true, QuicStreamFactoryPeer::IsLiveSession(&factory_, session)); |
| 528 | 600 |
| 529 stream2.reset(); | 601 stream2.reset(); |
| 530 stream.reset(); | 602 stream.reset(); |
| 531 | 603 |
| 532 EXPECT_TRUE(socket_data.at_read_eof()); | 604 EXPECT_TRUE(socket_data.at_read_eof()); |
| 533 EXPECT_TRUE(socket_data.at_write_eof()); | 605 EXPECT_TRUE(socket_data.at_write_eof()); |
| 534 EXPECT_TRUE(socket_data2.at_read_eof()); | 606 EXPECT_TRUE(socket_data2.at_read_eof()); |
| 535 EXPECT_TRUE(socket_data2.at_write_eof()); | 607 EXPECT_TRUE(socket_data2.at_write_eof()); |
| 536 } | 608 } |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 658 cert_verifier_.get(), | 730 cert_verifier_.get(), |
| 659 net_log_, | 731 net_log_, |
| 660 callback_.callback())); | 732 callback_.callback())); |
| 661 } | 733 } |
| 662 | 734 |
| 663 socket_data.StopAfter(1); | 735 socket_data.StopAfter(1); |
| 664 base::RunLoop run_loop; | 736 base::RunLoop run_loop; |
| 665 run_loop.RunUntilIdle(); | 737 run_loop.RunUntilIdle(); |
| 666 | 738 |
| 667 scoped_ptr<QuicHttpStream> stream( | 739 scoped_ptr<QuicHttpStream> stream( |
| 668 factory_.CreateIfSessionExists(host_port_proxy_pair_, net_log_)); | 740 CreateIfSessionExists(host_port_proxy_pair_, net_log_)); |
| 669 EXPECT_TRUE(stream.get()); | 741 EXPECT_TRUE(stream.get()); |
| 670 stream.reset(); | 742 stream.reset(); |
| 671 | 743 |
| 672 EXPECT_TRUE(socket_data.at_read_eof()); | 744 EXPECT_TRUE(socket_data.at_read_eof()); |
| 673 EXPECT_TRUE(socket_data.at_write_eof()); | 745 EXPECT_TRUE(socket_data.at_write_eof()); |
| 674 } | 746 } |
| 675 | 747 |
| 676 TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) { | 748 TEST_P(QuicStreamFactoryTest, CreateConsistentEphemeralPort) { |
| 677 // Sequentially connect to the default host, then another host, and then the | 749 // Sequentially connect to the default host, then another host, and then the |
| 678 // default host. Verify that the default host gets a consistent ephemeral | 750 // default host. Verify that the default host gets a consistent ephemeral |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 966 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) { | 1038 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) { |
| 967 string r1_host_name("r1"); | 1039 string r1_host_name("r1"); |
| 968 string r2_host_name("r2"); | 1040 string r2_host_name("r2"); |
| 969 r1_host_name.append(cannoncial_suffixes[i]); | 1041 r1_host_name.append(cannoncial_suffixes[i]); |
| 970 r2_host_name.append(cannoncial_suffixes[i]); | 1042 r2_host_name.append(cannoncial_suffixes[i]); |
| 971 | 1043 |
| 972 HostPortProxyPair host_port_proxy_pair1(HostPortPair(r1_host_name, 80), | 1044 HostPortProxyPair host_port_proxy_pair1(HostPortPair(r1_host_name, 80), |
| 973 ProxyServer::Direct()); | 1045 ProxyServer::Direct()); |
| 974 | 1046 |
| 975 QuicCryptoClientConfig* crypto_config1 = | 1047 QuicCryptoClientConfig* crypto_config1 = |
| 976 QuicStreamFactoryPeer::GetOrCreateCryptoConfig(&factory_, | 1048 QuicStreamFactoryPeer::GetOrCreateCryptoConfig( |
| 977 host_port_proxy_pair1); | 1049 &factory_, host_port_proxy_pair1, is_https_); |
| 978 DCHECK(crypto_config1); | 1050 DCHECK(crypto_config1); |
| 979 QuicCryptoClientConfig::CachedState* cached1 = | 1051 QuicCryptoClientConfig::CachedState* cached1 = |
| 980 crypto_config1->LookupOrCreate(host_port_proxy_pair1.first.host()); | 1052 crypto_config1->LookupOrCreate(host_port_proxy_pair1.first.host()); |
| 981 EXPECT_FALSE(cached1->proof_valid()); | 1053 EXPECT_FALSE(cached1->proof_valid()); |
| 982 EXPECT_TRUE(cached1->source_address_token().empty()); | 1054 EXPECT_TRUE(cached1->source_address_token().empty()); |
| 983 | 1055 |
| 984 // Mutate the cached1 to have different data. | 1056 // Mutate the cached1 to have different data. |
| 985 // TODO(rtenneti): mutate other members of CachedState. | 1057 // TODO(rtenneti): mutate other members of CachedState. |
| 986 cached1->set_source_address_token(r1_host_name); | 1058 cached1->set_source_address_token(r1_host_name); |
| 987 cached1->SetProofValid(); | 1059 cached1->SetProofValid(); |
| 988 | 1060 |
| 989 HostPortProxyPair host_port_proxy_pair2(HostPortPair(r2_host_name, 80), | 1061 HostPortProxyPair host_port_proxy_pair2(HostPortPair(r2_host_name, 80), |
| 990 ProxyServer::Direct()); | 1062 ProxyServer::Direct()); |
| 991 QuicCryptoClientConfig* crypto_config2 = | 1063 QuicCryptoClientConfig* crypto_config2 = |
| 992 QuicStreamFactoryPeer::GetOrCreateCryptoConfig(&factory_, | 1064 QuicStreamFactoryPeer::GetOrCreateCryptoConfig( |
| 993 host_port_proxy_pair2); | 1065 &factory_, host_port_proxy_pair2, is_https_); |
| 994 DCHECK(crypto_config2); | 1066 DCHECK(crypto_config2); |
| 995 QuicCryptoClientConfig::CachedState* cached2 = | 1067 QuicCryptoClientConfig::CachedState* cached2 = |
| 996 crypto_config2->LookupOrCreate(host_port_proxy_pair2.first.host()); | 1068 crypto_config2->LookupOrCreate(host_port_proxy_pair2.first.host()); |
| 997 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token()); | 1069 EXPECT_EQ(cached1->source_address_token(), cached2->source_address_token()); |
| 998 EXPECT_TRUE(cached2->proof_valid()); | 1070 EXPECT_TRUE(cached2->proof_valid()); |
| 999 } | 1071 } |
| 1000 } | 1072 } |
| 1001 | 1073 |
| 1002 TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) { | 1074 TEST_P(QuicStreamFactoryTest, CryptoConfigWhenProofIsInvalid) { |
| 1003 vector<string> cannoncial_suffixes; | 1075 vector<string> cannoncial_suffixes; |
| 1004 cannoncial_suffixes.push_back(string(".c.youtube.com")); | 1076 cannoncial_suffixes.push_back(string(".c.youtube.com")); |
| 1005 cannoncial_suffixes.push_back(string(".googlevideo.com")); | 1077 cannoncial_suffixes.push_back(string(".googlevideo.com")); |
| 1006 | 1078 |
| 1007 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) { | 1079 for (unsigned i = 0; i < cannoncial_suffixes.size(); ++i) { |
| 1008 string r3_host_name("r3"); | 1080 string r3_host_name("r3"); |
| 1009 string r4_host_name("r4"); | 1081 string r4_host_name("r4"); |
| 1010 r3_host_name.append(cannoncial_suffixes[i]); | 1082 r3_host_name.append(cannoncial_suffixes[i]); |
| 1011 r4_host_name.append(cannoncial_suffixes[i]); | 1083 r4_host_name.append(cannoncial_suffixes[i]); |
| 1012 | 1084 |
| 1013 HostPortProxyPair host_port_proxy_pair1(HostPortPair(r3_host_name, 80), | 1085 HostPortProxyPair host_port_proxy_pair1(HostPortPair(r3_host_name, 80), |
| 1014 ProxyServer::Direct()); | 1086 ProxyServer::Direct()); |
| 1015 | 1087 |
| 1016 QuicCryptoClientConfig* crypto_config1 = | 1088 QuicCryptoClientConfig* crypto_config1 = |
| 1017 QuicStreamFactoryPeer::GetOrCreateCryptoConfig(&factory_, | 1089 QuicStreamFactoryPeer::GetOrCreateCryptoConfig( |
| 1018 host_port_proxy_pair1); | 1090 &factory_, host_port_proxy_pair1, is_https_); |
| 1019 DCHECK(crypto_config1); | 1091 DCHECK(crypto_config1); |
| 1020 QuicCryptoClientConfig::CachedState* cached1 = | 1092 QuicCryptoClientConfig::CachedState* cached1 = |
| 1021 crypto_config1->LookupOrCreate(host_port_proxy_pair1.first.host()); | 1093 crypto_config1->LookupOrCreate(host_port_proxy_pair1.first.host()); |
| 1022 EXPECT_FALSE(cached1->proof_valid()); | 1094 EXPECT_FALSE(cached1->proof_valid()); |
| 1023 EXPECT_TRUE(cached1->source_address_token().empty()); | 1095 EXPECT_TRUE(cached1->source_address_token().empty()); |
| 1024 | 1096 |
| 1025 // Mutate the cached1 to have different data. | 1097 // Mutate the cached1 to have different data. |
| 1026 // TODO(rtenneti): mutate other members of CachedState. | 1098 // TODO(rtenneti): mutate other members of CachedState. |
| 1027 cached1->set_source_address_token(r3_host_name); | 1099 cached1->set_source_address_token(r3_host_name); |
| 1028 cached1->SetProofInvalid(); | 1100 cached1->SetProofInvalid(); |
| 1029 | 1101 |
| 1030 HostPortProxyPair host_port_proxy_pair2(HostPortPair(r4_host_name, 80), | 1102 HostPortProxyPair host_port_proxy_pair2(HostPortPair(r4_host_name, 80), |
| 1031 ProxyServer::Direct()); | 1103 ProxyServer::Direct()); |
| 1032 QuicCryptoClientConfig* crypto_config2 = | 1104 QuicCryptoClientConfig* crypto_config2 = |
| 1033 QuicStreamFactoryPeer::GetOrCreateCryptoConfig(&factory_, | 1105 QuicStreamFactoryPeer::GetOrCreateCryptoConfig( |
| 1034 host_port_proxy_pair2); | 1106 &factory_, host_port_proxy_pair2, is_https_); |
| 1035 DCHECK(crypto_config2); | 1107 DCHECK(crypto_config2); |
| 1036 QuicCryptoClientConfig::CachedState* cached2 = | 1108 QuicCryptoClientConfig::CachedState* cached2 = |
| 1037 crypto_config2->LookupOrCreate(host_port_proxy_pair2.first.host()); | 1109 crypto_config2->LookupOrCreate(host_port_proxy_pair2.first.host()); |
| 1038 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); | 1110 EXPECT_NE(cached1->source_address_token(), cached2->source_address_token()); |
| 1039 EXPECT_TRUE(cached2->source_address_token().empty()); | 1111 EXPECT_TRUE(cached2->source_address_token().empty()); |
| 1040 EXPECT_FALSE(cached2->proof_valid()); | 1112 EXPECT_FALSE(cached2->proof_valid()); |
| 1041 } | 1113 } |
| 1042 } | 1114 } |
| 1043 | 1115 |
| 1044 } // namespace test | 1116 } // namespace test |
| 1045 } // namespace net | 1117 } // namespace net |
| OLD | NEW |