| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/spdy/spdy_session.h" | 5 #include "net/spdy/spdy_session.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/base64.h" | 10 #include "base/base64.h" |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 | 311 |
| 312 session_->CloseSessionOnError(ERR_ABORTED, "Aborting session"); | 312 session_->CloseSessionOnError(ERR_ABORTED, "Aborting session"); |
| 313 | 313 |
| 314 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_ABORTED)); | 314 EXPECT_THAT(callback1.WaitForResult(), IsError(ERR_ABORTED)); |
| 315 } | 315 } |
| 316 | 316 |
| 317 // A session receiving a GOAWAY frame with no active streams should close. | 317 // A session receiving a GOAWAY frame with no active streams should close. |
| 318 TEST_P(SpdySessionTest, GoAwayWithNoActiveStreams) { | 318 TEST_P(SpdySessionTest, GoAwayWithNoActiveStreams) { |
| 319 session_deps_.host_resolver->set_synchronous_mode(true); | 319 session_deps_.host_resolver->set_synchronous_mode(true); |
| 320 | 320 |
| 321 std::unique_ptr<SpdySerializedFrame> goaway( | 321 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(1)); |
| 322 spdy_util_.ConstructSpdyGoAway(1)); | |
| 323 MockRead reads[] = { | 322 MockRead reads[] = { |
| 324 CreateMockRead(*goaway, 0), | 323 CreateMockRead(goaway, 0), |
| 325 }; | 324 }; |
| 326 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); | 325 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); |
| 327 session_deps_.socket_factory->AddSocketDataProvider(&data); | 326 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 328 | 327 |
| 329 CreateNetworkSession(); | 328 CreateNetworkSession(); |
| 330 CreateInsecureSpdySession(); | 329 CreateInsecureSpdySession(); |
| 331 | 330 |
| 332 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); | 331 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); |
| 333 | 332 |
| 334 // Read and process the GOAWAY frame. | 333 // Read and process the GOAWAY frame. |
| 335 base::RunLoop().RunUntilIdle(); | 334 base::RunLoop().RunUntilIdle(); |
| 336 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 335 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
| 337 EXPECT_FALSE(session_); | 336 EXPECT_FALSE(session_); |
| 338 } | 337 } |
| 339 | 338 |
| 340 // A session receiving a GOAWAY frame immediately with no active | 339 // A session receiving a GOAWAY frame immediately with no active |
| 341 // streams should then close. | 340 // streams should then close. |
| 342 TEST_P(SpdySessionTest, GoAwayImmediatelyWithNoActiveStreams) { | 341 TEST_P(SpdySessionTest, GoAwayImmediatelyWithNoActiveStreams) { |
| 343 session_deps_.host_resolver->set_synchronous_mode(true); | 342 session_deps_.host_resolver->set_synchronous_mode(true); |
| 344 | 343 |
| 345 std::unique_ptr<SpdySerializedFrame> goaway( | 344 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(1)); |
| 346 spdy_util_.ConstructSpdyGoAway(1)); | |
| 347 MockRead reads[] = { | 345 MockRead reads[] = { |
| 348 CreateMockRead(*goaway, 0, SYNCHRONOUS), MockRead(ASYNC, 0, 1) // EOF | 346 CreateMockRead(goaway, 0, SYNCHRONOUS), MockRead(ASYNC, 0, 1) // EOF |
| 349 }; | 347 }; |
| 350 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); | 348 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); |
| 351 session_deps_.socket_factory->AddSocketDataProvider(&data); | 349 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 352 | 350 |
| 353 CreateNetworkSession(); | 351 CreateNetworkSession(); |
| 354 | 352 |
| 355 session_ = TryCreateInsecureSpdySessionExpectingFailure( | 353 session_ = TryCreateInsecureSpdySessionExpectingFailure( |
| 356 http_session_.get(), key_, ERR_CONNECTION_CLOSED, BoundNetLog()); | 354 http_session_.get(), key_, ERR_CONNECTION_CLOSED, BoundNetLog()); |
| 357 base::RunLoop().RunUntilIdle(); | 355 base::RunLoop().RunUntilIdle(); |
| 358 | 356 |
| 359 EXPECT_FALSE(session_); | 357 EXPECT_FALSE(session_); |
| 360 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 358 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
| 361 EXPECT_FALSE(data.AllReadDataConsumed()); | 359 EXPECT_FALSE(data.AllReadDataConsumed()); |
| 362 } | 360 } |
| 363 | 361 |
| 364 // A session receiving a GOAWAY frame with active streams should close | 362 // A session receiving a GOAWAY frame with active streams should close |
| 365 // when the last active stream is closed. | 363 // when the last active stream is closed. |
| 366 TEST_P(SpdySessionTest, GoAwayWithActiveStreams) { | 364 TEST_P(SpdySessionTest, GoAwayWithActiveStreams) { |
| 367 session_deps_.host_resolver->set_synchronous_mode(true); | 365 session_deps_.host_resolver->set_synchronous_mode(true); |
| 368 | 366 |
| 369 std::unique_ptr<SpdySerializedFrame> goaway( | 367 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(1)); |
| 370 spdy_util_.ConstructSpdyGoAway(1)); | |
| 371 MockRead reads[] = { | 368 MockRead reads[] = { |
| 372 MockRead(ASYNC, ERR_IO_PENDING, 2), | 369 MockRead(ASYNC, ERR_IO_PENDING, 2), CreateMockRead(goaway, 3), |
| 373 CreateMockRead(*goaway, 3), | 370 MockRead(ASYNC, ERR_IO_PENDING, 4), MockRead(ASYNC, 0, 5) // EOF |
| 374 MockRead(ASYNC, ERR_IO_PENDING, 4), | |
| 375 MockRead(ASYNC, 0, 5) // EOF | |
| 376 }; | 371 }; |
| 377 std::unique_ptr<SpdySerializedFrame> req1( | 372 SpdySerializedFrame req1( |
| 378 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 373 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 379 std::unique_ptr<SpdySerializedFrame> req2( | 374 SpdySerializedFrame req2( |
| 380 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, MEDIUM, true)); | 375 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, MEDIUM, true)); |
| 381 MockWrite writes[] = { | 376 MockWrite writes[] = { |
| 382 CreateMockWrite(*req1, 0), | 377 CreateMockWrite(req1, 0), CreateMockWrite(req2, 1), |
| 383 CreateMockWrite(*req2, 1), | |
| 384 }; | 378 }; |
| 385 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 379 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 386 session_deps_.socket_factory->AddSocketDataProvider(&data); | 380 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 387 | 381 |
| 388 CreateNetworkSession(); | 382 CreateNetworkSession(); |
| 389 CreateInsecureSpdySession(); | 383 CreateInsecureSpdySession(); |
| 390 | 384 |
| 391 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 385 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 392 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 386 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 393 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 387 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 EXPECT_TRUE(session_); | 428 EXPECT_TRUE(session_); |
| 435 data.Resume(); | 429 data.Resume(); |
| 436 base::RunLoop().RunUntilIdle(); | 430 base::RunLoop().RunUntilIdle(); |
| 437 EXPECT_FALSE(session_); | 431 EXPECT_FALSE(session_); |
| 438 } | 432 } |
| 439 | 433 |
| 440 // Regression test for https://crbug.com/547130. | 434 // Regression test for https://crbug.com/547130. |
| 441 TEST_P(SpdySessionTest, GoAwayWithActiveAndCreatedStream) { | 435 TEST_P(SpdySessionTest, GoAwayWithActiveAndCreatedStream) { |
| 442 session_deps_.host_resolver->set_synchronous_mode(true); | 436 session_deps_.host_resolver->set_synchronous_mode(true); |
| 443 | 437 |
| 444 std::unique_ptr<SpdySerializedFrame> goaway( | 438 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(0)); |
| 445 spdy_util_.ConstructSpdyGoAway(0)); | |
| 446 MockRead reads[] = { | 439 MockRead reads[] = { |
| 447 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(*goaway, 2), | 440 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(goaway, 2), |
| 448 }; | 441 }; |
| 449 | 442 |
| 450 // No |req2|, because the second stream will never get activated. | 443 // No |req2|, because the second stream will never get activated. |
| 451 std::unique_ptr<SpdySerializedFrame> req1( | 444 SpdySerializedFrame req1( |
| 452 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 445 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 453 MockWrite writes[] = { | 446 MockWrite writes[] = { |
| 454 CreateMockWrite(*req1, 0), | 447 CreateMockWrite(req1, 0), |
| 455 }; | 448 }; |
| 456 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 449 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 457 session_deps_.socket_factory->AddSocketDataProvider(&data); | 450 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 458 | 451 |
| 459 CreateNetworkSession(); | 452 CreateNetworkSession(); |
| 460 CreateInsecureSpdySession(); | 453 CreateInsecureSpdySession(); |
| 461 | 454 |
| 462 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 455 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 463 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 456 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 464 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 457 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 491 EXPECT_TRUE(data.AllWriteDataConsumed()); | 484 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 492 EXPECT_TRUE(data.AllReadDataConsumed()); | 485 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 493 } | 486 } |
| 494 | 487 |
| 495 // Have a session receive two GOAWAY frames, with the last one causing | 488 // Have a session receive two GOAWAY frames, with the last one causing |
| 496 // the last active stream to be closed. The session should then be | 489 // the last active stream to be closed. The session should then be |
| 497 // closed after the second GOAWAY frame. | 490 // closed after the second GOAWAY frame. |
| 498 TEST_P(SpdySessionTest, GoAwayTwice) { | 491 TEST_P(SpdySessionTest, GoAwayTwice) { |
| 499 session_deps_.host_resolver->set_synchronous_mode(true); | 492 session_deps_.host_resolver->set_synchronous_mode(true); |
| 500 | 493 |
| 501 std::unique_ptr<SpdySerializedFrame> goaway1( | 494 SpdySerializedFrame goaway1(spdy_util_.ConstructSpdyGoAway(1)); |
| 502 spdy_util_.ConstructSpdyGoAway(1)); | 495 SpdySerializedFrame goaway2(spdy_util_.ConstructSpdyGoAway(0)); |
| 503 std::unique_ptr<SpdySerializedFrame> goaway2( | |
| 504 spdy_util_.ConstructSpdyGoAway(0)); | |
| 505 MockRead reads[] = { | 496 MockRead reads[] = { |
| 506 MockRead(ASYNC, ERR_IO_PENDING, 2), | 497 MockRead(ASYNC, ERR_IO_PENDING, 2), CreateMockRead(goaway1, 3), |
| 507 CreateMockRead(*goaway1, 3), | 498 MockRead(ASYNC, ERR_IO_PENDING, 4), CreateMockRead(goaway2, 5), |
| 508 MockRead(ASYNC, ERR_IO_PENDING, 4), | 499 MockRead(ASYNC, ERR_IO_PENDING, 6), MockRead(ASYNC, 0, 7) // EOF |
| 509 CreateMockRead(*goaway2, 5), | |
| 510 MockRead(ASYNC, ERR_IO_PENDING, 6), | |
| 511 MockRead(ASYNC, 0, 7) // EOF | |
| 512 }; | 500 }; |
| 513 std::unique_ptr<SpdySerializedFrame> req1( | 501 SpdySerializedFrame req1( |
| 514 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 502 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 515 std::unique_ptr<SpdySerializedFrame> req2( | 503 SpdySerializedFrame req2( |
| 516 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, MEDIUM, true)); | 504 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, MEDIUM, true)); |
| 517 MockWrite writes[] = { | 505 MockWrite writes[] = { |
| 518 CreateMockWrite(*req1, 0), | 506 CreateMockWrite(req1, 0), CreateMockWrite(req2, 1), |
| 519 CreateMockWrite(*req2, 1), | |
| 520 }; | 507 }; |
| 521 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 508 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 522 session_deps_.socket_factory->AddSocketDataProvider(&data); | 509 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 523 | 510 |
| 524 CreateNetworkSession(); | 511 CreateNetworkSession(); |
| 525 CreateInsecureSpdySession(); | 512 CreateInsecureSpdySession(); |
| 526 | 513 |
| 527 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 514 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 528 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 515 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 529 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 516 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 568 base::RunLoop().RunUntilIdle(); | 555 base::RunLoop().RunUntilIdle(); |
| 569 EXPECT_FALSE(session_); | 556 EXPECT_FALSE(session_); |
| 570 } | 557 } |
| 571 | 558 |
| 572 // Have a session with active streams receive a GOAWAY frame and then | 559 // Have a session with active streams receive a GOAWAY frame and then |
| 573 // close it. It should handle the close properly (i.e., not try to | 560 // close it. It should handle the close properly (i.e., not try to |
| 574 // make itself unavailable in its pool twice). | 561 // make itself unavailable in its pool twice). |
| 575 TEST_P(SpdySessionTest, GoAwayWithActiveStreamsThenClose) { | 562 TEST_P(SpdySessionTest, GoAwayWithActiveStreamsThenClose) { |
| 576 session_deps_.host_resolver->set_synchronous_mode(true); | 563 session_deps_.host_resolver->set_synchronous_mode(true); |
| 577 | 564 |
| 578 std::unique_ptr<SpdySerializedFrame> goaway( | 565 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(1)); |
| 579 spdy_util_.ConstructSpdyGoAway(1)); | |
| 580 MockRead reads[] = { | 566 MockRead reads[] = { |
| 581 MockRead(ASYNC, ERR_IO_PENDING, 2), | 567 MockRead(ASYNC, ERR_IO_PENDING, 2), CreateMockRead(goaway, 3), |
| 582 CreateMockRead(*goaway, 3), | 568 MockRead(ASYNC, ERR_IO_PENDING, 4), MockRead(ASYNC, 0, 5) // EOF |
| 583 MockRead(ASYNC, ERR_IO_PENDING, 4), | |
| 584 MockRead(ASYNC, 0, 5) // EOF | |
| 585 }; | 569 }; |
| 586 std::unique_ptr<SpdySerializedFrame> req1( | 570 SpdySerializedFrame req1( |
| 587 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 571 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 588 std::unique_ptr<SpdySerializedFrame> req2( | 572 SpdySerializedFrame req2( |
| 589 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, MEDIUM, true)); | 573 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, MEDIUM, true)); |
| 590 MockWrite writes[] = { | 574 MockWrite writes[] = { |
| 591 CreateMockWrite(*req1, 0), | 575 CreateMockWrite(req1, 0), CreateMockWrite(req2, 1), |
| 592 CreateMockWrite(*req2, 1), | |
| 593 }; | 576 }; |
| 594 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 577 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 595 session_deps_.socket_factory->AddSocketDataProvider(&data); | 578 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 596 | 579 |
| 597 CreateNetworkSession(); | 580 CreateNetworkSession(); |
| 598 CreateInsecureSpdySession(); | 581 CreateInsecureSpdySession(); |
| 599 | 582 |
| 600 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 583 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 601 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 584 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 602 test::StreamDelegateDoNothing delegate1(spdy_stream1); | 585 test::StreamDelegateDoNothing delegate1(spdy_stream1); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 base::RunLoop().RunUntilIdle(); | 625 base::RunLoop().RunUntilIdle(); |
| 643 EXPECT_FALSE(session_); | 626 EXPECT_FALSE(session_); |
| 644 } | 627 } |
| 645 | 628 |
| 646 // Process a joint read buffer which causes the session to begin draining, and | 629 // Process a joint read buffer which causes the session to begin draining, and |
| 647 // then processes a GOAWAY. The session should gracefully drain. Regression test | 630 // then processes a GOAWAY. The session should gracefully drain. Regression test |
| 648 // for crbug.com/379469 | 631 // for crbug.com/379469 |
| 649 TEST_P(SpdySessionTest, GoAwayWhileDraining) { | 632 TEST_P(SpdySessionTest, GoAwayWhileDraining) { |
| 650 session_deps_.host_resolver->set_synchronous_mode(true); | 633 session_deps_.host_resolver->set_synchronous_mode(true); |
| 651 | 634 |
| 652 std::unique_ptr<SpdySerializedFrame> req( | 635 SpdySerializedFrame req( |
| 653 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 636 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 654 MockWrite writes[] = { | 637 MockWrite writes[] = { |
| 655 CreateMockWrite(*req, 0), | 638 CreateMockWrite(req, 0), |
| 656 }; | 639 }; |
| 657 | 640 |
| 658 std::unique_ptr<SpdySerializedFrame> resp( | 641 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 659 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 642 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(1)); |
| 660 std::unique_ptr<SpdySerializedFrame> goaway( | 643 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 661 spdy_util_.ConstructSpdyGoAway(1)); | 644 size_t joint_size = goaway.size() * 2 + body.size(); |
| 662 std::unique_ptr<SpdySerializedFrame> body( | |
| 663 spdy_util_.ConstructSpdyBodyFrame(1, true)); | |
| 664 size_t joint_size = goaway->size() * 2 + body->size(); | |
| 665 | 645 |
| 666 // Compose interleaved |goaway| and |body| frames into a single read. | 646 // Compose interleaved |goaway| and |body| frames into a single read. |
| 667 std::unique_ptr<char[]> buffer(new char[joint_size]); | 647 std::unique_ptr<char[]> buffer(new char[joint_size]); |
| 668 { | 648 { |
| 669 size_t out = 0; | 649 size_t out = 0; |
| 670 memcpy(&buffer[out], goaway->data(), goaway->size()); | 650 memcpy(&buffer[out], goaway.data(), goaway.size()); |
| 671 out += goaway->size(); | 651 out += goaway.size(); |
| 672 memcpy(&buffer[out], body->data(), body->size()); | 652 memcpy(&buffer[out], body.data(), body.size()); |
| 673 out += body->size(); | 653 out += body.size(); |
| 674 memcpy(&buffer[out], goaway->data(), goaway->size()); | 654 memcpy(&buffer[out], goaway.data(), goaway.size()); |
| 675 out += goaway->size(); | 655 out += goaway.size(); |
| 676 ASSERT_EQ(out, joint_size); | 656 ASSERT_EQ(out, joint_size); |
| 677 } | 657 } |
| 678 SpdySerializedFrame joint_frames(buffer.get(), joint_size, false); | 658 SpdySerializedFrame joint_frames(buffer.get(), joint_size, false); |
| 679 | 659 |
| 680 MockRead reads[] = { | 660 MockRead reads[] = { |
| 681 CreateMockRead(*resp, 1), CreateMockRead(joint_frames, 2), | 661 CreateMockRead(resp, 1), CreateMockRead(joint_frames, 2), |
| 682 MockRead(ASYNC, 0, 3) // EOF | 662 MockRead(ASYNC, 0, 3) // EOF |
| 683 }; | 663 }; |
| 684 | 664 |
| 685 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 665 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 686 session_deps_.socket_factory->AddSocketDataProvider(&data); | 666 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 687 | 667 |
| 688 CreateNetworkSession(); | 668 CreateNetworkSession(); |
| 689 CreateInsecureSpdySession(); | 669 CreateInsecureSpdySession(); |
| 690 | 670 |
| 691 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 671 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| (...skipping 13 matching lines...) Expand all Loading... |
| 705 EXPECT_THAT(delegate.WaitForClose(), IsOk()); | 685 EXPECT_THAT(delegate.WaitForClose(), IsOk()); |
| 706 EXPECT_EQ(kUploadData, delegate.TakeReceivedData()); | 686 EXPECT_EQ(kUploadData, delegate.TakeReceivedData()); |
| 707 EXPECT_FALSE(session_); | 687 EXPECT_FALSE(session_); |
| 708 } | 688 } |
| 709 | 689 |
| 710 // Try to create a stream after receiving a GOAWAY frame. It should | 690 // Try to create a stream after receiving a GOAWAY frame. It should |
| 711 // fail. | 691 // fail. |
| 712 TEST_P(SpdySessionTest, CreateStreamAfterGoAway) { | 692 TEST_P(SpdySessionTest, CreateStreamAfterGoAway) { |
| 713 session_deps_.host_resolver->set_synchronous_mode(true); | 693 session_deps_.host_resolver->set_synchronous_mode(true); |
| 714 | 694 |
| 715 std::unique_ptr<SpdySerializedFrame> goaway( | 695 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(1)); |
| 716 spdy_util_.ConstructSpdyGoAway(1)); | |
| 717 MockRead reads[] = { | 696 MockRead reads[] = { |
| 718 MockRead(ASYNC, ERR_IO_PENDING, 1), | 697 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(goaway, 2), |
| 719 CreateMockRead(*goaway, 2), | 698 MockRead(ASYNC, ERR_IO_PENDING, 3), MockRead(ASYNC, 0, 4) // EOF |
| 720 MockRead(ASYNC, ERR_IO_PENDING, 3), | |
| 721 MockRead(ASYNC, 0, 4) // EOF | |
| 722 }; | 699 }; |
| 723 std::unique_ptr<SpdySerializedFrame> req( | 700 SpdySerializedFrame req( |
| 724 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 701 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 725 MockWrite writes[] = { | 702 MockWrite writes[] = { |
| 726 CreateMockWrite(*req, 0), | 703 CreateMockWrite(req, 0), |
| 727 }; | 704 }; |
| 728 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 705 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 729 session_deps_.socket_factory->AddSocketDataProvider(&data); | 706 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 730 | 707 |
| 731 CreateNetworkSession(); | 708 CreateNetworkSession(); |
| 732 CreateInsecureSpdySession(); | 709 CreateInsecureSpdySession(); |
| 733 | 710 |
| 734 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 711 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 735 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 712 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 736 test::StreamDelegateDoNothing delegate(spdy_stream); | 713 test::StreamDelegateDoNothing delegate(spdy_stream); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 764 data.Resume(); | 741 data.Resume(); |
| 765 base::RunLoop().RunUntilIdle(); | 742 base::RunLoop().RunUntilIdle(); |
| 766 EXPECT_FALSE(session_); | 743 EXPECT_FALSE(session_); |
| 767 } | 744 } |
| 768 | 745 |
| 769 // Receiving a SYN_STREAM frame after a GOAWAY frame should result in | 746 // Receiving a SYN_STREAM frame after a GOAWAY frame should result in |
| 770 // the stream being refused. | 747 // the stream being refused. |
| 771 TEST_P(SpdySessionTest, SynStreamAfterGoAway) { | 748 TEST_P(SpdySessionTest, SynStreamAfterGoAway) { |
| 772 session_deps_.host_resolver->set_synchronous_mode(true); | 749 session_deps_.host_resolver->set_synchronous_mode(true); |
| 773 | 750 |
| 774 std::unique_ptr<SpdySerializedFrame> goaway( | 751 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(1)); |
| 775 spdy_util_.ConstructSpdyGoAway(1)); | 752 SpdySerializedFrame push( |
| 776 std::unique_ptr<SpdySerializedFrame> push( | |
| 777 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, kDefaultUrl)); | 753 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, kDefaultUrl)); |
| 778 MockRead reads[] = { | 754 MockRead reads[] = { |
| 779 MockRead(ASYNC, ERR_IO_PENDING, 1), | 755 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(goaway, 2), |
| 780 CreateMockRead(*goaway, 2), | 756 MockRead(ASYNC, ERR_IO_PENDING, 3), CreateMockRead(push, 4), |
| 781 MockRead(ASYNC, ERR_IO_PENDING, 3), | |
| 782 CreateMockRead(*push, 4), | |
| 783 MockRead(ASYNC, 0, 6) // EOF | 757 MockRead(ASYNC, 0, 6) // EOF |
| 784 }; | 758 }; |
| 785 std::unique_ptr<SpdySerializedFrame> req( | 759 SpdySerializedFrame req( |
| 786 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 760 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 787 std::unique_ptr<SpdySerializedFrame> rst( | 761 SpdySerializedFrame rst( |
| 788 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); | 762 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
| 789 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5)}; | 763 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(rst, 5)}; |
| 790 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 764 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 791 session_deps_.socket_factory->AddSocketDataProvider(&data); | 765 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 792 | 766 |
| 793 CreateNetworkSession(); | 767 CreateNetworkSession(); |
| 794 CreateInsecureSpdySession(); | 768 CreateInsecureSpdySession(); |
| 795 | 769 |
| 796 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 770 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 797 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 771 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 798 test::StreamDelegateDoNothing delegate(spdy_stream); | 772 test::StreamDelegateDoNothing delegate(spdy_stream); |
| 799 spdy_stream->SetDelegate(&delegate); | 773 spdy_stream->SetDelegate(&delegate); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 824 } | 798 } |
| 825 | 799 |
| 826 // A session observing a network change with active streams should close | 800 // A session observing a network change with active streams should close |
| 827 // when the last active stream is closed. | 801 // when the last active stream is closed. |
| 828 TEST_P(SpdySessionTest, NetworkChangeWithActiveStreams) { | 802 TEST_P(SpdySessionTest, NetworkChangeWithActiveStreams) { |
| 829 session_deps_.host_resolver->set_synchronous_mode(true); | 803 session_deps_.host_resolver->set_synchronous_mode(true); |
| 830 | 804 |
| 831 MockRead reads[] = { | 805 MockRead reads[] = { |
| 832 MockRead(ASYNC, ERR_IO_PENDING, 1), MockRead(ASYNC, 0, 2) // EOF | 806 MockRead(ASYNC, ERR_IO_PENDING, 1), MockRead(ASYNC, 0, 2) // EOF |
| 833 }; | 807 }; |
| 834 std::unique_ptr<SpdySerializedFrame> req1( | 808 SpdySerializedFrame req1( |
| 835 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 809 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 836 MockWrite writes[] = { | 810 MockWrite writes[] = { |
| 837 CreateMockWrite(*req1, 0), | 811 CreateMockWrite(req1, 0), |
| 838 }; | 812 }; |
| 839 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 813 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 840 session_deps_.socket_factory->AddSocketDataProvider(&data); | 814 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 841 | 815 |
| 842 CreateNetworkSession(); | 816 CreateNetworkSession(); |
| 843 CreateInsecureSpdySession(); | 817 CreateInsecureSpdySession(); |
| 844 | 818 |
| 845 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 819 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 846 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 820 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 847 test::StreamDelegateDoNothing delegate(spdy_stream); | 821 test::StreamDelegateDoNothing delegate(spdy_stream); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 881 | 855 |
| 882 data.Resume(); | 856 data.Resume(); |
| 883 base::RunLoop().RunUntilIdle(); | 857 base::RunLoop().RunUntilIdle(); |
| 884 EXPECT_FALSE(session_); | 858 EXPECT_FALSE(session_); |
| 885 } | 859 } |
| 886 | 860 |
| 887 TEST_P(SpdySessionTest, ClientPing) { | 861 TEST_P(SpdySessionTest, ClientPing) { |
| 888 session_deps_.enable_ping = true; | 862 session_deps_.enable_ping = true; |
| 889 session_deps_.host_resolver->set_synchronous_mode(true); | 863 session_deps_.host_resolver->set_synchronous_mode(true); |
| 890 | 864 |
| 891 std::unique_ptr<SpdySerializedFrame> read_ping( | 865 SpdySerializedFrame read_ping(spdy_util_.ConstructSpdyPing(1, true)); |
| 892 spdy_util_.ConstructSpdyPing(1, true)); | |
| 893 MockRead reads[] = { | 866 MockRead reads[] = { |
| 894 CreateMockRead(*read_ping, 1), | 867 CreateMockRead(read_ping, 1), MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 895 MockRead(ASYNC, ERR_IO_PENDING, 2), | |
| 896 MockRead(ASYNC, 0, 3) // EOF | 868 MockRead(ASYNC, 0, 3) // EOF |
| 897 }; | 869 }; |
| 898 std::unique_ptr<SpdySerializedFrame> write_ping( | 870 SpdySerializedFrame write_ping(spdy_util_.ConstructSpdyPing(1, false)); |
| 899 spdy_util_.ConstructSpdyPing(1, false)); | |
| 900 MockWrite writes[] = { | 871 MockWrite writes[] = { |
| 901 CreateMockWrite(*write_ping, 0), | 872 CreateMockWrite(write_ping, 0), |
| 902 }; | 873 }; |
| 903 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 874 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 904 session_deps_.socket_factory->AddSocketDataProvider(&data); | 875 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 905 | 876 |
| 906 CreateNetworkSession(); | 877 CreateNetworkSession(); |
| 907 CreateInsecureSpdySession(); | 878 CreateInsecureSpdySession(); |
| 908 | 879 |
| 909 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 880 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 910 SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 881 SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 911 ASSERT_TRUE(spdy_stream1); | 882 ASSERT_TRUE(spdy_stream1); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 934 | 905 |
| 935 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); | 906 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_CONNECTION_CLOSED)); |
| 936 | 907 |
| 937 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); | 908 EXPECT_FALSE(HasSpdySession(spdy_session_pool_, key_)); |
| 938 EXPECT_FALSE(session_); | 909 EXPECT_FALSE(session_); |
| 939 } | 910 } |
| 940 | 911 |
| 941 TEST_P(SpdySessionTest, ServerPing) { | 912 TEST_P(SpdySessionTest, ServerPing) { |
| 942 session_deps_.host_resolver->set_synchronous_mode(true); | 913 session_deps_.host_resolver->set_synchronous_mode(true); |
| 943 | 914 |
| 944 std::unique_ptr<SpdySerializedFrame> read_ping( | 915 SpdySerializedFrame read_ping(spdy_util_.ConstructSpdyPing(2, false)); |
| 945 spdy_util_.ConstructSpdyPing(2, false)); | |
| 946 MockRead reads[] = { | 916 MockRead reads[] = { |
| 947 CreateMockRead(*read_ping), | 917 CreateMockRead(read_ping), MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 948 MockRead(SYNCHRONOUS, 0, 0) // EOF | |
| 949 }; | 918 }; |
| 950 std::unique_ptr<SpdySerializedFrame> write_ping( | 919 SpdySerializedFrame write_ping(spdy_util_.ConstructSpdyPing(2, true)); |
| 951 spdy_util_.ConstructSpdyPing(2, true)); | |
| 952 MockWrite writes[] = { | 920 MockWrite writes[] = { |
| 953 CreateMockWrite(*write_ping), | 921 CreateMockWrite(write_ping), |
| 954 }; | 922 }; |
| 955 StaticSocketDataProvider data( | 923 StaticSocketDataProvider data( |
| 956 reads, arraysize(reads), writes, arraysize(writes)); | 924 reads, arraysize(reads), writes, arraysize(writes)); |
| 957 session_deps_.socket_factory->AddSocketDataProvider(&data); | 925 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 958 | 926 |
| 959 CreateNetworkSession(); | 927 CreateNetworkSession(); |
| 960 CreateInsecureSpdySession(); | 928 CreateInsecureSpdySession(); |
| 961 | 929 |
| 962 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 930 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 963 SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 931 SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 975 } | 943 } |
| 976 | 944 |
| 977 // Cause a ping to be sent out while producing a write. The write loop | 945 // Cause a ping to be sent out while producing a write. The write loop |
| 978 // should handle this properly, i.e. another DoWriteLoop task should | 946 // should handle this properly, i.e. another DoWriteLoop task should |
| 979 // not be posted. This is a regression test for | 947 // not be posted. This is a regression test for |
| 980 // http://crbug.com/261043 . | 948 // http://crbug.com/261043 . |
| 981 TEST_P(SpdySessionTest, PingAndWriteLoop) { | 949 TEST_P(SpdySessionTest, PingAndWriteLoop) { |
| 982 session_deps_.enable_ping = true; | 950 session_deps_.enable_ping = true; |
| 983 session_deps_.time_func = TheNearFuture; | 951 session_deps_.time_func = TheNearFuture; |
| 984 | 952 |
| 985 std::unique_ptr<SpdySerializedFrame> write_ping( | 953 SpdySerializedFrame write_ping(spdy_util_.ConstructSpdyPing(1, false)); |
| 986 spdy_util_.ConstructSpdyPing(1, false)); | 954 SpdySerializedFrame req( |
| 987 std::unique_ptr<SpdySerializedFrame> req( | |
| 988 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 955 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 989 MockWrite writes[] = { | 956 MockWrite writes[] = { |
| 990 CreateMockWrite(*req, 0), | 957 CreateMockWrite(req, 0), CreateMockWrite(write_ping, 1), |
| 991 CreateMockWrite(*write_ping, 1), | |
| 992 }; | 958 }; |
| 993 | 959 |
| 994 MockRead reads[] = { | 960 MockRead reads[] = { |
| 995 MockRead(ASYNC, ERR_IO_PENDING, 2), MockRead(ASYNC, 0, 3) // EOF | 961 MockRead(ASYNC, ERR_IO_PENDING, 2), MockRead(ASYNC, 0, 3) // EOF |
| 996 }; | 962 }; |
| 997 | 963 |
| 998 session_deps_.host_resolver->set_synchronous_mode(true); | 964 session_deps_.host_resolver->set_synchronous_mode(true); |
| 999 | 965 |
| 1000 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 966 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1001 session_deps_.socket_factory->AddSocketDataProvider(&data); | 967 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1027 const SpdyStreamId kLastStreamId = 0x7fffffff; | 993 const SpdyStreamId kLastStreamId = 0x7fffffff; |
| 1028 session_deps_.host_resolver->set_synchronous_mode(true); | 994 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1029 | 995 |
| 1030 // Test setup: |stream_hi_water_mark_| and |max_concurrent_streams_| are | 996 // Test setup: |stream_hi_water_mark_| and |max_concurrent_streams_| are |
| 1031 // fixed to allow for two stream ID assignments, and three concurrent | 997 // fixed to allow for two stream ID assignments, and three concurrent |
| 1032 // streams. Four streams are started, and two are activated. Verify the | 998 // streams. Four streams are started, and two are activated. Verify the |
| 1033 // session goes away, and that the created (but not activated) and | 999 // session goes away, and that the created (but not activated) and |
| 1034 // stalled streams are aborted. Also verify the activated streams complete, | 1000 // stalled streams are aborted. Also verify the activated streams complete, |
| 1035 // at which point the session closes. | 1001 // at which point the session closes. |
| 1036 | 1002 |
| 1037 std::unique_ptr<SpdySerializedFrame> req1( | 1003 SpdySerializedFrame req1( |
| 1038 spdy_util_.ConstructSpdyGet(nullptr, 0, kLastStreamId - 2, MEDIUM, true)); | 1004 spdy_util_.ConstructSpdyGet(nullptr, 0, kLastStreamId - 2, MEDIUM, true)); |
| 1039 std::unique_ptr<SpdySerializedFrame> req2( | 1005 SpdySerializedFrame req2( |
| 1040 spdy_util_.ConstructSpdyGet(nullptr, 0, kLastStreamId, MEDIUM, true)); | 1006 spdy_util_.ConstructSpdyGet(nullptr, 0, kLastStreamId, MEDIUM, true)); |
| 1041 | 1007 |
| 1042 MockWrite writes[] = { | 1008 MockWrite writes[] = { |
| 1043 CreateMockWrite(*req1, 0), CreateMockWrite(*req2, 1), | 1009 CreateMockWrite(req1, 0), CreateMockWrite(req2, 1), |
| 1044 }; | 1010 }; |
| 1045 | 1011 |
| 1046 std::unique_ptr<SpdySerializedFrame> resp1( | 1012 SpdySerializedFrame resp1( |
| 1047 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, kLastStreamId - 2)); | 1013 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, kLastStreamId - 2)); |
| 1048 std::unique_ptr<SpdySerializedFrame> resp2( | 1014 SpdySerializedFrame resp2( |
| 1049 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, kLastStreamId)); | 1015 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, kLastStreamId)); |
| 1050 | 1016 |
| 1051 std::unique_ptr<SpdySerializedFrame> body1( | 1017 SpdySerializedFrame body1( |
| 1052 spdy_util_.ConstructSpdyBodyFrame(kLastStreamId - 2, true)); | 1018 spdy_util_.ConstructSpdyDataFrame(kLastStreamId - 2, true)); |
| 1053 std::unique_ptr<SpdySerializedFrame> body2( | 1019 SpdySerializedFrame body2( |
| 1054 spdy_util_.ConstructSpdyBodyFrame(kLastStreamId, true)); | 1020 spdy_util_.ConstructSpdyDataFrame(kLastStreamId, true)); |
| 1055 | 1021 |
| 1056 MockRead reads[] = { | 1022 MockRead reads[] = { |
| 1057 CreateMockRead(*resp1, 2), | 1023 CreateMockRead(resp1, 2), CreateMockRead(resp2, 3), |
| 1058 CreateMockRead(*resp2, 3), | 1024 MockRead(ASYNC, ERR_IO_PENDING, 4), CreateMockRead(body1, 5), |
| 1059 MockRead(ASYNC, ERR_IO_PENDING, 4), | 1025 CreateMockRead(body2, 6), MockRead(ASYNC, 0, 7) // EOF |
| 1060 CreateMockRead(*body1, 5), | |
| 1061 CreateMockRead(*body2, 6), | |
| 1062 MockRead(ASYNC, 0, 7) // EOF | |
| 1063 }; | 1026 }; |
| 1064 | 1027 |
| 1065 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1028 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1066 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1029 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1067 | 1030 |
| 1068 CreateNetworkSession(); | 1031 CreateNetworkSession(); |
| 1069 CreateInsecureSpdySession(); | 1032 CreateInsecureSpdySession(); |
| 1070 | 1033 |
| 1071 // Fix stream_hi_water_mark_ to allow for two stream activations. | 1034 // Fix stream_hi_water_mark_ to allow for two stream activations. |
| 1072 session_->stream_hi_water_mark_ = kLastStreamId - 2; | 1035 session_->stream_hi_water_mark_ = kLastStreamId - 2; |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1144 } | 1107 } |
| 1145 | 1108 |
| 1146 // Regression test for https://crbug.com/481009. | 1109 // Regression test for https://crbug.com/481009. |
| 1147 TEST_P(SpdySessionTest, MaxConcurrentStreamsZero) { | 1110 TEST_P(SpdySessionTest, MaxConcurrentStreamsZero) { |
| 1148 session_deps_.host_resolver->set_synchronous_mode(true); | 1111 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1149 | 1112 |
| 1150 // Receive SETTINGS frame that sets max_concurrent_streams to zero. | 1113 // Receive SETTINGS frame that sets max_concurrent_streams to zero. |
| 1151 SettingsMap settings_zero; | 1114 SettingsMap settings_zero; |
| 1152 settings_zero[SETTINGS_MAX_CONCURRENT_STREAMS] = | 1115 settings_zero[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 1153 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 0); | 1116 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 0); |
| 1154 std::unique_ptr<SpdySerializedFrame> settings_frame_zero( | 1117 SpdySerializedFrame settings_frame_zero( |
| 1155 spdy_util_.ConstructSpdySettings(settings_zero)); | 1118 spdy_util_.ConstructSpdySettings(settings_zero)); |
| 1156 | 1119 |
| 1157 // Acknowledge it. | 1120 // Acknowledge it. |
| 1158 std::unique_ptr<SpdySerializedFrame> settings_ack0( | 1121 SpdySerializedFrame settings_ack0(spdy_util_.ConstructSpdySettingsAck()); |
| 1159 spdy_util_.ConstructSpdySettingsAck()); | |
| 1160 | 1122 |
| 1161 // Receive SETTINGS frame that sets max_concurrent_streams to one. | 1123 // Receive SETTINGS frame that sets max_concurrent_streams to one. |
| 1162 SettingsMap settings_one; | 1124 SettingsMap settings_one; |
| 1163 settings_one[SETTINGS_MAX_CONCURRENT_STREAMS] = | 1125 settings_one[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 1164 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 1); | 1126 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 1); |
| 1165 std::unique_ptr<SpdySerializedFrame> settings_frame_one( | 1127 SpdySerializedFrame settings_frame_one( |
| 1166 spdy_util_.ConstructSpdySettings(settings_one)); | 1128 spdy_util_.ConstructSpdySettings(settings_one)); |
| 1167 | 1129 |
| 1168 // Acknowledge it. | 1130 // Acknowledge it. |
| 1169 std::unique_ptr<SpdySerializedFrame> settings_ack1( | 1131 SpdySerializedFrame settings_ack1(spdy_util_.ConstructSpdySettingsAck()); |
| 1170 spdy_util_.ConstructSpdySettingsAck()); | |
| 1171 | 1132 |
| 1172 // Request and response. | 1133 // Request and response. |
| 1173 std::unique_ptr<SpdySerializedFrame> req( | 1134 SpdySerializedFrame req( |
| 1174 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 1135 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 1175 | 1136 |
| 1176 std::unique_ptr<SpdySerializedFrame> resp( | 1137 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 1177 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 1178 | 1138 |
| 1179 std::unique_ptr<SpdySerializedFrame> body( | 1139 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1180 spdy_util_.ConstructSpdyBodyFrame(1, true)); | |
| 1181 | 1140 |
| 1182 MockRead reads[] = {CreateMockRead(*settings_frame_zero, 0), | 1141 MockRead reads[] = {CreateMockRead(settings_frame_zero, 0), |
| 1183 MockRead(ASYNC, ERR_IO_PENDING, 2), | 1142 MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 1184 CreateMockRead(*settings_frame_one, 3), | 1143 CreateMockRead(settings_frame_one, 3), |
| 1185 CreateMockRead(*resp, 6), | 1144 CreateMockRead(resp, 6), |
| 1186 CreateMockRead(*body, 7), | 1145 CreateMockRead(body, 7), |
| 1187 MockRead(ASYNC, 0, 8)}; | 1146 MockRead(ASYNC, 0, 8)}; |
| 1188 | 1147 |
| 1189 MockWrite writes[] = {CreateMockWrite(*settings_ack0, 1), | 1148 MockWrite writes[] = {CreateMockWrite(settings_ack0, 1), |
| 1190 CreateMockWrite(*settings_ack1, 4), | 1149 CreateMockWrite(settings_ack1, 4), |
| 1191 CreateMockWrite(*req, 5)}; | 1150 CreateMockWrite(req, 5)}; |
| 1192 | 1151 |
| 1193 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1152 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1194 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1153 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1195 | 1154 |
| 1196 // Create session. | 1155 // Create session. |
| 1197 CreateNetworkSession(); | 1156 CreateNetworkSession(); |
| 1198 CreateInsecureSpdySession(); | 1157 CreateInsecureSpdySession(); |
| 1199 | 1158 |
| 1200 // Receive SETTINGS frame that sets max_concurrent_streams to zero. | 1159 // Receive SETTINGS frame that sets max_concurrent_streams to zero. |
| 1201 base::RunLoop().RunUntilIdle(); | 1160 base::RunLoop().RunUntilIdle(); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1299 | 1258 |
| 1300 EXPECT_EQ(1u, session_->num_created_streams()); | 1259 EXPECT_EQ(1u, session_->num_created_streams()); |
| 1301 EXPECT_EQ(0u, session_->pending_create_stream_queue_size(MEDIUM)); | 1260 EXPECT_EQ(0u, session_->pending_create_stream_queue_size(MEDIUM)); |
| 1302 EXPECT_THAT(callback2.WaitForResult(), IsOk()); | 1261 EXPECT_THAT(callback2.WaitForResult(), IsOk()); |
| 1303 } | 1262 } |
| 1304 | 1263 |
| 1305 TEST_P(SpdySessionTest, DeleteExpiredPushStreams) { | 1264 TEST_P(SpdySessionTest, DeleteExpiredPushStreams) { |
| 1306 session_deps_.host_resolver->set_synchronous_mode(true); | 1265 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1307 session_deps_.time_func = TheNearFuture; | 1266 session_deps_.time_func = TheNearFuture; |
| 1308 | 1267 |
| 1309 std::unique_ptr<SpdySerializedFrame> req( | 1268 SpdySerializedFrame req( |
| 1310 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 1269 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 1311 std::unique_ptr<SpdySerializedFrame> rst( | 1270 SpdySerializedFrame rst( |
| 1312 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); | 1271 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
| 1313 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5)}; | 1272 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(rst, 5)}; |
| 1314 | 1273 |
| 1315 std::unique_ptr<SpdySerializedFrame> push_a(spdy_util_.ConstructSpdyPush( | 1274 SpdySerializedFrame push_a(spdy_util_.ConstructSpdyPush( |
| 1316 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); | 1275 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); |
| 1317 std::unique_ptr<SpdySerializedFrame> push_a_body( | 1276 SpdySerializedFrame push_a_body(spdy_util_.ConstructSpdyDataFrame(2, false)); |
| 1318 spdy_util_.ConstructSpdyBodyFrame(2, false)); | |
| 1319 // In ascii "0" < "a". We use it to verify that we properly handle std::map | 1277 // In ascii "0" < "a". We use it to verify that we properly handle std::map |
| 1320 // iterators inside. See http://crbug.com/443490 | 1278 // iterators inside. See http://crbug.com/443490 |
| 1321 std::unique_ptr<SpdySerializedFrame> push_b(spdy_util_.ConstructSpdyPush( | 1279 SpdySerializedFrame push_b(spdy_util_.ConstructSpdyPush( |
| 1322 nullptr, 0, 4, 1, "https://www.example.org/0.dat")); | 1280 nullptr, 0, 4, 1, "https://www.example.org/0.dat")); |
| 1323 MockRead reads[] = { | 1281 MockRead reads[] = { |
| 1324 CreateMockRead(*push_a, 1), | 1282 CreateMockRead(push_a, 1), CreateMockRead(push_a_body, 2), |
| 1325 CreateMockRead(*push_a_body, 2), | 1283 MockRead(ASYNC, ERR_IO_PENDING, 3), CreateMockRead(push_b, 4), |
| 1326 MockRead(ASYNC, ERR_IO_PENDING, 3), | 1284 MockRead(ASYNC, ERR_IO_PENDING, 6), MockRead(ASYNC, 0, 7) // EOF |
| 1327 CreateMockRead(*push_b, 4), | |
| 1328 MockRead(ASYNC, ERR_IO_PENDING, 6), | |
| 1329 MockRead(ASYNC, 0, 7) // EOF | |
| 1330 }; | 1285 }; |
| 1331 | 1286 |
| 1332 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1287 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1333 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1288 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1334 | 1289 |
| 1335 CreateNetworkSession(); | 1290 CreateNetworkSession(); |
| 1336 CreateInsecureSpdySession(); | 1291 CreateInsecureSpdySession(); |
| 1337 | 1292 |
| 1338 // Process the principal request, and the first push stream request & body. | 1293 // Process the principal request, and the first push stream request & body. |
| 1339 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 1294 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1378 base::RunLoop().RunUntilIdle(); | 1333 base::RunLoop().RunUntilIdle(); |
| 1379 EXPECT_FALSE(session_); | 1334 EXPECT_FALSE(session_); |
| 1380 } | 1335 } |
| 1381 | 1336 |
| 1382 TEST_P(SpdySessionTest, FailedPing) { | 1337 TEST_P(SpdySessionTest, FailedPing) { |
| 1383 session_deps_.host_resolver->set_synchronous_mode(true); | 1338 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1384 | 1339 |
| 1385 MockRead reads[] = { | 1340 MockRead reads[] = { |
| 1386 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 1341 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 1387 }; | 1342 }; |
| 1388 std::unique_ptr<SpdySerializedFrame> write_ping( | 1343 SpdySerializedFrame write_ping(spdy_util_.ConstructSpdyPing(1, false)); |
| 1389 spdy_util_.ConstructSpdyPing(1, false)); | 1344 SpdySerializedFrame goaway( |
| 1390 std::unique_ptr<SpdySerializedFrame> goaway( | |
| 1391 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_PROTOCOL_ERROR, "Failed ping.")); | 1345 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_PROTOCOL_ERROR, "Failed ping.")); |
| 1392 MockWrite writes[] = {CreateMockWrite(*write_ping), CreateMockWrite(*goaway)}; | 1346 MockWrite writes[] = {CreateMockWrite(write_ping), CreateMockWrite(goaway)}; |
| 1393 | 1347 |
| 1394 StaticSocketDataProvider data( | 1348 StaticSocketDataProvider data( |
| 1395 reads, arraysize(reads), writes, arraysize(writes)); | 1349 reads, arraysize(reads), writes, arraysize(writes)); |
| 1396 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1350 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1397 | 1351 |
| 1398 CreateNetworkSession(); | 1352 CreateNetworkSession(); |
| 1399 CreateInsecureSpdySession(); | 1353 CreateInsecureSpdySession(); |
| 1400 | 1354 |
| 1401 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 1355 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 1402 SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 1356 SPDY_BIDIRECTIONAL_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1438 // http://crbug.com/57331 . | 1392 // http://crbug.com/57331 . |
| 1439 TEST_P(SpdySessionTest, OnSettings) { | 1393 TEST_P(SpdySessionTest, OnSettings) { |
| 1440 session_deps_.host_resolver->set_synchronous_mode(true); | 1394 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1441 | 1395 |
| 1442 const SpdySettingsIds kSpdySettingsIds = SETTINGS_MAX_CONCURRENT_STREAMS; | 1396 const SpdySettingsIds kSpdySettingsIds = SETTINGS_MAX_CONCURRENT_STREAMS; |
| 1443 | 1397 |
| 1444 SettingsMap new_settings; | 1398 SettingsMap new_settings; |
| 1445 const uint32_t max_concurrent_streams = kInitialMaxConcurrentStreams + 1; | 1399 const uint32_t max_concurrent_streams = kInitialMaxConcurrentStreams + 1; |
| 1446 new_settings[kSpdySettingsIds] = | 1400 new_settings[kSpdySettingsIds] = |
| 1447 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 1401 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 1448 std::unique_ptr<SpdySerializedFrame> settings_frame( | 1402 SpdySerializedFrame settings_frame( |
| 1449 spdy_util_.ConstructSpdySettings(new_settings)); | 1403 spdy_util_.ConstructSpdySettings(new_settings)); |
| 1450 MockRead reads[] = { | 1404 MockRead reads[] = { |
| 1451 CreateMockRead(*settings_frame, 0), MockRead(ASYNC, ERR_IO_PENDING, 2), | 1405 CreateMockRead(settings_frame, 0), MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 1452 MockRead(ASYNC, 0, 3), | 1406 MockRead(ASYNC, 0, 3), |
| 1453 }; | 1407 }; |
| 1454 | 1408 |
| 1455 std::unique_ptr<SpdySerializedFrame> settings_ack( | 1409 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| 1456 spdy_util_.ConstructSpdySettingsAck()); | 1410 MockWrite writes[] = {CreateMockWrite(settings_ack, 1)}; |
| 1457 MockWrite writes[] = {CreateMockWrite(*settings_ack, 1)}; | |
| 1458 | 1411 |
| 1459 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1412 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1460 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1413 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1461 | 1414 |
| 1462 CreateNetworkSession(); | 1415 CreateNetworkSession(); |
| 1463 CreateInsecureSpdySession(); | 1416 CreateInsecureSpdySession(); |
| 1464 | 1417 |
| 1465 // Create the maximum number of concurrent streams. | 1418 // Create the maximum number of concurrent streams. |
| 1466 for (size_t i = 0; i < kInitialMaxConcurrentStreams; ++i) { | 1419 for (size_t i = 0; i < kInitialMaxConcurrentStreams; ++i) { |
| 1467 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 1420 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1547 TEST_P(SpdySessionTest, SendInitialDataOnNewSession) { | 1500 TEST_P(SpdySessionTest, SendInitialDataOnNewSession) { |
| 1548 session_deps_.host_resolver->set_synchronous_mode(true); | 1501 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1549 | 1502 |
| 1550 MockRead reads[] = { | 1503 MockRead reads[] = { |
| 1551 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 1504 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 1552 }; | 1505 }; |
| 1553 | 1506 |
| 1554 SettingsMap settings; | 1507 SettingsMap settings; |
| 1555 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 1508 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 1556 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); | 1509 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); |
| 1557 std::unique_ptr<SpdySerializedFrame> settings_frame( | 1510 SpdySerializedFrame settings_frame( |
| 1558 spdy_util_.ConstructSpdySettings(settings)); | 1511 spdy_util_.ConstructSpdySettings(settings)); |
| 1559 MockWrite writes[] = {MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix, | 1512 MockWrite writes[] = {MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix, |
| 1560 kHttp2ConnectionHeaderPrefixSize), | 1513 kHttp2ConnectionHeaderPrefixSize), |
| 1561 CreateMockWrite(*settings_frame)}; | 1514 CreateMockWrite(settings_frame)}; |
| 1562 | 1515 |
| 1563 StaticSocketDataProvider data(reads, arraysize(reads), writes, | 1516 StaticSocketDataProvider data(reads, arraysize(reads), writes, |
| 1564 arraysize(writes)); | 1517 arraysize(writes)); |
| 1565 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1518 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1566 | 1519 |
| 1567 // Load a cert that is valid for: | 1520 // Load a cert that is valid for: |
| 1568 // www.example.org | 1521 // www.example.org |
| 1569 // mail.example.org | 1522 // mail.example.org |
| 1570 // mail.example.com | 1523 // mail.example.com |
| 1571 base::FilePath certs_dir = GetTestCertsDirectory(); | 1524 base::FilePath certs_dir = GetTestCertsDirectory(); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1639 NetLog::Source socket_source; | 1592 NetLog::Source socket_source; |
| 1640 EXPECT_TRUE(NetLog::Source::FromEventParameters(entry.params.get(), | 1593 EXPECT_TRUE(NetLog::Source::FromEventParameters(entry.params.get(), |
| 1641 &socket_source)); | 1594 &socket_source)); |
| 1642 EXPECT_TRUE(socket_source.IsValid()); | 1595 EXPECT_TRUE(socket_source.IsValid()); |
| 1643 EXPECT_NE(log_.bound().source().id, socket_source.id); | 1596 EXPECT_NE(log_.bound().source().id, socket_source.id); |
| 1644 } | 1597 } |
| 1645 | 1598 |
| 1646 TEST_P(SpdySessionTest, NetLogOnSessionGoaway) { | 1599 TEST_P(SpdySessionTest, NetLogOnSessionGoaway) { |
| 1647 session_deps_.host_resolver->set_synchronous_mode(true); | 1600 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1648 | 1601 |
| 1649 std::unique_ptr<SpdySerializedFrame> goaway( | 1602 SpdySerializedFrame goaway( |
| 1650 spdy_util_.ConstructSpdyGoAway(42, GOAWAY_ENHANCE_YOUR_CALM, "foo")); | 1603 spdy_util_.ConstructSpdyGoAway(42, GOAWAY_ENHANCE_YOUR_CALM, "foo")); |
| 1651 MockRead reads[] = { | 1604 MockRead reads[] = { |
| 1652 CreateMockRead(*goaway), | 1605 CreateMockRead(goaway), MockRead(SYNCHRONOUS, 0, 0) // EOF |
| 1653 MockRead(SYNCHRONOUS, 0, 0) // EOF | |
| 1654 }; | 1606 }; |
| 1655 | 1607 |
| 1656 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); | 1608 StaticSocketDataProvider data(reads, arraysize(reads), nullptr, 0); |
| 1657 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1609 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1658 | 1610 |
| 1659 CreateNetworkSession(); | 1611 CreateNetworkSession(); |
| 1660 CreateInsecureSpdySession(); | 1612 CreateInsecureSpdySession(); |
| 1661 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); | 1613 EXPECT_TRUE(HasSpdySession(spdy_session_pool_, key_)); |
| 1662 | 1614 |
| 1663 // Flush the read completion task. | 1615 // Flush the read completion task. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1733 TestNetLogEntry entry = entries[pos]; | 1685 TestNetLogEntry entry = entries[pos]; |
| 1734 int error_code = 0; | 1686 int error_code = 0; |
| 1735 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); | 1687 ASSERT_TRUE(entry.GetNetErrorCode(&error_code)); |
| 1736 EXPECT_THAT(error_code, IsError(ERR_CONNECTION_CLOSED)); | 1688 EXPECT_THAT(error_code, IsError(ERR_CONNECTION_CLOSED)); |
| 1737 } else { | 1689 } else { |
| 1738 ADD_FAILURE(); | 1690 ADD_FAILURE(); |
| 1739 } | 1691 } |
| 1740 } | 1692 } |
| 1741 | 1693 |
| 1742 TEST_P(SpdySessionTest, SynCompressionHistograms) { | 1694 TEST_P(SpdySessionTest, SynCompressionHistograms) { |
| 1743 std::unique_ptr<SpdySerializedFrame> req( | 1695 SpdySerializedFrame req( |
| 1744 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 1696 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 1745 MockWrite writes[] = { | 1697 MockWrite writes[] = { |
| 1746 CreateMockWrite(*req, 0), | 1698 CreateMockWrite(req, 0), |
| 1747 }; | 1699 }; |
| 1748 MockRead reads[] = { | 1700 MockRead reads[] = { |
| 1749 MockRead(ASYNC, ERR_IO_PENDING, 1), MockRead(ASYNC, 0, 2) // EOF | 1701 MockRead(ASYNC, ERR_IO_PENDING, 1), MockRead(ASYNC, 0, 2) // EOF |
| 1750 }; | 1702 }; |
| 1751 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1703 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1752 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1704 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1753 | 1705 |
| 1754 CreateNetworkSession(); | 1706 CreateNetworkSession(); |
| 1755 CreateInsecureSpdySession(); | 1707 CreateInsecureSpdySession(); |
| 1756 | 1708 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1777 data.Resume(); | 1729 data.Resume(); |
| 1778 base::RunLoop().RunUntilIdle(); | 1730 base::RunLoop().RunUntilIdle(); |
| 1779 EXPECT_FALSE(session_); | 1731 EXPECT_FALSE(session_); |
| 1780 } | 1732 } |
| 1781 | 1733 |
| 1782 // Queue up a low-priority SYN_STREAM followed by a high-priority | 1734 // Queue up a low-priority SYN_STREAM followed by a high-priority |
| 1783 // one. The high priority one should still send first and receive | 1735 // one. The high priority one should still send first and receive |
| 1784 // first. | 1736 // first. |
| 1785 TEST_P(SpdySessionTest, OutOfOrderSynStreams) { | 1737 TEST_P(SpdySessionTest, OutOfOrderSynStreams) { |
| 1786 // Construct the request. | 1738 // Construct the request. |
| 1787 std::unique_ptr<SpdySerializedFrame> req_highest( | 1739 SpdySerializedFrame req_highest( |
| 1788 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, HIGHEST, true)); | 1740 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, HIGHEST, true)); |
| 1789 std::unique_ptr<SpdySerializedFrame> req_lowest( | 1741 SpdySerializedFrame req_lowest( |
| 1790 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); | 1742 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); |
| 1791 MockWrite writes[] = { | 1743 MockWrite writes[] = { |
| 1792 CreateMockWrite(*req_highest, 0), | 1744 CreateMockWrite(req_highest, 0), CreateMockWrite(req_lowest, 1), |
| 1793 CreateMockWrite(*req_lowest, 1), | |
| 1794 }; | 1745 }; |
| 1795 | 1746 |
| 1796 std::unique_ptr<SpdySerializedFrame> resp_highest( | 1747 SpdySerializedFrame resp_highest( |
| 1797 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 1748 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 1798 std::unique_ptr<SpdySerializedFrame> body_highest( | 1749 SpdySerializedFrame body_highest(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1799 spdy_util_.ConstructSpdyBodyFrame(1, true)); | 1750 SpdySerializedFrame resp_lowest( |
| 1800 std::unique_ptr<SpdySerializedFrame> resp_lowest( | |
| 1801 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 3)); | 1751 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 3)); |
| 1802 std::unique_ptr<SpdySerializedFrame> body_lowest( | 1752 SpdySerializedFrame body_lowest(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 1803 spdy_util_.ConstructSpdyBodyFrame(3, true)); | |
| 1804 MockRead reads[] = { | 1753 MockRead reads[] = { |
| 1805 CreateMockRead(*resp_highest, 2), | 1754 CreateMockRead(resp_highest, 2), CreateMockRead(body_highest, 3), |
| 1806 CreateMockRead(*body_highest, 3), | 1755 CreateMockRead(resp_lowest, 4), CreateMockRead(body_lowest, 5), |
| 1807 CreateMockRead(*resp_lowest, 4), | 1756 MockRead(ASYNC, 0, 6) // EOF |
| 1808 CreateMockRead(*body_lowest, 5), | |
| 1809 MockRead(ASYNC, 0, 6) // EOF | |
| 1810 }; | 1757 }; |
| 1811 | 1758 |
| 1812 session_deps_.host_resolver->set_synchronous_mode(true); | 1759 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1813 | 1760 |
| 1814 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1761 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1815 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1762 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1816 | 1763 |
| 1817 CreateNetworkSession(); | 1764 CreateNetworkSession(); |
| 1818 CreateInsecureSpdySession(); | 1765 CreateInsecureSpdySession(); |
| 1819 | 1766 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1850 | 1797 |
| 1851 EXPECT_FALSE(spdy_stream_lowest); | 1798 EXPECT_FALSE(spdy_stream_lowest); |
| 1852 EXPECT_FALSE(spdy_stream_highest); | 1799 EXPECT_FALSE(spdy_stream_highest); |
| 1853 EXPECT_EQ(3u, delegate_lowest.stream_id()); | 1800 EXPECT_EQ(3u, delegate_lowest.stream_id()); |
| 1854 EXPECT_EQ(1u, delegate_highest.stream_id()); | 1801 EXPECT_EQ(1u, delegate_highest.stream_id()); |
| 1855 } | 1802 } |
| 1856 | 1803 |
| 1857 TEST_P(SpdySessionTest, CancelStream) { | 1804 TEST_P(SpdySessionTest, CancelStream) { |
| 1858 // Request 1, at HIGHEST priority, will be cancelled before it writes data. | 1805 // Request 1, at HIGHEST priority, will be cancelled before it writes data. |
| 1859 // Request 2, at LOWEST priority, will be a full request and will be id 1. | 1806 // Request 2, at LOWEST priority, will be a full request and will be id 1. |
| 1860 std::unique_ptr<SpdySerializedFrame> req2( | 1807 SpdySerializedFrame req2( |
| 1861 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 1808 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 1862 MockWrite writes[] = { | 1809 MockWrite writes[] = { |
| 1863 CreateMockWrite(*req2, 0), | 1810 CreateMockWrite(req2, 0), |
| 1864 }; | 1811 }; |
| 1865 | 1812 |
| 1866 std::unique_ptr<SpdySerializedFrame> resp2( | 1813 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 1867 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 1814 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 1868 std::unique_ptr<SpdySerializedFrame> body2( | |
| 1869 spdy_util_.ConstructSpdyBodyFrame(1, true)); | |
| 1870 MockRead reads[] = { | 1815 MockRead reads[] = { |
| 1871 CreateMockRead(*resp2, 1), | 1816 CreateMockRead(resp2, 1), MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 1872 MockRead(ASYNC, ERR_IO_PENDING, 2), | 1817 CreateMockRead(body2, 3), MockRead(ASYNC, 0, 4) // EOF |
| 1873 CreateMockRead(*body2, 3), | |
| 1874 MockRead(ASYNC, 0, 4) // EOF | |
| 1875 }; | 1818 }; |
| 1876 | 1819 |
| 1877 session_deps_.host_resolver->set_synchronous_mode(true); | 1820 session_deps_.host_resolver->set_synchronous_mode(true); |
| 1878 | 1821 |
| 1879 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 1822 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 1880 session_deps_.socket_factory->AddSocketDataProvider(&data); | 1823 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 1881 | 1824 |
| 1882 CreateNetworkSession(); | 1825 CreateNetworkSession(); |
| 1883 CreateInsecureSpdySession(); | 1826 CreateInsecureSpdySession(); |
| 1884 | 1827 |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2041 | 1984 |
| 2042 base::RunLoop().RunUntilIdle(); | 1985 base::RunLoop().RunUntilIdle(); |
| 2043 EXPECT_FALSE(session_); | 1986 EXPECT_FALSE(session_); |
| 2044 } | 1987 } |
| 2045 | 1988 |
| 2046 // Create two streams that are set to re-close themselves on close, | 1989 // Create two streams that are set to re-close themselves on close, |
| 2047 // activate them, and then close the session. Nothing should blow up. | 1990 // activate them, and then close the session. Nothing should blow up. |
| 2048 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedSelfClosingStreams) { | 1991 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedSelfClosingStreams) { |
| 2049 session_deps_.host_resolver->set_synchronous_mode(true); | 1992 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2050 | 1993 |
| 2051 std::unique_ptr<SpdySerializedFrame> req1( | 1994 SpdySerializedFrame req1( |
| 2052 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 1995 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2053 std::unique_ptr<SpdySerializedFrame> req2( | 1996 SpdySerializedFrame req2( |
| 2054 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, MEDIUM, true)); | 1997 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, MEDIUM, true)); |
| 2055 MockWrite writes[] = { | 1998 MockWrite writes[] = { |
| 2056 CreateMockWrite(*req1, 0), | 1999 CreateMockWrite(req1, 0), CreateMockWrite(req2, 1), |
| 2057 CreateMockWrite(*req2, 1), | |
| 2058 }; | 2000 }; |
| 2059 | 2001 |
| 2060 MockRead reads[] = { | 2002 MockRead reads[] = { |
| 2061 MockRead(ASYNC, ERR_IO_PENDING, 2), MockRead(ASYNC, 0, 3) // EOF | 2003 MockRead(ASYNC, ERR_IO_PENDING, 2), MockRead(ASYNC, 0, 3) // EOF |
| 2062 }; | 2004 }; |
| 2063 | 2005 |
| 2064 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2006 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2065 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2007 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2066 | 2008 |
| 2067 CreateNetworkSession(); | 2009 CreateNetworkSession(); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2115 data.Resume(); | 2057 data.Resume(); |
| 2116 base::RunLoop().RunUntilIdle(); | 2058 base::RunLoop().RunUntilIdle(); |
| 2117 EXPECT_FALSE(session_); | 2059 EXPECT_FALSE(session_); |
| 2118 } | 2060 } |
| 2119 | 2061 |
| 2120 // Create two streams that are set to close each other on close, | 2062 // Create two streams that are set to close each other on close, |
| 2121 // activate them, and then close the session. Nothing should blow up. | 2063 // activate them, and then close the session. Nothing should blow up. |
| 2122 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedMutuallyClosingStreams) { | 2064 TEST_P(SpdySessionTest, CloseSessionWithTwoActivatedMutuallyClosingStreams) { |
| 2123 session_deps_.host_resolver->set_synchronous_mode(true); | 2065 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2124 | 2066 |
| 2125 std::unique_ptr<SpdySerializedFrame> req1( | 2067 SpdySerializedFrame req1( |
| 2126 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2068 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2127 std::unique_ptr<SpdySerializedFrame> req2( | 2069 SpdySerializedFrame req2( |
| 2128 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, MEDIUM, true)); | 2070 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, MEDIUM, true)); |
| 2129 MockWrite writes[] = { | 2071 MockWrite writes[] = { |
| 2130 CreateMockWrite(*req1, 0), | 2072 CreateMockWrite(req1, 0), CreateMockWrite(req2, 1), |
| 2131 CreateMockWrite(*req2, 1), | |
| 2132 }; | 2073 }; |
| 2133 | 2074 |
| 2134 MockRead reads[] = { | 2075 MockRead reads[] = { |
| 2135 MockRead(ASYNC, ERR_IO_PENDING, 2), MockRead(ASYNC, 0, 3) // EOF | 2076 MockRead(ASYNC, ERR_IO_PENDING, 2), MockRead(ASYNC, 0, 3) // EOF |
| 2136 }; | 2077 }; |
| 2137 | 2078 |
| 2138 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2079 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2139 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2080 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2140 | 2081 |
| 2141 CreateNetworkSession(); | 2082 CreateNetworkSession(); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2209 | 2150 |
| 2210 private: | 2151 private: |
| 2211 base::WeakPtr<SpdySession> session_to_close_; | 2152 base::WeakPtr<SpdySession> session_to_close_; |
| 2212 }; | 2153 }; |
| 2213 | 2154 |
| 2214 // Close an activated stream that closes its session. Nothing should | 2155 // Close an activated stream that closes its session. Nothing should |
| 2215 // blow up. This is a regression test for https://crbug.com/263691. | 2156 // blow up. This is a regression test for https://crbug.com/263691. |
| 2216 TEST_P(SpdySessionTest, CloseActivatedStreamThatClosesSession) { | 2157 TEST_P(SpdySessionTest, CloseActivatedStreamThatClosesSession) { |
| 2217 session_deps_.host_resolver->set_synchronous_mode(true); | 2158 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2218 | 2159 |
| 2219 std::unique_ptr<SpdySerializedFrame> req( | 2160 SpdySerializedFrame req( |
| 2220 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2161 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2221 std::unique_ptr<SpdySerializedFrame> rst( | 2162 SpdySerializedFrame rst( |
| 2222 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 2163 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 2223 std::unique_ptr<SpdySerializedFrame> goaway( | 2164 SpdySerializedFrame goaway( |
| 2224 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_PROTOCOL_ERROR, "Error")); | 2165 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_PROTOCOL_ERROR, "Error")); |
| 2225 // The GOAWAY has higher-priority than the RST_STREAM, and is written first | 2166 // The GOAWAY has higher-priority than the RST_STREAM, and is written first |
| 2226 // despite being queued second. | 2167 // despite being queued second. |
| 2227 MockWrite writes[] = { | 2168 MockWrite writes[] = { |
| 2228 CreateMockWrite(*req, 0), | 2169 CreateMockWrite(req, 0), CreateMockWrite(goaway, 1), |
| 2229 CreateMockWrite(*goaway, 1), | 2170 CreateMockWrite(rst, 3), |
| 2230 CreateMockWrite(*rst, 3), | |
| 2231 }; | 2171 }; |
| 2232 | 2172 |
| 2233 MockRead reads[] = { | 2173 MockRead reads[] = { |
| 2234 MockRead(ASYNC, 0, 2) // EOF | 2174 MockRead(ASYNC, 0, 2) // EOF |
| 2235 }; | 2175 }; |
| 2236 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2176 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2237 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2177 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2238 | 2178 |
| 2239 CreateNetworkSession(); | 2179 CreateNetworkSession(); |
| 2240 CreateInsecureSpdySession(); | 2180 CreateInsecureSpdySession(); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2330 | 2270 |
| 2331 TEST_P(SpdySessionTest, CloseTwoStalledCreateStream) { | 2271 TEST_P(SpdySessionTest, CloseTwoStalledCreateStream) { |
| 2332 // TODO(rtenneti): Define a helper class/methods and move the common code in | 2272 // TODO(rtenneti): Define a helper class/methods and move the common code in |
| 2333 // this file. | 2273 // this file. |
| 2334 SettingsMap new_settings; | 2274 SettingsMap new_settings; |
| 2335 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; | 2275 const SpdySettingsIds kSpdySettingsIds1 = SETTINGS_MAX_CONCURRENT_STREAMS; |
| 2336 const uint32_t max_concurrent_streams = 1; | 2276 const uint32_t max_concurrent_streams = 1; |
| 2337 new_settings[kSpdySettingsIds1] = | 2277 new_settings[kSpdySettingsIds1] = |
| 2338 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); | 2278 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); |
| 2339 | 2279 |
| 2340 std::unique_ptr<SpdySerializedFrame> settings_ack( | 2280 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| 2341 spdy_util_.ConstructSpdySettingsAck()); | 2281 SpdySerializedFrame req1( |
| 2342 std::unique_ptr<SpdySerializedFrame> req1( | |
| 2343 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 2282 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 2344 spdy_util_.UpdateWithStreamDestruction(1); | 2283 spdy_util_.UpdateWithStreamDestruction(1); |
| 2345 std::unique_ptr<SpdySerializedFrame> req2( | 2284 SpdySerializedFrame req2( |
| 2346 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); | 2285 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); |
| 2347 spdy_util_.UpdateWithStreamDestruction(3); | 2286 spdy_util_.UpdateWithStreamDestruction(3); |
| 2348 std::unique_ptr<SpdySerializedFrame> req3( | 2287 SpdySerializedFrame req3( |
| 2349 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); | 2288 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); |
| 2350 MockWrite writes[] = { | 2289 MockWrite writes[] = { |
| 2351 CreateMockWrite(*settings_ack, 1), | 2290 CreateMockWrite(settings_ack, 1), CreateMockWrite(req1, 2), |
| 2352 CreateMockWrite(*req1, 2), | 2291 CreateMockWrite(req2, 5), CreateMockWrite(req3, 8), |
| 2353 CreateMockWrite(*req2, 5), | |
| 2354 CreateMockWrite(*req3, 8), | |
| 2355 }; | 2292 }; |
| 2356 | 2293 |
| 2357 // Set up the socket so we read a SETTINGS frame that sets max concurrent | 2294 // Set up the socket so we read a SETTINGS frame that sets max concurrent |
| 2358 // streams to 1. | 2295 // streams to 1. |
| 2359 std::unique_ptr<SpdySerializedFrame> settings_frame( | 2296 SpdySerializedFrame settings_frame( |
| 2360 spdy_util_.ConstructSpdySettings(new_settings)); | 2297 spdy_util_.ConstructSpdySettings(new_settings)); |
| 2361 | 2298 |
| 2362 std::unique_ptr<SpdySerializedFrame> resp1( | 2299 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 2363 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 2300 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2364 std::unique_ptr<SpdySerializedFrame> body1( | |
| 2365 spdy_util_.ConstructSpdyBodyFrame(1, true)); | |
| 2366 | 2301 |
| 2367 std::unique_ptr<SpdySerializedFrame> resp2( | 2302 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 3)); |
| 2368 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 3)); | 2303 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, true)); |
| 2369 std::unique_ptr<SpdySerializedFrame> body2( | |
| 2370 spdy_util_.ConstructSpdyBodyFrame(3, true)); | |
| 2371 | 2304 |
| 2372 std::unique_ptr<SpdySerializedFrame> resp3( | 2305 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 5)); |
| 2373 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 5)); | 2306 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, true)); |
| 2374 std::unique_ptr<SpdySerializedFrame> body3( | |
| 2375 spdy_util_.ConstructSpdyBodyFrame(5, true)); | |
| 2376 | 2307 |
| 2377 MockRead reads[] = { | 2308 MockRead reads[] = { |
| 2378 CreateMockRead(*settings_frame, 0), | 2309 CreateMockRead(settings_frame, 0), |
| 2379 CreateMockRead(*resp1, 3), | 2310 CreateMockRead(resp1, 3), |
| 2380 CreateMockRead(*body1, 4), | 2311 CreateMockRead(body1, 4), |
| 2381 CreateMockRead(*resp2, 6), | 2312 CreateMockRead(resp2, 6), |
| 2382 CreateMockRead(*body2, 7), | 2313 CreateMockRead(body2, 7), |
| 2383 CreateMockRead(*resp3, 9), | 2314 CreateMockRead(resp3, 9), |
| 2384 CreateMockRead(*body3, 10), | 2315 CreateMockRead(body3, 10), |
| 2385 MockRead(ASYNC, ERR_IO_PENDING, 11), | 2316 MockRead(ASYNC, ERR_IO_PENDING, 11), |
| 2386 MockRead(ASYNC, 0, 12) // EOF | 2317 MockRead(ASYNC, 0, 12) // EOF |
| 2387 }; | 2318 }; |
| 2388 | 2319 |
| 2389 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2320 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2390 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2321 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2391 | 2322 |
| 2392 CreateNetworkSession(); | 2323 CreateNetworkSession(); |
| 2393 CreateInsecureSpdySession(); | 2324 CreateInsecureSpdySession(); |
| 2394 | 2325 |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2562 // Test that SpdySession::DoReadLoop reads data from the socket | 2493 // Test that SpdySession::DoReadLoop reads data from the socket |
| 2563 // without yielding. This test makes 32k - 1 bytes of data available | 2494 // without yielding. This test makes 32k - 1 bytes of data available |
| 2564 // on the socket for reading. It then verifies that it has read all | 2495 // on the socket for reading. It then verifies that it has read all |
| 2565 // the available data without yielding. | 2496 // the available data without yielding. |
| 2566 TEST_P(SpdySessionTest, ReadDataWithoutYielding) { | 2497 TEST_P(SpdySessionTest, ReadDataWithoutYielding) { |
| 2567 session_deps_.host_resolver->set_synchronous_mode(true); | 2498 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2568 session_deps_.time_func = InstantaneousReads; | 2499 session_deps_.time_func = InstantaneousReads; |
| 2569 | 2500 |
| 2570 BufferedSpdyFramer framer; | 2501 BufferedSpdyFramer framer; |
| 2571 | 2502 |
| 2572 std::unique_ptr<SpdySerializedFrame> req1( | 2503 SpdySerializedFrame req1( |
| 2573 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2504 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2574 MockWrite writes[] = { | 2505 MockWrite writes[] = { |
| 2575 CreateMockWrite(*req1, 0), | 2506 CreateMockWrite(req1, 0), |
| 2576 }; | 2507 }; |
| 2577 | 2508 |
| 2578 // Build buffer of size kYieldAfterBytesRead / 4 | 2509 // Build buffer of size kYieldAfterBytesRead / 4 |
| 2579 // (-spdy_data_frame_size). | 2510 // (-spdy_data_frame_size). |
| 2580 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); | 2511 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); |
| 2581 const int kPayloadSize = | 2512 const int kPayloadSize = |
| 2582 kYieldAfterBytesRead / 4 - framer.GetControlFrameHeaderSize(); | 2513 kYieldAfterBytesRead / 4 - framer.GetControlFrameHeaderSize(); |
| 2583 TestDataStream test_stream; | 2514 TestDataStream test_stream; |
| 2584 scoped_refptr<IOBuffer> payload(new IOBuffer(kPayloadSize)); | 2515 scoped_refptr<IOBuffer> payload(new IOBuffer(kPayloadSize)); |
| 2585 char* payload_data = payload->data(); | 2516 char* payload_data = payload->data(); |
| 2586 test_stream.GetBytes(payload_data, kPayloadSize); | 2517 test_stream.GetBytes(payload_data, kPayloadSize); |
| 2587 | 2518 |
| 2588 std::unique_ptr<SpdySerializedFrame> partial_data_frame( | 2519 SpdySerializedFrame partial_data_frame(spdy_util_.ConstructSpdyDataFrame( |
| 2589 framer.CreateDataFrame(1, payload_data, kPayloadSize, DATA_FLAG_NONE)); | 2520 1, payload_data, kPayloadSize, /*fin=*/false)); |
| 2590 std::unique_ptr<SpdySerializedFrame> finish_data_frame( | 2521 SpdySerializedFrame finish_data_frame(spdy_util_.ConstructSpdyDataFrame( |
| 2591 framer.CreateDataFrame(1, payload_data, kPayloadSize - 1, DATA_FLAG_FIN)); | 2522 1, payload_data, kPayloadSize - 1, /*fin=*/true)); |
| 2592 | 2523 |
| 2593 std::unique_ptr<SpdySerializedFrame> resp1( | 2524 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 2594 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 2595 | 2525 |
| 2596 // Write 1 byte less than kMaxReadBytes to check that DoRead reads up to 32k | 2526 // Write 1 byte less than kMaxReadBytes to check that DoRead reads up to 32k |
| 2597 // bytes. | 2527 // bytes. |
| 2598 MockRead reads[] = { | 2528 MockRead reads[] = { |
| 2599 CreateMockRead(*resp1, 1), | 2529 CreateMockRead(resp1, 1), |
| 2600 MockRead(ASYNC, ERR_IO_PENDING, 2), | 2530 MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 2601 CreateMockRead(*partial_data_frame, 3), | 2531 CreateMockRead(partial_data_frame, 3), |
| 2602 CreateMockRead(*partial_data_frame, 4, SYNCHRONOUS), | 2532 CreateMockRead(partial_data_frame, 4, SYNCHRONOUS), |
| 2603 CreateMockRead(*partial_data_frame, 5, SYNCHRONOUS), | 2533 CreateMockRead(partial_data_frame, 5, SYNCHRONOUS), |
| 2604 CreateMockRead(*finish_data_frame, 6, SYNCHRONOUS), | 2534 CreateMockRead(finish_data_frame, 6, SYNCHRONOUS), |
| 2605 MockRead(ASYNC, 0, 7) // EOF | 2535 MockRead(ASYNC, 0, 7) // EOF |
| 2606 }; | 2536 }; |
| 2607 | 2537 |
| 2608 // Create SpdySession and SpdyStream and send the request. | 2538 // Create SpdySession and SpdyStream and send the request. |
| 2609 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2539 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2610 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2540 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2611 | 2541 |
| 2612 CreateNetworkSession(); | 2542 CreateNetworkSession(); |
| 2613 CreateInsecureSpdySession(); | 2543 CreateInsecureSpdySession(); |
| 2614 | 2544 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2647 EXPECT_TRUE(data.AllReadDataConsumed()); | 2577 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2648 } | 2578 } |
| 2649 | 2579 |
| 2650 // Test that SpdySession::DoReadLoop yields if more than | 2580 // Test that SpdySession::DoReadLoop yields if more than |
| 2651 // |kYieldAfterDurationMilliseconds| has passed. This test uses a mock time | 2581 // |kYieldAfterDurationMilliseconds| has passed. This test uses a mock time |
| 2652 // function that makes the response frame look very slow to read. | 2582 // function that makes the response frame look very slow to read. |
| 2653 TEST_P(SpdySessionTest, TestYieldingSlowReads) { | 2583 TEST_P(SpdySessionTest, TestYieldingSlowReads) { |
| 2654 session_deps_.host_resolver->set_synchronous_mode(true); | 2584 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2655 session_deps_.time_func = SlowReads; | 2585 session_deps_.time_func = SlowReads; |
| 2656 | 2586 |
| 2657 BufferedSpdyFramer framer; | 2587 SpdySerializedFrame req1( |
| 2658 | |
| 2659 std::unique_ptr<SpdySerializedFrame> req1( | |
| 2660 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2588 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2661 MockWrite writes[] = { | 2589 MockWrite writes[] = { |
| 2662 CreateMockWrite(*req1, 0), | 2590 CreateMockWrite(req1, 0), |
| 2663 }; | 2591 }; |
| 2664 | 2592 |
| 2665 std::unique_ptr<SpdySerializedFrame> resp1( | 2593 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 2666 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 2667 | 2594 |
| 2668 MockRead reads[] = { | 2595 MockRead reads[] = { |
| 2669 CreateMockRead(*resp1, 1), MockRead(ASYNC, 0, 2) // EOF | 2596 CreateMockRead(resp1, 1), MockRead(ASYNC, 0, 2) // EOF |
| 2670 }; | 2597 }; |
| 2671 | 2598 |
| 2672 // Create SpdySession and SpdyStream and send the request. | 2599 // Create SpdySession and SpdyStream and send the request. |
| 2673 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2600 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2674 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2601 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2675 | 2602 |
| 2676 CreateNetworkSession(); | 2603 CreateNetworkSession(); |
| 2677 CreateInsecureSpdySession(); | 2604 CreateInsecureSpdySession(); |
| 2678 | 2605 |
| 2679 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 2606 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2708 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2635 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2709 EXPECT_TRUE(data.AllReadDataConsumed()); | 2636 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2710 } | 2637 } |
| 2711 | 2638 |
| 2712 // Regression test for https://crbug.com/531570. | 2639 // Regression test for https://crbug.com/531570. |
| 2713 // Test the case where DoRead() takes long but returns synchronously. | 2640 // Test the case where DoRead() takes long but returns synchronously. |
| 2714 TEST_P(SpdySessionTest, TestYieldingSlowSynchronousReads) { | 2641 TEST_P(SpdySessionTest, TestYieldingSlowSynchronousReads) { |
| 2715 session_deps_.host_resolver->set_synchronous_mode(true); | 2642 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2716 session_deps_.time_func = SlowReads; | 2643 session_deps_.time_func = SlowReads; |
| 2717 | 2644 |
| 2718 BufferedSpdyFramer framer; | 2645 SpdySerializedFrame req1( |
| 2719 | |
| 2720 std::unique_ptr<SpdySerializedFrame> req1( | |
| 2721 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2646 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2722 MockWrite writes[] = { | 2647 MockWrite writes[] = { |
| 2723 CreateMockWrite(*req1, 0), | 2648 CreateMockWrite(req1, 0), |
| 2724 }; | 2649 }; |
| 2725 | 2650 |
| 2726 std::unique_ptr<SpdySerializedFrame> partial_data_frame( | 2651 SpdySerializedFrame partial_data_frame( |
| 2727 framer.CreateDataFrame(1, "foo ", 4, DATA_FLAG_NONE)); | 2652 spdy_util_.ConstructSpdyDataFrame(1, "foo ", 4, /*fin=*/false)); |
| 2728 std::unique_ptr<SpdySerializedFrame> finish_data_frame( | 2653 SpdySerializedFrame finish_data_frame( |
| 2729 framer.CreateDataFrame(1, "bar", 3, DATA_FLAG_FIN)); | 2654 spdy_util_.ConstructSpdyDataFrame(1, "bar", 3, /*fin=*/true)); |
| 2730 | 2655 |
| 2731 std::unique_ptr<SpdySerializedFrame> resp1( | 2656 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 2732 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 2733 | 2657 |
| 2734 MockRead reads[] = { | 2658 MockRead reads[] = { |
| 2735 CreateMockRead(*resp1, 1), MockRead(ASYNC, ERR_IO_PENDING, 2), | 2659 CreateMockRead(resp1, 1), |
| 2736 CreateMockRead(*partial_data_frame, 3, ASYNC), | 2660 MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 2737 CreateMockRead(*partial_data_frame, 4, SYNCHRONOUS), | 2661 CreateMockRead(partial_data_frame, 3, ASYNC), |
| 2738 CreateMockRead(*partial_data_frame, 5, SYNCHRONOUS), | 2662 CreateMockRead(partial_data_frame, 4, SYNCHRONOUS), |
| 2739 CreateMockRead(*finish_data_frame, 6, SYNCHRONOUS), | 2663 CreateMockRead(partial_data_frame, 5, SYNCHRONOUS), |
| 2664 CreateMockRead(finish_data_frame, 6, SYNCHRONOUS), |
| 2740 MockRead(ASYNC, 0, 7) // EOF | 2665 MockRead(ASYNC, 0, 7) // EOF |
| 2741 }; | 2666 }; |
| 2742 | 2667 |
| 2743 // Create SpdySession and SpdyStream and send the request. | 2668 // Create SpdySession and SpdyStream and send the request. |
| 2744 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2669 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2745 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2670 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2746 | 2671 |
| 2747 CreateNetworkSession(); | 2672 CreateNetworkSession(); |
| 2748 CreateInsecureSpdySession(); | 2673 CreateInsecureSpdySession(); |
| 2749 | 2674 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 2778 // data. This test makes 32k + 1 bytes of data available on the socket | 2703 // data. This test makes 32k + 1 bytes of data available on the socket |
| 2779 // for reading. It then verifies that DoRead has yielded even though | 2704 // for reading. It then verifies that DoRead has yielded even though |
| 2780 // there is data available for it to read (i.e, socket()->Read didn't | 2705 // there is data available for it to read (i.e, socket()->Read didn't |
| 2781 // return ERR_IO_PENDING during socket reads). | 2706 // return ERR_IO_PENDING during socket reads). |
| 2782 TEST_P(SpdySessionTest, TestYieldingDuringReadData) { | 2707 TEST_P(SpdySessionTest, TestYieldingDuringReadData) { |
| 2783 session_deps_.host_resolver->set_synchronous_mode(true); | 2708 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2784 session_deps_.time_func = InstantaneousReads; | 2709 session_deps_.time_func = InstantaneousReads; |
| 2785 | 2710 |
| 2786 BufferedSpdyFramer framer; | 2711 BufferedSpdyFramer framer; |
| 2787 | 2712 |
| 2788 std::unique_ptr<SpdySerializedFrame> req1( | 2713 SpdySerializedFrame req1( |
| 2789 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2714 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2790 MockWrite writes[] = { | 2715 MockWrite writes[] = { |
| 2791 CreateMockWrite(*req1, 0), | 2716 CreateMockWrite(req1, 0), |
| 2792 }; | 2717 }; |
| 2793 | 2718 |
| 2794 // Build buffer of size kYieldAfterBytesRead / 4 | 2719 // Build buffer of size kYieldAfterBytesRead / 4 |
| 2795 // (-spdy_data_frame_size). | 2720 // (-spdy_data_frame_size). |
| 2796 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); | 2721 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); |
| 2797 const int kPayloadSize = | 2722 const int kPayloadSize = |
| 2798 kYieldAfterBytesRead / 4 - framer.GetControlFrameHeaderSize(); | 2723 kYieldAfterBytesRead / 4 - framer.GetControlFrameHeaderSize(); |
| 2799 TestDataStream test_stream; | 2724 TestDataStream test_stream; |
| 2800 scoped_refptr<IOBuffer> payload(new IOBuffer(kPayloadSize)); | 2725 scoped_refptr<IOBuffer> payload(new IOBuffer(kPayloadSize)); |
| 2801 char* payload_data = payload->data(); | 2726 char* payload_data = payload->data(); |
| 2802 test_stream.GetBytes(payload_data, kPayloadSize); | 2727 test_stream.GetBytes(payload_data, kPayloadSize); |
| 2803 | 2728 |
| 2804 std::unique_ptr<SpdySerializedFrame> partial_data_frame( | 2729 SpdySerializedFrame partial_data_frame(spdy_util_.ConstructSpdyDataFrame( |
| 2805 framer.CreateDataFrame(1, payload_data, kPayloadSize, DATA_FLAG_NONE)); | 2730 1, payload_data, kPayloadSize, /*fin=*/false)); |
| 2806 std::unique_ptr<SpdySerializedFrame> finish_data_frame( | 2731 SpdySerializedFrame finish_data_frame( |
| 2807 framer.CreateDataFrame(1, "h", 1, DATA_FLAG_FIN)); | 2732 spdy_util_.ConstructSpdyDataFrame(1, "h", 1, /*fin=*/true)); |
| 2808 | 2733 |
| 2809 std::unique_ptr<SpdySerializedFrame> resp1( | 2734 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 2810 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 2811 | 2735 |
| 2812 // Write 1 byte more than kMaxReadBytes to check that DoRead yields. | 2736 // Write 1 byte more than kMaxReadBytes to check that DoRead yields. |
| 2813 MockRead reads[] = { | 2737 MockRead reads[] = { |
| 2814 CreateMockRead(*resp1, 1), | 2738 CreateMockRead(resp1, 1), |
| 2815 MockRead(ASYNC, ERR_IO_PENDING, 2), | 2739 MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 2816 CreateMockRead(*partial_data_frame, 3), | 2740 CreateMockRead(partial_data_frame, 3), |
| 2817 CreateMockRead(*partial_data_frame, 4, SYNCHRONOUS), | 2741 CreateMockRead(partial_data_frame, 4, SYNCHRONOUS), |
| 2818 CreateMockRead(*partial_data_frame, 5, SYNCHRONOUS), | 2742 CreateMockRead(partial_data_frame, 5, SYNCHRONOUS), |
| 2819 CreateMockRead(*partial_data_frame, 6, SYNCHRONOUS), | 2743 CreateMockRead(partial_data_frame, 6, SYNCHRONOUS), |
| 2820 CreateMockRead(*finish_data_frame, 7, SYNCHRONOUS), | 2744 CreateMockRead(finish_data_frame, 7, SYNCHRONOUS), |
| 2821 MockRead(ASYNC, 0, 8) // EOF | 2745 MockRead(ASYNC, 0, 8) // EOF |
| 2822 }; | 2746 }; |
| 2823 | 2747 |
| 2824 // Create SpdySession and SpdyStream and send the request. | 2748 // Create SpdySession and SpdyStream and send the request. |
| 2825 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2749 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2826 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2750 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2827 | 2751 |
| 2828 CreateNetworkSession(); | 2752 CreateNetworkSession(); |
| 2829 CreateInsecureSpdySession(); | 2753 CreateInsecureSpdySession(); |
| 2830 | 2754 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2872 // will attempt to read again. However, that DoRead() will return | 2796 // will attempt to read again. However, that DoRead() will return |
| 2873 // ERR_IO_PENDING (because of async read), so DoReadLoop() will | 2797 // ERR_IO_PENDING (because of async read), so DoReadLoop() will |
| 2874 // yield. When we come back, DoRead() will read the results from the | 2798 // yield. When we come back, DoRead() will read the results from the |
| 2875 // async read, and rest of the data synchronously. | 2799 // async read, and rest of the data synchronously. |
| 2876 TEST_P(SpdySessionTest, TestYieldingDuringAsyncReadData) { | 2800 TEST_P(SpdySessionTest, TestYieldingDuringAsyncReadData) { |
| 2877 session_deps_.host_resolver->set_synchronous_mode(true); | 2801 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2878 session_deps_.time_func = InstantaneousReads; | 2802 session_deps_.time_func = InstantaneousReads; |
| 2879 | 2803 |
| 2880 BufferedSpdyFramer framer; | 2804 BufferedSpdyFramer framer; |
| 2881 | 2805 |
| 2882 std::unique_ptr<SpdySerializedFrame> req1( | 2806 SpdySerializedFrame req1( |
| 2883 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2807 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2884 MockWrite writes[] = { | 2808 MockWrite writes[] = { |
| 2885 CreateMockWrite(*req1, 0), | 2809 CreateMockWrite(req1, 0), |
| 2886 }; | 2810 }; |
| 2887 | 2811 |
| 2888 // Build buffer of size kYieldAfterBytesRead / 4 | 2812 // Build buffer of size kYieldAfterBytesRead / 4 |
| 2889 // (-spdy_data_frame_size). | 2813 // (-spdy_data_frame_size). |
| 2890 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); | 2814 ASSERT_EQ(32 * 1024, kYieldAfterBytesRead); |
| 2891 TestDataStream test_stream; | 2815 TestDataStream test_stream; |
| 2892 const int kEightKPayloadSize = | 2816 const int kEightKPayloadSize = |
| 2893 kYieldAfterBytesRead / 4 - framer.GetControlFrameHeaderSize(); | 2817 kYieldAfterBytesRead / 4 - framer.GetControlFrameHeaderSize(); |
| 2894 scoped_refptr<IOBuffer> eightk_payload(new IOBuffer(kEightKPayloadSize)); | 2818 scoped_refptr<IOBuffer> eightk_payload(new IOBuffer(kEightKPayloadSize)); |
| 2895 char* eightk_payload_data = eightk_payload->data(); | 2819 char* eightk_payload_data = eightk_payload->data(); |
| 2896 test_stream.GetBytes(eightk_payload_data, kEightKPayloadSize); | 2820 test_stream.GetBytes(eightk_payload_data, kEightKPayloadSize); |
| 2897 | 2821 |
| 2898 // Build buffer of 2k size. | 2822 // Build buffer of 2k size. |
| 2899 TestDataStream test_stream2; | 2823 TestDataStream test_stream2; |
| 2900 const int kTwoKPayloadSize = kEightKPayloadSize - 6 * 1024; | 2824 const int kTwoKPayloadSize = kEightKPayloadSize - 6 * 1024; |
| 2901 scoped_refptr<IOBuffer> twok_payload(new IOBuffer(kTwoKPayloadSize)); | 2825 scoped_refptr<IOBuffer> twok_payload(new IOBuffer(kTwoKPayloadSize)); |
| 2902 char* twok_payload_data = twok_payload->data(); | 2826 char* twok_payload_data = twok_payload->data(); |
| 2903 test_stream2.GetBytes(twok_payload_data, kTwoKPayloadSize); | 2827 test_stream2.GetBytes(twok_payload_data, kTwoKPayloadSize); |
| 2904 | 2828 |
| 2905 std::unique_ptr<SpdySerializedFrame> eightk_data_frame(framer.CreateDataFrame( | 2829 SpdySerializedFrame eightk_data_frame(spdy_util_.ConstructSpdyDataFrame( |
| 2906 1, eightk_payload_data, kEightKPayloadSize, DATA_FLAG_NONE)); | 2830 1, eightk_payload_data, kEightKPayloadSize, /*fin=*/false)); |
| 2907 std::unique_ptr<SpdySerializedFrame> twok_data_frame(framer.CreateDataFrame( | 2831 SpdySerializedFrame twok_data_frame(spdy_util_.ConstructSpdyDataFrame( |
| 2908 1, twok_payload_data, kTwoKPayloadSize, DATA_FLAG_NONE)); | 2832 1, twok_payload_data, kTwoKPayloadSize, /*fin=*/false)); |
| 2909 std::unique_ptr<SpdySerializedFrame> finish_data_frame( | 2833 SpdySerializedFrame finish_data_frame( |
| 2910 framer.CreateDataFrame(1, "h", 1, DATA_FLAG_FIN)); | 2834 spdy_util_.ConstructSpdyDataFrame(1, "h", 1, /*fin=*/true)); |
| 2911 | 2835 |
| 2912 std::unique_ptr<SpdySerializedFrame> resp1( | 2836 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 2913 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 2914 | 2837 |
| 2915 MockRead reads[] = { | 2838 MockRead reads[] = { |
| 2916 CreateMockRead(*resp1, 1), | 2839 CreateMockRead(resp1, 1), |
| 2917 MockRead(ASYNC, ERR_IO_PENDING, 2), | 2840 MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 2918 CreateMockRead(*eightk_data_frame, 3), | 2841 CreateMockRead(eightk_data_frame, 3), |
| 2919 CreateMockRead(*eightk_data_frame, 4, SYNCHRONOUS), | 2842 CreateMockRead(eightk_data_frame, 4, SYNCHRONOUS), |
| 2920 CreateMockRead(*eightk_data_frame, 5, SYNCHRONOUS), | 2843 CreateMockRead(eightk_data_frame, 5, SYNCHRONOUS), |
| 2921 CreateMockRead(*twok_data_frame, 6, SYNCHRONOUS), | 2844 CreateMockRead(twok_data_frame, 6, SYNCHRONOUS), |
| 2922 CreateMockRead(*eightk_data_frame, 7, ASYNC), | 2845 CreateMockRead(eightk_data_frame, 7, ASYNC), |
| 2923 CreateMockRead(*eightk_data_frame, 8, SYNCHRONOUS), | 2846 CreateMockRead(eightk_data_frame, 8, SYNCHRONOUS), |
| 2924 CreateMockRead(*eightk_data_frame, 9, SYNCHRONOUS), | 2847 CreateMockRead(eightk_data_frame, 9, SYNCHRONOUS), |
| 2925 CreateMockRead(*eightk_data_frame, 10, SYNCHRONOUS), | 2848 CreateMockRead(eightk_data_frame, 10, SYNCHRONOUS), |
| 2926 CreateMockRead(*twok_data_frame, 11, SYNCHRONOUS), | 2849 CreateMockRead(twok_data_frame, 11, SYNCHRONOUS), |
| 2927 CreateMockRead(*finish_data_frame, 12, SYNCHRONOUS), | 2850 CreateMockRead(finish_data_frame, 12, SYNCHRONOUS), |
| 2928 MockRead(ASYNC, 0, 13) // EOF | 2851 MockRead(ASYNC, 0, 13) // EOF |
| 2929 }; | 2852 }; |
| 2930 | 2853 |
| 2931 // Create SpdySession and SpdyStream and send the request. | 2854 // Create SpdySession and SpdyStream and send the request. |
| 2932 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2855 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 2933 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2856 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 2934 | 2857 |
| 2935 CreateNetworkSession(); | 2858 CreateNetworkSession(); |
| 2936 CreateInsecureSpdySession(); | 2859 CreateInsecureSpdySession(); |
| 2937 | 2860 |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2969 EXPECT_EQ(1u, observer.executed_count()); | 2892 EXPECT_EQ(1u, observer.executed_count()); |
| 2970 EXPECT_TRUE(data.AllWriteDataConsumed()); | 2893 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 2971 EXPECT_TRUE(data.AllReadDataConsumed()); | 2894 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 2972 } | 2895 } |
| 2973 | 2896 |
| 2974 // Send a GoAway frame when SpdySession is in DoReadLoop. Make sure | 2897 // Send a GoAway frame when SpdySession is in DoReadLoop. Make sure |
| 2975 // nothing blows up. | 2898 // nothing blows up. |
| 2976 TEST_P(SpdySessionTest, GoAwayWhileInDoReadLoop) { | 2899 TEST_P(SpdySessionTest, GoAwayWhileInDoReadLoop) { |
| 2977 session_deps_.host_resolver->set_synchronous_mode(true); | 2900 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2978 | 2901 |
| 2979 BufferedSpdyFramer framer; | 2902 SpdySerializedFrame req1( |
| 2980 | |
| 2981 std::unique_ptr<SpdySerializedFrame> req1( | |
| 2982 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 2903 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 2983 MockWrite writes[] = { | 2904 MockWrite writes[] = { |
| 2984 CreateMockWrite(*req1, 0), | 2905 CreateMockWrite(req1, 0), |
| 2985 }; | 2906 }; |
| 2986 | 2907 |
| 2987 std::unique_ptr<SpdySerializedFrame> resp1( | 2908 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 2988 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 2909 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 2989 std::unique_ptr<SpdySerializedFrame> body1( | 2910 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway()); |
| 2990 spdy_util_.ConstructSpdyBodyFrame(1, true)); | |
| 2991 std::unique_ptr<SpdySerializedFrame> goaway(spdy_util_.ConstructSpdyGoAway()); | |
| 2992 | 2911 |
| 2993 MockRead reads[] = { | 2912 MockRead reads[] = { |
| 2994 CreateMockRead(*resp1, 1), | 2913 CreateMockRead(resp1, 1), MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 2995 MockRead(ASYNC, ERR_IO_PENDING, 2), | 2914 CreateMockRead(body1, 3), CreateMockRead(goaway, 4), |
| 2996 CreateMockRead(*body1, 3), | |
| 2997 CreateMockRead(*goaway, 4), | |
| 2998 }; | 2915 }; |
| 2999 | 2916 |
| 3000 // Create SpdySession and SpdyStream and send the request. | 2917 // Create SpdySession and SpdyStream and send the request. |
| 3001 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 2918 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3002 session_deps_.socket_factory->AddSocketDataProvider(&data); | 2919 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3003 | 2920 |
| 3004 CreateNetworkSession(); | 2921 CreateNetworkSession(); |
| 3005 CreateInsecureSpdySession(); | 2922 CreateInsecureSpdySession(); |
| 3006 | 2923 |
| 3007 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 2924 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3177 // a lower layer pool stalled on the per-pool socket limit. | 3094 // a lower layer pool stalled on the per-pool socket limit. |
| 3178 TEST_P(SpdySessionTest, CloseSessionOnIdleWhenPoolStalled) { | 3095 TEST_P(SpdySessionTest, CloseSessionOnIdleWhenPoolStalled) { |
| 3179 ClientSocketPoolManager::set_max_sockets_per_group( | 3096 ClientSocketPoolManager::set_max_sockets_per_group( |
| 3180 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3097 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 3181 ClientSocketPoolManager::set_max_sockets_per_pool( | 3098 ClientSocketPoolManager::set_max_sockets_per_pool( |
| 3182 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); | 3099 HttpNetworkSession::NORMAL_SOCKET_POOL, 1); |
| 3183 | 3100 |
| 3184 MockRead reads[] = { | 3101 MockRead reads[] = { |
| 3185 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 3102 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 3186 }; | 3103 }; |
| 3187 std::unique_ptr<SpdySerializedFrame> req1( | 3104 SpdySerializedFrame req1( |
| 3188 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3105 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 3189 std::unique_ptr<SpdySerializedFrame> cancel1( | 3106 SpdySerializedFrame cancel1( |
| 3190 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); | 3107 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); |
| 3191 MockWrite writes[] = { | 3108 MockWrite writes[] = { |
| 3192 CreateMockWrite(*req1, 1), | 3109 CreateMockWrite(req1, 1), CreateMockWrite(cancel1, 1), |
| 3193 CreateMockWrite(*cancel1, 1), | |
| 3194 }; | 3110 }; |
| 3195 StaticSocketDataProvider data(reads, arraysize(reads), | 3111 StaticSocketDataProvider data(reads, arraysize(reads), |
| 3196 writes, arraysize(writes)); | 3112 writes, arraysize(writes)); |
| 3197 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3113 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3198 | 3114 |
| 3199 MockRead http_reads[] = { | 3115 MockRead http_reads[] = { |
| 3200 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. | 3116 MockRead(SYNCHRONOUS, ERR_IO_PENDING) // Stall forever. |
| 3201 }; | 3117 }; |
| 3202 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, | 3118 StaticSocketDataProvider http_data(http_reads, arraysize(http_reads), nullptr, |
| 3203 0); | 3119 0); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3319 private: | 3235 private: |
| 3320 const base::WeakPtr<SpdySession> session_; | 3236 const base::WeakPtr<SpdySession> session_; |
| 3321 }; | 3237 }; |
| 3322 | 3238 |
| 3323 // Create another stream in response to a stream being reset. Nothing | 3239 // Create another stream in response to a stream being reset. Nothing |
| 3324 // should blow up. This is a regression test for | 3240 // should blow up. This is a regression test for |
| 3325 // http://crbug.com/263690 . | 3241 // http://crbug.com/263690 . |
| 3326 TEST_P(SpdySessionTest, CreateStreamOnStreamReset) { | 3242 TEST_P(SpdySessionTest, CreateStreamOnStreamReset) { |
| 3327 session_deps_.host_resolver->set_synchronous_mode(true); | 3243 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3328 | 3244 |
| 3329 std::unique_ptr<SpdySerializedFrame> req( | 3245 SpdySerializedFrame req( |
| 3330 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); | 3246 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, MEDIUM, true)); |
| 3331 MockWrite writes[] = { | 3247 MockWrite writes[] = { |
| 3332 CreateMockWrite(*req, 0), | 3248 CreateMockWrite(req, 0), |
| 3333 }; | 3249 }; |
| 3334 | 3250 |
| 3335 std::unique_ptr<SpdySerializedFrame> rst( | 3251 SpdySerializedFrame rst( |
| 3336 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); | 3252 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); |
| 3337 MockRead reads[] = { | 3253 MockRead reads[] = { |
| 3338 MockRead(ASYNC, ERR_IO_PENDING, 1), | 3254 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(rst, 2), |
| 3339 CreateMockRead(*rst, 2), | 3255 MockRead(ASYNC, ERR_IO_PENDING, 3), MockRead(ASYNC, 0, 4) // EOF |
| 3340 MockRead(ASYNC, ERR_IO_PENDING, 3), | |
| 3341 MockRead(ASYNC, 0, 4) // EOF | |
| 3342 }; | 3256 }; |
| 3343 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3257 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3344 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3258 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3345 | 3259 |
| 3346 CreateNetworkSession(); | 3260 CreateNetworkSession(); |
| 3347 CreateInsecureSpdySession(); | 3261 CreateInsecureSpdySession(); |
| 3348 | 3262 |
| 3349 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 3263 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 3350 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); | 3264 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, MEDIUM, BoundNetLog()); |
| 3351 ASSERT_TRUE(spdy_stream); | 3265 ASSERT_TRUE(spdy_stream); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3383 TEST_P(SpdySessionTest, UpdateStreamsSendWindowSize) { | 3297 TEST_P(SpdySessionTest, UpdateStreamsSendWindowSize) { |
| 3384 // Set SETTINGS_INITIAL_WINDOW_SIZE to a small number so that WINDOW_UPDATE | 3298 // Set SETTINGS_INITIAL_WINDOW_SIZE to a small number so that WINDOW_UPDATE |
| 3385 // gets sent. | 3299 // gets sent. |
| 3386 SettingsMap new_settings; | 3300 SettingsMap new_settings; |
| 3387 int32_t window_size = 1; | 3301 int32_t window_size = 1; |
| 3388 new_settings[SETTINGS_INITIAL_WINDOW_SIZE] = | 3302 new_settings[SETTINGS_INITIAL_WINDOW_SIZE] = |
| 3389 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, window_size); | 3303 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, window_size); |
| 3390 | 3304 |
| 3391 // Set up the socket so we read a SETTINGS frame that sets | 3305 // Set up the socket so we read a SETTINGS frame that sets |
| 3392 // INITIAL_WINDOW_SIZE. | 3306 // INITIAL_WINDOW_SIZE. |
| 3393 std::unique_ptr<SpdySerializedFrame> settings_frame( | 3307 SpdySerializedFrame settings_frame( |
| 3394 spdy_util_.ConstructSpdySettings(new_settings)); | 3308 spdy_util_.ConstructSpdySettings(new_settings)); |
| 3395 MockRead reads[] = { | 3309 MockRead reads[] = { |
| 3396 CreateMockRead(*settings_frame, 0), | 3310 CreateMockRead(settings_frame, 0), MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 3397 MockRead(ASYNC, ERR_IO_PENDING, 1), | |
| 3398 MockRead(ASYNC, 0, 2) // EOF | 3311 MockRead(ASYNC, 0, 2) // EOF |
| 3399 }; | 3312 }; |
| 3400 | 3313 |
| 3401 std::unique_ptr<SpdySerializedFrame> settings_ack( | 3314 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| 3402 spdy_util_.ConstructSpdySettingsAck()); | |
| 3403 MockWrite writes[] = { | 3315 MockWrite writes[] = { |
| 3404 CreateMockWrite(*settings_ack, 3), | 3316 CreateMockWrite(settings_ack, 3), |
| 3405 }; | 3317 }; |
| 3406 | 3318 |
| 3407 session_deps_.host_resolver->set_synchronous_mode(true); | 3319 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3408 | 3320 |
| 3409 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3321 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3410 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3322 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3411 | 3323 |
| 3412 CreateNetworkSession(); | 3324 CreateNetworkSession(); |
| 3413 CreateInsecureSpdySession(); | 3325 CreateInsecureSpdySession(); |
| 3414 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 3326 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| (...skipping 30 matching lines...) Expand all Loading... |
| 3445 // sending a WINDOW_UPDATE frame for a large enough delta. | 3357 // sending a WINDOW_UPDATE frame for a large enough delta. |
| 3446 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { | 3358 TEST_P(SpdySessionTest, AdjustRecvWindowSize) { |
| 3447 session_deps_.host_resolver->set_synchronous_mode(true); | 3359 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3448 | 3360 |
| 3449 const int32_t initial_window_size = kDefaultInitialWindowSize; | 3361 const int32_t initial_window_size = kDefaultInitialWindowSize; |
| 3450 const int32_t delta_window_size = 100; | 3362 const int32_t delta_window_size = 100; |
| 3451 | 3363 |
| 3452 MockRead reads[] = { | 3364 MockRead reads[] = { |
| 3453 MockRead(ASYNC, ERR_IO_PENDING, 1), MockRead(ASYNC, 0, 2) // EOF | 3365 MockRead(ASYNC, ERR_IO_PENDING, 1), MockRead(ASYNC, 0, 2) // EOF |
| 3454 }; | 3366 }; |
| 3455 std::unique_ptr<SpdySerializedFrame> window_update( | 3367 SpdySerializedFrame window_update(spdy_util_.ConstructSpdyWindowUpdate( |
| 3456 spdy_util_.ConstructSpdyWindowUpdate( | 3368 kSessionFlowControlStreamId, initial_window_size + delta_window_size)); |
| 3457 kSessionFlowControlStreamId, | |
| 3458 initial_window_size + delta_window_size)); | |
| 3459 MockWrite writes[] = { | 3369 MockWrite writes[] = { |
| 3460 CreateMockWrite(*window_update, 0), | 3370 CreateMockWrite(window_update, 0), |
| 3461 }; | 3371 }; |
| 3462 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3372 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3463 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3373 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3464 | 3374 |
| 3465 CreateNetworkSession(); | 3375 CreateNetworkSession(); |
| 3466 CreateInsecureSpdySession(); | 3376 CreateInsecureSpdySession(); |
| 3467 | 3377 |
| 3468 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); | 3378 EXPECT_EQ(initial_window_size, session_->session_recv_window_size_); |
| 3469 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 3379 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 3470 | 3380 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3522 session_->DecreaseSendWindowSize(delta_window_size); | 3432 session_->DecreaseSendWindowSize(delta_window_size); |
| 3523 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); | 3433 EXPECT_EQ(initial_window_size, session_->session_send_window_size_); |
| 3524 } | 3434 } |
| 3525 | 3435 |
| 3526 // Incoming data for an inactive stream should not cause the session | 3436 // Incoming data for an inactive stream should not cause the session |
| 3527 // receive window size to decrease, but it should cause the unacked | 3437 // receive window size to decrease, but it should cause the unacked |
| 3528 // bytes to increase. | 3438 // bytes to increase. |
| 3529 TEST_P(SpdySessionTest, SessionFlowControlInactiveStream) { | 3439 TEST_P(SpdySessionTest, SessionFlowControlInactiveStream) { |
| 3530 session_deps_.host_resolver->set_synchronous_mode(true); | 3440 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3531 | 3441 |
| 3532 std::unique_ptr<SpdySerializedFrame> resp( | 3442 SpdySerializedFrame resp(spdy_util_.ConstructSpdyDataFrame(1, false)); |
| 3533 spdy_util_.ConstructSpdyBodyFrame(1, false)); | |
| 3534 MockRead reads[] = { | 3443 MockRead reads[] = { |
| 3535 CreateMockRead(*resp, 0), | 3444 CreateMockRead(resp, 0), MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 3536 MockRead(ASYNC, ERR_IO_PENDING, 1), | |
| 3537 MockRead(ASYNC, 0, 2) // EOF | 3445 MockRead(ASYNC, 0, 2) // EOF |
| 3538 }; | 3446 }; |
| 3539 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); | 3447 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); |
| 3540 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3448 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3541 | 3449 |
| 3542 CreateNetworkSession(); | 3450 CreateNetworkSession(); |
| 3543 CreateInsecureSpdySession(); | 3451 CreateInsecureSpdySession(); |
| 3544 | 3452 |
| 3545 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); | 3453 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); |
| 3546 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 3454 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 3547 | 3455 |
| 3548 base::RunLoop().RunUntilIdle(); | 3456 base::RunLoop().RunUntilIdle(); |
| 3549 | 3457 |
| 3550 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); | 3458 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); |
| 3551 EXPECT_EQ(kUploadDataSize, session_->session_unacked_recv_window_bytes_); | 3459 EXPECT_EQ(kUploadDataSize, session_->session_unacked_recv_window_bytes_); |
| 3552 | 3460 |
| 3553 EXPECT_TRUE(session_); | 3461 EXPECT_TRUE(session_); |
| 3554 data.Resume(); | 3462 data.Resume(); |
| 3555 base::RunLoop().RunUntilIdle(); | 3463 base::RunLoop().RunUntilIdle(); |
| 3556 EXPECT_FALSE(session_); | 3464 EXPECT_FALSE(session_); |
| 3557 } | 3465 } |
| 3558 | 3466 |
| 3559 // The frame header is not included in flow control, but frame payload | 3467 // The frame header is not included in flow control, but frame payload |
| 3560 // (including optional pad length and padding) is. | 3468 // (including optional pad length and padding) is. |
| 3561 TEST_P(SpdySessionTest, SessionFlowControlPadding) { | 3469 TEST_P(SpdySessionTest, SessionFlowControlPadding) { |
| 3562 session_deps_.host_resolver->set_synchronous_mode(true); | 3470 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3563 | 3471 |
| 3564 const int padding_length = 42; | 3472 const int padding_length = 42; |
| 3565 std::unique_ptr<SpdySerializedFrame> resp(spdy_util_.ConstructSpdyBodyFrame( | 3473 SpdySerializedFrame resp(spdy_util_.ConstructSpdyDataFrame( |
| 3566 1, kUploadData, kUploadDataSize, false, padding_length)); | 3474 1, kUploadData, kUploadDataSize, false, padding_length)); |
| 3567 MockRead reads[] = { | 3475 MockRead reads[] = { |
| 3568 CreateMockRead(*resp, 0), | 3476 CreateMockRead(resp, 0), MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 3569 MockRead(ASYNC, ERR_IO_PENDING, 1), | |
| 3570 MockRead(ASYNC, 0, 2) // EOF | 3477 MockRead(ASYNC, 0, 2) // EOF |
| 3571 }; | 3478 }; |
| 3572 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); | 3479 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); |
| 3573 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3480 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3574 | 3481 |
| 3575 CreateNetworkSession(); | 3482 CreateNetworkSession(); |
| 3576 CreateInsecureSpdySession(); | 3483 CreateInsecureSpdySession(); |
| 3577 | 3484 |
| 3578 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); | 3485 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); |
| 3579 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); | 3486 EXPECT_EQ(0, session_->session_unacked_recv_window_bytes_); |
| 3580 | 3487 |
| 3581 base::RunLoop().RunUntilIdle(); | 3488 base::RunLoop().RunUntilIdle(); |
| 3582 | 3489 |
| 3583 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); | 3490 EXPECT_EQ(kDefaultInitialWindowSize, session_->session_recv_window_size_); |
| 3584 EXPECT_EQ(kUploadDataSize + padding_length, | 3491 EXPECT_EQ(kUploadDataSize + padding_length, |
| 3585 session_->session_unacked_recv_window_bytes_); | 3492 session_->session_unacked_recv_window_bytes_); |
| 3586 | 3493 |
| 3587 data.Resume(); | 3494 data.Resume(); |
| 3588 base::RunLoop().RunUntilIdle(); | 3495 base::RunLoop().RunUntilIdle(); |
| 3589 EXPECT_FALSE(session_); | 3496 EXPECT_FALSE(session_); |
| 3590 } | 3497 } |
| 3591 | 3498 |
| 3592 // Peer sends more data than stream level receiving flow control window. | 3499 // Peer sends more data than stream level receiving flow control window. |
| 3593 TEST_P(SpdySessionTest, StreamFlowControlTooMuchData) { | 3500 TEST_P(SpdySessionTest, StreamFlowControlTooMuchData) { |
| 3594 const int32_t stream_max_recv_window_size = 1024; | 3501 const int32_t stream_max_recv_window_size = 1024; |
| 3595 const int32_t data_frame_size = 2 * stream_max_recv_window_size; | 3502 const int32_t data_frame_size = 2 * stream_max_recv_window_size; |
| 3596 | 3503 |
| 3597 std::unique_ptr<SpdySerializedFrame> req( | 3504 SpdySerializedFrame req( |
| 3598 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3505 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 3599 std::unique_ptr<SpdySerializedFrame> rst( | 3506 SpdySerializedFrame rst( |
| 3600 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); | 3507 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); |
| 3601 MockWrite writes[] = { | 3508 MockWrite writes[] = { |
| 3602 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), | 3509 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), |
| 3603 }; | 3510 }; |
| 3604 | 3511 |
| 3605 std::unique_ptr<SpdySerializedFrame> resp( | 3512 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 3606 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 3607 const std::string payload(data_frame_size, 'a'); | 3513 const std::string payload(data_frame_size, 'a'); |
| 3608 std::unique_ptr<SpdySerializedFrame> data_frame( | 3514 SpdySerializedFrame data_frame(spdy_util_.ConstructSpdyDataFrame( |
| 3609 spdy_util_.ConstructSpdyBodyFrame(1, payload.data(), data_frame_size, | 3515 1, payload.data(), data_frame_size, false)); |
| 3610 false)); | |
| 3611 MockRead reads[] = { | 3516 MockRead reads[] = { |
| 3612 CreateMockRead(*resp, 1), | 3517 CreateMockRead(resp, 1), MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 3613 MockRead(ASYNC, ERR_IO_PENDING, 2), | 3518 CreateMockRead(data_frame, 3), MockRead(ASYNC, ERR_IO_PENDING, 5), |
| 3614 CreateMockRead(*data_frame, 3), | |
| 3615 MockRead(ASYNC, ERR_IO_PENDING, 5), | |
| 3616 MockRead(ASYNC, 0, 6), | 3519 MockRead(ASYNC, 0, 6), |
| 3617 }; | 3520 }; |
| 3618 | 3521 |
| 3619 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3522 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3620 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3523 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3621 CreateNetworkSession(); | 3524 CreateNetworkSession(); |
| 3622 | 3525 |
| 3623 SpdySessionPoolPeer pool_peer(spdy_session_pool_); | 3526 SpdySessionPoolPeer pool_peer(spdy_session_pool_); |
| 3624 pool_peer.SetStreamInitialRecvWindowSize(stream_max_recv_window_size); | 3527 pool_peer.SetStreamInitialRecvWindowSize(stream_max_recv_window_size); |
| 3625 CreateInsecureSpdySession(); | 3528 CreateInsecureSpdySession(); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3663 ASSERT_GT(session_max_recv_window_size / 2, first_data_frame_size); | 3566 ASSERT_GT(session_max_recv_window_size / 2, first_data_frame_size); |
| 3664 // Second data frame would be fine had there been a WINDOW_UPDATE. | 3567 // Second data frame would be fine had there been a WINDOW_UPDATE. |
| 3665 ASSERT_GT(session_max_recv_window_size, second_data_frame_size); | 3568 ASSERT_GT(session_max_recv_window_size, second_data_frame_size); |
| 3666 // But in fact, the two data frames together overflow the receiving window at | 3569 // But in fact, the two data frames together overflow the receiving window at |
| 3667 // session level. | 3570 // session level. |
| 3668 ASSERT_LT(session_max_recv_window_size, | 3571 ASSERT_LT(session_max_recv_window_size, |
| 3669 first_data_frame_size + second_data_frame_size); | 3572 first_data_frame_size + second_data_frame_size); |
| 3670 | 3573 |
| 3671 session_deps_.host_resolver->set_synchronous_mode(true); | 3574 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3672 | 3575 |
| 3673 std::unique_ptr<SpdySerializedFrame> goaway(spdy_util_.ConstructSpdyGoAway( | 3576 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( |
| 3674 0, GOAWAY_FLOW_CONTROL_ERROR, | 3577 0, GOAWAY_FLOW_CONTROL_ERROR, |
| 3675 "delta_window_size is 400 in DecreaseRecvWindowSize, which is larger " | 3578 "delta_window_size is 400 in DecreaseRecvWindowSize, which is larger " |
| 3676 "than the receive window size of 500")); | 3579 "than the receive window size of 500")); |
| 3677 MockWrite writes[] = { | 3580 MockWrite writes[] = { |
| 3678 CreateMockWrite(*goaway, 4), | 3581 CreateMockWrite(goaway, 4), |
| 3679 }; | 3582 }; |
| 3680 | 3583 |
| 3681 const std::string first_data_frame(first_data_frame_size, 'a'); | 3584 const std::string first_data_frame(first_data_frame_size, 'a'); |
| 3682 std::unique_ptr<SpdySerializedFrame> first(spdy_util_.ConstructSpdyBodyFrame( | 3585 SpdySerializedFrame first(spdy_util_.ConstructSpdyDataFrame( |
| 3683 1, first_data_frame.data(), first_data_frame_size, false)); | 3586 1, first_data_frame.data(), first_data_frame_size, false)); |
| 3684 const std::string second_data_frame(second_data_frame_size, 'b'); | 3587 const std::string second_data_frame(second_data_frame_size, 'b'); |
| 3685 std::unique_ptr<SpdySerializedFrame> second(spdy_util_.ConstructSpdyBodyFrame( | 3588 SpdySerializedFrame second(spdy_util_.ConstructSpdyDataFrame( |
| 3686 1, second_data_frame.data(), second_data_frame_size, false)); | 3589 1, second_data_frame.data(), second_data_frame_size, false)); |
| 3687 MockRead reads[] = { | 3590 MockRead reads[] = { |
| 3688 CreateMockRead(*first, 0), | 3591 CreateMockRead(first, 0), MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 3689 MockRead(ASYNC, ERR_IO_PENDING, 1), | 3592 CreateMockRead(second, 2), MockRead(ASYNC, 0, 3), |
| 3690 CreateMockRead(*second, 2), | |
| 3691 MockRead(ASYNC, 0, 3), | |
| 3692 }; | 3593 }; |
| 3693 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3594 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3694 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3595 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3695 | 3596 |
| 3696 CreateNetworkSession(); | 3597 CreateNetworkSession(); |
| 3697 CreateInsecureSpdySession(); | 3598 CreateInsecureSpdySession(); |
| 3698 // Setting session level receiving window size to smaller than initial is not | 3599 // Setting session level receiving window size to smaller than initial is not |
| 3699 // possible via SpdySessionPoolPeer. | 3600 // possible via SpdySessionPoolPeer. |
| 3700 session_->session_recv_window_size_ = session_max_recv_window_size; | 3601 session_->session_recv_window_size_ = session_max_recv_window_size; |
| 3701 | 3602 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 3722 const int32_t second_data_frame_size = 400; | 3623 const int32_t second_data_frame_size = 400; |
| 3723 | 3624 |
| 3724 // First data frame should not trigger a WINDOW_UPDATE. | 3625 // First data frame should not trigger a WINDOW_UPDATE. |
| 3725 ASSERT_GT(stream_max_recv_window_size / 2, first_data_frame_size); | 3626 ASSERT_GT(stream_max_recv_window_size / 2, first_data_frame_size); |
| 3726 // Second data frame would be fine had there been a WINDOW_UPDATE. | 3627 // Second data frame would be fine had there been a WINDOW_UPDATE. |
| 3727 ASSERT_GT(stream_max_recv_window_size, second_data_frame_size); | 3628 ASSERT_GT(stream_max_recv_window_size, second_data_frame_size); |
| 3728 // But in fact, they should overflow the receiving window at stream level. | 3629 // But in fact, they should overflow the receiving window at stream level. |
| 3729 ASSERT_LT(stream_max_recv_window_size, | 3630 ASSERT_LT(stream_max_recv_window_size, |
| 3730 first_data_frame_size + second_data_frame_size); | 3631 first_data_frame_size + second_data_frame_size); |
| 3731 | 3632 |
| 3732 std::unique_ptr<SpdySerializedFrame> req( | 3633 SpdySerializedFrame req( |
| 3733 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 3634 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 3734 std::unique_ptr<SpdySerializedFrame> rst( | 3635 SpdySerializedFrame rst( |
| 3735 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); | 3636 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); |
| 3736 MockWrite writes[] = { | 3637 MockWrite writes[] = { |
| 3737 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 6), | 3638 CreateMockWrite(req, 0), CreateMockWrite(rst, 6), |
| 3738 }; | 3639 }; |
| 3739 | 3640 |
| 3740 std::unique_ptr<SpdySerializedFrame> resp( | 3641 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 3741 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 3742 const std::string first_data_frame(first_data_frame_size, 'a'); | 3642 const std::string first_data_frame(first_data_frame_size, 'a'); |
| 3743 std::unique_ptr<SpdySerializedFrame> first(spdy_util_.ConstructSpdyBodyFrame( | 3643 SpdySerializedFrame first(spdy_util_.ConstructSpdyDataFrame( |
| 3744 1, first_data_frame.data(), first_data_frame_size, false)); | 3644 1, first_data_frame.data(), first_data_frame_size, false)); |
| 3745 const std::string second_data_frame(second_data_frame_size, 'b'); | 3645 const std::string second_data_frame(second_data_frame_size, 'b'); |
| 3746 std::unique_ptr<SpdySerializedFrame> second(spdy_util_.ConstructSpdyBodyFrame( | 3646 SpdySerializedFrame second(spdy_util_.ConstructSpdyDataFrame( |
| 3747 1, second_data_frame.data(), second_data_frame_size, false)); | 3647 1, second_data_frame.data(), second_data_frame_size, false)); |
| 3748 MockRead reads[] = { | 3648 MockRead reads[] = { |
| 3749 CreateMockRead(*resp, 1), | 3649 CreateMockRead(resp, 1), MockRead(ASYNC, ERR_IO_PENDING, 2), |
| 3750 MockRead(ASYNC, ERR_IO_PENDING, 2), | 3650 CreateMockRead(first, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), |
| 3751 CreateMockRead(*first, 3), | 3651 CreateMockRead(second, 5), MockRead(ASYNC, ERR_IO_PENDING, 7), |
| 3752 MockRead(ASYNC, ERR_IO_PENDING, 4), | |
| 3753 CreateMockRead(*second, 5), | |
| 3754 MockRead(ASYNC, ERR_IO_PENDING, 7), | |
| 3755 MockRead(ASYNC, 0, 8), | 3652 MockRead(ASYNC, 0, 8), |
| 3756 }; | 3653 }; |
| 3757 | 3654 |
| 3758 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3655 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3759 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3656 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3760 | 3657 |
| 3761 CreateNetworkSession(); | 3658 CreateNetworkSession(); |
| 3762 SpdySessionPoolPeer pool_peer(spdy_session_pool_); | 3659 SpdySessionPoolPeer pool_peer(spdy_session_pool_); |
| 3763 pool_peer.SetStreamInitialRecvWindowSize(stream_max_recv_window_size); | 3660 pool_peer.SetStreamInitialRecvWindowSize(stream_max_recv_window_size); |
| 3764 | 3661 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3816 void OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) override {} | 3713 void OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) override {} |
| 3817 }; | 3714 }; |
| 3818 | 3715 |
| 3819 // Send data back and forth but use a delegate that drops its received | 3716 // Send data back and forth but use a delegate that drops its received |
| 3820 // data. The receive window should still increase to its original | 3717 // data. The receive window should still increase to its original |
| 3821 // value, i.e. we shouldn't "leak" receive window bytes. | 3718 // value, i.e. we shouldn't "leak" receive window bytes. |
| 3822 TEST_P(SpdySessionTest, SessionFlowControlNoReceiveLeaks) { | 3719 TEST_P(SpdySessionTest, SessionFlowControlNoReceiveLeaks) { |
| 3823 const int32_t kMsgDataSize = 100; | 3720 const int32_t kMsgDataSize = 100; |
| 3824 const std::string msg_data(kMsgDataSize, 'a'); | 3721 const std::string msg_data(kMsgDataSize, 'a'); |
| 3825 | 3722 |
| 3826 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 3723 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 3827 kDefaultUrl, 1, kMsgDataSize, MEDIUM, nullptr, 0)); | 3724 kDefaultUrl, 1, kMsgDataSize, MEDIUM, nullptr, 0)); |
| 3828 std::unique_ptr<SpdySerializedFrame> msg(spdy_util_.ConstructSpdyBodyFrame( | 3725 SpdySerializedFrame msg(spdy_util_.ConstructSpdyDataFrame( |
| 3829 1, msg_data.data(), kMsgDataSize, false)); | 3726 1, msg_data.data(), kMsgDataSize, false)); |
| 3830 MockWrite writes[] = { | 3727 MockWrite writes[] = { |
| 3831 CreateMockWrite(*req, 0), | 3728 CreateMockWrite(req, 0), CreateMockWrite(msg, 2), |
| 3832 CreateMockWrite(*msg, 2), | |
| 3833 }; | 3729 }; |
| 3834 | 3730 |
| 3835 std::unique_ptr<SpdySerializedFrame> resp( | 3731 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 3836 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 3732 SpdySerializedFrame echo(spdy_util_.ConstructSpdyDataFrame( |
| 3837 std::unique_ptr<SpdySerializedFrame> echo(spdy_util_.ConstructSpdyBodyFrame( | |
| 3838 1, msg_data.data(), kMsgDataSize, false)); | 3733 1, msg_data.data(), kMsgDataSize, false)); |
| 3839 std::unique_ptr<SpdySerializedFrame> window_update( | 3734 SpdySerializedFrame window_update(spdy_util_.ConstructSpdyWindowUpdate( |
| 3840 spdy_util_.ConstructSpdyWindowUpdate(kSessionFlowControlStreamId, | 3735 kSessionFlowControlStreamId, kMsgDataSize)); |
| 3841 kMsgDataSize)); | |
| 3842 MockRead reads[] = { | 3736 MockRead reads[] = { |
| 3843 CreateMockRead(*resp, 1), | 3737 CreateMockRead(resp, 1), CreateMockRead(echo, 3), |
| 3844 CreateMockRead(*echo, 3), | 3738 MockRead(ASYNC, ERR_IO_PENDING, 4), MockRead(ASYNC, 0, 5) // EOF |
| 3845 MockRead(ASYNC, ERR_IO_PENDING, 4), | |
| 3846 MockRead(ASYNC, 0, 5) // EOF | |
| 3847 }; | 3739 }; |
| 3848 | 3740 |
| 3849 // Create SpdySession and SpdyStream and send the request. | 3741 // Create SpdySession and SpdyStream and send the request. |
| 3850 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3742 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3851 session_deps_.host_resolver->set_synchronous_mode(true); | 3743 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3852 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3744 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3853 | 3745 |
| 3854 CreateNetworkSession(); | 3746 CreateNetworkSession(); |
| 3855 CreateInsecureSpdySession(); | 3747 CreateInsecureSpdySession(); |
| 3856 | 3748 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3890 EXPECT_FALSE(session_); | 3782 EXPECT_FALSE(session_); |
| 3891 } | 3783 } |
| 3892 | 3784 |
| 3893 // Send data back and forth but close the stream before its data frame | 3785 // Send data back and forth but close the stream before its data frame |
| 3894 // can be written to the socket. The send window should then increase | 3786 // can be written to the socket. The send window should then increase |
| 3895 // to its original value, i.e. we shouldn't "leak" send window bytes. | 3787 // to its original value, i.e. we shouldn't "leak" send window bytes. |
| 3896 TEST_P(SpdySessionTest, SessionFlowControlNoSendLeaks) { | 3788 TEST_P(SpdySessionTest, SessionFlowControlNoSendLeaks) { |
| 3897 const int32_t kMsgDataSize = 100; | 3789 const int32_t kMsgDataSize = 100; |
| 3898 const std::string msg_data(kMsgDataSize, 'a'); | 3790 const std::string msg_data(kMsgDataSize, 'a'); |
| 3899 | 3791 |
| 3900 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 3792 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 3901 kDefaultUrl, 1, kMsgDataSize, MEDIUM, nullptr, 0)); | 3793 kDefaultUrl, 1, kMsgDataSize, MEDIUM, nullptr, 0)); |
| 3902 MockWrite writes[] = { | 3794 MockWrite writes[] = { |
| 3903 CreateMockWrite(*req, 0), | 3795 CreateMockWrite(req, 0), |
| 3904 }; | 3796 }; |
| 3905 | 3797 |
| 3906 std::unique_ptr<SpdySerializedFrame> resp( | 3798 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 3907 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | |
| 3908 MockRead reads[] = { | 3799 MockRead reads[] = { |
| 3909 MockRead(ASYNC, ERR_IO_PENDING, 1), | 3800 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(resp, 2), |
| 3910 CreateMockRead(*resp, 2), | |
| 3911 MockRead(ASYNC, 0, 3) // EOF | 3801 MockRead(ASYNC, 0, 3) // EOF |
| 3912 }; | 3802 }; |
| 3913 | 3803 |
| 3914 // Create SpdySession and SpdyStream and send the request. | 3804 // Create SpdySession and SpdyStream and send the request. |
| 3915 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3805 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 3916 session_deps_.host_resolver->set_synchronous_mode(true); | 3806 session_deps_.host_resolver->set_synchronous_mode(true); |
| 3917 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3807 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 3918 | 3808 |
| 3919 CreateNetworkSession(); | 3809 CreateNetworkSession(); |
| 3920 CreateInsecureSpdySession(); | 3810 CreateInsecureSpdySession(); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3962 EXPECT_TRUE(data.AllWriteDataConsumed()); | 3852 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 3963 EXPECT_TRUE(data.AllReadDataConsumed()); | 3853 EXPECT_TRUE(data.AllReadDataConsumed()); |
| 3964 } | 3854 } |
| 3965 | 3855 |
| 3966 // Send data back and forth; the send and receive windows should | 3856 // Send data back and forth; the send and receive windows should |
| 3967 // change appropriately. | 3857 // change appropriately. |
| 3968 TEST_P(SpdySessionTest, SessionFlowControlEndToEnd) { | 3858 TEST_P(SpdySessionTest, SessionFlowControlEndToEnd) { |
| 3969 const int32_t kMsgDataSize = 100; | 3859 const int32_t kMsgDataSize = 100; |
| 3970 const std::string msg_data(kMsgDataSize, 'a'); | 3860 const std::string msg_data(kMsgDataSize, 'a'); |
| 3971 | 3861 |
| 3972 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 3862 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 3973 kDefaultUrl, 1, kMsgDataSize, MEDIUM, nullptr, 0)); | 3863 kDefaultUrl, 1, kMsgDataSize, MEDIUM, nullptr, 0)); |
| 3974 std::unique_ptr<SpdySerializedFrame> msg(spdy_util_.ConstructSpdyBodyFrame( | 3864 SpdySerializedFrame msg(spdy_util_.ConstructSpdyDataFrame( |
| 3975 1, msg_data.data(), kMsgDataSize, false)); | 3865 1, msg_data.data(), kMsgDataSize, false)); |
| 3976 MockWrite writes[] = { | 3866 MockWrite writes[] = { |
| 3977 CreateMockWrite(*req, 0), | 3867 CreateMockWrite(req, 0), CreateMockWrite(msg, 2), |
| 3978 CreateMockWrite(*msg, 2), | |
| 3979 }; | 3868 }; |
| 3980 | 3869 |
| 3981 std::unique_ptr<SpdySerializedFrame> resp( | 3870 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 3982 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 3871 SpdySerializedFrame echo(spdy_util_.ConstructSpdyDataFrame( |
| 3983 std::unique_ptr<SpdySerializedFrame> echo(spdy_util_.ConstructSpdyBodyFrame( | |
| 3984 1, msg_data.data(), kMsgDataSize, false)); | 3872 1, msg_data.data(), kMsgDataSize, false)); |
| 3985 std::unique_ptr<SpdySerializedFrame> window_update( | 3873 SpdySerializedFrame window_update(spdy_util_.ConstructSpdyWindowUpdate( |
| 3986 spdy_util_.ConstructSpdyWindowUpdate(kSessionFlowControlStreamId, | 3874 kSessionFlowControlStreamId, kMsgDataSize)); |
| 3987 kMsgDataSize)); | |
| 3988 MockRead reads[] = { | 3875 MockRead reads[] = { |
| 3989 CreateMockRead(*resp, 1), | 3876 CreateMockRead(resp, 1), |
| 3990 MockRead(ASYNC, ERR_IO_PENDING, 3), | 3877 MockRead(ASYNC, ERR_IO_PENDING, 3), |
| 3991 CreateMockRead(*echo, 4), | 3878 CreateMockRead(echo, 4), |
| 3992 MockRead(ASYNC, ERR_IO_PENDING, 5), | 3879 MockRead(ASYNC, ERR_IO_PENDING, 5), |
| 3993 CreateMockRead(*window_update, 6), | 3880 CreateMockRead(window_update, 6), |
| 3994 MockRead(ASYNC, ERR_IO_PENDING, 7), | 3881 MockRead(ASYNC, ERR_IO_PENDING, 7), |
| 3995 MockRead(ASYNC, 0, 8) // EOF | 3882 MockRead(ASYNC, 0, 8) // EOF |
| 3996 }; | 3883 }; |
| 3997 | 3884 |
| 3998 // Create SpdySession and SpdyStream and send the request. | 3885 // Create SpdySession and SpdyStream and send the request. |
| 3999 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3886 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4000 session_deps_.host_resolver->set_synchronous_mode(true); | 3887 session_deps_.host_resolver->set_synchronous_mode(true); |
| 4001 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3888 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 4002 | 3889 |
| 4003 CreateNetworkSession(); | 3890 CreateNetworkSession(); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4071 EXPECT_FALSE(session_); | 3958 EXPECT_FALSE(session_); |
| 4072 } | 3959 } |
| 4073 | 3960 |
| 4074 // Given a stall function and an unstall function, runs a test to make | 3961 // Given a stall function and an unstall function, runs a test to make |
| 4075 // sure that a stream resumes after unstall. | 3962 // sure that a stream resumes after unstall. |
| 4076 void SpdySessionTest::RunResumeAfterUnstallTest( | 3963 void SpdySessionTest::RunResumeAfterUnstallTest( |
| 4077 const base::Callback<void(SpdyStream*)>& stall_function, | 3964 const base::Callback<void(SpdyStream*)>& stall_function, |
| 4078 const base::Callback<void(SpdyStream*, int32_t)>& unstall_function) { | 3965 const base::Callback<void(SpdyStream*, int32_t)>& unstall_function) { |
| 4079 session_deps_.host_resolver->set_synchronous_mode(true); | 3966 session_deps_.host_resolver->set_synchronous_mode(true); |
| 4080 | 3967 |
| 4081 std::unique_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost( | 3968 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( |
| 4082 kDefaultUrl, 1, kBodyDataSize, LOWEST, nullptr, 0)); | 3969 kDefaultUrl, 1, kBodyDataSize, LOWEST, nullptr, 0)); |
| 4083 std::unique_ptr<SpdySerializedFrame> body( | 3970 SpdySerializedFrame body( |
| 4084 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, true)); | 3971 spdy_util_.ConstructSpdyDataFrame(1, kBodyData, kBodyDataSize, true)); |
| 4085 MockWrite writes[] = { | 3972 MockWrite writes[] = { |
| 4086 CreateMockWrite(*req, 0), | 3973 CreateMockWrite(req, 0), CreateMockWrite(body, 1), |
| 4087 CreateMockWrite(*body, 1), | |
| 4088 }; | 3974 }; |
| 4089 | 3975 |
| 4090 std::unique_ptr<SpdySerializedFrame> resp( | 3976 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 4091 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 3977 SpdySerializedFrame echo( |
| 4092 std::unique_ptr<SpdySerializedFrame> echo( | 3978 spdy_util_.ConstructSpdyDataFrame(1, kBodyData, kBodyDataSize, false)); |
| 4093 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); | |
| 4094 MockRead reads[] = { | 3979 MockRead reads[] = { |
| 4095 CreateMockRead(*resp, 2), MockRead(ASYNC, 0, 3) // EOF | 3980 CreateMockRead(resp, 2), MockRead(ASYNC, 0, 3) // EOF |
| 4096 }; | 3981 }; |
| 4097 | 3982 |
| 4098 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 3983 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4099 session_deps_.socket_factory->AddSocketDataProvider(&data); | 3984 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 4100 | 3985 |
| 4101 CreateNetworkSession(); | 3986 CreateNetworkSession(); |
| 4102 CreateInsecureSpdySession(); | 3987 CreateInsecureSpdySession(); |
| 4103 | 3988 |
| 4104 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( | 3989 base::WeakPtr<SpdyStream> stream = CreateStreamSynchronously( |
| 4105 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, LOWEST, BoundNetLog()); | 3990 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, LOWEST, BoundNetLog()); |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4189 base::Bind(&SpdySessionTest::UnstallStreamSession, | 4074 base::Bind(&SpdySessionTest::UnstallStreamSession, |
| 4190 base::Unretained(this))); | 4075 base::Unretained(this))); |
| 4191 } | 4076 } |
| 4192 | 4077 |
| 4193 // Cause a stall by reducing the flow control send window to 0. The | 4078 // Cause a stall by reducing the flow control send window to 0. The |
| 4194 // streams should resume in priority order when that window is then | 4079 // streams should resume in priority order when that window is then |
| 4195 // increased. | 4080 // increased. |
| 4196 TEST_P(SpdySessionTest, ResumeByPriorityAfterSendWindowSizeIncrease) { | 4081 TEST_P(SpdySessionTest, ResumeByPriorityAfterSendWindowSizeIncrease) { |
| 4197 session_deps_.host_resolver->set_synchronous_mode(true); | 4082 session_deps_.host_resolver->set_synchronous_mode(true); |
| 4198 | 4083 |
| 4199 std::unique_ptr<SpdySerializedFrame> req1(spdy_util_.ConstructSpdyPost( | 4084 SpdySerializedFrame req1(spdy_util_.ConstructSpdyPost( |
| 4200 kDefaultUrl, 1, kBodyDataSize, LOWEST, nullptr, 0)); | 4085 kDefaultUrl, 1, kBodyDataSize, LOWEST, nullptr, 0)); |
| 4201 std::unique_ptr<SpdySerializedFrame> req2(spdy_util_.ConstructSpdyPost( | 4086 SpdySerializedFrame req2(spdy_util_.ConstructSpdyPost( |
| 4202 kDefaultUrl, 3, kBodyDataSize, MEDIUM, nullptr, 0)); | 4087 kDefaultUrl, 3, kBodyDataSize, MEDIUM, nullptr, 0)); |
| 4203 std::unique_ptr<SpdySerializedFrame> body1( | 4088 SpdySerializedFrame body1( |
| 4204 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, true)); | 4089 spdy_util_.ConstructSpdyDataFrame(1, kBodyData, kBodyDataSize, true)); |
| 4205 std::unique_ptr<SpdySerializedFrame> body2( | 4090 SpdySerializedFrame body2( |
| 4206 spdy_util_.ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, true)); | 4091 spdy_util_.ConstructSpdyDataFrame(3, kBodyData, kBodyDataSize, true)); |
| 4207 MockWrite writes[] = { | 4092 MockWrite writes[] = { |
| 4208 CreateMockWrite(*req1, 0), | 4093 CreateMockWrite(req1, 0), CreateMockWrite(req2, 1), |
| 4209 CreateMockWrite(*req2, 1), | 4094 CreateMockWrite(body2, 2), CreateMockWrite(body1, 3), |
| 4210 CreateMockWrite(*body2, 2), | |
| 4211 CreateMockWrite(*body1, 3), | |
| 4212 }; | 4095 }; |
| 4213 | 4096 |
| 4214 std::unique_ptr<SpdySerializedFrame> resp1( | 4097 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 4215 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 4098 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 3)); |
| 4216 std::unique_ptr<SpdySerializedFrame> resp2( | |
| 4217 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 3)); | |
| 4218 MockRead reads[] = { | 4099 MockRead reads[] = { |
| 4219 CreateMockRead(*resp1, 4), | 4100 CreateMockRead(resp1, 4), CreateMockRead(resp2, 5), |
| 4220 CreateMockRead(*resp2, 5), | |
| 4221 MockRead(ASYNC, 0, 6) // EOF | 4101 MockRead(ASYNC, 0, 6) // EOF |
| 4222 }; | 4102 }; |
| 4223 | 4103 |
| 4224 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4104 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4225 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4105 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 4226 | 4106 |
| 4227 CreateNetworkSession(); | 4107 CreateNetworkSession(); |
| 4228 CreateInsecureSpdySession(); | 4108 CreateInsecureSpdySession(); |
| 4229 | 4109 |
| 4230 base::WeakPtr<SpdyStream> stream1 = CreateStreamSynchronously( | 4110 base::WeakPtr<SpdyStream> stream1 = CreateStreamSynchronously( |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4330 | 4210 |
| 4331 private: | 4211 private: |
| 4332 base::WeakPtr<SpdyStream> stream_to_close_; | 4212 base::WeakPtr<SpdyStream> stream_to_close_; |
| 4333 }; | 4213 }; |
| 4334 | 4214 |
| 4335 // Cause a stall by reducing the flow control send window to | 4215 // Cause a stall by reducing the flow control send window to |
| 4336 // 0. Unstalling the session should properly handle deleted streams. | 4216 // 0. Unstalling the session should properly handle deleted streams. |
| 4337 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedStreams) { | 4217 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedStreams) { |
| 4338 session_deps_.host_resolver->set_synchronous_mode(true); | 4218 session_deps_.host_resolver->set_synchronous_mode(true); |
| 4339 | 4219 |
| 4340 std::unique_ptr<SpdySerializedFrame> req1(spdy_util_.ConstructSpdyPost( | 4220 SpdySerializedFrame req1(spdy_util_.ConstructSpdyPost( |
| 4341 kDefaultUrl, 1, kBodyDataSize, LOWEST, nullptr, 0)); | 4221 kDefaultUrl, 1, kBodyDataSize, LOWEST, nullptr, 0)); |
| 4342 std::unique_ptr<SpdySerializedFrame> req2(spdy_util_.ConstructSpdyPost( | 4222 SpdySerializedFrame req2(spdy_util_.ConstructSpdyPost( |
| 4343 kDefaultUrl, 3, kBodyDataSize, LOWEST, nullptr, 0)); | 4223 kDefaultUrl, 3, kBodyDataSize, LOWEST, nullptr, 0)); |
| 4344 std::unique_ptr<SpdySerializedFrame> req3(spdy_util_.ConstructSpdyPost( | 4224 SpdySerializedFrame req3(spdy_util_.ConstructSpdyPost( |
| 4345 kDefaultUrl, 5, kBodyDataSize, LOWEST, nullptr, 0)); | 4225 kDefaultUrl, 5, kBodyDataSize, LOWEST, nullptr, 0)); |
| 4346 std::unique_ptr<SpdySerializedFrame> body2( | 4226 SpdySerializedFrame body2( |
| 4347 spdy_util_.ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, true)); | 4227 spdy_util_.ConstructSpdyDataFrame(3, kBodyData, kBodyDataSize, true)); |
| 4348 MockWrite writes[] = { | 4228 MockWrite writes[] = { |
| 4349 CreateMockWrite(*req1, 0), | 4229 CreateMockWrite(req1, 0), CreateMockWrite(req2, 1), |
| 4350 CreateMockWrite(*req2, 1), | 4230 CreateMockWrite(req3, 2), CreateMockWrite(body2, 3), |
| 4351 CreateMockWrite(*req3, 2), | |
| 4352 CreateMockWrite(*body2, 3), | |
| 4353 }; | 4231 }; |
| 4354 | 4232 |
| 4355 std::unique_ptr<SpdySerializedFrame> resp2( | 4233 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 3)); |
| 4356 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 3)); | |
| 4357 MockRead reads[] = { | 4234 MockRead reads[] = { |
| 4358 CreateMockRead(*resp2, 4), | 4235 CreateMockRead(resp2, 4), MockRead(ASYNC, ERR_IO_PENDING, 5), |
| 4359 MockRead(ASYNC, ERR_IO_PENDING, 5), | |
| 4360 MockRead(ASYNC, 0, 6) // EOF | 4236 MockRead(ASYNC, 0, 6) // EOF |
| 4361 }; | 4237 }; |
| 4362 | 4238 |
| 4363 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4239 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4364 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4240 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 4365 | 4241 |
| 4366 CreateNetworkSession(); | 4242 CreateNetworkSession(); |
| 4367 CreateInsecureSpdySession(); | 4243 CreateInsecureSpdySession(); |
| 4368 | 4244 |
| 4369 base::WeakPtr<SpdyStream> stream1 = CreateStreamSynchronously( | 4245 base::WeakPtr<SpdyStream> stream1 = CreateStreamSynchronously( |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4477 | 4353 |
| 4478 EXPECT_TRUE(data.AllWriteDataConsumed()); | 4354 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 4479 } | 4355 } |
| 4480 | 4356 |
| 4481 // Cause a stall by reducing the flow control send window to | 4357 // Cause a stall by reducing the flow control send window to |
| 4482 // 0. Unstalling the session should properly handle the session itself | 4358 // 0. Unstalling the session should properly handle the session itself |
| 4483 // being closed. | 4359 // being closed. |
| 4484 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedSession) { | 4360 TEST_P(SpdySessionTest, SendWindowSizeIncreaseWithDeletedSession) { |
| 4485 session_deps_.host_resolver->set_synchronous_mode(true); | 4361 session_deps_.host_resolver->set_synchronous_mode(true); |
| 4486 | 4362 |
| 4487 std::unique_ptr<SpdySerializedFrame> req1(spdy_util_.ConstructSpdyPost( | 4363 SpdySerializedFrame req1(spdy_util_.ConstructSpdyPost( |
| 4488 kDefaultUrl, 1, kBodyDataSize, LOWEST, nullptr, 0)); | 4364 kDefaultUrl, 1, kBodyDataSize, LOWEST, nullptr, 0)); |
| 4489 std::unique_ptr<SpdySerializedFrame> req2(spdy_util_.ConstructSpdyPost( | 4365 SpdySerializedFrame req2(spdy_util_.ConstructSpdyPost( |
| 4490 kDefaultUrl, 3, kBodyDataSize, LOWEST, nullptr, 0)); | 4366 kDefaultUrl, 3, kBodyDataSize, LOWEST, nullptr, 0)); |
| 4491 std::unique_ptr<SpdySerializedFrame> body1( | 4367 SpdySerializedFrame body1( |
| 4492 spdy_util_.ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); | 4368 spdy_util_.ConstructSpdyDataFrame(1, kBodyData, kBodyDataSize, false)); |
| 4493 MockWrite writes[] = { | 4369 MockWrite writes[] = { |
| 4494 CreateMockWrite(*req1, 0), | 4370 CreateMockWrite(req1, 0), CreateMockWrite(req2, 1), |
| 4495 CreateMockWrite(*req2, 1), | |
| 4496 }; | 4371 }; |
| 4497 | 4372 |
| 4498 MockRead reads[] = { | 4373 MockRead reads[] = { |
| 4499 MockRead(ASYNC, ERR_IO_PENDING, 2), MockRead(ASYNC, 0, 3) // EOF | 4374 MockRead(ASYNC, ERR_IO_PENDING, 2), MockRead(ASYNC, 0, 3) // EOF |
| 4500 }; | 4375 }; |
| 4501 | 4376 |
| 4502 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4377 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4503 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4378 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 4504 | 4379 |
| 4505 CreateNetworkSession(); | 4380 CreateNetworkSession(); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4570 EXPECT_TRUE(delegate1.send_headers_completed()); | 4445 EXPECT_TRUE(delegate1.send_headers_completed()); |
| 4571 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); | 4446 EXPECT_EQ(std::string(), delegate1.TakeReceivedData()); |
| 4572 | 4447 |
| 4573 EXPECT_TRUE(delegate2.send_headers_completed()); | 4448 EXPECT_TRUE(delegate2.send_headers_completed()); |
| 4574 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); | 4449 EXPECT_EQ(std::string(), delegate2.TakeReceivedData()); |
| 4575 | 4450 |
| 4576 EXPECT_TRUE(data.AllWriteDataConsumed()); | 4451 EXPECT_TRUE(data.AllWriteDataConsumed()); |
| 4577 } | 4452 } |
| 4578 | 4453 |
| 4579 TEST_P(SpdySessionTest, GoAwayOnSessionFlowControlError) { | 4454 TEST_P(SpdySessionTest, GoAwayOnSessionFlowControlError) { |
| 4580 std::unique_ptr<SpdySerializedFrame> req( | 4455 SpdySerializedFrame req( |
| 4581 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4456 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4582 std::unique_ptr<SpdySerializedFrame> goaway(spdy_util_.ConstructSpdyGoAway( | 4457 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( |
| 4583 0, GOAWAY_FLOW_CONTROL_ERROR, | 4458 0, GOAWAY_FLOW_CONTROL_ERROR, |
| 4584 "delta_window_size is 6 in DecreaseRecvWindowSize, which is larger than " | 4459 "delta_window_size is 6 in DecreaseRecvWindowSize, which is larger than " |
| 4585 "the receive window size of 1")); | 4460 "the receive window size of 1")); |
| 4586 MockWrite writes[] = { | 4461 MockWrite writes[] = { |
| 4587 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 4), | 4462 CreateMockWrite(req, 0), CreateMockWrite(goaway, 4), |
| 4588 }; | 4463 }; |
| 4589 | 4464 |
| 4590 std::unique_ptr<SpdySerializedFrame> resp( | 4465 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); |
| 4591 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); | 4466 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); |
| 4592 std::unique_ptr<SpdySerializedFrame> body( | |
| 4593 spdy_util_.ConstructSpdyBodyFrame(1, true)); | |
| 4594 MockRead reads[] = { | 4467 MockRead reads[] = { |
| 4595 MockRead(ASYNC, ERR_IO_PENDING, 1), | 4468 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(resp, 2), |
| 4596 CreateMockRead(*resp, 2), | 4469 CreateMockRead(body, 3), |
| 4597 CreateMockRead(*body, 3), | |
| 4598 }; | 4470 }; |
| 4599 | 4471 |
| 4600 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4472 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4601 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4473 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 4602 | 4474 |
| 4603 CreateNetworkSession(); | 4475 CreateNetworkSession(); |
| 4604 CreateInsecureSpdySession(); | 4476 CreateInsecureSpdySession(); |
| 4605 | 4477 |
| 4606 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( | 4478 base::WeakPtr<SpdyStream> spdy_stream = CreateStreamSynchronously( |
| 4607 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, LOWEST, BoundNetLog()); | 4479 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, LOWEST, BoundNetLog()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 4627 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_FLOW_CONTROL_ERROR)); | 4499 EXPECT_THAT(delegate.WaitForClose(), IsError(ERR_SPDY_FLOW_CONTROL_ERROR)); |
| 4628 EXPECT_FALSE(session_); | 4500 EXPECT_FALSE(session_); |
| 4629 } | 4501 } |
| 4630 | 4502 |
| 4631 // Regression. Sorta. Push streams and client streams were sharing a single | 4503 // Regression. Sorta. Push streams and client streams were sharing a single |
| 4632 // limit for a long time. | 4504 // limit for a long time. |
| 4633 TEST_P(SpdySessionTest, PushedStreamShouldNotCountToClientConcurrencyLimit) { | 4505 TEST_P(SpdySessionTest, PushedStreamShouldNotCountToClientConcurrencyLimit) { |
| 4634 SettingsMap new_settings; | 4506 SettingsMap new_settings; |
| 4635 new_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = | 4507 new_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = |
| 4636 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 2); | 4508 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, 2); |
| 4637 std::unique_ptr<SpdySerializedFrame> settings_frame( | 4509 SpdySerializedFrame settings_frame( |
| 4638 spdy_util_.ConstructSpdySettings(new_settings)); | 4510 spdy_util_.ConstructSpdySettings(new_settings)); |
| 4639 std::unique_ptr<SpdySerializedFrame> pushed(spdy_util_.ConstructSpdyPush( | 4511 SpdySerializedFrame pushed(spdy_util_.ConstructSpdyPush( |
| 4640 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); | 4512 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); |
| 4641 MockRead reads[] = { | 4513 MockRead reads[] = { |
| 4642 CreateMockRead(*settings_frame, 0), | 4514 CreateMockRead(settings_frame, 0), |
| 4643 MockRead(ASYNC, ERR_IO_PENDING, 3), | 4515 MockRead(ASYNC, ERR_IO_PENDING, 3), |
| 4644 CreateMockRead(*pushed, 4), | 4516 CreateMockRead(pushed, 4), |
| 4645 MockRead(ASYNC, ERR_IO_PENDING, 5), | 4517 MockRead(ASYNC, ERR_IO_PENDING, 5), |
| 4646 MockRead(ASYNC, 0, 6), | 4518 MockRead(ASYNC, 0, 6), |
| 4647 }; | 4519 }; |
| 4648 | 4520 |
| 4649 std::unique_ptr<SpdySerializedFrame> settings_ack( | 4521 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); |
| 4650 spdy_util_.ConstructSpdySettingsAck()); | 4522 SpdySerializedFrame req( |
| 4651 std::unique_ptr<SpdySerializedFrame> req( | |
| 4652 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4523 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4653 MockWrite writes[] = { | 4524 MockWrite writes[] = { |
| 4654 CreateMockWrite(*settings_ack, 1), CreateMockWrite(*req, 2), | 4525 CreateMockWrite(settings_ack, 1), CreateMockWrite(req, 2), |
| 4655 }; | 4526 }; |
| 4656 | 4527 |
| 4657 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4528 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4658 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4529 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 4659 | 4530 |
| 4660 CreateNetworkSession(); | 4531 CreateNetworkSession(); |
| 4661 CreateInsecureSpdySession(); | 4532 CreateInsecureSpdySession(); |
| 4662 | 4533 |
| 4663 // Read the settings frame. | 4534 // Read the settings frame. |
| 4664 base::RunLoop().RunUntilIdle(); | 4535 base::RunLoop().RunUntilIdle(); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4708 EXPECT_EQ(1u, session_->num_pushed_streams()); | 4579 EXPECT_EQ(1u, session_->num_pushed_streams()); |
| 4709 EXPECT_EQ(1u, session_->num_active_pushed_streams()); | 4580 EXPECT_EQ(1u, session_->num_active_pushed_streams()); |
| 4710 | 4581 |
| 4711 // Read EOF. | 4582 // Read EOF. |
| 4712 data.Resume(); | 4583 data.Resume(); |
| 4713 base::RunLoop().RunUntilIdle(); | 4584 base::RunLoop().RunUntilIdle(); |
| 4714 EXPECT_FALSE(session_); | 4585 EXPECT_FALSE(session_); |
| 4715 } | 4586 } |
| 4716 | 4587 |
| 4717 TEST_P(SpdySessionTest, RejectPushedStreamExceedingConcurrencyLimit) { | 4588 TEST_P(SpdySessionTest, RejectPushedStreamExceedingConcurrencyLimit) { |
| 4718 std::unique_ptr<SpdySerializedFrame> push_a(spdy_util_.ConstructSpdyPush( | 4589 SpdySerializedFrame push_a(spdy_util_.ConstructSpdyPush( |
| 4719 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); | 4590 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); |
| 4720 std::unique_ptr<SpdySerializedFrame> push_b(spdy_util_.ConstructSpdyPush( | 4591 SpdySerializedFrame push_b(spdy_util_.ConstructSpdyPush( |
| 4721 nullptr, 0, 4, 1, "https://www.example.org/b.dat")); | 4592 nullptr, 0, 4, 1, "https://www.example.org/b.dat")); |
| 4722 MockRead reads[] = { | 4593 MockRead reads[] = { |
| 4723 MockRead(ASYNC, ERR_IO_PENDING, 1), | 4594 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(push_a, 2), |
| 4724 CreateMockRead(*push_a, 2), | 4595 MockRead(ASYNC, ERR_IO_PENDING, 3), CreateMockRead(push_b, 4), |
| 4725 MockRead(ASYNC, ERR_IO_PENDING, 3), | 4596 MockRead(ASYNC, ERR_IO_PENDING, 6), MockRead(ASYNC, 0, 7), |
| 4726 CreateMockRead(*push_b, 4), | |
| 4727 MockRead(ASYNC, ERR_IO_PENDING, 6), | |
| 4728 MockRead(ASYNC, 0, 7), | |
| 4729 }; | 4597 }; |
| 4730 | 4598 |
| 4731 std::unique_ptr<SpdySerializedFrame> req( | 4599 SpdySerializedFrame req( |
| 4732 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4600 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4733 std::unique_ptr<SpdySerializedFrame> rst( | 4601 SpdySerializedFrame rst( |
| 4734 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_REFUSED_STREAM)); | 4602 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_REFUSED_STREAM)); |
| 4735 MockWrite writes[] = { | 4603 MockWrite writes[] = { |
| 4736 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5), | 4604 CreateMockWrite(req, 0), CreateMockWrite(rst, 5), |
| 4737 }; | 4605 }; |
| 4738 | 4606 |
| 4739 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4607 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4740 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4608 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 4741 | 4609 |
| 4742 CreateNetworkSession(); | 4610 CreateNetworkSession(); |
| 4743 CreateInsecureSpdySession(); | 4611 CreateInsecureSpdySession(); |
| 4744 session_->set_max_concurrent_pushed_streams(1); | 4612 session_->set_max_concurrent_pushed_streams(1); |
| 4745 | 4613 |
| 4746 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 4614 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4794 // Tests that HTTP SPDY push streams that advertise an origin different from the | 4662 // Tests that HTTP SPDY push streams that advertise an origin different from the |
| 4795 // associated stream are accepted from a trusted SPDY proxy. | 4663 // associated stream are accepted from a trusted SPDY proxy. |
| 4796 TEST_P(SpdySessionTest, TrustedSpdyProxy) { | 4664 TEST_P(SpdySessionTest, TrustedSpdyProxy) { |
| 4797 // Origin of kDefaultUrl should be different from the origin of | 4665 // Origin of kDefaultUrl should be different from the origin of |
| 4798 // kHttpURLFromAnotherOrigin and kHttpsURLFromAnotherOrigin. | 4666 // kHttpURLFromAnotherOrigin and kHttpsURLFromAnotherOrigin. |
| 4799 ASSERT_NE(GURL(kDefaultUrl).host(), GURL(kHttpURLFromAnotherOrigin).host()); | 4667 ASSERT_NE(GURL(kDefaultUrl).host(), GURL(kHttpURLFromAnotherOrigin).host()); |
| 4800 ASSERT_NE(GURL(kDefaultUrl).host(), GURL(kHttpsURLFromAnotherOrigin).host()); | 4668 ASSERT_NE(GURL(kDefaultUrl).host(), GURL(kHttpsURLFromAnotherOrigin).host()); |
| 4801 | 4669 |
| 4802 // cross_origin_push contains HTTP resource for an origin different from the | 4670 // cross_origin_push contains HTTP resource for an origin different from the |
| 4803 // origin of kDefaultUrl, and should be accepted. | 4671 // origin of kDefaultUrl, and should be accepted. |
| 4804 std::unique_ptr<SpdySerializedFrame> cross_origin_push( | 4672 SpdySerializedFrame cross_origin_push(spdy_util_.ConstructSpdyPush( |
| 4805 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, | 4673 nullptr, 0, 2, 1, kHttpURLFromAnotherOrigin)); |
| 4806 kHttpURLFromAnotherOrigin)); | |
| 4807 // cross_origin_https_push contains HTTPS resource, and should be refused. | 4674 // cross_origin_https_push contains HTTPS resource, and should be refused. |
| 4808 std::unique_ptr<SpdySerializedFrame> cross_origin_https_push( | 4675 SpdySerializedFrame cross_origin_https_push(spdy_util_.ConstructSpdyPush( |
| 4809 spdy_util_.ConstructSpdyPush(nullptr, 0, 4, 1, | 4676 nullptr, 0, 4, 1, kHttpsURLFromAnotherOrigin)); |
| 4810 kHttpsURLFromAnotherOrigin)); | |
| 4811 MockRead reads[] = { | 4677 MockRead reads[] = { |
| 4812 MockRead(ASYNC, ERR_IO_PENDING, 1), | 4678 MockRead(ASYNC, ERR_IO_PENDING, 1), |
| 4813 CreateMockRead(*cross_origin_push, 2), | 4679 CreateMockRead(cross_origin_push, 2), |
| 4814 MockRead(ASYNC, ERR_IO_PENDING, 3), | 4680 MockRead(ASYNC, ERR_IO_PENDING, 3), |
| 4815 CreateMockRead(*cross_origin_https_push, 4), | 4681 CreateMockRead(cross_origin_https_push, 4), |
| 4816 MockRead(ASYNC, ERR_IO_PENDING, 6), | 4682 MockRead(ASYNC, ERR_IO_PENDING, 6), |
| 4817 MockRead(ASYNC, 0, 7), | 4683 MockRead(ASYNC, 0, 7), |
| 4818 }; | 4684 }; |
| 4819 | 4685 |
| 4820 std::unique_ptr<SpdySerializedFrame> req( | 4686 SpdySerializedFrame req( |
| 4821 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4687 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4822 std::unique_ptr<SpdySerializedFrame> rst( | 4688 SpdySerializedFrame rst( |
| 4823 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_REFUSED_STREAM)); | 4689 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_REFUSED_STREAM)); |
| 4824 MockWrite writes[] = { | 4690 MockWrite writes[] = { |
| 4825 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5), | 4691 CreateMockWrite(req, 0), CreateMockWrite(rst, 5), |
| 4826 }; | 4692 }; |
| 4827 | 4693 |
| 4828 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4694 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4829 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4695 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 4830 | 4696 |
| 4831 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); | 4697 std::unique_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); |
| 4832 proxy_delegate->set_trusted_spdy_proxy( | 4698 proxy_delegate->set_trusted_spdy_proxy( |
| 4833 net::ProxyServer(net::ProxyServer::SCHEME_HTTPS, | 4699 net::ProxyServer(net::ProxyServer::SCHEME_HTTPS, |
| 4834 HostPortPair(GURL(kDefaultUrl).host(), 443))); | 4700 HostPortPair(GURL(kDefaultUrl).host(), 443))); |
| 4835 session_deps_.proxy_delegate.reset(proxy_delegate.release()); | 4701 session_deps_.proxy_delegate.reset(proxy_delegate.release()); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4900 | 4766 |
| 4901 // Tests that if the SPDY trusted proxy is not set, then push streams that | 4767 // Tests that if the SPDY trusted proxy is not set, then push streams that |
| 4902 // advertise an origin different from the associated stream are refused. | 4768 // advertise an origin different from the associated stream are refused. |
| 4903 TEST_P(SpdySessionTest, TrustedSpdyProxyNotSet) { | 4769 TEST_P(SpdySessionTest, TrustedSpdyProxyNotSet) { |
| 4904 // Origin of kDefaultUrl should be different from the origin of | 4770 // Origin of kDefaultUrl should be different from the origin of |
| 4905 // kHttpURLFromAnotherOrigin. | 4771 // kHttpURLFromAnotherOrigin. |
| 4906 ASSERT_NE(GURL(kDefaultUrl).host(), GURL(kHttpURLFromAnotherOrigin).host()); | 4772 ASSERT_NE(GURL(kDefaultUrl).host(), GURL(kHttpURLFromAnotherOrigin).host()); |
| 4907 | 4773 |
| 4908 // cross_origin_push contains resource for an origin different from the | 4774 // cross_origin_push contains resource for an origin different from the |
| 4909 // origin of kDefaultUrl, and should be refused. | 4775 // origin of kDefaultUrl, and should be refused. |
| 4910 std::unique_ptr<SpdySerializedFrame> cross_origin_push( | 4776 SpdySerializedFrame cross_origin_push(spdy_util_.ConstructSpdyPush( |
| 4911 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, | 4777 nullptr, 0, 2, 1, kHttpURLFromAnotherOrigin)); |
| 4912 kHttpURLFromAnotherOrigin)); | |
| 4913 MockRead reads[] = { | 4778 MockRead reads[] = { |
| 4914 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(*cross_origin_push, 2), | 4779 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(cross_origin_push, 2), |
| 4915 MockRead(ASYNC, 0, 4), | 4780 MockRead(ASYNC, 0, 4), |
| 4916 }; | 4781 }; |
| 4917 | 4782 |
| 4918 std::unique_ptr<SpdySerializedFrame> req( | 4783 SpdySerializedFrame req( |
| 4919 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4784 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 4920 std::unique_ptr<SpdySerializedFrame> rst( | 4785 SpdySerializedFrame rst( |
| 4921 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); | 4786 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); |
| 4922 MockWrite writes[] = { | 4787 MockWrite writes[] = { |
| 4923 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 3), | 4788 CreateMockWrite(req, 0), CreateMockWrite(rst, 3), |
| 4924 }; | 4789 }; |
| 4925 | 4790 |
| 4926 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4791 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 4927 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4792 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 4928 | 4793 |
| 4929 // Load a cert that is valid for: | 4794 // Load a cert that is valid for: |
| 4930 // www.example.org | 4795 // www.example.org |
| 4931 // mail.example.org | 4796 // mail.example.org |
| 4932 // mail.example.com | 4797 // mail.example.com |
| 4933 base::FilePath certs_dir = GetTestCertsDirectory(); | 4798 base::FilePath certs_dir = GetTestCertsDirectory(); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4968 EXPECT_EQ(0u, session_->num_pushed_streams()); | 4833 EXPECT_EQ(0u, session_->num_pushed_streams()); |
| 4969 EXPECT_EQ(0u, session_->num_active_pushed_streams()); | 4834 EXPECT_EQ(0u, session_->num_active_pushed_streams()); |
| 4970 | 4835 |
| 4971 // Read EOF. | 4836 // Read EOF. |
| 4972 data.Resume(); | 4837 data.Resume(); |
| 4973 base::RunLoop().RunUntilIdle(); | 4838 base::RunLoop().RunUntilIdle(); |
| 4974 EXPECT_FALSE(session_); | 4839 EXPECT_FALSE(session_); |
| 4975 } | 4840 } |
| 4976 | 4841 |
| 4977 TEST_P(SpdySessionTest, IgnoreReservedRemoteStreamsCount) { | 4842 TEST_P(SpdySessionTest, IgnoreReservedRemoteStreamsCount) { |
| 4978 std::unique_ptr<SpdySerializedFrame> push_a(spdy_util_.ConstructSpdyPush( | 4843 SpdySerializedFrame push_a(spdy_util_.ConstructSpdyPush( |
| 4979 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); | 4844 nullptr, 0, 2, 1, "https://www.example.org/a.dat")); |
| 4980 SpdyHeaderBlock push_headers; | 4845 SpdyHeaderBlock push_headers; |
| 4981 spdy_util_.AddUrlToHeaderBlock("https://www.example.org/b.dat", | 4846 spdy_util_.AddUrlToHeaderBlock("https://www.example.org/b.dat", |
| 4982 &push_headers); | 4847 &push_headers); |
| 4983 std::unique_ptr<SpdySerializedFrame> push_b( | 4848 SpdySerializedFrame push_b( |
| 4984 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 4, 1)); | 4849 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 4, 1)); |
| 4985 std::unique_ptr<SpdySerializedFrame> headers_b( | 4850 SpdySerializedFrame headers_b( |
| 4986 spdy_util_.ConstructSpdyPushHeaders(4, nullptr, 0)); | 4851 spdy_util_.ConstructSpdyPushHeaders(4, nullptr, 0)); |
| 4987 MockRead reads[] = { | 4852 MockRead reads[] = { |
| 4988 MockRead(ASYNC, ERR_IO_PENDING, 1), | 4853 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(push_a, 2), |
| 4989 CreateMockRead(*push_a, 2), | 4854 MockRead(ASYNC, ERR_IO_PENDING, 3), CreateMockRead(push_b, 4), |
| 4990 MockRead(ASYNC, ERR_IO_PENDING, 3), | 4855 MockRead(ASYNC, ERR_IO_PENDING, 5), CreateMockRead(headers_b, 6), |
| 4991 CreateMockRead(*push_b, 4), | 4856 MockRead(ASYNC, ERR_IO_PENDING, 8), MockRead(ASYNC, 0, 9), |
| 4992 MockRead(ASYNC, ERR_IO_PENDING, 5), | |
| 4993 CreateMockRead(*headers_b, 6), | |
| 4994 MockRead(ASYNC, ERR_IO_PENDING, 8), | |
| 4995 MockRead(ASYNC, 0, 9), | |
| 4996 }; | 4857 }; |
| 4997 | 4858 |
| 4998 std::unique_ptr<SpdySerializedFrame> req( | 4859 SpdySerializedFrame req( |
| 4999 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4860 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 5000 std::unique_ptr<SpdySerializedFrame> rst( | 4861 SpdySerializedFrame rst( |
| 5001 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_REFUSED_STREAM)); | 4862 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_REFUSED_STREAM)); |
| 5002 MockWrite writes[] = { | 4863 MockWrite writes[] = { |
| 5003 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 7), | 4864 CreateMockWrite(req, 0), CreateMockWrite(rst, 7), |
| 5004 }; | 4865 }; |
| 5005 | 4866 |
| 5006 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4867 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 5007 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4868 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 5008 | 4869 |
| 5009 CreateNetworkSession(); | 4870 CreateNetworkSession(); |
| 5010 CreateInsecureSpdySession(); | 4871 CreateInsecureSpdySession(); |
| 5011 session_->set_max_concurrent_pushed_streams(1); | 4872 session_->set_max_concurrent_pushed_streams(1); |
| 5012 | 4873 |
| 5013 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 4874 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5064 // Read EOF. | 4925 // Read EOF. |
| 5065 data.Resume(); | 4926 data.Resume(); |
| 5066 base::RunLoop().RunUntilIdle(); | 4927 base::RunLoop().RunUntilIdle(); |
| 5067 EXPECT_FALSE(session_); | 4928 EXPECT_FALSE(session_); |
| 5068 } | 4929 } |
| 5069 | 4930 |
| 5070 TEST_P(SpdySessionTest, CancelReservedStreamOnHeadersReceived) { | 4931 TEST_P(SpdySessionTest, CancelReservedStreamOnHeadersReceived) { |
| 5071 const char kPushedUrl[] = "https://www.example.org/a.dat"; | 4932 const char kPushedUrl[] = "https://www.example.org/a.dat"; |
| 5072 SpdyHeaderBlock push_headers; | 4933 SpdyHeaderBlock push_headers; |
| 5073 spdy_util_.AddUrlToHeaderBlock(kPushedUrl, &push_headers); | 4934 spdy_util_.AddUrlToHeaderBlock(kPushedUrl, &push_headers); |
| 5074 std::unique_ptr<SpdySerializedFrame> push_promise( | 4935 SpdySerializedFrame push_promise( |
| 5075 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 2, 1)); | 4936 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 2, 1)); |
| 5076 std::unique_ptr<SpdySerializedFrame> headers_frame( | 4937 SpdySerializedFrame headers_frame( |
| 5077 spdy_util_.ConstructSpdyPushHeaders(2, nullptr, 0)); | 4938 spdy_util_.ConstructSpdyPushHeaders(2, nullptr, 0)); |
| 5078 MockRead reads[] = { | 4939 MockRead reads[] = { |
| 5079 MockRead(ASYNC, ERR_IO_PENDING, 1), | 4940 MockRead(ASYNC, ERR_IO_PENDING, 1), CreateMockRead(push_promise, 2), |
| 5080 CreateMockRead(*push_promise, 2), | 4941 MockRead(ASYNC, ERR_IO_PENDING, 3), CreateMockRead(headers_frame, 4), |
| 5081 MockRead(ASYNC, ERR_IO_PENDING, 3), | 4942 MockRead(ASYNC, ERR_IO_PENDING, 6), MockRead(ASYNC, 0, 7), |
| 5082 CreateMockRead(*headers_frame, 4), | |
| 5083 MockRead(ASYNC, ERR_IO_PENDING, 6), | |
| 5084 MockRead(ASYNC, 0, 7), | |
| 5085 }; | 4943 }; |
| 5086 | 4944 |
| 5087 std::unique_ptr<SpdySerializedFrame> req( | 4945 SpdySerializedFrame req( |
| 5088 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); | 4946 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); |
| 5089 std::unique_ptr<SpdySerializedFrame> rst( | 4947 SpdySerializedFrame rst( |
| 5090 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); | 4948 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); |
| 5091 MockWrite writes[] = { | 4949 MockWrite writes[] = { |
| 5092 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5), | 4950 CreateMockWrite(req, 0), CreateMockWrite(rst, 5), |
| 5093 }; | 4951 }; |
| 5094 | 4952 |
| 5095 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 4953 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 5096 session_deps_.socket_factory->AddSocketDataProvider(&data); | 4954 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 5097 | 4955 |
| 5098 CreateNetworkSession(); | 4956 CreateNetworkSession(); |
| 5099 CreateInsecureSpdySession(); | 4957 CreateInsecureSpdySession(); |
| 5100 | 4958 |
| 5101 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( | 4959 base::WeakPtr<SpdyStream> spdy_stream1 = CreateStreamSynchronously( |
| 5102 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, LOWEST, BoundNetLog()); | 4960 SPDY_REQUEST_RESPONSE_STREAM, session_, test_url_, LOWEST, BoundNetLog()); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5328 spdy_session_pool_->http_server_properties()->GetAlternativeServices( | 5186 spdy_session_pool_->http_server_properties()->GetAlternativeServices( |
| 5329 session_origin); | 5187 session_origin); |
| 5330 ASSERT_TRUE(altsvc_vector.empty()); | 5188 ASSERT_TRUE(altsvc_vector.empty()); |
| 5331 } | 5189 } |
| 5332 | 5190 |
| 5333 TEST_P(AltSvcFrameTest, ProcessAltSvcFrameOnActiveStream) { | 5191 TEST_P(AltSvcFrameTest, ProcessAltSvcFrameOnActiveStream) { |
| 5334 SpdyAltSvcIR altsvc_ir(1); | 5192 SpdyAltSvcIR altsvc_ir(1); |
| 5335 altsvc_ir.add_altsvc(alternative_service_); | 5193 altsvc_ir.add_altsvc(alternative_service_); |
| 5336 | 5194 |
| 5337 SpdySerializedFrame altsvc_frame(spdy_util_.SerializeFrame(altsvc_ir)); | 5195 SpdySerializedFrame altsvc_frame(spdy_util_.SerializeFrame(altsvc_ir)); |
| 5338 std::unique_ptr<SpdySerializedFrame> rst( | 5196 SpdySerializedFrame rst( |
| 5339 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); | 5197 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); |
| 5340 MockRead reads[] = { | 5198 MockRead reads[] = { |
| 5341 CreateMockRead(altsvc_frame, 1), CreateMockRead(*rst, 2), | 5199 CreateMockRead(altsvc_frame, 1), CreateMockRead(rst, 2), |
| 5342 MockRead(ASYNC, 0, 3) // EOF | 5200 MockRead(ASYNC, 0, 3) // EOF |
| 5343 }; | 5201 }; |
| 5344 | 5202 |
| 5345 const char request_origin[] = "https://mail.example.org"; | 5203 const char request_origin[] = "https://mail.example.org"; |
| 5346 std::unique_ptr<SpdySerializedFrame> req( | 5204 SpdySerializedFrame req( |
| 5347 spdy_util_.ConstructSpdyGet(request_origin, 1, MEDIUM)); | 5205 spdy_util_.ConstructSpdyGet(request_origin, 1, MEDIUM)); |
| 5348 MockWrite writes[] = { | 5206 MockWrite writes[] = { |
| 5349 CreateMockWrite(*req, 0), | 5207 CreateMockWrite(req, 0), |
| 5350 }; | 5208 }; |
| 5351 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 5209 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 5352 session_deps_.socket_factory->AddSocketDataProvider(&data); | 5210 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 5353 | 5211 |
| 5354 AddSSLSocketData(); | 5212 AddSSLSocketData(); |
| 5355 | 5213 |
| 5356 CreateNetworkSession(); | 5214 CreateNetworkSession(); |
| 5357 CreateSecureSpdySession(); | 5215 CreateSecureSpdySession(); |
| 5358 | 5216 |
| 5359 base::WeakPtr<SpdyStream> spdy_stream1 = | 5217 base::WeakPtr<SpdyStream> spdy_stream1 = |
| (...skipping 24 matching lines...) Expand all Loading... |
| 5384 EXPECT_EQ(QUIC, altsvc_vector[0].protocol); | 5242 EXPECT_EQ(QUIC, altsvc_vector[0].protocol); |
| 5385 EXPECT_EQ("alternative.example.org", altsvc_vector[0].host); | 5243 EXPECT_EQ("alternative.example.org", altsvc_vector[0].host); |
| 5386 EXPECT_EQ(443u, altsvc_vector[0].port); | 5244 EXPECT_EQ(443u, altsvc_vector[0].port); |
| 5387 } | 5245 } |
| 5388 | 5246 |
| 5389 TEST_P(AltSvcFrameTest, DoNotProcessAltSvcFrameOnStreamWithInsecureOrigin) { | 5247 TEST_P(AltSvcFrameTest, DoNotProcessAltSvcFrameOnStreamWithInsecureOrigin) { |
| 5390 SpdyAltSvcIR altsvc_ir(1); | 5248 SpdyAltSvcIR altsvc_ir(1); |
| 5391 altsvc_ir.add_altsvc(alternative_service_); | 5249 altsvc_ir.add_altsvc(alternative_service_); |
| 5392 | 5250 |
| 5393 SpdySerializedFrame altsvc_frame(spdy_util_.SerializeFrame(altsvc_ir)); | 5251 SpdySerializedFrame altsvc_frame(spdy_util_.SerializeFrame(altsvc_ir)); |
| 5394 std::unique_ptr<SpdySerializedFrame> rst( | 5252 SpdySerializedFrame rst( |
| 5395 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); | 5253 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); |
| 5396 MockRead reads[] = { | 5254 MockRead reads[] = { |
| 5397 CreateMockRead(altsvc_frame, 1), CreateMockRead(*rst, 2), | 5255 CreateMockRead(altsvc_frame, 1), CreateMockRead(rst, 2), |
| 5398 MockRead(ASYNC, 0, 3) // EOF | 5256 MockRead(ASYNC, 0, 3) // EOF |
| 5399 }; | 5257 }; |
| 5400 | 5258 |
| 5401 const char request_origin[] = "http://mail.example.org"; | 5259 const char request_origin[] = "http://mail.example.org"; |
| 5402 std::unique_ptr<SpdySerializedFrame> req( | 5260 SpdySerializedFrame req( |
| 5403 spdy_util_.ConstructSpdyGet(request_origin, 1, MEDIUM)); | 5261 spdy_util_.ConstructSpdyGet(request_origin, 1, MEDIUM)); |
| 5404 MockWrite writes[] = { | 5262 MockWrite writes[] = { |
| 5405 CreateMockWrite(*req, 0), | 5263 CreateMockWrite(req, 0), |
| 5406 }; | 5264 }; |
| 5407 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); | 5265 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); |
| 5408 session_deps_.socket_factory->AddSocketDataProvider(&data); | 5266 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 5409 | 5267 |
| 5410 AddSSLSocketData(); | 5268 AddSSLSocketData(); |
| 5411 | 5269 |
| 5412 CreateNetworkSession(); | 5270 CreateNetworkSession(); |
| 5413 CreateSecureSpdySession(); | 5271 CreateSecureSpdySession(); |
| 5414 | 5272 |
| 5415 base::WeakPtr<SpdyStream> spdy_stream1 = | 5273 base::WeakPtr<SpdyStream> spdy_stream1 = |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5687 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), | 5545 ssl_info.cert = ImportCertFromFile(GetTestCertsDirectory(), |
| 5688 "spdy_pooling.pem"); | 5546 "spdy_pooling.pem"); |
| 5689 ssl_info.is_issued_by_known_root = true; | 5547 ssl_info.is_issued_by_known_root = true; |
| 5690 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); | 5548 ssl_info.public_key_hashes.push_back(test::GetTestHashValue(primary_pin)); |
| 5691 | 5549 |
| 5692 EXPECT_TRUE(SpdySession::CanPool( | 5550 EXPECT_TRUE(SpdySession::CanPool( |
| 5693 &tss, ssl_info, "www.example.org", "mail.example.org")); | 5551 &tss, ssl_info, "www.example.org", "mail.example.org")); |
| 5694 } | 5552 } |
| 5695 | 5553 |
| 5696 } // namespace net | 5554 } // namespace net |
| OLD | NEW |