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

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

Issue 2167253002: s/SYN_STREAM/HEADERS/ in frame types, method names, comments. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 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
« no previous file with comments | « net/spdy/spdy_http_stream_unittest.cc ('k') | net/spdy/spdy_proxy_client_socket.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 (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 <cmath> 5 #include <cmath>
6 #include <memory> 6 #include <memory>
7 #include <string> 7 #include <string>
8 #include <utility> 8 #include <utility>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 EXPECT_TRUE(trans2->GetLoadTimingInfo(&load_timing_info2)); 487 EXPECT_TRUE(trans2->GetLoadTimingInfo(&load_timing_info2));
488 EXPECT_FALSE(load_timing_info2.push_start.is_null()); 488 EXPECT_FALSE(load_timing_info2.push_start.is_null());
489 EXPECT_FALSE(load_timing_info2.push_end.is_null()); 489 EXPECT_FALSE(load_timing_info2.push_end.is_null());
490 490
491 // Verify that the received push data is same as the expected push data. 491 // Verify that the received push data is same as the expected push data.
492 EXPECT_EQ(result2.compare(expected), 0) << "Received data: " 492 EXPECT_EQ(result2.compare(expected), 0) << "Received data: "
493 << result2 493 << result2
494 << "||||| Expected data: " 494 << "||||| Expected data: "
495 << expected; 495 << expected;
496 496
497 // Verify the SYN_REPLY. 497 // Verify the response HEADERS.
498 // Copy the response info, because trans goes away. 498 // Copy the response info, because trans goes away.
499 *response = *trans->GetResponseInfo(); 499 *response = *trans->GetResponseInfo();
500 *push_response = *trans2->GetResponseInfo(); 500 *push_response = *trans2->GetResponseInfo();
501 501
502 VerifyStreamsClosed(helper); 502 VerifyStreamsClosed(helper);
503 } 503 }
504 504
505 static void DeleteSessionCallback(NormalSpdyTransactionHelper* helper, 505 static void DeleteSessionCallback(NormalSpdyTransactionHelper* helper,
506 int result) { 506 int result) {
507 helper->ResetTrans(); 507 helper->ResetTrans();
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
555 auto trans = 555 auto trans =
556 base::MakeUnique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get()); 556 base::MakeUnique<HttpNetworkTransaction>(DEFAULT_PRIORITY, session.get());
557 } 557 }
558 558
559 TEST_F(SpdyNetworkTransactionTest, Get) { 559 TEST_F(SpdyNetworkTransactionTest, Get) {
560 // Construct the request. 560 // Construct the request.
561 SpdySerializedFrame req( 561 SpdySerializedFrame req(
562 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 562 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
563 MockWrite writes[] = {CreateMockWrite(req, 0)}; 563 MockWrite writes[] = {CreateMockWrite(req, 0)};
564 564
565 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 565 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
566 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 566 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
567 MockRead reads[] = { 567 MockRead reads[] = {
568 CreateMockRead(resp, 1), CreateMockRead(body, 2), 568 CreateMockRead(resp, 1), CreateMockRead(body, 2),
569 MockRead(ASYNC, 0, 3) // EOF 569 MockRead(ASYNC, 0, 3) // EOF
570 }; 570 };
571 571
572 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 572 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
573 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 573 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
574 BoundNetLog(), NULL); 574 BoundNetLog(), NULL);
575 helper.RunToCompletion(&data); 575 helper.RunToCompletion(&data);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 EXPECT_EQ(3, spdy_prio); 608 EXPECT_EQ(3, spdy_prio);
609 break; 609 break;
610 case IDLE: 610 case IDLE:
611 EXPECT_EQ(4, spdy_prio); 611 EXPECT_EQ(4, spdy_prio);
612 break; 612 break;
613 default: 613 default:
614 FAIL(); 614 FAIL();
615 } 615 }
616 616
617 SpdySerializedFrame resp( 617 SpdySerializedFrame resp(
618 spdy_test_util.ConstructSpdyGetSynReply(nullptr, 0, 1)); 618 spdy_test_util.ConstructSpdyGetReply(nullptr, 0, 1));
619 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true)); 619 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true));
620 MockRead reads[] = { 620 MockRead reads[] = {
621 CreateMockRead(resp, 1), CreateMockRead(body, 2), 621 CreateMockRead(resp, 1), CreateMockRead(body, 2),
622 MockRead(ASYNC, 0, 3) // EOF 622 MockRead(ASYNC, 0, 3) // EOF
623 }; 623 };
624 624
625 SequencedSocketData data(reads, arraysize(reads), writes, 625 SequencedSocketData data(reads, arraysize(reads), writes,
626 arraysize(writes)); 626 arraysize(writes));
627 HttpRequestInfo http_req = CreateGetRequest(); 627 HttpRequestInfo http_req = CreateGetRequest();
628 628
(...skipping 12 matching lines...) Expand all
641 // This can't use the TransactionHelper method, since it only 641 // This can't use the TransactionHelper method, since it only
642 // handles a single transaction, and finishes them as soon 642 // handles a single transaction, and finishes them as soon
643 // as it launches them. 643 // as it launches them.
644 644
645 // TODO(gavinp): create a working generalized TransactionHelper that 645 // TODO(gavinp): create a working generalized TransactionHelper that
646 // can allow multiple streams in flight. 646 // can allow multiple streams in flight.
647 647
648 TEST_F(SpdyNetworkTransactionTest, ThreeGets) { 648 TEST_F(SpdyNetworkTransactionTest, ThreeGets) {
649 SpdySerializedFrame req( 649 SpdySerializedFrame req(
650 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 650 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
651 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 651 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
652 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 652 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
653 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 653 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
654 654
655 SpdySerializedFrame req2( 655 SpdySerializedFrame req2(
656 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 656 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
657 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 657 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
658 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 658 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
659 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 659 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
660 660
661 SpdySerializedFrame req3( 661 SpdySerializedFrame req3(
662 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); 662 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true));
663 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); 663 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5));
664 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false)); 664 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false));
665 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true)); 665 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true));
666 666
667 MockWrite writes[] = { 667 MockWrite writes[] = {
668 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), 668 CreateMockWrite(req, 0), CreateMockWrite(req2, 3),
669 CreateMockWrite(req3, 6), 669 CreateMockWrite(req3, 6),
670 }; 670 };
671 MockRead reads[] = { 671 MockRead reads[] = {
672 CreateMockRead(resp, 1), CreateMockRead(body, 2), 672 CreateMockRead(resp, 1), CreateMockRead(body, 2),
673 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), 673 CreateMockRead(resp2, 4), CreateMockRead(body2, 5),
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
733 EXPECT_THAT(out.rv, IsOk()); 733 EXPECT_THAT(out.rv, IsOk());
734 734
735 EXPECT_THAT(out.rv, IsOk()); 735 EXPECT_THAT(out.rv, IsOk());
736 EXPECT_EQ("HTTP/1.1 200", out.status_line); 736 EXPECT_EQ("HTTP/1.1 200", out.status_line);
737 EXPECT_EQ("hello!hello!", out.response_data); 737 EXPECT_EQ("hello!hello!", out.response_data);
738 } 738 }
739 739
740 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBinding) { 740 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBinding) {
741 SpdySerializedFrame req( 741 SpdySerializedFrame req(
742 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 742 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
743 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 743 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
744 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 744 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
745 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 745 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
746 746
747 SpdySerializedFrame req2( 747 SpdySerializedFrame req2(
748 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 748 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
749 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 749 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
750 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 750 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
751 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 751 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
752 752
753 MockWrite writes[] = { 753 MockWrite writes[] = {
754 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), 754 CreateMockWrite(req, 0), CreateMockWrite(req2, 3),
755 }; 755 };
756 MockRead reads[] = { 756 MockRead reads[] = {
757 CreateMockRead(resp, 1), CreateMockRead(body, 2), 757 CreateMockRead(resp, 1), CreateMockRead(body, 2),
758 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), 758 CreateMockRead(resp2, 4), CreateMockRead(body2, 5),
759 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7), 759 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7),
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
815 EXPECT_THAT(out.rv, IsOk()); 815 EXPECT_THAT(out.rv, IsOk());
816 EXPECT_EQ("HTTP/1.1 200", out.status_line); 816 EXPECT_EQ("HTTP/1.1 200", out.status_line);
817 EXPECT_EQ("hello!hello!", out.response_data); 817 EXPECT_EQ("hello!hello!", out.response_data);
818 818
819 helper.VerifyDataConsumed(); 819 helper.VerifyDataConsumed();
820 } 820 }
821 821
822 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBindingFromPreconnect) { 822 TEST_F(SpdyNetworkTransactionTest, TwoGetsLateBindingFromPreconnect) {
823 SpdySerializedFrame req( 823 SpdySerializedFrame req(
824 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 824 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
825 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 825 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
826 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 826 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
827 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 827 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
828 828
829 SpdySerializedFrame req2( 829 SpdySerializedFrame req2(
830 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 830 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
831 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 831 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
832 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 832 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
833 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 833 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
834 834
835 MockWrite writes[] = { 835 MockWrite writes[] = {
836 CreateMockWrite(req, 0), CreateMockWrite(req2, 3), 836 CreateMockWrite(req, 0), CreateMockWrite(req2, 3),
837 }; 837 };
838 MockRead reads[] = { 838 MockRead reads[] = {
839 CreateMockRead(resp, 1), CreateMockRead(body, 2), 839 CreateMockRead(resp, 1), CreateMockRead(body, 2),
840 CreateMockRead(resp2, 4), CreateMockRead(body2, 5), 840 CreateMockRead(resp2, 4), CreateMockRead(body2, 5),
841 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7), 841 CreateMockRead(fbody, 6), CreateMockRead(fbody2, 7),
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
912 // Similar to ThreeGets above, however this test adds a SETTINGS 912 // Similar to ThreeGets above, however this test adds a SETTINGS
913 // frame. The SETTINGS frame is read during the IO loop waiting on 913 // frame. The SETTINGS frame is read during the IO loop waiting on
914 // the first transaction completion, and sets a maximum concurrent 914 // the first transaction completion, and sets a maximum concurrent
915 // stream limit of 1. This means that our IO loop exists after the 915 // stream limit of 1. This means that our IO loop exists after the
916 // second transaction completes, so we can assert on read_index(). 916 // second transaction completes, so we can assert on read_index().
917 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) { 917 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) {
918 // Construct the request. 918 // Construct the request.
919 // Each request fully completes before the next starts. 919 // Each request fully completes before the next starts.
920 SpdySerializedFrame req( 920 SpdySerializedFrame req(
921 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 921 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
922 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 922 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
923 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 923 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
924 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 924 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
925 spdy_util_.UpdateWithStreamDestruction(1); 925 spdy_util_.UpdateWithStreamDestruction(1);
926 926
927 SpdySerializedFrame req2( 927 SpdySerializedFrame req2(
928 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 928 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
929 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 929 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
930 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 930 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
931 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 931 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
932 spdy_util_.UpdateWithStreamDestruction(3); 932 spdy_util_.UpdateWithStreamDestruction(3);
933 933
934 SpdySerializedFrame req3( 934 SpdySerializedFrame req3(
935 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); 935 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true));
936 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); 936 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5));
937 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false)); 937 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, false));
938 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true)); 938 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(5, true));
939 939
940 SettingsMap settings; 940 SettingsMap settings;
941 const uint32_t max_concurrent_streams = 1; 941 const uint32_t max_concurrent_streams = 1;
942 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 942 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
943 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 943 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
944 SpdySerializedFrame settings_frame( 944 SpdySerializedFrame settings_frame(
945 spdy_util_.ConstructSpdySettings(settings)); 945 spdy_util_.ConstructSpdySettings(settings));
946 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 946 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
1040 1040
1041 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds 1041 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds
1042 // a fourth transaction. The third and fourth transactions have 1042 // a fourth transaction. The third and fourth transactions have
1043 // different data ("hello!" vs "hello!hello!") and because of the 1043 // different data ("hello!" vs "hello!hello!") and because of the
1044 // user specified priority, we expect to see them inverted in 1044 // user specified priority, we expect to see them inverted in
1045 // the response from the server. 1045 // the response from the server.
1046 TEST_F(SpdyNetworkTransactionTest, FourGetsWithMaxConcurrentPriority) { 1046 TEST_F(SpdyNetworkTransactionTest, FourGetsWithMaxConcurrentPriority) {
1047 // Construct the request. 1047 // Construct the request.
1048 SpdySerializedFrame req( 1048 SpdySerializedFrame req(
1049 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1049 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1050 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1050 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
1051 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 1051 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
1052 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 1052 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
1053 spdy_util_.UpdateWithStreamDestruction(1); 1053 spdy_util_.UpdateWithStreamDestruction(1);
1054 1054
1055 SpdySerializedFrame req2( 1055 SpdySerializedFrame req2(
1056 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 1056 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
1057 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1057 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
1058 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 1058 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
1059 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 1059 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
1060 spdy_util_.UpdateWithStreamDestruction(3); 1060 spdy_util_.UpdateWithStreamDestruction(3);
1061 1061
1062 SpdySerializedFrame req4( 1062 SpdySerializedFrame req4(
1063 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, HIGHEST, true)); 1063 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, HIGHEST, true));
1064 SpdySerializedFrame resp4(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); 1064 SpdySerializedFrame resp4(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5));
1065 SpdySerializedFrame fbody4(spdy_util_.ConstructSpdyDataFrame(5, true)); 1065 SpdySerializedFrame fbody4(spdy_util_.ConstructSpdyDataFrame(5, true));
1066 spdy_util_.UpdateWithStreamDestruction(5); 1066 spdy_util_.UpdateWithStreamDestruction(5);
1067 1067
1068 SpdySerializedFrame req3( 1068 SpdySerializedFrame req3(
1069 spdy_util_.ConstructSpdyGet(nullptr, 0, 7, LOWEST, true)); 1069 spdy_util_.ConstructSpdyGet(nullptr, 0, 7, LOWEST, true));
1070 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 7)); 1070 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 7));
1071 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(7, false)); 1071 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(7, false));
1072 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(7, true)); 1072 SpdySerializedFrame fbody3(spdy_util_.ConstructSpdyDataFrame(7, true));
1073 1073
1074 SettingsMap settings; 1074 SettingsMap settings;
1075 const uint32_t max_concurrent_streams = 1; 1075 const uint32_t max_concurrent_streams = 1;
1076 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1076 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1077 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1077 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1078 SpdySerializedFrame settings_frame( 1078 SpdySerializedFrame settings_frame(
1079 spdy_util_.ConstructSpdySettings(settings)); 1079 spdy_util_.ConstructSpdySettings(settings));
1080 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1080 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
1191 } 1191 }
1192 1192
1193 // Similar to ThreeGetsMaxConcurrrent above, however, this test 1193 // Similar to ThreeGetsMaxConcurrrent above, however, this test
1194 // deletes a session in the middle of the transaction to ensure 1194 // deletes a session in the middle of the transaction to ensure
1195 // that we properly remove pendingcreatestream objects from 1195 // that we properly remove pendingcreatestream objects from
1196 // the spdy_session 1196 // the spdy_session
1197 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) { 1197 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) {
1198 // Construct the request. 1198 // Construct the request.
1199 SpdySerializedFrame req( 1199 SpdySerializedFrame req(
1200 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1200 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1201 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1201 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
1202 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 1202 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
1203 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true)); 1203 SpdySerializedFrame fbody(spdy_util_.ConstructSpdyDataFrame(1, true));
1204 spdy_util_.UpdateWithStreamDestruction(1); 1204 spdy_util_.UpdateWithStreamDestruction(1);
1205 1205
1206 SpdySerializedFrame req2( 1206 SpdySerializedFrame req2(
1207 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 1207 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
1208 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1208 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
1209 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false)); 1209 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, false));
1210 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true)); 1210 SpdySerializedFrame fbody2(spdy_util_.ConstructSpdyDataFrame(3, true));
1211 1211
1212 SettingsMap settings; 1212 SettingsMap settings;
1213 const uint32_t max_concurrent_streams = 1; 1213 const uint32_t max_concurrent_streams = 1;
1214 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1214 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1215 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1215 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1216 SpdySerializedFrame settings_frame( 1216 SpdySerializedFrame settings_frame(
1217 spdy_util_.ConstructSpdySettings(settings)); 1217 spdy_util_.ConstructSpdySettings(settings));
1218 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1218 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1318 1318
1319 } // namespace 1319 } // namespace
1320 1320
1321 // Similar to ThreeGetsMaxConcurrrentDelete above, however, this test 1321 // Similar to ThreeGetsMaxConcurrrentDelete above, however, this test
1322 // closes the socket while we have a pending transaction waiting for 1322 // closes the socket while we have a pending transaction waiting for
1323 // a pending stream creation. http://crbug.com/52901 1323 // a pending stream creation. http://crbug.com/52901
1324 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentSocketClose) { 1324 TEST_F(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentSocketClose) {
1325 // Construct the request. 1325 // Construct the request.
1326 SpdySerializedFrame req( 1326 SpdySerializedFrame req(
1327 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1327 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1328 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1328 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
1329 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false)); 1329 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, false));
1330 SpdySerializedFrame fin_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1330 SpdySerializedFrame fin_body(spdy_util_.ConstructSpdyDataFrame(1, true));
1331 spdy_util_.UpdateWithStreamDestruction(1); 1331 spdy_util_.UpdateWithStreamDestruction(1);
1332 1332
1333 SpdySerializedFrame req2( 1333 SpdySerializedFrame req2(
1334 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 1334 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
1335 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1335 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
1336 1336
1337 SettingsMap settings; 1337 SettingsMap settings;
1338 const uint32_t max_concurrent_streams = 1; 1338 const uint32_t max_concurrent_streams = 1;
1339 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1339 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1340 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1340 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1341 SpdySerializedFrame settings_frame( 1341 SpdySerializedFrame settings_frame(
1342 spdy_util_.ConstructSpdySettings(settings)); 1342 spdy_util_.ConstructSpdySettings(settings));
1343 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1343 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
1344 1344
1345 MockWrite writes[] = { 1345 MockWrite writes[] = {
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 // Test that a simple PUT request works. 1416 // Test that a simple PUT request works.
1417 TEST_F(SpdyNetworkTransactionTest, Put) { 1417 TEST_F(SpdyNetworkTransactionTest, Put) {
1418 // Setup the request 1418 // Setup the request
1419 HttpRequestInfo request; 1419 HttpRequestInfo request;
1420 request.method = "PUT"; 1420 request.method = "PUT";
1421 request.url = default_url_; 1421 request.url = default_url_;
1422 1422
1423 SpdyHeaderBlock put_headers( 1423 SpdyHeaderBlock put_headers(
1424 spdy_util_.ConstructPutHeaderBlock(kDefaultUrl, 0)); 1424 spdy_util_.ConstructPutHeaderBlock(kDefaultUrl, 0));
1425 SpdySerializedFrame req( 1425 SpdySerializedFrame req(
1426 spdy_util_.ConstructSpdySyn(1, std::move(put_headers), LOWEST, true)); 1426 spdy_util_.ConstructSpdyHeaders(1, std::move(put_headers), LOWEST, true));
1427 MockWrite writes[] = { 1427 MockWrite writes[] = {
1428 CreateMockWrite(req, 0), 1428 CreateMockWrite(req, 0),
1429 }; 1429 };
1430 1430
1431 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1431 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
1432 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1432 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1433 MockRead reads[] = { 1433 MockRead reads[] = {
1434 CreateMockRead(resp, 1), CreateMockRead(body, 2), 1434 CreateMockRead(resp, 1), CreateMockRead(body, 2),
1435 MockRead(ASYNC, 0, 3) // EOF 1435 MockRead(ASYNC, 0, 3) // EOF
1436 }; 1436 };
1437 1437
1438 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1438 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1439 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 1439 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
1440 NULL); 1440 NULL);
1441 helper.RunToCompletion(&data); 1441 helper.RunToCompletion(&data);
1442 TransactionHelperResult out = helper.output(); 1442 TransactionHelperResult out = helper.output();
1443 1443
1444 EXPECT_THAT(out.rv, IsOk()); 1444 EXPECT_THAT(out.rv, IsOk());
1445 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1445 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1446 } 1446 }
1447 1447
1448 // Test that a simple HEAD request works. 1448 // Test that a simple HEAD request works.
1449 TEST_F(SpdyNetworkTransactionTest, Head) { 1449 TEST_F(SpdyNetworkTransactionTest, Head) {
1450 // Setup the request 1450 // Setup the request
1451 HttpRequestInfo request; 1451 HttpRequestInfo request;
1452 request.method = "HEAD"; 1452 request.method = "HEAD";
1453 request.url = default_url_; 1453 request.url = default_url_;
1454 1454
1455 SpdyHeaderBlock head_headers( 1455 SpdyHeaderBlock head_headers(
1456 spdy_util_.ConstructHeadHeaderBlock(kDefaultUrl, 0)); 1456 spdy_util_.ConstructHeadHeaderBlock(kDefaultUrl, 0));
1457 SpdySerializedFrame req( 1457 SpdySerializedFrame req(spdy_util_.ConstructSpdyHeaders(
1458 spdy_util_.ConstructSpdySyn(1, std::move(head_headers), LOWEST, true)); 1458 1, std::move(head_headers), LOWEST, true));
1459 MockWrite writes[] = { 1459 MockWrite writes[] = {
1460 CreateMockWrite(req, 0), 1460 CreateMockWrite(req, 0),
1461 }; 1461 };
1462 1462
1463 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1463 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
1464 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1464 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1465 MockRead reads[] = { 1465 MockRead reads[] = {
1466 CreateMockRead(resp, 1), CreateMockRead(body, 2), 1466 CreateMockRead(resp, 1), CreateMockRead(body, 2),
1467 MockRead(ASYNC, 0, 3) // EOF 1467 MockRead(ASYNC, 0, 3) // EOF
1468 }; 1468 };
1469 1469
1470 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1470 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1471 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 1471 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
1472 NULL); 1472 NULL);
1473 helper.RunToCompletion(&data); 1473 helper.RunToCompletion(&data);
1474 TransactionHelperResult out = helper.output(); 1474 TransactionHelperResult out = helper.output();
1475 1475
1476 EXPECT_THAT(out.rv, IsOk()); 1476 EXPECT_THAT(out.rv, IsOk());
1477 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1477 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1478 } 1478 }
1479 1479
1480 // Test that a simple POST works. 1480 // Test that a simple POST works.
1481 TEST_F(SpdyNetworkTransactionTest, Post) { 1481 TEST_F(SpdyNetworkTransactionTest, Post) {
1482 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 1482 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
1483 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); 1483 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0));
1484 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1484 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1485 MockWrite writes[] = { 1485 MockWrite writes[] = {
1486 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame 1486 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame
1487 }; 1487 };
1488 1488
1489 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1489 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0));
1490 MockRead reads[] = { 1490 MockRead reads[] = {
1491 CreateMockRead(resp, 2), CreateMockRead(body, 3), 1491 CreateMockRead(resp, 2), CreateMockRead(body, 3),
1492 MockRead(ASYNC, 0, 4) // EOF 1492 MockRead(ASYNC, 0, 4) // EOF
1493 }; 1493 };
1494 1494
1495 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1495 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1496 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY, 1496 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY,
1497 BoundNetLog(), NULL); 1497 BoundNetLog(), NULL);
1498 helper.RunToCompletion(&data); 1498 helper.RunToCompletion(&data);
1499 TransactionHelperResult out = helper.output(); 1499 TransactionHelperResult out = helper.output();
1500 EXPECT_THAT(out.rv, IsOk()); 1500 EXPECT_THAT(out.rv, IsOk());
1501 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1501 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1502 EXPECT_EQ("hello!", out.response_data); 1502 EXPECT_EQ("hello!", out.response_data);
1503 } 1503 }
1504 1504
1505 // Test that a POST with a file works. 1505 // Test that a POST with a file works.
1506 TEST_F(SpdyNetworkTransactionTest, FilePost) { 1506 TEST_F(SpdyNetworkTransactionTest, FilePost) {
1507 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 1507 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
1508 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); 1508 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0));
1509 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1509 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1510 MockWrite writes[] = { 1510 MockWrite writes[] = {
1511 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame 1511 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame
1512 }; 1512 };
1513 1513
1514 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1514 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0));
1515 MockRead reads[] = { 1515 MockRead reads[] = {
1516 CreateMockRead(resp, 2), CreateMockRead(body, 3), 1516 CreateMockRead(resp, 2), CreateMockRead(body, 3),
1517 MockRead(ASYNC, 0, 4) // EOF 1517 MockRead(ASYNC, 0, 4) // EOF
1518 }; 1518 };
1519 1519
1520 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1520 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1521 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY, 1521 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY,
1522 BoundNetLog(), NULL); 1522 BoundNetLog(), NULL);
1523 helper.RunToCompletion(&data); 1523 helper.RunToCompletion(&data);
1524 TransactionHelperResult out = helper.output(); 1524 TransactionHelperResult out = helper.output();
(...skipping 25 matching lines...) Expand all
1550 1550
1551 // Test that a complex POST works. 1551 // Test that a complex POST works.
1552 TEST_F(SpdyNetworkTransactionTest, ComplexPost) { 1552 TEST_F(SpdyNetworkTransactionTest, ComplexPost) {
1553 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 1553 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
1554 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0)); 1554 kDefaultUrl, 1, kUploadDataSize, LOWEST, NULL, 0));
1555 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1555 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1556 MockWrite writes[] = { 1556 MockWrite writes[] = {
1557 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame 1557 CreateMockWrite(req, 0), CreateMockWrite(body, 1), // POST upload frame
1558 }; 1558 };
1559 1559
1560 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1560 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0));
1561 MockRead reads[] = { 1561 MockRead reads[] = {
1562 CreateMockRead(resp, 2), CreateMockRead(body, 3), 1562 CreateMockRead(resp, 2), CreateMockRead(body, 3),
1563 MockRead(ASYNC, 0, 4) // EOF 1563 MockRead(ASYNC, 0, 4) // EOF
1564 }; 1564 };
1565 1565
1566 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1566 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1567 NormalSpdyTransactionHelper helper(CreateComplexPostRequest(), 1567 NormalSpdyTransactionHelper helper(CreateComplexPostRequest(),
1568 DEFAULT_PRIORITY, BoundNetLog(), NULL); 1568 DEFAULT_PRIORITY, BoundNetLog(), NULL);
1569 helper.RunToCompletion(&data); 1569 helper.RunToCompletion(&data);
1570 TransactionHelperResult out = helper.output(); 1570 TransactionHelperResult out = helper.output();
1571 EXPECT_THAT(out.rv, IsOk()); 1571 EXPECT_THAT(out.rv, IsOk());
1572 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1572 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1573 EXPECT_EQ("hello!", out.response_data); 1573 EXPECT_EQ("hello!", out.response_data);
1574 } 1574 }
1575 1575
1576 // Test that a chunked POST works. 1576 // Test that a chunked POST works.
1577 TEST_F(SpdyNetworkTransactionTest, ChunkedPost) { 1577 TEST_F(SpdyNetworkTransactionTest, ChunkedPost) {
1578 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1578 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0));
1579 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1579 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1580 MockWrite writes[] = { 1580 MockWrite writes[] = {
1581 CreateMockWrite(req, 0), CreateMockWrite(body, 1), 1581 CreateMockWrite(req, 0), CreateMockWrite(body, 1),
1582 }; 1582 };
1583 1583
1584 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1584 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0));
1585 MockRead reads[] = { 1585 MockRead reads[] = {
1586 CreateMockRead(resp, 2), CreateMockRead(body, 3), 1586 CreateMockRead(resp, 2), CreateMockRead(body, 3),
1587 MockRead(ASYNC, 0, 4) // EOF 1587 MockRead(ASYNC, 0, 4) // EOF
1588 }; 1588 };
1589 1589
1590 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1590 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1591 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), 1591 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
1592 DEFAULT_PRIORITY, BoundNetLog(), NULL); 1592 DEFAULT_PRIORITY, BoundNetLog(), NULL);
1593 1593
1594 // These chunks get merged into a single frame when being sent. 1594 // These chunks get merged into a single frame when being sent.
(...skipping 13 matching lines...) Expand all
1608 TEST_F(SpdyNetworkTransactionTest, DelayedChunkedPost) { 1608 TEST_F(SpdyNetworkTransactionTest, DelayedChunkedPost) {
1609 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1609 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0));
1610 SpdySerializedFrame chunk1(spdy_util_.ConstructSpdyDataFrame(1, false)); 1610 SpdySerializedFrame chunk1(spdy_util_.ConstructSpdyDataFrame(1, false));
1611 SpdySerializedFrame chunk2(spdy_util_.ConstructSpdyDataFrame(1, false)); 1611 SpdySerializedFrame chunk2(spdy_util_.ConstructSpdyDataFrame(1, false));
1612 SpdySerializedFrame chunk3(spdy_util_.ConstructSpdyDataFrame(1, true)); 1612 SpdySerializedFrame chunk3(spdy_util_.ConstructSpdyDataFrame(1, true));
1613 MockWrite writes[] = { 1613 MockWrite writes[] = {
1614 CreateMockWrite(req, 0), CreateMockWrite(chunk1, 1), 1614 CreateMockWrite(req, 0), CreateMockWrite(chunk1, 1),
1615 CreateMockWrite(chunk2, 2), CreateMockWrite(chunk3, 3), 1615 CreateMockWrite(chunk2, 2), CreateMockWrite(chunk3, 3),
1616 }; 1616 };
1617 1617
1618 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1618 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0));
1619 MockRead reads[] = { 1619 MockRead reads[] = {
1620 CreateMockRead(resp, 4), CreateMockRead(chunk1, 5), 1620 CreateMockRead(resp, 4), CreateMockRead(chunk1, 5),
1621 CreateMockRead(chunk2, 6), CreateMockRead(chunk3, 7), 1621 CreateMockRead(chunk2, 6), CreateMockRead(chunk3, 7),
1622 MockRead(ASYNC, 0, 8) // EOF 1622 MockRead(ASYNC, 0, 8) // EOF
1623 }; 1623 };
1624 1624
1625 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1625 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1626 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), 1626 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
1627 DEFAULT_PRIORITY, BoundNetLog(), NULL); 1627 DEFAULT_PRIORITY, BoundNetLog(), NULL);
1628 1628
(...skipping 29 matching lines...) Expand all
1658 request.method = "POST"; 1658 request.method = "POST";
1659 request.url = default_url_; 1659 request.url = default_url_;
1660 // Create an empty UploadData. 1660 // Create an empty UploadData.
1661 request.upload_data_stream = NULL; 1661 request.upload_data_stream = NULL;
1662 1662
1663 // When request.upload_data_stream is NULL for post, content-length is 1663 // When request.upload_data_stream is NULL for post, content-length is
1664 // expected to be 0. 1664 // expected to be 0.
1665 SpdyHeaderBlock req_block( 1665 SpdyHeaderBlock req_block(
1666 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, 0)); 1666 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, 0));
1667 SpdySerializedFrame req( 1667 SpdySerializedFrame req(
1668 spdy_util_.ConstructSpdySyn(1, std::move(req_block), LOWEST, true)); 1668 spdy_util_.ConstructSpdyHeaders(1, std::move(req_block), LOWEST, true));
1669 1669
1670 MockWrite writes[] = { 1670 MockWrite writes[] = {
1671 CreateMockWrite(req, 0), 1671 CreateMockWrite(req, 0),
1672 }; 1672 };
1673 1673
1674 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1674 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0));
1675 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1675 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1676 MockRead reads[] = { 1676 MockRead reads[] = {
1677 CreateMockRead(resp, 1), CreateMockRead(body, 2), 1677 CreateMockRead(resp, 1), CreateMockRead(body, 2),
1678 MockRead(ASYNC, 0, 3) // EOF 1678 MockRead(ASYNC, 0, 3) // EOF
1679 }; 1679 };
1680 1680
1681 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1681 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1682 1682
1683 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 1683 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
1684 NULL); 1684 NULL);
(...skipping 14 matching lines...) Expand all
1699 HttpRequestInfo request; 1699 HttpRequestInfo request;
1700 request.method = "POST"; 1700 request.method = "POST";
1701 request.url = default_url_; 1701 request.url = default_url_;
1702 request.upload_data_stream = &stream; 1702 request.upload_data_stream = &stream;
1703 1703
1704 const uint64_t kContentLength = 0; 1704 const uint64_t kContentLength = 0;
1705 1705
1706 SpdyHeaderBlock req_block( 1706 SpdyHeaderBlock req_block(
1707 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kContentLength)); 1707 spdy_util_.ConstructPostHeaderBlock(kDefaultUrl, kContentLength));
1708 SpdySerializedFrame req( 1708 SpdySerializedFrame req(
1709 spdy_util_.ConstructSpdySyn(1, std::move(req_block), LOWEST, true)); 1709 spdy_util_.ConstructSpdyHeaders(1, std::move(req_block), LOWEST, true));
1710 1710
1711 MockWrite writes[] = { 1711 MockWrite writes[] = {
1712 CreateMockWrite(req, 0), 1712 CreateMockWrite(req, 0),
1713 }; 1713 };
1714 1714
1715 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1715 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0));
1716 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1716 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1717 MockRead reads[] = { 1717 MockRead reads[] = {
1718 CreateMockRead(resp, 1), CreateMockRead(body, 2), 1718 CreateMockRead(resp, 1), CreateMockRead(body, 2),
1719 MockRead(ASYNC, 0, 3) // EOF 1719 MockRead(ASYNC, 0, 3) // EOF
1720 }; 1720 };
1721 1721
1722 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1722 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1723 1723
1724 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 1724 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
1725 NULL); 1725 NULL);
1726 helper.RunToCompletion(&data); 1726 helper.RunToCompletion(&data);
1727 TransactionHelperResult out = helper.output(); 1727 TransactionHelperResult out = helper.output();
1728 EXPECT_THAT(out.rv, IsOk()); 1728 EXPECT_THAT(out.rv, IsOk());
1729 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1729 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1730 EXPECT_EQ("hello!", out.response_data); 1730 EXPECT_EQ("hello!", out.response_data);
1731 } 1731 }
1732 1732
1733 // While we're doing a post, the server sends the reply before upload completes. 1733 // While we're doing a post, the server sends the reply before upload completes.
1734 TEST_F(SpdyNetworkTransactionTest, ResponseBeforePostCompletes) { 1734 TEST_F(SpdyNetworkTransactionTest, ResponseBeforePostCompletes) {
1735 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1735 SpdySerializedFrame req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0));
1736 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1736 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1737 MockWrite writes[] = { 1737 MockWrite writes[] = {
1738 CreateMockWrite(req, 0), CreateMockWrite(body, 3), 1738 CreateMockWrite(req, 0), CreateMockWrite(body, 3),
1739 }; 1739 };
1740 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1740 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0));
1741 MockRead reads[] = { 1741 MockRead reads[] = {
1742 CreateMockRead(resp, 1), CreateMockRead(body, 2), 1742 CreateMockRead(resp, 1), CreateMockRead(body, 2),
1743 MockRead(ASYNC, 0, 4) // EOF 1743 MockRead(ASYNC, 0, 4) // EOF
1744 }; 1744 };
1745 1745
1746 // Write the request headers, and read the complete response 1746 // Write the request headers, and read the complete response
1747 // while still waiting for chunked request data. 1747 // while still waiting for chunked request data.
1748 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1748 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1749 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), 1749 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
1750 DEFAULT_PRIORITY, BoundNetLog(), NULL); 1750 DEFAULT_PRIORITY, BoundNetLog(), NULL);
1751 helper.RunPreTestSetup(); 1751 helper.RunPreTestSetup();
1752 helper.AddData(&data); 1752 helper.AddData(&data);
1753 1753
1754 ASSERT_TRUE(helper.StartDefaultTest()); 1754 ASSERT_TRUE(helper.StartDefaultTest());
1755 1755
1756 base::RunLoop().RunUntilIdle(); 1756 base::RunLoop().RunUntilIdle();
1757 1757
1758 // Process the request headers, SYN_REPLY, and response body. 1758 // Process the request headers, response headers, and response body.
1759 // The request body is still in flight. 1759 // The request body is still in flight.
1760 const HttpResponseInfo* response = helper.trans()->GetResponseInfo(); 1760 const HttpResponseInfo* response = helper.trans()->GetResponseInfo();
1761 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine()); 1761 EXPECT_EQ("HTTP/1.1 200", response->headers->GetStatusLine());
1762 1762
1763 // Finish sending the request body. 1763 // Finish sending the request body.
1764 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, true); 1764 upload_chunked_data_stream()->AppendData(kUploadData, kUploadDataSize, true);
1765 helper.WaitForCallbackToComplete(); 1765 helper.WaitForCallbackToComplete();
1766 EXPECT_THAT(helper.output().rv, IsOk()); 1766 EXPECT_THAT(helper.output().rv, IsOk());
1767 1767
1768 std::string response_body; 1768 std::string response_body;
1769 EXPECT_THAT(ReadTransaction(helper.trans(), &response_body), IsOk()); 1769 EXPECT_THAT(ReadTransaction(helper.trans(), &response_body), IsOk());
1770 EXPECT_EQ(kUploadData, response_body); 1770 EXPECT_EQ(kUploadData, response_body);
1771 helper.VerifyDataConsumed(); 1771 helper.VerifyDataConsumed();
1772 } 1772 }
1773 1773
1774 // The client upon cancellation tries to send a RST_STREAM frame. The mock 1774 // The client upon cancellation tries to send a RST_STREAM frame. The mock
1775 // socket causes the TCP write to return zero. This test checks that the client 1775 // socket causes the TCP write to return zero. This test checks that the client
1776 // tries to queue up the RST_STREAM frame again. 1776 // tries to queue up the RST_STREAM frame again.
1777 TEST_F(SpdyNetworkTransactionTest, SocketWriteReturnsZero) { 1777 TEST_F(SpdyNetworkTransactionTest, SocketWriteReturnsZero) {
1778 SpdySerializedFrame req( 1778 SpdySerializedFrame req(
1779 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1779 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1780 SpdySerializedFrame rst( 1780 SpdySerializedFrame rst(
1781 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1781 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1782 MockWrite writes[] = { 1782 MockWrite writes[] = {
1783 CreateMockWrite(req, 0, SYNCHRONOUS), MockWrite(SYNCHRONOUS, 0, 0, 2), 1783 CreateMockWrite(req, 0, SYNCHRONOUS), MockWrite(SYNCHRONOUS, 0, 0, 2),
1784 CreateMockWrite(rst, 3, SYNCHRONOUS), 1784 CreateMockWrite(rst, 3, SYNCHRONOUS),
1785 }; 1785 };
1786 1786
1787 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1787 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
1788 MockRead reads[] = { 1788 MockRead reads[] = {
1789 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 4) // EOF 1789 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 4) // EOF
1790 }; 1790 };
1791 1791
1792 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1792 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1793 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1793 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1794 BoundNetLog(), NULL); 1794 BoundNetLog(), NULL);
1795 helper.RunPreTestSetup(); 1795 helper.RunPreTestSetup();
1796 helper.AddData(&data); 1796 helper.AddData(&data);
1797 HttpNetworkTransaction* trans = helper.trans(); 1797 HttpNetworkTransaction* trans = helper.trans();
1798 1798
1799 TestCompletionCallback callback; 1799 TestCompletionCallback callback;
1800 int rv = trans->Start( 1800 int rv = trans->Start(
1801 &CreateGetRequest(), callback.callback(), BoundNetLog()); 1801 &CreateGetRequest(), callback.callback(), BoundNetLog());
1802 EXPECT_THAT(callback.GetResult(rv), IsOk()); 1802 EXPECT_THAT(callback.GetResult(rv), IsOk());
1803 1803
1804 helper.ResetTrans(); 1804 helper.ResetTrans();
1805 base::RunLoop().RunUntilIdle(); 1805 base::RunLoop().RunUntilIdle();
1806 1806
1807 helper.VerifyDataConsumed(); 1807 helper.VerifyDataConsumed();
1808 } 1808 }
1809 1809
1810 // Test that the transaction doesn't crash when we don't have a reply. 1810 // Test that the transaction doesn't crash when we don't have a reply.
1811 TEST_F(SpdyNetworkTransactionTest, ResponseWithoutSynReply) { 1811 TEST_F(SpdyNetworkTransactionTest, ResponseWithoutHeaders) {
1812 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1812 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1813 MockRead reads[] = { 1813 MockRead reads[] = {
1814 CreateMockRead(body, 1), MockRead(ASYNC, 0, 3) // EOF 1814 CreateMockRead(body, 1), MockRead(ASYNC, 0, 3) // EOF
1815 }; 1815 };
1816 1816
1817 SpdySerializedFrame req( 1817 SpdySerializedFrame req(
1818 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1818 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1819 SpdySerializedFrame rst( 1819 SpdySerializedFrame rst(
1820 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 1820 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
1821 MockWrite writes[] = { 1821 MockWrite writes[] = {
(...skipping 11 matching lines...) Expand all
1833 // stream ID. See http://crbug.com/45639. 1833 // stream ID. See http://crbug.com/45639.
1834 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { 1834 TEST_F(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) {
1835 SpdySerializedFrame req( 1835 SpdySerializedFrame req(
1836 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1836 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1837 SpdySerializedFrame rst( 1837 SpdySerializedFrame rst(
1838 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 1838 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
1839 MockWrite writes[] = { 1839 MockWrite writes[] = {
1840 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), 1840 CreateMockWrite(req, 0), CreateMockWrite(rst, 4),
1841 }; 1841 };
1842 1842
1843 SpdySerializedFrame resp0(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 1843 SpdySerializedFrame resp0(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1844 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 1844 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
1845 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1845 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1846 MockRead reads[] = { 1846 MockRead reads[] = {
1847 CreateMockRead(resp0, 1), CreateMockRead(resp1, 2), 1847 CreateMockRead(resp0, 1), CreateMockRead(resp1, 2),
1848 CreateMockRead(body, 3), MockRead(ASYNC, 0, 5) // EOF 1848 CreateMockRead(body, 3), MockRead(ASYNC, 0, 5) // EOF
1849 }; 1849 };
1850 1850
1851 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1851 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1852 1852
1853 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1853 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1854 BoundNetLog(), NULL); 1854 BoundNetLog(), NULL);
(...skipping 25 matching lines...) Expand all
1880 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1880 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1881 SpdySerializedFrame rst( 1881 SpdySerializedFrame rst(
1882 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 1882 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
1883 MockWrite writes[] = { 1883 MockWrite writes[] = {
1884 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), 1884 CreateMockWrite(req, 0), CreateMockWrite(rst, 2),
1885 }; 1885 };
1886 1886
1887 const char* const headers[] = { 1887 const char* const headers[] = {
1888 "transfer-encoding", "chunked" 1888 "transfer-encoding", "chunked"
1889 }; 1889 };
1890 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(headers, 1, 1)); 1890 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(headers, 1, 1));
1891 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1891 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1892 MockRead reads[] = { 1892 MockRead reads[] = {
1893 CreateMockRead(resp, 1), CreateMockRead(body, 3), 1893 CreateMockRead(resp, 1), CreateMockRead(body, 3),
1894 MockRead(ASYNC, 0, 4) // EOF 1894 MockRead(ASYNC, 0, 4) // EOF
1895 }; 1895 };
1896 1896
1897 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1897 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1898 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 1898 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
1899 BoundNetLog(), NULL); 1899 BoundNetLog(), NULL);
1900 helper.RunToCompletion(&data); 1900 helper.RunToCompletion(&data);
1901 TransactionHelperResult out = helper.output(); 1901 TransactionHelperResult out = helper.output();
1902 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR)); 1902 EXPECT_THAT(out.rv, IsError(ERR_SPDY_PROTOCOL_ERROR));
1903 1903
1904 helper.session()->spdy_session_pool()->CloseAllSessions(); 1904 helper.session()->spdy_session_pool()->CloseAllSessions();
1905 helper.VerifyDataConsumed(); 1905 helper.VerifyDataConsumed();
1906 } 1906 }
1907 1907
1908 TEST_F(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) { 1908 TEST_F(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) {
1909 // Construct the request. 1909 // Construct the request.
1910 SpdySerializedFrame req( 1910 SpdySerializedFrame req(
1911 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1911 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1912 SpdySerializedFrame rst( 1912 SpdySerializedFrame rst(
1913 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 1913 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
1914 MockWrite writes[] = { 1914 MockWrite writes[] = {
1915 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), 1915 CreateMockWrite(req, 0), CreateMockWrite(rst, 4),
1916 }; 1916 };
1917 1917
1918 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1918 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
1919 const char* const headers[] = { 1919 const char* const headers[] = {
1920 "transfer-encoding", "chunked" 1920 "transfer-encoding", "chunked"
1921 }; 1921 };
1922 SpdySerializedFrame push( 1922 SpdySerializedFrame push(
1923 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1, 1923 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1,
1924 GetDefaultUrlWithPath("/1").c_str())); 1924 GetDefaultUrlWithPath("/1").c_str()));
1925 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 1925 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
1926 MockRead reads[] = { 1926 MockRead reads[] = {
1927 CreateMockRead(resp, 1), CreateMockRead(push, 2), CreateMockRead(body, 3), 1927 CreateMockRead(resp, 1), CreateMockRead(push, 2), CreateMockRead(body, 3),
1928 MockRead(ASYNC, 0, 5) // EOF 1928 MockRead(ASYNC, 0, 5) // EOF
(...skipping 13 matching lines...) Expand all
1942 } 1942 }
1943 1943
1944 TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) { 1944 TEST_F(SpdyNetworkTransactionTest, CancelledTransaction) {
1945 // Construct the request. 1945 // Construct the request.
1946 SpdySerializedFrame req( 1946 SpdySerializedFrame req(
1947 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1947 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1948 MockWrite writes[] = { 1948 MockWrite writes[] = {
1949 CreateMockWrite(req), 1949 CreateMockWrite(req),
1950 }; 1950 };
1951 1951
1952 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1952 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
1953 MockRead reads[] = { 1953 MockRead reads[] = {
1954 CreateMockRead(resp), 1954 CreateMockRead(resp),
1955 // This following read isn't used by the test, except during the 1955 // This following read isn't used by the test, except during the
1956 // RunUntilIdle() call at the end since the SpdySession survives the 1956 // RunUntilIdle() call at the end since the SpdySession survives the
1957 // HttpNetworkTransaction and still tries to continue Read()'ing. Any 1957 // HttpNetworkTransaction and still tries to continue Read()'ing. Any
1958 // MockRead will do here. 1958 // MockRead will do here.
1959 MockRead(ASYNC, 0, 0) // EOF 1959 MockRead(ASYNC, 0, 0) // EOF
1960 }; 1960 };
1961 1961
1962 StaticSocketDataProvider data(reads, arraysize(reads), 1962 StaticSocketDataProvider data(reads, arraysize(reads),
(...skipping 21 matching lines...) Expand all
1984 TEST_F(SpdyNetworkTransactionTest, CancelledTransactionSendRst) { 1984 TEST_F(SpdyNetworkTransactionTest, CancelledTransactionSendRst) {
1985 SpdySerializedFrame req( 1985 SpdySerializedFrame req(
1986 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1986 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1987 SpdySerializedFrame rst( 1987 SpdySerializedFrame rst(
1988 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1988 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1989 MockWrite writes[] = { 1989 MockWrite writes[] = {
1990 CreateMockWrite(req, 0, SYNCHRONOUS), 1990 CreateMockWrite(req, 0, SYNCHRONOUS),
1991 CreateMockWrite(rst, 2, SYNCHRONOUS), 1991 CreateMockWrite(rst, 2, SYNCHRONOUS),
1992 }; 1992 };
1993 1993
1994 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1994 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
1995 MockRead reads[] = { 1995 MockRead reads[] = {
1996 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 3) // EOF 1996 CreateMockRead(resp, 1, ASYNC), MockRead(ASYNC, 0, 0, 3) // EOF
1997 }; 1997 };
1998 1998
1999 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1999 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2000 2000
2001 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2001 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2002 BoundNetLog(), NULL); 2002 BoundNetLog(), NULL);
2003 helper.RunPreTestSetup(); 2003 helper.RunPreTestSetup();
2004 helper.AddData(&data); 2004 helper.AddData(&data);
(...skipping 21 matching lines...) Expand all
2026 MockWrite writes2[] = {CreateMockWrite(req, 0)}; 2026 MockWrite writes2[] = {CreateMockWrite(req, 0)};
2027 2027
2028 // The indicated length of this frame is longer than its actual length. When 2028 // The indicated length of this frame is longer than its actual length. When
2029 // the session receives an empty frame after this one, it shuts down the 2029 // the session receives an empty frame after this one, it shuts down the
2030 // session, and calls the read callback with the incomplete data. 2030 // session, and calls the read callback with the incomplete data.
2031 const uint8_t kGetBodyFrame2[] = { 2031 const uint8_t kGetBodyFrame2[] = {
2032 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 2032 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
2033 0x07, 'h', 'e', 'l', 'l', 'o', '!', 2033 0x07, 'h', 'e', 'l', 'l', 'o', '!',
2034 }; 2034 };
2035 2035
2036 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2036 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2037 MockRead reads[] = { 2037 MockRead reads[] = {
2038 CreateMockRead(resp, 1), 2038 CreateMockRead(resp, 1),
2039 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 2039 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
2040 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2), 2040 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2),
2041 arraysize(kGetBodyFrame2), 3), 2041 arraysize(kGetBodyFrame2), 3),
2042 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause 2042 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause
2043 MockRead(ASYNC, 0, 0, 5), // EOF 2043 MockRead(ASYNC, 0, 0, 5), // EOF
2044 }; 2044 };
2045 MockRead reads2[] = { 2045 MockRead reads2[] = {
2046 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 0, 2), // EOF 2046 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 0, 2), // EOF
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2081 } 2081 }
2082 2082
2083 // Verify that the client can correctly deal with the user callback deleting the 2083 // Verify that the client can correctly deal with the user callback deleting the
2084 // transaction. Failures will usually be valgrind errors. See 2084 // transaction. Failures will usually be valgrind errors. See
2085 // http://crbug.com/46925 2085 // http://crbug.com/46925
2086 TEST_F(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) { 2086 TEST_F(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) {
2087 SpdySerializedFrame req( 2087 SpdySerializedFrame req(
2088 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2088 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2089 MockWrite writes[] = {CreateMockWrite(req, 0)}; 2089 MockWrite writes[] = {CreateMockWrite(req, 0)};
2090 2090
2091 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2091 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2092 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2092 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
2093 MockRead reads[] = { 2093 MockRead reads[] = {
2094 CreateMockRead(resp, 1), 2094 CreateMockRead(resp, 1),
2095 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 2095 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
2096 CreateMockRead(body, 3), MockRead(ASYNC, 0, 0, 4), // EOF 2096 CreateMockRead(body, 3), MockRead(ASYNC, 0, 0, 4), // EOF
2097 }; 2097 };
2098 2098
2099 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2099 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2100 2100
2101 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2101 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
(...skipping 26 matching lines...) Expand all
2128 } 2128 }
2129 2129
2130 // Send a spdy request to www.example.org that gets redirected to www.foo.com. 2130 // Send a spdy request to www.example.org that gets redirected to www.foo.com.
2131 TEST_F(SpdyNetworkTransactionTest, DISABLED_RedirectGetRequest) { 2131 TEST_F(SpdyNetworkTransactionTest, DISABLED_RedirectGetRequest) {
2132 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); 2132 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl));
2133 headers["user-agent"] = ""; 2133 headers["user-agent"] = "";
2134 headers["accept-encoding"] = "gzip, deflate"; 2134 headers["accept-encoding"] = "gzip, deflate";
2135 2135
2136 // Setup writes/reads to www.example.org 2136 // Setup writes/reads to www.example.org
2137 SpdySerializedFrame req( 2137 SpdySerializedFrame req(
2138 spdy_util_.ConstructSpdySyn(1, std::move(headers), LOWEST, true)); 2138 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true));
2139 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReplyRedirect(1)); 2139 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReplyRedirect(1));
2140 MockWrite writes[] = { 2140 MockWrite writes[] = {
2141 CreateMockWrite(req, 1), 2141 CreateMockWrite(req, 1),
2142 }; 2142 };
2143 MockRead reads[] = { 2143 MockRead reads[] = {
2144 CreateMockRead(resp, 2), MockRead(ASYNC, 0, 0, 3) // EOF 2144 CreateMockRead(resp, 2), MockRead(ASYNC, 0, 0, 3) // EOF
2145 }; 2145 };
2146 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2146 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2147 2147
2148 // Setup writes/reads to www.foo.com 2148 // Setup writes/reads to www.foo.com
2149 SpdyHeaderBlock headers2( 2149 SpdyHeaderBlock headers2(
2150 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php")); 2150 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php"));
2151 headers2["user-agent"] = ""; 2151 headers2["user-agent"] = "";
2152 headers2["accept-encoding"] = "gzip, deflate"; 2152 headers2["accept-encoding"] = "gzip, deflate";
2153 SpdySerializedFrame req2( 2153 SpdySerializedFrame req2(
2154 spdy_util_.ConstructSpdySyn(1, std::move(headers2), LOWEST, true)); 2154 spdy_util_.ConstructSpdyHeaders(1, std::move(headers2), LOWEST, true));
2155 MockWrite writes2[] = { 2155 MockWrite writes2[] = {
2156 CreateMockWrite(req2, 1), 2156 CreateMockWrite(req2, 1),
2157 }; 2157 };
2158 2158
2159 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2159 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2160 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true)); 2160 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true));
2161 MockRead reads2[] = { 2161 MockRead reads2[] = {
2162 CreateMockRead(resp2, 2), CreateMockRead(body2, 3), 2162 CreateMockRead(resp2, 2), CreateMockRead(body2, 3),
2163 MockRead(ASYNC, 0, 0, 4) // EOF 2163 MockRead(ASYNC, 0, 0, 4) // EOF
2164 }; 2164 };
2165 2165
2166 SequencedSocketData data2(reads2, arraysize(reads2), writes2, 2166 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
2167 arraysize(writes2)); 2167 arraysize(writes2));
2168 2168
2169 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN 2169 // TODO(erikchen): Make test support SPDYSSL, SPDYNPN
(...skipping 29 matching lines...) Expand all
2199 2199
2200 // Send a spdy request to www.example.org. Get a pushed stream that redirects to 2200 // Send a spdy request to www.example.org. Get a pushed stream that redirects to
2201 // www.foo.com. 2201 // www.foo.com.
2202 TEST_F(SpdyNetworkTransactionTest, DISABLED_RedirectServerPush) { 2202 TEST_F(SpdyNetworkTransactionTest, DISABLED_RedirectServerPush) {
2203 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); 2203 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl));
2204 headers["user-agent"] = ""; 2204 headers["user-agent"] = "";
2205 headers["accept-encoding"] = "gzip, deflate"; 2205 headers["accept-encoding"] = "gzip, deflate";
2206 2206
2207 // Setup writes/reads to www.example.org 2207 // Setup writes/reads to www.example.org
2208 SpdySerializedFrame req( 2208 SpdySerializedFrame req(
2209 spdy_util_.ConstructSpdySyn(1, std::move(headers), LOWEST, true)); 2209 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true));
2210 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2210 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2211 SpdySerializedFrame rep(spdy_util_.ConstructSpdyPush( 2211 SpdySerializedFrame rep(spdy_util_.ConstructSpdyPush(
2212 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str(), 2212 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str(),
2213 "301 Moved Permanently", "http://www.foo.com/index.php")); 2213 "301 Moved Permanently", "http://www.foo.com/index.php"));
2214 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2214 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
2215 SpdySerializedFrame rst( 2215 SpdySerializedFrame rst(
2216 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); 2216 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL));
2217 MockWrite writes[] = { 2217 MockWrite writes[] = {
2218 CreateMockWrite(req, 1), CreateMockWrite(rst, 6), 2218 CreateMockWrite(req, 1), CreateMockWrite(rst, 6),
2219 }; 2219 };
2220 MockRead reads[] = { 2220 MockRead reads[] = {
2221 CreateMockRead(resp, 2), CreateMockRead(rep, 3), CreateMockRead(body, 4), 2221 CreateMockRead(resp, 2), CreateMockRead(rep, 3), CreateMockRead(body, 4),
2222 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause 2222 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause
2223 MockRead(ASYNC, 0, 0, 7) // EOF 2223 MockRead(ASYNC, 0, 0, 7) // EOF
2224 }; 2224 };
2225 2225
2226 // Setup writes/reads to www.foo.com 2226 // Setup writes/reads to www.foo.com
2227 SpdyHeaderBlock headers2( 2227 SpdyHeaderBlock headers2(
2228 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php")); 2228 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php"));
2229 headers2["user-agent"] = ""; 2229 headers2["user-agent"] = "";
2230 headers2["accept-encoding"] = "gzip, deflate"; 2230 headers2["accept-encoding"] = "gzip, deflate";
2231 SpdySerializedFrame req2( 2231 SpdySerializedFrame req2(
2232 spdy_util_.ConstructSpdySyn(1, std::move(headers2), LOWEST, true)); 2232 spdy_util_.ConstructSpdyHeaders(1, std::move(headers2), LOWEST, true));
2233 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2233 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2234 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true)); 2234 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(1, true));
2235 MockWrite writes2[] = { 2235 MockWrite writes2[] = {
2236 CreateMockWrite(req2, 1), 2236 CreateMockWrite(req2, 1),
2237 }; 2237 };
2238 MockRead reads2[] = { 2238 MockRead reads2[] = {
2239 CreateMockRead(resp2, 2), CreateMockRead(body2, 3), 2239 CreateMockRead(resp2, 2), CreateMockRead(body2, 3),
2240 MockRead(ASYNC, 0, 0, 5) // EOF 2240 MockRead(ASYNC, 0, 0, 5) // EOF
2241 }; 2241 };
2242 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2242 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2243 SequencedSocketData data2(reads2, arraysize(reads2), writes2, 2243 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2285 2285
2286 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) { 2286 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) {
2287 SpdySerializedFrame stream1_syn( 2287 SpdySerializedFrame stream1_syn(
2288 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2288 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2289 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2289 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2290 MockWrite writes[] = { 2290 MockWrite writes[] = {
2291 CreateMockWrite(stream1_syn, 0), 2291 CreateMockWrite(stream1_syn, 0),
2292 }; 2292 };
2293 2293
2294 SpdySerializedFrame stream1_reply( 2294 SpdySerializedFrame stream1_reply(
2295 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2295 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2296 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2296 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2297 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2297 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2298 const char kPushedData[] = "pushed"; 2298 const char kPushedData[] = "pushed";
2299 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 2299 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
2300 2, kPushedData, strlen(kPushedData), true)); 2300 2, kPushedData, strlen(kPushedData), true));
2301 MockRead reads[] = { 2301 MockRead reads[] = {
2302 CreateMockRead(stream1_reply, 1), 2302 CreateMockRead(stream1_reply, 1),
2303 CreateMockRead(stream2_syn, 2), 2303 CreateMockRead(stream2_syn, 2),
2304 CreateMockRead(stream1_body, 3, SYNCHRONOUS), 2304 CreateMockRead(stream1_body, 3, SYNCHRONOUS),
2305 CreateMockRead(stream2_body, 4), 2305 CreateMockRead(stream2_body, 4),
2306 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2306 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2307 }; 2307 };
2308 2308
2309 HttpResponseInfo response; 2309 HttpResponseInfo response;
2310 HttpResponseInfo response2; 2310 HttpResponseInfo response2;
2311 std::string expected_push_result("pushed"); 2311 std::string expected_push_result("pushed");
2312 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2312 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2313 RunServerPushTest(&data, 2313 RunServerPushTest(&data,
2314 &response, 2314 &response,
2315 &response2, 2315 &response2,
2316 expected_push_result); 2316 expected_push_result);
2317 2317
2318 // Verify the SYN_REPLY. 2318 // Verify the response headers.
2319 EXPECT_TRUE(response.headers); 2319 EXPECT_TRUE(response.headers);
2320 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2320 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2321 2321
2322 // Verify the pushed stream. 2322 // Verify the pushed stream.
2323 EXPECT_TRUE(response2.headers); 2323 EXPECT_TRUE(response2.headers);
2324 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2324 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2325 } 2325 }
2326 2326
2327 TEST_F(SpdyNetworkTransactionTest, ServerPushBeforeSynReply) { 2327 TEST_F(SpdyNetworkTransactionTest, ServerPushBeforeHeaders) {
2328 SpdySerializedFrame stream1_syn( 2328 SpdySerializedFrame stream1_syn(
2329 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2329 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2330 MockWrite writes[] = { 2330 MockWrite writes[] = {
2331 CreateMockWrite(stream1_syn, 0), 2331 CreateMockWrite(stream1_syn, 0),
2332 }; 2332 };
2333 2333
2334 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2334 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2335 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2335 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2336 SpdySerializedFrame stream1_reply( 2336 SpdySerializedFrame stream1_reply(
2337 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2337 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2338 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2338 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2339 const char kPushedData[] = "pushed"; 2339 const char kPushedData[] = "pushed";
2340 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 2340 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
2341 2, kPushedData, strlen(kPushedData), true)); 2341 2, kPushedData, strlen(kPushedData), true));
2342 MockRead reads[] = { 2342 MockRead reads[] = {
2343 CreateMockRead(stream2_syn, 1), 2343 CreateMockRead(stream2_syn, 1),
2344 CreateMockRead(stream1_reply, 2), 2344 CreateMockRead(stream1_reply, 2),
2345 CreateMockRead(stream1_body, 3, SYNCHRONOUS), 2345 CreateMockRead(stream1_body, 3, SYNCHRONOUS),
2346 CreateMockRead(stream2_body, 4), 2346 CreateMockRead(stream2_body, 4),
2347 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2347 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2348 }; 2348 };
2349 2349
2350 HttpResponseInfo response; 2350 HttpResponseInfo response;
2351 HttpResponseInfo response2; 2351 HttpResponseInfo response2;
2352 std::string expected_push_result("pushed"); 2352 std::string expected_push_result("pushed");
2353 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2353 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2354 RunServerPushTest(&data, 2354 RunServerPushTest(&data,
2355 &response, 2355 &response,
2356 &response2, 2356 &response2,
2357 expected_push_result); 2357 expected_push_result);
2358 2358
2359 // Verify the SYN_REPLY. 2359 // Verify the response headers.
2360 EXPECT_TRUE(response.headers); 2360 EXPECT_TRUE(response.headers);
2361 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2361 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2362 2362
2363 // Verify the pushed stream. 2363 // Verify the pushed stream.
2364 EXPECT_TRUE(response2.headers); 2364 EXPECT_TRUE(response2.headers);
2365 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2365 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2366 } 2366 }
2367 2367
2368 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) { 2368 TEST_F(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) {
2369 SpdySerializedFrame stream1_syn( 2369 SpdySerializedFrame stream1_syn(
2370 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2370 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2371 MockWrite writes[] = { 2371 MockWrite writes[] = {
2372 CreateMockWrite(stream1_syn, 0), 2372 CreateMockWrite(stream1_syn, 0),
2373 }; 2373 };
2374 2374
2375 SpdySerializedFrame stream1_reply( 2375 SpdySerializedFrame stream1_reply(
2376 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2376 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2377 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2377 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2378 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2378 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2379 const char kPushedData[] = "pushed"; 2379 const char kPushedData[] = "pushed";
2380 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 2380 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
2381 2, kPushedData, strlen(kPushedData), true)); 2381 2, kPushedData, strlen(kPushedData), true));
2382 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2382 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2383 MockRead reads[] = { 2383 MockRead reads[] = {
2384 CreateMockRead(stream1_reply, 1), 2384 CreateMockRead(stream1_reply, 1),
2385 CreateMockRead(stream2_syn, 2), 2385 CreateMockRead(stream2_syn, 2),
2386 CreateMockRead(stream2_body, 3), 2386 CreateMockRead(stream2_body, 3),
2387 CreateMockRead(stream1_body, 4, SYNCHRONOUS), 2387 CreateMockRead(stream1_body, 4, SYNCHRONOUS),
2388 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2388 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2389 }; 2389 };
2390 2390
2391 HttpResponseInfo response; 2391 HttpResponseInfo response;
2392 HttpResponseInfo response2; 2392 HttpResponseInfo response2;
2393 std::string expected_push_result("pushed"); 2393 std::string expected_push_result("pushed");
2394 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2394 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2395 RunServerPushTest(&data, 2395 RunServerPushTest(&data,
2396 &response, 2396 &response,
2397 &response2, 2397 &response2,
2398 expected_push_result); 2398 expected_push_result);
2399 2399
2400 // Verify the SYN_REPLY. 2400 // Verify the response headers.
2401 EXPECT_TRUE(response.headers); 2401 EXPECT_TRUE(response.headers);
2402 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2402 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2403 2403
2404 // Verify the pushed stream. 2404 // Verify the pushed stream.
2405 EXPECT_TRUE(response2.headers); 2405 EXPECT_TRUE(response2.headers);
2406 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2406 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2407 } 2407 }
2408 2408
2409 TEST_F(SpdyNetworkTransactionTest, ServerPushServerAborted) { 2409 TEST_F(SpdyNetworkTransactionTest, ServerPushServerAborted) {
2410 SpdySerializedFrame stream1_syn( 2410 SpdySerializedFrame stream1_syn(
2411 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2411 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2412 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2412 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2413 MockWrite writes[] = { 2413 MockWrite writes[] = {
2414 CreateMockWrite(stream1_syn, 0), 2414 CreateMockWrite(stream1_syn, 0),
2415 }; 2415 };
2416 2416
2417 SpdySerializedFrame stream1_reply( 2417 SpdySerializedFrame stream1_reply(
2418 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2418 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2419 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2419 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2420 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2420 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2421 SpdySerializedFrame stream2_rst( 2421 SpdySerializedFrame stream2_rst(
2422 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2422 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2423 MockRead reads[] = { 2423 MockRead reads[] = {
2424 CreateMockRead(stream1_reply, 1), 2424 CreateMockRead(stream1_reply, 1),
2425 CreateMockRead(stream2_syn, 2), 2425 CreateMockRead(stream2_syn, 2),
2426 CreateMockRead(stream2_rst, 3), 2426 CreateMockRead(stream2_rst, 3),
2427 CreateMockRead(stream1_body, 4, SYNCHRONOUS), 2427 CreateMockRead(stream1_body, 4, SYNCHRONOUS),
2428 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2428 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
(...skipping 13 matching lines...) Expand all
2442 int rv = trans->Start( 2442 int rv = trans->Start(
2443 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2443 &CreateGetRequest(), callback.callback(), BoundNetLog());
2444 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 2444 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2445 rv = callback.WaitForResult(); 2445 rv = callback.WaitForResult();
2446 EXPECT_THAT(rv, IsOk()); 2446 EXPECT_THAT(rv, IsOk());
2447 2447
2448 // Verify that we consumed all test data. 2448 // Verify that we consumed all test data.
2449 EXPECT_TRUE(data.AllReadDataConsumed()); 2449 EXPECT_TRUE(data.AllReadDataConsumed());
2450 EXPECT_TRUE(data.AllWriteDataConsumed()); 2450 EXPECT_TRUE(data.AllWriteDataConsumed());
2451 2451
2452 // Verify the SYN_REPLY. 2452 // Verify the response headers.
2453 HttpResponseInfo response = *trans->GetResponseInfo(); 2453 HttpResponseInfo response = *trans->GetResponseInfo();
2454 EXPECT_TRUE(response.headers); 2454 EXPECT_TRUE(response.headers);
2455 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2455 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2456 } 2456 }
2457 2457
2458 // Verify that we don't leak streams and that we properly send a reset 2458 // Verify that we don't leak streams and that we properly send a reset
2459 // if the server pushes the same stream twice. 2459 // if the server pushes the same stream twice.
2460 TEST_F(SpdyNetworkTransactionTest, ServerPushDuplicate) { 2460 TEST_F(SpdyNetworkTransactionTest, ServerPushDuplicate) {
2461 SpdySerializedFrame stream1_syn( 2461 SpdySerializedFrame stream1_syn(
2462 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2462 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2463 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2463 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2464 SpdySerializedFrame stream3_rst( 2464 SpdySerializedFrame stream3_rst(
2465 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR)); 2465 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR));
2466 MockWrite writes[] = { 2466 MockWrite writes[] = {
2467 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream3_rst, 4), 2467 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream3_rst, 4),
2468 }; 2468 };
2469 2469
2470 SpdySerializedFrame stream1_reply( 2470 SpdySerializedFrame stream1_reply(
2471 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2471 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2472 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2472 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2473 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2473 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2474 const char kPushedData[] = "pushed"; 2474 const char kPushedData[] = "pushed";
2475 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 2475 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
2476 2, kPushedData, strlen(kPushedData), true)); 2476 2, kPushedData, strlen(kPushedData), true));
2477 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( 2477 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush(
2478 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2478 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2479 MockRead reads[] = { 2479 MockRead reads[] = {
2480 CreateMockRead(stream1_reply, 1), 2480 CreateMockRead(stream1_reply, 1),
2481 CreateMockRead(stream2_syn, 2), 2481 CreateMockRead(stream2_syn, 2),
2482 CreateMockRead(stream3_syn, 3), 2482 CreateMockRead(stream3_syn, 3),
2483 CreateMockRead(stream1_body, 5), 2483 CreateMockRead(stream1_body, 5),
2484 CreateMockRead(stream2_body, 6), 2484 CreateMockRead(stream2_body, 6),
2485 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause 2485 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause
2486 }; 2486 };
2487 2487
2488 HttpResponseInfo response; 2488 HttpResponseInfo response;
2489 HttpResponseInfo response2; 2489 HttpResponseInfo response2;
2490 std::string expected_push_result("pushed"); 2490 std::string expected_push_result("pushed");
2491 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2491 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2492 RunServerPushTest(&data, 2492 RunServerPushTest(&data,
2493 &response, 2493 &response,
2494 &response2, 2494 &response2,
2495 expected_push_result); 2495 expected_push_result);
2496 2496
2497 // Verify the SYN_REPLY. 2497 // Verify the response headers.
2498 EXPECT_TRUE(response.headers); 2498 EXPECT_TRUE(response.headers);
2499 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2499 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2500 2500
2501 // Verify the pushed stream. 2501 // Verify the pushed stream.
2502 EXPECT_TRUE(response2.headers); 2502 EXPECT_TRUE(response2.headers);
2503 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2503 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2504 } 2504 }
2505 2505
2506 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) { 2506 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) {
2507 SpdySerializedFrame stream1_syn( 2507 SpdySerializedFrame stream1_syn(
2508 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2508 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2509 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2509 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2510 MockWrite writes[] = { 2510 MockWrite writes[] = {
2511 CreateMockWrite(stream1_syn, 0), 2511 CreateMockWrite(stream1_syn, 0),
2512 }; 2512 };
2513 2513
2514 SpdySerializedFrame stream1_reply( 2514 SpdySerializedFrame stream1_reply(
2515 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2515 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2516 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2516 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2517 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2517 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2518 static const char kPushedData[] = "pushed my darling hello my baby"; 2518 static const char kPushedData[] = "pushed my darling hello my baby";
2519 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame( 2519 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame(
2520 2, kPushedData, strlen(kPushedData), true)); 2520 2, kPushedData, strlen(kPushedData), true));
2521 const size_t kChunkSize = strlen(kPushedData) / 4; 2521 const size_t kChunkSize = strlen(kPushedData) / 4;
2522 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize, 2522 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize,
2523 false); 2523 false);
2524 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize, 2524 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize,
2525 kChunkSize, false); 2525 kChunkSize, false);
(...skipping 12 matching lines...) Expand all
2538 CreateMockRead(stream1_body, 7, SYNCHRONOUS), 2538 CreateMockRead(stream1_body, 7, SYNCHRONOUS),
2539 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause 2539 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause
2540 }; 2540 };
2541 2541
2542 HttpResponseInfo response; 2542 HttpResponseInfo response;
2543 HttpResponseInfo response2; 2543 HttpResponseInfo response2;
2544 std::string expected_push_result("pushed my darling hello my baby"); 2544 std::string expected_push_result("pushed my darling hello my baby");
2545 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2545 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2546 RunServerPushTest(&data, &response, &response2, kPushedData); 2546 RunServerPushTest(&data, &response, &response2, kPushedData);
2547 2547
2548 // Verify the SYN_REPLY. 2548 // Verify the response headers.
2549 EXPECT_TRUE(response.headers); 2549 EXPECT_TRUE(response.headers);
2550 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2550 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2551 2551
2552 // Verify the pushed stream. 2552 // Verify the pushed stream.
2553 EXPECT_TRUE(response2.headers); 2553 EXPECT_TRUE(response2.headers);
2554 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2554 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2555 } 2555 }
2556 2556
2557 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) { 2557 TEST_F(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) {
2558 SpdySerializedFrame stream1_syn( 2558 SpdySerializedFrame stream1_syn(
2559 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2559 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2560 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2560 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2561 MockWrite writes[] = { 2561 MockWrite writes[] = {
2562 CreateMockWrite(stream1_syn, 0), 2562 CreateMockWrite(stream1_syn, 0),
2563 }; 2563 };
2564 2564
2565 SpdySerializedFrame stream1_reply( 2565 SpdySerializedFrame stream1_reply(
2566 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2566 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2567 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2567 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2568 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2568 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2569 static const char kPushedData[] = "pushed my darling hello my baby"; 2569 static const char kPushedData[] = "pushed my darling hello my baby";
2570 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame( 2570 SpdySerializedFrame stream2_body_base(spdy_util_.ConstructSpdyDataFrame(
2571 2, kPushedData, strlen(kPushedData), true)); 2571 2, kPushedData, strlen(kPushedData), true));
2572 const size_t kChunkSize = strlen(kPushedData) / 4; 2572 const size_t kChunkSize = strlen(kPushedData) / 4;
2573 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize, 2573 SpdySerializedFrame stream2_body1(stream2_body_base.data(), kChunkSize,
2574 false); 2574 false);
2575 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize, 2575 SpdySerializedFrame stream2_body2(stream2_body_base.data() + kChunkSize,
2576 kChunkSize, false); 2576 kChunkSize, false);
(...skipping 11 matching lines...) Expand all
2588 CreateMockRead(stream2_body4, 6), 2588 CreateMockRead(stream2_body4, 6),
2589 CreateMockRead(stream1_body, 7, SYNCHRONOUS), 2589 CreateMockRead(stream1_body, 7, SYNCHRONOUS),
2590 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8) // Force a pause. 2590 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8) // Force a pause.
2591 }; 2591 };
2592 2592
2593 HttpResponseInfo response; 2593 HttpResponseInfo response;
2594 HttpResponseInfo response2; 2594 HttpResponseInfo response2;
2595 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2595 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2596 RunServerPushTest(&data, &response, &response2, kPushedData); 2596 RunServerPushTest(&data, &response, &response2, kPushedData);
2597 2597
2598 // Verify the SYN_REPLY. 2598 // Verify the response headers.
2599 EXPECT_TRUE(response.headers); 2599 EXPECT_TRUE(response.headers);
2600 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2600 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2601 2601
2602 // Verify the pushed stream. 2602 // Verify the pushed stream.
2603 EXPECT_TRUE(response2.headers); 2603 EXPECT_TRUE(response2.headers);
2604 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2604 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2605 } 2605 }
2606 2606
2607 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { 2607 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) {
2608 SpdySerializedFrame stream1_syn( 2608 SpdySerializedFrame stream1_syn(
2609 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2609 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2610 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 2610 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
2611 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_STREAM_ID).")); 2611 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_STREAM_ID)."));
2612 MockWrite writes[] = { 2612 MockWrite writes[] = {
2613 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 3), 2613 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 3),
2614 }; 2614 };
2615 2615
2616 SpdySerializedFrame stream1_reply( 2616 SpdySerializedFrame stream1_reply(
2617 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2617 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2618 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2618 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2619 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str())); 2619 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str()));
2620 MockRead reads[] = { 2620 MockRead reads[] = {
2621 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 2621 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2622 }; 2622 };
2623 2623
2624 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2624 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2625 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2625 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2626 BoundNetLog(), NULL); 2626 BoundNetLog(), NULL);
2627 2627
2628 helper.RunPreTestSetup(); 2628 helper.RunPreTestSetup();
2629 helper.AddData(&data); 2629 helper.AddData(&data);
2630 2630
2631 HttpNetworkTransaction* trans = helper.trans(); 2631 HttpNetworkTransaction* trans = helper.trans();
2632 2632
2633 // Start the transaction with basic parameters. 2633 // Start the transaction with basic parameters.
2634 TestCompletionCallback callback; 2634 TestCompletionCallback callback;
2635 int rv = trans->Start( 2635 int rv = trans->Start(
2636 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2636 &CreateGetRequest(), callback.callback(), BoundNetLog());
2637 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 2637 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2638 rv = callback.WaitForResult(); 2638 rv = callback.WaitForResult();
2639 EXPECT_THAT(rv, IsOk()); 2639 EXPECT_THAT(rv, IsOk());
2640 2640
2641 // Verify that we consumed all test data. 2641 // Verify that we consumed all test data.
2642 EXPECT_TRUE(data.AllReadDataConsumed()); 2642 EXPECT_TRUE(data.AllReadDataConsumed());
2643 EXPECT_TRUE(data.AllWriteDataConsumed()); 2643 EXPECT_TRUE(data.AllWriteDataConsumed());
2644 2644
2645 // Verify the SYN_REPLY. 2645 // Verify the response headers.
2646 HttpResponseInfo response = *trans->GetResponseInfo(); 2646 HttpResponseInfo response = *trans->GetResponseInfo();
2647 EXPECT_TRUE(response.headers); 2647 EXPECT_TRUE(response.headers);
2648 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2648 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2649 } 2649 }
2650 2650
2651 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { 2651 TEST_F(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) {
2652 SpdySerializedFrame stream1_syn( 2652 SpdySerializedFrame stream1_syn(
2653 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2653 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2654 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2654 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2655 SpdySerializedFrame stream2_rst( 2655 SpdySerializedFrame stream2_rst(
2656 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); 2656 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM));
2657 MockWrite writes[] = { 2657 MockWrite writes[] = {
2658 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), 2658 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3),
2659 }; 2659 };
2660 2660
2661 SpdySerializedFrame stream1_reply( 2661 SpdySerializedFrame stream1_reply(
2662 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2662 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2663 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2663 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2664 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str())); 2664 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str()));
2665 MockRead reads[] = { 2665 MockRead reads[] = {
2666 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 2666 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2667 CreateMockRead(stream1_body, 4), 2667 CreateMockRead(stream1_body, 4),
2668 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2668 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2669 }; 2669 };
2670 2670
2671 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2671 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2672 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2672 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2673 BoundNetLog(), NULL); 2673 BoundNetLog(), NULL);
2674 2674
2675 helper.RunPreTestSetup(); 2675 helper.RunPreTestSetup();
2676 helper.AddData(&data); 2676 helper.AddData(&data);
2677 2677
2678 HttpNetworkTransaction* trans = helper.trans(); 2678 HttpNetworkTransaction* trans = helper.trans();
2679 2679
2680 // Start the transaction with basic parameters. 2680 // Start the transaction with basic parameters.
2681 TestCompletionCallback callback; 2681 TestCompletionCallback callback;
2682 int rv = trans->Start( 2682 int rv = trans->Start(
2683 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2683 &CreateGetRequest(), callback.callback(), BoundNetLog());
2684 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 2684 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2685 rv = callback.WaitForResult(); 2685 rv = callback.WaitForResult();
2686 EXPECT_THAT(rv, IsOk()); 2686 EXPECT_THAT(rv, IsOk());
2687 2687
2688 // Verify that we consumed all test data. 2688 // Verify that we consumed all test data.
2689 EXPECT_TRUE(data.AllReadDataConsumed()); 2689 EXPECT_TRUE(data.AllReadDataConsumed());
2690 EXPECT_TRUE(data.AllWriteDataConsumed()); 2690 EXPECT_TRUE(data.AllWriteDataConsumed());
2691 2691
2692 // Verify the SYN_REPLY. 2692 // Verify the response headers.
2693 HttpResponseInfo response = *trans->GetResponseInfo(); 2693 HttpResponseInfo response = *trans->GetResponseInfo();
2694 EXPECT_TRUE(response.headers); 2694 EXPECT_TRUE(response.headers);
2695 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2695 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2696 } 2696 }
2697 2697
2698 TEST_F(SpdyNetworkTransactionTest, ServerPushNoURL) { 2698 TEST_F(SpdyNetworkTransactionTest, ServerPushNoURL) {
2699 SpdySerializedFrame stream1_syn( 2699 SpdySerializedFrame stream1_syn(
2700 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2700 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2701 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2701 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2702 SpdySerializedFrame stream2_rst( 2702 SpdySerializedFrame stream2_rst(
2703 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2703 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2704 MockWrite writes[] = { 2704 MockWrite writes[] = {
2705 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3), 2705 CreateMockWrite(stream1_syn, 0), CreateMockWrite(stream2_rst, 3),
2706 }; 2706 };
2707 2707
2708 SpdySerializedFrame stream1_reply( 2708 SpdySerializedFrame stream1_reply(
2709 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2709 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2710 SpdyHeaderBlock incomplete_headers; 2710 SpdyHeaderBlock incomplete_headers;
2711 incomplete_headers[spdy_util_.GetStatusKey()] = "200 OK"; 2711 incomplete_headers[spdy_util_.GetStatusKey()] = "200 OK";
2712 incomplete_headers["hello"] = "bye"; 2712 incomplete_headers["hello"] = "bye";
2713 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 2713 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
2714 std::move(incomplete_headers), 2, 1)); 2714 std::move(incomplete_headers), 2, 1));
2715 MockRead reads[] = { 2715 MockRead reads[] = {
2716 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 2716 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2717 CreateMockRead(stream1_body, 4), 2717 CreateMockRead(stream1_body, 4),
2718 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause 2718 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause
2719 }; 2719 };
(...skipping 12 matching lines...) Expand all
2732 int rv = trans->Start( 2732 int rv = trans->Start(
2733 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2733 &CreateGetRequest(), callback.callback(), BoundNetLog());
2734 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 2734 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
2735 rv = callback.WaitForResult(); 2735 rv = callback.WaitForResult();
2736 EXPECT_THAT(rv, IsOk()); 2736 EXPECT_THAT(rv, IsOk());
2737 2737
2738 // Verify that we consumed all test data. 2738 // Verify that we consumed all test data.
2739 EXPECT_TRUE(data.AllReadDataConsumed()); 2739 EXPECT_TRUE(data.AllReadDataConsumed());
2740 EXPECT_TRUE(data.AllWriteDataConsumed()); 2740 EXPECT_TRUE(data.AllWriteDataConsumed());
2741 2741
2742 // Verify the SYN_REPLY. 2742 // Verify the response headers.
2743 HttpResponseInfo response = *trans->GetResponseInfo(); 2743 HttpResponseInfo response = *trans->GetResponseInfo();
2744 EXPECT_TRUE(response.headers); 2744 EXPECT_TRUE(response.headers);
2745 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2745 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2746 } 2746 }
2747 2747
2748 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY. 2748 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY.
2749 TEST_F(SpdyNetworkTransactionTest, ServerPushOnPushedStream) { 2749 TEST_F(SpdyNetworkTransactionTest, ServerPushOnPushedStream) {
2750 SpdySerializedFrame stream1_syn( 2750 SpdySerializedFrame stream1_syn(
2751 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2751 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2752 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 2752 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
2753 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id.")); 2753 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id."));
2754 MockWrite writes[] = { 2754 MockWrite writes[] = {
2755 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 4), 2755 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 4),
2756 }; 2756 };
2757 2757
2758 SpdySerializedFrame stream1_reply( 2758 SpdySerializedFrame stream1_reply(
2759 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2759 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
2760 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2760 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2761 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2761 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2762 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( 2762 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush(
2763 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str())); 2763 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str()));
2764 MockRead reads[] = { 2764 MockRead reads[] = {
2765 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2), 2765 CreateMockRead(stream1_reply, 1), CreateMockRead(stream2_syn, 2),
2766 CreateMockRead(stream3_syn, 3), 2766 CreateMockRead(stream3_syn, 3),
2767 }; 2767 };
2768 2768
2769 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2769 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2770 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2770 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2771 BoundNetLog(), nullptr); 2771 BoundNetLog(), nullptr);
2772 helper.RunToCompletion(&data); 2772 helper.RunToCompletion(&data);
2773 } 2773 }
2774 2774
2775 // PUSH_PROMISE on a closed client-initiated stream should trigger RST_STREAM. 2775 // PUSH_PROMISE on a closed client-initiated stream should trigger RST_STREAM.
2776 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedStream) { 2776 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedStream) {
2777 SpdySerializedFrame stream1_syn( 2777 SpdySerializedFrame stream1_syn(
2778 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2778 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2779 SpdySerializedFrame rst( 2779 SpdySerializedFrame rst(
2780 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); 2780 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM));
2781 MockWrite writes[] = { 2781 MockWrite writes[] = {
2782 CreateMockWrite(stream1_syn, 0), CreateMockWrite(rst, 5), 2782 CreateMockWrite(stream1_syn, 0), CreateMockWrite(rst, 5),
2783 }; 2783 };
2784 2784
2785 SpdySerializedFrame stream1_reply( 2785 SpdySerializedFrame stream1_reply(
2786 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 2786 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2787 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2787 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2788 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2788 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2789 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2789 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2790 MockRead reads[] = { 2790 MockRead reads[] = {
2791 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_body, 2), 2791 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_body, 2),
2792 CreateMockRead(stream2_syn, 3), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4), 2792 CreateMockRead(stream2_syn, 3), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
2793 }; 2793 };
2794 2794
2795 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2795 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2796 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2796 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
(...skipping 22 matching lines...) Expand all
2819 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedPushedStream) { 2819 TEST_F(SpdyNetworkTransactionTest, ServerPushOnClosedPushedStream) {
2820 SpdySerializedFrame stream1_syn( 2820 SpdySerializedFrame stream1_syn(
2821 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2821 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2822 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 2822 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
2823 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id.")); 2823 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id."));
2824 MockWrite writes[] = { 2824 MockWrite writes[] = {
2825 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 7), 2825 CreateMockWrite(stream1_syn, 0), CreateMockWrite(goaway, 7),
2826 }; 2826 };
2827 2827
2828 SpdySerializedFrame stream1_reply( 2828 SpdySerializedFrame stream1_reply(
2829 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 2829 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
2830 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush( 2830 SpdySerializedFrame stream2_syn(spdy_util_.ConstructSpdyPush(
2831 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2831 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2832 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 2832 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
2833 const char kPushedData[] = "pushed"; 2833 const char kPushedData[] = "pushed";
2834 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame( 2834 SpdySerializedFrame stream2_body(spdy_util_.ConstructSpdyDataFrame(
2835 2, kPushedData, strlen(kPushedData), true)); 2835 2, kPushedData, strlen(kPushedData), true));
2836 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush( 2836 SpdySerializedFrame stream3_syn(spdy_util_.ConstructSpdyPush(
2837 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str())); 2837 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str()));
2838 2838
2839 MockRead reads[] = { 2839 MockRead reads[] = {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2872 ReadResult(trans2.get(), &result); 2872 ReadResult(trans2.get(), &result);
2873 EXPECT_EQ(kPushedData, result); 2873 EXPECT_EQ(kPushedData, result);
2874 2874
2875 data.Resume(); 2875 data.Resume();
2876 base::RunLoop().RunUntilIdle(); 2876 base::RunLoop().RunUntilIdle();
2877 2877
2878 EXPECT_TRUE(data.AllReadDataConsumed()); 2878 EXPECT_TRUE(data.AllReadDataConsumed());
2879 EXPECT_TRUE(data.AllWriteDataConsumed()); 2879 EXPECT_TRUE(data.AllWriteDataConsumed());
2880 } 2880 }
2881 2881
2882 // Verify that various SynReply headers parse correctly through the 2882 // Verify that various response headers parse correctly through the HTTP layer.
2883 // HTTP layer. 2883 TEST_F(SpdyNetworkTransactionTest, ResponseHeaders) {
2884 TEST_F(SpdyNetworkTransactionTest, SynReplyHeaders) { 2884 struct ResponseHeadersTests {
2885 struct SynReplyHeadersTests {
2886 int num_headers; 2885 int num_headers;
2887 const char* extra_headers[5]; 2886 const char* extra_headers[5];
2888 SpdyHeaderBlock expected_headers; 2887 SpdyHeaderBlock expected_headers;
2889 } test_cases[] = { 2888 } test_cases[] = {
2890 // This uses a multi-valued cookie header. 2889 // This uses a multi-valued cookie header.
2891 { 2, 2890 { 2,
2892 { "cookie", "val1", 2891 { "cookie", "val1",
2893 "cookie", "val2", // will get appended separated by NULL 2892 "cookie", "val2", // will get appended separated by NULL
2894 NULL 2893 NULL
2895 }, 2894 },
(...skipping 20 matching lines...) Expand all
2916 2915
2917 test_cases[0].expected_headers["cookie"] = base::StringPiece("val1\0val2", 9); 2916 test_cases[0].expected_headers["cookie"] = base::StringPiece("val1\0val2", 9);
2918 test_cases[2].expected_headers["cookie"] = "val1,val2"; 2917 test_cases[2].expected_headers["cookie"] = "val1,val2";
2919 2918
2920 for (size_t i = 0; i < arraysize(test_cases); ++i) { 2919 for (size_t i = 0; i < arraysize(test_cases); ++i) {
2921 SpdyTestUtil spdy_test_util; 2920 SpdyTestUtil spdy_test_util;
2922 SpdySerializedFrame req( 2921 SpdySerializedFrame req(
2923 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2922 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2924 MockWrite writes[] = {CreateMockWrite(req, 0)}; 2923 MockWrite writes[] = {CreateMockWrite(req, 0)};
2925 2924
2926 SpdySerializedFrame resp(spdy_test_util.ConstructSpdyGetSynReply( 2925 SpdySerializedFrame resp(spdy_test_util.ConstructSpdyGetReply(
2927 test_cases[i].extra_headers, test_cases[i].num_headers, 1)); 2926 test_cases[i].extra_headers, test_cases[i].num_headers, 1));
2928 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true)); 2927 SpdySerializedFrame body(spdy_test_util.ConstructSpdyDataFrame(1, true));
2929 MockRead reads[] = { 2928 MockRead reads[] = {
2930 CreateMockRead(resp, 1), CreateMockRead(body, 2), 2929 CreateMockRead(resp, 1), CreateMockRead(body, 2),
2931 MockRead(ASYNC, 0, 3) // EOF 2930 MockRead(ASYNC, 0, 3) // EOF
2932 }; 2931 };
2933 2932
2934 SequencedSocketData data(reads, arraysize(reads), writes, 2933 SequencedSocketData data(reads, arraysize(reads), writes,
2935 arraysize(writes)); 2934 arraysize(writes));
2936 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2935 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
(...skipping 19 matching lines...) Expand all
2956 std::string joint_value = mutable_header_block_value.as_string(); 2955 std::string joint_value = mutable_header_block_value.as_string();
2957 joint_value.append(1, '\0'); 2956 joint_value.append(1, '\0');
2958 joint_value.append(value); 2957 joint_value.append(value);
2959 mutable_header_block_value = joint_value; 2958 mutable_header_block_value = joint_value;
2960 } 2959 }
2961 } 2960 }
2962 EXPECT_EQ(test_cases[i].expected_headers, header_block); 2961 EXPECT_EQ(test_cases[i].expected_headers, header_block);
2963 } 2962 }
2964 } 2963 }
2965 2964
2966 // Verify that various SynReply headers parse vary fields correctly 2965 // Verify that various response headers parse vary fields correctly through the
2967 // through the HTTP layer, and the response matches the request. 2966 // HTTP layer, and the response matches the request.
2968 TEST_F(SpdyNetworkTransactionTest, SynReplyHeadersVary) { 2967 TEST_F(SpdyNetworkTransactionTest, ResponseHeadersVary) {
2969 // Modify the following data to change/add test cases: 2968 // Modify the following data to change/add test cases:
2970 struct SynReplyTests { 2969 struct ResponseTests {
2971 bool vary_matches; 2970 bool vary_matches;
2972 int num_headers[2]; 2971 int num_headers[2];
2973 const char* extra_headers[2][16]; 2972 const char* extra_headers[2][16];
2974 } test_cases[] = { 2973 } test_cases[] = {
2975 // Test the case of a multi-valued cookie. When the value is delimited 2974 // Test the case of a multi-valued cookie. When the value is delimited
2976 // with NUL characters, it needs to be unfolded into multiple headers. 2975 // with NUL characters, it needs to be unfolded into multiple headers.
2977 {true, 2976 {true,
2978 {1, 3}, 2977 {1, 3},
2979 {{"cookie", "val1,val2", NULL}, 2978 {{"cookie", "val1,val2", NULL},
2980 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(), 2979 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(),
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
3062 lines.append(name); 3061 lines.append(name);
3063 lines.append(": "); 3062 lines.append(": ");
3064 lines.append(value); 3063 lines.append(value);
3065 lines.append("\n"); 3064 lines.append("\n");
3066 } 3065 }
3067 3066
3068 EXPECT_EQ(expected_reply, lines) << i; 3067 EXPECT_EQ(expected_reply, lines) << i;
3069 } 3068 }
3070 } 3069 }
3071 3070
3072 // Verify that we don't crash on invalid SynReply responses. 3071 // Verify that we don't crash on invalid response headers.
3073 TEST_F(SpdyNetworkTransactionTest, InvalidSynReply) { 3072 TEST_F(SpdyNetworkTransactionTest, InvalidResponseHeaders) {
3074 struct InvalidSynReplyTests { 3073 struct InvalidResponseHeadersTests {
3075 int num_headers; 3074 int num_headers;
3076 const char* headers[10]; 3075 const char* headers[10];
3077 } test_cases[] = { 3076 } test_cases[] = {
3078 // SYN_REPLY missing status header 3077 // Response headers missing status header
3079 { 3078 {
3080 3, 3079 3,
3081 {spdy_util_.GetPathKey(), "/index.php", "cookie", "val1", "cookie", 3080 {spdy_util_.GetPathKey(), "/index.php", "cookie", "val1", "cookie",
3082 "val2", NULL}, 3081 "val2", NULL},
3083 }, 3082 },
3084 // SYN_REPLY missing version header 3083 // Response headers missing version header
3085 { 3084 {
3086 1, {spdy_util_.GetPathKey(), "/index.php", "status", "200", NULL}, 3085 1, {spdy_util_.GetPathKey(), "/index.php", "status", "200", NULL},
3087 }, 3086 },
3088 // SYN_REPLY with no headers 3087 // Response headers with no headers
3089 { 3088 {
3090 0, {NULL}, 3089 0, {NULL},
3091 }, 3090 },
3092 }; 3091 };
3093 3092
3094 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3093 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3095 SpdyTestUtil spdy_test_util; 3094 SpdyTestUtil spdy_test_util;
3096 3095
3097 SpdySerializedFrame req( 3096 SpdySerializedFrame req(
3098 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3097 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
(...skipping 24 matching lines...) Expand all
3123 } 3122 }
3124 3123
3125 TEST_F(SpdyNetworkTransactionTest, CorruptFrameSessionError) { 3124 TEST_F(SpdyNetworkTransactionTest, CorruptFrameSessionError) {
3126 SpdySerializedFrame req( 3125 SpdySerializedFrame req(
3127 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3126 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3128 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 3127 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
3129 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE).")); 3128 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE)."));
3130 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)}; 3129 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)};
3131 3130
3132 // This is the length field that's too short. 3131 // This is the length field that's too short.
3133 SpdySerializedFrame syn_reply_wrong_length( 3132 SpdySerializedFrame reply_wrong_length(
3134 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 3133 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
3135 size_t right_size = syn_reply_wrong_length.size() - 3134 size_t right_size = reply_wrong_length.size() -
3136 SpdyConstants::GetControlFrameHeaderSize(HTTP2); 3135 SpdyConstants::GetControlFrameHeaderSize(HTTP2);
3137 size_t wrong_size = right_size - 4; 3136 size_t wrong_size = right_size - 4;
3138 test::SetFrameLength(&syn_reply_wrong_length, wrong_size, HTTP2); 3137 test::SetFrameLength(&reply_wrong_length, wrong_size, HTTP2);
3139 3138
3140 MockRead reads[] = { 3139 MockRead reads[] = {
3141 MockRead(ASYNC, syn_reply_wrong_length.data(), 3140 MockRead(ASYNC, reply_wrong_length.data(), reply_wrong_length.size() - 4,
3142 syn_reply_wrong_length.size() - 4, 1), 3141 1),
3143 }; 3142 };
3144 3143
3145 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3144 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3146 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3145 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3147 BoundNetLog(), NULL); 3146 BoundNetLog(), NULL);
3148 helper.RunToCompletion(&data); 3147 helper.RunToCompletion(&data);
3149 TransactionHelperResult out = helper.output(); 3148 TransactionHelperResult out = helper.output();
3150 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR)); 3149 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR));
3151 } 3150 }
3152 3151
3153 TEST_F(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) { 3152 TEST_F(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) {
3154 SpdySerializedFrame req( 3153 SpdySerializedFrame req(
3155 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3154 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3156 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway( 3155 SpdySerializedFrame goaway(spdy_util_.ConstructSpdyGoAway(
3157 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE).")); 3156 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 6 (DECOMPRESS_FAILURE)."));
3158 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)}; 3157 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(goaway, 2)};
3159 3158
3160 // Read HEADERS with corrupted payload. 3159 // Read HEADERS with corrupted payload.
3161 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3160 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
3162 memset(resp.data() + 12, 0xcf, resp.size() - 12); 3161 memset(resp.data() + 12, 0xcf, resp.size() - 12);
3163 MockRead reads[] = {CreateMockRead(resp, 1)}; 3162 MockRead reads[] = {CreateMockRead(resp, 1)};
3164 3163
3165 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3164 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3166 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3165 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3167 BoundNetLog(), NULL); 3166 BoundNetLog(), NULL);
3168 helper.RunToCompletion(&data); 3167 helper.RunToCompletion(&data);
3169 TransactionHelperResult out = helper.output(); 3168 TransactionHelperResult out = helper.output();
3170 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR)); 3169 EXPECT_THAT(out.rv, IsError(ERR_SPDY_COMPRESSION_ERROR));
3171 } 3170 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
3216 EXPECT_TRUE(helper.StartDefaultTest()); 3215 EXPECT_TRUE(helper.StartDefaultTest());
3217 helper.FinishDefaultTest(); 3216 helper.FinishDefaultTest();
3218 EXPECT_TRUE(data.AllWriteDataConsumed()); 3217 EXPECT_TRUE(data.AllWriteDataConsumed());
3219 EXPECT_TRUE(data.AllReadDataConsumed()); 3218 EXPECT_TRUE(data.AllReadDataConsumed());
3220 TransactionHelperResult out = helper.output(); 3219 TransactionHelperResult out = helper.output();
3221 EXPECT_THAT(out.rv, IsError(ERR_FAILED)); 3220 EXPECT_THAT(out.rv, IsError(ERR_FAILED));
3222 } 3221 }
3223 3222
3224 // Test that partial writes work. 3223 // Test that partial writes work.
3225 TEST_F(SpdyNetworkTransactionTest, PartialWrite) { 3224 TEST_F(SpdyNetworkTransactionTest, PartialWrite) {
3226 // Chop the SYN_STREAM frame into 5 chunks. 3225 // Chop the HEADERS frame into 5 chunks.
3227 SpdySerializedFrame req( 3226 SpdySerializedFrame req(
3228 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3227 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3229 const int kChunks = 5; 3228 const int kChunks = 5;
3230 std::unique_ptr<MockWrite[]> writes(ChopWriteFrame(req, kChunks)); 3229 std::unique_ptr<MockWrite[]> writes(ChopWriteFrame(req, kChunks));
3231 for (int i = 0; i < kChunks; ++i) { 3230 for (int i = 0; i < kChunks; ++i) {
3232 writes[i].sequence_number = i; 3231 writes[i].sequence_number = i;
3233 } 3232 }
3234 3233
3235 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3234 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
3236 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 3235 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
3237 MockRead reads[] = { 3236 MockRead reads[] = {
3238 CreateMockRead(resp, kChunks), CreateMockRead(body, kChunks + 1), 3237 CreateMockRead(resp, kChunks), CreateMockRead(body, kChunks + 1),
3239 MockRead(ASYNC, 0, kChunks + 2) // EOF 3238 MockRead(ASYNC, 0, kChunks + 2) // EOF
3240 }; 3239 };
3241 3240
3242 SequencedSocketData data(reads, arraysize(reads), writes.get(), kChunks); 3241 SequencedSocketData data(reads, arraysize(reads), writes.get(), kChunks);
3243 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3242 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3244 BoundNetLog(), NULL); 3243 BoundNetLog(), NULL);
3245 helper.RunToCompletion(&data); 3244 helper.RunToCompletion(&data);
3246 TransactionHelperResult out = helper.output(); 3245 TransactionHelperResult out = helper.output();
3247 EXPECT_THAT(out.rv, IsOk()); 3246 EXPECT_THAT(out.rv, IsOk());
3248 EXPECT_EQ("HTTP/1.1 200", out.status_line); 3247 EXPECT_EQ("HTTP/1.1 200", out.status_line);
3249 EXPECT_EQ("hello!", out.response_data); 3248 EXPECT_EQ("hello!", out.response_data);
3250 } 3249 }
3251 3250
3252 // Test that the NetLog contains good data for a simple GET request. 3251 // Test that the NetLog contains good data for a simple GET request.
3253 TEST_F(SpdyNetworkTransactionTest, NetLog) { 3252 TEST_F(SpdyNetworkTransactionTest, NetLog) {
3254 static const char* const kExtraHeaders[] = { 3253 static const char* const kExtraHeaders[] = {
3255 "user-agent", "Chrome", 3254 "user-agent", "Chrome",
3256 }; 3255 };
3257 SpdySerializedFrame req( 3256 SpdySerializedFrame req(
3258 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, 1, LOWEST, true)); 3257 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, 1, LOWEST, true));
3259 MockWrite writes[] = {CreateMockWrite(req, 0)}; 3258 MockWrite writes[] = {CreateMockWrite(req, 0)};
3260 3259
3261 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3260 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
3262 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 3261 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
3263 MockRead reads[] = { 3262 MockRead reads[] = {
3264 CreateMockRead(resp, 1), CreateMockRead(body, 2), 3263 CreateMockRead(resp, 1), CreateMockRead(body, 2),
3265 MockRead(ASYNC, 0, 3) // EOF 3264 MockRead(ASYNC, 0, 3) // EOF
3266 }; 3265 };
3267 3266
3268 BoundTestNetLog log; 3267 BoundTestNetLog log;
3269 3268
3270 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3269 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3271 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(), 3270 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(),
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
3347 const SpdySerializedFrame* data_frames[2] = { 3346 const SpdySerializedFrame* data_frames[2] = {
3348 &data_frame_1, &data_frame_2, 3347 &data_frame_1, &data_frame_2,
3349 }; 3348 };
3350 char combined_data_frames[100]; 3349 char combined_data_frames[100];
3351 int combined_data_frames_len = 3350 int combined_data_frames_len =
3352 CombineFrames(data_frames, arraysize(data_frames), 3351 CombineFrames(data_frames, arraysize(data_frames),
3353 combined_data_frames, arraysize(combined_data_frames)); 3352 combined_data_frames, arraysize(combined_data_frames));
3354 SpdySerializedFrame last_frame( 3353 SpdySerializedFrame last_frame(
3355 spdy_util_.ConstructSpdyDataFrame(1, "d", 1, /*fin=*/true)); 3354 spdy_util_.ConstructSpdyDataFrame(1, "d", 1, /*fin=*/true));
3356 3355
3357 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3356 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
3358 MockRead reads[] = { 3357 MockRead reads[] = {
3359 CreateMockRead(resp, 1), 3358 CreateMockRead(resp, 1),
3360 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 3359 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
3361 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), 3360 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
3362 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause 3361 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause
3363 CreateMockRead(last_frame, 5), 3362 CreateMockRead(last_frame, 5),
3364 MockRead(ASYNC, 0, 6) // EOF 3363 MockRead(ASYNC, 0, 6) // EOF
3365 }; 3364 };
3366 3365
3367 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3366 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
3434 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); 3433 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false));
3435 SpdySerializedFrame data_frame_fin( 3434 SpdySerializedFrame data_frame_fin(
3436 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true)); 3435 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true));
3437 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame, 3436 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame,
3438 &data_frame, &data_frame_fin}; 3437 &data_frame, &data_frame_fin};
3439 char combined_data_frames[100]; 3438 char combined_data_frames[100];
3440 int combined_data_frames_len = 3439 int combined_data_frames_len =
3441 CombineFrames(data_frames, arraysize(data_frames), 3440 CombineFrames(data_frames, arraysize(data_frames),
3442 combined_data_frames, arraysize(combined_data_frames)); 3441 combined_data_frames, arraysize(combined_data_frames));
3443 3442
3444 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3443 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
3445 MockRead reads[] = { 3444 MockRead reads[] = {
3446 CreateMockRead(resp, 1), 3445 CreateMockRead(resp, 1),
3447 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 3446 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
3448 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), 3447 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
3449 MockRead(ASYNC, 0, 4) // EOF 3448 MockRead(ASYNC, 0, 4) // EOF
3450 }; 3449 };
3451 3450
3452 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3451 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3453 3452
3454 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3453 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
3511 EXPECT_EQ("messagemessagemessagemessage", out.response_data); 3510 EXPECT_EQ("messagemessagemessagemessage", out.response_data);
3512 } 3511 }
3513 3512
3514 // Verify the case where we buffer data but read it after it has been buffered. 3513 // Verify the case where we buffer data but read it after it has been buffered.
3515 TEST_F(SpdyNetworkTransactionTest, BufferedAll) { 3514 TEST_F(SpdyNetworkTransactionTest, BufferedAll) {
3516 SpdySerializedFrame req( 3515 SpdySerializedFrame req(
3517 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3516 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3518 MockWrite writes[] = {CreateMockWrite(req, 0)}; 3517 MockWrite writes[] = {CreateMockWrite(req, 0)};
3519 3518
3520 // 5 data frames in a single read. 3519 // 5 data frames in a single read.
3521 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3520 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
3522 SpdySerializedFrame data_frame( 3521 SpdySerializedFrame data_frame(
3523 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); 3522 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false));
3524 SpdySerializedFrame data_frame_fin( 3523 SpdySerializedFrame data_frame_fin(
3525 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true)); 3524 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/true));
3526 const SpdySerializedFrame* frames[5] = {&reply, &data_frame, &data_frame, 3525 const SpdySerializedFrame* frames[5] = {&reply, &data_frame, &data_frame,
3527 &data_frame, &data_frame_fin}; 3526 &data_frame, &data_frame_fin};
3528 char combined_frames[200]; 3527 char combined_frames[200];
3529 int combined_frames_len = 3528 int combined_frames_len =
3530 CombineFrames(frames, arraysize(frames), 3529 CombineFrames(frames, arraysize(frames),
3531 combined_frames, arraysize(combined_frames)); 3530 combined_frames, arraysize(combined_frames));
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
3602 // All data frames in a single read. 3601 // All data frames in a single read.
3603 // NOTE: We don't FIN the stream. 3602 // NOTE: We don't FIN the stream.
3604 SpdySerializedFrame data_frame( 3603 SpdySerializedFrame data_frame(
3605 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); 3604 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false));
3606 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame, 3605 const SpdySerializedFrame* data_frames[4] = {&data_frame, &data_frame,
3607 &data_frame, &data_frame}; 3606 &data_frame, &data_frame};
3608 char combined_data_frames[100]; 3607 char combined_data_frames[100];
3609 int combined_data_frames_len = 3608 int combined_data_frames_len =
3610 CombineFrames(data_frames, arraysize(data_frames), 3609 CombineFrames(data_frames, arraysize(data_frames),
3611 combined_data_frames, arraysize(combined_data_frames)); 3610 combined_data_frames, arraysize(combined_data_frames));
3612 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3611 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
3613 MockRead reads[] = { 3612 MockRead reads[] = {
3614 CreateMockRead(resp, 1), 3613 CreateMockRead(resp, 1),
3615 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait 3614 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait
3616 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), 3615 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
3617 MockRead(ASYNC, 0, 4) // EOF 3616 MockRead(ASYNC, 0, 4) // EOF
3618 }; 3617 };
3619 3618
3620 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3619 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3621 3620
3622 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3621 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
3682 SpdySerializedFrame req( 3681 SpdySerializedFrame req(
3683 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3682 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3684 SpdySerializedFrame rst( 3683 SpdySerializedFrame rst(
3685 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 3684 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
3686 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(rst, 4)}; 3685 MockWrite writes[] = {CreateMockWrite(req, 0), CreateMockWrite(rst, 4)};
3687 3686
3688 // NOTE: We don't FIN the stream. 3687 // NOTE: We don't FIN the stream.
3689 SpdySerializedFrame data_frame( 3688 SpdySerializedFrame data_frame(
3690 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false)); 3689 spdy_util_.ConstructSpdyDataFrame(1, "message", 7, /*fin=*/false));
3691 3690
3692 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3691 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
3693 MockRead reads[] = { 3692 MockRead reads[] = {
3694 CreateMockRead(resp, 1), 3693 CreateMockRead(resp, 1),
3695 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait 3694 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait
3696 CreateMockRead(data_frame, 3), MockRead(ASYNC, 0, 5) // EOF 3695 CreateMockRead(data_frame, 3), MockRead(ASYNC, 0, 5) // EOF
3697 }; 3696 };
3698 3697
3699 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3698 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3700 3699
3701 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3700 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3702 BoundNetLog(), NULL); 3701 BoundNetLog(), NULL);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
3759 helper.RunToCompletion(&data); 3758 helper.RunToCompletion(&data);
3760 TransactionHelperResult out = helper.output(); 3759 TransactionHelperResult out = helper.output();
3761 EXPECT_THAT(out.rv, IsError(ERR_ABORTED)); 3760 EXPECT_THAT(out.rv, IsError(ERR_ABORTED));
3762 } 3761 }
3763 3762
3764 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) { 3763 TEST_F(SpdyNetworkTransactionTest, CloseWithActiveStream) {
3765 SpdySerializedFrame req( 3764 SpdySerializedFrame req(
3766 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3765 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3767 MockWrite writes[] = {CreateMockWrite(req, 0)}; 3766 MockWrite writes[] = {CreateMockWrite(req, 0)};
3768 3767
3769 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3768 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
3770 MockRead reads[] = { 3769 MockRead reads[] = {
3771 CreateMockRead(resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF 3770 CreateMockRead(resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF
3772 }; 3771 };
3773 3772
3774 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3773 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3775 BoundNetLog log; 3774 BoundNetLog log;
3776 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, log, 3775 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, log,
3777 NULL); 3776 NULL);
3778 helper.RunPreTestSetup(); 3777 helper.RunPreTestSetup();
3779 helper.AddData(&data); 3778 helper.AddData(&data);
(...skipping 24 matching lines...) Expand all
3804 HttpRequestInfo request; 3803 HttpRequestInfo request;
3805 request.method = "GET"; 3804 request.method = "GET";
3806 request.url = default_url_; 3805 request.url = default_url_;
3807 // Do not force SPDY so that second socket can negotiate HTTP/1.1. 3806 // Do not force SPDY so that second socket can negotiate HTTP/1.1.
3808 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 3807 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
3809 nullptr); 3808 nullptr);
3810 3809
3811 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED. 3810 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED.
3812 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); 3811 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl));
3813 SpdySerializedFrame req( 3812 SpdySerializedFrame req(
3814 spdy_util_.ConstructSpdySyn(1, std::move(headers), LOWEST, true)); 3813 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true));
3815 MockWrite writes0[] = {CreateMockWrite(req, 0)}; 3814 MockWrite writes0[] = {CreateMockWrite(req, 0)};
3816 SpdySerializedFrame go_away(spdy_util_.ConstructSpdyGoAway( 3815 SpdySerializedFrame go_away(spdy_util_.ConstructSpdyGoAway(
3817 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 3816 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
3818 MockRead reads0[] = {CreateMockRead(go_away, 1)}; 3817 MockRead reads0[] = {CreateMockRead(go_away, 1)};
3819 SequencedSocketData data0(reads0, arraysize(reads0), writes0, 3818 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
3820 arraysize(writes0)); 3819 arraysize(writes0));
3821 3820
3822 std::unique_ptr<SSLSocketDataProvider> ssl_provider0( 3821 std::unique_ptr<SSLSocketDataProvider> ssl_provider0(
3823 new SSLSocketDataProvider(ASYNC, OK)); 3822 new SSLSocketDataProvider(ASYNC, OK));
3824 // Expect HTTP/2 protocols too in SSLConfig. 3823 // Expect HTTP/2 protocols too in SSLConfig.
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
3978 helper.RunPreTestSetup(); 3977 helper.RunPreTestSetup();
3979 HttpNetworkTransaction* trans = helper.trans(); 3978 HttpNetworkTransaction* trans = helper.trans();
3980 3979
3981 const char kConnect443[] = { 3980 const char kConnect443[] = {
3982 "CONNECT www.example.org:443 HTTP/1.1\r\n" 3981 "CONNECT www.example.org:443 HTTP/1.1\r\n"
3983 "Host: www.example.org:443\r\n" 3982 "Host: www.example.org:443\r\n"
3984 "Proxy-Connection: keep-alive\r\n\r\n"}; 3983 "Proxy-Connection: keep-alive\r\n\r\n"};
3985 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"}; 3984 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"};
3986 SpdySerializedFrame req( 3985 SpdySerializedFrame req(
3987 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3986 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3988 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3987 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
3989 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 3988 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
3990 3989
3991 MockWrite writes[] = { 3990 MockWrite writes[] = {
3992 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 3991 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
3993 CreateMockWrite(req, 2), 3992 CreateMockWrite(req, 2),
3994 }; 3993 };
3995 MockRead reads[] = { 3994 MockRead reads[] = {
3996 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 3995 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
3997 CreateMockRead(resp, 3), CreateMockRead(body, 4), 3996 CreateMockRead(resp, 3), CreateMockRead(body, 4),
3998 MockRead(ASYNC, 0, 0, 5), 3997 MockRead(ASYNC, 0, 0, 5),
3999 }; 3998 };
4000 std::unique_ptr<SequencedSocketData> data(new SequencedSocketData( 3999 std::unique_ptr<SequencedSocketData> data(new SequencedSocketData(
4001 reads, arraysize(reads), writes, arraysize(writes))); 4000 reads, arraysize(reads), writes, arraysize(writes)));
4002 4001
4003 helper.AddData(data.get()); 4002 helper.AddData(data.get());
4004 TestCompletionCallback callback; 4003 TestCompletionCallback callback;
4005 4004
4006 int rv = trans->Start( 4005 int rv = trans->Start(
4007 &CreateGetRequest(), callback.callback(), BoundNetLog()); 4006 &CreateGetRequest(), callback.callback(), BoundNetLog());
4008 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 4007 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
4009 4008
4010 rv = callback.WaitForResult(); 4009 rv = callback.WaitForResult();
4011 EXPECT_EQ(0, rv); 4010 EXPECT_EQ(0, rv);
4012 4011
4013 // Verify the SYN_REPLY. 4012 // Verify the response headers.
4014 HttpResponseInfo response = *trans->GetResponseInfo(); 4013 HttpResponseInfo response = *trans->GetResponseInfo();
4015 ASSERT_TRUE(response.headers); 4014 ASSERT_TRUE(response.headers);
4016 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 4015 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
4017 4016
4018 std::string response_data; 4017 std::string response_data;
4019 ASSERT_THAT(ReadTransaction(trans, &response_data), IsOk()); 4018 ASSERT_THAT(ReadTransaction(trans, &response_data), IsOk());
4020 EXPECT_EQ("hello!", response_data); 4019 EXPECT_EQ("hello!", response_data);
4021 helper.VerifyDataConsumed(); 4020 helper.VerifyDataConsumed();
4022 } 4021 }
4023 4022
(...skipping 15 matching lines...) Expand all
4039 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); 4038 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool();
4040 helper.RunPreTestSetup(); 4039 helper.RunPreTestSetup();
4041 4040
4042 // Construct and send a simple GET request. 4041 // Construct and send a simple GET request.
4043 SpdySerializedFrame req( 4042 SpdySerializedFrame req(
4044 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4043 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4045 MockWrite writes[] = { 4044 MockWrite writes[] = {
4046 CreateMockWrite(req, 0), 4045 CreateMockWrite(req, 0),
4047 }; 4046 };
4048 4047
4049 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4048 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
4050 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4049 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
4051 MockRead reads[] = { 4050 MockRead reads[] = {
4052 CreateMockRead(resp, 1), CreateMockRead(body, 2), 4051 CreateMockRead(resp, 1), CreateMockRead(body, 2),
4053 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), // Force a pause 4052 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), // Force a pause
4054 }; 4053 };
4055 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4054 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4056 helper.AddData(&data); 4055 helper.AddData(&data);
4057 HttpNetworkTransaction* trans = helper.trans(); 4056 HttpNetworkTransaction* trans = helper.trans();
4058 4057
4059 TestCompletionCallback callback; 4058 TestCompletionCallback callback;
(...skipping 29 matching lines...) Expand all
4089 SpdyTestUtil spdy_util_2; 4088 SpdyTestUtil spdy_util_2;
4090 4089
4091 // Set up data for the proxy connection. 4090 // Set up data for the proxy connection.
4092 const char kConnect443[] = { 4091 const char kConnect443[] = {
4093 "CONNECT www.example.org:443 HTTP/1.1\r\n" 4092 "CONNECT www.example.org:443 HTTP/1.1\r\n"
4094 "Host: www.example.org:443\r\n" 4093 "Host: www.example.org:443\r\n"
4095 "Proxy-Connection: keep-alive\r\n\r\n"}; 4094 "Proxy-Connection: keep-alive\r\n\r\n"};
4096 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"}; 4095 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"};
4097 SpdySerializedFrame req2(spdy_util_2.ConstructSpdyGet( 4096 SpdySerializedFrame req2(spdy_util_2.ConstructSpdyGet(
4098 GetDefaultUrlWithPath("/foo.dat").c_str(), 1, LOWEST)); 4097 GetDefaultUrlWithPath("/foo.dat").c_str(), 1, LOWEST));
4099 SpdySerializedFrame resp2(spdy_util_2.ConstructSpdyGetSynReply(NULL, 0, 1)); 4098 SpdySerializedFrame resp2(spdy_util_2.ConstructSpdyGetReply(NULL, 0, 1));
4100 SpdySerializedFrame body2(spdy_util_2.ConstructSpdyDataFrame(1, true)); 4099 SpdySerializedFrame body2(spdy_util_2.ConstructSpdyDataFrame(1, true));
4101 4100
4102 MockWrite writes2[] = { 4101 MockWrite writes2[] = {
4103 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 4102 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
4104 CreateMockWrite(req2, 2), 4103 CreateMockWrite(req2, 2),
4105 }; 4104 };
4106 MockRead reads2[] = { 4105 MockRead reads2[] = {
4107 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 4106 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
4108 CreateMockRead(resp2, 3), CreateMockRead(body2, 4), 4107 CreateMockRead(resp2, 3), CreateMockRead(body2, 4),
4109 MockRead(ASYNC, 0, 5) // EOF 4108 MockRead(ASYNC, 0, 5) // EOF
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4142 EXPECT_EQ("hello!", response_data); 4141 EXPECT_EQ("hello!", response_data);
4143 4142
4144 helper_proxy.VerifyDataConsumed(); 4143 helper_proxy.VerifyDataConsumed();
4145 } 4144 }
4146 4145
4147 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction 4146 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction
4148 // on a new connection, if the connection was previously known to be good. 4147 // on a new connection, if the connection was previously known to be good.
4149 // This can happen when a server reboots without saying goodbye, or when 4148 // This can happen when a server reboots without saying goodbye, or when
4150 // we're behind a NAT that masked the RST. 4149 // we're behind a NAT that masked the RST.
4151 TEST_F(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) { 4150 TEST_F(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) {
4152 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4151 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
4153 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4152 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
4154 MockRead reads[] = { 4153 MockRead reads[] = {
4155 CreateMockRead(resp, 1), CreateMockRead(body, 2), 4154 CreateMockRead(resp, 1), CreateMockRead(body, 2),
4156 MockRead(ASYNC, ERR_IO_PENDING, 3), 4155 MockRead(ASYNC, ERR_IO_PENDING, 3),
4157 MockRead(ASYNC, ERR_CONNECTION_RESET, 4), 4156 MockRead(ASYNC, ERR_CONNECTION_RESET, 4),
4158 }; 4157 };
4159 4158
4160 MockRead reads2[] = { 4159 MockRead reads2[] = {
4161 CreateMockRead(resp, 1), CreateMockRead(body, 2), 4160 CreateMockRead(resp, 1), CreateMockRead(body, 2),
4162 MockRead(ASYNC, 0, 3) // EOF 4161 MockRead(ASYNC, 0, 3) // EOF
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
4252 CreateMockWrite(req_get, 0), CreateMockWrite(req_get_authorization, 3), 4251 CreateMockWrite(req_get, 0), CreateMockWrite(req_get_authorization, 3),
4253 }; 4252 };
4254 4253
4255 // The first response is a 401 authentication challenge, and the second 4254 // The first response is a 401 authentication challenge, and the second
4256 // response will be a 200 response since the second request includes a valid 4255 // response will be a 200 response since the second request includes a valid
4257 // Authorization header. 4256 // Authorization header.
4258 const char* const kExtraAuthenticationHeaders[] = { 4257 const char* const kExtraAuthenticationHeaders[] = {
4259 "www-authenticate", 4258 "www-authenticate",
4260 "Basic realm=\"MyRealm\"" 4259 "Basic realm=\"MyRealm\""
4261 }; 4260 };
4262 SpdySerializedFrame resp_authentication(spdy_util_.ConstructSpdySynReplyError( 4261 SpdySerializedFrame resp_authentication(spdy_util_.ConstructSpdyReplyError(
4263 "401 Authentication Required", kExtraAuthenticationHeaders, 4262 "401 Authentication Required", kExtraAuthenticationHeaders,
4264 arraysize(kExtraAuthenticationHeaders) / 2, 1)); 4263 arraysize(kExtraAuthenticationHeaders) / 2, 1));
4265 SpdySerializedFrame body_authentication( 4264 SpdySerializedFrame body_authentication(
4266 spdy_util_.ConstructSpdyDataFrame(1, true)); 4265 spdy_util_.ConstructSpdyDataFrame(1, true));
4267 SpdySerializedFrame resp_data( 4266 SpdySerializedFrame resp_data(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
4268 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
4269 SpdySerializedFrame body_data(spdy_util_.ConstructSpdyDataFrame(3, true)); 4267 SpdySerializedFrame body_data(spdy_util_.ConstructSpdyDataFrame(3, true));
4270 MockRead spdy_reads[] = { 4268 MockRead spdy_reads[] = {
4271 CreateMockRead(resp_authentication, 1), 4269 CreateMockRead(resp_authentication, 1),
4272 CreateMockRead(body_authentication, 2), 4270 CreateMockRead(body_authentication, 2),
4273 CreateMockRead(resp_data, 4), 4271 CreateMockRead(resp_data, 4),
4274 CreateMockRead(body_data, 5), 4272 CreateMockRead(body_data, 5),
4275 MockRead(ASYNC, 0, 6), 4273 MockRead(ASYNC, 0, 6),
4276 }; 4274 };
4277 4275
4278 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes, 4276 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes,
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
4321 } 4319 }
4322 4320
4323 TEST_F(SpdyNetworkTransactionTest, ServerPushWithHeaders) { 4321 TEST_F(SpdyNetworkTransactionTest, ServerPushWithHeaders) {
4324 SpdySerializedFrame stream1_syn( 4322 SpdySerializedFrame stream1_syn(
4325 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4323 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4326 MockWrite writes[] = { 4324 MockWrite writes[] = {
4327 CreateMockWrite(stream1_syn, 0), 4325 CreateMockWrite(stream1_syn, 0),
4328 }; 4326 };
4329 4327
4330 SpdySerializedFrame stream1_reply( 4328 SpdySerializedFrame stream1_reply(
4331 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 4329 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4332 4330
4333 SpdyHeaderBlock initial_headers; 4331 SpdyHeaderBlock initial_headers;
4334 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 4332 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
4335 &initial_headers); 4333 &initial_headers);
4336 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 4334 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
4337 std::move(initial_headers), 2, 1)); 4335 std::move(initial_headers), 2, 1));
4338 4336
4339 SpdyHeaderBlock late_headers; 4337 SpdyHeaderBlock late_headers;
4340 late_headers[spdy_util_.GetStatusKey()] = "200"; 4338 late_headers[spdy_util_.GetStatusKey()] = "200";
4341 late_headers["hello"] = "bye"; 4339 late_headers["hello"] = "bye";
(...skipping 17 matching lines...) Expand all
4359 4357
4360 HttpResponseInfo response; 4358 HttpResponseInfo response;
4361 HttpResponseInfo response2; 4359 HttpResponseInfo response2;
4362 std::string expected_push_result("pushed"); 4360 std::string expected_push_result("pushed");
4363 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4361 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4364 RunServerPushTest(&data, 4362 RunServerPushTest(&data,
4365 &response, 4363 &response,
4366 &response2, 4364 &response2,
4367 expected_push_result); 4365 expected_push_result);
4368 4366
4369 // Verify the SYN_REPLY. 4367 // Verify the response headers.
4370 EXPECT_TRUE(response.headers); 4368 EXPECT_TRUE(response.headers);
4371 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 4369 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
4372 4370
4373 // Verify the pushed stream. 4371 // Verify the pushed stream.
4374 EXPECT_TRUE(response2.headers); 4372 EXPECT_TRUE(response2.headers);
4375 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 4373 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
4376 } 4374 }
4377 4375
4378 TEST_F(SpdyNetworkTransactionTest, ServerPushClaimBeforeHeaders) { 4376 TEST_F(SpdyNetworkTransactionTest, ServerPushClaimBeforeHeaders) {
4379 // We push a stream and attempt to claim it before the headers come down. 4377 // We push a stream and attempt to claim it before the headers come down.
4380 SpdySerializedFrame stream1_syn( 4378 SpdySerializedFrame stream1_syn(
4381 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4379 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4382 MockWrite writes[] = { 4380 MockWrite writes[] = {
4383 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS), 4381 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS),
4384 }; 4382 };
4385 4383
4386 SpdySerializedFrame stream1_reply( 4384 SpdySerializedFrame stream1_reply(
4387 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 4385 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4388 SpdyHeaderBlock initial_headers; 4386 SpdyHeaderBlock initial_headers;
4389 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 4387 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
4390 &initial_headers); 4388 &initial_headers);
4391 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 4389 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
4392 std::move(initial_headers), 2, 1)); 4390 std::move(initial_headers), 2, 1));
4393 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4391 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
4394 SpdyHeaderBlock late_headers; 4392 SpdyHeaderBlock late_headers;
4395 late_headers[spdy_util_.GetStatusKey()] = "200"; 4393 late_headers[spdy_util_.GetStatusKey()] = "200";
4396 late_headers["hello"] = "bye"; 4394 late_headers["hello"] = "bye";
4397 SpdySerializedFrame stream2_headers(spdy_util_.ConstructSpdyResponseHeaders( 4395 SpdySerializedFrame stream2_headers(spdy_util_.ConstructSpdyResponseHeaders(
(...skipping 18 matching lines...) Expand all
4416 helper.AddData(&data); 4414 helper.AddData(&data);
4417 helper.RunPreTestSetup(); 4415 helper.RunPreTestSetup();
4418 4416
4419 HttpNetworkTransaction* trans = helper.trans(); 4417 HttpNetworkTransaction* trans = helper.trans();
4420 4418
4421 // Start the transaction. 4419 // Start the transaction.
4422 TestCompletionCallback callback; 4420 TestCompletionCallback callback;
4423 int rv = trans->Start( 4421 int rv = trans->Start(
4424 &CreateGetRequest(), callback.callback(), BoundNetLog()); 4422 &CreateGetRequest(), callback.callback(), BoundNetLog());
4425 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 4423 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
4426 // Run until we've received the primary SYN_STREAM, the pushed SYN_STREAM, 4424 // Run until we've received the primary HEADERS, the pushed HEADERS,
4427 // and the body of the primary stream, but before we've received the HEADERS 4425 // and the body of the primary stream, but before we've received the HEADERS
4428 // for the pushed stream. 4426 // for the pushed stream.
4429 data.RunUntilPaused(); 4427 data.RunUntilPaused();
4430 EXPECT_THAT(callback.WaitForResult(), IsOk()); 4428 EXPECT_THAT(callback.WaitForResult(), IsOk());
4431 4429
4432 // Request the pushed path. At this point, we've received the push, but the 4430 // Request the pushed path. At this point, we've received the push, but the
4433 // headers are not yet complete. 4431 // headers are not yet complete.
4434 std::unique_ptr<HttpNetworkTransaction> trans2( 4432 std::unique_ptr<HttpNetworkTransaction> trans2(
4435 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); 4433 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session()));
4436 rv = trans2->Start( 4434 rv = trans2->Start(
(...skipping 10 matching lines...) Expand all
4447 std::string result; 4445 std::string result;
4448 ReadResult(trans, &result); 4446 ReadResult(trans, &result);
4449 4447
4450 // Verify that the received push data is same as the expected push data. 4448 // Verify that the received push data is same as the expected push data.
4451 EXPECT_EQ(result2.compare(expected_push_result), 0) 4449 EXPECT_EQ(result2.compare(expected_push_result), 0)
4452 << "Received data: " 4450 << "Received data: "
4453 << result2 4451 << result2
4454 << "||||| Expected data: " 4452 << "||||| Expected data: "
4455 << expected_push_result; 4453 << expected_push_result;
4456 4454
4457 // Verify the SYN_REPLY. 4455 // Verify the response headers.
4458 // Copy the response info, because trans goes away. 4456 // Copy the response info, because trans goes away.
4459 response = *trans->GetResponseInfo(); 4457 response = *trans->GetResponseInfo();
4460 response2 = *trans2->GetResponseInfo(); 4458 response2 = *trans2->GetResponseInfo();
4461 4459
4462 VerifyStreamsClosed(helper); 4460 VerifyStreamsClosed(helper);
4463 4461
4464 // Verify the SYN_REPLY. 4462 // Verify the response headers.
4465 EXPECT_TRUE(response.headers); 4463 EXPECT_TRUE(response.headers);
4466 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 4464 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
4467 4465
4468 // Verify the pushed stream. 4466 // Verify the pushed stream.
4469 EXPECT_TRUE(response2.headers); 4467 EXPECT_TRUE(response2.headers);
4470 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 4468 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
4471 4469
4472 // Read the final EOF (which will close the session) 4470 // Read the final EOF (which will close the session)
4473 data.Resume(); 4471 data.Resume();
4474 base::RunLoop().RunUntilIdle(); 4472 base::RunLoop().RunUntilIdle();
4475 4473
4476 // Verify that we consumed all test data. 4474 // Verify that we consumed all test data.
4477 EXPECT_TRUE(data.AllReadDataConsumed()); 4475 EXPECT_TRUE(data.AllReadDataConsumed());
4478 EXPECT_TRUE(data.AllWriteDataConsumed()); 4476 EXPECT_TRUE(data.AllWriteDataConsumed());
4479 } 4477 }
4480 4478
4481 // TODO(baranovich): HTTP 2 does not allow multiple HEADERS frames 4479 // TODO(baranovich): HTTP 2 does not allow multiple HEADERS frames
4482 TEST_F(SpdyNetworkTransactionTest, ServerPushWithTwoHeaderFrames) { 4480 TEST_F(SpdyNetworkTransactionTest, ServerPushWithTwoHeaderFrames) {
4483 // We push a stream and attempt to claim it before the headers come down. 4481 // We push a stream and attempt to claim it before the headers come down.
4484 SpdySerializedFrame stream1_syn( 4482 SpdySerializedFrame stream1_syn(
4485 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4483 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4486 MockWrite writes[] = { 4484 MockWrite writes[] = {
4487 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS), 4485 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS),
4488 }; 4486 };
4489 4487
4490 SpdySerializedFrame stream1_reply( 4488 SpdySerializedFrame stream1_reply(
4491 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 4489 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4492 4490
4493 SpdyHeaderBlock initial_headers; 4491 SpdyHeaderBlock initial_headers;
4494 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 4492 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
4495 &initial_headers); 4493 &initial_headers);
4496 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 4494 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
4497 std::move(initial_headers), 2, 1)); 4495 std::move(initial_headers), 2, 1));
4498 4496
4499 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4497 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
4500 4498
4501 SpdyHeaderBlock middle_headers; 4499 SpdyHeaderBlock middle_headers;
(...skipping 30 matching lines...) Expand all
4532 helper.AddData(&data); 4530 helper.AddData(&data);
4533 helper.RunPreTestSetup(); 4531 helper.RunPreTestSetup();
4534 4532
4535 HttpNetworkTransaction* trans = helper.trans(); 4533 HttpNetworkTransaction* trans = helper.trans();
4536 4534
4537 // Start the transaction. 4535 // Start the transaction.
4538 TestCompletionCallback callback; 4536 TestCompletionCallback callback;
4539 int rv = trans->Start( 4537 int rv = trans->Start(
4540 &CreateGetRequest(), callback.callback(), BoundNetLog()); 4538 &CreateGetRequest(), callback.callback(), BoundNetLog());
4541 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 4539 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
4542 // Run until we've received the primary SYN_STREAM, the pushed SYN_STREAM, 4540 // Run until we've received the primary HEADERS, the pushed HEADERS,
4543 // the first HEADERS frame, and the body of the primary stream, but before 4541 // the first HEADERS frame, and the body of the primary stream, but before
4544 // we've received the final HEADERS for the pushed stream. 4542 // we've received the final HEADERS for the pushed stream.
4545 data.RunUntilPaused(); 4543 data.RunUntilPaused();
4546 EXPECT_EQ(0, callback.WaitForResult()); 4544 EXPECT_EQ(0, callback.WaitForResult());
4547 4545
4548 // Request the pushed path. At this point, we've received the push, but the 4546 // Request the pushed path. At this point, we've received the push, but the
4549 // headers are not yet complete. 4547 // headers are not yet complete.
4550 std::unique_ptr<HttpNetworkTransaction> trans2( 4548 std::unique_ptr<HttpNetworkTransaction> trans2(
4551 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); 4549 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session()));
4552 rv = trans2->Start( 4550 rv = trans2->Start(
(...skipping 10 matching lines...) Expand all
4563 // Read the server push body. 4561 // Read the server push body.
4564 std::string result2; 4562 std::string result2;
4565 ReadResult(trans2.get(), &result2); 4563 ReadResult(trans2.get(), &result2);
4566 // Read the response body. 4564 // Read the response body.
4567 std::string result; 4565 std::string result;
4568 ReadResult(trans, &result); 4566 ReadResult(trans, &result);
4569 4567
4570 // Verify that the received push data is same as the expected push data. 4568 // Verify that the received push data is same as the expected push data.
4571 EXPECT_EQ(expected_push_result, result2); 4569 EXPECT_EQ(expected_push_result, result2);
4572 4570
4573 // Verify the SYN_REPLY. 4571 // Verify the response headers.
4574 // Copy the response info, because trans goes away. 4572 // Copy the response info, because trans goes away.
4575 response = *trans->GetResponseInfo(); 4573 response = *trans->GetResponseInfo();
4576 response2 = *trans2->GetResponseInfo(); 4574 response2 = *trans2->GetResponseInfo();
4577 4575
4578 VerifyStreamsClosed(helper); 4576 VerifyStreamsClosed(helper);
4579 4577
4580 // Verify the SYN_REPLY. 4578 // Verify the response headers.
4581 EXPECT_TRUE(response.headers); 4579 EXPECT_TRUE(response.headers);
4582 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 4580 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
4583 4581
4584 // Verify the pushed stream. 4582 // Verify the pushed stream.
4585 EXPECT_TRUE(response2.headers); 4583 EXPECT_TRUE(response2.headers);
4586 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 4584 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
4587 4585
4588 // Verify we got all the headers from all header blocks. 4586 // Verify we got all the headers from all header blocks.
4589 EXPECT_TRUE(response2.headers->HasHeaderValue("hello", "bye")); 4587 EXPECT_TRUE(response2.headers->HasHeaderValue("hello", "bye"));
4590 EXPECT_TRUE(response2.headers->HasHeaderValue("status", "200")); 4588 EXPECT_TRUE(response2.headers->HasHeaderValue("status", "200"));
4591 4589
4592 // Read the final EOF (which will close the session) 4590 // Read the final EOF (which will close the session)
4593 data.Resume(); 4591 data.Resume();
4594 base::RunLoop().RunUntilIdle(); 4592 base::RunLoop().RunUntilIdle();
4595 4593
4596 // Verify that we consumed all test data. 4594 // Verify that we consumed all test data.
4597 EXPECT_TRUE(data.AllReadDataConsumed()); 4595 EXPECT_TRUE(data.AllReadDataConsumed());
4598 EXPECT_TRUE(data.AllWriteDataConsumed()); 4596 EXPECT_TRUE(data.AllWriteDataConsumed());
4599 } 4597 }
4600 4598
4601 TEST_F(SpdyNetworkTransactionTest, ServerPushWithNoStatusHeaderFrames) { 4599 TEST_F(SpdyNetworkTransactionTest, ServerPushWithNoStatusHeaderFrames) {
4602 // We push a stream and attempt to claim it before the headers come down. 4600 // We push a stream and attempt to claim it before the headers come down.
4603 SpdySerializedFrame stream1_syn( 4601 SpdySerializedFrame stream1_syn(
4604 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4602 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4605 MockWrite writes[] = { 4603 MockWrite writes[] = {
4606 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS), 4604 CreateMockWrite(stream1_syn, 0, SYNCHRONOUS),
4607 }; 4605 };
4608 4606
4609 SpdySerializedFrame stream1_reply( 4607 SpdySerializedFrame stream1_reply(
4610 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 4608 spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4611 4609
4612 SpdyHeaderBlock initial_headers; 4610 SpdyHeaderBlock initial_headers;
4613 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 4611 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
4614 &initial_headers); 4612 &initial_headers);
4615 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 4613 SpdySerializedFrame stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame(
4616 std::move(initial_headers), 2, 1)); 4614 std::move(initial_headers), 2, 1));
4617 4615
4618 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4616 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
4619 4617
4620 SpdyHeaderBlock middle_headers; 4618 SpdyHeaderBlock middle_headers;
(...skipping 19 matching lines...) Expand all
4640 helper.AddData(&data); 4638 helper.AddData(&data);
4641 helper.RunPreTestSetup(); 4639 helper.RunPreTestSetup();
4642 4640
4643 HttpNetworkTransaction* trans = helper.trans(); 4641 HttpNetworkTransaction* trans = helper.trans();
4644 4642
4645 // Start the transaction. 4643 // Start the transaction.
4646 TestCompletionCallback callback; 4644 TestCompletionCallback callback;
4647 int rv = trans->Start( 4645 int rv = trans->Start(
4648 &CreateGetRequest(), callback.callback(), BoundNetLog()); 4646 &CreateGetRequest(), callback.callback(), BoundNetLog());
4649 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 4647 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
4650 // Run until we've received the primary SYN_STREAM, the pushed SYN_STREAM, 4648 // Run until we've received the primary HEADERS, the pushed HEADERS,
4651 // the first HEADERS frame, and the body of the primary stream, but before 4649 // the first HEADERS frame, and the body of the primary stream, but before
4652 // we've received the final HEADERS for the pushed stream. 4650 // we've received the final HEADERS for the pushed stream.
4653 data.RunUntilPaused(); 4651 data.RunUntilPaused();
4654 EXPECT_EQ(0, callback.WaitForResult()); 4652 EXPECT_EQ(0, callback.WaitForResult());
4655 4653
4656 // Request the pushed path. At this point, we've received the push, but the 4654 // Request the pushed path. At this point, we've received the push, but the
4657 // headers are not yet complete. 4655 // headers are not yet complete.
4658 std::unique_ptr<HttpNetworkTransaction> trans2( 4656 std::unique_ptr<HttpNetworkTransaction> trans2(
4659 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session())); 4657 new HttpNetworkTransaction(DEFAULT_PRIORITY, helper.session()));
4660 rv = trans2->Start( 4658 rv = trans2->Start(
4661 &CreateGetPushRequest(), callback.callback(), BoundNetLog()); 4659 &CreateGetPushRequest(), callback.callback(), BoundNetLog());
4662 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 4660 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
4663 data.Resume(); 4661 data.Resume();
4664 data.RunUntilPaused(); 4662 data.RunUntilPaused();
4665 base::RunLoop().RunUntilIdle(); 4663 base::RunLoop().RunUntilIdle();
4666 4664
4667 // Read the server push body. 4665 // Read the server push body.
4668 std::string result2; 4666 std::string result2;
4669 ReadResult(trans2.get(), &result2); 4667 ReadResult(trans2.get(), &result2);
4670 // Read the response body. 4668 // Read the response body.
4671 std::string result; 4669 std::string result;
4672 ReadResult(trans, &result); 4670 ReadResult(trans, &result);
4673 EXPECT_EQ("hello!", result); 4671 EXPECT_EQ("hello!", result);
4674 4672
4675 // Verify that we haven't received any push data. 4673 // Verify that we haven't received any push data.
4676 EXPECT_EQ("", result2); 4674 EXPECT_EQ("", result2);
4677 4675
4678 // Verify the SYN_REPLY. 4676 // Verify the response headers.
4679 // Copy the response info, because trans goes away. 4677 // Copy the response info, because trans goes away.
4680 HttpResponseInfo response = *trans->GetResponseInfo(); 4678 HttpResponseInfo response = *trans->GetResponseInfo();
4681 4679
4682 VerifyStreamsClosed(helper); 4680 VerifyStreamsClosed(helper);
4683 4681
4684 // Verify the SYN_REPLY. 4682 // Verify the response headers.
4685 EXPECT_TRUE(response.headers); 4683 EXPECT_TRUE(response.headers);
4686 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 4684 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
4687 4685
4688 // Read the final EOF (which will close the session). 4686 // Read the final EOF (which will close the session).
4689 data.Resume(); 4687 data.Resume();
4690 base::RunLoop().RunUntilIdle(); 4688 base::RunLoop().RunUntilIdle();
4691 4689
4692 // Verify that we consumed all test data. 4690 // Verify that we consumed all test data.
4693 EXPECT_TRUE(data.AllReadDataConsumed()); 4691 EXPECT_TRUE(data.AllReadDataConsumed());
4694 EXPECT_TRUE(data.AllWriteDataConsumed()); 4692 EXPECT_TRUE(data.AllWriteDataConsumed());
4695 } 4693 }
4696 4694
4697 TEST_F(SpdyNetworkTransactionTest, SynReplyWithHeaders) { 4695 TEST_F(SpdyNetworkTransactionTest, ResponseHeadersTwice) {
4698 SpdySerializedFrame req( 4696 SpdySerializedFrame req(
4699 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4697 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4700 SpdySerializedFrame rst( 4698 SpdySerializedFrame rst(
4701 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 4699 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
4702 MockWrite writes[] = { 4700 MockWrite writes[] = {
4703 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), 4701 CreateMockWrite(req, 0), CreateMockWrite(rst, 4),
4704 }; 4702 };
4705 4703
4706 SpdySerializedFrame stream1_reply( 4704 SpdySerializedFrame stream1_reply(
4707 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4705 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
4708 4706
4709 SpdyHeaderBlock late_headers; 4707 SpdyHeaderBlock late_headers;
4710 late_headers["hello"] = "bye"; 4708 late_headers["hello"] = "bye";
4711 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders( 4709 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders(
4712 1, std::move(late_headers), false)); 4710 1, std::move(late_headers), false));
4713 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4711 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, true));
4714 MockRead reads[] = { 4712 MockRead reads[] = {
4715 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_headers, 2), 4713 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_headers, 2),
4716 CreateMockRead(stream1_body, 3), MockRead(ASYNC, 0, 5) // EOF 4714 CreateMockRead(stream1_body, 3), MockRead(ASYNC, 0, 5) // EOF
4717 }; 4715 };
(...skipping 12 matching lines...) Expand all
4730 TEST_F(SpdyNetworkTransactionTest, SyncReplyDataAfterTrailers) { 4728 TEST_F(SpdyNetworkTransactionTest, SyncReplyDataAfterTrailers) {
4731 SpdySerializedFrame req( 4729 SpdySerializedFrame req(
4732 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4730 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4733 SpdySerializedFrame rst( 4731 SpdySerializedFrame rst(
4734 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 4732 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
4735 MockWrite writes[] = { 4733 MockWrite writes[] = {
4736 CreateMockWrite(req, 0), CreateMockWrite(rst, 5), 4734 CreateMockWrite(req, 0), CreateMockWrite(rst, 5),
4737 }; 4735 };
4738 4736
4739 SpdySerializedFrame stream1_reply( 4737 SpdySerializedFrame stream1_reply(
4740 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4738 spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
4741 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, false)); 4739 SpdySerializedFrame stream1_body(spdy_util_.ConstructSpdyDataFrame(1, false));
4742 4740
4743 SpdyHeaderBlock late_headers; 4741 SpdyHeaderBlock late_headers;
4744 late_headers["hello"] = "bye"; 4742 late_headers["hello"] = "bye";
4745 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders( 4743 SpdySerializedFrame stream1_headers(spdy_util_.ConstructSpdyResponseHeaders(
4746 1, std::move(late_headers), false)); 4744 1, std::move(late_headers), false));
4747 SpdySerializedFrame stream1_body2(spdy_util_.ConstructSpdyDataFrame(1, true)); 4745 SpdySerializedFrame stream1_body2(spdy_util_.ConstructSpdyDataFrame(1, true));
4748 MockRead reads[] = { 4746 MockRead reads[] = {
4749 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_body, 2), 4747 CreateMockRead(stream1_reply, 1), CreateMockRead(stream1_body, 2),
4750 CreateMockRead(stream1_headers, 3), CreateMockRead(stream1_body2, 4), 4748 CreateMockRead(stream1_headers, 3), CreateMockRead(stream1_body2, 4),
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
4790 spdy_test_util.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); 4788 spdy_test_util.ConstructSpdyGet(url_to_fetch, 1, LOWEST));
4791 SpdySerializedFrame stream1_body( 4789 SpdySerializedFrame stream1_body(
4792 spdy_test_util.ConstructSpdyDataFrame(1, true)); 4790 spdy_test_util.ConstructSpdyDataFrame(1, true));
4793 SpdySerializedFrame push_rst( 4791 SpdySerializedFrame push_rst(
4794 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 4792 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
4795 MockWrite writes[] = { 4793 MockWrite writes[] = {
4796 CreateMockWrite(stream1_syn, 0), CreateMockWrite(push_rst, 3), 4794 CreateMockWrite(stream1_syn, 0), CreateMockWrite(push_rst, 3),
4797 }; 4795 };
4798 4796
4799 SpdySerializedFrame stream1_reply( 4797 SpdySerializedFrame stream1_reply(
4800 spdy_test_util.ConstructSpdyGetSynReply(nullptr, 0, 1)); 4798 spdy_test_util.ConstructSpdyGetReply(nullptr, 0, 1));
4801 SpdySerializedFrame stream2_syn( 4799 SpdySerializedFrame stream2_syn(
4802 spdy_test_util.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); 4800 spdy_test_util.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push));
4803 const char kPushedData[] = "pushed"; 4801 const char kPushedData[] = "pushed";
4804 SpdySerializedFrame stream2_body(spdy_test_util.ConstructSpdyDataFrame( 4802 SpdySerializedFrame stream2_body(spdy_test_util.ConstructSpdyDataFrame(
4805 2, kPushedData, strlen(kPushedData), true)); 4803 2, kPushedData, strlen(kPushedData), true));
4806 SpdySerializedFrame rst( 4804 SpdySerializedFrame rst(
4807 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); 4805 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_CANCEL));
4808 4806
4809 MockRead reads[] = { 4807 MockRead reads[] = {
4810 CreateMockRead(stream1_reply, 1), 4808 CreateMockRead(stream1_reply, 1),
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4845 rv = callback.WaitForResult(); 4843 rv = callback.WaitForResult();
4846 4844
4847 // Read the response body. 4845 // Read the response body.
4848 std::string result; 4846 std::string result;
4849 ReadResult(trans, &result); 4847 ReadResult(trans, &result);
4850 4848
4851 // Verify that we consumed all test data. 4849 // Verify that we consumed all test data.
4852 EXPECT_TRUE(data.AllReadDataConsumed()); 4850 EXPECT_TRUE(data.AllReadDataConsumed());
4853 EXPECT_TRUE(data.AllWriteDataConsumed()); 4851 EXPECT_TRUE(data.AllWriteDataConsumed());
4854 4852
4855 // Verify the SYN_REPLY. 4853 // Verify the response headers.
4856 // Copy the response info, because trans goes away. 4854 // Copy the response info, because trans goes away.
4857 response = *trans->GetResponseInfo(); 4855 response = *trans->GetResponseInfo();
4858 4856
4859 VerifyStreamsClosed(helper); 4857 VerifyStreamsClosed(helper);
4860 4858
4861 // Verify the SYN_REPLY. 4859 // Verify the response headers.
4862 EXPECT_TRUE(response.headers); 4860 EXPECT_TRUE(response.headers);
4863 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 4861 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
4864 } 4862 }
4865 } 4863 }
4866 4864
4867 // Verify that push works cross origin as long as the certificate is valid for 4865 // Verify that push works cross origin as long as the certificate is valid for
4868 // the pushed authority. 4866 // the pushed authority.
4869 TEST_F(SpdyNetworkTransactionTest, ServerPushValidCrossOrigin) { 4867 TEST_F(SpdyNetworkTransactionTest, ServerPushValidCrossOrigin) {
4870 // "spdy_pooling.pem" is valid for both www.example.org and mail.example.org. 4868 // "spdy_pooling.pem" is valid for both www.example.org and mail.example.org.
4871 const char* url_to_fetch = "https://www.example.org"; 4869 const char* url_to_fetch = "https://www.example.org";
4872 const char* url_to_push = "https://mail.example.org"; 4870 const char* url_to_push = "https://mail.example.org";
4873 4871
4874 SpdySerializedFrame headers( 4872 SpdySerializedFrame headers(
4875 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); 4873 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST));
4876 MockWrite writes[] = { 4874 MockWrite writes[] = {
4877 CreateMockWrite(headers, 0), 4875 CreateMockWrite(headers, 0),
4878 }; 4876 };
4879 4877
4880 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 4878 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
4881 SpdySerializedFrame push( 4879 SpdySerializedFrame push(
4882 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); 4880 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push));
4883 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 4881 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
4884 const char kPushedData[] = "pushed"; 4882 const char kPushedData[] = "pushed";
4885 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame( 4883 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame(
4886 2, kPushedData, strlen(kPushedData), true)); 4884 2, kPushedData, strlen(kPushedData), true));
4887 MockRead reads[] = { 4885 MockRead reads[] = {
4888 CreateMockRead(reply, 1), 4886 CreateMockRead(reply, 1),
4889 CreateMockRead(push, 2), 4887 CreateMockRead(push, 2),
4890 CreateMockRead(body, 3), 4888 CreateMockRead(body, 3),
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
4963 const char* url_to_push = "https://mail.example.org/bar"; 4961 const char* url_to_push = "https://mail.example.org/bar";
4964 4962
4965 SpdyTestUtil spdy_util_0; 4963 SpdyTestUtil spdy_util_0;
4966 4964
4967 SpdySerializedFrame headers0( 4965 SpdySerializedFrame headers0(
4968 spdy_util_0.ConstructSpdyGet(url_to_fetch0, 1, LOWEST)); 4966 spdy_util_0.ConstructSpdyGet(url_to_fetch0, 1, LOWEST));
4969 MockWrite writes0[] = { 4967 MockWrite writes0[] = {
4970 CreateMockWrite(headers0, 0), 4968 CreateMockWrite(headers0, 0),
4971 }; 4969 };
4972 4970
4973 SpdySerializedFrame reply0( 4971 SpdySerializedFrame reply0(spdy_util_0.ConstructSpdyGetReply(nullptr, 0, 1));
4974 spdy_util_0.ConstructSpdyGetSynReply(nullptr, 0, 1));
4975 const char kData0[] = "first"; 4972 const char kData0[] = "first";
4976 SpdySerializedFrame body0( 4973 SpdySerializedFrame body0(
4977 spdy_util_0.ConstructSpdyDataFrame(1, kData0, strlen(kData0), true)); 4974 spdy_util_0.ConstructSpdyDataFrame(1, kData0, strlen(kData0), true));
4978 MockRead reads0[] = {CreateMockRead(reply0, 1), CreateMockRead(body0, 2), 4975 MockRead reads0[] = {CreateMockRead(reply0, 1), CreateMockRead(body0, 2),
4979 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3)}; 4976 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3)};
4980 4977
4981 SequencedSocketData data0(reads0, arraysize(reads0), writes0, 4978 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
4982 arraysize(writes0)); 4979 arraysize(writes0));
4983 4980
4984 SpdyTestUtil spdy_util_1; 4981 SpdyTestUtil spdy_util_1;
4985 4982
4986 SpdySerializedFrame headers1( 4983 SpdySerializedFrame headers1(
4987 spdy_util_1.ConstructSpdyGet(url_to_fetch1, 1, LOWEST)); 4984 spdy_util_1.ConstructSpdyGet(url_to_fetch1, 1, LOWEST));
4988 MockWrite writes1[] = { 4985 MockWrite writes1[] = {
4989 CreateMockWrite(headers1, 0), 4986 CreateMockWrite(headers1, 0),
4990 }; 4987 };
4991 4988
4992 SpdySerializedFrame reply1( 4989 SpdySerializedFrame reply1(spdy_util_1.ConstructSpdyGetReply(nullptr, 0, 1));
4993 spdy_util_1.ConstructSpdyGetSynReply(nullptr, 0, 1));
4994 SpdySerializedFrame push( 4990 SpdySerializedFrame push(
4995 spdy_util_1.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); 4991 spdy_util_1.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push));
4996 const char kData1[] = "second"; 4992 const char kData1[] = "second";
4997 SpdySerializedFrame body1( 4993 SpdySerializedFrame body1(
4998 spdy_util_1.ConstructSpdyDataFrame(1, kData1, strlen(kData1), true)); 4994 spdy_util_1.ConstructSpdyDataFrame(1, kData1, strlen(kData1), true));
4999 const char kPushedData[] = "pushed"; 4995 const char kPushedData[] = "pushed";
5000 SpdySerializedFrame pushed_body(spdy_util_1.ConstructSpdyDataFrame( 4996 SpdySerializedFrame pushed_body(spdy_util_1.ConstructSpdyDataFrame(
5001 2, kPushedData, strlen(kPushedData), true)); 4997 2, kPushedData, strlen(kPushedData), true));
5002 4998
5003 MockRead reads1[] = { 4999 MockRead reads1[] = {
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
5130 const char* url_to_push = "https://invalid.example.org"; 5126 const char* url_to_push = "https://invalid.example.org";
5131 5127
5132 SpdySerializedFrame headers( 5128 SpdySerializedFrame headers(
5133 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); 5129 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST));
5134 SpdySerializedFrame rst( 5130 SpdySerializedFrame rst(
5135 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 5131 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
5136 MockWrite writes[] = { 5132 MockWrite writes[] = {
5137 CreateMockWrite(headers, 0), CreateMockWrite(rst, 3), 5133 CreateMockWrite(headers, 0), CreateMockWrite(rst, 3),
5138 }; 5134 };
5139 5135
5140 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 5136 SpdySerializedFrame reply(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
5141 SpdySerializedFrame push( 5137 SpdySerializedFrame push(
5142 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); 5138 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push));
5143 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 5139 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
5144 const char kPushedData[] = "pushed"; 5140 const char kPushedData[] = "pushed";
5145 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame( 5141 SpdySerializedFrame pushed_body(spdy_util_.ConstructSpdyDataFrame(
5146 2, kPushedData, strlen(kPushedData), true)); 5142 2, kPushedData, strlen(kPushedData), true));
5147 MockRead reads[] = { 5143 MockRead reads[] = {
5148 CreateMockRead(reply, 1), 5144 CreateMockRead(reply, 1),
5149 CreateMockRead(push, 2), 5145 CreateMockRead(push, 2),
5150 CreateMockRead(body, 4), 5146 CreateMockRead(body, 4),
(...skipping 23 matching lines...) Expand all
5174 // Will be destroyed by the RST before stream 3 starts. 5170 // Will be destroyed by the RST before stream 3 starts.
5175 spdy_util_.UpdateWithStreamDestruction(1); 5171 spdy_util_.UpdateWithStreamDestruction(1);
5176 SpdySerializedFrame req2( 5172 SpdySerializedFrame req2(
5177 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 5173 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
5178 MockWrite writes[] = { 5174 MockWrite writes[] = {
5179 CreateMockWrite(req, 0), CreateMockWrite(req2, 2), 5175 CreateMockWrite(req, 0), CreateMockWrite(req2, 2),
5180 }; 5176 };
5181 5177
5182 SpdySerializedFrame refused( 5178 SpdySerializedFrame refused(
5183 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); 5179 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM));
5184 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 5180 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
5185 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(3, true)); 5181 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(3, true));
5186 MockRead reads[] = { 5182 MockRead reads[] = {
5187 CreateMockRead(refused, 1), CreateMockRead(resp, 3), 5183 CreateMockRead(refused, 1), CreateMockRead(resp, 3),
5188 CreateMockRead(body, 4), MockRead(ASYNC, 0, 5) // EOF 5184 CreateMockRead(body, 4), MockRead(ASYNC, 0, 5) // EOF
5189 }; 5185 };
5190 5186
5191 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 5187 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5192 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5188 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5193 BoundNetLog(), NULL); 5189 BoundNetLog(), NULL);
5194 5190
5195 helper.RunPreTestSetup(); 5191 helper.RunPreTestSetup();
5196 helper.AddData(&data); 5192 helper.AddData(&data);
5197 5193
5198 HttpNetworkTransaction* trans = helper.trans(); 5194 HttpNetworkTransaction* trans = helper.trans();
5199 5195
5200 // Start the transaction with basic parameters. 5196 // Start the transaction with basic parameters.
5201 TestCompletionCallback callback; 5197 TestCompletionCallback callback;
5202 int rv = trans->Start( 5198 int rv = trans->Start(
5203 &CreateGetRequest(), callback.callback(), BoundNetLog()); 5199 &CreateGetRequest(), callback.callback(), BoundNetLog());
5204 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 5200 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
5205 rv = callback.WaitForResult(); 5201 rv = callback.WaitForResult();
5206 EXPECT_THAT(rv, IsOk()); 5202 EXPECT_THAT(rv, IsOk());
5207 5203
5208 // Verify that we consumed all test data. 5204 // Verify that we consumed all test data.
5209 EXPECT_TRUE(data.AllReadDataConsumed()); 5205 EXPECT_TRUE(data.AllReadDataConsumed());
5210 EXPECT_TRUE(data.AllWriteDataConsumed()); 5206 EXPECT_TRUE(data.AllWriteDataConsumed());
5211 5207
5212 // Verify the SYN_REPLY. 5208 // Verify the response headers.
5213 HttpResponseInfo response = *trans->GetResponseInfo(); 5209 HttpResponseInfo response = *trans->GetResponseInfo();
5214 EXPECT_TRUE(response.headers); 5210 EXPECT_TRUE(response.headers);
5215 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 5211 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
5216 } 5212 }
5217 5213
5218 TEST_F(SpdyNetworkTransactionTest, OutOfOrderSynStream) { 5214 TEST_F(SpdyNetworkTransactionTest, OutOfOrderHeaders) {
5219 // This first request will start to establish the SpdySession. 5215 // This first request will start to establish the SpdySession.
5220 // Then we will start the second (MEDIUM priority) and then third 5216 // Then we will start the second (MEDIUM priority) and then third
5221 // (HIGHEST priority) request in such a way that the third will actually 5217 // (HIGHEST priority) request in such a way that the third will actually
5222 // start before the second, causing the second to be numbered differently 5218 // start before the second, causing the second to be numbered differently
5223 // than the order they were created. 5219 // than the order they were created.
5224 // 5220 //
5225 // Note that the requests and responses created below are expectations 5221 // Note that the requests and responses created below are expectations
5226 // of what the above will produce on the wire, and hence are in the 5222 // of what the above will produce on the wire, and hence are in the
5227 // initial->HIGHEST->LOWEST priority. 5223 // initial->HIGHEST->LOWEST priority.
5228 // 5224 //
5229 // Frames are created by SpdySession just before the write associated 5225 // Frames are created by SpdySession just before the write associated
5230 // with the frame is attempted, so stream dependencies will be based 5226 // with the frame is attempted, so stream dependencies will be based
5231 // on the streams alive at the point of the request write attempt. Thus 5227 // on the streams alive at the point of the request write attempt. Thus
5232 // req1 is alive when req2 is attempted (during but not after the 5228 // req1 is alive when req2 is attempted (during but not after the
5233 // |data.RunFor(2);| statement below) but not when req3 is attempted. 5229 // |data.RunFor(2);| statement below) but not when req3 is attempted.
5234 // The call to spdy_util_.UpdateWithStreamDestruction() reflects this. 5230 // The call to spdy_util_.UpdateWithStreamDestruction() reflects this.
5235 SpdySerializedFrame req1( 5231 SpdySerializedFrame req1(
5236 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 5232 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
5237 SpdySerializedFrame req2( 5233 SpdySerializedFrame req2(
5238 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, HIGHEST, true)); 5234 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, HIGHEST, true));
5239 spdy_util_.UpdateWithStreamDestruction(1); 5235 spdy_util_.UpdateWithStreamDestruction(1);
5240 SpdySerializedFrame req3( 5236 SpdySerializedFrame req3(
5241 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, MEDIUM, true)); 5237 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, MEDIUM, true));
5242 MockWrite writes[] = { 5238 MockWrite writes[] = {
5243 MockWrite(ASYNC, ERR_IO_PENDING, 0), CreateMockWrite(req1, 1), 5239 MockWrite(ASYNC, ERR_IO_PENDING, 0), CreateMockWrite(req1, 1),
5244 CreateMockWrite(req2, 5), CreateMockWrite(req3, 6), 5240 CreateMockWrite(req2, 5), CreateMockWrite(req3, 6),
5245 }; 5241 };
5246 5242
5247 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5243 SpdySerializedFrame resp1(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
5248 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true)); 5244 SpdySerializedFrame body1(spdy_util_.ConstructSpdyDataFrame(1, true));
5249 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 5245 SpdySerializedFrame resp2(spdy_util_.ConstructSpdyGetReply(NULL, 0, 3));
5250 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, true)); 5246 SpdySerializedFrame body2(spdy_util_.ConstructSpdyDataFrame(3, true));
5251 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); 5247 SpdySerializedFrame resp3(spdy_util_.ConstructSpdyGetReply(NULL, 0, 5));
5252 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, true)); 5248 SpdySerializedFrame body3(spdy_util_.ConstructSpdyDataFrame(5, true));
5253 MockRead reads[] = { 5249 MockRead reads[] = {
5254 CreateMockRead(resp1, 2), MockRead(ASYNC, ERR_IO_PENDING, 3), 5250 CreateMockRead(resp1, 2), MockRead(ASYNC, ERR_IO_PENDING, 3),
5255 CreateMockRead(body1, 4), CreateMockRead(resp2, 7), 5251 CreateMockRead(body1, 4), CreateMockRead(resp2, 7),
5256 CreateMockRead(body2, 8), CreateMockRead(resp3, 9), 5252 CreateMockRead(body2, 8), CreateMockRead(resp3, 9),
5257 CreateMockRead(body3, 10), MockRead(ASYNC, 0, 11) // EOF 5253 CreateMockRead(body3, 10), MockRead(ASYNC, 0, 11) // EOF
5258 }; 5254 };
5259 5255
5260 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 5256 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5261 NormalSpdyTransactionHelper helper(CreateGetRequest(), LOWEST, BoundNetLog(), 5257 NormalSpdyTransactionHelper helper(CreateGetRequest(), LOWEST, BoundNetLog(),
(...skipping 23 matching lines...) Expand all
5285 base::RunLoop().RunUntilIdle(); 5281 base::RunLoop().RunUntilIdle();
5286 5282
5287 HttpRequestInfo info3 = CreateGetRequest(); 5283 HttpRequestInfo info3 = CreateGetRequest();
5288 TestCompletionCallback callback3; 5284 TestCompletionCallback callback3;
5289 std::unique_ptr<HttpNetworkTransaction> trans3( 5285 std::unique_ptr<HttpNetworkTransaction> trans3(
5290 new HttpNetworkTransaction(HIGHEST, helper.session())); 5286 new HttpNetworkTransaction(HIGHEST, helper.session()));
5291 rv = trans3->Start(&info3, callback3.callback(), BoundNetLog()); 5287 rv = trans3->Start(&info3, callback3.callback(), BoundNetLog());
5292 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 5288 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
5293 base::RunLoop().RunUntilIdle(); 5289 base::RunLoop().RunUntilIdle();
5294 5290
5295 // We now have two SYN_STREAM frames queued up which will be 5291 // We now have two HEADERS frames queued up which will be
5296 // dequeued only once the first write completes, which we 5292 // dequeued only once the first write completes, which we
5297 // now allow to happen. 5293 // now allow to happen.
5298 ASSERT_TRUE(data.IsPaused()); 5294 ASSERT_TRUE(data.IsPaused());
5299 data.Resume(); 5295 data.Resume();
5300 EXPECT_THAT(callback.WaitForResult(), IsOk()); 5296 EXPECT_THAT(callback.WaitForResult(), IsOk());
5301 5297
5302 // And now we can allow everything else to run to completion. 5298 // And now we can allow everything else to run to completion.
5303 data.Resume(); 5299 data.Resume();
5304 base::RunLoop().RunUntilIdle(); 5300 base::RunLoop().RunUntilIdle();
5305 EXPECT_THAT(callback2.WaitForResult(), IsOk()); 5301 EXPECT_THAT(callback2.WaitForResult(), IsOk());
5306 EXPECT_THAT(callback3.WaitForResult(), IsOk()); 5302 EXPECT_THAT(callback3.WaitForResult(), IsOk());
5307 5303
5308 helper.VerifyDataConsumed(); 5304 helper.VerifyDataConsumed();
5309 } 5305 }
5310 5306
5311 // The tests below are only for SPDY/3 and above.
5312
5313 // Test that sent data frames and received WINDOW_UPDATE frames change 5307 // Test that sent data frames and received WINDOW_UPDATE frames change
5314 // the send_window_size_ correctly. 5308 // the send_window_size_ correctly.
5315 5309
5316 // WINDOW_UPDATE is different than most other frames in that it can arrive 5310 // WINDOW_UPDATE is different than most other frames in that it can arrive
5317 // while the client is still sending the request body. In order to enforce 5311 // while the client is still sending the request body. In order to enforce
5318 // this scenario, we feed a couple of dummy frames and give a delay of 0 to 5312 // this scenario, we feed a couple of dummy frames and give a delay of 0 to
5319 // socket data provider, so that initial read that is done as soon as the 5313 // socket data provider, so that initial read that is done as soon as the
5320 // stream is created, succeeds and schedules another read. This way reads 5314 // stream is created, succeeds and schedules another read. This way reads
5321 // and writes are interleaved; after doing a full frame write, SpdyStream 5315 // and writes are interleaved; after doing a full frame write, SpdyStream
5322 // will break out of DoLoop and will read and process a WINDOW_UPDATE. 5316 // will break out of DoLoop and will read and process a WINDOW_UPDATE.
5323 // Once our WINDOW_UPDATE is read, we cannot send SYN_REPLY right away 5317 // Once our WINDOW_UPDATE is read, we cannot send HEADERS right away
5324 // since request has not been completely written, therefore we feed 5318 // since request has not been completely written, therefore we feed
5325 // enough number of WINDOW_UPDATEs to finish the first read and cause a 5319 // enough number of WINDOW_UPDATEs to finish the first read and cause a
5326 // write, leading to a complete write of request body; after that we send 5320 // write, leading to a complete write of request body; after that we send
5327 // a reply with a body, to cause a graceful shutdown. 5321 // a reply with a body, to cause a graceful shutdown.
5328 5322
5329 // TODO(agayev): develop a socket data provider where both, reads and 5323 // TODO(agayev): develop a socket data provider where both, reads and
5330 // writes are ordered so that writing tests like these are easy and rewrite 5324 // writes are ordered so that writing tests like these are easy and rewrite
5331 // all these tests using it. Right now we are working around the 5325 // all these tests using it. Right now we are working around the
5332 // limitations as described above and it's not deterministic, tests may 5326 // limitations as described above and it's not deterministic, tests may
5333 // fail under specific circumstances. 5327 // fail under specific circumstances.
(...skipping 12 matching lines...) Expand all
5346 CreateMockWrite(req, 0), CreateMockWrite(body, 1), 5340 CreateMockWrite(req, 0), CreateMockWrite(body, 1),
5347 CreateMockWrite(body_end, 2), 5341 CreateMockWrite(body_end, 2),
5348 }; 5342 };
5349 5343
5350 static const int32_t kDeltaWindowSize = 0xff; 5344 static const int32_t kDeltaWindowSize = 0xff;
5351 static const int kDeltaCount = 4; 5345 static const int kDeltaCount = 4;
5352 SpdySerializedFrame window_update( 5346 SpdySerializedFrame window_update(
5353 spdy_util_.ConstructSpdyWindowUpdate(1, kDeltaWindowSize)); 5347 spdy_util_.ConstructSpdyWindowUpdate(1, kDeltaWindowSize));
5354 SpdySerializedFrame window_update_dummy( 5348 SpdySerializedFrame window_update_dummy(
5355 spdy_util_.ConstructSpdyWindowUpdate(2, kDeltaWindowSize)); 5349 spdy_util_.ConstructSpdyWindowUpdate(2, kDeltaWindowSize));
5356 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 5350 SpdySerializedFrame resp(spdy_util_.ConstructSpdyPostReply(NULL, 0));
5357 MockRead reads[] = { 5351 MockRead reads[] = {
5358 CreateMockRead(window_update_dummy, 3), 5352 CreateMockRead(window_update_dummy, 3),
5359 CreateMockRead(window_update_dummy, 4), 5353 CreateMockRead(window_update_dummy, 4),
5360 CreateMockRead(window_update_dummy, 5), 5354 CreateMockRead(window_update_dummy, 5),
5361 CreateMockRead(window_update, 6), // Four updates, therefore window 5355 CreateMockRead(window_update, 6), // Four updates, therefore window
5362 CreateMockRead(window_update, 7), // size should increase by 5356 CreateMockRead(window_update, 7), // size should increase by
5363 CreateMockRead(window_update, 8), // kDeltaWindowSize * 4 5357 CreateMockRead(window_update, 8), // kDeltaWindowSize * 4
5364 CreateMockRead(window_update, 9), 5358 CreateMockRead(window_update, 9),
5365 CreateMockRead(resp, 10), 5359 CreateMockRead(resp, 10),
5366 MockRead(ASYNC, ERR_IO_PENDING, 11), 5360 MockRead(ASYNC, ERR_IO_PENDING, 11),
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
5464 spdy_util_.ConstructSpdyWindowUpdate(1, stream_window_update_delta)); 5458 spdy_util_.ConstructSpdyWindowUpdate(1, stream_window_update_delta));
5465 5459
5466 std::vector<MockWrite> writes; 5460 std::vector<MockWrite> writes;
5467 writes.push_back(MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix, 5461 writes.push_back(MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix,
5468 kHttp2ConnectionHeaderPrefixSize, 0)); 5462 kHttp2ConnectionHeaderPrefixSize, 0));
5469 writes.push_back(CreateMockWrite(initial_settings_frame, writes.size())); 5463 writes.push_back(CreateMockWrite(initial_settings_frame, writes.size()));
5470 writes.push_back(CreateMockWrite(initial_window_update, writes.size())); 5464 writes.push_back(CreateMockWrite(initial_window_update, writes.size()));
5471 writes.push_back(CreateMockWrite(req, writes.size())); 5465 writes.push_back(CreateMockWrite(req, writes.size()));
5472 5466
5473 std::vector<MockRead> reads; 5467 std::vector<MockRead> reads;
5474 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5468 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(NULL, 0, 1));
5475 reads.push_back(CreateMockRead(resp, writes.size() + reads.size())); 5469 reads.push_back(CreateMockRead(resp, writes.size() + reads.size()));
5476 5470
5477 std::vector<SpdySerializedFrame> body_frames; 5471 std::vector<SpdySerializedFrame> body_frames;
5478 const std::string body_data(kChunkSize, 'x'); 5472 const std::string body_data(kChunkSize, 'x');
5479 for (size_t remaining = kTargetSize; remaining != 0;) { 5473 for (size_t remaining = kTargetSize; remaining != 0;) {
5480 size_t frame_size = std::min(remaining, body_data.size()); 5474 size_t frame_size = std::min(remaining, body_data.size());
5481 body_frames.push_back(spdy_util_.ConstructSpdyDataFrame(1, body_data.data(), 5475 body_frames.push_back(spdy_util_.ConstructSpdyDataFrame(1, body_data.data(),
5482 frame_size, false)); 5476 frame_size, false));
5483 reads.push_back( 5477 reads.push_back(
5484 CreateMockRead(body_frames.back(), writes.size() + reads.size())); 5478 CreateMockRead(body_frames.back(), writes.size() + reads.size()));
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
5698 1, kUploadDataSize + last_body.size())); 5692 1, kUploadDataSize + last_body.size()));
5699 5693
5700 reads.push_back(CreateMockRead(session_window_update, i++)); 5694 reads.push_back(CreateMockRead(session_window_update, i++));
5701 reads.push_back(CreateMockRead(window_update, i++)); 5695 reads.push_back(CreateMockRead(window_update, i++));
5702 5696
5703 // Stalled frames which can be sent after receiving window updates. 5697 // Stalled frames which can be sent after receiving window updates.
5704 if (last_body.size() > 0) 5698 if (last_body.size() > 0)
5705 writes.push_back(CreateMockWrite(body4, i++)); 5699 writes.push_back(CreateMockWrite(body4, i++));
5706 writes.push_back(CreateMockWrite(body5, i++)); 5700 writes.push_back(CreateMockWrite(body5, i++));
5707 5701
5708 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 5702 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(NULL, 0));
5709 reads.push_back(CreateMockRead(reply, i++)); 5703 reads.push_back(CreateMockRead(reply, i++));
5710 reads.push_back(CreateMockRead(body2, i++)); 5704 reads.push_back(CreateMockRead(body2, i++));
5711 reads.push_back(CreateMockRead(body5, i++)); 5705 reads.push_back(CreateMockRead(body5, i++));
5712 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF 5706 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF
5713 5707
5714 SequencedSocketData data(reads.data(), reads.size(), writes.data(), 5708 SequencedSocketData data(reads.data(), reads.size(), writes.data(),
5715 writes.size()); 5709 writes.size());
5716 5710
5717 std::vector<std::unique_ptr<UploadElementReader>> element_readers; 5711 std::vector<std::unique_ptr<UploadElementReader>> element_readers;
5718 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a'); 5712 std::string upload_data_string(kBufferSize * num_upload_buffers, 'a');
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
5851 reads.push_back(CreateMockRead(session_window_update, i++)); 5845 reads.push_back(CreateMockRead(session_window_update, i++));
5852 5846
5853 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 5847 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
5854 writes.push_back(CreateMockWrite(settings_ack, i++)); 5848 writes.push_back(CreateMockWrite(settings_ack, i++));
5855 5849
5856 // Stalled frames which can be sent after |settings_ack|. 5850 // Stalled frames which can be sent after |settings_ack|.
5857 if (last_body.size() > 0) 5851 if (last_body.size() > 0)
5858 writes.push_back(CreateMockWrite(body4, i++)); 5852 writes.push_back(CreateMockWrite(body4, i++));
5859 writes.push_back(CreateMockWrite(body5, i++)); 5853 writes.push_back(CreateMockWrite(body5, i++));
5860 5854
5861 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 5855 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(NULL, 0));
5862 reads.push_back(CreateMockRead(reply, i++)); 5856 reads.push_back(CreateMockRead(reply, i++));
5863 reads.push_back(CreateMockRead(body2, i++)); 5857 reads.push_back(CreateMockRead(body2, i++));
5864 reads.push_back(CreateMockRead(body5, i++)); 5858 reads.push_back(CreateMockRead(body5, i++));
5865 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF 5859 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF
5866 5860
5867 // Force all writes to happen before any read, last write will not 5861 // Force all writes to happen before any read, last write will not
5868 // actually queue a frame, due to window size being 0. 5862 // actually queue a frame, due to window size being 0.
5869 SequencedSocketData data(reads.data(), reads.size(), writes.data(), 5863 SequencedSocketData data(reads.data(), reads.size(), writes.data(),
5870 writes.size()); 5864 writes.size());
5871 5865
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
6015 reads.push_back(CreateMockRead(window_update_init_size, i++)); 6009 reads.push_back(CreateMockRead(window_update_init_size, i++));
6016 6010
6017 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck()); 6011 SpdySerializedFrame settings_ack(spdy_util_.ConstructSpdySettingsAck());
6018 writes.push_back(CreateMockWrite(settings_ack, i++)); 6012 writes.push_back(CreateMockWrite(settings_ack, i++));
6019 6013
6020 // Stalled frames which can be sent after |settings_ack|. 6014 // Stalled frames which can be sent after |settings_ack|.
6021 if (last_body.size() > 0) 6015 if (last_body.size() > 0)
6022 writes.push_back(CreateMockWrite(body4, i++)); 6016 writes.push_back(CreateMockWrite(body4, i++));
6023 writes.push_back(CreateMockWrite(body5, i++)); 6017 writes.push_back(CreateMockWrite(body5, i++));
6024 6018
6025 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 6019 SpdySerializedFrame reply(spdy_util_.ConstructSpdyPostReply(NULL, 0));
6026 reads.push_back(CreateMockRead(reply, i++)); 6020 reads.push_back(CreateMockRead(reply, i++));
6027 reads.push_back(CreateMockRead(body2, i++)); 6021 reads.push_back(CreateMockRead(body2, i++));
6028 reads.push_back(CreateMockRead(body5, i++)); 6022 reads.push_back(CreateMockRead(body5, i++));
6029 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF 6023 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF
6030 6024
6031 // Force all writes to happen before any read, last write will not 6025 // Force all writes to happen before any read, last write will not
6032 // actually queue a frame, due to window size being 0. 6026 // actually queue a frame, due to window size being 0.
6033 SequencedSocketData data(reads.data(), reads.size(), writes.data(), 6027 SequencedSocketData data(reads.data(), reads.size(), writes.data(),
6034 writes.size()); 6028 writes.size());
6035 6029
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
6142 const std::string kValue(1 << 15, 'z'); 6136 const std::string kValue(1 << 15, 'z');
6143 6137
6144 HttpRequestInfo request; 6138 HttpRequestInfo request;
6145 request.method = "GET"; 6139 request.method = "GET";
6146 request.url = default_url_; 6140 request.url = default_url_;
6147 request.extra_headers.SetHeader(kKey, kValue); 6141 request.extra_headers.SetHeader(kKey, kValue);
6148 6142
6149 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); 6143 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl));
6150 headers[kKey] = kValue; 6144 headers[kKey] = kValue;
6151 SpdySerializedFrame req( 6145 SpdySerializedFrame req(
6152 spdy_util_.ConstructSpdySyn(1, std::move(headers), LOWEST, true)); 6146 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true));
6153 MockWrite writes[] = { 6147 MockWrite writes[] = {
6154 CreateMockWrite(req, 0), 6148 CreateMockWrite(req, 0),
6155 }; 6149 };
6156 6150
6157 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 6151 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
6158 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 6152 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
6159 MockRead reads[] = { 6153 MockRead reads[] = {
6160 CreateMockRead(resp, 1), CreateMockRead(body, 2), 6154 CreateMockRead(resp, 1), CreateMockRead(body, 2),
6161 MockRead(ASYNC, 0, 3) // EOF 6155 MockRead(ASYNC, 0, 3) // EOF
6162 }; 6156 };
6163 6157
6164 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 6158 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6165 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 6159 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
6166 nullptr); 6160 nullptr);
6167 helper.RunToCompletion(&data); 6161 helper.RunToCompletion(&data);
6168 TransactionHelperResult out = helper.output(); 6162 TransactionHelperResult out = helper.output();
6169 6163
6170 EXPECT_THAT(out.rv, IsOk()); 6164 EXPECT_THAT(out.rv, IsOk());
6171 EXPECT_EQ("HTTP/1.1 200", out.status_line); 6165 EXPECT_EQ("HTTP/1.1 200", out.status_line);
6172 EXPECT_EQ("hello!", out.response_data); 6166 EXPECT_EQ("hello!", out.response_data);
6173 } 6167 }
6174 6168
6175 // Regression test for https://crbug.com/535629: response header exceeds 16 kB. 6169 // Regression test for https://crbug.com/535629: response header exceeds 16 kB.
6176 TEST_F(SpdyNetworkTransactionTest, LargeResponseHeader) { 6170 TEST_F(SpdyNetworkTransactionTest, LargeResponseHeader) {
6177 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl)); 6171 SpdyHeaderBlock headers(spdy_util_.ConstructGetHeaderBlock(kDefaultUrl));
6178 SpdySerializedFrame req( 6172 SpdySerializedFrame req(
6179 spdy_util_.ConstructSpdySyn(1, std::move(headers), LOWEST, true)); 6173 spdy_util_.ConstructSpdyHeaders(1, std::move(headers), LOWEST, true));
6180 MockWrite writes[] = { 6174 MockWrite writes[] = {
6181 CreateMockWrite(req, 0), 6175 CreateMockWrite(req, 0),
6182 }; 6176 };
6183 6177
6184 // HPACK decoder implementation limits string literal length to 16 kB. 6178 // HPACK decoder implementation limits string literal length to 16 kB.
6185 const char* response_headers[2]; 6179 const char* response_headers[2];
6186 const std::string kKey(16 * 1024, 'a'); 6180 const std::string kKey(16 * 1024, 'a');
6187 response_headers[0] = kKey.data(); 6181 response_headers[0] = kKey.data();
6188 const std::string kValue(16 * 1024, 'b'); 6182 const std::string kValue(16 * 1024, 'b');
6189 response_headers[1] = kValue.data(); 6183 response_headers[1] = kValue.data();
6190 6184
6191 SpdySerializedFrame resp( 6185 SpdySerializedFrame resp(
6192 spdy_util_.ConstructSpdyGetSynReply(response_headers, 1, 1)); 6186 spdy_util_.ConstructSpdyGetReply(response_headers, 1, 1));
6193 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true)); 6187 SpdySerializedFrame body(spdy_util_.ConstructSpdyDataFrame(1, true));
6194 MockRead reads[] = { 6188 MockRead reads[] = {
6195 CreateMockRead(resp, 1), CreateMockRead(body, 2), 6189 CreateMockRead(resp, 1), CreateMockRead(body, 2),
6196 MockRead(ASYNC, 0, 3) // EOF 6190 MockRead(ASYNC, 0, 3) // EOF
6197 }; 6191 };
6198 6192
6199 HttpRequestInfo request; 6193 HttpRequestInfo request;
6200 request.method = "GET"; 6194 request.method = "GET";
6201 request.url = default_url_; 6195 request.url = default_url_;
6202 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 6196 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
6245 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { 6239 TEST_F(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) {
6246 std::unique_ptr<SSLSocketDataProvider> ssl_provider( 6240 std::unique_ptr<SSLSocketDataProvider> ssl_provider(
6247 new SSLSocketDataProvider(ASYNC, OK)); 6241 new SSLSocketDataProvider(ASYNC, OK));
6248 // Set to TLS_RSA_WITH_NULL_MD5 6242 // Set to TLS_RSA_WITH_NULL_MD5
6249 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); 6243 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status);
6250 6244
6251 RunTLSUsageCheckTest(std::move(ssl_provider)); 6245 RunTLSUsageCheckTest(std::move(ssl_provider));
6252 } 6246 }
6253 6247
6254 } // namespace net 6248 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_http_stream_unittest.cc ('k') | net/spdy/spdy_proxy_client_socket.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698