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/spdy/spdy_session.h" | 5 #include "net/spdy/spdy_session.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 SpdySessionTest() | 99 SpdySessionTest() |
100 : old_max_group_sockets_(ClientSocketPoolManager::max_sockets_per_group( | 100 : old_max_group_sockets_(ClientSocketPoolManager::max_sockets_per_group( |
101 HttpNetworkSession::NORMAL_SOCKET_POOL)), | 101 HttpNetworkSession::NORMAL_SOCKET_POOL)), |
102 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( | 102 old_max_pool_sockets_(ClientSocketPoolManager::max_sockets_per_pool( |
103 HttpNetworkSession::NORMAL_SOCKET_POOL)), | 103 HttpNetworkSession::NORMAL_SOCKET_POOL)), |
104 spdy_util_(GetParam()), | 104 spdy_util_(GetParam()), |
105 session_deps_(GetParam()), | 105 session_deps_(GetParam()), |
106 spdy_session_pool_(NULL), | 106 spdy_session_pool_(NULL), |
107 test_url_(kTestUrl), | 107 test_url_(kTestUrl), |
108 test_host_port_pair_(kTestHost, kTestPort), | 108 test_host_port_pair_(kTestHost, kTestPort), |
109 key_(test_host_port_pair_, ProxyServer::Direct(), | 109 key_(test_host_port_pair_, |
110 PRIVACY_MODE_DISABLED) { | 110 ProxyServer::Direct(), |
111 } | 111 PRIVACY_MODE_DISABLED) {} |
112 | 112 |
113 virtual ~SpdySessionTest() { | 113 virtual ~SpdySessionTest() { |
114 // Important to restore the per-pool limit first, since the pool limit must | 114 // Important to restore the per-pool limit first, since the pool limit must |
115 // always be greater than group limit, and the tests reduce both limits. | 115 // always be greater than group limit, and the tests reduce both limits. |
116 ClientSocketPoolManager::set_max_sockets_per_pool( | 116 ClientSocketPoolManager::set_max_sockets_per_pool( |
117 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_pool_sockets_); | 117 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_pool_sockets_); |
118 ClientSocketPoolManager::set_max_sockets_per_group( | 118 ClientSocketPoolManager::set_max_sockets_per_group( |
119 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_group_sockets_); | 119 HttpNetworkSession::NORMAL_SOCKET_POOL, old_max_group_sockets_); |
120 } | 120 } |
121 | 121 |
122 virtual void SetUp() OVERRIDE { | 122 virtual void SetUp() OVERRIDE { g_time_delta = base::TimeDelta(); } |
123 g_time_delta = base::TimeDelta(); | |
124 } | |
125 | 123 |
126 void CreateDeterministicNetworkSession() { | 124 void CreateDeterministicNetworkSession() { |
127 http_session_ = | 125 http_session_ = |
128 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 126 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
129 spdy_session_pool_ = http_session_->spdy_session_pool(); | 127 spdy_session_pool_ = http_session_->spdy_session_pool(); |
130 } | 128 } |
131 | 129 |
132 void CreateNetworkSession() { | 130 void CreateNetworkSession() { |
133 http_session_ = | 131 http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
134 SpdySessionDependencies::SpdyCreateSession(&session_deps_); | |
135 spdy_session_pool_ = http_session_->spdy_session_pool(); | 132 spdy_session_pool_ = http_session_->spdy_session_pool(); |
136 } | 133 } |
137 | 134 |
138 void StallSessionSend(SpdySession* session) { | 135 void StallSessionSend(SpdySession* session) { |
139 // Reduce the send window size to 0 to stall. | 136 // Reduce the send window size to 0 to stall. |
140 while (session->session_send_window_size_ > 0) { | 137 while (session->session_send_window_size_ > 0) { |
141 session->DecreaseSendWindowSize( | 138 session->DecreaseSendWindowSize( |
142 std::min(kMaxSpdyFrameChunkSize, session->session_send_window_size_)); | 139 std::min(kMaxSpdyFrameChunkSize, session->session_send_window_size_)); |
143 } | 140 } |
144 } | 141 } |
(...skipping 26 matching lines...) Expand all Loading... |
171 | 168 |
172 SpdyTestUtil spdy_util_; | 169 SpdyTestUtil spdy_util_; |
173 SpdySessionDependencies session_deps_; | 170 SpdySessionDependencies session_deps_; |
174 scoped_refptr<HttpNetworkSession> http_session_; | 171 scoped_refptr<HttpNetworkSession> http_session_; |
175 SpdySessionPool* spdy_session_pool_; | 172 SpdySessionPool* spdy_session_pool_; |
176 GURL test_url_; | 173 GURL test_url_; |
177 HostPortPair test_host_port_pair_; | 174 HostPortPair test_host_port_pair_; |
178 SpdySessionKey key_; | 175 SpdySessionKey key_; |
179 }; | 176 }; |
180 | 177 |
181 INSTANTIATE_TEST_CASE_P( | 178 INSTANTIATE_TEST_CASE_P(NextProto, |
182 NextProto, | 179 SpdySessionTest, |
183 SpdySessionTest, | 180 testing::Values(kProtoDeprecatedSPDY2, |
184 testing::Values(kProtoDeprecatedSPDY2, | 181 kProtoSPDY3, |
185 kProtoSPDY3, kProtoSPDY31, kProtoSPDY4)); | 182 kProtoSPDY31, |
| 183 kProtoSPDY4)); |
186 | 184 |
187 // Try to create a SPDY session that will fail during | 185 // Try to create a SPDY session that will fail during |
188 // initialization. Nothing should blow up. | 186 // initialization. Nothing should blow up. |
189 TEST_P(SpdySessionTest, InitialReadError) { | 187 TEST_P(SpdySessionTest, InitialReadError) { |
190 CreateDeterministicNetworkSession(); | 188 CreateDeterministicNetworkSession(); |
191 | 189 |
192 base::WeakPtr<SpdySession> session = TryCreateFakeSpdySessionExpectingFailure( | 190 base::WeakPtr<SpdySession> session = TryCreateFakeSpdySessionExpectingFailure( |
193 spdy_session_pool_, key_, ERR_FAILED); | 191 spdy_session_pool_, key_, ERR_FAILED); |
194 EXPECT_TRUE(session); | 192 EXPECT_TRUE(session); |
195 // Flush the read. | 193 // Flush the read. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 | 225 |
228 } // namespace | 226 } // namespace |
229 | 227 |
230 // Request kInitialMaxConcurrentStreams streams. Request two more | 228 // Request kInitialMaxConcurrentStreams streams. Request two more |
231 // streams, but have the callback for one destroy the second stream | 229 // streams, but have the callback for one destroy the second stream |
232 // request. Close the session. Nothing should blow up. This is a | 230 // request. Close the session. Nothing should blow up. This is a |
233 // regression test for http://crbug.com/250841 . | 231 // regression test for http://crbug.com/250841 . |
234 TEST_P(SpdySessionTest, PendingStreamCancellingAnother) { | 232 TEST_P(SpdySessionTest, PendingStreamCancellingAnother) { |
235 session_deps_.host_resolver->set_synchronous_mode(true); | 233 session_deps_.host_resolver->set_synchronous_mode(true); |
236 | 234 |
237 MockRead reads[] = {MockRead(ASYNC, 0, 0), }; | 235 MockRead reads[] = { |
| 236 MockRead(ASYNC, 0, 0), |
| 237 }; |
238 | 238 |
239 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); | 239 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); |
240 MockConnect connect_data(SYNCHRONOUS, OK); | 240 MockConnect connect_data(SYNCHRONOUS, OK); |
241 data.set_connect_data(connect_data); | 241 data.set_connect_data(connect_data); |
242 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 242 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
243 | 243 |
244 CreateDeterministicNetworkSession(); | 244 CreateDeterministicNetworkSession(); |
245 | 245 |
246 base::WeakPtr<SpdySession> session = | 246 base::WeakPtr<SpdySession> session = |
247 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 247 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 } | 283 } |
284 | 284 |
285 // A session receiving a GOAWAY frame with no active streams should | 285 // A session receiving a GOAWAY frame with no active streams should |
286 // immediately close. | 286 // immediately close. |
287 TEST_P(SpdySessionTest, GoAwayWithNoActiveStreams) { | 287 TEST_P(SpdySessionTest, GoAwayWithNoActiveStreams) { |
288 session_deps_.host_resolver->set_synchronous_mode(true); | 288 session_deps_.host_resolver->set_synchronous_mode(true); |
289 | 289 |
290 MockConnect connect_data(SYNCHRONOUS, OK); | 290 MockConnect connect_data(SYNCHRONOUS, OK); |
291 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); | 291 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); |
292 MockRead reads[] = { | 292 MockRead reads[] = { |
293 CreateMockRead(*goaway, 0), | 293 CreateMockRead(*goaway, 0), |
294 }; | 294 }; |
295 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); | 295 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); |
296 data.set_connect_data(connect_data); | 296 data.set_connect_data(connect_data); |
297 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 297 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
298 | 298 |
299 CreateDeterministicNetworkSession(); | 299 CreateDeterministicNetworkSession(); |
300 | 300 |
301 base::WeakPtr<SpdySession> session = | 301 base::WeakPtr<SpdySession> session = |
302 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 302 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
303 | 303 |
(...skipping 10 matching lines...) Expand all Loading... |
314 } | 314 } |
315 | 315 |
316 // A session receiving a GOAWAY frame immediately with no active | 316 // A session receiving a GOAWAY frame immediately with no active |
317 // streams should then close. | 317 // streams should then close. |
318 TEST_P(SpdySessionTest, GoAwayImmediatelyWithNoActiveStreams) { | 318 TEST_P(SpdySessionTest, GoAwayImmediatelyWithNoActiveStreams) { |
319 session_deps_.host_resolver->set_synchronous_mode(true); | 319 session_deps_.host_resolver->set_synchronous_mode(true); |
320 | 320 |
321 MockConnect connect_data(SYNCHRONOUS, OK); | 321 MockConnect connect_data(SYNCHRONOUS, OK); |
322 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); | 322 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); |
323 MockRead reads[] = { | 323 MockRead reads[] = { |
324 CreateMockRead(*goaway, 0, SYNCHRONOUS), | 324 CreateMockRead(*goaway, 0, SYNCHRONOUS), |
325 }; | 325 }; |
326 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); | 326 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); |
327 data.set_connect_data(connect_data); | 327 data.set_connect_data(connect_data); |
328 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 328 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
329 | 329 |
330 CreateDeterministicNetworkSession(); | 330 CreateDeterministicNetworkSession(); |
331 | 331 |
332 data.StopAfter(1); | 332 data.StopAfter(1); |
333 | 333 |
334 base::WeakPtr<SpdySession> session = | 334 base::WeakPtr<SpdySession> session = |
335 TryCreateInsecureSpdySessionExpectingFailure( | 335 TryCreateInsecureSpdySessionExpectingFailure( |
336 http_session_, key_, ERR_CONNECTION_CLOSED, BoundNetLog()); | 336 http_session_, key_, ERR_CONNECTION_CLOSED, BoundNetLog()); |
337 base::RunLoop().RunUntilIdle(); | 337 base::RunLoop().RunUntilIdle(); |
338 | 338 |
339 EXPECT_FALSE(session); | 339 EXPECT_FALSE(session); |
340 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 340 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
341 } | 341 } |
342 | 342 |
343 // A session receiving a GOAWAY frame with active streams should close | 343 // A session receiving a GOAWAY frame with active streams should close |
344 // when the last active stream is closed. | 344 // when the last active stream is closed. |
345 TEST_P(SpdySessionTest, GoAwayWithActiveStreams) { | 345 TEST_P(SpdySessionTest, GoAwayWithActiveStreams) { |
346 session_deps_.host_resolver->set_synchronous_mode(true); | 346 session_deps_.host_resolver->set_synchronous_mode(true); |
347 | 347 |
348 MockConnect connect_data(SYNCHRONOUS, OK); | 348 MockConnect connect_data(SYNCHRONOUS, OK); |
349 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); | 349 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); |
350 MockRead reads[] = { | 350 MockRead reads[] = { |
351 CreateMockRead(*goaway, 2), | 351 CreateMockRead(*goaway, 2), MockRead(ASYNC, 0, 3) // EOF |
352 MockRead(ASYNC, 0, 3) // EOF | |
353 }; | 352 }; |
354 scoped_ptr<SpdyFrame> req1( | 353 scoped_ptr<SpdyFrame> req1( |
355 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 354 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
356 scoped_ptr<SpdyFrame> req2( | 355 scoped_ptr<SpdyFrame> req2( |
357 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); | 356 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); |
358 MockWrite writes[] = { | 357 MockWrite writes[] = { |
359 CreateMockWrite(*req1, 0), | 358 CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1), |
360 CreateMockWrite(*req2, 1), | |
361 }; | 359 }; |
362 DeterministicSocketData data(reads, arraysize(reads), | 360 DeterministicSocketData data( |
363 writes, arraysize(writes)); | 361 reads, arraysize(reads), writes, arraysize(writes)); |
364 data.set_connect_data(connect_data); | 362 data.set_connect_data(connect_data); |
365 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 363 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
366 | 364 |
367 CreateDeterministicNetworkSession(); | 365 CreateDeterministicNetworkSession(); |
368 | 366 |
369 base::WeakPtr<SpdySession> session = | 367 base::WeakPtr<SpdySession> session = |
370 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 368 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
371 | 369 |
372 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); | 370 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); |
373 | 371 |
374 GURL url(kDefaultURL); | 372 GURL url(kDefaultURL); |
375 base::WeakPtr<SpdyStream> spdy_stream1 = | 373 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
376 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 374 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog()); |
377 session, url, MEDIUM, BoundNetLog()); | |
378 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 375 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
379 spdy_stream1->SetDelegate(&delegate1); | 376 spdy_stream1->SetDelegate(&delegate1); |
380 | 377 |
381 base::WeakPtr<SpdyStream> spdy_stream2 = | 378 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
382 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 379 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog()); |
383 session, url, MEDIUM, BoundNetLog()); | |
384 test::StreamDelegateDoNothing delegate2(spdy_stream2); | 380 test::StreamDelegateDoNothing delegate2(spdy_stream2); |
385 spdy_stream2->SetDelegate(&delegate2); | 381 spdy_stream2->SetDelegate(&delegate2); |
386 | 382 |
387 scoped_ptr<SpdyHeaderBlock> headers( | 383 scoped_ptr<SpdyHeaderBlock> headers( |
388 spdy_util_.ConstructGetHeaderBlock(url.spec())); | 384 spdy_util_.ConstructGetHeaderBlock(url.spec())); |
389 scoped_ptr<SpdyHeaderBlock> headers2(new SpdyHeaderBlock(*headers)); | 385 scoped_ptr<SpdyHeaderBlock> headers2(new SpdyHeaderBlock(*headers)); |
390 | 386 |
391 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 387 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
392 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 388 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
393 spdy_stream2->SendRequestHeaders(headers2.Pass(), NO_MORE_DATA_TO_SEND); | 389 spdy_stream2->SendRequestHeaders(headers2.Pass(), NO_MORE_DATA_TO_SEND); |
(...skipping 27 matching lines...) Expand all Loading... |
421 // Have a session receive two GOAWAY frames, with the last one causing | 417 // Have a session receive two GOAWAY frames, with the last one causing |
422 // the last active stream to be closed. The session should then be | 418 // the last active stream to be closed. The session should then be |
423 // closed after the second GOAWAY frame. | 419 // closed after the second GOAWAY frame. |
424 TEST_P(SpdySessionTest, GoAwayTwice) { | 420 TEST_P(SpdySessionTest, GoAwayTwice) { |
425 session_deps_.host_resolver->set_synchronous_mode(true); | 421 session_deps_.host_resolver->set_synchronous_mode(true); |
426 | 422 |
427 MockConnect connect_data(SYNCHRONOUS, OK); | 423 MockConnect connect_data(SYNCHRONOUS, OK); |
428 scoped_ptr<SpdyFrame> goaway1(spdy_util_.ConstructSpdyGoAway(1)); | 424 scoped_ptr<SpdyFrame> goaway1(spdy_util_.ConstructSpdyGoAway(1)); |
429 scoped_ptr<SpdyFrame> goaway2(spdy_util_.ConstructSpdyGoAway(0)); | 425 scoped_ptr<SpdyFrame> goaway2(spdy_util_.ConstructSpdyGoAway(0)); |
430 MockRead reads[] = { | 426 MockRead reads[] = { |
431 CreateMockRead(*goaway1, 2), | 427 CreateMockRead(*goaway1, 2), CreateMockRead(*goaway2, 3), |
432 CreateMockRead(*goaway2, 3), | 428 MockRead(ASYNC, 0, 4) // EOF |
433 MockRead(ASYNC, 0, 4) // EOF | |
434 }; | 429 }; |
435 scoped_ptr<SpdyFrame> req1( | 430 scoped_ptr<SpdyFrame> req1( |
436 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 431 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
437 scoped_ptr<SpdyFrame> req2( | 432 scoped_ptr<SpdyFrame> req2( |
438 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); | 433 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); |
439 MockWrite writes[] = { | 434 MockWrite writes[] = { |
440 CreateMockWrite(*req1, 0), | 435 CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1), |
441 CreateMockWrite(*req2, 1), | |
442 }; | 436 }; |
443 DeterministicSocketData data(reads, arraysize(reads), | 437 DeterministicSocketData data( |
444 writes, arraysize(writes)); | 438 reads, arraysize(reads), writes, arraysize(writes)); |
445 data.set_connect_data(connect_data); | 439 data.set_connect_data(connect_data); |
446 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 440 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
447 | 441 |
448 CreateDeterministicNetworkSession(); | 442 CreateDeterministicNetworkSession(); |
449 | 443 |
450 base::WeakPtr<SpdySession> session = | 444 base::WeakPtr<SpdySession> session = |
451 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 445 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
452 | 446 |
453 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); | 447 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); |
454 | 448 |
455 GURL url(kDefaultURL); | 449 GURL url(kDefaultURL); |
456 base::WeakPtr<SpdyStream> spdy_stream1 = | 450 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
457 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 451 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog()); |
458 session, url, MEDIUM, BoundNetLog()); | |
459 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 452 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
460 spdy_stream1->SetDelegate(&delegate1); | 453 spdy_stream1->SetDelegate(&delegate1); |
461 | 454 |
462 base::WeakPtr<SpdyStream> spdy_stream2 = | 455 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
463 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 456 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog()); |
464 session, url, MEDIUM, BoundNetLog()); | |
465 test::StreamDelegateDoNothing delegate2(spdy_stream2); | 457 test::StreamDelegateDoNothing delegate2(spdy_stream2); |
466 spdy_stream2->SetDelegate(&delegate2); | 458 spdy_stream2->SetDelegate(&delegate2); |
467 | 459 |
468 scoped_ptr<SpdyHeaderBlock> headers( | 460 scoped_ptr<SpdyHeaderBlock> headers( |
469 spdy_util_.ConstructGetHeaderBlock(url.spec())); | 461 spdy_util_.ConstructGetHeaderBlock(url.spec())); |
470 scoped_ptr<SpdyHeaderBlock> headers2(new SpdyHeaderBlock(*headers)); | 462 scoped_ptr<SpdyHeaderBlock> headers2(new SpdyHeaderBlock(*headers)); |
471 | 463 |
472 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 464 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
473 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 465 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
474 spdy_stream2->SendRequestHeaders(headers2.Pass(), NO_MORE_DATA_TO_SEND); | 466 spdy_stream2->SendRequestHeaders(headers2.Pass(), NO_MORE_DATA_TO_SEND); |
(...skipping 26 matching lines...) Expand all Loading... |
501 | 493 |
502 // Have a session with active streams receive a GOAWAY frame and then | 494 // Have a session with active streams receive a GOAWAY frame and then |
503 // close it. It should handle the close properly (i.e., not try to | 495 // close it. It should handle the close properly (i.e., not try to |
504 // make itself unavailable in its pool twice). | 496 // make itself unavailable in its pool twice). |
505 TEST_P(SpdySessionTest, GoAwayWithActiveStreamsThenClose) { | 497 TEST_P(SpdySessionTest, GoAwayWithActiveStreamsThenClose) { |
506 session_deps_.host_resolver->set_synchronous_mode(true); | 498 session_deps_.host_resolver->set_synchronous_mode(true); |
507 | 499 |
508 MockConnect connect_data(SYNCHRONOUS, OK); | 500 MockConnect connect_data(SYNCHRONOUS, OK); |
509 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); | 501 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); |
510 MockRead reads[] = { | 502 MockRead reads[] = { |
511 CreateMockRead(*goaway, 2), | 503 CreateMockRead(*goaway, 2), MockRead(ASYNC, 0, 3) // EOF |
512 MockRead(ASYNC, 0, 3) // EOF | |
513 }; | 504 }; |
514 scoped_ptr<SpdyFrame> req1( | 505 scoped_ptr<SpdyFrame> req1( |
515 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 506 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
516 scoped_ptr<SpdyFrame> req2( | 507 scoped_ptr<SpdyFrame> req2( |
517 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); | 508 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); |
518 MockWrite writes[] = { | 509 MockWrite writes[] = { |
519 CreateMockWrite(*req1, 0), | 510 CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1), |
520 CreateMockWrite(*req2, 1), | |
521 }; | 511 }; |
522 DeterministicSocketData data(reads, arraysize(reads), | 512 DeterministicSocketData data( |
523 writes, arraysize(writes)); | 513 reads, arraysize(reads), writes, arraysize(writes)); |
524 data.set_connect_data(connect_data); | 514 data.set_connect_data(connect_data); |
525 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 515 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
526 | 516 |
527 CreateDeterministicNetworkSession(); | 517 CreateDeterministicNetworkSession(); |
528 | 518 |
529 base::WeakPtr<SpdySession> session = | 519 base::WeakPtr<SpdySession> session = |
530 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 520 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
531 | 521 |
532 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); | 522 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); |
533 | 523 |
534 GURL url(kDefaultURL); | 524 GURL url(kDefaultURL); |
535 base::WeakPtr<SpdyStream> spdy_stream1 = | 525 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
536 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 526 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog()); |
537 session, url, MEDIUM, BoundNetLog()); | |
538 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 527 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
539 spdy_stream1->SetDelegate(&delegate1); | 528 spdy_stream1->SetDelegate(&delegate1); |
540 | 529 |
541 base::WeakPtr<SpdyStream> spdy_stream2 = | 530 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
542 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 531 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog()); |
543 session, url, MEDIUM, BoundNetLog()); | |
544 test::StreamDelegateDoNothing delegate2(spdy_stream2); | 532 test::StreamDelegateDoNothing delegate2(spdy_stream2); |
545 spdy_stream2->SetDelegate(&delegate2); | 533 spdy_stream2->SetDelegate(&delegate2); |
546 | 534 |
547 scoped_ptr<SpdyHeaderBlock> headers( | 535 scoped_ptr<SpdyHeaderBlock> headers( |
548 spdy_util_.ConstructGetHeaderBlock(url.spec())); | 536 spdy_util_.ConstructGetHeaderBlock(url.spec())); |
549 scoped_ptr<SpdyHeaderBlock> headers2(new SpdyHeaderBlock(*headers)); | 537 scoped_ptr<SpdyHeaderBlock> headers2(new SpdyHeaderBlock(*headers)); |
550 | 538 |
551 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 539 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
552 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 540 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
553 spdy_stream2->SendRequestHeaders(headers2.Pass(), NO_MORE_DATA_TO_SEND); | 541 spdy_stream2->SendRequestHeaders(headers2.Pass(), NO_MORE_DATA_TO_SEND); |
(...skipping 24 matching lines...) Expand all Loading... |
578 } | 566 } |
579 | 567 |
580 // Try to create a stream after receiving a GOAWAY frame. It should | 568 // Try to create a stream after receiving a GOAWAY frame. It should |
581 // fail. | 569 // fail. |
582 TEST_P(SpdySessionTest, CreateStreamAfterGoAway) { | 570 TEST_P(SpdySessionTest, CreateStreamAfterGoAway) { |
583 session_deps_.host_resolver->set_synchronous_mode(true); | 571 session_deps_.host_resolver->set_synchronous_mode(true); |
584 | 572 |
585 MockConnect connect_data(SYNCHRONOUS, OK); | 573 MockConnect connect_data(SYNCHRONOUS, OK); |
586 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); | 574 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); |
587 MockRead reads[] = { | 575 MockRead reads[] = { |
588 CreateMockRead(*goaway, 1), | 576 CreateMockRead(*goaway, 1), MockRead(ASYNC, 0, 2) // EOF |
589 MockRead(ASYNC, 0, 2) // EOF | |
590 }; | 577 }; |
591 scoped_ptr<SpdyFrame> req( | 578 scoped_ptr<SpdyFrame> req( |
592 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 579 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
593 MockWrite writes[] = { | 580 MockWrite writes[] = { |
594 CreateMockWrite(*req, 0), | 581 CreateMockWrite(*req, 0), |
595 }; | 582 }; |
596 DeterministicSocketData data(reads, arraysize(reads), | 583 DeterministicSocketData data( |
597 writes, arraysize(writes)); | 584 reads, arraysize(reads), writes, arraysize(writes)); |
598 data.set_connect_data(connect_data); | 585 data.set_connect_data(connect_data); |
599 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 586 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
600 | 587 |
601 CreateDeterministicNetworkSession(); | 588 CreateDeterministicNetworkSession(); |
602 | 589 |
603 base::WeakPtr<SpdySession> session = | 590 base::WeakPtr<SpdySession> session = |
604 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 591 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
605 | 592 |
606 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); | 593 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); |
607 | 594 |
608 GURL url(kDefaultURL); | 595 GURL url(kDefaultURL); |
609 base::WeakPtr<SpdyStream> spdy_stream = | 596 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
610 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 597 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog()); |
611 session, url, MEDIUM, BoundNetLog()); | |
612 test::StreamDelegateDoNothing delegate(spdy_stream); | 598 test::StreamDelegateDoNothing delegate(spdy_stream); |
613 spdy_stream->SetDelegate(&delegate); | 599 spdy_stream->SetDelegate(&delegate); |
614 | 600 |
615 scoped_ptr<SpdyHeaderBlock> headers( | 601 scoped_ptr<SpdyHeaderBlock> headers( |
616 spdy_util_.ConstructGetHeaderBlock(url.spec())); | 602 spdy_util_.ConstructGetHeaderBlock(url.spec())); |
617 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 603 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
618 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 604 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
619 | 605 |
620 data.RunFor(1); | 606 data.RunFor(1); |
621 | 607 |
622 EXPECT_EQ(1u, spdy_stream->stream_id()); | 608 EXPECT_EQ(1u, spdy_stream->stream_id()); |
623 | 609 |
624 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); | 610 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); |
625 | 611 |
626 // Read and process the GOAWAY frame. | 612 // Read and process the GOAWAY frame. |
627 data.RunFor(1); | 613 data.RunFor(1); |
628 | 614 |
629 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 615 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
630 EXPECT_TRUE(session->IsStreamActive(1)); | 616 EXPECT_TRUE(session->IsStreamActive(1)); |
631 | 617 |
632 SpdyStreamRequest stream_request; | 618 SpdyStreamRequest stream_request; |
633 int rv = stream_request.StartRequest( | 619 int rv = stream_request.StartRequest(SPDY_REQUEST_RESPONSE_STREAM, |
634 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog(), | 620 session, |
635 CompletionCallback()); | 621 url, |
| 622 MEDIUM, |
| 623 BoundNetLog(), |
| 624 CompletionCallback()); |
636 EXPECT_EQ(ERR_FAILED, rv); | 625 EXPECT_EQ(ERR_FAILED, rv); |
637 | 626 |
638 // Read and process EOF. | 627 // Read and process EOF. |
639 data.RunFor(1); | 628 data.RunFor(1); |
640 | 629 |
641 EXPECT_TRUE(session == NULL); | 630 EXPECT_TRUE(session == NULL); |
642 } | 631 } |
643 | 632 |
644 // Receiving a SYN_STREAM frame after a GOAWAY frame should result in | 633 // Receiving a SYN_STREAM frame after a GOAWAY frame should result in |
645 // the stream being refused. | 634 // the stream being refused. |
646 TEST_P(SpdySessionTest, SynStreamAfterGoAway) { | 635 TEST_P(SpdySessionTest, SynStreamAfterGoAway) { |
647 session_deps_.host_resolver->set_synchronous_mode(true); | 636 session_deps_.host_resolver->set_synchronous_mode(true); |
648 | 637 |
649 MockConnect connect_data(SYNCHRONOUS, OK); | 638 MockConnect connect_data(SYNCHRONOUS, OK); |
650 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); | 639 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway(1)); |
651 scoped_ptr<SpdyFrame> | 640 scoped_ptr<SpdyFrame> push( |
652 push(spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kDefaultURL)); | 641 spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kDefaultURL)); |
653 MockRead reads[] = { | 642 MockRead reads[] = { |
654 CreateMockRead(*goaway, 1), | 643 CreateMockRead(*goaway, 1), CreateMockRead(*push, 2), |
655 CreateMockRead(*push, 2), | 644 MockRead(ASYNC, 0, 4) // EOF |
656 MockRead(ASYNC, 0, 4) // EOF | |
657 }; | 645 }; |
658 scoped_ptr<SpdyFrame> req( | 646 scoped_ptr<SpdyFrame> req( |
659 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 647 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
660 scoped_ptr<SpdyFrame> rst( | 648 scoped_ptr<SpdyFrame> rst( |
661 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); | 649 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
662 MockWrite writes[] = { | 650 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*rst, 3)}; |
663 CreateMockWrite(*req, 0), | 651 DeterministicSocketData data( |
664 CreateMockWrite(*rst, 3) | 652 reads, arraysize(reads), writes, arraysize(writes)); |
665 }; | |
666 DeterministicSocketData data(reads, arraysize(reads), | |
667 writes, arraysize(writes)); | |
668 data.set_connect_data(connect_data); | 653 data.set_connect_data(connect_data); |
669 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 654 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
670 | 655 |
671 CreateDeterministicNetworkSession(); | 656 CreateDeterministicNetworkSession(); |
672 | 657 |
673 base::WeakPtr<SpdySession> session = | 658 base::WeakPtr<SpdySession> session = |
674 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 659 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
675 | 660 |
676 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); | 661 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); |
677 | 662 |
678 GURL url(kDefaultURL); | 663 GURL url(kDefaultURL); |
679 base::WeakPtr<SpdyStream> spdy_stream = | 664 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
680 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 665 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog()); |
681 session, url, MEDIUM, BoundNetLog()); | |
682 test::StreamDelegateDoNothing delegate(spdy_stream); | 666 test::StreamDelegateDoNothing delegate(spdy_stream); |
683 spdy_stream->SetDelegate(&delegate); | 667 spdy_stream->SetDelegate(&delegate); |
684 | 668 |
685 scoped_ptr<SpdyHeaderBlock> headers( | 669 scoped_ptr<SpdyHeaderBlock> headers( |
686 spdy_util_.ConstructGetHeaderBlock(url.spec())); | 670 spdy_util_.ConstructGetHeaderBlock(url.spec())); |
687 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 671 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
688 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 672 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
689 | 673 |
690 data.RunFor(1); | 674 data.RunFor(1); |
691 | 675 |
(...skipping 14 matching lines...) Expand all Loading... |
706 EXPECT_TRUE(session == NULL); | 690 EXPECT_TRUE(session == NULL); |
707 } | 691 } |
708 | 692 |
709 // A session observing a network change with active streams should close | 693 // A session observing a network change with active streams should close |
710 // when the last active stream is closed. | 694 // when the last active stream is closed. |
711 TEST_P(SpdySessionTest, NetworkChangeWithActiveStreams) { | 695 TEST_P(SpdySessionTest, NetworkChangeWithActiveStreams) { |
712 session_deps_.host_resolver->set_synchronous_mode(true); | 696 session_deps_.host_resolver->set_synchronous_mode(true); |
713 | 697 |
714 MockConnect connect_data(SYNCHRONOUS, OK); | 698 MockConnect connect_data(SYNCHRONOUS, OK); |
715 MockRead reads[] = { | 699 MockRead reads[] = { |
716 MockRead(ASYNC, 0, 1) // EOF | 700 MockRead(ASYNC, 0, 1) // EOF |
717 }; | 701 }; |
718 scoped_ptr<SpdyFrame> req1( | 702 scoped_ptr<SpdyFrame> req1( |
719 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 703 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
720 MockWrite writes[] = { | 704 MockWrite writes[] = { |
721 CreateMockWrite(*req1, 0), | 705 CreateMockWrite(*req1, 0), |
722 }; | 706 }; |
723 DeterministicSocketData data(reads, arraysize(reads), | 707 DeterministicSocketData data( |
724 writes, arraysize(writes)); | 708 reads, arraysize(reads), writes, arraysize(writes)); |
725 data.set_connect_data(connect_data); | 709 data.set_connect_data(connect_data); |
726 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 710 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
727 | 711 |
728 CreateDeterministicNetworkSession(); | 712 CreateDeterministicNetworkSession(); |
729 | 713 |
730 base::WeakPtr<SpdySession> session = | 714 base::WeakPtr<SpdySession> session = |
731 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 715 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
732 | 716 |
733 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); | 717 EXPECT_EQ(spdy_util_.spdy_version(), session->GetProtocolVersion()); |
734 | 718 |
735 base::WeakPtr<SpdyStream> spdy_stream = | 719 base::WeakPtr<SpdyStream> spdy_stream = |
736 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, session, | 720 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, |
737 GURL(kDefaultURL), MEDIUM, BoundNetLog()); | 721 session, |
| 722 GURL(kDefaultURL), |
| 723 MEDIUM, |
| 724 BoundNetLog()); |
738 test::StreamDelegateDoNothing delegate(spdy_stream); | 725 test::StreamDelegateDoNothing delegate(spdy_stream); |
739 spdy_stream->SetDelegate(&delegate); | 726 spdy_stream->SetDelegate(&delegate); |
740 | 727 |
741 scoped_ptr<SpdyHeaderBlock> headers( | 728 scoped_ptr<SpdyHeaderBlock> headers( |
742 spdy_util_.ConstructGetHeaderBlock(kDefaultURL)); | 729 spdy_util_.ConstructGetHeaderBlock(kDefaultURL)); |
743 | 730 |
744 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 731 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
745 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 732 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
746 | 733 |
747 data.RunFor(1); | 734 data.RunFor(1); |
748 | 735 |
749 EXPECT_EQ(1u, spdy_stream->stream_id()); | 736 EXPECT_EQ(1u, spdy_stream->stream_id()); |
750 | 737 |
751 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); | 738 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); |
752 | 739 |
753 spdy_session_pool_->OnIPAddressChanged(); | 740 spdy_session_pool_->OnIPAddressChanged(); |
754 | 741 |
755 // The SpdySessionPool behavior differs based on how the OSs reacts to | 742 // The SpdySessionPool behavior differs based on how the OSs reacts to |
756 // network changes; see comment in SpdySessionPool::OnIPAddressChanged(). | 743 // network changes; see comment in SpdySessionPool::OnIPAddressChanged(). |
757 #if defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_IOS) | 744 #if defined(OS_ANDROID) || defined(OS_WIN) || defined(OS_IOS) |
758 // For OSs where the TCP connections will close upon relevant network | 745 // For OSs where the TCP connections will close upon relevant network |
759 // changes, SpdySessionPool doesn't need to force them to close, so in these | 746 // changes, SpdySessionPool doesn't need to force them to close, so in these |
760 // cases verify the session has become unavailable but remains open and the | 747 // cases verify the session has become unavailable but remains open and the |
761 // pre-existing stream is still active. | 748 // pre-existing stream is still active. |
762 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 749 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
763 | 750 |
764 EXPECT_FALSE(session->IsClosed()); | 751 EXPECT_FALSE(session->IsClosed()); |
765 | 752 |
766 EXPECT_TRUE(session->IsStreamActive(1)); | 753 EXPECT_TRUE(session->IsStreamActive(1)); |
767 | 754 |
768 // Should close the session. | 755 // Should close the session. |
769 spdy_stream->Close(); | 756 spdy_stream->Close(); |
770 #endif | 757 #endif |
771 EXPECT_EQ(NULL, spdy_stream.get()); | 758 EXPECT_EQ(NULL, spdy_stream.get()); |
772 | 759 |
773 EXPECT_TRUE(session == NULL); | 760 EXPECT_TRUE(session == NULL); |
774 } | 761 } |
775 | 762 |
776 TEST_P(SpdySessionTest, ClientPing) { | 763 TEST_P(SpdySessionTest, ClientPing) { |
777 session_deps_.enable_ping = true; | 764 session_deps_.enable_ping = true; |
778 session_deps_.host_resolver->set_synchronous_mode(true); | 765 session_deps_.host_resolver->set_synchronous_mode(true); |
779 | 766 |
780 MockConnect connect_data(SYNCHRONOUS, OK); | 767 MockConnect connect_data(SYNCHRONOUS, OK); |
781 scoped_ptr<SpdyFrame> read_ping(spdy_util_.ConstructSpdyPing(1, true)); | 768 scoped_ptr<SpdyFrame> read_ping(spdy_util_.ConstructSpdyPing(1, true)); |
782 MockRead reads[] = { | 769 MockRead reads[] = { |
783 CreateMockRead(*read_ping, 1), | 770 CreateMockRead(*read_ping, 1), MockRead(ASYNC, 0, 0, 2) // EOF |
784 MockRead(ASYNC, 0, 0, 2) // EOF | |
785 }; | 771 }; |
786 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(1, false)); | 772 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(1, false)); |
787 MockWrite writes[] = { | 773 MockWrite writes[] = { |
788 CreateMockWrite(*write_ping, 0), | 774 CreateMockWrite(*write_ping, 0), |
789 }; | 775 }; |
790 DeterministicSocketData data( | 776 DeterministicSocketData data( |
791 reads, arraysize(reads), writes, arraysize(writes)); | 777 reads, arraysize(reads), writes, arraysize(writes)); |
792 data.set_connect_data(connect_data); | 778 data.set_connect_data(connect_data); |
793 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 779 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
794 | 780 |
795 CreateDeterministicNetworkSession(); | 781 CreateDeterministicNetworkSession(); |
796 | 782 |
797 base::WeakPtr<SpdySession> session = | 783 base::WeakPtr<SpdySession> session = |
798 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 784 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
799 | 785 |
800 base::WeakPtr<SpdyStream> spdy_stream1 = | 786 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
801 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 787 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, BoundNetLog()); |
802 session, test_url_, MEDIUM, BoundNetLog()); | |
803 ASSERT_TRUE(spdy_stream1.get() != NULL); | 788 ASSERT_TRUE(spdy_stream1.get() != NULL); |
804 test::StreamDelegateSendImmediate delegate(spdy_stream1, NULL); | 789 test::StreamDelegateSendImmediate delegate(spdy_stream1, NULL); |
805 spdy_stream1->SetDelegate(&delegate); | 790 spdy_stream1->SetDelegate(&delegate); |
806 | 791 |
807 base::TimeTicks before_ping_time = base::TimeTicks::Now(); | 792 base::TimeTicks before_ping_time = base::TimeTicks::Now(); |
808 | 793 |
809 session->set_connection_at_risk_of_loss_time( | 794 session->set_connection_at_risk_of_loss_time( |
810 base::TimeDelta::FromSeconds(-1)); | 795 base::TimeDelta::FromSeconds(-1)); |
811 session->set_hung_interval(base::TimeDelta::FromMilliseconds(50)); | 796 session->set_hung_interval(base::TimeDelta::FromMilliseconds(50)); |
812 | 797 |
(...skipping 15 matching lines...) Expand all Loading... |
828 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 813 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
829 EXPECT_TRUE(session == NULL); | 814 EXPECT_TRUE(session == NULL); |
830 } | 815 } |
831 | 816 |
832 TEST_P(SpdySessionTest, ServerPing) { | 817 TEST_P(SpdySessionTest, ServerPing) { |
833 session_deps_.host_resolver->set_synchronous_mode(true); | 818 session_deps_.host_resolver->set_synchronous_mode(true); |
834 | 819 |
835 MockConnect connect_data(SYNCHRONOUS, OK); | 820 MockConnect connect_data(SYNCHRONOUS, OK); |
836 scoped_ptr<SpdyFrame> read_ping(spdy_util_.ConstructSpdyPing(2, false)); | 821 scoped_ptr<SpdyFrame> read_ping(spdy_util_.ConstructSpdyPing(2, false)); |
837 MockRead reads[] = { | 822 MockRead reads[] = { |
838 CreateMockRead(*read_ping), | 823 CreateMockRead(*read_ping), MockRead(SYNCHRONOUS, 0, 0) // EOF |
839 MockRead(SYNCHRONOUS, 0, 0) // EOF | |
840 }; | 824 }; |
841 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(2, true)); | 825 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(2, true)); |
842 MockWrite writes[] = { | 826 MockWrite writes[] = { |
843 CreateMockWrite(*write_ping), | 827 CreateMockWrite(*write_ping), |
844 }; | 828 }; |
845 StaticSocketDataProvider data( | 829 StaticSocketDataProvider data( |
846 reads, arraysize(reads), writes, arraysize(writes)); | 830 reads, arraysize(reads), writes, arraysize(writes)); |
847 data.set_connect_data(connect_data); | 831 data.set_connect_data(connect_data); |
848 session_deps_.socket_factory->AddSocketDataProvider(&data); | 832 session_deps_.socket_factory->AddSocketDataProvider(&data); |
849 | 833 |
850 CreateNetworkSession(); | 834 CreateNetworkSession(); |
851 | 835 |
852 base::WeakPtr<SpdySession> session = | 836 base::WeakPtr<SpdySession> session = |
853 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 837 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
854 | 838 |
855 base::WeakPtr<SpdyStream> spdy_stream1 = | 839 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
856 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 840 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, BoundNetLog()); |
857 session, test_url_, MEDIUM, BoundNetLog()); | |
858 ASSERT_TRUE(spdy_stream1.get() != NULL); | 841 ASSERT_TRUE(spdy_stream1.get() != NULL); |
859 test::StreamDelegateSendImmediate delegate(spdy_stream1, NULL); | 842 test::StreamDelegateSendImmediate delegate(spdy_stream1, NULL); |
860 spdy_stream1->SetDelegate(&delegate); | 843 spdy_stream1->SetDelegate(&delegate); |
861 | 844 |
862 // Flush the read completion task. | 845 // Flush the read completion task. |
863 base::MessageLoop::current()->RunUntilIdle(); | 846 base::MessageLoop::current()->RunUntilIdle(); |
864 | 847 |
865 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 848 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
866 | 849 |
867 EXPECT_TRUE(session == NULL); | 850 EXPECT_TRUE(session == NULL); |
868 EXPECT_EQ(NULL, spdy_stream1.get()); | 851 EXPECT_EQ(NULL, spdy_stream1.get()); |
869 } | 852 } |
870 | 853 |
871 // Cause a ping to be sent out while producing a write. The write loop | 854 // Cause a ping to be sent out while producing a write. The write loop |
872 // should handle this properly, i.e. another DoWriteLoop task should | 855 // should handle this properly, i.e. another DoWriteLoop task should |
873 // not be posted. This is a regression test for | 856 // not be posted. This is a regression test for |
874 // http://crbug.com/261043 . | 857 // http://crbug.com/261043 . |
875 TEST_P(SpdySessionTest, PingAndWriteLoop) { | 858 TEST_P(SpdySessionTest, PingAndWriteLoop) { |
876 session_deps_.enable_ping = true; | 859 session_deps_.enable_ping = true; |
877 session_deps_.time_func = TheNearFuture; | 860 session_deps_.time_func = TheNearFuture; |
878 | 861 |
879 MockConnect connect_data(SYNCHRONOUS, OK); | 862 MockConnect connect_data(SYNCHRONOUS, OK); |
880 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(1, false)); | 863 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(1, false)); |
881 scoped_ptr<SpdyFrame> req( | 864 scoped_ptr<SpdyFrame> req( |
882 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 865 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
883 MockWrite writes[] = { | 866 MockWrite writes[] = { |
884 CreateMockWrite(*req, 0), | 867 CreateMockWrite(*req, 0), CreateMockWrite(*write_ping, 1), |
885 CreateMockWrite(*write_ping, 1), | |
886 }; | 868 }; |
887 | 869 |
888 MockRead reads[] = { | 870 MockRead reads[] = { |
889 MockRead(ASYNC, 0, 2) // EOF | 871 MockRead(ASYNC, 0, 2) // EOF |
890 }; | 872 }; |
891 | 873 |
892 session_deps_.host_resolver->set_synchronous_mode(true); | 874 session_deps_.host_resolver->set_synchronous_mode(true); |
893 | 875 |
894 DeterministicSocketData data(reads, arraysize(reads), | 876 DeterministicSocketData data( |
895 writes, arraysize(writes)); | 877 reads, arraysize(reads), writes, arraysize(writes)); |
896 data.set_connect_data(connect_data); | 878 data.set_connect_data(connect_data); |
897 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 879 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
898 | 880 |
899 CreateDeterministicNetworkSession(); | 881 CreateDeterministicNetworkSession(); |
900 | 882 |
901 base::WeakPtr<SpdySession> session = | 883 base::WeakPtr<SpdySession> session = |
902 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 884 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
903 | 885 |
904 GURL url(kDefaultURL); | 886 GURL url(kDefaultURL); |
905 base::WeakPtr<SpdyStream> spdy_stream = | 887 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
906 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 888 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
907 session, url, LOWEST, BoundNetLog()); | |
908 test::StreamDelegateDoNothing delegate(spdy_stream); | 889 test::StreamDelegateDoNothing delegate(spdy_stream); |
909 spdy_stream->SetDelegate(&delegate); | 890 spdy_stream->SetDelegate(&delegate); |
910 | 891 |
911 scoped_ptr<SpdyHeaderBlock> headers( | 892 scoped_ptr<SpdyHeaderBlock> headers( |
912 spdy_util_.ConstructGetHeaderBlock(url.spec())); | 893 spdy_util_.ConstructGetHeaderBlock(url.spec())); |
913 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 894 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
914 | 895 |
915 // Shift time so that a ping will be sent out. | 896 // Shift time so that a ping will be sent out. |
916 g_time_delta = base::TimeDelta::FromSeconds(11); | 897 g_time_delta = base::TimeDelta::FromSeconds(11); |
917 | 898 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1001 // Read and process EOF. | 982 // Read and process EOF. |
1002 data.RunFor(1); | 983 data.RunFor(1); |
1003 EXPECT_TRUE(session == NULL); | 984 EXPECT_TRUE(session == NULL); |
1004 } | 985 } |
1005 | 986 |
1006 TEST_P(SpdySessionTest, FailedPing) { | 987 TEST_P(SpdySessionTest, FailedPing) { |
1007 session_deps_.host_resolver->set_synchronous_mode(true); | 988 session_deps_.host_resolver->set_synchronous_mode(true); |
1008 | 989 |
1009 MockConnect connect_data(SYNCHRONOUS, OK); | 990 MockConnect connect_data(SYNCHRONOUS, OK); |
1010 MockRead reads[] = { | 991 MockRead reads[] = { |
1011 MockRead(ASYNC, 0, 0, 0) // EOF | 992 MockRead(ASYNC, 0, 0, 0) // EOF |
1012 }; | 993 }; |
1013 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(1, false)); | 994 scoped_ptr<SpdyFrame> write_ping(spdy_util_.ConstructSpdyPing(1, false)); |
1014 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); | 995 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); |
1015 data.set_connect_data(connect_data); | 996 data.set_connect_data(connect_data); |
1016 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 997 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1017 | 998 |
1018 CreateDeterministicNetworkSession(); | 999 CreateDeterministicNetworkSession(); |
1019 | 1000 |
1020 base::WeakPtr<SpdySession> session = | 1001 base::WeakPtr<SpdySession> session = |
1021 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1002 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1022 | 1003 |
1023 base::WeakPtr<SpdyStream> spdy_stream1 = | 1004 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
1024 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 1005 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, BoundNetLog()); |
1025 session, test_url_, MEDIUM, BoundNetLog()); | |
1026 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1006 ASSERT_TRUE(spdy_stream1.get() != NULL); |
1027 test::StreamDelegateSendImmediate delegate(spdy_stream1, NULL); | 1007 test::StreamDelegateSendImmediate delegate(spdy_stream1, NULL); |
1028 spdy_stream1->SetDelegate(&delegate); | 1008 spdy_stream1->SetDelegate(&delegate); |
1029 | 1009 |
1030 session->set_connection_at_risk_of_loss_time(base::TimeDelta::FromSeconds(0)); | 1010 session->set_connection_at_risk_of_loss_time(base::TimeDelta::FromSeconds(0)); |
1031 session->set_hung_interval(base::TimeDelta::FromSeconds(0)); | 1011 session->set_hung_interval(base::TimeDelta::FromSeconds(0)); |
1032 | 1012 |
1033 // Send a PING frame. | 1013 // Send a PING frame. |
1034 session->WritePingFrame(1, false); | 1014 session->WritePingFrame(1, false); |
1035 EXPECT_LT(0, session->pings_in_flight()); | 1015 EXPECT_LT(0, session->pings_in_flight()); |
(...skipping 25 matching lines...) Expand all Loading... |
1061 | 1041 |
1062 const SpdySettingsIds kSpdySettingsIds = SETTINGS_MAX_CONCURRENT_STREAMS; | 1042 const SpdySettingsIds kSpdySettingsIds = SETTINGS_MAX_CONCURRENT_STREAMS; |
1063 | 1043 |
1064 SettingsMap new_settings; | 1044 SettingsMap new_settings; |
1065 const uint32 max_concurrent_streams = kInitialMaxConcurrentStreams + 1; | 1045 const uint32 max_concurrent_streams = kInitialMaxConcurrentStreams + 1; |
1066 new_settings[kSpdySettingsIds] = | 1046 new_settings[kSpdySettingsIds] = |
1067 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 1047 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
1068 scoped_ptr<SpdyFrame> settings_frame( | 1048 scoped_ptr<SpdyFrame> settings_frame( |
1069 spdy_util_.ConstructSpdySettings(new_settings)); | 1049 spdy_util_.ConstructSpdySettings(new_settings)); |
1070 MockRead reads[] = { | 1050 MockRead reads[] = { |
1071 CreateMockRead(*settings_frame, 0), | 1051 CreateMockRead(*settings_frame, 0), MockRead(ASYNC, 0, 1), |
1072 MockRead(ASYNC, 0, 1), | |
1073 }; | 1052 }; |
1074 | 1053 |
1075 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); | 1054 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); |
1076 MockConnect connect_data(SYNCHRONOUS, OK); | 1055 MockConnect connect_data(SYNCHRONOUS, OK); |
1077 data.set_connect_data(connect_data); | 1056 data.set_connect_data(connect_data); |
1078 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1057 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1079 | 1058 |
1080 CreateDeterministicNetworkSession(); | 1059 CreateDeterministicNetworkSession(); |
1081 | 1060 |
1082 base::WeakPtr<SpdySession> session = | 1061 base::WeakPtr<SpdySession> session = |
1083 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1062 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1084 | 1063 |
1085 // Create the maximum number of concurrent streams. | 1064 // Create the maximum number of concurrent streams. |
1086 for (size_t i = 0; i < kInitialMaxConcurrentStreams; ++i) { | 1065 for (size_t i = 0; i < kInitialMaxConcurrentStreams; ++i) { |
1087 base::WeakPtr<SpdyStream> spdy_stream = | 1066 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
1088 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 1067 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, BoundNetLog()); |
1089 session, test_url_, MEDIUM, BoundNetLog()); | |
1090 ASSERT_TRUE(spdy_stream != NULL); | 1068 ASSERT_TRUE(spdy_stream != NULL); |
1091 } | 1069 } |
1092 | 1070 |
1093 StreamReleaserCallback stream_releaser; | 1071 StreamReleaserCallback stream_releaser; |
1094 SpdyStreamRequest request; | 1072 SpdyStreamRequest request; |
1095 ASSERT_EQ(ERR_IO_PENDING, | 1073 ASSERT_EQ(ERR_IO_PENDING, |
1096 request.StartRequest( | 1074 request.StartRequest(SPDY_BIDIRECTIONAL_STREAM, |
1097 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, | 1075 session, |
1098 BoundNetLog(), | 1076 test_url_, |
1099 stream_releaser.MakeCallback(&request))); | 1077 MEDIUM, |
| 1078 BoundNetLog(), |
| 1079 stream_releaser.MakeCallback(&request))); |
1100 | 1080 |
1101 data.RunFor(1); | 1081 data.RunFor(1); |
1102 | 1082 |
1103 EXPECT_EQ(OK, stream_releaser.WaitForResult()); | 1083 EXPECT_EQ(OK, stream_releaser.WaitForResult()); |
1104 | 1084 |
1105 data.RunFor(1); | 1085 data.RunFor(1); |
1106 EXPECT_TRUE(session == NULL); | 1086 EXPECT_TRUE(session == NULL); |
1107 } | 1087 } |
1108 | 1088 |
1109 // Start with a persisted value for max concurrent streams. Receive a | 1089 // Start with a persisted value for max concurrent streams. Receive a |
(...skipping 10 matching lines...) Expand all Loading... |
1120 | 1100 |
1121 SettingsMap new_settings; | 1101 SettingsMap new_settings; |
1122 const uint32 max_concurrent_streams = kInitialMaxConcurrentStreams + 1; | 1102 const uint32 max_concurrent_streams = kInitialMaxConcurrentStreams + 1; |
1123 new_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 1103 new_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
1124 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 1104 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
1125 scoped_ptr<SpdyFrame> settings_frame( | 1105 scoped_ptr<SpdyFrame> settings_frame( |
1126 spdy_util_.ConstructSpdySettings(new_settings)); | 1106 spdy_util_.ConstructSpdySettings(new_settings)); |
1127 uint8 flags = SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS; | 1107 uint8 flags = SETTINGS_FLAG_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS; |
1128 test::SetFrameFlags(settings_frame.get(), flags, spdy_util_.spdy_version()); | 1108 test::SetFrameFlags(settings_frame.get(), flags, spdy_util_.spdy_version()); |
1129 MockRead reads[] = { | 1109 MockRead reads[] = { |
1130 CreateMockRead(*settings_frame, 0), | 1110 CreateMockRead(*settings_frame, 0), MockRead(ASYNC, 0, 1), |
1131 MockRead(ASYNC, 0, 1), | |
1132 }; | 1111 }; |
1133 | 1112 |
1134 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); | 1113 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); |
1135 MockConnect connect_data(SYNCHRONOUS, OK); | 1114 MockConnect connect_data(SYNCHRONOUS, OK); |
1136 data.set_connect_data(connect_data); | 1115 data.set_connect_data(connect_data); |
1137 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1116 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1138 | 1117 |
1139 CreateDeterministicNetworkSession(); | 1118 CreateDeterministicNetworkSession(); |
1140 | 1119 |
1141 // Initialize the SpdySetting with the default. | 1120 // Initialize the SpdySetting with the default. |
1142 spdy_session_pool_->http_server_properties()->SetSpdySetting( | 1121 spdy_session_pool_->http_server_properties()->SetSpdySetting( |
1143 test_host_port_pair_, | 1122 test_host_port_pair_, |
1144 SETTINGS_MAX_CONCURRENT_STREAMS, | 1123 SETTINGS_MAX_CONCURRENT_STREAMS, |
1145 SETTINGS_FLAG_PLEASE_PERSIST, | 1124 SETTINGS_FLAG_PLEASE_PERSIST, |
1146 kInitialMaxConcurrentStreams); | 1125 kInitialMaxConcurrentStreams); |
1147 | 1126 |
1148 EXPECT_FALSE( | 1127 EXPECT_FALSE(spdy_session_pool_->http_server_properties() |
1149 spdy_session_pool_->http_server_properties()->GetSpdySettings( | 1128 ->GetSpdySettings(test_host_port_pair_) |
1150 test_host_port_pair_).empty()); | 1129 .empty()); |
1151 | 1130 |
1152 base::WeakPtr<SpdySession> session = | 1131 base::WeakPtr<SpdySession> session = |
1153 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1132 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1154 | 1133 |
1155 // Create the maximum number of concurrent streams. | 1134 // Create the maximum number of concurrent streams. |
1156 for (size_t i = 0; i < kInitialMaxConcurrentStreams; ++i) { | 1135 for (size_t i = 0; i < kInitialMaxConcurrentStreams; ++i) { |
1157 base::WeakPtr<SpdyStream> spdy_stream = | 1136 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
1158 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 1137 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, BoundNetLog()); |
1159 session, test_url_, MEDIUM, BoundNetLog()); | |
1160 ASSERT_TRUE(spdy_stream != NULL); | 1138 ASSERT_TRUE(spdy_stream != NULL); |
1161 } | 1139 } |
1162 | 1140 |
1163 StreamReleaserCallback stream_releaser; | 1141 StreamReleaserCallback stream_releaser; |
1164 | 1142 |
1165 SpdyStreamRequest request; | 1143 SpdyStreamRequest request; |
1166 ASSERT_EQ(ERR_IO_PENDING, | 1144 ASSERT_EQ(ERR_IO_PENDING, |
1167 request.StartRequest( | 1145 request.StartRequest(SPDY_BIDIRECTIONAL_STREAM, |
1168 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, | 1146 session, |
1169 BoundNetLog(), | 1147 test_url_, |
1170 stream_releaser.MakeCallback(&request))); | 1148 MEDIUM, |
| 1149 BoundNetLog(), |
| 1150 stream_releaser.MakeCallback(&request))); |
1171 | 1151 |
1172 data.RunFor(1); | 1152 data.RunFor(1); |
1173 | 1153 |
1174 EXPECT_EQ(OK, stream_releaser.WaitForResult()); | 1154 EXPECT_EQ(OK, stream_releaser.WaitForResult()); |
1175 | 1155 |
1176 // Make sure that persisted data is cleared. | 1156 // Make sure that persisted data is cleared. |
1177 EXPECT_TRUE( | 1157 EXPECT_TRUE(spdy_session_pool_->http_server_properties() |
1178 spdy_session_pool_->http_server_properties()->GetSpdySettings( | 1158 ->GetSpdySettings(test_host_port_pair_) |
1179 test_host_port_pair_).empty()); | 1159 .empty()); |
1180 | 1160 |
1181 // Make sure session's max_concurrent_streams is correct. | 1161 // Make sure session's max_concurrent_streams is correct. |
1182 EXPECT_EQ(kInitialMaxConcurrentStreams + 1, | 1162 EXPECT_EQ(kInitialMaxConcurrentStreams + 1, |
1183 session->max_concurrent_streams()); | 1163 session->max_concurrent_streams()); |
1184 | 1164 |
1185 data.RunFor(1); | 1165 data.RunFor(1); |
1186 EXPECT_TRUE(session == NULL); | 1166 EXPECT_TRUE(session == NULL); |
1187 } | 1167 } |
1188 | 1168 |
1189 // Start with max concurrent streams set to 1. Request two streams. | 1169 // Start with max concurrent streams set to 1. Request two streams. |
1190 // When the first completes, have the callback close its stream, which | 1170 // When the first completes, have the callback close its stream, which |
1191 // should trigger the second stream creation. Then cancel that one | 1171 // should trigger the second stream creation. Then cancel that one |
1192 // immediately. Don't crash. This is a regression test for | 1172 // immediately. Don't crash. This is a regression test for |
1193 // http://crbug.com/63532 . | 1173 // http://crbug.com/63532 . |
1194 TEST_P(SpdySessionTest, CancelPendingCreateStream) { | 1174 TEST_P(SpdySessionTest, CancelPendingCreateStream) { |
1195 session_deps_.host_resolver->set_synchronous_mode(true); | 1175 session_deps_.host_resolver->set_synchronous_mode(true); |
1196 | 1176 |
1197 MockRead reads[] = { | 1177 MockRead reads[] = { |
1198 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 1178 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
1199 }; | 1179 }; |
1200 | 1180 |
1201 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 1181 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
1202 MockConnect connect_data(SYNCHRONOUS, OK); | 1182 MockConnect connect_data(SYNCHRONOUS, OK); |
1203 | 1183 |
1204 data.set_connect_data(connect_data); | 1184 data.set_connect_data(connect_data); |
1205 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1185 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1206 | 1186 |
1207 CreateNetworkSession(); | 1187 CreateNetworkSession(); |
1208 | 1188 |
1209 // Initialize the SpdySetting with 1 max concurrent streams. | 1189 // Initialize the SpdySetting with 1 max concurrent streams. |
1210 spdy_session_pool_->http_server_properties()->SetSpdySetting( | 1190 spdy_session_pool_->http_server_properties()->SetSpdySetting( |
1211 test_host_port_pair_, | 1191 test_host_port_pair_, |
1212 SETTINGS_MAX_CONCURRENT_STREAMS, | 1192 SETTINGS_MAX_CONCURRENT_STREAMS, |
1213 SETTINGS_FLAG_PLEASE_PERSIST, | 1193 SETTINGS_FLAG_PLEASE_PERSIST, |
1214 1); | 1194 1); |
1215 | 1195 |
1216 base::WeakPtr<SpdySession> session = | 1196 base::WeakPtr<SpdySession> session = |
1217 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1197 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1218 | 1198 |
1219 // Leave room for only one more stream to be created. | 1199 // Leave room for only one more stream to be created. |
1220 for (size_t i = 0; i < kInitialMaxConcurrentStreams - 1; ++i) { | 1200 for (size_t i = 0; i < kInitialMaxConcurrentStreams - 1; ++i) { |
1221 base::WeakPtr<SpdyStream> spdy_stream = | 1201 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
1222 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 1202 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, BoundNetLog()); |
1223 session, test_url_, MEDIUM, BoundNetLog()); | |
1224 ASSERT_TRUE(spdy_stream != NULL); | 1203 ASSERT_TRUE(spdy_stream != NULL); |
1225 } | 1204 } |
1226 | 1205 |
1227 // Create 2 more streams. First will succeed. Second will be pending. | 1206 // Create 2 more streams. First will succeed. Second will be pending. |
1228 base::WeakPtr<SpdyStream> spdy_stream1 = | 1207 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
1229 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 1208 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, BoundNetLog()); |
1230 session, test_url_, MEDIUM, BoundNetLog()); | |
1231 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1209 ASSERT_TRUE(spdy_stream1.get() != NULL); |
1232 | 1210 |
1233 // Use scoped_ptr to let us invalidate the memory when we want to, to trigger | 1211 // Use scoped_ptr to let us invalidate the memory when we want to, to trigger |
1234 // a valgrind error if the callback is invoked when it's not supposed to be. | 1212 // a valgrind error if the callback is invoked when it's not supposed to be. |
1235 scoped_ptr<TestCompletionCallback> callback(new TestCompletionCallback); | 1213 scoped_ptr<TestCompletionCallback> callback(new TestCompletionCallback); |
1236 | 1214 |
1237 SpdyStreamRequest request; | 1215 SpdyStreamRequest request; |
1238 ASSERT_EQ(ERR_IO_PENDING, | 1216 ASSERT_EQ(ERR_IO_PENDING, |
1239 request.StartRequest( | 1217 request.StartRequest(SPDY_BIDIRECTIONAL_STREAM, |
1240 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, | 1218 session, |
1241 BoundNetLog(), | 1219 test_url_, |
1242 callback->callback())); | 1220 MEDIUM, |
| 1221 BoundNetLog(), |
| 1222 callback->callback())); |
1243 | 1223 |
1244 // Release the first one, this will allow the second to be created. | 1224 // Release the first one, this will allow the second to be created. |
1245 spdy_stream1->Cancel(); | 1225 spdy_stream1->Cancel(); |
1246 EXPECT_EQ(NULL, spdy_stream1.get()); | 1226 EXPECT_EQ(NULL, spdy_stream1.get()); |
1247 | 1227 |
1248 request.CancelRequest(); | 1228 request.CancelRequest(); |
1249 callback.reset(); | 1229 callback.reset(); |
1250 | 1230 |
1251 // Should not crash when running the pending callback. | 1231 // Should not crash when running the pending callback. |
1252 base::MessageLoop::current()->RunUntilIdle(); | 1232 base::MessageLoop::current()->RunUntilIdle(); |
1253 } | 1233 } |
1254 | 1234 |
1255 TEST_P(SpdySessionTest, SendInitialDataOnNewSession) { | 1235 TEST_P(SpdySessionTest, SendInitialDataOnNewSession) { |
1256 session_deps_.host_resolver->set_synchronous_mode(true); | 1236 session_deps_.host_resolver->set_synchronous_mode(true); |
1257 | 1237 |
1258 MockRead reads[] = { | 1238 MockRead reads[] = { |
1259 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 1239 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
1260 }; | 1240 }; |
1261 | 1241 |
1262 SettingsMap settings; | 1242 SettingsMap settings; |
1263 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; | 1243 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; |
1264 const SpdySettingsIds kSpdySettingsIds2 = SETTINGS_INITIAL_WINDOW_SIZE; | 1244 const SpdySettingsIds kSpdySettingsIds2 = SETTINGS_INITIAL_WINDOW_SIZE; |
1265 const uint32 kInitialRecvWindowSize = 10 * 1024 * 1024; | 1245 const uint32 kInitialRecvWindowSize = 10 * 1024 * 1024; |
1266 settings[kSpdySettingsIds1] = | 1246 settings[kSpdySettingsIds1] = |
1267 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); | 1247 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); |
1268 if (spdy_util_.spdy_version() >= SPDY3) { | 1248 if (spdy_util_.spdy_version() >= SPDY3) { |
1269 settings[kSpdySettingsIds2] = | 1249 settings[kSpdySettingsIds2] = |
1270 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kInitialRecvWindowSize); | 1250 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kInitialRecvWindowSize); |
1271 } | 1251 } |
1272 MockConnect connect_data(SYNCHRONOUS, OK); | 1252 MockConnect connect_data(SYNCHRONOUS, OK); |
1273 scoped_ptr<SpdyFrame> settings_frame( | 1253 scoped_ptr<SpdyFrame> settings_frame( |
1274 spdy_util_.ConstructSpdySettings(settings)); | 1254 spdy_util_.ConstructSpdySettings(settings)); |
1275 scoped_ptr<SpdyFrame> initial_window_update( | 1255 scoped_ptr<SpdyFrame> initial_window_update( |
1276 spdy_util_.ConstructSpdyWindowUpdate( | 1256 spdy_util_.ConstructSpdyWindowUpdate( |
1277 kSessionFlowControlStreamId, | 1257 kSessionFlowControlStreamId, |
1278 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | 1258 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); |
1279 std::vector<MockWrite> writes; | 1259 std::vector<MockWrite> writes; |
1280 if (GetParam() == kProtoSPDY4) { | 1260 if (GetParam() == kProtoSPDY4) { |
1281 writes.push_back( | 1261 writes.push_back(MockWrite( |
1282 MockWrite(ASYNC, | 1262 ASYNC, kHttp2ConnectionHeaderPrefix, kHttp2ConnectionHeaderPrefixSize)); |
1283 kHttp2ConnectionHeaderPrefix, | |
1284 kHttp2ConnectionHeaderPrefixSize)); | |
1285 } | 1263 } |
1286 writes.push_back(CreateMockWrite(*settings_frame)); | 1264 writes.push_back(CreateMockWrite(*settings_frame)); |
1287 if (GetParam() >= kProtoSPDY31) { | 1265 if (GetParam() >= kProtoSPDY31) { |
1288 writes.push_back(CreateMockWrite(*initial_window_update)); | 1266 writes.push_back(CreateMockWrite(*initial_window_update)); |
1289 }; | 1267 }; |
1290 | 1268 |
1291 SettingsMap server_settings; | 1269 SettingsMap server_settings; |
1292 const uint32 initial_max_concurrent_streams = 1; | 1270 const uint32 initial_max_concurrent_streams = 1; |
1293 server_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 1271 server_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = SettingsFlagsAndValue( |
1294 SettingsFlagsAndValue(SETTINGS_FLAG_PERSISTED, | 1272 SETTINGS_FLAG_PERSISTED, initial_max_concurrent_streams); |
1295 initial_max_concurrent_streams); | |
1296 scoped_ptr<SpdyFrame> server_settings_frame( | 1273 scoped_ptr<SpdyFrame> server_settings_frame( |
1297 spdy_util_.ConstructSpdySettings(server_settings)); | 1274 spdy_util_.ConstructSpdySettings(server_settings)); |
1298 writes.push_back(CreateMockWrite(*server_settings_frame)); | 1275 writes.push_back(CreateMockWrite(*server_settings_frame)); |
1299 | 1276 |
1300 session_deps_.stream_initial_recv_window_size = kInitialRecvWindowSize; | 1277 session_deps_.stream_initial_recv_window_size = kInitialRecvWindowSize; |
1301 | 1278 |
1302 StaticSocketDataProvider data(reads, arraysize(reads), | 1279 StaticSocketDataProvider data( |
1303 vector_as_array(&writes), writes.size()); | 1280 reads, arraysize(reads), vector_as_array(&writes), writes.size()); |
1304 data.set_connect_data(connect_data); | 1281 data.set_connect_data(connect_data); |
1305 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1282 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1306 | 1283 |
1307 CreateNetworkSession(); | 1284 CreateNetworkSession(); |
1308 | 1285 |
1309 spdy_session_pool_->http_server_properties()->SetSpdySetting( | 1286 spdy_session_pool_->http_server_properties()->SetSpdySetting( |
1310 test_host_port_pair_, | 1287 test_host_port_pair_, |
1311 SETTINGS_MAX_CONCURRENT_STREAMS, | 1288 SETTINGS_MAX_CONCURRENT_STREAMS, |
1312 SETTINGS_FLAG_PLEASE_PERSIST, | 1289 SETTINGS_FLAG_PLEASE_PERSIST, |
1313 initial_max_concurrent_streams); | 1290 initial_max_concurrent_streams); |
1314 | 1291 |
1315 SpdySessionPoolPeer pool_peer(spdy_session_pool_); | 1292 SpdySessionPoolPeer pool_peer(spdy_session_pool_); |
1316 pool_peer.SetEnableSendingInitialData(true); | 1293 pool_peer.SetEnableSendingInitialData(true); |
1317 | 1294 |
1318 base::WeakPtr<SpdySession> session = | 1295 base::WeakPtr<SpdySession> session = |
1319 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1296 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1320 | 1297 |
1321 base::MessageLoop::current()->RunUntilIdle(); | 1298 base::MessageLoop::current()->RunUntilIdle(); |
1322 EXPECT_TRUE(data.at_write_eof()); | 1299 EXPECT_TRUE(data.at_write_eof()); |
1323 } | 1300 } |
1324 | 1301 |
1325 TEST_P(SpdySessionTest, ClearSettingsStorageOnIPAddressChanged) { | 1302 TEST_P(SpdySessionTest, ClearSettingsStorageOnIPAddressChanged) { |
1326 CreateNetworkSession(); | 1303 CreateNetworkSession(); |
1327 | 1304 |
1328 base::WeakPtr<HttpServerProperties> test_http_server_properties = | 1305 base::WeakPtr<HttpServerProperties> test_http_server_properties = |
1329 spdy_session_pool_->http_server_properties(); | 1306 spdy_session_pool_->http_server_properties(); |
1330 SettingsFlagsAndValue flags_and_value1(SETTINGS_FLAG_PLEASE_PERSIST, 2); | 1307 SettingsFlagsAndValue flags_and_value1(SETTINGS_FLAG_PLEASE_PERSIST, 2); |
1331 test_http_server_properties->SetSpdySetting( | 1308 test_http_server_properties->SetSpdySetting(test_host_port_pair_, |
1332 test_host_port_pair_, | 1309 SETTINGS_MAX_CONCURRENT_STREAMS, |
1333 SETTINGS_MAX_CONCURRENT_STREAMS, | 1310 SETTINGS_FLAG_PLEASE_PERSIST, |
1334 SETTINGS_FLAG_PLEASE_PERSIST, | 1311 2); |
1335 2); | 1312 EXPECT_NE(0u, |
1336 EXPECT_NE(0u, test_http_server_properties->GetSpdySettings( | 1313 test_http_server_properties->GetSpdySettings(test_host_port_pair_) |
1337 test_host_port_pair_).size()); | 1314 .size()); |
1338 spdy_session_pool_->OnIPAddressChanged(); | 1315 spdy_session_pool_->OnIPAddressChanged(); |
1339 EXPECT_EQ(0u, test_http_server_properties->GetSpdySettings( | 1316 EXPECT_EQ(0u, |
1340 test_host_port_pair_).size()); | 1317 test_http_server_properties->GetSpdySettings(test_host_port_pair_) |
| 1318 .size()); |
1341 } | 1319 } |
1342 | 1320 |
1343 TEST_P(SpdySessionTest, Initialize) { | 1321 TEST_P(SpdySessionTest, Initialize) { |
1344 CapturingBoundNetLog log; | 1322 CapturingBoundNetLog log; |
1345 session_deps_.net_log = log.bound().net_log(); | 1323 session_deps_.net_log = log.bound().net_log(); |
1346 session_deps_.host_resolver->set_synchronous_mode(true); | 1324 session_deps_.host_resolver->set_synchronous_mode(true); |
1347 | 1325 |
1348 MockConnect connect_data(SYNCHRONOUS, OK); | 1326 MockConnect connect_data(SYNCHRONOUS, OK); |
1349 MockRead reads[] = { | 1327 MockRead reads[] = { |
1350 MockRead(ASYNC, 0, 0) // EOF | 1328 MockRead(ASYNC, 0, 0) // EOF |
1351 }; | 1329 }; |
1352 | 1330 |
1353 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 1331 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
1354 data.set_connect_data(connect_data); | 1332 data.set_connect_data(connect_data); |
1355 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1333 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1356 | 1334 |
1357 CreateNetworkSession(); | 1335 CreateNetworkSession(); |
1358 | 1336 |
1359 base::WeakPtr<SpdySession> session = | 1337 base::WeakPtr<SpdySession> session = |
1360 CreateInsecureSpdySession(http_session_, key_, log.bound()); | 1338 CreateInsecureSpdySession(http_session_, key_, log.bound()); |
1361 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); | 1339 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); |
1362 | 1340 |
1363 // Flush the read completion task. | 1341 // Flush the read completion task. |
1364 base::MessageLoop::current()->RunUntilIdle(); | 1342 base::MessageLoop::current()->RunUntilIdle(); |
1365 | 1343 |
1366 net::CapturingNetLog::CapturedEntryList entries; | 1344 net::CapturingNetLog::CapturedEntryList entries; |
1367 log.GetEntries(&entries); | 1345 log.GetEntries(&entries); |
1368 EXPECT_LT(0u, entries.size()); | 1346 EXPECT_LT(0u, entries.size()); |
1369 | 1347 |
1370 // Check that we logged TYPE_SPDY_SESSION_INITIALIZED correctly. | 1348 // Check that we logged TYPE_SPDY_SESSION_INITIALIZED correctly. |
1371 int pos = net::ExpectLogContainsSomewhere( | 1349 int pos = net::ExpectLogContainsSomewhere( |
1372 entries, 0, | 1350 entries, |
| 1351 0, |
1373 net::NetLog::TYPE_SPDY_SESSION_INITIALIZED, | 1352 net::NetLog::TYPE_SPDY_SESSION_INITIALIZED, |
1374 net::NetLog::PHASE_NONE); | 1353 net::NetLog::PHASE_NONE); |
1375 EXPECT_LT(0, pos); | 1354 EXPECT_LT(0, pos); |
1376 | 1355 |
1377 CapturingNetLog::CapturedEntry entry = entries[pos]; | 1356 CapturingNetLog::CapturedEntry entry = entries[pos]; |
1378 NetLog::Source socket_source; | 1357 NetLog::Source socket_source; |
1379 EXPECT_TRUE(NetLog::Source::FromEventParameters(entry.params.get(), | 1358 EXPECT_TRUE( |
1380 &socket_source)); | 1359 NetLog::Source::FromEventParameters(entry.params.get(), &socket_source)); |
1381 EXPECT_TRUE(socket_source.IsValid()); | 1360 EXPECT_TRUE(socket_source.IsValid()); |
1382 EXPECT_NE(log.bound().source().id, socket_source.id); | 1361 EXPECT_NE(log.bound().source().id, socket_source.id); |
1383 } | 1362 } |
1384 | 1363 |
1385 TEST_P(SpdySessionTest, CloseSessionOnError) { | 1364 TEST_P(SpdySessionTest, CloseSessionOnError) { |
1386 session_deps_.host_resolver->set_synchronous_mode(true); | 1365 session_deps_.host_resolver->set_synchronous_mode(true); |
1387 | 1366 |
1388 MockConnect connect_data(SYNCHRONOUS, OK); | 1367 MockConnect connect_data(SYNCHRONOUS, OK); |
1389 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway()); | 1368 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway()); |
1390 MockRead reads[] = { | 1369 MockRead reads[] = { |
1391 CreateMockRead(*goaway), | 1370 CreateMockRead(*goaway), MockRead(SYNCHRONOUS, 0, 0) // EOF |
1392 MockRead(SYNCHRONOUS, 0, 0) // EOF | |
1393 }; | 1371 }; |
1394 | 1372 |
1395 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 1373 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
1396 data.set_connect_data(connect_data); | 1374 data.set_connect_data(connect_data); |
1397 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1375 session_deps_.socket_factory->AddSocketDataProvider(&data); |
1398 | 1376 |
1399 CreateNetworkSession(); | 1377 CreateNetworkSession(); |
1400 | 1378 |
1401 CapturingBoundNetLog log; | 1379 CapturingBoundNetLog log; |
1402 base::WeakPtr<SpdySession> session = | 1380 base::WeakPtr<SpdySession> session = |
1403 CreateInsecureSpdySession(http_session_, key_, log.bound()); | 1381 CreateInsecureSpdySession(http_session_, key_, log.bound()); |
1404 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); | 1382 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); |
1405 | 1383 |
1406 // Flush the read completion task. | 1384 // Flush the read completion task. |
1407 base::MessageLoop::current()->RunUntilIdle(); | 1385 base::MessageLoop::current()->RunUntilIdle(); |
1408 | 1386 |
1409 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 1387 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
1410 EXPECT_TRUE(session == NULL); | 1388 EXPECT_TRUE(session == NULL); |
1411 | 1389 |
1412 // Check that the NetLog was filled reasonably. | 1390 // Check that the NetLog was filled reasonably. |
1413 net::CapturingNetLog::CapturedEntryList entries; | 1391 net::CapturingNetLog::CapturedEntryList entries; |
1414 log.GetEntries(&entries); | 1392 log.GetEntries(&entries); |
1415 EXPECT_LT(0u, entries.size()); | 1393 EXPECT_LT(0u, entries.size()); |
1416 | 1394 |
1417 // Check that we logged SPDY_SESSION_CLOSE correctly. | 1395 // Check that we logged SPDY_SESSION_CLOSE correctly. |
1418 int pos = net::ExpectLogContainsSomewhere( | 1396 int pos = |
1419 entries, 0, | 1397 net::ExpectLogContainsSomewhere(entries, |
1420 net::NetLog::TYPE_SPDY_SESSION_CLOSE, | 1398 0, |
1421 net::NetLog::PHASE_NONE); | 1399 net::NetLog::TYPE_SPDY_SESSION_CLOSE, |
| 1400 net::NetLog::PHASE_NONE); |
1422 | 1401 |
1423 if (pos < static_cast<int>(entries.size())) { | 1402 if (pos < static_cast<int>(entries.size())) { |
1424 CapturingNetLog::CapturedEntry entry = entries[pos]; | 1403 CapturingNetLog::CapturedEntry entry = entries[pos]; |
1425 int error_code = 0; | 1404 int error_code = 0; |
1426 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); | 1405 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); |
1427 EXPECT_EQ(ERR_CONNECTION_CLOSED, error_code); | 1406 EXPECT_EQ(ERR_CONNECTION_CLOSED, error_code); |
1428 } else { | 1407 } else { |
1429 ADD_FAILURE(); | 1408 ADD_FAILURE(); |
1430 } | 1409 } |
1431 } | 1410 } |
1432 | 1411 |
1433 // Queue up a low-priority SYN_STREAM followed by a high-priority | 1412 // Queue up a low-priority SYN_STREAM followed by a high-priority |
1434 // one. The high priority one should still send first and receive | 1413 // one. The high priority one should still send first and receive |
1435 // first. | 1414 // first. |
1436 TEST_P(SpdySessionTest, OutOfOrderSynStreams) { | 1415 TEST_P(SpdySessionTest, OutOfOrderSynStreams) { |
1437 // Construct the request. | 1416 // Construct the request. |
1438 MockConnect connect_data(SYNCHRONOUS, OK); | 1417 MockConnect connect_data(SYNCHRONOUS, OK); |
1439 scoped_ptr<SpdyFrame> req_highest( | 1418 scoped_ptr<SpdyFrame> req_highest( |
1440 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, HIGHEST, true)); | 1419 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, HIGHEST, true)); |
1441 scoped_ptr<SpdyFrame> req_lowest( | 1420 scoped_ptr<SpdyFrame> req_lowest( |
1442 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); | 1421 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); |
1443 MockWrite writes[] = { | 1422 MockWrite writes[] = { |
1444 CreateMockWrite(*req_highest, 0), | 1423 CreateMockWrite(*req_highest, 0), CreateMockWrite(*req_lowest, 1), |
1445 CreateMockWrite(*req_lowest, 1), | |
1446 }; | 1424 }; |
1447 | 1425 |
1448 scoped_ptr<SpdyFrame> resp_highest( | 1426 scoped_ptr<SpdyFrame> resp_highest( |
1449 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1427 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
1450 scoped_ptr<SpdyFrame> body_highest( | 1428 scoped_ptr<SpdyFrame> body_highest( |
1451 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 1429 spdy_util_.ConstructSpdyBodyFrame(1, true)); |
1452 scoped_ptr<SpdyFrame> resp_lowest( | 1430 scoped_ptr<SpdyFrame> resp_lowest( |
1453 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 1431 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
1454 scoped_ptr<SpdyFrame> body_lowest( | 1432 scoped_ptr<SpdyFrame> body_lowest(spdy_util_.ConstructSpdyBodyFrame(3, true)); |
1455 spdy_util_.ConstructSpdyBodyFrame(3, true)); | |
1456 MockRead reads[] = { | 1433 MockRead reads[] = { |
1457 CreateMockRead(*resp_highest, 2), | 1434 CreateMockRead(*resp_highest, 2), CreateMockRead(*body_highest, 3), |
1458 CreateMockRead(*body_highest, 3), | 1435 CreateMockRead(*resp_lowest, 4), CreateMockRead(*body_lowest, 5), |
1459 CreateMockRead(*resp_lowest, 4), | 1436 MockRead(ASYNC, 0, 6) // EOF |
1460 CreateMockRead(*body_lowest, 5), | |
1461 MockRead(ASYNC, 0, 6) // EOF | |
1462 }; | 1437 }; |
1463 | 1438 |
1464 session_deps_.host_resolver->set_synchronous_mode(true); | 1439 session_deps_.host_resolver->set_synchronous_mode(true); |
1465 | 1440 |
1466 DeterministicSocketData data(reads, arraysize(reads), | 1441 DeterministicSocketData data( |
1467 writes, arraysize(writes)); | 1442 reads, arraysize(reads), writes, arraysize(writes)); |
1468 data.set_connect_data(connect_data); | 1443 data.set_connect_data(connect_data); |
1469 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1444 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1470 | 1445 |
1471 CreateDeterministicNetworkSession(); | 1446 CreateDeterministicNetworkSession(); |
1472 | 1447 |
1473 base::WeakPtr<SpdySession> session = | 1448 base::WeakPtr<SpdySession> session = |
1474 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1449 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1475 | 1450 |
1476 GURL url(kDefaultURL); | 1451 GURL url(kDefaultURL); |
1477 | 1452 |
1478 base::WeakPtr<SpdyStream> spdy_stream_lowest = | 1453 base::WeakPtr<SpdyStream> spdy_stream_lowest = CreateStreamSynchronously( |
1479 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 1454 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
1480 session, url, LOWEST, BoundNetLog()); | |
1481 ASSERT_TRUE(spdy_stream_lowest); | 1455 ASSERT_TRUE(spdy_stream_lowest); |
1482 EXPECT_EQ(0u, spdy_stream_lowest->stream_id()); | 1456 EXPECT_EQ(0u, spdy_stream_lowest->stream_id()); |
1483 test::StreamDelegateDoNothing delegate_lowest(spdy_stream_lowest); | 1457 test::StreamDelegateDoNothing delegate_lowest(spdy_stream_lowest); |
1484 spdy_stream_lowest->SetDelegate(&delegate_lowest); | 1458 spdy_stream_lowest->SetDelegate(&delegate_lowest); |
1485 | 1459 |
1486 base::WeakPtr<SpdyStream> spdy_stream_highest = | 1460 base::WeakPtr<SpdyStream> spdy_stream_highest = CreateStreamSynchronously( |
1487 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 1461 SPDY_REQUEST_RESPONSE_STREAM, session, url, HIGHEST, BoundNetLog()); |
1488 session, url, HIGHEST, BoundNetLog()); | |
1489 ASSERT_TRUE(spdy_stream_highest); | 1462 ASSERT_TRUE(spdy_stream_highest); |
1490 EXPECT_EQ(0u, spdy_stream_highest->stream_id()); | 1463 EXPECT_EQ(0u, spdy_stream_highest->stream_id()); |
1491 test::StreamDelegateDoNothing delegate_highest(spdy_stream_highest); | 1464 test::StreamDelegateDoNothing delegate_highest(spdy_stream_highest); |
1492 spdy_stream_highest->SetDelegate(&delegate_highest); | 1465 spdy_stream_highest->SetDelegate(&delegate_highest); |
1493 | 1466 |
1494 // Queue the lower priority one first. | 1467 // Queue the lower priority one first. |
1495 | 1468 |
1496 scoped_ptr<SpdyHeaderBlock> headers_lowest( | 1469 scoped_ptr<SpdyHeaderBlock> headers_lowest( |
1497 spdy_util_.ConstructGetHeaderBlock(url.spec())); | 1470 spdy_util_.ConstructGetHeaderBlock(url.spec())); |
1498 spdy_stream_lowest->SendRequestHeaders( | 1471 spdy_stream_lowest->SendRequestHeaders(headers_lowest.Pass(), |
1499 headers_lowest.Pass(), NO_MORE_DATA_TO_SEND); | 1472 NO_MORE_DATA_TO_SEND); |
1500 EXPECT_TRUE(spdy_stream_lowest->HasUrlFromHeaders()); | 1473 EXPECT_TRUE(spdy_stream_lowest->HasUrlFromHeaders()); |
1501 | 1474 |
1502 scoped_ptr<SpdyHeaderBlock> headers_highest( | 1475 scoped_ptr<SpdyHeaderBlock> headers_highest( |
1503 spdy_util_.ConstructGetHeaderBlock(url.spec())); | 1476 spdy_util_.ConstructGetHeaderBlock(url.spec())); |
1504 spdy_stream_highest->SendRequestHeaders( | 1477 spdy_stream_highest->SendRequestHeaders(headers_highest.Pass(), |
1505 headers_highest.Pass(), NO_MORE_DATA_TO_SEND); | 1478 NO_MORE_DATA_TO_SEND); |
1506 EXPECT_TRUE(spdy_stream_highest->HasUrlFromHeaders()); | 1479 EXPECT_TRUE(spdy_stream_highest->HasUrlFromHeaders()); |
1507 | 1480 |
1508 data.RunFor(7); | 1481 data.RunFor(7); |
1509 | 1482 |
1510 EXPECT_FALSE(spdy_stream_lowest); | 1483 EXPECT_FALSE(spdy_stream_lowest); |
1511 EXPECT_FALSE(spdy_stream_highest); | 1484 EXPECT_FALSE(spdy_stream_highest); |
1512 EXPECT_EQ(3u, delegate_lowest.stream_id()); | 1485 EXPECT_EQ(3u, delegate_lowest.stream_id()); |
1513 EXPECT_EQ(1u, delegate_highest.stream_id()); | 1486 EXPECT_EQ(1u, delegate_highest.stream_id()); |
1514 } | 1487 } |
1515 | 1488 |
1516 TEST_P(SpdySessionTest, CancelStream) { | 1489 TEST_P(SpdySessionTest, CancelStream) { |
1517 MockConnect connect_data(SYNCHRONOUS, OK); | 1490 MockConnect connect_data(SYNCHRONOUS, OK); |
1518 // Request 1, at HIGHEST priority, will be cancelled before it writes data. | 1491 // Request 1, at HIGHEST priority, will be cancelled before it writes data. |
1519 // Request 2, at LOWEST priority, will be a full request and will be id 1. | 1492 // Request 2, at LOWEST priority, will be a full request and will be id 1. |
1520 scoped_ptr<SpdyFrame> req2( | 1493 scoped_ptr<SpdyFrame> req2( |
1521 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 1494 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
1522 MockWrite writes[] = { | 1495 MockWrite writes[] = { |
1523 CreateMockWrite(*req2, 0), | 1496 CreateMockWrite(*req2, 0), |
1524 }; | 1497 }; |
1525 | 1498 |
1526 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 1499 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
1527 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 1500 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
1528 MockRead reads[] = { | 1501 MockRead reads[] = { |
1529 CreateMockRead(*resp2, 1), | 1502 CreateMockRead(*resp2, 1), CreateMockRead(*body2, 2), |
1530 CreateMockRead(*body2, 2), | 1503 MockRead(ASYNC, 0, 3) // EOF |
1531 MockRead(ASYNC, 0, 3) // EOF | |
1532 }; | 1504 }; |
1533 | 1505 |
1534 session_deps_.host_resolver->set_synchronous_mode(true); | 1506 session_deps_.host_resolver->set_synchronous_mode(true); |
1535 | 1507 |
1536 DeterministicSocketData data(reads, arraysize(reads), | 1508 DeterministicSocketData data( |
1537 writes, arraysize(writes)); | 1509 reads, arraysize(reads), writes, arraysize(writes)); |
1538 data.set_connect_data(connect_data); | 1510 data.set_connect_data(connect_data); |
1539 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1511 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1540 | 1512 |
1541 CreateDeterministicNetworkSession(); | 1513 CreateDeterministicNetworkSession(); |
1542 | 1514 |
1543 base::WeakPtr<SpdySession> session = | 1515 base::WeakPtr<SpdySession> session = |
1544 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1516 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1545 | 1517 |
1546 GURL url1(kDefaultURL); | 1518 GURL url1(kDefaultURL); |
1547 base::WeakPtr<SpdyStream> spdy_stream1 = | 1519 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
1548 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 1520 SPDY_REQUEST_RESPONSE_STREAM, session, url1, HIGHEST, BoundNetLog()); |
1549 session, url1, HIGHEST, BoundNetLog()); | |
1550 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1521 ASSERT_TRUE(spdy_stream1.get() != NULL); |
1551 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1522 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
1552 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 1523 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
1553 spdy_stream1->SetDelegate(&delegate1); | 1524 spdy_stream1->SetDelegate(&delegate1); |
1554 | 1525 |
1555 GURL url2(kDefaultURL); | 1526 GURL url2(kDefaultURL); |
1556 base::WeakPtr<SpdyStream> spdy_stream2 = | 1527 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
1557 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 1528 SPDY_REQUEST_RESPONSE_STREAM, session, url2, LOWEST, BoundNetLog()); |
1558 session, url2, LOWEST, BoundNetLog()); | |
1559 ASSERT_TRUE(spdy_stream2.get() != NULL); | 1529 ASSERT_TRUE(spdy_stream2.get() != NULL); |
1560 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 1530 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
1561 test::StreamDelegateDoNothing delegate2(spdy_stream2); | 1531 test::StreamDelegateDoNothing delegate2(spdy_stream2); |
1562 spdy_stream2->SetDelegate(&delegate2); | 1532 spdy_stream2->SetDelegate(&delegate2); |
1563 | 1533 |
1564 scoped_ptr<SpdyHeaderBlock> headers( | 1534 scoped_ptr<SpdyHeaderBlock> headers( |
1565 spdy_util_.ConstructGetHeaderBlock(url1.spec())); | 1535 spdy_util_.ConstructGetHeaderBlock(url1.spec())); |
1566 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 1536 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
1567 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 1537 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
1568 | 1538 |
(...skipping 21 matching lines...) Expand all Loading... |
1590 // Create two streams that are set to re-close themselves on close, | 1560 // Create two streams that are set to re-close themselves on close, |
1591 // and then close the session. Nothing should blow up. Also a | 1561 // and then close the session. Nothing should blow up. Also a |
1592 // regression test for http://crbug.com/139518 . | 1562 // regression test for http://crbug.com/139518 . |
1593 TEST_P(SpdySessionTest, CloseSessionWithTwoCreatedSelfClosingStreams) { | 1563 TEST_P(SpdySessionTest, CloseSessionWithTwoCreatedSelfClosingStreams) { |
1594 session_deps_.host_resolver->set_synchronous_mode(true); | 1564 session_deps_.host_resolver->set_synchronous_mode(true); |
1595 | 1565 |
1596 MockConnect connect_data(SYNCHRONOUS, OK); | 1566 MockConnect connect_data(SYNCHRONOUS, OK); |
1597 | 1567 |
1598 // No actual data will be sent. | 1568 // No actual data will be sent. |
1599 MockWrite writes[] = { | 1569 MockWrite writes[] = { |
1600 MockWrite(ASYNC, 0, 1) // EOF | 1570 MockWrite(ASYNC, 0, 1) // EOF |
1601 }; | 1571 }; |
1602 | 1572 |
1603 MockRead reads[] = { | 1573 MockRead reads[] = { |
1604 MockRead(ASYNC, 0, 0) // EOF | 1574 MockRead(ASYNC, 0, 0) // EOF |
1605 }; | 1575 }; |
1606 DeterministicSocketData data(reads, arraysize(reads), | 1576 DeterministicSocketData data( |
1607 writes, arraysize(writes)); | 1577 reads, arraysize(reads), writes, arraysize(writes)); |
1608 data.set_connect_data(connect_data); | 1578 data.set_connect_data(connect_data); |
1609 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1579 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1610 | 1580 |
1611 CreateDeterministicNetworkSession(); | 1581 CreateDeterministicNetworkSession(); |
1612 | 1582 |
1613 base::WeakPtr<SpdySession> session = | 1583 base::WeakPtr<SpdySession> session = |
1614 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1584 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1615 | 1585 |
1616 GURL url1(kDefaultURL); | 1586 GURL url1(kDefaultURL); |
1617 base::WeakPtr<SpdyStream> spdy_stream1 = | 1587 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
1618 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 1588 SPDY_BIDIRECTIONAL_STREAM, session, url1, HIGHEST, BoundNetLog()); |
1619 session, url1, HIGHEST, BoundNetLog()); | |
1620 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1589 ASSERT_TRUE(spdy_stream1.get() != NULL); |
1621 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1590 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
1622 | 1591 |
1623 GURL url2(kDefaultURL); | 1592 GURL url2(kDefaultURL); |
1624 base::WeakPtr<SpdyStream> spdy_stream2 = | 1593 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
1625 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 1594 SPDY_BIDIRECTIONAL_STREAM, session, url2, LOWEST, BoundNetLog()); |
1626 session, url2, LOWEST, BoundNetLog()); | |
1627 ASSERT_TRUE(spdy_stream2.get() != NULL); | 1595 ASSERT_TRUE(spdy_stream2.get() != NULL); |
1628 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 1596 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
1629 | 1597 |
1630 test::ClosingDelegate delegate1(spdy_stream1); | 1598 test::ClosingDelegate delegate1(spdy_stream1); |
1631 spdy_stream1->SetDelegate(&delegate1); | 1599 spdy_stream1->SetDelegate(&delegate1); |
1632 | 1600 |
1633 test::ClosingDelegate delegate2(spdy_stream2); | 1601 test::ClosingDelegate delegate2(spdy_stream2); |
1634 spdy_stream2->SetDelegate(&delegate2); | 1602 spdy_stream2->SetDelegate(&delegate2); |
1635 | 1603 |
1636 scoped_ptr<SpdyHeaderBlock> headers( | 1604 scoped_ptr<SpdyHeaderBlock> headers( |
(...skipping 24 matching lines...) Expand all Loading... |
1661 | 1629 |
1662 // Create two streams that are set to close each other on close, and | 1630 // Create two streams that are set to close each other on close, and |
1663 // then close the session. Nothing should blow up. | 1631 // then close the session. Nothing should blow up. |
1664 TEST_P(SpdySessionTest, CloseSessionWithTwoCreatedMutuallyClosingStreams) { | 1632 TEST_P(SpdySessionTest, CloseSessionWithTwoCreatedMutuallyClosingStreams) { |
1665 session_deps_.host_resolver->set_synchronous_mode(true); | 1633 session_deps_.host_resolver->set_synchronous_mode(true); |
1666 | 1634 |
1667 MockConnect connect_data(SYNCHRONOUS, OK); | 1635 MockConnect connect_data(SYNCHRONOUS, OK); |
1668 | 1636 |
1669 // No actual data will be sent. | 1637 // No actual data will be sent. |
1670 MockWrite writes[] = { | 1638 MockWrite writes[] = { |
1671 MockWrite(ASYNC, 0, 1) // EOF | 1639 MockWrite(ASYNC, 0, 1) // EOF |
1672 }; | 1640 }; |
1673 | 1641 |
1674 MockRead reads[] = { | 1642 MockRead reads[] = { |
1675 MockRead(ASYNC, 0, 0) // EOF | 1643 MockRead(ASYNC, 0, 0) // EOF |
1676 }; | 1644 }; |
1677 DeterministicSocketData data(reads, arraysize(reads), | 1645 DeterministicSocketData data( |
1678 writes, arraysize(writes)); | 1646 reads, arraysize(reads), writes, arraysize(writes)); |
1679 data.set_connect_data(connect_data); | 1647 data.set_connect_data(connect_data); |
1680 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1648 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1681 | 1649 |
1682 CreateDeterministicNetworkSession(); | 1650 CreateDeterministicNetworkSession(); |
1683 | 1651 |
1684 base::WeakPtr<SpdySession> session = | 1652 base::WeakPtr<SpdySession> session = |
1685 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1653 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1686 | 1654 |
1687 GURL url1(kDefaultURL); | 1655 GURL url1(kDefaultURL); |
1688 base::WeakPtr<SpdyStream> spdy_stream1 = | 1656 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
1689 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 1657 SPDY_BIDIRECTIONAL_STREAM, session, url1, HIGHEST, BoundNetLog()); |
1690 session, url1, HIGHEST, BoundNetLog()); | |
1691 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1658 ASSERT_TRUE(spdy_stream1.get() != NULL); |
1692 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1659 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
1693 | 1660 |
1694 GURL url2(kDefaultURL); | 1661 GURL url2(kDefaultURL); |
1695 base::WeakPtr<SpdyStream> spdy_stream2 = | 1662 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
1696 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 1663 SPDY_BIDIRECTIONAL_STREAM, session, url2, LOWEST, BoundNetLog()); |
1697 session, url2, LOWEST, BoundNetLog()); | |
1698 ASSERT_TRUE(spdy_stream2.get() != NULL); | 1664 ASSERT_TRUE(spdy_stream2.get() != NULL); |
1699 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 1665 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
1700 | 1666 |
1701 // Make |spdy_stream1| close |spdy_stream2|. | 1667 // Make |spdy_stream1| close |spdy_stream2|. |
1702 test::ClosingDelegate delegate1(spdy_stream2); | 1668 test::ClosingDelegate delegate1(spdy_stream2); |
1703 spdy_stream1->SetDelegate(&delegate1); | 1669 spdy_stream1->SetDelegate(&delegate1); |
1704 | 1670 |
1705 // Make |spdy_stream2| close |spdy_stream1|. | 1671 // Make |spdy_stream2| close |spdy_stream1|. |
1706 test::ClosingDelegate delegate2(spdy_stream1); | 1672 test::ClosingDelegate delegate2(spdy_stream1); |
1707 spdy_stream2->SetDelegate(&delegate2); | 1673 spdy_stream2->SetDelegate(&delegate2); |
(...skipping 29 matching lines...) Expand all Loading... |
1737 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedSelfClosingStreams) { | 1703 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedSelfClosingStreams) { |
1738 session_deps_.host_resolver->set_synchronous_mode(true); | 1704 session_deps_.host_resolver->set_synchronous_mode(true); |
1739 | 1705 |
1740 MockConnect connect_data(SYNCHRONOUS, OK); | 1706 MockConnect connect_data(SYNCHRONOUS, OK); |
1741 | 1707 |
1742 scoped_ptr<SpdyFrame> req1( | 1708 scoped_ptr<SpdyFrame> req1( |
1743 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 1709 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
1744 scoped_ptr<SpdyFrame> req2( | 1710 scoped_ptr<SpdyFrame> req2( |
1745 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); | 1711 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); |
1746 MockWrite writes[] = { | 1712 MockWrite writes[] = { |
1747 CreateMockWrite(*req1, 0), | 1713 CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1), |
1748 CreateMockWrite(*req2, 1), | |
1749 }; | 1714 }; |
1750 | 1715 |
1751 MockRead reads[] = { | 1716 MockRead reads[] = { |
1752 MockRead(ASYNC, 0, 2) // EOF | 1717 MockRead(ASYNC, 0, 2) // EOF |
1753 }; | 1718 }; |
1754 | 1719 |
1755 DeterministicSocketData data(reads, arraysize(reads), | 1720 DeterministicSocketData data( |
1756 writes, arraysize(writes)); | 1721 reads, arraysize(reads), writes, arraysize(writes)); |
1757 data.set_connect_data(connect_data); | 1722 data.set_connect_data(connect_data); |
1758 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1723 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1759 | 1724 |
1760 CreateDeterministicNetworkSession(); | 1725 CreateDeterministicNetworkSession(); |
1761 | 1726 |
1762 base::WeakPtr<SpdySession> session = | 1727 base::WeakPtr<SpdySession> session = |
1763 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1728 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1764 | 1729 |
1765 GURL url1(kDefaultURL); | 1730 GURL url1(kDefaultURL); |
1766 base::WeakPtr<SpdyStream> spdy_stream1 = | 1731 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
1767 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 1732 SPDY_REQUEST_RESPONSE_STREAM, session, url1, MEDIUM, BoundNetLog()); |
1768 session, url1, MEDIUM, BoundNetLog()); | |
1769 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1733 ASSERT_TRUE(spdy_stream1.get() != NULL); |
1770 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1734 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
1771 | 1735 |
1772 GURL url2(kDefaultURL); | 1736 GURL url2(kDefaultURL); |
1773 base::WeakPtr<SpdyStream> spdy_stream2 = | 1737 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
1774 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 1738 SPDY_REQUEST_RESPONSE_STREAM, session, url2, MEDIUM, BoundNetLog()); |
1775 session, url2, MEDIUM, BoundNetLog()); | |
1776 ASSERT_TRUE(spdy_stream2.get() != NULL); | 1739 ASSERT_TRUE(spdy_stream2.get() != NULL); |
1777 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 1740 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
1778 | 1741 |
1779 test::ClosingDelegate delegate1(spdy_stream1); | 1742 test::ClosingDelegate delegate1(spdy_stream1); |
1780 spdy_stream1->SetDelegate(&delegate1); | 1743 spdy_stream1->SetDelegate(&delegate1); |
1781 | 1744 |
1782 test::ClosingDelegate delegate2(spdy_stream2); | 1745 test::ClosingDelegate delegate2(spdy_stream2); |
1783 spdy_stream2->SetDelegate(&delegate2); | 1746 spdy_stream2->SetDelegate(&delegate2); |
1784 | 1747 |
1785 scoped_ptr<SpdyHeaderBlock> headers( | 1748 scoped_ptr<SpdyHeaderBlock> headers( |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1818 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedMutuallyClosingStreams) { | 1781 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedMutuallyClosingStreams) { |
1819 session_deps_.host_resolver->set_synchronous_mode(true); | 1782 session_deps_.host_resolver->set_synchronous_mode(true); |
1820 | 1783 |
1821 MockConnect connect_data(SYNCHRONOUS, OK); | 1784 MockConnect connect_data(SYNCHRONOUS, OK); |
1822 | 1785 |
1823 scoped_ptr<SpdyFrame> req1( | 1786 scoped_ptr<SpdyFrame> req1( |
1824 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 1787 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
1825 scoped_ptr<SpdyFrame> req2( | 1788 scoped_ptr<SpdyFrame> req2( |
1826 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); | 1789 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, MEDIUM, true)); |
1827 MockWrite writes[] = { | 1790 MockWrite writes[] = { |
1828 CreateMockWrite(*req1, 0), | 1791 CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1), |
1829 CreateMockWrite(*req2, 1), | |
1830 }; | 1792 }; |
1831 | 1793 |
1832 MockRead reads[] = { | 1794 MockRead reads[] = { |
1833 MockRead(ASYNC, 0, 2) // EOF | 1795 MockRead(ASYNC, 0, 2) // EOF |
1834 }; | 1796 }; |
1835 | 1797 |
1836 DeterministicSocketData data(reads, arraysize(reads), | 1798 DeterministicSocketData data( |
1837 writes, arraysize(writes)); | 1799 reads, arraysize(reads), writes, arraysize(writes)); |
1838 data.set_connect_data(connect_data); | 1800 data.set_connect_data(connect_data); |
1839 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1801 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1840 | 1802 |
1841 CreateDeterministicNetworkSession(); | 1803 CreateDeterministicNetworkSession(); |
1842 | 1804 |
1843 base::WeakPtr<SpdySession> session = | 1805 base::WeakPtr<SpdySession> session = |
1844 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1806 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1845 | 1807 |
1846 GURL url1(kDefaultURL); | 1808 GURL url1(kDefaultURL); |
1847 base::WeakPtr<SpdyStream> spdy_stream1 = | 1809 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
1848 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 1810 SPDY_REQUEST_RESPONSE_STREAM, session, url1, MEDIUM, BoundNetLog()); |
1849 session, url1, MEDIUM, BoundNetLog()); | |
1850 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1811 ASSERT_TRUE(spdy_stream1.get() != NULL); |
1851 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1812 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
1852 | 1813 |
1853 GURL url2(kDefaultURL); | 1814 GURL url2(kDefaultURL); |
1854 base::WeakPtr<SpdyStream> spdy_stream2 = | 1815 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
1855 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 1816 SPDY_REQUEST_RESPONSE_STREAM, session, url2, MEDIUM, BoundNetLog()); |
1856 session, url2, MEDIUM, BoundNetLog()); | |
1857 ASSERT_TRUE(spdy_stream2.get() != NULL); | 1817 ASSERT_TRUE(spdy_stream2.get() != NULL); |
1858 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 1818 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
1859 | 1819 |
1860 // Make |spdy_stream1| close |spdy_stream2|. | 1820 // Make |spdy_stream1| close |spdy_stream2|. |
1861 test::ClosingDelegate delegate1(spdy_stream2); | 1821 test::ClosingDelegate delegate1(spdy_stream2); |
1862 spdy_stream1->SetDelegate(&delegate1); | 1822 spdy_stream1->SetDelegate(&delegate1); |
1863 | 1823 |
1864 // Make |spdy_stream2| close |spdy_stream1|. | 1824 // Make |spdy_stream2| close |spdy_stream1|. |
1865 test::ClosingDelegate delegate2(spdy_stream1); | 1825 test::ClosingDelegate delegate2(spdy_stream1); |
1866 spdy_stream2->SetDelegate(&delegate2); | 1826 spdy_stream2->SetDelegate(&delegate2); |
(...skipping 27 matching lines...) Expand all Loading... |
1894 EXPECT_TRUE(delegate2.StreamIsClosed()); | 1854 EXPECT_TRUE(delegate2.StreamIsClosed()); |
1895 | 1855 |
1896 EXPECT_TRUE(session == NULL); | 1856 EXPECT_TRUE(session == NULL); |
1897 } | 1857 } |
1898 | 1858 |
1899 // Delegate that closes a given session when the stream is closed. | 1859 // Delegate that closes a given session when the stream is closed. |
1900 class SessionClosingDelegate : public test::StreamDelegateDoNothing { | 1860 class SessionClosingDelegate : public test::StreamDelegateDoNothing { |
1901 public: | 1861 public: |
1902 SessionClosingDelegate(const base::WeakPtr<SpdyStream>& stream, | 1862 SessionClosingDelegate(const base::WeakPtr<SpdyStream>& stream, |
1903 const base::WeakPtr<SpdySession>& session_to_close) | 1863 const base::WeakPtr<SpdySession>& session_to_close) |
1904 : StreamDelegateDoNothing(stream), | 1864 : StreamDelegateDoNothing(stream), session_to_close_(session_to_close) {} |
1905 session_to_close_(session_to_close) {} | |
1906 | 1865 |
1907 virtual ~SessionClosingDelegate() {} | 1866 virtual ~SessionClosingDelegate() {} |
1908 | 1867 |
1909 virtual void OnClose(int status) OVERRIDE { | 1868 virtual void OnClose(int status) OVERRIDE { |
1910 session_to_close_->CloseSessionOnError(ERR_ABORTED, "Aborted"); | 1869 session_to_close_->CloseSessionOnError(ERR_ABORTED, "Aborted"); |
1911 } | 1870 } |
1912 | 1871 |
1913 private: | 1872 private: |
1914 base::WeakPtr<SpdySession> session_to_close_; | 1873 base::WeakPtr<SpdySession> session_to_close_; |
1915 }; | 1874 }; |
1916 | 1875 |
1917 // Close an activated stream that closes its session. Nothing should | 1876 // Close an activated stream that closes its session. Nothing should |
1918 // blow up. This is a regression test for http://crbug.com/263691 . | 1877 // blow up. This is a regression test for http://crbug.com/263691 . |
1919 TEST_P(SpdySessionTest, CloseActivatedStreamThatClosesSession) { | 1878 TEST_P(SpdySessionTest, CloseActivatedStreamThatClosesSession) { |
1920 session_deps_.host_resolver->set_synchronous_mode(true); | 1879 session_deps_.host_resolver->set_synchronous_mode(true); |
1921 | 1880 |
1922 MockConnect connect_data(SYNCHRONOUS, OK); | 1881 MockConnect connect_data(SYNCHRONOUS, OK); |
1923 | 1882 |
1924 scoped_ptr<SpdyFrame> req( | 1883 scoped_ptr<SpdyFrame> req( |
1925 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 1884 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
1926 MockWrite writes[] = { | 1885 MockWrite writes[] = { |
1927 CreateMockWrite(*req, 0), | 1886 CreateMockWrite(*req, 0), |
1928 }; | 1887 }; |
1929 | 1888 |
1930 MockRead reads[] = { | 1889 MockRead reads[] = { |
1931 MockRead(ASYNC, 0, 1) // EOF | 1890 MockRead(ASYNC, 0, 1) // EOF |
1932 }; | 1891 }; |
1933 DeterministicSocketData data(reads, arraysize(reads), | 1892 DeterministicSocketData data( |
1934 writes, arraysize(writes)); | 1893 reads, arraysize(reads), writes, arraysize(writes)); |
1935 data.set_connect_data(connect_data); | 1894 data.set_connect_data(connect_data); |
1936 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1895 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1937 | 1896 |
1938 CreateDeterministicNetworkSession(); | 1897 CreateDeterministicNetworkSession(); |
1939 | 1898 |
1940 base::WeakPtr<SpdySession> session = | 1899 base::WeakPtr<SpdySession> session = |
1941 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 1900 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
1942 | 1901 |
1943 GURL url(kDefaultURL); | 1902 GURL url(kDefaultURL); |
1944 base::WeakPtr<SpdyStream> spdy_stream = | 1903 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
1945 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 1904 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog()); |
1946 session, url, MEDIUM, BoundNetLog()); | |
1947 ASSERT_TRUE(spdy_stream.get() != NULL); | 1905 ASSERT_TRUE(spdy_stream.get() != NULL); |
1948 EXPECT_EQ(0u, spdy_stream->stream_id()); | 1906 EXPECT_EQ(0u, spdy_stream->stream_id()); |
1949 | 1907 |
1950 SessionClosingDelegate delegate(spdy_stream, session); | 1908 SessionClosingDelegate delegate(spdy_stream, session); |
1951 spdy_stream->SetDelegate(&delegate); | 1909 spdy_stream->SetDelegate(&delegate); |
1952 | 1910 |
1953 scoped_ptr<SpdyHeaderBlock> headers( | 1911 scoped_ptr<SpdyHeaderBlock> headers( |
1954 spdy_util_.ConstructGetHeaderBlock(url.spec())); | 1912 spdy_util_.ConstructGetHeaderBlock(url.spec())); |
1955 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 1913 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
1956 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 1914 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
(...skipping 13 matching lines...) Expand all Loading... |
1970 EXPECT_TRUE(session == NULL); | 1928 EXPECT_TRUE(session == NULL); |
1971 } | 1929 } |
1972 | 1930 |
1973 TEST_P(SpdySessionTest, VerifyDomainAuthentication) { | 1931 TEST_P(SpdySessionTest, VerifyDomainAuthentication) { |
1974 session_deps_.host_resolver->set_synchronous_mode(true); | 1932 session_deps_.host_resolver->set_synchronous_mode(true); |
1975 | 1933 |
1976 MockConnect connect_data(SYNCHRONOUS, OK); | 1934 MockConnect connect_data(SYNCHRONOUS, OK); |
1977 | 1935 |
1978 // No actual data will be sent. | 1936 // No actual data will be sent. |
1979 MockWrite writes[] = { | 1937 MockWrite writes[] = { |
1980 MockWrite(ASYNC, 0, 1) // EOF | 1938 MockWrite(ASYNC, 0, 1) // EOF |
1981 }; | 1939 }; |
1982 | 1940 |
1983 MockRead reads[] = { | 1941 MockRead reads[] = { |
1984 MockRead(ASYNC, 0, 0) // EOF | 1942 MockRead(ASYNC, 0, 0) // EOF |
1985 }; | 1943 }; |
1986 DeterministicSocketData data(reads, arraysize(reads), | 1944 DeterministicSocketData data( |
1987 writes, arraysize(writes)); | 1945 reads, arraysize(reads), writes, arraysize(writes)); |
1988 data.set_connect_data(connect_data); | 1946 data.set_connect_data(connect_data); |
1989 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1947 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
1990 | 1948 |
1991 // Load a cert that is valid for: | 1949 // Load a cert that is valid for: |
1992 // www.example.org | 1950 // www.example.org |
1993 // mail.example.org | 1951 // mail.example.org |
1994 // www.example.com | 1952 // www.example.com |
1995 base::FilePath certs_dir = GetTestCertsDirectory(); | 1953 base::FilePath certs_dir = GetTestCertsDirectory(); |
1996 scoped_refptr<X509Certificate> test_cert( | 1954 scoped_refptr<X509Certificate> test_cert( |
1997 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); | 1955 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); |
(...skipping 14 matching lines...) Expand all Loading... |
2012 EXPECT_FALSE(session->VerifyDomainAuthentication("mail.google.com")); | 1970 EXPECT_FALSE(session->VerifyDomainAuthentication("mail.google.com")); |
2013 } | 1971 } |
2014 | 1972 |
2015 TEST_P(SpdySessionTest, ConnectionPooledWithTlsChannelId) { | 1973 TEST_P(SpdySessionTest, ConnectionPooledWithTlsChannelId) { |
2016 session_deps_.host_resolver->set_synchronous_mode(true); | 1974 session_deps_.host_resolver->set_synchronous_mode(true); |
2017 | 1975 |
2018 MockConnect connect_data(SYNCHRONOUS, OK); | 1976 MockConnect connect_data(SYNCHRONOUS, OK); |
2019 | 1977 |
2020 // No actual data will be sent. | 1978 // No actual data will be sent. |
2021 MockWrite writes[] = { | 1979 MockWrite writes[] = { |
2022 MockWrite(ASYNC, 0, 1) // EOF | 1980 MockWrite(ASYNC, 0, 1) // EOF |
2023 }; | 1981 }; |
2024 | 1982 |
2025 MockRead reads[] = { | 1983 MockRead reads[] = { |
2026 MockRead(ASYNC, 0, 0) // EOF | 1984 MockRead(ASYNC, 0, 0) // EOF |
2027 }; | 1985 }; |
2028 DeterministicSocketData data(reads, arraysize(reads), | 1986 DeterministicSocketData data( |
2029 writes, arraysize(writes)); | 1987 reads, arraysize(reads), writes, arraysize(writes)); |
2030 data.set_connect_data(connect_data); | 1988 data.set_connect_data(connect_data); |
2031 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 1989 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
2032 | 1990 |
2033 // Load a cert that is valid for: | 1991 // Load a cert that is valid for: |
2034 // www.example.org | 1992 // www.example.org |
2035 // mail.example.org | 1993 // mail.example.org |
2036 // www.example.com | 1994 // www.example.com |
2037 base::FilePath certs_dir = GetTestCertsDirectory(); | 1995 base::FilePath certs_dir = GetTestCertsDirectory(); |
2038 scoped_refptr<X509Certificate> test_cert( | 1996 scoped_refptr<X509Certificate> test_cert( |
2039 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); | 1997 ImportCertFromFile(certs_dir, "spdy_pooling.pem")); |
(...skipping 26 matching lines...) Expand all Loading... |
2066 new_settings[kSpdySettingsIds1] = | 2024 new_settings[kSpdySettingsIds1] = |
2067 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 2025 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
2068 | 2026 |
2069 scoped_ptr<SpdyFrame> req1( | 2027 scoped_ptr<SpdyFrame> req1( |
2070 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 2028 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
2071 scoped_ptr<SpdyFrame> req2( | 2029 scoped_ptr<SpdyFrame> req2( |
2072 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); | 2030 spdy_util_.ConstructSpdyGet(NULL, 0, false, 3, LOWEST, true)); |
2073 scoped_ptr<SpdyFrame> req3( | 2031 scoped_ptr<SpdyFrame> req3( |
2074 spdy_util_.ConstructSpdyGet(NULL, 0, false, 5, LOWEST, true)); | 2032 spdy_util_.ConstructSpdyGet(NULL, 0, false, 5, LOWEST, true)); |
2075 MockWrite writes[] = { | 2033 MockWrite writes[] = { |
2076 CreateMockWrite(*req1, 1), | 2034 CreateMockWrite(*req1, 1), CreateMockWrite(*req2, 4), |
2077 CreateMockWrite(*req2, 4), | 2035 CreateMockWrite(*req3, 7), |
2078 CreateMockWrite(*req3, 7), | |
2079 }; | 2036 }; |
2080 | 2037 |
2081 // Set up the socket so we read a SETTINGS frame that sets max concurrent | 2038 // Set up the socket so we read a SETTINGS frame that sets max concurrent |
2082 // streams to 1. | 2039 // streams to 1. |
2083 scoped_ptr<SpdyFrame> settings_frame( | 2040 scoped_ptr<SpdyFrame> settings_frame( |
2084 spdy_util_.ConstructSpdySettings(new_settings)); | 2041 spdy_util_.ConstructSpdySettings(new_settings)); |
2085 | 2042 |
2086 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2043 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
2087 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 2044 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
2088 | 2045 |
2089 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 2046 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
2090 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, true)); | 2047 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, true)); |
2091 | 2048 |
2092 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); | 2049 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); |
2093 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(5, true)); | 2050 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(5, true)); |
2094 | 2051 |
2095 MockRead reads[] = { | 2052 MockRead reads[] = { |
2096 CreateMockRead(*settings_frame), | 2053 CreateMockRead(*settings_frame), CreateMockRead(*resp1, 2), |
2097 CreateMockRead(*resp1, 2), | 2054 CreateMockRead(*body1, 3), CreateMockRead(*resp2, 5), |
2098 CreateMockRead(*body1, 3), | 2055 CreateMockRead(*body2, 6), CreateMockRead(*resp3, 8), |
2099 CreateMockRead(*resp2, 5), | 2056 CreateMockRead(*body3, 9), MockRead(ASYNC, 0, 10) // EOF |
2100 CreateMockRead(*body2, 6), | |
2101 CreateMockRead(*resp3, 8), | |
2102 CreateMockRead(*body3, 9), | |
2103 MockRead(ASYNC, 0, 10) // EOF | |
2104 }; | 2057 }; |
2105 | 2058 |
2106 DeterministicSocketData data(reads, arraysize(reads), | 2059 DeterministicSocketData data( |
2107 writes, arraysize(writes)); | 2060 reads, arraysize(reads), writes, arraysize(writes)); |
2108 data.set_connect_data(connect_data); | 2061 data.set_connect_data(connect_data); |
2109 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2062 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
2110 | 2063 |
2111 CreateDeterministicNetworkSession(); | 2064 CreateDeterministicNetworkSession(); |
2112 | 2065 |
2113 base::WeakPtr<SpdySession> session = | 2066 base::WeakPtr<SpdySession> session = |
2114 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 2067 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
2115 | 2068 |
2116 // Read the settings frame. | 2069 // Read the settings frame. |
2117 data.RunFor(1); | 2070 data.RunFor(1); |
2118 | 2071 |
2119 GURL url1(kDefaultURL); | 2072 GURL url1(kDefaultURL); |
2120 base::WeakPtr<SpdyStream> spdy_stream1 = | 2073 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
2121 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 2074 SPDY_REQUEST_RESPONSE_STREAM, session, url1, LOWEST, BoundNetLog()); |
2122 session, url1, LOWEST, BoundNetLog()); | |
2123 ASSERT_TRUE(spdy_stream1.get() != NULL); | 2075 ASSERT_TRUE(spdy_stream1.get() != NULL); |
2124 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 2076 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
2125 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 2077 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
2126 spdy_stream1->SetDelegate(&delegate1); | 2078 spdy_stream1->SetDelegate(&delegate1); |
2127 | 2079 |
2128 TestCompletionCallback callback2; | 2080 TestCompletionCallback callback2; |
2129 GURL url2(kDefaultURL); | 2081 GURL url2(kDefaultURL); |
2130 SpdyStreamRequest request2; | 2082 SpdyStreamRequest request2; |
2131 ASSERT_EQ(ERR_IO_PENDING, | 2083 ASSERT_EQ(ERR_IO_PENDING, |
2132 request2.StartRequest( | 2084 request2.StartRequest(SPDY_REQUEST_RESPONSE_STREAM, |
2133 SPDY_REQUEST_RESPONSE_STREAM, | 2085 session, |
2134 session, url2, LOWEST, BoundNetLog(), callback2.callback())); | 2086 url2, |
| 2087 LOWEST, |
| 2088 BoundNetLog(), |
| 2089 callback2.callback())); |
2135 | 2090 |
2136 TestCompletionCallback callback3; | 2091 TestCompletionCallback callback3; |
2137 GURL url3(kDefaultURL); | 2092 GURL url3(kDefaultURL); |
2138 SpdyStreamRequest request3; | 2093 SpdyStreamRequest request3; |
2139 ASSERT_EQ(ERR_IO_PENDING, | 2094 ASSERT_EQ(ERR_IO_PENDING, |
2140 request3.StartRequest( | 2095 request3.StartRequest(SPDY_REQUEST_RESPONSE_STREAM, |
2141 SPDY_REQUEST_RESPONSE_STREAM, | 2096 session, |
2142 session, url3, LOWEST, BoundNetLog(), callback3.callback())); | 2097 url3, |
| 2098 LOWEST, |
| 2099 BoundNetLog(), |
| 2100 callback3.callback())); |
2143 | 2101 |
2144 EXPECT_EQ(0u, session->num_active_streams()); | 2102 EXPECT_EQ(0u, session->num_active_streams()); |
2145 EXPECT_EQ(1u, session->num_created_streams()); | 2103 EXPECT_EQ(1u, session->num_created_streams()); |
2146 EXPECT_EQ(2u, session->pending_create_stream_queue_size(LOWEST)); | 2104 EXPECT_EQ(2u, session->pending_create_stream_queue_size(LOWEST)); |
2147 | 2105 |
2148 scoped_ptr<SpdyHeaderBlock> headers( | 2106 scoped_ptr<SpdyHeaderBlock> headers( |
2149 spdy_util_.ConstructGetHeaderBlock(url1.spec())); | 2107 spdy_util_.ConstructGetHeaderBlock(url1.spec())); |
2150 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 2108 spdy_stream1->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
2151 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 2109 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
2152 | 2110 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2212 EXPECT_EQ(0u, session->num_created_streams()); | 2170 EXPECT_EQ(0u, session->num_created_streams()); |
2213 EXPECT_EQ(0u, session->pending_create_stream_queue_size(LOWEST)); | 2171 EXPECT_EQ(0u, session->pending_create_stream_queue_size(LOWEST)); |
2214 | 2172 |
2215 data.RunFor(1); | 2173 data.RunFor(1); |
2216 } | 2174 } |
2217 | 2175 |
2218 TEST_P(SpdySessionTest, CancelTwoStalledCreateStream) { | 2176 TEST_P(SpdySessionTest, CancelTwoStalledCreateStream) { |
2219 session_deps_.host_resolver->set_synchronous_mode(true); | 2177 session_deps_.host_resolver->set_synchronous_mode(true); |
2220 | 2178 |
2221 MockRead reads[] = { | 2179 MockRead reads[] = { |
2222 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 2180 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
2223 }; | 2181 }; |
2224 | 2182 |
2225 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 2183 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
2226 MockConnect connect_data(SYNCHRONOUS, OK); | 2184 MockConnect connect_data(SYNCHRONOUS, OK); |
2227 | 2185 |
2228 data.set_connect_data(connect_data); | 2186 data.set_connect_data(connect_data); |
2229 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2187 session_deps_.socket_factory->AddSocketDataProvider(&data); |
2230 | 2188 |
2231 CreateNetworkSession(); | 2189 CreateNetworkSession(); |
2232 | 2190 |
2233 base::WeakPtr<SpdySession> session = | 2191 base::WeakPtr<SpdySession> session = |
2234 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 2192 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
2235 | 2193 |
2236 // Leave room for only one more stream to be created. | 2194 // Leave room for only one more stream to be created. |
2237 for (size_t i = 0; i < kInitialMaxConcurrentStreams - 1; ++i) { | 2195 for (size_t i = 0; i < kInitialMaxConcurrentStreams - 1; ++i) { |
2238 base::WeakPtr<SpdyStream> spdy_stream = | 2196 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
2239 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 2197 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, BoundNetLog()); |
2240 session, test_url_, MEDIUM, BoundNetLog()); | |
2241 ASSERT_TRUE(spdy_stream != NULL); | 2198 ASSERT_TRUE(spdy_stream != NULL); |
2242 } | 2199 } |
2243 | 2200 |
2244 GURL url1(kDefaultURL); | 2201 GURL url1(kDefaultURL); |
2245 base::WeakPtr<SpdyStream> spdy_stream1 = | 2202 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
2246 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 2203 SPDY_BIDIRECTIONAL_STREAM, session, url1, LOWEST, BoundNetLog()); |
2247 session, url1, LOWEST, BoundNetLog()); | |
2248 ASSERT_TRUE(spdy_stream1.get() != NULL); | 2204 ASSERT_TRUE(spdy_stream1.get() != NULL); |
2249 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 2205 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
2250 | 2206 |
2251 TestCompletionCallback callback2; | 2207 TestCompletionCallback callback2; |
2252 GURL url2(kDefaultURL); | 2208 GURL url2(kDefaultURL); |
2253 SpdyStreamRequest request2; | 2209 SpdyStreamRequest request2; |
2254 ASSERT_EQ(ERR_IO_PENDING, | 2210 ASSERT_EQ(ERR_IO_PENDING, |
2255 request2.StartRequest( | 2211 request2.StartRequest(SPDY_BIDIRECTIONAL_STREAM, |
2256 SPDY_BIDIRECTIONAL_STREAM, session, url2, LOWEST, BoundNetLog(), | 2212 session, |
2257 callback2.callback())); | 2213 url2, |
| 2214 LOWEST, |
| 2215 BoundNetLog(), |
| 2216 callback2.callback())); |
2258 | 2217 |
2259 TestCompletionCallback callback3; | 2218 TestCompletionCallback callback3; |
2260 GURL url3(kDefaultURL); | 2219 GURL url3(kDefaultURL); |
2261 SpdyStreamRequest request3; | 2220 SpdyStreamRequest request3; |
2262 ASSERT_EQ(ERR_IO_PENDING, | 2221 ASSERT_EQ(ERR_IO_PENDING, |
2263 request3.StartRequest( | 2222 request3.StartRequest(SPDY_BIDIRECTIONAL_STREAM, |
2264 SPDY_BIDIRECTIONAL_STREAM, session, url3, LOWEST, BoundNetLog(), | 2223 session, |
2265 callback3.callback())); | 2224 url3, |
| 2225 LOWEST, |
| 2226 BoundNetLog(), |
| 2227 callback3.callback())); |
2266 | 2228 |
2267 EXPECT_EQ(0u, session->num_active_streams()); | 2229 EXPECT_EQ(0u, session->num_active_streams()); |
2268 EXPECT_EQ(kInitialMaxConcurrentStreams, session->num_created_streams()); | 2230 EXPECT_EQ(kInitialMaxConcurrentStreams, session->num_created_streams()); |
2269 EXPECT_EQ(2u, session->pending_create_stream_queue_size(LOWEST)); | 2231 EXPECT_EQ(2u, session->pending_create_stream_queue_size(LOWEST)); |
2270 | 2232 |
2271 // Cancel the first stream; this will allow the second stream to be created. | 2233 // Cancel the first stream; this will allow the second stream to be created. |
2272 EXPECT_TRUE(spdy_stream1.get() != NULL); | 2234 EXPECT_TRUE(spdy_stream1.get() != NULL); |
2273 spdy_stream1->Cancel(); | 2235 spdy_stream1->Cancel(); |
2274 EXPECT_EQ(NULL, spdy_stream1.get()); | 2236 EXPECT_EQ(NULL, spdy_stream1.get()); |
2275 | 2237 |
(...skipping 25 matching lines...) Expand all Loading... |
2301 // without yielding. This test makes 32k - 1 bytes of data available | 2263 // without yielding. This test makes 32k - 1 bytes of data available |
2302 // on the socket for reading. It then verifies that it has read all | 2264 // on the socket for reading. It then verifies that it has read all |
2303 // the available data without yielding. | 2265 // the available data without yielding. |
2304 TEST_P(SpdySessionTest, ReadDataWithoutYielding) { | 2266 TEST_P(SpdySessionTest, ReadDataWithoutYielding) { |
2305 MockConnect connect_data(SYNCHRONOUS, OK); | 2267 MockConnect connect_data(SYNCHRONOUS, OK); |
2306 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); | 2268 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); |
2307 | 2269 |
2308 scoped_ptr<SpdyFrame> req1( | 2270 scoped_ptr<SpdyFrame> req1( |
2309 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 2271 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
2310 MockWrite writes[] = { | 2272 MockWrite writes[] = { |
2311 CreateMockWrite(*req1, 0), | 2273 CreateMockWrite(*req1, 0), |
2312 }; | 2274 }; |
2313 | 2275 |
2314 // Build buffer of size kMaxReadBytesWithoutYielding / 4 | 2276 // Build buffer of size kMaxReadBytesWithoutYielding / 4 |
2315 // (-spdy_data_frame_size). | 2277 // (-spdy_data_frame_size). |
2316 ASSERT_EQ(32 * 1024, kMaxReadBytesWithoutYielding); | 2278 ASSERT_EQ(32 * 1024, kMaxReadBytesWithoutYielding); |
2317 const int kPayloadSize = | 2279 const int kPayloadSize = |
2318 kMaxReadBytesWithoutYielding / 4 - framer.GetControlFrameHeaderSize(); | 2280 kMaxReadBytesWithoutYielding / 4 - framer.GetControlFrameHeaderSize(); |
2319 TestDataStream test_stream; | 2281 TestDataStream test_stream; |
2320 scoped_refptr<net::IOBuffer> payload(new net::IOBuffer(kPayloadSize)); | 2282 scoped_refptr<net::IOBuffer> payload(new net::IOBuffer(kPayloadSize)); |
2321 char* payload_data = payload->data(); | 2283 char* payload_data = payload->data(); |
2322 test_stream.GetBytes(payload_data, kPayloadSize); | 2284 test_stream.GetBytes(payload_data, kPayloadSize); |
2323 | 2285 |
2324 scoped_ptr<SpdyFrame> partial_data_frame( | 2286 scoped_ptr<SpdyFrame> partial_data_frame( |
2325 framer.CreateDataFrame(1, payload_data, kPayloadSize, DATA_FLAG_NONE)); | 2287 framer.CreateDataFrame(1, payload_data, kPayloadSize, DATA_FLAG_NONE)); |
2326 scoped_ptr<SpdyFrame> finish_data_frame( | 2288 scoped_ptr<SpdyFrame> finish_data_frame( |
2327 framer.CreateDataFrame(1, payload_data, kPayloadSize - 1, DATA_FLAG_FIN)); | 2289 framer.CreateDataFrame(1, payload_data, kPayloadSize - 1, DATA_FLAG_FIN)); |
2328 | 2290 |
2329 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2291 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
2330 | 2292 |
2331 // Write 1 byte less than kMaxReadBytes to check that DoRead reads up to 32k | 2293 // Write 1 byte less than kMaxReadBytes to check that DoRead reads up to 32k |
2332 // bytes. | 2294 // bytes. |
2333 MockRead reads[] = { | 2295 MockRead reads[] = { |
2334 CreateMockRead(*resp1, 1), | 2296 CreateMockRead(*resp1, 1), CreateMockRead(*partial_data_frame, 2), |
2335 CreateMockRead(*partial_data_frame, 2), | 2297 CreateMockRead(*partial_data_frame, 3, SYNCHRONOUS), |
2336 CreateMockRead(*partial_data_frame, 3, SYNCHRONOUS), | 2298 CreateMockRead(*partial_data_frame, 4, SYNCHRONOUS), |
2337 CreateMockRead(*partial_data_frame, 4, SYNCHRONOUS), | 2299 CreateMockRead(*finish_data_frame, 5, SYNCHRONOUS), |
2338 CreateMockRead(*finish_data_frame, 5, SYNCHRONOUS), | 2300 MockRead(ASYNC, 0, 6) // EOF |
2339 MockRead(ASYNC, 0, 6) // EOF | |
2340 }; | 2301 }; |
2341 | 2302 |
2342 // Create SpdySession and SpdyStream and send the request. | 2303 // Create SpdySession and SpdyStream and send the request. |
2343 DeterministicSocketData data(reads, arraysize(reads), | 2304 DeterministicSocketData data( |
2344 writes, arraysize(writes)); | 2305 reads, arraysize(reads), writes, arraysize(writes)); |
2345 data.set_connect_data(connect_data); | 2306 data.set_connect_data(connect_data); |
2346 session_deps_.host_resolver->set_synchronous_mode(true); | 2307 session_deps_.host_resolver->set_synchronous_mode(true); |
2347 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2308 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
2348 | 2309 |
2349 CreateDeterministicNetworkSession(); | 2310 CreateDeterministicNetworkSession(); |
2350 | 2311 |
2351 base::WeakPtr<SpdySession> session = | 2312 base::WeakPtr<SpdySession> session = |
2352 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 2313 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
2353 | 2314 |
2354 GURL url1(kDefaultURL); | 2315 GURL url1(kDefaultURL); |
2355 base::WeakPtr<SpdyStream> spdy_stream1 = | 2316 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
2356 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 2317 SPDY_REQUEST_RESPONSE_STREAM, session, url1, MEDIUM, BoundNetLog()); |
2357 session, url1, MEDIUM, BoundNetLog()); | |
2358 ASSERT_TRUE(spdy_stream1.get() != NULL); | 2318 ASSERT_TRUE(spdy_stream1.get() != NULL); |
2359 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 2319 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
2360 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 2320 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
2361 spdy_stream1->SetDelegate(&delegate1); | 2321 spdy_stream1->SetDelegate(&delegate1); |
2362 | 2322 |
2363 scoped_ptr<SpdyHeaderBlock> headers1( | 2323 scoped_ptr<SpdyHeaderBlock> headers1( |
2364 spdy_util_.ConstructGetHeaderBlock(url1.spec())); | 2324 spdy_util_.ConstructGetHeaderBlock(url1.spec())); |
2365 spdy_stream1->SendRequestHeaders(headers1.Pass(), NO_MORE_DATA_TO_SEND); | 2325 spdy_stream1->SendRequestHeaders(headers1.Pass(), NO_MORE_DATA_TO_SEND); |
2366 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 2326 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
2367 | 2327 |
(...skipping 24 matching lines...) Expand all Loading... |
2392 // for reading. It then verifies that DoRead has yielded even though | 2352 // for reading. It then verifies that DoRead has yielded even though |
2393 // there is data available for it to read (i.e, socket()->Read didn't | 2353 // there is data available for it to read (i.e, socket()->Read didn't |
2394 // return ERR_IO_PENDING during socket reads). | 2354 // return ERR_IO_PENDING during socket reads). |
2395 TEST_P(SpdySessionTest, TestYieldingDuringReadData) { | 2355 TEST_P(SpdySessionTest, TestYieldingDuringReadData) { |
2396 MockConnect connect_data(SYNCHRONOUS, OK); | 2356 MockConnect connect_data(SYNCHRONOUS, OK); |
2397 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); | 2357 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); |
2398 | 2358 |
2399 scoped_ptr<SpdyFrame> req1( | 2359 scoped_ptr<SpdyFrame> req1( |
2400 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 2360 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
2401 MockWrite writes[] = { | 2361 MockWrite writes[] = { |
2402 CreateMockWrite(*req1, 0), | 2362 CreateMockWrite(*req1, 0), |
2403 }; | 2363 }; |
2404 | 2364 |
2405 // Build buffer of size kMaxReadBytesWithoutYielding / 4 | 2365 // Build buffer of size kMaxReadBytesWithoutYielding / 4 |
2406 // (-spdy_data_frame_size). | 2366 // (-spdy_data_frame_size). |
2407 ASSERT_EQ(32 * 1024, kMaxReadBytesWithoutYielding); | 2367 ASSERT_EQ(32 * 1024, kMaxReadBytesWithoutYielding); |
2408 const int kPayloadSize = | 2368 const int kPayloadSize = |
2409 kMaxReadBytesWithoutYielding / 4 - framer.GetControlFrameHeaderSize(); | 2369 kMaxReadBytesWithoutYielding / 4 - framer.GetControlFrameHeaderSize(); |
2410 TestDataStream test_stream; | 2370 TestDataStream test_stream; |
2411 scoped_refptr<net::IOBuffer> payload(new net::IOBuffer(kPayloadSize)); | 2371 scoped_refptr<net::IOBuffer> payload(new net::IOBuffer(kPayloadSize)); |
2412 char* payload_data = payload->data(); | 2372 char* payload_data = payload->data(); |
2413 test_stream.GetBytes(payload_data, kPayloadSize); | 2373 test_stream.GetBytes(payload_data, kPayloadSize); |
2414 | 2374 |
2415 scoped_ptr<SpdyFrame> partial_data_frame( | 2375 scoped_ptr<SpdyFrame> partial_data_frame( |
2416 framer.CreateDataFrame(1, payload_data, kPayloadSize, DATA_FLAG_NONE)); | 2376 framer.CreateDataFrame(1, payload_data, kPayloadSize, DATA_FLAG_NONE)); |
2417 scoped_ptr<SpdyFrame> finish_data_frame( | 2377 scoped_ptr<SpdyFrame> finish_data_frame( |
2418 framer.CreateDataFrame(1, "h", 1, DATA_FLAG_FIN)); | 2378 framer.CreateDataFrame(1, "h", 1, DATA_FLAG_FIN)); |
2419 | 2379 |
2420 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2380 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
2421 | 2381 |
2422 // Write 1 byte more than kMaxReadBytes to check that DoRead yields. | 2382 // Write 1 byte more than kMaxReadBytes to check that DoRead yields. |
2423 MockRead reads[] = { | 2383 MockRead reads[] = { |
2424 CreateMockRead(*resp1, 1), | 2384 CreateMockRead(*resp1, 1), CreateMockRead(*partial_data_frame, 2), |
2425 CreateMockRead(*partial_data_frame, 2), | 2385 CreateMockRead(*partial_data_frame, 3, SYNCHRONOUS), |
2426 CreateMockRead(*partial_data_frame, 3, SYNCHRONOUS), | 2386 CreateMockRead(*partial_data_frame, 4, SYNCHRONOUS), |
2427 CreateMockRead(*partial_data_frame, 4, SYNCHRONOUS), | 2387 CreateMockRead(*partial_data_frame, 5, SYNCHRONOUS), |
2428 CreateMockRead(*partial_data_frame, 5, SYNCHRONOUS), | 2388 CreateMockRead(*finish_data_frame, 6, SYNCHRONOUS), |
2429 CreateMockRead(*finish_data_frame, 6, SYNCHRONOUS), | 2389 MockRead(ASYNC, 0, 7) // EOF |
2430 MockRead(ASYNC, 0, 7) // EOF | |
2431 }; | 2390 }; |
2432 | 2391 |
2433 // Create SpdySession and SpdyStream and send the request. | 2392 // Create SpdySession and SpdyStream and send the request. |
2434 DeterministicSocketData data(reads, arraysize(reads), | 2393 DeterministicSocketData data( |
2435 writes, arraysize(writes)); | 2394 reads, arraysize(reads), writes, arraysize(writes)); |
2436 data.set_connect_data(connect_data); | 2395 data.set_connect_data(connect_data); |
2437 session_deps_.host_resolver->set_synchronous_mode(true); | 2396 session_deps_.host_resolver->set_synchronous_mode(true); |
2438 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2397 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
2439 | 2398 |
2440 CreateDeterministicNetworkSession(); | 2399 CreateDeterministicNetworkSession(); |
2441 | 2400 |
2442 base::WeakPtr<SpdySession> session = | 2401 base::WeakPtr<SpdySession> session = |
2443 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 2402 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
2444 | 2403 |
2445 GURL url1(kDefaultURL); | 2404 GURL url1(kDefaultURL); |
2446 base::WeakPtr<SpdyStream> spdy_stream1 = | 2405 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
2447 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 2406 SPDY_REQUEST_RESPONSE_STREAM, session, url1, MEDIUM, BoundNetLog()); |
2448 session, url1, MEDIUM, BoundNetLog()); | |
2449 ASSERT_TRUE(spdy_stream1.get() != NULL); | 2407 ASSERT_TRUE(spdy_stream1.get() != NULL); |
2450 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 2408 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
2451 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 2409 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
2452 spdy_stream1->SetDelegate(&delegate1); | 2410 spdy_stream1->SetDelegate(&delegate1); |
2453 | 2411 |
2454 scoped_ptr<SpdyHeaderBlock> headers1( | 2412 scoped_ptr<SpdyHeaderBlock> headers1( |
2455 spdy_util_.ConstructGetHeaderBlock(url1.spec())); | 2413 spdy_util_.ConstructGetHeaderBlock(url1.spec())); |
2456 spdy_stream1->SendRequestHeaders(headers1.Pass(), NO_MORE_DATA_TO_SEND); | 2414 spdy_stream1->SendRequestHeaders(headers1.Pass(), NO_MORE_DATA_TO_SEND); |
2457 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 2415 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
2458 | 2416 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2490 // ERR_IO_PENDING (because of async read), so DoReadLoop() will | 2448 // ERR_IO_PENDING (because of async read), so DoReadLoop() will |
2491 // yield. When we come back, DoRead() will read the results from the | 2449 // yield. When we come back, DoRead() will read the results from the |
2492 // async read, and rest of the data synchronously. | 2450 // async read, and rest of the data synchronously. |
2493 TEST_P(SpdySessionTest, TestYieldingDuringAsyncReadData) { | 2451 TEST_P(SpdySessionTest, TestYieldingDuringAsyncReadData) { |
2494 MockConnect connect_data(SYNCHRONOUS, OK); | 2452 MockConnect connect_data(SYNCHRONOUS, OK); |
2495 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); | 2453 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); |
2496 | 2454 |
2497 scoped_ptr<SpdyFrame> req1( | 2455 scoped_ptr<SpdyFrame> req1( |
2498 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 2456 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
2499 MockWrite writes[] = { | 2457 MockWrite writes[] = { |
2500 CreateMockWrite(*req1, 0), | 2458 CreateMockWrite(*req1, 0), |
2501 }; | 2459 }; |
2502 | 2460 |
2503 // Build buffer of size kMaxReadBytesWithoutYielding / 4 | 2461 // Build buffer of size kMaxReadBytesWithoutYielding / 4 |
2504 // (-spdy_data_frame_size). | 2462 // (-spdy_data_frame_size). |
2505 ASSERT_EQ(32 * 1024, kMaxReadBytesWithoutYielding); | 2463 ASSERT_EQ(32 * 1024, kMaxReadBytesWithoutYielding); |
2506 TestDataStream test_stream; | 2464 TestDataStream test_stream; |
2507 const int kEightKPayloadSize = | 2465 const int kEightKPayloadSize = |
2508 kMaxReadBytesWithoutYielding / 4 - framer.GetControlFrameHeaderSize(); | 2466 kMaxReadBytesWithoutYielding / 4 - framer.GetControlFrameHeaderSize(); |
2509 scoped_refptr<net::IOBuffer> eightk_payload( | 2467 scoped_refptr<net::IOBuffer> eightk_payload( |
2510 new net::IOBuffer(kEightKPayloadSize)); | 2468 new net::IOBuffer(kEightKPayloadSize)); |
2511 char* eightk_payload_data = eightk_payload->data(); | 2469 char* eightk_payload_data = eightk_payload->data(); |
2512 test_stream.GetBytes(eightk_payload_data, kEightKPayloadSize); | 2470 test_stream.GetBytes(eightk_payload_data, kEightKPayloadSize); |
2513 | 2471 |
2514 // Build buffer of 2k size. | 2472 // Build buffer of 2k size. |
2515 TestDataStream test_stream2; | 2473 TestDataStream test_stream2; |
2516 const int kTwoKPayloadSize = kEightKPayloadSize - 6 * 1024; | 2474 const int kTwoKPayloadSize = kEightKPayloadSize - 6 * 1024; |
2517 scoped_refptr<net::IOBuffer> twok_payload( | 2475 scoped_refptr<net::IOBuffer> twok_payload( |
2518 new net::IOBuffer(kTwoKPayloadSize)); | 2476 new net::IOBuffer(kTwoKPayloadSize)); |
2519 char* twok_payload_data = twok_payload->data(); | 2477 char* twok_payload_data = twok_payload->data(); |
2520 test_stream2.GetBytes(twok_payload_data, kTwoKPayloadSize); | 2478 test_stream2.GetBytes(twok_payload_data, kTwoKPayloadSize); |
2521 | 2479 |
2522 scoped_ptr<SpdyFrame> eightk_data_frame(framer.CreateDataFrame( | 2480 scoped_ptr<SpdyFrame> eightk_data_frame(framer.CreateDataFrame( |
2523 1, eightk_payload_data, kEightKPayloadSize, DATA_FLAG_NONE)); | 2481 1, eightk_payload_data, kEightKPayloadSize, DATA_FLAG_NONE)); |
2524 scoped_ptr<SpdyFrame> twok_data_frame(framer.CreateDataFrame( | 2482 scoped_ptr<SpdyFrame> twok_data_frame(framer.CreateDataFrame( |
2525 1, twok_payload_data, kTwoKPayloadSize, DATA_FLAG_NONE)); | 2483 1, twok_payload_data, kTwoKPayloadSize, DATA_FLAG_NONE)); |
2526 scoped_ptr<SpdyFrame> finish_data_frame(framer.CreateDataFrame( | 2484 scoped_ptr<SpdyFrame> finish_data_frame( |
2527 1, "h", 1, DATA_FLAG_FIN)); | 2485 framer.CreateDataFrame(1, "h", 1, DATA_FLAG_FIN)); |
2528 | 2486 |
2529 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2487 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
2530 | 2488 |
2531 MockRead reads[] = { | 2489 MockRead reads[] = { |
2532 CreateMockRead(*resp1, 1), | 2490 CreateMockRead(*resp1, 1), CreateMockRead(*eightk_data_frame, 2), |
2533 CreateMockRead(*eightk_data_frame, 2), | 2491 CreateMockRead(*eightk_data_frame, 3, SYNCHRONOUS), |
2534 CreateMockRead(*eightk_data_frame, 3, SYNCHRONOUS), | 2492 CreateMockRead(*eightk_data_frame, 4, SYNCHRONOUS), |
2535 CreateMockRead(*eightk_data_frame, 4, SYNCHRONOUS), | 2493 CreateMockRead(*twok_data_frame, 5, SYNCHRONOUS), |
2536 CreateMockRead(*twok_data_frame, 5, SYNCHRONOUS), | 2494 CreateMockRead(*eightk_data_frame, 6, ASYNC), |
2537 CreateMockRead(*eightk_data_frame, 6, ASYNC), | 2495 CreateMockRead(*eightk_data_frame, 7, SYNCHRONOUS), |
2538 CreateMockRead(*eightk_data_frame, 7, SYNCHRONOUS), | 2496 CreateMockRead(*eightk_data_frame, 8, SYNCHRONOUS), |
2539 CreateMockRead(*eightk_data_frame, 8, SYNCHRONOUS), | 2497 CreateMockRead(*eightk_data_frame, 9, SYNCHRONOUS), |
2540 CreateMockRead(*eightk_data_frame, 9, SYNCHRONOUS), | 2498 CreateMockRead(*twok_data_frame, 10, SYNCHRONOUS), |
2541 CreateMockRead(*twok_data_frame, 10, SYNCHRONOUS), | 2499 CreateMockRead(*finish_data_frame, 11, SYNCHRONOUS), |
2542 CreateMockRead(*finish_data_frame, 11, SYNCHRONOUS), | 2500 MockRead(ASYNC, 0, 12) // EOF |
2543 MockRead(ASYNC, 0, 12) // EOF | |
2544 }; | 2501 }; |
2545 | 2502 |
2546 // Create SpdySession and SpdyStream and send the request. | 2503 // Create SpdySession and SpdyStream and send the request. |
2547 DeterministicSocketData data(reads, arraysize(reads), | 2504 DeterministicSocketData data( |
2548 writes, arraysize(writes)); | 2505 reads, arraysize(reads), writes, arraysize(writes)); |
2549 data.set_connect_data(connect_data); | 2506 data.set_connect_data(connect_data); |
2550 session_deps_.host_resolver->set_synchronous_mode(true); | 2507 session_deps_.host_resolver->set_synchronous_mode(true); |
2551 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2508 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
2552 | 2509 |
2553 CreateDeterministicNetworkSession(); | 2510 CreateDeterministicNetworkSession(); |
2554 | 2511 |
2555 base::WeakPtr<SpdySession> session = | 2512 base::WeakPtr<SpdySession> session = |
2556 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 2513 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
2557 | 2514 |
2558 GURL url1(kDefaultURL); | 2515 GURL url1(kDefaultURL); |
2559 base::WeakPtr<SpdyStream> spdy_stream1 = | 2516 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
2560 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 2517 SPDY_REQUEST_RESPONSE_STREAM, session, url1, MEDIUM, BoundNetLog()); |
2561 session, url1, MEDIUM, BoundNetLog()); | |
2562 ASSERT_TRUE(spdy_stream1.get() != NULL); | 2518 ASSERT_TRUE(spdy_stream1.get() != NULL); |
2563 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 2519 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
2564 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 2520 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
2565 spdy_stream1->SetDelegate(&delegate1); | 2521 spdy_stream1->SetDelegate(&delegate1); |
2566 | 2522 |
2567 scoped_ptr<SpdyHeaderBlock> headers1( | 2523 scoped_ptr<SpdyHeaderBlock> headers1( |
2568 spdy_util_.ConstructGetHeaderBlock(url1.spec())); | 2524 spdy_util_.ConstructGetHeaderBlock(url1.spec())); |
2569 spdy_stream1->SendRequestHeaders(headers1.Pass(), NO_MORE_DATA_TO_SEND); | 2525 spdy_stream1->SendRequestHeaders(headers1.Pass(), NO_MORE_DATA_TO_SEND); |
2570 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 2526 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
2571 | 2527 |
(...skipping 22 matching lines...) Expand all Loading... |
2594 | 2550 |
2595 // Send a GoAway frame when SpdySession is in DoReadLoop. Make sure | 2551 // Send a GoAway frame when SpdySession is in DoReadLoop. Make sure |
2596 // nothing blows up. | 2552 // nothing blows up. |
2597 TEST_P(SpdySessionTest, GoAwayWhileInDoReadLoop) { | 2553 TEST_P(SpdySessionTest, GoAwayWhileInDoReadLoop) { |
2598 MockConnect connect_data(SYNCHRONOUS, OK); | 2554 MockConnect connect_data(SYNCHRONOUS, OK); |
2599 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); | 2555 BufferedSpdyFramer framer(spdy_util_.spdy_version(), false); |
2600 | 2556 |
2601 scoped_ptr<SpdyFrame> req1( | 2557 scoped_ptr<SpdyFrame> req1( |
2602 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 2558 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
2603 MockWrite writes[] = { | 2559 MockWrite writes[] = { |
2604 CreateMockWrite(*req1, 0), | 2560 CreateMockWrite(*req1, 0), |
2605 }; | 2561 }; |
2606 | 2562 |
2607 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 2563 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
2608 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); | 2564 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); |
2609 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway()); | 2565 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway()); |
2610 | 2566 |
2611 MockRead reads[] = { | 2567 MockRead reads[] = { |
2612 CreateMockRead(*resp1, 1), | 2568 CreateMockRead(*resp1, 1), CreateMockRead(*body1, 2), |
2613 CreateMockRead(*body1, 2), | 2569 CreateMockRead(*goaway, 3), |
2614 CreateMockRead(*goaway, 3), | |
2615 }; | 2570 }; |
2616 | 2571 |
2617 // Create SpdySession and SpdyStream and send the request. | 2572 // Create SpdySession and SpdyStream and send the request. |
2618 DeterministicSocketData data(reads, arraysize(reads), | 2573 DeterministicSocketData data( |
2619 writes, arraysize(writes)); | 2574 reads, arraysize(reads), writes, arraysize(writes)); |
2620 data.set_connect_data(connect_data); | 2575 data.set_connect_data(connect_data); |
2621 session_deps_.host_resolver->set_synchronous_mode(true); | 2576 session_deps_.host_resolver->set_synchronous_mode(true); |
2622 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2577 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
2623 | 2578 |
2624 CreateDeterministicNetworkSession(); | 2579 CreateDeterministicNetworkSession(); |
2625 | 2580 |
2626 base::WeakPtr<SpdySession> session = | 2581 base::WeakPtr<SpdySession> session = |
2627 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 2582 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
2628 | 2583 |
2629 GURL url1(kDefaultURL); | 2584 GURL url1(kDefaultURL); |
2630 base::WeakPtr<SpdyStream> spdy_stream1 = | 2585 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
2631 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 2586 SPDY_REQUEST_RESPONSE_STREAM, session, url1, MEDIUM, BoundNetLog()); |
2632 session, url1, MEDIUM, BoundNetLog()); | |
2633 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 2587 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
2634 spdy_stream1->SetDelegate(&delegate1); | 2588 spdy_stream1->SetDelegate(&delegate1); |
2635 ASSERT_TRUE(spdy_stream1.get() != NULL); | 2589 ASSERT_TRUE(spdy_stream1.get() != NULL); |
2636 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 2590 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
2637 | 2591 |
2638 scoped_ptr<SpdyHeaderBlock> headers1( | 2592 scoped_ptr<SpdyHeaderBlock> headers1( |
2639 spdy_util_.ConstructGetHeaderBlock(url1.spec())); | 2593 spdy_util_.ConstructGetHeaderBlock(url1.spec())); |
2640 spdy_stream1->SendRequestHeaders(headers1.Pass(), NO_MORE_DATA_TO_SEND); | 2594 spdy_stream1->SendRequestHeaders(headers1.Pass(), NO_MORE_DATA_TO_SEND); |
2641 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 2595 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
2642 | 2596 |
(...skipping 12 matching lines...) Expand all Loading... |
2655 | 2609 |
2656 // Within this framework, a SpdySession should be initialized with | 2610 // Within this framework, a SpdySession should be initialized with |
2657 // flow control disabled for protocol version 2, with flow control | 2611 // flow control disabled for protocol version 2, with flow control |
2658 // enabled only for streams for protocol version 3, and with flow | 2612 // enabled only for streams for protocol version 3, and with flow |
2659 // control enabled for streams and sessions for higher versions. | 2613 // control enabled for streams and sessions for higher versions. |
2660 TEST_P(SpdySessionTest, ProtocolNegotiation) { | 2614 TEST_P(SpdySessionTest, ProtocolNegotiation) { |
2661 session_deps_.host_resolver->set_synchronous_mode(true); | 2615 session_deps_.host_resolver->set_synchronous_mode(true); |
2662 | 2616 |
2663 MockConnect connect_data(SYNCHRONOUS, OK); | 2617 MockConnect connect_data(SYNCHRONOUS, OK); |
2664 MockRead reads[] = { | 2618 MockRead reads[] = { |
2665 MockRead(SYNCHRONOUS, 0, 0) // EOF | 2619 MockRead(SYNCHRONOUS, 0, 0) // EOF |
2666 }; | 2620 }; |
2667 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 2621 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
2668 data.set_connect_data(connect_data); | 2622 data.set_connect_data(connect_data); |
2669 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2623 session_deps_.socket_factory->AddSocketDataProvider(&data); |
2670 | 2624 |
2671 CreateNetworkSession(); | 2625 CreateNetworkSession(); |
2672 base::WeakPtr<SpdySession> session = | 2626 base::WeakPtr<SpdySession> session = |
2673 CreateFakeSpdySession(spdy_session_pool_, key_); | 2627 CreateFakeSpdySession(spdy_session_pool_, key_); |
2674 | 2628 |
2675 EXPECT_EQ(spdy_util_.spdy_version(), | 2629 EXPECT_EQ(spdy_util_.spdy_version(), |
(...skipping 20 matching lines...) Expand all Loading... |
2696 // Tests the case of a non-SPDY request closing an idle SPDY session when no | 2650 // Tests the case of a non-SPDY request closing an idle SPDY session when no |
2697 // pointers to the idle session are currently held. | 2651 // pointers to the idle session are currently held. |
2698 TEST_P(SpdySessionTest, CloseOneIdleConnection) { | 2652 TEST_P(SpdySessionTest, CloseOneIdleConnection) { |
2699 ClientSocketPoolManager::set_max_sockets_per_group( | 2653 ClientSocketPoolManager::set_max_sockets_per_group( |
2700 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 2654 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
2701 ClientSocketPoolManager::set_max_sockets_per_pool( | 2655 ClientSocketPoolManager::set_max_sockets_per_pool( |
2702 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 2656 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
2703 | 2657 |
2704 MockConnect connect_data(SYNCHRONOUS, OK); | 2658 MockConnect connect_data(SYNCHRONOUS, OK); |
2705 MockRead reads[] = { | 2659 MockRead reads[] = { |
2706 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 2660 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
2707 }; | 2661 }; |
2708 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 2662 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
2709 data.set_connect_data(connect_data); | 2663 data.set_connect_data(connect_data); |
2710 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2664 session_deps_.socket_factory->AddSocketDataProvider(&data); |
2711 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2665 session_deps_.socket_factory->AddSocketDataProvider(&data); |
2712 | 2666 |
2713 CreateNetworkSession(); | 2667 CreateNetworkSession(); |
2714 | 2668 |
2715 TransportClientSocketPool* pool = | 2669 TransportClientSocketPool* pool = http_session_->GetTransportSocketPool( |
2716 http_session_->GetTransportSocketPool( | 2670 HttpNetworkSession::NORMAL_SOCKET_POOL); |
2717 HttpNetworkSession::NORMAL_SOCKET_POOL); | |
2718 | 2671 |
2719 // Create an idle SPDY session. | 2672 // Create an idle SPDY session. |
2720 SpdySessionKey key1(HostPortPair("1.com", 80), ProxyServer::Direct(), | 2673 SpdySessionKey key1( |
2721 PRIVACY_MODE_DISABLED); | 2674 HostPortPair("1.com", 80), ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
2722 base::WeakPtr<SpdySession> session1 = | 2675 base::WeakPtr<SpdySession> session1 = |
2723 CreateInsecureSpdySession(http_session_, key1, BoundNetLog()); | 2676 CreateInsecureSpdySession(http_session_, key1, BoundNetLog()); |
2724 EXPECT_FALSE(pool->IsStalled()); | 2677 EXPECT_FALSE(pool->IsStalled()); |
2725 | 2678 |
2726 // Trying to create a new connection should cause the pool to be stalled, and | 2679 // Trying to create a new connection should cause the pool to be stalled, and |
2727 // post a task asynchronously to try and close the session. | 2680 // post a task asynchronously to try and close the session. |
2728 TestCompletionCallback callback2; | 2681 TestCompletionCallback callback2; |
2729 HostPortPair host_port2("2.com", 80); | 2682 HostPortPair host_port2("2.com", 80); |
2730 scoped_refptr<TransportSocketParams> params2( | 2683 scoped_refptr<TransportSocketParams> params2(new TransportSocketParams( |
2731 new TransportSocketParams(host_port2, false, false, | 2684 host_port2, false, false, OnHostResolutionCallback())); |
2732 OnHostResolutionCallback())); | |
2733 scoped_ptr<ClientSocketHandle> connection2(new ClientSocketHandle); | 2685 scoped_ptr<ClientSocketHandle> connection2(new ClientSocketHandle); |
2734 EXPECT_EQ(ERR_IO_PENDING, | 2686 EXPECT_EQ(ERR_IO_PENDING, |
2735 connection2->Init(host_port2.ToString(), params2, DEFAULT_PRIORITY, | 2687 connection2->Init(host_port2.ToString(), |
2736 callback2.callback(), pool, BoundNetLog())); | 2688 params2, |
| 2689 DEFAULT_PRIORITY, |
| 2690 callback2.callback(), |
| 2691 pool, |
| 2692 BoundNetLog())); |
2737 EXPECT_TRUE(pool->IsStalled()); | 2693 EXPECT_TRUE(pool->IsStalled()); |
2738 | 2694 |
2739 // The socket pool should close the connection asynchronously and establish a | 2695 // The socket pool should close the connection asynchronously and establish a |
2740 // new connection. | 2696 // new connection. |
2741 EXPECT_EQ(OK, callback2.WaitForResult()); | 2697 EXPECT_EQ(OK, callback2.WaitForResult()); |
2742 EXPECT_FALSE(pool->IsStalled()); | 2698 EXPECT_FALSE(pool->IsStalled()); |
2743 EXPECT_TRUE(session1 == NULL); | 2699 EXPECT_TRUE(session1 == NULL); |
2744 } | 2700 } |
2745 | 2701 |
2746 // Tests the case of a non-SPDY request closing an idle SPDY session when no | 2702 // Tests the case of a non-SPDY request closing an idle SPDY session when no |
2747 // pointers to the idle session are currently held, in the case the SPDY session | 2703 // pointers to the idle session are currently held, in the case the SPDY session |
2748 // has an alias. | 2704 // has an alias. |
2749 TEST_P(SpdySessionTest, CloseOneIdleConnectionWithAlias) { | 2705 TEST_P(SpdySessionTest, CloseOneIdleConnectionWithAlias) { |
2750 ClientSocketPoolManager::set_max_sockets_per_group( | 2706 ClientSocketPoolManager::set_max_sockets_per_group( |
2751 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 2707 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
2752 ClientSocketPoolManager::set_max_sockets_per_pool( | 2708 ClientSocketPoolManager::set_max_sockets_per_pool( |
2753 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 2709 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
2754 | 2710 |
2755 MockConnect connect_data(SYNCHRONOUS, OK); | 2711 MockConnect connect_data(SYNCHRONOUS, OK); |
2756 MockRead reads[] = { | 2712 MockRead reads[] = { |
2757 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 2713 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
2758 }; | 2714 }; |
2759 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 2715 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
2760 data.set_connect_data(connect_data); | 2716 data.set_connect_data(connect_data); |
2761 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2717 session_deps_.socket_factory->AddSocketDataProvider(&data); |
2762 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2718 session_deps_.socket_factory->AddSocketDataProvider(&data); |
2763 | 2719 |
2764 session_deps_.host_resolver->set_synchronous_mode(true); | 2720 session_deps_.host_resolver->set_synchronous_mode(true); |
2765 session_deps_.host_resolver->rules()->AddIPLiteralRule( | 2721 session_deps_.host_resolver->rules()->AddIPLiteralRule( |
2766 "1.com", "192.168.0.2", std::string()); | 2722 "1.com", "192.168.0.2", std::string()); |
2767 session_deps_.host_resolver->rules()->AddIPLiteralRule( | 2723 session_deps_.host_resolver->rules()->AddIPLiteralRule( |
2768 "2.com", "192.168.0.2", std::string()); | 2724 "2.com", "192.168.0.2", std::string()); |
2769 // Not strictly needed. | 2725 // Not strictly needed. |
2770 session_deps_.host_resolver->rules()->AddIPLiteralRule( | 2726 session_deps_.host_resolver->rules()->AddIPLiteralRule( |
2771 "3.com", "192.168.0.3", std::string()); | 2727 "3.com", "192.168.0.3", std::string()); |
2772 | 2728 |
2773 CreateNetworkSession(); | 2729 CreateNetworkSession(); |
2774 | 2730 |
2775 TransportClientSocketPool* pool = | 2731 TransportClientSocketPool* pool = http_session_->GetTransportSocketPool( |
2776 http_session_->GetTransportSocketPool( | 2732 HttpNetworkSession::NORMAL_SOCKET_POOL); |
2777 HttpNetworkSession::NORMAL_SOCKET_POOL); | |
2778 | 2733 |
2779 // Create an idle SPDY session. | 2734 // Create an idle SPDY session. |
2780 SpdySessionKey key1(HostPortPair("1.com", 80), ProxyServer::Direct(), | 2735 SpdySessionKey key1( |
2781 PRIVACY_MODE_DISABLED); | 2736 HostPortPair("1.com", 80), ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
2782 base::WeakPtr<SpdySession> session1 = | 2737 base::WeakPtr<SpdySession> session1 = |
2783 CreateInsecureSpdySession(http_session_, key1, BoundNetLog()); | 2738 CreateInsecureSpdySession(http_session_, key1, BoundNetLog()); |
2784 EXPECT_FALSE(pool->IsStalled()); | 2739 EXPECT_FALSE(pool->IsStalled()); |
2785 | 2740 |
2786 // Set up an alias for the idle SPDY session, increasing its ref count to 2. | 2741 // Set up an alias for the idle SPDY session, increasing its ref count to 2. |
2787 SpdySessionKey key2(HostPortPair("2.com", 80), ProxyServer::Direct(), | 2742 SpdySessionKey key2( |
2788 PRIVACY_MODE_DISABLED); | 2743 HostPortPair("2.com", 80), ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
2789 HostResolver::RequestInfo info(key2.host_port_pair()); | 2744 HostResolver::RequestInfo info(key2.host_port_pair()); |
2790 AddressList addresses; | 2745 AddressList addresses; |
2791 // Pre-populate the DNS cache, since a synchronous resolution is required in | 2746 // Pre-populate the DNS cache, since a synchronous resolution is required in |
2792 // order to create the alias. | 2747 // order to create the alias. |
2793 session_deps_.host_resolver->Resolve(info, | 2748 session_deps_.host_resolver->Resolve(info, |
2794 DEFAULT_PRIORITY, | 2749 DEFAULT_PRIORITY, |
2795 &addresses, | 2750 &addresses, |
2796 CompletionCallback(), | 2751 CompletionCallback(), |
2797 NULL, | 2752 NULL, |
2798 BoundNetLog()); | 2753 BoundNetLog()); |
2799 // Get a session for |key2|, which should return the session created earlier. | 2754 // Get a session for |key2|, which should return the session created earlier. |
2800 base::WeakPtr<SpdySession> session2 = | 2755 base::WeakPtr<SpdySession> session2 = |
2801 spdy_session_pool_->FindAvailableSession(key2, BoundNetLog()); | 2756 spdy_session_pool_->FindAvailableSession(key2, BoundNetLog()); |
2802 ASSERT_EQ(session1.get(), session2.get()); | 2757 ASSERT_EQ(session1.get(), session2.get()); |
2803 EXPECT_FALSE(pool->IsStalled()); | 2758 EXPECT_FALSE(pool->IsStalled()); |
2804 | 2759 |
2805 // Trying to create a new connection should cause the pool to be stalled, and | 2760 // Trying to create a new connection should cause the pool to be stalled, and |
2806 // post a task asynchronously to try and close the session. | 2761 // post a task asynchronously to try and close the session. |
2807 TestCompletionCallback callback3; | 2762 TestCompletionCallback callback3; |
2808 HostPortPair host_port3("3.com", 80); | 2763 HostPortPair host_port3("3.com", 80); |
2809 scoped_refptr<TransportSocketParams> params3( | 2764 scoped_refptr<TransportSocketParams> params3(new TransportSocketParams( |
2810 new TransportSocketParams(host_port3, false, false, | 2765 host_port3, false, false, OnHostResolutionCallback())); |
2811 OnHostResolutionCallback())); | |
2812 scoped_ptr<ClientSocketHandle> connection3(new ClientSocketHandle); | 2766 scoped_ptr<ClientSocketHandle> connection3(new ClientSocketHandle); |
2813 EXPECT_EQ(ERR_IO_PENDING, | 2767 EXPECT_EQ(ERR_IO_PENDING, |
2814 connection3->Init(host_port3.ToString(), params3, DEFAULT_PRIORITY, | 2768 connection3->Init(host_port3.ToString(), |
2815 callback3.callback(), pool, BoundNetLog())); | 2769 params3, |
| 2770 DEFAULT_PRIORITY, |
| 2771 callback3.callback(), |
| 2772 pool, |
| 2773 BoundNetLog())); |
2816 EXPECT_TRUE(pool->IsStalled()); | 2774 EXPECT_TRUE(pool->IsStalled()); |
2817 | 2775 |
2818 // The socket pool should close the connection asynchronously and establish a | 2776 // The socket pool should close the connection asynchronously and establish a |
2819 // new connection. | 2777 // new connection. |
2820 EXPECT_EQ(OK, callback3.WaitForResult()); | 2778 EXPECT_EQ(OK, callback3.WaitForResult()); |
2821 EXPECT_FALSE(pool->IsStalled()); | 2779 EXPECT_FALSE(pool->IsStalled()); |
2822 EXPECT_TRUE(session1 == NULL); | 2780 EXPECT_TRUE(session1 == NULL); |
2823 EXPECT_TRUE(session2 == NULL); | 2781 EXPECT_TRUE(session2 == NULL); |
2824 } | 2782 } |
2825 | 2783 |
2826 // Tests that when a SPDY session becomes idle, it closes itself if there is | 2784 // Tests that when a SPDY session becomes idle, it closes itself if there is |
2827 // a lower layer pool stalled on the per-pool socket limit. | 2785 // a lower layer pool stalled on the per-pool socket limit. |
2828 TEST_P(SpdySessionTest, CloseSessionOnIdleWhenPoolStalled) { | 2786 TEST_P(SpdySessionTest, CloseSessionOnIdleWhenPoolStalled) { |
2829 ClientSocketPoolManager::set_max_sockets_per_group( | 2787 ClientSocketPoolManager::set_max_sockets_per_group( |
2830 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 2788 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
2831 ClientSocketPoolManager::set_max_sockets_per_pool( | 2789 ClientSocketPoolManager::set_max_sockets_per_pool( |
2832 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 2790 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
2833 | 2791 |
2834 MockConnect connect_data(SYNCHRONOUS, OK); | 2792 MockConnect connect_data(SYNCHRONOUS, OK); |
2835 MockRead reads[] = { | 2793 MockRead reads[] = { |
2836 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 2794 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
2837 }; | 2795 }; |
2838 scoped_ptr<SpdyFrame> req1( | 2796 scoped_ptr<SpdyFrame> req1( |
2839 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 2797 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
2840 scoped_ptr<SpdyFrame> cancel1( | 2798 scoped_ptr<SpdyFrame> cancel1( |
2841 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 2799 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
2842 MockWrite writes[] = { | 2800 MockWrite writes[] = { |
2843 CreateMockWrite(*req1, 1), | 2801 CreateMockWrite(*req1, 1), CreateMockWrite(*cancel1, 1), |
2844 CreateMockWrite(*cancel1, 1), | |
2845 }; | 2802 }; |
2846 StaticSocketDataProvider data(reads, arraysize(reads), | 2803 StaticSocketDataProvider data( |
2847 writes, arraysize(writes)); | 2804 reads, arraysize(reads), writes, arraysize(writes)); |
2848 data.set_connect_data(connect_data); | 2805 data.set_connect_data(connect_data); |
2849 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2806 session_deps_.socket_factory->AddSocketDataProvider(&data); |
2850 | 2807 |
2851 MockRead http_reads[] = { | 2808 MockRead http_reads[] = { |
2852 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 2809 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
2853 }; | 2810 }; |
2854 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), | 2811 StaticSocketDataProvider http_data( |
2855 NULL, 0); | 2812 http_reads, arraysize(http_reads), NULL, 0); |
2856 http_data.set_connect_data(connect_data); | 2813 http_data.set_connect_data(connect_data); |
2857 session_deps_.socket_factory->AddSocketDataProvider(&http_data); | 2814 session_deps_.socket_factory->AddSocketDataProvider(&http_data); |
2858 | 2815 |
2859 | |
2860 CreateNetworkSession(); | 2816 CreateNetworkSession(); |
2861 | 2817 |
2862 TransportClientSocketPool* pool = | 2818 TransportClientSocketPool* pool = http_session_->GetTransportSocketPool( |
2863 http_session_->GetTransportSocketPool( | 2819 HttpNetworkSession::NORMAL_SOCKET_POOL); |
2864 HttpNetworkSession::NORMAL_SOCKET_POOL); | |
2865 | 2820 |
2866 // Create a SPDY session. | 2821 // Create a SPDY session. |
2867 GURL url1(kDefaultURL); | 2822 GURL url1(kDefaultURL); |
2868 SpdySessionKey key1(HostPortPair(url1.host(), 80), | 2823 SpdySessionKey key1(HostPortPair(url1.host(), 80), |
2869 ProxyServer::Direct(), PRIVACY_MODE_DISABLED); | 2824 ProxyServer::Direct(), |
| 2825 PRIVACY_MODE_DISABLED); |
2870 base::WeakPtr<SpdySession> session1 = | 2826 base::WeakPtr<SpdySession> session1 = |
2871 CreateInsecureSpdySession(http_session_, key1, BoundNetLog()); | 2827 CreateInsecureSpdySession(http_session_, key1, BoundNetLog()); |
2872 EXPECT_FALSE(pool->IsStalled()); | 2828 EXPECT_FALSE(pool->IsStalled()); |
2873 | 2829 |
2874 // Create a stream using the session, and send a request. | 2830 // Create a stream using the session, and send a request. |
2875 | 2831 |
2876 TestCompletionCallback callback1; | 2832 TestCompletionCallback callback1; |
2877 base::WeakPtr<SpdyStream> spdy_stream1 = | 2833 base::WeakPtr<SpdyStream> spdy_stream1 = |
2878 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 2834 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, |
2879 session1, url1, DEFAULT_PRIORITY, | 2835 session1, |
| 2836 url1, |
| 2837 DEFAULT_PRIORITY, |
2880 BoundNetLog()); | 2838 BoundNetLog()); |
2881 ASSERT_TRUE(spdy_stream1.get()); | 2839 ASSERT_TRUE(spdy_stream1.get()); |
2882 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 2840 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
2883 spdy_stream1->SetDelegate(&delegate1); | 2841 spdy_stream1->SetDelegate(&delegate1); |
2884 | 2842 |
2885 scoped_ptr<SpdyHeaderBlock> headers1( | 2843 scoped_ptr<SpdyHeaderBlock> headers1( |
2886 spdy_util_.ConstructGetHeaderBlock(url1.spec())); | 2844 spdy_util_.ConstructGetHeaderBlock(url1.spec())); |
2887 EXPECT_EQ(ERR_IO_PENDING, | 2845 EXPECT_EQ( |
2888 spdy_stream1->SendRequestHeaders( | 2846 ERR_IO_PENDING, |
2889 headers1.Pass(), NO_MORE_DATA_TO_SEND)); | 2847 spdy_stream1->SendRequestHeaders(headers1.Pass(), NO_MORE_DATA_TO_SEND)); |
2890 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); | 2848 EXPECT_TRUE(spdy_stream1->HasUrlFromHeaders()); |
2891 | 2849 |
2892 base::MessageLoop::current()->RunUntilIdle(); | 2850 base::MessageLoop::current()->RunUntilIdle(); |
2893 | 2851 |
2894 // Trying to create a new connection should cause the pool to be stalled, and | 2852 // Trying to create a new connection should cause the pool to be stalled, and |
2895 // post a task asynchronously to try and close the session. | 2853 // post a task asynchronously to try and close the session. |
2896 TestCompletionCallback callback2; | 2854 TestCompletionCallback callback2; |
2897 HostPortPair host_port2("2.com", 80); | 2855 HostPortPair host_port2("2.com", 80); |
2898 scoped_refptr<TransportSocketParams> params2( | 2856 scoped_refptr<TransportSocketParams> params2(new TransportSocketParams( |
2899 new TransportSocketParams(host_port2, false, false, | 2857 host_port2, false, false, OnHostResolutionCallback())); |
2900 OnHostResolutionCallback())); | |
2901 scoped_ptr<ClientSocketHandle> connection2(new ClientSocketHandle); | 2858 scoped_ptr<ClientSocketHandle> connection2(new ClientSocketHandle); |
2902 EXPECT_EQ(ERR_IO_PENDING, | 2859 EXPECT_EQ(ERR_IO_PENDING, |
2903 connection2->Init(host_port2.ToString(), params2, DEFAULT_PRIORITY, | 2860 connection2->Init(host_port2.ToString(), |
2904 callback2.callback(), pool, BoundNetLog())); | 2861 params2, |
| 2862 DEFAULT_PRIORITY, |
| 2863 callback2.callback(), |
| 2864 pool, |
| 2865 BoundNetLog())); |
2905 EXPECT_TRUE(pool->IsStalled()); | 2866 EXPECT_TRUE(pool->IsStalled()); |
2906 | 2867 |
2907 // Running the message loop should cause the socket pool to ask the SPDY | 2868 // Running the message loop should cause the socket pool to ask the SPDY |
2908 // session to close an idle socket, but since the socket is in use, nothing | 2869 // session to close an idle socket, but since the socket is in use, nothing |
2909 // happens. | 2870 // happens. |
2910 base::RunLoop().RunUntilIdle(); | 2871 base::RunLoop().RunUntilIdle(); |
2911 EXPECT_TRUE(pool->IsStalled()); | 2872 EXPECT_TRUE(pool->IsStalled()); |
2912 EXPECT_FALSE(callback2.have_result()); | 2873 EXPECT_FALSE(callback2.have_result()); |
2913 | 2874 |
2914 // Cancelling the request should result in the session's socket being | 2875 // Cancelling the request should result in the session's socket being |
2915 // closed, since the pool is stalled. | 2876 // closed, since the pool is stalled. |
2916 ASSERT_TRUE(spdy_stream1.get()); | 2877 ASSERT_TRUE(spdy_stream1.get()); |
2917 spdy_stream1->Cancel(); | 2878 spdy_stream1->Cancel(); |
2918 base::RunLoop().RunUntilIdle(); | 2879 base::RunLoop().RunUntilIdle(); |
2919 ASSERT_FALSE(pool->IsStalled()); | 2880 ASSERT_FALSE(pool->IsStalled()); |
2920 EXPECT_EQ(OK, callback2.WaitForResult()); | 2881 EXPECT_EQ(OK, callback2.WaitForResult()); |
2921 } | 2882 } |
2922 | 2883 |
2923 // Verify that SpdySessionKey and therefore SpdySession is different when | 2884 // Verify that SpdySessionKey and therefore SpdySession is different when |
2924 // privacy mode is enabled or disabled. | 2885 // privacy mode is enabled or disabled. |
2925 TEST_P(SpdySessionTest, SpdySessionKeyPrivacyMode) { | 2886 TEST_P(SpdySessionTest, SpdySessionKeyPrivacyMode) { |
2926 CreateDeterministicNetworkSession(); | 2887 CreateDeterministicNetworkSession(); |
2927 | 2888 |
2928 HostPortPair host_port_pair("www.google.com", 443); | 2889 HostPortPair host_port_pair("www.google.com", 443); |
2929 SpdySessionKey key_privacy_enabled(host_port_pair, ProxyServer::Direct(), | 2890 SpdySessionKey key_privacy_enabled( |
2930 PRIVACY_MODE_ENABLED); | 2891 host_port_pair, ProxyServer::Direct(), PRIVACY_MODE_ENABLED); |
2931 SpdySessionKey key_privacy_disabled(host_port_pair, ProxyServer::Direct(), | 2892 SpdySessionKey key_privacy_disabled( |
2932 PRIVACY_MODE_DISABLED); | 2893 host_port_pair, ProxyServer::Direct(), PRIVACY_MODE_DISABLED); |
2933 | 2894 |
2934 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_privacy_enabled)); | 2895 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_privacy_enabled)); |
2935 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_privacy_disabled)); | 2896 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_privacy_disabled)); |
2936 | 2897 |
2937 // Add SpdySession with PrivacyMode Enabled to the pool. | 2898 // Add SpdySession with PrivacyMode Enabled to the pool. |
2938 base::WeakPtr<SpdySession> session_privacy_enabled = | 2899 base::WeakPtr<SpdySession> session_privacy_enabled = |
2939 CreateFakeSpdySession(spdy_session_pool_, key_privacy_enabled); | 2900 CreateFakeSpdySession(spdy_session_pool_, key_privacy_enabled); |
2940 | 2901 |
2941 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_privacy_enabled)); | 2902 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_privacy_enabled)); |
2942 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_privacy_disabled)); | 2903 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_privacy_disabled)); |
(...skipping 12 matching lines...) Expand all Loading... |
2955 session_privacy_disabled->CloseSessionOnError(ERR_ABORTED, std::string()); | 2916 session_privacy_disabled->CloseSessionOnError(ERR_ABORTED, std::string()); |
2956 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_privacy_enabled)); | 2917 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_privacy_enabled)); |
2957 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_privacy_disabled)); | 2918 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_privacy_disabled)); |
2958 } | 2919 } |
2959 | 2920 |
2960 // Delegate that creates another stream when its stream is closed. | 2921 // Delegate that creates another stream when its stream is closed. |
2961 class StreamCreatingDelegate : public test::StreamDelegateDoNothing { | 2922 class StreamCreatingDelegate : public test::StreamDelegateDoNothing { |
2962 public: | 2923 public: |
2963 StreamCreatingDelegate(const base::WeakPtr<SpdyStream>& stream, | 2924 StreamCreatingDelegate(const base::WeakPtr<SpdyStream>& stream, |
2964 const base::WeakPtr<SpdySession>& session) | 2925 const base::WeakPtr<SpdySession>& session) |
2965 : StreamDelegateDoNothing(stream), | 2926 : StreamDelegateDoNothing(stream), session_(session) {} |
2966 session_(session) {} | |
2967 | 2927 |
2968 virtual ~StreamCreatingDelegate() {} | 2928 virtual ~StreamCreatingDelegate() {} |
2969 | 2929 |
2970 virtual void OnClose(int status) OVERRIDE { | 2930 virtual void OnClose(int status) OVERRIDE { |
2971 GURL url(kDefaultURL); | 2931 GURL url(kDefaultURL); |
2972 ignore_result( | 2932 ignore_result(CreateStreamSynchronously( |
2973 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 2933 SPDY_REQUEST_RESPONSE_STREAM, session_, url, MEDIUM, BoundNetLog())); |
2974 session_, url, MEDIUM, BoundNetLog())); | |
2975 } | 2934 } |
2976 | 2935 |
2977 private: | 2936 private: |
2978 const base::WeakPtr<SpdySession> session_; | 2937 const base::WeakPtr<SpdySession> session_; |
2979 }; | 2938 }; |
2980 | 2939 |
2981 // Create another stream in response to a stream being reset. Nothing | 2940 // Create another stream in response to a stream being reset. Nothing |
2982 // should blow up. This is a regression test for | 2941 // should blow up. This is a regression test for |
2983 // http://crbug.com/263690 . | 2942 // http://crbug.com/263690 . |
2984 TEST_P(SpdySessionTest, CreateStreamOnStreamReset) { | 2943 TEST_P(SpdySessionTest, CreateStreamOnStreamReset) { |
2985 session_deps_.host_resolver->set_synchronous_mode(true); | 2944 session_deps_.host_resolver->set_synchronous_mode(true); |
2986 | 2945 |
2987 MockConnect connect_data(SYNCHRONOUS, OK); | 2946 MockConnect connect_data(SYNCHRONOUS, OK); |
2988 | 2947 |
2989 scoped_ptr<SpdyFrame> req( | 2948 scoped_ptr<SpdyFrame> req( |
2990 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); | 2949 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, MEDIUM, true)); |
2991 MockWrite writes[] = { | 2950 MockWrite writes[] = { |
2992 CreateMockWrite(*req, 0), | 2951 CreateMockWrite(*req, 0), |
2993 }; | 2952 }; |
2994 | 2953 |
2995 scoped_ptr<SpdyFrame> rst( | 2954 scoped_ptr<SpdyFrame> rst( |
2996 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); | 2955 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); |
2997 MockRead reads[] = { | 2956 MockRead reads[] = { |
2998 CreateMockRead(*rst, 1), | 2957 CreateMockRead(*rst, 1), MockRead(ASYNC, 0, 2) // EOF |
2999 MockRead(ASYNC, 0, 2) // EOF | |
3000 }; | 2958 }; |
3001 DeterministicSocketData data(reads, arraysize(reads), | 2959 DeterministicSocketData data( |
3002 writes, arraysize(writes)); | 2960 reads, arraysize(reads), writes, arraysize(writes)); |
3003 data.set_connect_data(connect_data); | 2961 data.set_connect_data(connect_data); |
3004 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2962 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
3005 | 2963 |
3006 CreateDeterministicNetworkSession(); | 2964 CreateDeterministicNetworkSession(); |
3007 | 2965 |
3008 base::WeakPtr<SpdySession> session = | 2966 base::WeakPtr<SpdySession> session = |
3009 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 2967 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
3010 | 2968 |
3011 GURL url(kDefaultURL); | 2969 GURL url(kDefaultURL); |
3012 base::WeakPtr<SpdyStream> spdy_stream = | 2970 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
3013 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 2971 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog()); |
3014 session, url, MEDIUM, BoundNetLog()); | |
3015 ASSERT_TRUE(spdy_stream.get() != NULL); | 2972 ASSERT_TRUE(spdy_stream.get() != NULL); |
3016 EXPECT_EQ(0u, spdy_stream->stream_id()); | 2973 EXPECT_EQ(0u, spdy_stream->stream_id()); |
3017 | 2974 |
3018 StreamCreatingDelegate delegate(spdy_stream, session); | 2975 StreamCreatingDelegate delegate(spdy_stream, session); |
3019 spdy_stream->SetDelegate(&delegate); | 2976 spdy_stream->SetDelegate(&delegate); |
3020 | 2977 |
3021 scoped_ptr<SpdyHeaderBlock> headers( | 2978 scoped_ptr<SpdyHeaderBlock> headers( |
3022 spdy_util_.ConstructGetHeaderBlock(url.spec())); | 2979 spdy_util_.ConstructGetHeaderBlock(url.spec())); |
3023 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); | 2980 spdy_stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND); |
3024 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); | 2981 EXPECT_TRUE(spdy_stream->HasUrlFromHeaders()); |
(...skipping 26 matching lines...) Expand all Loading... |
3051 int32 window_size = 1; | 3008 int32 window_size = 1; |
3052 new_settings[SETTINGS_INITIAL_WINDOW_SIZE] = | 3009 new_settings[SETTINGS_INITIAL_WINDOW_SIZE] = |
3053 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, window_size); | 3010 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, window_size); |
3054 | 3011 |
3055 // Set up the socket so we read a SETTINGS frame that sets | 3012 // Set up the socket so we read a SETTINGS frame that sets |
3056 // INITIAL_WINDOW_SIZE. | 3013 // INITIAL_WINDOW_SIZE. |
3057 MockConnect connect_data(SYNCHRONOUS, OK); | 3014 MockConnect connect_data(SYNCHRONOUS, OK); |
3058 scoped_ptr<SpdyFrame> settings_frame( | 3015 scoped_ptr<SpdyFrame> settings_frame( |
3059 spdy_util_.ConstructSpdySettings(new_settings)); | 3016 spdy_util_.ConstructSpdySettings(new_settings)); |
3060 MockRead reads[] = { | 3017 MockRead reads[] = { |
3061 CreateMockRead(*settings_frame, 0), | 3018 CreateMockRead(*settings_frame, 0), MockRead(ASYNC, 0, 1) // EOF |
3062 MockRead(ASYNC, 0, 1) // EOF | |
3063 }; | 3019 }; |
3064 | 3020 |
3065 session_deps_.host_resolver->set_synchronous_mode(true); | 3021 session_deps_.host_resolver->set_synchronous_mode(true); |
3066 | 3022 |
3067 scoped_ptr<DeterministicSocketData> data( | 3023 scoped_ptr<DeterministicSocketData> data( |
3068 new DeterministicSocketData(reads, arraysize(reads), NULL, 0)); | 3024 new DeterministicSocketData(reads, arraysize(reads), NULL, 0)); |
3069 data->set_connect_data(connect_data); | 3025 data->set_connect_data(connect_data); |
3070 session_deps_.deterministic_socket_factory->AddSocketDataProvider(data.get()); | 3026 session_deps_.deterministic_socket_factory->AddSocketDataProvider(data.get()); |
3071 | 3027 |
3072 CreateDeterministicNetworkSession(); | 3028 CreateDeterministicNetworkSession(); |
3073 | 3029 |
3074 base::WeakPtr<SpdySession> session = | 3030 base::WeakPtr<SpdySession> session = |
3075 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3031 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
3076 base::WeakPtr<SpdyStream> spdy_stream1 = | 3032 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
3077 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 3033 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, BoundNetLog()); |
3078 session, test_url_, MEDIUM, BoundNetLog()); | |
3079 ASSERT_TRUE(spdy_stream1.get() != NULL); | 3034 ASSERT_TRUE(spdy_stream1.get() != NULL); |
3080 TestCompletionCallback callback1; | 3035 TestCompletionCallback callback1; |
3081 EXPECT_NE(spdy_stream1->send_window_size(), window_size); | 3036 EXPECT_NE(spdy_stream1->send_window_size(), window_size); |
3082 | 3037 |
3083 data->RunFor(1); // Process the SETTINGS frame, but not the EOF | 3038 data->RunFor(1); // Process the SETTINGS frame, but not the EOF |
3084 base::MessageLoop::current()->RunUntilIdle(); | 3039 base::MessageLoop::current()->RunUntilIdle(); |
3085 EXPECT_EQ(session->stream_initial_send_window_size(), window_size); | 3040 EXPECT_EQ(session->stream_initial_send_window_size(), window_size); |
3086 EXPECT_EQ(spdy_stream1->send_window_size(), window_size); | 3041 EXPECT_EQ(spdy_stream1->send_window_size(), window_size); |
3087 | 3042 |
3088 // Release the first one, this will allow the second to be created. | 3043 // Release the first one, this will allow the second to be created. |
3089 spdy_stream1->Cancel(); | 3044 spdy_stream1->Cancel(); |
3090 EXPECT_EQ(NULL, spdy_stream1.get()); | 3045 EXPECT_EQ(NULL, spdy_stream1.get()); |
3091 | 3046 |
3092 base::WeakPtr<SpdyStream> spdy_stream2 = | 3047 base::WeakPtr<SpdyStream> spdy_stream2 = CreateStreamSynchronously( |
3093 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 3048 SPDY_BIDIRECTIONAL_STREAM, session, test_url_, MEDIUM, BoundNetLog()); |
3094 session, test_url_, MEDIUM, BoundNetLog()); | |
3095 ASSERT_TRUE(spdy_stream2.get() != NULL); | 3049 ASSERT_TRUE(spdy_stream2.get() != NULL); |
3096 EXPECT_EQ(spdy_stream2->send_window_size(), window_size); | 3050 EXPECT_EQ(spdy_stream2->send_window_size(), window_size); |
3097 spdy_stream2->Cancel(); | 3051 spdy_stream2->Cancel(); |
3098 EXPECT_EQ(NULL, spdy_stream2.get()); | 3052 EXPECT_EQ(NULL, spdy_stream2.get()); |
3099 } | 3053 } |
3100 | 3054 |
3101 // The tests below are only for SPDY/3.1 and above. | 3055 // The tests below are only for SPDY/3.1 and above. |
3102 | 3056 |
3103 // SpdySession::{Increase,Decrease}RecvWindowSize should properly | 3057 // SpdySession::{Increase,Decrease}RecvWindowSize should properly |
3104 // adjust the session receive window size for SPDY 3.1 and higher. In | 3058 // adjust the session receive window size for SPDY 3.1 and higher. In |
3105 // addition, SpdySession::IncreaseRecvWindowSize should trigger | 3059 // addition, SpdySession::IncreaseRecvWindowSize should trigger |
3106 // sending a WINDOW_UPDATE frame for a large enough delta. | 3060 // sending a WINDOW_UPDATE frame for a large enough delta. |
3107 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { | 3061 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { |
3108 if (GetParam() < kProtoSPDY31) | 3062 if (GetParam() < kProtoSPDY31) |
3109 return; | 3063 return; |
3110 | 3064 |
3111 session_deps_.host_resolver->set_synchronous_mode(true); | 3065 session_deps_.host_resolver->set_synchronous_mode(true); |
3112 | 3066 |
3113 const int32 delta_window_size = 100; | 3067 const int32 delta_window_size = 100; |
3114 | 3068 |
3115 MockConnect connect_data(SYNCHRONOUS, OK); | 3069 MockConnect connect_data(SYNCHRONOUS, OK); |
3116 MockRead reads[] = { | 3070 MockRead reads[] = { |
3117 MockRead(ASYNC, 0, 1) // EOF | 3071 MockRead(ASYNC, 0, 1) // EOF |
3118 }; | 3072 }; |
3119 scoped_ptr<SpdyFrame> window_update( | 3073 scoped_ptr<SpdyFrame> window_update(spdy_util_.ConstructSpdyWindowUpdate( |
3120 spdy_util_.ConstructSpdyWindowUpdate( | 3074 kSessionFlowControlStreamId, |
3121 kSessionFlowControlStreamId, | 3075 kSpdySessionInitialWindowSize + delta_window_size)); |
3122 kSpdySessionInitialWindowSize + delta_window_size)); | |
3123 MockWrite writes[] = { | 3076 MockWrite writes[] = { |
3124 CreateMockWrite(*window_update, 0), | 3077 CreateMockWrite(*window_update, 0), |
3125 }; | 3078 }; |
3126 DeterministicSocketData data(reads, arraysize(reads), | 3079 DeterministicSocketData data( |
3127 writes, arraysize(writes)); | 3080 reads, arraysize(reads), writes, arraysize(writes)); |
3128 data.set_connect_data(connect_data); | 3081 data.set_connect_data(connect_data); |
3129 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3082 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
3130 | 3083 |
3131 CreateDeterministicNetworkSession(); | 3084 CreateDeterministicNetworkSession(); |
3132 base::WeakPtr<SpdySession> session = | 3085 base::WeakPtr<SpdySession> session = |
3133 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3086 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
3134 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 3087 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
3135 session->flow_control_state()); | 3088 session->flow_control_state()); |
3136 | 3089 |
3137 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); | 3090 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_recv_window_size_); |
3138 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3091 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
3139 | 3092 |
3140 session->IncreaseRecvWindowSize(delta_window_size); | 3093 session->IncreaseRecvWindowSize(delta_window_size); |
3141 EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size, | 3094 EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size, |
3142 session->session_recv_window_size_); | 3095 session->session_recv_window_size_); |
3143 EXPECT_EQ(delta_window_size, session->session_unacked_recv_window_bytes_); | 3096 EXPECT_EQ(delta_window_size, session->session_unacked_recv_window_bytes_); |
3144 | 3097 |
3145 // Should trigger sending a WINDOW_UPDATE frame. | 3098 // Should trigger sending a WINDOW_UPDATE frame. |
3146 session->IncreaseRecvWindowSize(kSpdySessionInitialWindowSize); | 3099 session->IncreaseRecvWindowSize(kSpdySessionInitialWindowSize); |
3147 EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size + | 3100 EXPECT_EQ(kSpdySessionInitialWindowSize + delta_window_size + |
3148 kSpdySessionInitialWindowSize, | 3101 kSpdySessionInitialWindowSize, |
3149 session->session_recv_window_size_); | 3102 session->session_recv_window_size_); |
3150 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3103 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
3151 | 3104 |
3152 data.RunFor(1); | 3105 data.RunFor(1); |
3153 | 3106 |
3154 // DecreaseRecvWindowSize() expects |in_io_loop_| to be true. | 3107 // DecreaseRecvWindowSize() expects |in_io_loop_| to be true. |
3155 session->in_io_loop_ = true; | 3108 session->in_io_loop_ = true; |
3156 session->DecreaseRecvWindowSize( | 3109 session->DecreaseRecvWindowSize(kSpdySessionInitialWindowSize + |
3157 kSpdySessionInitialWindowSize + delta_window_size + | 3110 delta_window_size + |
3158 kSpdySessionInitialWindowSize); | 3111 kSpdySessionInitialWindowSize); |
3159 session->in_io_loop_ = false; | 3112 session->in_io_loop_ = false; |
3160 EXPECT_EQ(0, session->session_recv_window_size_); | 3113 EXPECT_EQ(0, session->session_recv_window_size_); |
3161 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 3114 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
3162 } | 3115 } |
3163 | 3116 |
3164 // SpdySession::{Increase,Decrease}SendWindowSize should properly | 3117 // SpdySession::{Increase,Decrease}SendWindowSize should properly |
3165 // adjust the session send window size when the "enable_spdy_31" flag | 3118 // adjust the session send window size when the "enable_spdy_31" flag |
3166 // is set. | 3119 // is set. |
3167 TEST_P(SpdySessionTest, AdjustSendWindowSize) { | 3120 TEST_P(SpdySessionTest, AdjustSendWindowSize) { |
3168 if (GetParam() < kProtoSPDY31) | 3121 if (GetParam() < kProtoSPDY31) |
3169 return; | 3122 return; |
3170 | 3123 |
3171 session_deps_.host_resolver->set_synchronous_mode(true); | 3124 session_deps_.host_resolver->set_synchronous_mode(true); |
3172 | 3125 |
3173 MockConnect connect_data(SYNCHRONOUS, OK); | 3126 MockConnect connect_data(SYNCHRONOUS, OK); |
3174 MockRead reads[] = { | 3127 MockRead reads[] = { |
3175 MockRead(SYNCHRONOUS, 0, 0) // EOF | 3128 MockRead(SYNCHRONOUS, 0, 0) // EOF |
3176 }; | 3129 }; |
3177 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); | 3130 StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0); |
3178 data.set_connect_data(connect_data); | 3131 data.set_connect_data(connect_data); |
3179 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3132 session_deps_.socket_factory->AddSocketDataProvider(&data); |
3180 | 3133 |
3181 CreateNetworkSession(); | 3134 CreateNetworkSession(); |
3182 base::WeakPtr<SpdySession> session = | 3135 base::WeakPtr<SpdySession> session = |
3183 CreateFakeSpdySession(spdy_session_pool_, key_); | 3136 CreateFakeSpdySession(spdy_session_pool_, key_); |
3184 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 3137 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
3185 session->flow_control_state()); | 3138 session->flow_control_state()); |
(...skipping 15 matching lines...) Expand all Loading... |
3201 // bytes to increase. | 3154 // bytes to increase. |
3202 TEST_P(SpdySessionTest, SessionFlowControlInactiveStream) { | 3155 TEST_P(SpdySessionTest, SessionFlowControlInactiveStream) { |
3203 if (GetParam() < kProtoSPDY31) | 3156 if (GetParam() < kProtoSPDY31) |
3204 return; | 3157 return; |
3205 | 3158 |
3206 session_deps_.host_resolver->set_synchronous_mode(true); | 3159 session_deps_.host_resolver->set_synchronous_mode(true); |
3207 | 3160 |
3208 MockConnect connect_data(SYNCHRONOUS, OK); | 3161 MockConnect connect_data(SYNCHRONOUS, OK); |
3209 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyBodyFrame(1, false)); | 3162 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyBodyFrame(1, false)); |
3210 MockRead reads[] = { | 3163 MockRead reads[] = { |
3211 CreateMockRead(*resp, 0), | 3164 CreateMockRead(*resp, 0), MockRead(ASYNC, 0, 1) // EOF |
3212 MockRead(ASYNC, 0, 1) // EOF | |
3213 }; | 3165 }; |
3214 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); | 3166 DeterministicSocketData data(reads, arraysize(reads), NULL, 0); |
3215 data.set_connect_data(connect_data); | 3167 data.set_connect_data(connect_data); |
3216 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3168 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
3217 | 3169 |
3218 CreateDeterministicNetworkSession(); | 3170 CreateDeterministicNetworkSession(); |
3219 base::WeakPtr<SpdySession> session = | 3171 base::WeakPtr<SpdySession> session = |
3220 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3172 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
3221 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 3173 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
3222 session->flow_control_state()); | 3174 session->flow_control_state()); |
(...skipping 29 matching lines...) Expand all Loading... |
3252 if (GetParam() < kProtoSPDY31) | 3204 if (GetParam() < kProtoSPDY31) |
3253 return; | 3205 return; |
3254 | 3206 |
3255 const char kStreamUrl[] = "http://www.google.com/"; | 3207 const char kStreamUrl[] = "http://www.google.com/"; |
3256 | 3208 |
3257 const int32 msg_data_size = 100; | 3209 const int32 msg_data_size = 100; |
3258 const std::string msg_data(msg_data_size, 'a'); | 3210 const std::string msg_data(msg_data_size, 'a'); |
3259 | 3211 |
3260 MockConnect connect_data(SYNCHRONOUS, OK); | 3212 MockConnect connect_data(SYNCHRONOUS, OK); |
3261 | 3213 |
3262 scoped_ptr<SpdyFrame> req( | 3214 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( |
3263 spdy_util_.ConstructSpdyPost( | 3215 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); |
3264 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); | 3216 scoped_ptr<SpdyFrame> msg(spdy_util_.ConstructSpdyBodyFrame( |
3265 scoped_ptr<SpdyFrame> msg( | 3217 1, msg_data.data(), msg_data_size, false)); |
3266 spdy_util_.ConstructSpdyBodyFrame( | |
3267 1, msg_data.data(), msg_data_size, false)); | |
3268 MockWrite writes[] = { | 3218 MockWrite writes[] = { |
3269 CreateMockWrite(*req, 0), | 3219 CreateMockWrite(*req, 0), CreateMockWrite(*msg, 2), |
3270 CreateMockWrite(*msg, 2), | |
3271 }; | 3220 }; |
3272 | 3221 |
3273 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3222 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3274 scoped_ptr<SpdyFrame> echo( | 3223 scoped_ptr<SpdyFrame> echo(spdy_util_.ConstructSpdyBodyFrame( |
3275 spdy_util_.ConstructSpdyBodyFrame( | 3224 1, msg_data.data(), msg_data_size, false)); |
3276 1, msg_data.data(), msg_data_size, false)); | 3225 scoped_ptr<SpdyFrame> window_update(spdy_util_.ConstructSpdyWindowUpdate( |
3277 scoped_ptr<SpdyFrame> window_update( | 3226 kSessionFlowControlStreamId, msg_data_size)); |
3278 spdy_util_.ConstructSpdyWindowUpdate( | |
3279 kSessionFlowControlStreamId, msg_data_size)); | |
3280 MockRead reads[] = { | 3227 MockRead reads[] = { |
3281 CreateMockRead(*resp, 1), | 3228 CreateMockRead(*resp, 1), CreateMockRead(*echo, 3), |
3282 CreateMockRead(*echo, 3), | 3229 MockRead(ASYNC, 0, 4) // EOF |
3283 MockRead(ASYNC, 0, 4) // EOF | |
3284 }; | 3230 }; |
3285 | 3231 |
3286 // Create SpdySession and SpdyStream and send the request. | 3232 // Create SpdySession and SpdyStream and send the request. |
3287 DeterministicSocketData data(reads, arraysize(reads), | 3233 DeterministicSocketData data( |
3288 writes, arraysize(writes)); | 3234 reads, arraysize(reads), writes, arraysize(writes)); |
3289 data.set_connect_data(connect_data); | 3235 data.set_connect_data(connect_data); |
3290 session_deps_.host_resolver->set_synchronous_mode(true); | 3236 session_deps_.host_resolver->set_synchronous_mode(true); |
3291 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3237 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
3292 | 3238 |
3293 CreateDeterministicNetworkSession(); | 3239 CreateDeterministicNetworkSession(); |
3294 | 3240 |
3295 base::WeakPtr<SpdySession> session = | 3241 base::WeakPtr<SpdySession> session = |
3296 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3242 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
3297 | 3243 |
3298 GURL url(kStreamUrl); | 3244 GURL url(kStreamUrl); |
3299 base::WeakPtr<SpdyStream> stream = | 3245 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
3300 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 3246 SPDY_BIDIRECTIONAL_STREAM, session, url, MEDIUM, BoundNetLog()); |
3301 session, url, MEDIUM, BoundNetLog()); | |
3302 ASSERT_TRUE(stream.get() != NULL); | 3247 ASSERT_TRUE(stream.get() != NULL); |
3303 EXPECT_EQ(0u, stream->stream_id()); | 3248 EXPECT_EQ(0u, stream->stream_id()); |
3304 | 3249 |
3305 DropReceivedDataDelegate delegate(stream, msg_data); | 3250 DropReceivedDataDelegate delegate(stream, msg_data); |
3306 stream->SetDelegate(&delegate); | 3251 stream->SetDelegate(&delegate); |
3307 | 3252 |
3308 scoped_ptr<SpdyHeaderBlock> headers( | 3253 scoped_ptr<SpdyHeaderBlock> headers( |
3309 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); | 3254 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); |
3310 EXPECT_EQ(ERR_IO_PENDING, | 3255 EXPECT_EQ(ERR_IO_PENDING, |
3311 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 3256 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
(...skipping 26 matching lines...) Expand all Loading... |
3338 if (GetParam() < kProtoSPDY31) | 3283 if (GetParam() < kProtoSPDY31) |
3339 return; | 3284 return; |
3340 | 3285 |
3341 const char kStreamUrl[] = "http://www.google.com/"; | 3286 const char kStreamUrl[] = "http://www.google.com/"; |
3342 | 3287 |
3343 const int32 msg_data_size = 100; | 3288 const int32 msg_data_size = 100; |
3344 const std::string msg_data(msg_data_size, 'a'); | 3289 const std::string msg_data(msg_data_size, 'a'); |
3345 | 3290 |
3346 MockConnect connect_data(SYNCHRONOUS, OK); | 3291 MockConnect connect_data(SYNCHRONOUS, OK); |
3347 | 3292 |
3348 scoped_ptr<SpdyFrame> req( | 3293 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( |
3349 spdy_util_.ConstructSpdyPost( | 3294 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); |
3350 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); | |
3351 MockWrite writes[] = { | 3295 MockWrite writes[] = { |
3352 CreateMockWrite(*req, 0), | 3296 CreateMockWrite(*req, 0), |
3353 }; | 3297 }; |
3354 | 3298 |
3355 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3299 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3356 MockRead reads[] = { | 3300 MockRead reads[] = { |
3357 CreateMockRead(*resp, 1), | 3301 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 2) // EOF |
3358 MockRead(ASYNC, 0, 2) // EOF | |
3359 }; | 3302 }; |
3360 | 3303 |
3361 // Create SpdySession and SpdyStream and send the request. | 3304 // Create SpdySession and SpdyStream and send the request. |
3362 DeterministicSocketData data(reads, arraysize(reads), | 3305 DeterministicSocketData data( |
3363 writes, arraysize(writes)); | 3306 reads, arraysize(reads), writes, arraysize(writes)); |
3364 data.set_connect_data(connect_data); | 3307 data.set_connect_data(connect_data); |
3365 session_deps_.host_resolver->set_synchronous_mode(true); | 3308 session_deps_.host_resolver->set_synchronous_mode(true); |
3366 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3309 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
3367 | 3310 |
3368 CreateDeterministicNetworkSession(); | 3311 CreateDeterministicNetworkSession(); |
3369 | 3312 |
3370 base::WeakPtr<SpdySession> session = | 3313 base::WeakPtr<SpdySession> session = |
3371 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3314 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
3372 | 3315 |
3373 GURL url(kStreamUrl); | 3316 GURL url(kStreamUrl); |
3374 base::WeakPtr<SpdyStream> stream = | 3317 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
3375 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 3318 SPDY_BIDIRECTIONAL_STREAM, session, url, MEDIUM, BoundNetLog()); |
3376 session, url, MEDIUM, BoundNetLog()); | |
3377 ASSERT_TRUE(stream.get() != NULL); | 3319 ASSERT_TRUE(stream.get() != NULL); |
3378 EXPECT_EQ(0u, stream->stream_id()); | 3320 EXPECT_EQ(0u, stream->stream_id()); |
3379 | 3321 |
3380 test::StreamDelegateSendImmediate delegate(stream, msg_data); | 3322 test::StreamDelegateSendImmediate delegate(stream, msg_data); |
3381 stream->SetDelegate(&delegate); | 3323 stream->SetDelegate(&delegate); |
3382 | 3324 |
3383 scoped_ptr<SpdyHeaderBlock> headers( | 3325 scoped_ptr<SpdyHeaderBlock> headers( |
3384 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); | 3326 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); |
3385 EXPECT_EQ(ERR_IO_PENDING, | 3327 EXPECT_EQ(ERR_IO_PENDING, |
3386 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 3328 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
(...skipping 28 matching lines...) Expand all Loading... |
3415 if (GetParam() < kProtoSPDY31) | 3357 if (GetParam() < kProtoSPDY31) |
3416 return; | 3358 return; |
3417 | 3359 |
3418 const char kStreamUrl[] = "http://www.google.com/"; | 3360 const char kStreamUrl[] = "http://www.google.com/"; |
3419 | 3361 |
3420 const int32 msg_data_size = 100; | 3362 const int32 msg_data_size = 100; |
3421 const std::string msg_data(msg_data_size, 'a'); | 3363 const std::string msg_data(msg_data_size, 'a'); |
3422 | 3364 |
3423 MockConnect connect_data(SYNCHRONOUS, OK); | 3365 MockConnect connect_data(SYNCHRONOUS, OK); |
3424 | 3366 |
3425 scoped_ptr<SpdyFrame> req( | 3367 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( |
3426 spdy_util_.ConstructSpdyPost( | 3368 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); |
3427 kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); | 3369 scoped_ptr<SpdyFrame> msg(spdy_util_.ConstructSpdyBodyFrame( |
3428 scoped_ptr<SpdyFrame> msg( | 3370 1, msg_data.data(), msg_data_size, false)); |
3429 spdy_util_.ConstructSpdyBodyFrame( | |
3430 1, msg_data.data(), msg_data_size, false)); | |
3431 MockWrite writes[] = { | 3371 MockWrite writes[] = { |
3432 CreateMockWrite(*req, 0), | 3372 CreateMockWrite(*req, 0), CreateMockWrite(*msg, 2), |
3433 CreateMockWrite(*msg, 2), | |
3434 }; | 3373 }; |
3435 | 3374 |
3436 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3375 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3437 scoped_ptr<SpdyFrame> echo( | 3376 scoped_ptr<SpdyFrame> echo(spdy_util_.ConstructSpdyBodyFrame( |
3438 spdy_util_.ConstructSpdyBodyFrame( | 3377 1, msg_data.data(), msg_data_size, false)); |
3439 1, msg_data.data(), msg_data_size, false)); | 3378 scoped_ptr<SpdyFrame> window_update(spdy_util_.ConstructSpdyWindowUpdate( |
3440 scoped_ptr<SpdyFrame> window_update( | 3379 kSessionFlowControlStreamId, msg_data_size)); |
3441 spdy_util_.ConstructSpdyWindowUpdate( | |
3442 kSessionFlowControlStreamId, msg_data_size)); | |
3443 MockRead reads[] = { | 3380 MockRead reads[] = { |
3444 CreateMockRead(*resp, 1), | 3381 CreateMockRead(*resp, 1), CreateMockRead(*echo, 3), |
3445 CreateMockRead(*echo, 3), | 3382 CreateMockRead(*window_update, 4), MockRead(ASYNC, 0, 5) // EOF |
3446 CreateMockRead(*window_update, 4), | |
3447 MockRead(ASYNC, 0, 5) // EOF | |
3448 }; | 3383 }; |
3449 | 3384 |
3450 // Create SpdySession and SpdyStream and send the request. | 3385 // Create SpdySession and SpdyStream and send the request. |
3451 DeterministicSocketData data(reads, arraysize(reads), | 3386 DeterministicSocketData data( |
3452 writes, arraysize(writes)); | 3387 reads, arraysize(reads), writes, arraysize(writes)); |
3453 data.set_connect_data(connect_data); | 3388 data.set_connect_data(connect_data); |
3454 session_deps_.host_resolver->set_synchronous_mode(true); | 3389 session_deps_.host_resolver->set_synchronous_mode(true); |
3455 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3390 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
3456 | 3391 |
3457 CreateDeterministicNetworkSession(); | 3392 CreateDeterministicNetworkSession(); |
3458 | 3393 |
3459 base::WeakPtr<SpdySession> session = | 3394 base::WeakPtr<SpdySession> session = |
3460 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3395 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
3461 | 3396 |
3462 GURL url(kStreamUrl); | 3397 GURL url(kStreamUrl); |
3463 base::WeakPtr<SpdyStream> stream = | 3398 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
3464 CreateStreamSynchronously(SPDY_BIDIRECTIONAL_STREAM, | 3399 SPDY_BIDIRECTIONAL_STREAM, session, url, MEDIUM, BoundNetLog()); |
3465 session, url, MEDIUM, BoundNetLog()); | |
3466 ASSERT_TRUE(stream.get() != NULL); | 3400 ASSERT_TRUE(stream.get() != NULL); |
3467 EXPECT_EQ(0u, stream->stream_id()); | 3401 EXPECT_EQ(0u, stream->stream_id()); |
3468 | 3402 |
3469 test::StreamDelegateSendImmediate delegate(stream, msg_data); | 3403 test::StreamDelegateSendImmediate delegate(stream, msg_data); |
3470 stream->SetDelegate(&delegate); | 3404 stream->SetDelegate(&delegate); |
3471 | 3405 |
3472 scoped_ptr<SpdyHeaderBlock> headers( | 3406 scoped_ptr<SpdyHeaderBlock> headers( |
3473 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); | 3407 spdy_util_.ConstructPostHeaderBlock(url.spec(), msg_data_size)); |
3474 EXPECT_EQ(ERR_IO_PENDING, | 3408 EXPECT_EQ(ERR_IO_PENDING, |
3475 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 3409 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3539 // sure that a stream resumes after unstall. | 3473 // sure that a stream resumes after unstall. |
3540 void SpdySessionTest::RunResumeAfterUnstallTest( | 3474 void SpdySessionTest::RunResumeAfterUnstallTest( |
3541 const base::Callback<void(SpdySession*, SpdyStream*)>& stall_function, | 3475 const base::Callback<void(SpdySession*, SpdyStream*)>& stall_function, |
3542 const base::Callback<void(SpdySession*, SpdyStream*, int32)>& | 3476 const base::Callback<void(SpdySession*, SpdyStream*, int32)>& |
3543 unstall_function) { | 3477 unstall_function) { |
3544 const char kStreamUrl[] = "http://www.google.com/"; | 3478 const char kStreamUrl[] = "http://www.google.com/"; |
3545 GURL url(kStreamUrl); | 3479 GURL url(kStreamUrl); |
3546 | 3480 |
3547 session_deps_.host_resolver->set_synchronous_mode(true); | 3481 session_deps_.host_resolver->set_synchronous_mode(true); |
3548 | 3482 |
3549 scoped_ptr<SpdyFrame> req( | 3483 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( |
3550 spdy_util_.ConstructSpdyPost( | 3484 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); |
3551 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); | |
3552 scoped_ptr<SpdyFrame> body( | 3485 scoped_ptr<SpdyFrame> body( |
3553 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, true)); | 3486 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, true)); |
3554 MockWrite writes[] = { | 3487 MockWrite writes[] = { |
3555 CreateMockWrite(*req, 0), | 3488 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), |
3556 CreateMockWrite(*body, 1), | |
3557 }; | 3489 }; |
3558 | 3490 |
3559 scoped_ptr<SpdyFrame> resp( | 3491 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3560 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | |
3561 scoped_ptr<SpdyFrame> echo( | 3492 scoped_ptr<SpdyFrame> echo( |
3562 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); | 3493 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); |
3563 MockRead reads[] = { | 3494 MockRead reads[] = { |
3564 CreateMockRead(*resp, 2), | 3495 CreateMockRead(*resp, 2), MockRead(ASYNC, 0, 0, 3), // EOF |
3565 MockRead(ASYNC, 0, 0, 3), // EOF | |
3566 }; | 3496 }; |
3567 | 3497 |
3568 DeterministicSocketData data(reads, arraysize(reads), | 3498 DeterministicSocketData data( |
3569 writes, arraysize(writes)); | 3499 reads, arraysize(reads), writes, arraysize(writes)); |
3570 MockConnect connect_data(SYNCHRONOUS, OK); | 3500 MockConnect connect_data(SYNCHRONOUS, OK); |
3571 data.set_connect_data(connect_data); | 3501 data.set_connect_data(connect_data); |
3572 | 3502 |
3573 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3503 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
3574 | 3504 |
3575 CreateDeterministicNetworkSession(); | 3505 CreateDeterministicNetworkSession(); |
3576 base::WeakPtr<SpdySession> session = | 3506 base::WeakPtr<SpdySession> session = |
3577 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3507 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
3578 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 3508 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
3579 session->flow_control_state()); | 3509 session->flow_control_state()); |
3580 | 3510 |
3581 base::WeakPtr<SpdyStream> stream = | 3511 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
3582 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 3512 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
3583 session, url, LOWEST, BoundNetLog()); | |
3584 ASSERT_TRUE(stream.get() != NULL); | 3513 ASSERT_TRUE(stream.get() != NULL); |
3585 | 3514 |
3586 test::StreamDelegateWithBody delegate(stream, kBodyDataStringPiece); | 3515 test::StreamDelegateWithBody delegate(stream, kBodyDataStringPiece); |
3587 stream->SetDelegate(&delegate); | 3516 stream->SetDelegate(&delegate); |
3588 | 3517 |
3589 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 3518 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
3590 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 3519 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
3591 | 3520 |
3592 scoped_ptr<SpdyHeaderBlock> headers( | 3521 scoped_ptr<SpdyHeaderBlock> headers( |
3593 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); | 3522 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); |
(...skipping 23 matching lines...) Expand all Loading... |
3617 } | 3546 } |
3618 | 3547 |
3619 // Run the resume-after-unstall test with all possible stall and | 3548 // Run the resume-after-unstall test with all possible stall and |
3620 // unstall sequences. | 3549 // unstall sequences. |
3621 | 3550 |
3622 TEST_P(SpdySessionTest, ResumeAfterUnstallSession) { | 3551 TEST_P(SpdySessionTest, ResumeAfterUnstallSession) { |
3623 if (GetParam() < kProtoSPDY31) | 3552 if (GetParam() < kProtoSPDY31) |
3624 return; | 3553 return; |
3625 | 3554 |
3626 RunResumeAfterUnstallTest( | 3555 RunResumeAfterUnstallTest( |
3627 base::Bind(&SpdySessionTest::StallSessionOnly, | 3556 base::Bind(&SpdySessionTest::StallSessionOnly, base::Unretained(this)), |
3628 base::Unretained(this)), | 3557 base::Bind(&SpdySessionTest::UnstallSessionOnly, base::Unretained(this))); |
3629 base::Bind(&SpdySessionTest::UnstallSessionOnly, | |
3630 base::Unretained(this))); | |
3631 } | 3558 } |
3632 | 3559 |
3633 // Equivalent to | 3560 // Equivalent to |
3634 // SpdyStreamTest.ResumeAfterSendWindowSizeIncrease. | 3561 // SpdyStreamTest.ResumeAfterSendWindowSizeIncrease. |
3635 TEST_P(SpdySessionTest, ResumeAfterUnstallStream) { | 3562 TEST_P(SpdySessionTest, ResumeAfterUnstallStream) { |
3636 if (GetParam() < kProtoSPDY31) | 3563 if (GetParam() < kProtoSPDY31) |
3637 return; | 3564 return; |
3638 | 3565 |
3639 RunResumeAfterUnstallTest( | 3566 RunResumeAfterUnstallTest( |
3640 base::Bind(&SpdySessionTest::StallStreamOnly, | 3567 base::Bind(&SpdySessionTest::StallStreamOnly, base::Unretained(this)), |
3641 base::Unretained(this)), | 3568 base::Bind(&SpdySessionTest::UnstallStreamOnly, base::Unretained(this))); |
3642 base::Bind(&SpdySessionTest::UnstallStreamOnly, | |
3643 base::Unretained(this))); | |
3644 } | 3569 } |
3645 | 3570 |
3646 TEST_P(SpdySessionTest, StallSessionStreamResumeAfterUnstallSessionStream) { | 3571 TEST_P(SpdySessionTest, StallSessionStreamResumeAfterUnstallSessionStream) { |
3647 if (GetParam() < kProtoSPDY31) | 3572 if (GetParam() < kProtoSPDY31) |
3648 return; | 3573 return; |
3649 | 3574 |
3650 RunResumeAfterUnstallTest( | 3575 RunResumeAfterUnstallTest( |
3651 base::Bind(&SpdySessionTest::StallSessionStream, | 3576 base::Bind(&SpdySessionTest::StallSessionStream, base::Unretained(this)), |
3652 base::Unretained(this)), | |
3653 base::Bind(&SpdySessionTest::UnstallSessionStream, | 3577 base::Bind(&SpdySessionTest::UnstallSessionStream, |
3654 base::Unretained(this))); | 3578 base::Unretained(this))); |
3655 } | 3579 } |
3656 | 3580 |
3657 TEST_P(SpdySessionTest, StallStreamSessionResumeAfterUnstallSessionStream) { | 3581 TEST_P(SpdySessionTest, StallStreamSessionResumeAfterUnstallSessionStream) { |
3658 if (GetParam() < kProtoSPDY31) | 3582 if (GetParam() < kProtoSPDY31) |
3659 return; | 3583 return; |
3660 | 3584 |
3661 RunResumeAfterUnstallTest( | 3585 RunResumeAfterUnstallTest( |
3662 base::Bind(&SpdySessionTest::StallStreamSession, | 3586 base::Bind(&SpdySessionTest::StallStreamSession, base::Unretained(this)), |
3663 base::Unretained(this)), | |
3664 base::Bind(&SpdySessionTest::UnstallSessionStream, | 3587 base::Bind(&SpdySessionTest::UnstallSessionStream, |
3665 base::Unretained(this))); | 3588 base::Unretained(this))); |
3666 } | 3589 } |
3667 | 3590 |
3668 TEST_P(SpdySessionTest, StallStreamSessionResumeAfterUnstallStreamSession) { | 3591 TEST_P(SpdySessionTest, StallStreamSessionResumeAfterUnstallStreamSession) { |
3669 if (GetParam() < kProtoSPDY31) | 3592 if (GetParam() < kProtoSPDY31) |
3670 return; | 3593 return; |
3671 | 3594 |
3672 RunResumeAfterUnstallTest( | 3595 RunResumeAfterUnstallTest( |
3673 base::Bind(&SpdySessionTest::StallStreamSession, | 3596 base::Bind(&SpdySessionTest::StallStreamSession, base::Unretained(this)), |
3674 base::Unretained(this)), | |
3675 base::Bind(&SpdySessionTest::UnstallStreamSession, | 3597 base::Bind(&SpdySessionTest::UnstallStreamSession, |
3676 base::Unretained(this))); | 3598 base::Unretained(this))); |
3677 } | 3599 } |
3678 | 3600 |
3679 TEST_P(SpdySessionTest, StallSessionStreamResumeAfterUnstallStreamSession) { | 3601 TEST_P(SpdySessionTest, StallSessionStreamResumeAfterUnstallStreamSession) { |
3680 if (GetParam() < kProtoSPDY31) | 3602 if (GetParam() < kProtoSPDY31) |
3681 return; | 3603 return; |
3682 | 3604 |
3683 RunResumeAfterUnstallTest( | 3605 RunResumeAfterUnstallTest( |
3684 base::Bind(&SpdySessionTest::StallSessionStream, | 3606 base::Bind(&SpdySessionTest::StallSessionStream, base::Unretained(this)), |
3685 base::Unretained(this)), | |
3686 base::Bind(&SpdySessionTest::UnstallStreamSession, | 3607 base::Bind(&SpdySessionTest::UnstallStreamSession, |
3687 base::Unretained(this))); | 3608 base::Unretained(this))); |
3688 } | 3609 } |
3689 | 3610 |
3690 // Cause a stall by reducing the flow control send window to 0. The | 3611 // Cause a stall by reducing the flow control send window to 0. The |
3691 // streams should resume in priority order when that window is then | 3612 // streams should resume in priority order when that window is then |
3692 // increased. | 3613 // increased. |
3693 TEST_P(SpdySessionTest, ResumeByPriorityAfterSendWindowSizeIncrease) { | 3614 TEST_P(SpdySessionTest, ResumeByPriorityAfterSendWindowSizeIncrease) { |
3694 if (GetParam() < kProtoSPDY31) | 3615 if (GetParam() < kProtoSPDY31) |
3695 return; | 3616 return; |
3696 | 3617 |
3697 const char kStreamUrl[] = "http://www.google.com/"; | 3618 const char kStreamUrl[] = "http://www.google.com/"; |
3698 GURL url(kStreamUrl); | 3619 GURL url(kStreamUrl); |
3699 | 3620 |
3700 session_deps_.host_resolver->set_synchronous_mode(true); | 3621 session_deps_.host_resolver->set_synchronous_mode(true); |
3701 | 3622 |
3702 scoped_ptr<SpdyFrame> req1( | 3623 scoped_ptr<SpdyFrame> req1(spdy_util_.ConstructSpdyPost( |
3703 spdy_util_.ConstructSpdyPost( | 3624 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); |
3704 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); | 3625 scoped_ptr<SpdyFrame> req2(spdy_util_.ConstructSpdyPost( |
3705 scoped_ptr<SpdyFrame> req2( | 3626 kStreamUrl, 3, kBodyDataSize, MEDIUM, NULL, 0)); |
3706 spdy_util_.ConstructSpdyPost( | |
3707 kStreamUrl, 3, kBodyDataSize, MEDIUM, NULL, 0)); | |
3708 scoped_ptr<SpdyFrame> body1( | 3627 scoped_ptr<SpdyFrame> body1( |
3709 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, true)); | 3628 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, true)); |
3710 scoped_ptr<SpdyFrame> body2( | 3629 scoped_ptr<SpdyFrame> body2( |
3711 spdy_util_.ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, true)); | 3630 spdy_util_.ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, true)); |
3712 MockWrite writes[] = { | 3631 MockWrite writes[] = { |
3713 CreateMockWrite(*req1, 0), | 3632 CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1), |
3714 CreateMockWrite(*req2, 1), | 3633 CreateMockWrite(*body2, 2), CreateMockWrite(*body1, 3), |
3715 CreateMockWrite(*body2, 2), | |
3716 CreateMockWrite(*body1, 3), | |
3717 }; | 3634 }; |
3718 | 3635 |
3719 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 3636 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
3720 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 3637 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
3721 MockRead reads[] = { | 3638 MockRead reads[] = { |
3722 CreateMockRead(*resp1, 4), | 3639 CreateMockRead(*resp1, 4), CreateMockRead(*resp2, 5), |
3723 CreateMockRead(*resp2, 5), | 3640 MockRead(ASYNC, 0, 0, 6), // EOF |
3724 MockRead(ASYNC, 0, 0, 6), // EOF | |
3725 }; | 3641 }; |
3726 | 3642 |
3727 DeterministicSocketData data(reads, arraysize(reads), | 3643 DeterministicSocketData data( |
3728 writes, arraysize(writes)); | 3644 reads, arraysize(reads), writes, arraysize(writes)); |
3729 MockConnect connect_data(SYNCHRONOUS, OK); | 3645 MockConnect connect_data(SYNCHRONOUS, OK); |
3730 data.set_connect_data(connect_data); | 3646 data.set_connect_data(connect_data); |
3731 | 3647 |
3732 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3648 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
3733 | 3649 |
3734 CreateDeterministicNetworkSession(); | 3650 CreateDeterministicNetworkSession(); |
3735 base::WeakPtr<SpdySession> session = | 3651 base::WeakPtr<SpdySession> session = |
3736 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3652 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
3737 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 3653 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
3738 session->flow_control_state()); | 3654 session->flow_control_state()); |
3739 | 3655 |
3740 base::WeakPtr<SpdyStream> stream1 = | 3656 base::WeakPtr<SpdyStream> stream1 = CreateStreamSynchronously( |
3741 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 3657 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
3742 session, url, LOWEST, BoundNetLog()); | |
3743 ASSERT_TRUE(stream1.get() != NULL); | 3658 ASSERT_TRUE(stream1.get() != NULL); |
3744 | 3659 |
3745 test::StreamDelegateWithBody delegate1(stream1, kBodyDataStringPiece); | 3660 test::StreamDelegateWithBody delegate1(stream1, kBodyDataStringPiece); |
3746 stream1->SetDelegate(&delegate1); | 3661 stream1->SetDelegate(&delegate1); |
3747 | 3662 |
3748 EXPECT_FALSE(stream1->HasUrlFromHeaders()); | 3663 EXPECT_FALSE(stream1->HasUrlFromHeaders()); |
3749 | 3664 |
3750 base::WeakPtr<SpdyStream> stream2 = | 3665 base::WeakPtr<SpdyStream> stream2 = CreateStreamSynchronously( |
3751 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 3666 SPDY_REQUEST_RESPONSE_STREAM, session, url, MEDIUM, BoundNetLog()); |
3752 session, url, MEDIUM, BoundNetLog()); | |
3753 ASSERT_TRUE(stream2.get() != NULL); | 3667 ASSERT_TRUE(stream2.get() != NULL); |
3754 | 3668 |
3755 test::StreamDelegateWithBody delegate2(stream2, kBodyDataStringPiece); | 3669 test::StreamDelegateWithBody delegate2(stream2, kBodyDataStringPiece); |
3756 stream2->SetDelegate(&delegate2); | 3670 stream2->SetDelegate(&delegate2); |
3757 | 3671 |
3758 EXPECT_FALSE(stream2->HasUrlFromHeaders()); | 3672 EXPECT_FALSE(stream2->HasUrlFromHeaders()); |
3759 | 3673 |
3760 EXPECT_FALSE(stream1->send_stalled_by_flow_control()); | 3674 EXPECT_FALSE(stream1->send_stalled_by_flow_control()); |
3761 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); | 3675 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); |
3762 | 3676 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3846 // 0. Unstalling the session should properly handle deleted streams. | 3760 // 0. Unstalling the session should properly handle deleted streams. |
3847 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedStreams) { | 3761 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedStreams) { |
3848 if (GetParam() < kProtoSPDY31) | 3762 if (GetParam() < kProtoSPDY31) |
3849 return; | 3763 return; |
3850 | 3764 |
3851 const char kStreamUrl[] = "http://www.google.com/"; | 3765 const char kStreamUrl[] = "http://www.google.com/"; |
3852 GURL url(kStreamUrl); | 3766 GURL url(kStreamUrl); |
3853 | 3767 |
3854 session_deps_.host_resolver->set_synchronous_mode(true); | 3768 session_deps_.host_resolver->set_synchronous_mode(true); |
3855 | 3769 |
3856 scoped_ptr<SpdyFrame> req1( | 3770 scoped_ptr<SpdyFrame> req1(spdy_util_.ConstructSpdyPost( |
3857 spdy_util_.ConstructSpdyPost( | 3771 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); |
3858 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); | 3772 scoped_ptr<SpdyFrame> req2(spdy_util_.ConstructSpdyPost( |
3859 scoped_ptr<SpdyFrame> req2( | 3773 kStreamUrl, 3, kBodyDataSize, LOWEST, NULL, 0)); |
3860 spdy_util_.ConstructSpdyPost( | 3774 scoped_ptr<SpdyFrame> req3(spdy_util_.ConstructSpdyPost( |
3861 kStreamUrl, 3, kBodyDataSize, LOWEST, NULL, 0)); | 3775 kStreamUrl, 5, kBodyDataSize, LOWEST, NULL, 0)); |
3862 scoped_ptr<SpdyFrame> req3( | |
3863 spdy_util_.ConstructSpdyPost( | |
3864 kStreamUrl, 5, kBodyDataSize, LOWEST, NULL, 0)); | |
3865 scoped_ptr<SpdyFrame> body2( | 3776 scoped_ptr<SpdyFrame> body2( |
3866 spdy_util_.ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, true)); | 3777 spdy_util_.ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, true)); |
3867 MockWrite writes[] = { | 3778 MockWrite writes[] = { |
3868 CreateMockWrite(*req1, 0), | 3779 CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1), |
3869 CreateMockWrite(*req2, 1), | 3780 CreateMockWrite(*req3, 2), CreateMockWrite(*body2, 3), |
3870 CreateMockWrite(*req3, 2), | |
3871 CreateMockWrite(*body2, 3), | |
3872 }; | 3781 }; |
3873 | 3782 |
3874 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); | 3783 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); |
3875 MockRead reads[] = { | 3784 MockRead reads[] = { |
3876 CreateMockRead(*resp2, 4), | 3785 CreateMockRead(*resp2, 4), MockRead(ASYNC, 0, 0, 5), // EOF |
3877 MockRead(ASYNC, 0, 0, 5), // EOF | |
3878 }; | 3786 }; |
3879 | 3787 |
3880 DeterministicSocketData data(reads, arraysize(reads), | 3788 DeterministicSocketData data( |
3881 writes, arraysize(writes)); | 3789 reads, arraysize(reads), writes, arraysize(writes)); |
3882 MockConnect connect_data(SYNCHRONOUS, OK); | 3790 MockConnect connect_data(SYNCHRONOUS, OK); |
3883 data.set_connect_data(connect_data); | 3791 data.set_connect_data(connect_data); |
3884 | 3792 |
3885 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3793 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
3886 | 3794 |
3887 CreateDeterministicNetworkSession(); | 3795 CreateDeterministicNetworkSession(); |
3888 base::WeakPtr<SpdySession> session = | 3796 base::WeakPtr<SpdySession> session = |
3889 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3797 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
3890 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 3798 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
3891 session->flow_control_state()); | 3799 session->flow_control_state()); |
3892 | 3800 |
3893 base::WeakPtr<SpdyStream> stream1 = | 3801 base::WeakPtr<SpdyStream> stream1 = CreateStreamSynchronously( |
3894 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 3802 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
3895 session, url, LOWEST, BoundNetLog()); | |
3896 ASSERT_TRUE(stream1.get() != NULL); | 3803 ASSERT_TRUE(stream1.get() != NULL); |
3897 | 3804 |
3898 test::StreamDelegateWithBody delegate1(stream1, kBodyDataStringPiece); | 3805 test::StreamDelegateWithBody delegate1(stream1, kBodyDataStringPiece); |
3899 stream1->SetDelegate(&delegate1); | 3806 stream1->SetDelegate(&delegate1); |
3900 | 3807 |
3901 EXPECT_FALSE(stream1->HasUrlFromHeaders()); | 3808 EXPECT_FALSE(stream1->HasUrlFromHeaders()); |
3902 | 3809 |
3903 base::WeakPtr<SpdyStream> stream2 = | 3810 base::WeakPtr<SpdyStream> stream2 = CreateStreamSynchronously( |
3904 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 3811 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
3905 session, url, LOWEST, BoundNetLog()); | |
3906 ASSERT_TRUE(stream2.get() != NULL); | 3812 ASSERT_TRUE(stream2.get() != NULL); |
3907 | 3813 |
3908 StreamClosingDelegate delegate2(stream2, kBodyDataStringPiece); | 3814 StreamClosingDelegate delegate2(stream2, kBodyDataStringPiece); |
3909 stream2->SetDelegate(&delegate2); | 3815 stream2->SetDelegate(&delegate2); |
3910 | 3816 |
3911 EXPECT_FALSE(stream2->HasUrlFromHeaders()); | 3817 EXPECT_FALSE(stream2->HasUrlFromHeaders()); |
3912 | 3818 |
3913 base::WeakPtr<SpdyStream> stream3 = | 3819 base::WeakPtr<SpdyStream> stream3 = CreateStreamSynchronously( |
3914 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 3820 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
3915 session, url, LOWEST, BoundNetLog()); | |
3916 ASSERT_TRUE(stream3.get() != NULL); | 3821 ASSERT_TRUE(stream3.get() != NULL); |
3917 | 3822 |
3918 test::StreamDelegateWithBody delegate3(stream3, kBodyDataStringPiece); | 3823 test::StreamDelegateWithBody delegate3(stream3, kBodyDataStringPiece); |
3919 stream3->SetDelegate(&delegate3); | 3824 stream3->SetDelegate(&delegate3); |
3920 | 3825 |
3921 EXPECT_FALSE(stream3->HasUrlFromHeaders()); | 3826 EXPECT_FALSE(stream3->HasUrlFromHeaders()); |
3922 | 3827 |
3923 EXPECT_FALSE(stream1->send_stalled_by_flow_control()); | 3828 EXPECT_FALSE(stream1->send_stalled_by_flow_control()); |
3924 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); | 3829 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); |
3925 EXPECT_FALSE(stream3->send_stalled_by_flow_control()); | 3830 EXPECT_FALSE(stream3->send_stalled_by_flow_control()); |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4008 // being closed. | 3913 // being closed. |
4009 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedSession) { | 3914 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedSession) { |
4010 if (GetParam() < kProtoSPDY31) | 3915 if (GetParam() < kProtoSPDY31) |
4011 return; | 3916 return; |
4012 | 3917 |
4013 const char kStreamUrl[] = "http://www.google.com/"; | 3918 const char kStreamUrl[] = "http://www.google.com/"; |
4014 GURL url(kStreamUrl); | 3919 GURL url(kStreamUrl); |
4015 | 3920 |
4016 session_deps_.host_resolver->set_synchronous_mode(true); | 3921 session_deps_.host_resolver->set_synchronous_mode(true); |
4017 | 3922 |
4018 scoped_ptr<SpdyFrame> req1( | 3923 scoped_ptr<SpdyFrame> req1(spdy_util_.ConstructSpdyPost( |
4019 spdy_util_.ConstructSpdyPost( | 3924 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); |
4020 kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); | 3925 scoped_ptr<SpdyFrame> req2(spdy_util_.ConstructSpdyPost( |
4021 scoped_ptr<SpdyFrame> req2( | 3926 kStreamUrl, 3, kBodyDataSize, LOWEST, NULL, 0)); |
4022 spdy_util_.ConstructSpdyPost( | |
4023 kStreamUrl, 3, kBodyDataSize, LOWEST, NULL, 0)); | |
4024 scoped_ptr<SpdyFrame> body1( | 3927 scoped_ptr<SpdyFrame> body1( |
4025 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); | 3928 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); |
4026 MockWrite writes[] = { | 3929 MockWrite writes[] = { |
4027 CreateMockWrite(*req1, 0), | 3930 CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1), |
4028 CreateMockWrite(*req2, 1), | |
4029 }; | 3931 }; |
4030 | 3932 |
4031 MockRead reads[] = { | 3933 MockRead reads[] = { |
4032 MockRead(ASYNC, 0, 0, 2), // EOF | 3934 MockRead(ASYNC, 0, 0, 2), // EOF |
4033 }; | 3935 }; |
4034 | 3936 |
4035 DeterministicSocketData data(reads, arraysize(reads), | 3937 DeterministicSocketData data( |
4036 writes, arraysize(writes)); | 3938 reads, arraysize(reads), writes, arraysize(writes)); |
4037 MockConnect connect_data(SYNCHRONOUS, OK); | 3939 MockConnect connect_data(SYNCHRONOUS, OK); |
4038 data.set_connect_data(connect_data); | 3940 data.set_connect_data(connect_data); |
4039 | 3941 |
4040 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 3942 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
4041 | 3943 |
4042 CreateDeterministicNetworkSession(); | 3944 CreateDeterministicNetworkSession(); |
4043 base::WeakPtr<SpdySession> session = | 3945 base::WeakPtr<SpdySession> session = |
4044 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); | 3946 CreateInsecureSpdySession(http_session_, key_, BoundNetLog()); |
4045 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | 3947 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
4046 session->flow_control_state()); | 3948 session->flow_control_state()); |
4047 | 3949 |
4048 base::WeakPtr<SpdyStream> stream1 = | 3950 base::WeakPtr<SpdyStream> stream1 = CreateStreamSynchronously( |
4049 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 3951 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
4050 session, url, LOWEST, BoundNetLog()); | |
4051 ASSERT_TRUE(stream1.get() != NULL); | 3952 ASSERT_TRUE(stream1.get() != NULL); |
4052 | 3953 |
4053 test::StreamDelegateWithBody delegate1(stream1, kBodyDataStringPiece); | 3954 test::StreamDelegateWithBody delegate1(stream1, kBodyDataStringPiece); |
4054 stream1->SetDelegate(&delegate1); | 3955 stream1->SetDelegate(&delegate1); |
4055 | 3956 |
4056 EXPECT_FALSE(stream1->HasUrlFromHeaders()); | 3957 EXPECT_FALSE(stream1->HasUrlFromHeaders()); |
4057 | 3958 |
4058 base::WeakPtr<SpdyStream> stream2 = | 3959 base::WeakPtr<SpdyStream> stream2 = CreateStreamSynchronously( |
4059 CreateStreamSynchronously(SPDY_REQUEST_RESPONSE_STREAM, | 3960 SPDY_REQUEST_RESPONSE_STREAM, session, url, LOWEST, BoundNetLog()); |
4060 session, url, LOWEST, BoundNetLog()); | |
4061 ASSERT_TRUE(stream2.get() != NULL); | 3961 ASSERT_TRUE(stream2.get() != NULL); |
4062 | 3962 |
4063 test::StreamDelegateWithBody delegate2(stream2, kBodyDataStringPiece); | 3963 test::StreamDelegateWithBody delegate2(stream2, kBodyDataStringPiece); |
4064 stream2->SetDelegate(&delegate2); | 3964 stream2->SetDelegate(&delegate2); |
4065 | 3965 |
4066 EXPECT_FALSE(stream2->HasUrlFromHeaders()); | 3966 EXPECT_FALSE(stream2->HasUrlFromHeaders()); |
4067 | 3967 |
4068 EXPECT_FALSE(stream1->send_stalled_by_flow_control()); | 3968 EXPECT_FALSE(stream1->send_stalled_by_flow_control()); |
4069 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); | 3969 EXPECT_FALSE(stream2->send_stalled_by_flow_control()); |
4070 | 3970 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4110 EXPECT_TRUE(delegate1.send_headers_completed()); | 4010 EXPECT_TRUE(delegate1.send_headers_completed()); |
4111 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); | 4011 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); |
4112 | 4012 |
4113 EXPECT_TRUE(delegate2.send_headers_completed()); | 4013 EXPECT_TRUE(delegate2.send_headers_completed()); |
4114 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); | 4014 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); |
4115 | 4015 |
4116 EXPECT_TRUE(data.at_write_eof()); | 4016 EXPECT_TRUE(data.at_write_eof()); |
4117 } | 4017 } |
4118 | 4018 |
4119 TEST(MapFramerErrorToProtocolError, MapsValues) { | 4019 TEST(MapFramerErrorToProtocolError, MapsValues) { |
4120 CHECK_EQ(SPDY_ERROR_INVALID_CONTROL_FRAME, | 4020 CHECK_EQ( |
4121 MapFramerErrorToProtocolError( | 4021 SPDY_ERROR_INVALID_CONTROL_FRAME, |
4122 SpdyFramer::SPDY_INVALID_CONTROL_FRAME)); | 4022 MapFramerErrorToProtocolError(SpdyFramer::SPDY_INVALID_CONTROL_FRAME)); |
4123 CHECK_EQ(SPDY_ERROR_INVALID_DATA_FRAME_FLAGS, | 4023 CHECK_EQ( |
4124 MapFramerErrorToProtocolError( | 4024 SPDY_ERROR_INVALID_DATA_FRAME_FLAGS, |
4125 SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS)); | 4025 MapFramerErrorToProtocolError(SpdyFramer::SPDY_INVALID_DATA_FRAME_FLAGS)); |
4126 CHECK_EQ(SPDY_ERROR_GOAWAY_FRAME_CORRUPT, | 4026 CHECK_EQ( |
4127 MapFramerErrorToProtocolError( | 4027 SPDY_ERROR_GOAWAY_FRAME_CORRUPT, |
4128 SpdyFramer::SPDY_GOAWAY_FRAME_CORRUPT)); | 4028 MapFramerErrorToProtocolError(SpdyFramer::SPDY_GOAWAY_FRAME_CORRUPT)); |
4129 CHECK_EQ(SPDY_ERROR_UNEXPECTED_FRAME, | 4029 CHECK_EQ(SPDY_ERROR_UNEXPECTED_FRAME, |
4130 MapFramerErrorToProtocolError( | 4030 MapFramerErrorToProtocolError(SpdyFramer::SPDY_UNEXPECTED_FRAME)); |
4131 SpdyFramer::SPDY_UNEXPECTED_FRAME)); | |
4132 } | 4031 } |
4133 | 4032 |
4134 TEST(MapRstStreamStatusToProtocolError, MapsValues) { | 4033 TEST(MapRstStreamStatusToProtocolError, MapsValues) { |
4135 CHECK_EQ(STATUS_CODE_PROTOCOL_ERROR, | 4034 CHECK_EQ(STATUS_CODE_PROTOCOL_ERROR, |
4136 MapRstStreamStatusToProtocolError( | 4035 MapRstStreamStatusToProtocolError(RST_STREAM_PROTOCOL_ERROR)); |
4137 RST_STREAM_PROTOCOL_ERROR)); | |
4138 CHECK_EQ(STATUS_CODE_FRAME_SIZE_ERROR, | 4036 CHECK_EQ(STATUS_CODE_FRAME_SIZE_ERROR, |
4139 MapRstStreamStatusToProtocolError( | 4037 MapRstStreamStatusToProtocolError(RST_STREAM_FRAME_SIZE_ERROR)); |
4140 RST_STREAM_FRAME_SIZE_ERROR)); | |
4141 CHECK_EQ(STATUS_CODE_ENHANCE_YOUR_CALM, | 4038 CHECK_EQ(STATUS_CODE_ENHANCE_YOUR_CALM, |
4142 MapRstStreamStatusToProtocolError( | 4039 MapRstStreamStatusToProtocolError(RST_STREAM_ENHANCE_YOUR_CALM)); |
4143 RST_STREAM_ENHANCE_YOUR_CALM)); | |
4144 } | 4040 } |
4145 | 4041 |
4146 } // namespace net | 4042 } // namespace net |
OLD | NEW |