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

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

Issue 17760008: [SPDY] Enable tests for SPDY/3.1 and SPDY/4 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/spdy/spdy_session_unittest.cc ('k') | net/spdy/spdy_test_util_common.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/spdy/spdy_session_unittest.cc ('k') | net/spdy/spdy_test_util_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698