OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/spdy/spdy_session_pool.h" | 5 #include "net/spdy/spdy_session_pool.h" |
6 | 6 |
7 #include <cstddef> | 7 #include <cstddef> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 | 131 |
132 // Close the current session. | 132 // Close the current session. |
133 spdy_session_pool_->CloseCurrentSessions(net::ERR_ABORTED); | 133 spdy_session_pool_->CloseCurrentSessions(net::ERR_ABORTED); |
134 | 134 |
135 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, test_key)); | 135 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, test_key)); |
136 } | 136 } |
137 | 137 |
138 TEST_P(SpdySessionPoolTest, CloseCurrentIdleSessions) { | 138 TEST_P(SpdySessionPoolTest, CloseCurrentIdleSessions) { |
139 MockConnect connect_data(SYNCHRONOUS, OK); | 139 MockConnect connect_data(SYNCHRONOUS, OK); |
140 MockRead reads[] = { | 140 MockRead reads[] = { |
141 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 141 MockRead(ASYNC, 0, 0) // EOF |
142 }; | 142 }; |
143 | 143 |
144 session_deps_.host_resolver->set_synchronous_mode(true); | 144 session_deps_.host_resolver->set_synchronous_mode(true); |
145 | 145 |
146 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 146 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
147 data.set_connect_data(connect_data); | 147 data.set_connect_data(connect_data); |
148 session_deps_.socket_factory->AddSocketDataProvider(&data); | 148 session_deps_.socket_factory->AddSocketDataProvider(&data); |
149 | 149 |
150 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 150 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
151 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); | 151 session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
188 base::WeakPtr<SpdySession> session3 = | 188 base::WeakPtr<SpdySession> session3 = |
189 CreateInsecureSpdySession(http_session_, key3, BoundNetLog()); | 189 CreateInsecureSpdySession(http_session_, key3, BoundNetLog()); |
190 GURL url3(kTestHost3); | 190 GURL url3(kTestHost3); |
191 base::WeakPtr<SpdyStream> spdy_stream3 = | 191 base::WeakPtr<SpdyStream> spdy_stream3 = |
192 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 192 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, |
193 session3, url3, MEDIUM, BoundNetLog()); | 193 session3, url3, MEDIUM, BoundNetLog()); |
194 ASSERT_TRUE(spdy_stream3.get() != NULL); | 194 ASSERT_TRUE(spdy_stream3.get() != NULL); |
195 | 195 |
196 // All sessions are active and not closed | 196 // All sessions are active and not closed |
197 EXPECT_TRUE(session1->is_active()); | 197 EXPECT_TRUE(session1->is_active()); |
198 EXPECT_TRUE(session1->IsAvailable()); | 198 EXPECT_FALSE(session1->IsClosed()); |
199 EXPECT_TRUE(session2->is_active()); | 199 EXPECT_TRUE(session2->is_active()); |
200 EXPECT_TRUE(session2->IsAvailable()); | 200 EXPECT_FALSE(session2->IsClosed()); |
201 EXPECT_TRUE(session3->is_active()); | 201 EXPECT_TRUE(session3->is_active()); |
202 EXPECT_TRUE(session3->IsAvailable()); | 202 EXPECT_FALSE(session3->IsClosed()); |
203 | 203 |
204 // Should not do anything, all are active | 204 // Should not do anything, all are active |
205 spdy_session_pool_->CloseCurrentIdleSessions(); | 205 spdy_session_pool_->CloseCurrentIdleSessions(); |
206 EXPECT_TRUE(session1->is_active()); | 206 EXPECT_TRUE(session1->is_active()); |
207 EXPECT_TRUE(session1->IsAvailable()); | 207 EXPECT_FALSE(session1->IsClosed()); |
208 EXPECT_TRUE(session2->is_active()); | 208 EXPECT_TRUE(session2->is_active()); |
209 EXPECT_TRUE(session2->IsAvailable()); | 209 EXPECT_FALSE(session2->IsClosed()); |
210 EXPECT_TRUE(session3->is_active()); | 210 EXPECT_TRUE(session3->is_active()); |
211 EXPECT_TRUE(session3->IsAvailable()); | 211 EXPECT_FALSE(session3->IsClosed()); |
212 | 212 |
213 // Make sessions 1 and 3 inactive, but keep them open. | 213 // Make sessions 1 and 3 inactive, but keep them open. |
214 // Session 2 still open and active | 214 // Session 2 still open and active |
215 session1->CloseCreatedStream(spdy_stream1, OK); | 215 session1->CloseCreatedStream(spdy_stream1, OK); |
216 EXPECT_EQ(NULL, spdy_stream1.get()); | 216 EXPECT_EQ(NULL, spdy_stream1.get()); |
217 session3->CloseCreatedStream(spdy_stream3, OK); | 217 session3->CloseCreatedStream(spdy_stream3, OK); |
218 EXPECT_EQ(NULL, spdy_stream3.get()); | 218 EXPECT_EQ(NULL, spdy_stream3.get()); |
219 EXPECT_FALSE(session1->is_active()); | 219 EXPECT_FALSE(session1->is_active()); |
220 EXPECT_TRUE(session1->IsAvailable()); | 220 EXPECT_FALSE(session1->IsClosed()); |
221 EXPECT_TRUE(session2->is_active()); | 221 EXPECT_TRUE(session2->is_active()); |
222 EXPECT_TRUE(session2->IsAvailable()); | 222 EXPECT_FALSE(session2->IsClosed()); |
223 EXPECT_FALSE(session3->is_active()); | 223 EXPECT_FALSE(session3->is_active()); |
224 EXPECT_TRUE(session3->IsAvailable()); | 224 EXPECT_FALSE(session3->IsClosed()); |
225 | 225 |
226 // Should close session 1 and 3, 2 should be left open | 226 // Should close session 1 and 3, 2 should be left open |
227 spdy_session_pool_->CloseCurrentIdleSessions(); | 227 spdy_session_pool_->CloseCurrentIdleSessions(); |
228 base::MessageLoop::current()->RunUntilIdle(); | |
229 | |
230 EXPECT_TRUE(session1 == NULL); | 228 EXPECT_TRUE(session1 == NULL); |
231 EXPECT_TRUE(session2->is_active()); | 229 EXPECT_TRUE(session2->is_active()); |
232 EXPECT_TRUE(session2->IsAvailable()); | 230 EXPECT_FALSE(session2->IsClosed()); |
233 EXPECT_TRUE(session3 == NULL); | 231 EXPECT_TRUE(session3 == NULL); |
234 | 232 |
235 // Should not do anything | 233 // Should not do anything |
236 spdy_session_pool_->CloseCurrentIdleSessions(); | 234 spdy_session_pool_->CloseCurrentIdleSessions(); |
237 base::MessageLoop::current()->RunUntilIdle(); | |
238 | |
239 EXPECT_TRUE(session2->is_active()); | 235 EXPECT_TRUE(session2->is_active()); |
240 EXPECT_TRUE(session2->IsAvailable()); | 236 EXPECT_FALSE(session2->IsClosed()); |
241 | 237 |
242 // Make 2 not active | 238 // Make 2 not active |
243 session2->CloseCreatedStream(spdy_stream2, OK); | 239 session2->CloseCreatedStream(spdy_stream2, OK); |
244 base::MessageLoop::current()->RunUntilIdle(); | |
245 | |
246 EXPECT_EQ(NULL, spdy_stream2.get()); | 240 EXPECT_EQ(NULL, spdy_stream2.get()); |
247 EXPECT_FALSE(session2->is_active()); | 241 EXPECT_FALSE(session2->is_active()); |
248 EXPECT_TRUE(session2->IsAvailable()); | 242 EXPECT_FALSE(session2->IsClosed()); |
249 | 243 |
250 // This should close session 2 | 244 // This should close session 2 |
251 spdy_session_pool_->CloseCurrentIdleSessions(); | 245 spdy_session_pool_->CloseCurrentIdleSessions(); |
252 base::MessageLoop::current()->RunUntilIdle(); | |
253 | |
254 EXPECT_TRUE(session2 == NULL); | 246 EXPECT_TRUE(session2 == NULL); |
255 } | 247 } |
256 | 248 |
257 // Set up a SpdyStream to create a new session when it is closed. | 249 // Set up a SpdyStream to create a new session when it is closed. |
258 // CloseAllSessions should close the newly-created session. | 250 // CloseAllSessions should close the newly-created session. |
259 TEST_P(SpdySessionPoolTest, CloseAllSessions) { | 251 TEST_P(SpdySessionPoolTest, CloseAllSessions) { |
260 const char kTestHost[] = "www.foo.com"; | 252 const char kTestHost[] = "www.foo.com"; |
261 const int kTestPort = 80; | 253 const int kTestPort = 80; |
262 | 254 |
263 session_deps_.host_resolver->set_synchronous_mode(true); | 255 session_deps_.host_resolver->set_synchronous_mode(true); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
421 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, test_hosts[1].key)); | 413 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, test_hosts[1].key)); |
422 | 414 |
423 // Expire the host cache | 415 // Expire the host cache |
424 session_deps_.host_resolver->GetHostCache()->clear(); | 416 session_deps_.host_resolver->GetHostCache()->clear(); |
425 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, test_hosts[1].key)); | 417 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, test_hosts[1].key)); |
426 | 418 |
427 // Cleanup the sessions. | 419 // Cleanup the sessions. |
428 switch (close_sessions_type) { | 420 switch (close_sessions_type) { |
429 case SPDY_POOL_CLOSE_SESSIONS_MANUALLY: | 421 case SPDY_POOL_CLOSE_SESSIONS_MANUALLY: |
430 session->CloseSessionOnError(ERR_ABORTED, std::string()); | 422 session->CloseSessionOnError(ERR_ABORTED, std::string()); |
| 423 EXPECT_TRUE(session == NULL); |
431 session2->CloseSessionOnError(ERR_ABORTED, std::string()); | 424 session2->CloseSessionOnError(ERR_ABORTED, std::string()); |
432 base::MessageLoop::current()->RunUntilIdle(); | |
433 EXPECT_TRUE(session == NULL); | |
434 EXPECT_TRUE(session2 == NULL); | 425 EXPECT_TRUE(session2 == NULL); |
435 break; | 426 break; |
436 case SPDY_POOL_CLOSE_CURRENT_SESSIONS: | 427 case SPDY_POOL_CLOSE_CURRENT_SESSIONS: |
437 spdy_session_pool_->CloseCurrentSessions(ERR_ABORTED); | 428 spdy_session_pool_->CloseCurrentSessions(ERR_ABORTED); |
438 break; | 429 break; |
439 case SPDY_POOL_CLOSE_IDLE_SESSIONS: | 430 case SPDY_POOL_CLOSE_IDLE_SESSIONS: |
440 GURL url(test_hosts[0].url); | 431 GURL url(test_hosts[0].url); |
441 base::WeakPtr<SpdyStream> spdy_stream = | 432 base::WeakPtr<SpdyStream> spdy_stream = |
442 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 433 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, |
443 session, url, MEDIUM, BoundNetLog()); | 434 session, url, MEDIUM, BoundNetLog()); |
444 GURL url1(test_hosts[1].url); | 435 GURL url1(test_hosts[1].url); |
445 base::WeakPtr<SpdyStream> spdy_stream1 = | 436 base::WeakPtr<SpdyStream> spdy_stream1 = |
446 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 437 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, |
447 session1, url1, MEDIUM, BoundNetLog()); | 438 session1, url1, MEDIUM, BoundNetLog()); |
448 GURL url2(test_hosts[2].url); | 439 GURL url2(test_hosts[2].url); |
449 base::WeakPtr<SpdyStream> spdy_stream2 = | 440 base::WeakPtr<SpdyStream> spdy_stream2 = |
450 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 441 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, |
451 session2, url2, MEDIUM, BoundNetLog()); | 442 session2, url2, MEDIUM, BoundNetLog()); |
452 | 443 |
453 // Close streams to make spdy_session and spdy_session1 inactive. | 444 // Close streams to make spdy_session and spdy_session1 inactive. |
454 session->CloseCreatedStream(spdy_stream, OK); | 445 session->CloseCreatedStream(spdy_stream, OK); |
455 EXPECT_EQ(NULL, spdy_stream.get()); | 446 EXPECT_EQ(NULL, spdy_stream.get()); |
456 session1->CloseCreatedStream(spdy_stream1, OK); | 447 session1->CloseCreatedStream(spdy_stream1, OK); |
457 EXPECT_EQ(NULL, spdy_stream1.get()); | 448 EXPECT_EQ(NULL, spdy_stream1.get()); |
458 | 449 |
459 // Check spdy_session and spdy_session1 are not closed. | 450 // Check spdy_session and spdy_session1 are not closed. |
460 EXPECT_FALSE(session->is_active()); | 451 EXPECT_FALSE(session->is_active()); |
461 EXPECT_TRUE(session->IsAvailable()); | 452 EXPECT_FALSE(session->IsClosed()); |
462 EXPECT_FALSE(session1->is_active()); | 453 EXPECT_FALSE(session1->is_active()); |
463 EXPECT_TRUE(session1->IsAvailable()); | 454 EXPECT_FALSE(session1->IsClosed()); |
464 EXPECT_TRUE(session2->is_active()); | 455 EXPECT_TRUE(session2->is_active()); |
465 EXPECT_TRUE(session2->IsAvailable()); | 456 EXPECT_FALSE(session2->IsClosed()); |
466 | 457 |
467 // Test that calling CloseIdleSessions, does not cause a crash. | 458 // Test that calling CloseIdleSessions, does not cause a crash. |
468 // http://crbug.com/181400 | 459 // http://crbug.com/181400 |
469 spdy_session_pool_->CloseCurrentIdleSessions(); | 460 spdy_session_pool_->CloseCurrentIdleSessions(); |
470 base::MessageLoop::current()->RunUntilIdle(); | |
471 | 461 |
472 // Verify spdy_session and spdy_session1 are closed. | 462 // Verify spdy_session and spdy_session1 are closed. |
473 EXPECT_TRUE(session == NULL); | 463 EXPECT_TRUE(session == NULL); |
474 EXPECT_TRUE(session1 == NULL); | 464 EXPECT_TRUE(session1 == NULL); |
475 EXPECT_TRUE(session2->is_active()); | 465 EXPECT_TRUE(session2->is_active()); |
476 EXPECT_TRUE(session2->IsAvailable()); | 466 EXPECT_FALSE(session2->IsClosed()); |
477 | 467 |
478 spdy_stream2->Cancel(); | 468 spdy_stream2->Cancel(); |
479 EXPECT_EQ(NULL, spdy_stream.get()); | 469 EXPECT_EQ(NULL, spdy_stream.get()); |
480 EXPECT_EQ(NULL, spdy_stream1.get()); | 470 EXPECT_EQ(NULL, spdy_stream1.get()); |
481 EXPECT_EQ(NULL, spdy_stream2.get()); | 471 EXPECT_EQ(NULL, spdy_stream2.get()); |
482 | |
483 session2->CloseSessionOnError(ERR_ABORTED, std::string()); | 472 session2->CloseSessionOnError(ERR_ABORTED, std::string()); |
484 base::MessageLoop::current()->RunUntilIdle(); | |
485 EXPECT_TRUE(session2 == NULL); | 473 EXPECT_TRUE(session2 == NULL); |
486 break; | 474 break; |
487 } | 475 } |
488 | 476 |
489 // Verify that the map is all cleaned up. | 477 // Verify that the map is all cleaned up. |
490 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, test_hosts[0].key)); | 478 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, test_hosts[0].key)); |
491 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, test_hosts[1].key)); | 479 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, test_hosts[1].key)); |
492 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, test_hosts[2].key)); | 480 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, test_hosts[2].key)); |
493 } | 481 } |
494 | 482 |
495 TEST_P(SpdySessionPoolTest, IPPooling) { | 483 TEST_P(SpdySessionPoolTest, IPPooling) { |
496 RunIPPoolingTest(SPDY_POOL_CLOSE_SESSIONS_MANUALLY); | 484 RunIPPoolingTest(SPDY_POOL_CLOSE_SESSIONS_MANUALLY); |
497 } | 485 } |
498 | 486 |
499 TEST_P(SpdySessionPoolTest, IPPoolingCloseCurrentSessions) { | 487 TEST_P(SpdySessionPoolTest, IPPoolingCloseCurrentSessions) { |
500 RunIPPoolingTest(SPDY_POOL_CLOSE_CURRENT_SESSIONS); | 488 RunIPPoolingTest(SPDY_POOL_CLOSE_CURRENT_SESSIONS); |
501 } | 489 } |
502 | 490 |
503 TEST_P(SpdySessionPoolTest, IPPoolingCloseIdleSessions) { | 491 TEST_P(SpdySessionPoolTest, IPPoolingCloseIdleSessions) { |
504 RunIPPoolingTest(SPDY_POOL_CLOSE_IDLE_SESSIONS); | 492 RunIPPoolingTest(SPDY_POOL_CLOSE_IDLE_SESSIONS); |
505 } | 493 } |
506 | 494 |
507 } // namespace | 495 } // namespace |
508 | 496 |
509 } // namespace net | 497 } // namespace net |
OLD | NEW |