| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <cstddef> | 5 #include <cstddef> |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/memory/ref_counted.h" | 9 #include "base/memory/ref_counted.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 130 INSTANTIATE_TEST_CASE_P( | 130 INSTANTIATE_TEST_CASE_P( |
| 131 NextProto, | 131 NextProto, |
| 132 SpdyStreamTest, | 132 SpdyStreamTest, |
| 133 testing::Values(kProtoSPDY2, kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2)); | 133 testing::Values(kProtoSPDY2, kProtoSPDY3, kProtoSPDY31, kProtoSPDY4a2)); |
| 134 | 134 |
| 135 TEST_P(SpdyStreamTest, SendDataAfterOpen) { | 135 TEST_P(SpdyStreamTest, SendDataAfterOpen) { |
| 136 GURL url(kStreamUrl); | 136 GURL url(kStreamUrl); |
| 137 | 137 |
| 138 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 138 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 139 | 139 |
| 140 scoped_ptr<SpdyFrame> initial_window_update( | |
| 141 spdy_util_.ConstructSpdyWindowUpdate( | |
| 142 kSessionFlowControlStreamId, | |
| 143 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 144 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 145 AddWrite(*initial_window_update); | |
| 146 | |
| 147 scoped_ptr<SpdyFrame> req( | 140 scoped_ptr<SpdyFrame> req( |
| 148 spdy_util_.ConstructSpdyPost( | 141 spdy_util_.ConstructSpdyPost( |
| 149 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | 142 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 150 AddWrite(*req); | 143 AddWrite(*req); |
| 151 | 144 |
| 152 scoped_ptr<SpdyFrame> resp( | 145 scoped_ptr<SpdyFrame> resp( |
| 153 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 146 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
| 154 AddRead(*resp); | 147 AddRead(*resp); |
| 155 | 148 |
| 156 scoped_ptr<SpdyFrame> msg( | 149 scoped_ptr<SpdyFrame> msg( |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 delegate.GetResponseHeaderValue(spdy_util_.GetVersionKey())); | 192 delegate.GetResponseHeaderValue(spdy_util_.GetVersionKey())); |
| 200 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 193 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
| 201 delegate.TakeReceivedData()); | 194 delegate.TakeReceivedData()); |
| 202 EXPECT_TRUE(data.at_write_eof()); | 195 EXPECT_TRUE(data.at_write_eof()); |
| 203 } | 196 } |
| 204 | 197 |
| 205 TEST_P(SpdyStreamTest, PushedStream) { | 198 TEST_P(SpdyStreamTest, PushedStream) { |
| 206 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 199 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 207 scoped_refptr<SpdySession> spdy_session(CreateSpdySession()); | 200 scoped_refptr<SpdySession> spdy_session(CreateSpdySession()); |
| 208 | 201 |
| 209 scoped_ptr<SpdyFrame> initial_window_update( | |
| 210 spdy_util_.ConstructSpdyWindowUpdate( | |
| 211 kSessionFlowControlStreamId, | |
| 212 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 213 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 214 AddWrite(*initial_window_update); | |
| 215 | |
| 216 AddReadEOF(); | 202 AddReadEOF(); |
| 217 | 203 |
| 218 OrderedSocketData data(GetReads(), GetNumReads(), | 204 OrderedSocketData data(GetReads(), GetNumReads(), |
| 219 GetWrites(), GetNumWrites()); | 205 GetWrites(), GetNumWrites()); |
| 220 MockConnect connect_data(SYNCHRONOUS, OK); | 206 MockConnect connect_data(SYNCHRONOUS, OK); |
| 221 data.set_connect_data(connect_data); | 207 data.set_connect_data(connect_data); |
| 222 | 208 |
| 223 session_deps_.socket_factory->AddSocketDataProvider(&data); | 209 session_deps_.socket_factory->AddSocketDataProvider(&data); |
| 224 | 210 |
| 225 InitializeSpdySession(spdy_session, host_port_pair_); | 211 InitializeSpdySession(spdy_session, host_port_pair_); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 | 246 |
| 261 spdy_session->CloseSessionOnError( | 247 spdy_session->CloseSessionOnError( |
| 262 ERR_CONNECTION_CLOSED, true, "Closing session"); | 248 ERR_CONNECTION_CLOSED, true, "Closing session"); |
| 263 } | 249 } |
| 264 | 250 |
| 265 TEST_P(SpdyStreamTest, StreamError) { | 251 TEST_P(SpdyStreamTest, StreamError) { |
| 266 GURL url(kStreamUrl); | 252 GURL url(kStreamUrl); |
| 267 | 253 |
| 268 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 254 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 269 | 255 |
| 270 scoped_ptr<SpdyFrame> initial_window_update( | |
| 271 spdy_util_.ConstructSpdyWindowUpdate( | |
| 272 kSessionFlowControlStreamId, | |
| 273 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 274 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 275 AddWrite(*initial_window_update); | |
| 276 | |
| 277 scoped_ptr<SpdyFrame> req( | 256 scoped_ptr<SpdyFrame> req( |
| 278 spdy_util_.ConstructSpdyPost( | 257 spdy_util_.ConstructSpdyPost( |
| 279 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | 258 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 280 AddWrite(*req); | 259 AddWrite(*req); |
| 281 | 260 |
| 282 scoped_ptr<SpdyFrame> resp( | 261 scoped_ptr<SpdyFrame> resp( |
| 283 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 262 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 284 AddRead(*resp); | 263 AddRead(*resp); |
| 285 | 264 |
| 286 scoped_ptr<SpdyFrame> msg( | 265 scoped_ptr<SpdyFrame> msg( |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 } | 331 } |
| 353 | 332 |
| 354 // Make sure that large blocks of data are properly split up into | 333 // Make sure that large blocks of data are properly split up into |
| 355 // frame-sized chunks for a request/response (i.e., an HTTP-like) | 334 // frame-sized chunks for a request/response (i.e., an HTTP-like) |
| 356 // stream. | 335 // stream. |
| 357 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenRequestResponse) { | 336 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenRequestResponse) { |
| 358 GURL url(kStreamUrl); | 337 GURL url(kStreamUrl); |
| 359 | 338 |
| 360 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 339 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 361 | 340 |
| 362 scoped_ptr<SpdyFrame> initial_window_update( | |
| 363 spdy_util_.ConstructSpdyWindowUpdate( | |
| 364 kSessionFlowControlStreamId, | |
| 365 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 366 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 367 AddWrite(*initial_window_update); | |
| 368 | |
| 369 scoped_ptr<SpdyFrame> req( | 341 scoped_ptr<SpdyFrame> req( |
| 370 spdy_util_.ConstructSpdyPost( | 342 spdy_util_.ConstructSpdyPost( |
| 371 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | 343 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 372 AddWrite(*req); | 344 AddWrite(*req); |
| 373 | 345 |
| 374 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 346 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
| 375 scoped_ptr<SpdyFrame> chunk( | 347 scoped_ptr<SpdyFrame> chunk( |
| 376 spdy_util_.ConstructSpdyBodyFrame( | 348 spdy_util_.ConstructSpdyBodyFrame( |
| 377 1, chunk_data.data(), chunk_data.length(), false)); | 349 1, chunk_data.data(), chunk_data.length(), false)); |
| 378 AddWrite(*chunk); | 350 AddWrite(*chunk); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 428 } | 400 } |
| 429 | 401 |
| 430 // Make sure that large blocks of data are properly split up into | 402 // Make sure that large blocks of data are properly split up into |
| 431 // frame-sized chunks for a bidirectional (i.e., non-HTTP-like) | 403 // frame-sized chunks for a bidirectional (i.e., non-HTTP-like) |
| 432 // stream. | 404 // stream. |
| 433 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenBidirectional) { | 405 TEST_P(SpdyStreamTest, SendLargeDataAfterOpenBidirectional) { |
| 434 GURL url(kStreamUrl); | 406 GURL url(kStreamUrl); |
| 435 | 407 |
| 436 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); | 408 session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_); |
| 437 | 409 |
| 438 scoped_ptr<SpdyFrame> initial_window_update( | |
| 439 spdy_util_.ConstructSpdyWindowUpdate( | |
| 440 kSessionFlowControlStreamId, | |
| 441 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 442 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 443 AddWrite(*initial_window_update); | |
| 444 | |
| 445 scoped_ptr<SpdyFrame> req( | 410 scoped_ptr<SpdyFrame> req( |
| 446 spdy_util_.ConstructSpdyPost( | 411 spdy_util_.ConstructSpdyPost( |
| 447 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | 412 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 448 AddWrite(*req); | 413 AddWrite(*req); |
| 449 | 414 |
| 450 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); | 415 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); |
| 451 AddRead(*resp); | 416 AddRead(*resp); |
| 452 | 417 |
| 453 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); | 418 std::string chunk_data(kMaxSpdyFrameChunkSize, 'x'); |
| 454 scoped_ptr<SpdyFrame> chunk( | 419 scoped_ptr<SpdyFrame> chunk( |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 } | 465 } |
| 501 | 466 |
| 502 // Receiving a header with uppercase ASCII should result in a protocol | 467 // Receiving a header with uppercase ASCII should result in a protocol |
| 503 // error. | 468 // error. |
| 504 TEST_P(SpdyStreamTest, UpperCaseHeaders) { | 469 TEST_P(SpdyStreamTest, UpperCaseHeaders) { |
| 505 GURL url(kStreamUrl); | 470 GURL url(kStreamUrl); |
| 506 | 471 |
| 507 session_ = | 472 session_ = |
| 508 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 473 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
| 509 | 474 |
| 510 scoped_ptr<SpdyFrame> initial_window_update( | |
| 511 spdy_util_.ConstructSpdyWindowUpdate( | |
| 512 kSessionFlowControlStreamId, | |
| 513 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 514 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 515 AddWrite(*initial_window_update); | |
| 516 | |
| 517 scoped_ptr<SpdyFrame> syn( | 475 scoped_ptr<SpdyFrame> syn( |
| 518 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 476 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 519 AddWrite(*syn); | 477 AddWrite(*syn); |
| 520 | 478 |
| 521 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; | 479 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; |
| 522 scoped_ptr<SpdyFrame> | 480 scoped_ptr<SpdyFrame> |
| 523 reply(spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); | 481 reply(spdy_util_.ConstructSpdyGetSynReply(kExtraHeaders, 1, 1)); |
| 524 AddRead(*reply); | 482 AddRead(*reply); |
| 525 | 483 |
| 526 scoped_ptr<SpdyFrame> rst( | 484 scoped_ptr<SpdyFrame> rst( |
| (...skipping 23 matching lines...) Expand all Loading... |
| 550 | 508 |
| 551 EXPECT_FALSE(stream->HasUrl()); | 509 EXPECT_FALSE(stream->HasUrl()); |
| 552 | 510 |
| 553 scoped_ptr<SpdyHeaderBlock> headers( | 511 scoped_ptr<SpdyHeaderBlock> headers( |
| 554 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); | 512 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); |
| 555 EXPECT_EQ(ERR_IO_PENDING, | 513 EXPECT_EQ(ERR_IO_PENDING, |
| 556 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); | 514 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); |
| 557 EXPECT_TRUE(stream->HasUrl()); | 515 EXPECT_TRUE(stream->HasUrl()); |
| 558 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 516 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 559 | 517 |
| 560 // For the initial window update. | |
| 561 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 562 data.RunFor(1); | |
| 563 | |
| 564 data.RunFor(4); | 518 data.RunFor(4); |
| 565 | 519 |
| 566 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate.WaitForClose()); | 520 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate.WaitForClose()); |
| 567 } | 521 } |
| 568 | 522 |
| 569 // Receiving a header with uppercase ASCII should result in a protocol | 523 // Receiving a header with uppercase ASCII should result in a protocol |
| 570 // error even for a push stream. | 524 // error even for a push stream. |
| 571 TEST_P(SpdyStreamTest, UpperCaseHeadersOnPush) { | 525 TEST_P(SpdyStreamTest, UpperCaseHeadersOnPush) { |
| 572 GURL url(kStreamUrl); | 526 GURL url(kStreamUrl); |
| 573 | 527 |
| 574 session_ = | 528 session_ = |
| 575 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 529 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
| 576 | 530 |
| 577 scoped_ptr<SpdyFrame> initial_window_update( | |
| 578 spdy_util_.ConstructSpdyWindowUpdate( | |
| 579 kSessionFlowControlStreamId, | |
| 580 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 581 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 582 AddWrite(*initial_window_update); | |
| 583 | |
| 584 scoped_ptr<SpdyFrame> syn( | 531 scoped_ptr<SpdyFrame> syn( |
| 585 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 532 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 586 AddWrite(*syn); | 533 AddWrite(*syn); |
| 587 | 534 |
| 588 scoped_ptr<SpdyFrame> | 535 scoped_ptr<SpdyFrame> |
| 589 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 536 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 590 AddRead(*reply); | 537 AddRead(*reply); |
| 591 | 538 |
| 592 const char* const extra_headers[] = {"X-UpperCase", "yes"}; | 539 const char* const extra_headers[] = {"X-UpperCase", "yes"}; |
| 593 scoped_ptr<SpdyFrame> | 540 scoped_ptr<SpdyFrame> |
| (...skipping 27 matching lines...) Expand all Loading... |
| 621 | 568 |
| 622 EXPECT_FALSE(stream->HasUrl()); | 569 EXPECT_FALSE(stream->HasUrl()); |
| 623 | 570 |
| 624 scoped_ptr<SpdyHeaderBlock> headers( | 571 scoped_ptr<SpdyHeaderBlock> headers( |
| 625 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); | 572 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); |
| 626 EXPECT_EQ(ERR_IO_PENDING, | 573 EXPECT_EQ(ERR_IO_PENDING, |
| 627 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); | 574 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); |
| 628 EXPECT_TRUE(stream->HasUrl()); | 575 EXPECT_TRUE(stream->HasUrl()); |
| 629 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 576 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 630 | 577 |
| 631 // For the initial window update. | |
| 632 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 633 data.RunFor(1); | |
| 634 | |
| 635 data.RunFor(4); | 578 data.RunFor(4); |
| 636 | 579 |
| 637 base::WeakPtr<SpdyStream> push_stream; | 580 base::WeakPtr<SpdyStream> push_stream; |
| 638 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); | 581 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); |
| 639 EXPECT_FALSE(push_stream); | 582 EXPECT_FALSE(push_stream); |
| 640 | 583 |
| 641 data.RunFor(1); | 584 data.RunFor(1); |
| 642 | 585 |
| 643 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 586 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 644 } | 587 } |
| 645 | 588 |
| 646 // Receiving a header with uppercase ASCII in a HEADERS frame should | 589 // Receiving a header with uppercase ASCII in a HEADERS frame should |
| 647 // result in a protocol error. | 590 // result in a protocol error. |
| 648 TEST_P(SpdyStreamTest, UpperCaseHeadersInHeadersFrame) { | 591 TEST_P(SpdyStreamTest, UpperCaseHeadersInHeadersFrame) { |
| 649 GURL url(kStreamUrl); | 592 GURL url(kStreamUrl); |
| 650 | 593 |
| 651 session_ = | 594 session_ = |
| 652 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 595 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
| 653 | 596 |
| 654 scoped_ptr<SpdyFrame> initial_window_update( | |
| 655 spdy_util_.ConstructSpdyWindowUpdate( | |
| 656 kSessionFlowControlStreamId, | |
| 657 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 658 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 659 AddWrite(*initial_window_update); | |
| 660 | |
| 661 scoped_ptr<SpdyFrame> syn( | 597 scoped_ptr<SpdyFrame> syn( |
| 662 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 598 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 663 AddWrite(*syn); | 599 AddWrite(*syn); |
| 664 | 600 |
| 665 scoped_ptr<SpdyFrame> | 601 scoped_ptr<SpdyFrame> |
| 666 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 602 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 667 AddRead(*reply); | 603 AddRead(*reply); |
| 668 | 604 |
| 669 scoped_ptr<SpdyFrame> | 605 scoped_ptr<SpdyFrame> |
| 670 push(spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); | 606 push(spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 709 | 645 |
| 710 EXPECT_FALSE(stream->HasUrl()); | 646 EXPECT_FALSE(stream->HasUrl()); |
| 711 | 647 |
| 712 scoped_ptr<SpdyHeaderBlock> headers( | 648 scoped_ptr<SpdyHeaderBlock> headers( |
| 713 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); | 649 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); |
| 714 EXPECT_EQ(ERR_IO_PENDING, | 650 EXPECT_EQ(ERR_IO_PENDING, |
| 715 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); | 651 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); |
| 716 EXPECT_TRUE(stream->HasUrl()); | 652 EXPECT_TRUE(stream->HasUrl()); |
| 717 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 653 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 718 | 654 |
| 719 // For the initial window update. | |
| 720 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 721 data.RunFor(1); | |
| 722 | |
| 723 data.RunFor(3); | 655 data.RunFor(3); |
| 724 | 656 |
| 725 base::WeakPtr<SpdyStream> push_stream; | 657 base::WeakPtr<SpdyStream> push_stream; |
| 726 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); | 658 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); |
| 727 EXPECT_TRUE(push_stream); | 659 EXPECT_TRUE(push_stream); |
| 728 | 660 |
| 729 data.RunFor(1); | 661 data.RunFor(1); |
| 730 | 662 |
| 731 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); | 663 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); |
| 732 EXPECT_FALSE(push_stream); | 664 EXPECT_FALSE(push_stream); |
| 733 | 665 |
| 734 data.RunFor(2); | 666 data.RunFor(2); |
| 735 | 667 |
| 736 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 668 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 737 } | 669 } |
| 738 | 670 |
| 739 // Receiving a duplicate header in a HEADERS frame should result in a | 671 // Receiving a duplicate header in a HEADERS frame should result in a |
| 740 // protocol error. | 672 // protocol error. |
| 741 TEST_P(SpdyStreamTest, DuplicateHeaders) { | 673 TEST_P(SpdyStreamTest, DuplicateHeaders) { |
| 742 GURL url(kStreamUrl); | 674 GURL url(kStreamUrl); |
| 743 | 675 |
| 744 session_ = | 676 session_ = |
| 745 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 677 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
| 746 | 678 |
| 747 scoped_ptr<SpdyFrame> initial_window_update( | |
| 748 spdy_util_.ConstructSpdyWindowUpdate( | |
| 749 kSessionFlowControlStreamId, | |
| 750 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 751 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 752 AddWrite(*initial_window_update); | |
| 753 | |
| 754 scoped_ptr<SpdyFrame> syn( | 679 scoped_ptr<SpdyFrame> syn( |
| 755 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); | 680 spdy_util_.ConstructSpdyGet(NULL, 0, false, 1, LOWEST, true)); |
| 756 AddWrite(*syn); | 681 AddWrite(*syn); |
| 757 | 682 |
| 758 scoped_ptr<SpdyFrame> | 683 scoped_ptr<SpdyFrame> |
| 759 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 684 reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 760 AddRead(*reply); | 685 AddRead(*reply); |
| 761 | 686 |
| 762 scoped_ptr<SpdyFrame> | 687 scoped_ptr<SpdyFrame> |
| 763 push(spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); | 688 push(spdy_util_.ConstructSpdyPush(NULL, 0, 2, 1, kStreamUrl)); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 802 | 727 |
| 803 EXPECT_FALSE(stream->HasUrl()); | 728 EXPECT_FALSE(stream->HasUrl()); |
| 804 | 729 |
| 805 scoped_ptr<SpdyHeaderBlock> headers( | 730 scoped_ptr<SpdyHeaderBlock> headers( |
| 806 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); | 731 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); |
| 807 EXPECT_EQ(ERR_IO_PENDING, | 732 EXPECT_EQ(ERR_IO_PENDING, |
| 808 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); | 733 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); |
| 809 EXPECT_TRUE(stream->HasUrl()); | 734 EXPECT_TRUE(stream->HasUrl()); |
| 810 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 735 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 811 | 736 |
| 812 // For the initial window update. | |
| 813 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 814 data.RunFor(1); | |
| 815 | |
| 816 data.RunFor(3); | 737 data.RunFor(3); |
| 817 | 738 |
| 818 base::WeakPtr<SpdyStream> push_stream; | 739 base::WeakPtr<SpdyStream> push_stream; |
| 819 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); | 740 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); |
| 820 EXPECT_TRUE(push_stream); | 741 EXPECT_TRUE(push_stream); |
| 821 | 742 |
| 822 data.RunFor(1); | 743 data.RunFor(1); |
| 823 | 744 |
| 824 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); | 745 EXPECT_EQ(OK, session->GetPushStream(url, &push_stream, BoundNetLog())); |
| 825 EXPECT_FALSE(push_stream); | 746 EXPECT_FALSE(push_stream); |
| 826 | 747 |
| 827 data.RunFor(2); | 748 data.RunFor(2); |
| 828 | 749 |
| 829 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 750 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 830 } | 751 } |
| 831 | 752 |
| 832 // The tests below are only for SPDY/3 and above. | 753 // The tests below are only for SPDY/3 and above. |
| 833 | 754 |
| 834 // Call IncreaseSendWindowSize on a stream with a large enough delta | 755 // Call IncreaseSendWindowSize on a stream with a large enough delta |
| 835 // to overflow an int32. The SpdyStream should handle that case | 756 // to overflow an int32. The SpdyStream should handle that case |
| 836 // gracefully. | 757 // gracefully. |
| 837 TEST_P(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { | 758 TEST_P(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { |
| 838 if (spdy_util_.protocol() < kProtoSPDY3) | 759 if (spdy_util_.protocol() < kProtoSPDY3) |
| 839 return; | 760 return; |
| 840 | 761 |
| 841 session_ = | 762 session_ = |
| 842 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 763 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
| 843 | 764 |
| 844 scoped_ptr<SpdyFrame> initial_window_update( | |
| 845 spdy_util_.ConstructSpdyWindowUpdate( | |
| 846 kSessionFlowControlStreamId, | |
| 847 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 848 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 849 AddWrite(*initial_window_update); | |
| 850 | |
| 851 scoped_ptr<SpdyFrame> req( | 765 scoped_ptr<SpdyFrame> req( |
| 852 spdy_util_.ConstructSpdyPost( | 766 spdy_util_.ConstructSpdyPost( |
| 853 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | 767 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 854 AddWrite(*req); | 768 AddWrite(*req); |
| 855 | 769 |
| 856 // Triggered by the overflowing call to IncreaseSendWindowSize | 770 // Triggered by the overflowing call to IncreaseSendWindowSize |
| 857 // below. | 771 // below. |
| 858 scoped_ptr<SpdyFrame> rst( | 772 scoped_ptr<SpdyFrame> rst( |
| 859 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); | 773 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); |
| 860 AddWrite(*rst); | 774 AddWrite(*rst); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 882 StreamDelegateSendImmediate delegate(stream, kPostBodyStringPiece); | 796 StreamDelegateSendImmediate delegate(stream, kPostBodyStringPiece); |
| 883 stream->SetDelegate(&delegate); | 797 stream->SetDelegate(&delegate); |
| 884 | 798 |
| 885 scoped_ptr<SpdyHeaderBlock> headers( | 799 scoped_ptr<SpdyHeaderBlock> headers( |
| 886 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); | 800 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
| 887 EXPECT_EQ(ERR_IO_PENDING, | 801 EXPECT_EQ(ERR_IO_PENDING, |
| 888 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 802 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
| 889 EXPECT_TRUE(stream->HasUrl()); | 803 EXPECT_TRUE(stream->HasUrl()); |
| 890 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 804 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 891 | 805 |
| 892 // For the initial window update. | |
| 893 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 894 data.RunFor(1); | |
| 895 | |
| 896 data.RunFor(1); | 806 data.RunFor(1); |
| 897 | 807 |
| 898 int32 old_send_window_size = stream->send_window_size(); | 808 int32 old_send_window_size = stream->send_window_size(); |
| 899 ASSERT_GT(old_send_window_size, 0); | 809 ASSERT_GT(old_send_window_size, 0); |
| 900 int32 delta_window_size = kint32max - old_send_window_size + 1; | 810 int32 delta_window_size = kint32max - old_send_window_size + 1; |
| 901 stream->IncreaseSendWindowSize(delta_window_size); | 811 stream->IncreaseSendWindowSize(delta_window_size); |
| 902 EXPECT_EQ(NULL, stream.get()); | 812 EXPECT_EQ(NULL, stream.get()); |
| 903 | 813 |
| 904 data.RunFor(2); | 814 data.RunFor(2); |
| 905 | 815 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 934 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 844 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
| 935 stream->AdjustSendWindowSize(+delta_window_size); | 845 stream->AdjustSendWindowSize(+delta_window_size); |
| 936 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 846 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
| 937 } | 847 } |
| 938 | 848 |
| 939 // Given an unstall function, runs a test to make sure that a | 849 // Given an unstall function, runs a test to make sure that a |
| 940 // request/response (i.e., an HTTP-like) stream resumes after a stall | 850 // request/response (i.e., an HTTP-like) stream resumes after a stall |
| 941 // and unstall. | 851 // and unstall. |
| 942 void SpdyStreamTest::RunResumeAfterUnstallRequestResponseTest( | 852 void SpdyStreamTest::RunResumeAfterUnstallRequestResponseTest( |
| 943 const UnstallFunction& unstall_function) { | 853 const UnstallFunction& unstall_function) { |
| 944 if (spdy_util_.protocol() < kProtoSPDY3) | |
| 945 return; | |
| 946 | |
| 947 GURL url(kStreamUrl); | 854 GURL url(kStreamUrl); |
| 948 | 855 |
| 949 session_ = | 856 session_ = |
| 950 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 857 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
| 951 | 858 |
| 952 scoped_ptr<SpdyFrame> initial_window_update( | |
| 953 spdy_util_.ConstructSpdyWindowUpdate( | |
| 954 kSessionFlowControlStreamId, | |
| 955 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 956 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 957 AddWrite(*initial_window_update); | |
| 958 | |
| 959 scoped_ptr<SpdyFrame> req( | 859 scoped_ptr<SpdyFrame> req( |
| 960 spdy_util_.ConstructSpdyPost( | 860 spdy_util_.ConstructSpdyPost( |
| 961 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | 861 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 962 AddWrite(*req); | 862 AddWrite(*req); |
| 963 | 863 |
| 964 scoped_ptr<SpdyFrame> body( | 864 scoped_ptr<SpdyFrame> body( |
| 965 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, true)); | 865 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, true)); |
| 966 AddWrite(*body); | 866 AddWrite(*body); |
| 967 | 867 |
| 968 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 868 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 994 | 894 |
| 995 scoped_ptr<SpdyHeaderBlock> headers( | 895 scoped_ptr<SpdyHeaderBlock> headers( |
| 996 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); | 896 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
| 997 EXPECT_EQ(ERR_IO_PENDING, | 897 EXPECT_EQ(ERR_IO_PENDING, |
| 998 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 898 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
| 999 EXPECT_TRUE(stream->HasUrl()); | 899 EXPECT_TRUE(stream->HasUrl()); |
| 1000 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 900 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 1001 | 901 |
| 1002 StallStream(stream); | 902 StallStream(stream); |
| 1003 | 903 |
| 1004 // For the initial window update. | |
| 1005 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 1006 data.RunFor(1); | |
| 1007 | |
| 1008 data.RunFor(1); | 904 data.RunFor(1); |
| 1009 | 905 |
| 1010 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 906 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
| 1011 | 907 |
| 1012 unstall_function.Run(stream, kPostBodyLength); | 908 unstall_function.Run(stream, kPostBodyLength); |
| 1013 | 909 |
| 1014 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 910 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
| 1015 | 911 |
| 1016 data.RunFor(3); | 912 data.RunFor(3); |
| 1017 | 913 |
| 1018 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 914 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 1019 | 915 |
| 1020 EXPECT_TRUE(delegate.send_headers_completed()); | 916 EXPECT_TRUE(delegate.send_headers_completed()); |
| 1021 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | 917 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
| 1022 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); | 918 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); |
| 1023 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); | 919 EXPECT_EQ(std::string(), delegate.TakeReceivedData()); |
| 1024 EXPECT_TRUE(data.at_write_eof()); | 920 EXPECT_TRUE(data.at_write_eof()); |
| 1025 } | 921 } |
| 1026 | 922 |
| 1027 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseRequestResponse) { | 923 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseRequestResponse) { |
| 924 if (spdy_util_.protocol() < kProtoSPDY3) |
| 925 return; |
| 926 |
| 1028 RunResumeAfterUnstallRequestResponseTest( | 927 RunResumeAfterUnstallRequestResponseTest( |
| 1029 base::Bind(&IncreaseStreamSendWindowSize)); | 928 base::Bind(&IncreaseStreamSendWindowSize)); |
| 1030 } | 929 } |
| 1031 | 930 |
| 1032 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeAdjustRequestResponse) { | 931 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeAdjustRequestResponse) { |
| 932 if (spdy_util_.protocol() < kProtoSPDY3) |
| 933 return; |
| 934 |
| 1033 RunResumeAfterUnstallRequestResponseTest( | 935 RunResumeAfterUnstallRequestResponseTest( |
| 1034 base::Bind(&AdjustStreamSendWindowSize)); | 936 base::Bind(&AdjustStreamSendWindowSize)); |
| 1035 } | 937 } |
| 1036 | 938 |
| 1037 // Given an unstall function, runs a test to make sure that a | 939 // Given an unstall function, runs a test to make sure that a |
| 1038 // bidirectional (i.e., non-HTTP-like) stream resumes after a stall | 940 // bidirectional (i.e., non-HTTP-like) stream resumes after a stall |
| 1039 // and unstall. | 941 // and unstall. |
| 1040 void SpdyStreamTest::RunResumeAfterUnstallBidirectionalTest( | 942 void SpdyStreamTest::RunResumeAfterUnstallBidirectionalTest( |
| 1041 const UnstallFunction& unstall_function) { | 943 const UnstallFunction& unstall_function) { |
| 1042 if (spdy_util_.protocol() < kProtoSPDY3) | |
| 1043 return; | |
| 1044 | |
| 1045 GURL url(kStreamUrl); | 944 GURL url(kStreamUrl); |
| 1046 | 945 |
| 1047 session_ = | 946 session_ = |
| 1048 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 947 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
| 1049 | 948 |
| 1050 scoped_ptr<SpdyFrame> initial_window_update( | |
| 1051 spdy_util_.ConstructSpdyWindowUpdate( | |
| 1052 kSessionFlowControlStreamId, | |
| 1053 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 1054 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 1055 AddWrite(*initial_window_update); | |
| 1056 | |
| 1057 scoped_ptr<SpdyFrame> req( | 949 scoped_ptr<SpdyFrame> req( |
| 1058 spdy_util_.ConstructSpdyPost( | 950 spdy_util_.ConstructSpdyPost( |
| 1059 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | 951 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
| 1060 AddWrite(*req); | 952 AddWrite(*req); |
| 1061 | 953 |
| 1062 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); | 954 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 1063 AddRead(*resp); | 955 AddRead(*resp); |
| 1064 | 956 |
| 1065 scoped_ptr<SpdyFrame> msg( | 957 scoped_ptr<SpdyFrame> msg( |
| 1066 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); | 958 spdy_util_.ConstructSpdyBodyFrame(1, kPostBody, kPostBodyLength, false)); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1099 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 991 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
| 1100 EXPECT_TRUE(stream->HasUrl()); | 992 EXPECT_TRUE(stream->HasUrl()); |
| 1101 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | 993 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 1102 | 994 |
| 1103 data.RunFor(1); | 995 data.RunFor(1); |
| 1104 | 996 |
| 1105 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 997 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
| 1106 | 998 |
| 1107 StallStream(stream); | 999 StallStream(stream); |
| 1108 | 1000 |
| 1109 // For the initial window update. | |
| 1110 if (spdy_util_.protocol() >= kProtoSPDY31) | |
| 1111 data.RunFor(1); | |
| 1112 | |
| 1113 data.RunFor(1); | 1001 data.RunFor(1); |
| 1114 | 1002 |
| 1115 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 1003 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
| 1116 | 1004 |
| 1117 unstall_function.Run(stream, kPostBodyLength); | 1005 unstall_function.Run(stream, kPostBodyLength); |
| 1118 | 1006 |
| 1119 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 1007 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
| 1120 | 1008 |
| 1121 data.RunFor(3); | 1009 data.RunFor(3); |
| 1122 | 1010 |
| 1123 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 1011 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 1124 | 1012 |
| 1125 EXPECT_TRUE(delegate.send_headers_completed()); | 1013 EXPECT_TRUE(delegate.send_headers_completed()); |
| 1126 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | 1014 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
| 1127 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); | 1015 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); |
| 1128 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), | 1016 EXPECT_EQ(std::string(kPostBody, kPostBodyLength), |
| 1129 delegate.TakeReceivedData()); | 1017 delegate.TakeReceivedData()); |
| 1130 EXPECT_TRUE(data.at_write_eof()); | 1018 EXPECT_TRUE(data.at_write_eof()); |
| 1131 } | 1019 } |
| 1132 | 1020 |
| 1133 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseBidirectional) { | 1021 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeIncreaseBidirectional) { |
| 1022 if (spdy_util_.protocol() < kProtoSPDY3) |
| 1023 return; |
| 1024 |
| 1134 RunResumeAfterUnstallBidirectionalTest( | 1025 RunResumeAfterUnstallBidirectionalTest( |
| 1135 base::Bind(&IncreaseStreamSendWindowSize)); | 1026 base::Bind(&IncreaseStreamSendWindowSize)); |
| 1136 } | 1027 } |
| 1137 | 1028 |
| 1138 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeAdjustBidirectional) { | 1029 TEST_P(SpdyStreamTest, ResumeAfterSendWindowSizeAdjustBidirectional) { |
| 1030 if (spdy_util_.protocol() < kProtoSPDY3) |
| 1031 return; |
| 1032 |
| 1139 RunResumeAfterUnstallBidirectionalTest( | 1033 RunResumeAfterUnstallBidirectionalTest( |
| 1140 base::Bind(&AdjustStreamSendWindowSize)); | 1034 base::Bind(&AdjustStreamSendWindowSize)); |
| 1141 } | 1035 } |
| 1142 | 1036 |
| 1143 } // namespace | 1037 } // namespace |
| 1144 | 1038 |
| 1145 } // namespace test | 1039 } // namespace test |
| 1146 | 1040 |
| 1147 } // namespace net | 1041 } // namespace net |
| OLD | NEW |