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

Side by Side Diff: net/spdy/spdy_session_unittest.cc

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698