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

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

Issue 1852423004: Implement SpdySerializedFrame move semantics. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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_protocol.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 <string> 5 #include <string>
6 #include <utility> 6 #include <utility>
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 scoped_ptr<SpdySessionDependencies> session_deps( 705 scoped_ptr<SpdySessionDependencies> session_deps(
706 CreateSpdySessionDependencies(GetParam())); 706 CreateSpdySessionDependencies(GetParam()));
707 scoped_ptr<HttpNetworkSession> session( 707 scoped_ptr<HttpNetworkSession> session(
708 SpdySessionDependencies::SpdyCreateSession(session_deps.get())); 708 SpdySessionDependencies::SpdyCreateSession(session_deps.get()));
709 scoped_ptr<HttpTransaction> trans( 709 scoped_ptr<HttpTransaction> trans(
710 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get())); 710 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
711 } 711 }
712 712
713 TEST_P(SpdyNetworkTransactionTest, Get) { 713 TEST_P(SpdyNetworkTransactionTest, Get) {
714 // Construct the request. 714 // Construct the request.
715 scoped_ptr<SpdyFrame> req( 715 scoped_ptr<SpdySerializedFrame> req(
716 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 716 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
717 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 717 MockWrite writes[] = {CreateMockWrite(*req, 0)};
718 718
719 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 719 scoped_ptr<SpdySerializedFrame> resp(
720 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 720 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
721 scoped_ptr<SpdySerializedFrame> body(
722 spdy_util_.ConstructSpdyBodyFrame(1, true));
721 MockRead reads[] = { 723 MockRead reads[] = {
722 CreateMockRead(*resp, 1), 724 CreateMockRead(*resp, 1),
723 CreateMockRead(*body, 2), 725 CreateMockRead(*body, 2),
724 MockRead(ASYNC, 0, 3) // EOF 726 MockRead(ASYNC, 0, 3) // EOF
725 }; 727 };
726 728
727 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 729 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
728 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 730 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
729 BoundNetLog(), GetParam(), NULL); 731 BoundNetLog(), GetParam(), NULL);
730 helper.RunToCompletion(&data); 732 helper.RunToCompletion(&data);
731 TransactionHelperResult out = helper.output(); 733 TransactionHelperResult out = helper.output();
732 EXPECT_EQ(OK, out.rv); 734 EXPECT_EQ(OK, out.rv);
733 EXPECT_EQ("HTTP/1.1 200", out.status_line); 735 EXPECT_EQ("HTTP/1.1 200", out.status_line);
734 EXPECT_EQ("hello!", out.response_data); 736 EXPECT_EQ("hello!", out.response_data);
735 } 737 }
736 738
737 TEST_P(SpdyNetworkTransactionTest, GetAtEachPriority) { 739 TEST_P(SpdyNetworkTransactionTest, GetAtEachPriority) {
738 for (RequestPriority p = MINIMUM_PRIORITY; p <= MAXIMUM_PRIORITY; 740 for (RequestPriority p = MINIMUM_PRIORITY; p <= MAXIMUM_PRIORITY;
739 p = RequestPriority(p + 1)) { 741 p = RequestPriority(p + 1)) {
740 SpdyTestUtil spdy_test_util(GetParam().protocol, 742 SpdyTestUtil spdy_test_util(GetParam().protocol,
741 GetParam().priority_to_dependency); 743 GetParam().priority_to_dependency);
742 spdy_test_util.set_default_url(GURL(GetDefaultUrl())); 744 spdy_test_util.set_default_url(GURL(GetDefaultUrl()));
743 745
744 // Construct the request. 746 // Construct the request.
745 scoped_ptr<SpdyFrame> req( 747 scoped_ptr<SpdySerializedFrame> req(
746 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, p, true)); 748 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, p, true));
747 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 749 MockWrite writes[] = {CreateMockWrite(*req, 0)};
748 750
749 SpdyPriority spdy_prio = 0; 751 SpdyPriority spdy_prio = 0;
750 EXPECT_TRUE( 752 EXPECT_TRUE(
751 GetSpdyPriority(spdy_test_util.spdy_version(), *req, &spdy_prio)); 753 GetSpdyPriority(spdy_test_util.spdy_version(), *req, &spdy_prio));
752 // this repeats the RequestPriority-->SpdyPriority mapping from 754 // this repeats the RequestPriority-->SpdyPriority mapping from
753 // SpdyFramer::ConvertRequestPriorityToSpdyPriority to make 755 // SpdyFramer::ConvertRequestPriorityToSpdyPriority to make
754 // sure it's being done right. 756 // sure it's being done right.
755 switch (p) { 757 switch (p) {
756 case HIGHEST: 758 case HIGHEST:
757 EXPECT_EQ(0, spdy_prio); 759 EXPECT_EQ(0, spdy_prio);
758 break; 760 break;
759 case MEDIUM: 761 case MEDIUM:
760 EXPECT_EQ(1, spdy_prio); 762 EXPECT_EQ(1, spdy_prio);
761 break; 763 break;
762 case LOW: 764 case LOW:
763 EXPECT_EQ(2, spdy_prio); 765 EXPECT_EQ(2, spdy_prio);
764 break; 766 break;
765 case LOWEST: 767 case LOWEST:
766 EXPECT_EQ(3, spdy_prio); 768 EXPECT_EQ(3, spdy_prio);
767 break; 769 break;
768 case IDLE: 770 case IDLE:
769 EXPECT_EQ(4, spdy_prio); 771 EXPECT_EQ(4, spdy_prio);
770 break; 772 break;
771 default: 773 default:
772 FAIL(); 774 FAIL();
773 } 775 }
774 776
775 scoped_ptr<SpdyFrame> resp( 777 scoped_ptr<SpdySerializedFrame> resp(
776 spdy_test_util.ConstructSpdyGetSynReply(nullptr, 0, 1)); 778 spdy_test_util.ConstructSpdyGetSynReply(nullptr, 0, 1));
777 scoped_ptr<SpdyFrame> body(spdy_test_util.ConstructSpdyBodyFrame(1, true)); 779 scoped_ptr<SpdySerializedFrame> body(
780 spdy_test_util.ConstructSpdyBodyFrame(1, true));
778 MockRead reads[] = { 781 MockRead reads[] = {
779 CreateMockRead(*resp, 1), 782 CreateMockRead(*resp, 1),
780 CreateMockRead(*body, 2), 783 CreateMockRead(*body, 2),
781 MockRead(ASYNC, 0, 3) // EOF 784 MockRead(ASYNC, 0, 3) // EOF
782 }; 785 };
783 786
784 SequencedSocketData data(reads, arraysize(reads), writes, 787 SequencedSocketData data(reads, arraysize(reads), writes,
785 arraysize(writes)); 788 arraysize(writes));
786 HttpRequestInfo http_req = CreateGetRequest(); 789 HttpRequestInfo http_req = CreateGetRequest();
787 790
(...skipping 11 matching lines...) Expand all
799 // streams work properly. 802 // streams work properly.
800 803
801 // This can't use the TransactionHelper method, since it only 804 // This can't use the TransactionHelper method, since it only
802 // handles a single transaction, and finishes them as soon 805 // handles a single transaction, and finishes them as soon
803 // as it launches them. 806 // as it launches them.
804 807
805 // TODO(gavinp): create a working generalized TransactionHelper that 808 // TODO(gavinp): create a working generalized TransactionHelper that
806 // can allow multiple streams in flight. 809 // can allow multiple streams in flight.
807 810
808 TEST_P(SpdyNetworkTransactionTest, ThreeGets) { 811 TEST_P(SpdyNetworkTransactionTest, ThreeGets) {
809 scoped_ptr<SpdyFrame> req( 812 scoped_ptr<SpdySerializedFrame> req(
810 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 813 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
811 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 814 scoped_ptr<SpdySerializedFrame> resp(
812 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 815 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
813 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 816 scoped_ptr<SpdySerializedFrame> body(
817 spdy_util_.ConstructSpdyBodyFrame(1, false));
818 scoped_ptr<SpdySerializedFrame> fbody(
819 spdy_util_.ConstructSpdyBodyFrame(1, true));
814 820
815 scoped_ptr<SpdyFrame> req2( 821 scoped_ptr<SpdySerializedFrame> req2(
816 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 822 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
817 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 823 scoped_ptr<SpdySerializedFrame> resp2(
818 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 824 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
819 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 825 scoped_ptr<SpdySerializedFrame> body2(
826 spdy_util_.ConstructSpdyBodyFrame(3, false));
827 scoped_ptr<SpdySerializedFrame> fbody2(
828 spdy_util_.ConstructSpdyBodyFrame(3, true));
820 829
821 scoped_ptr<SpdyFrame> req3( 830 scoped_ptr<SpdySerializedFrame> req3(
822 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); 831 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true));
823 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); 832 scoped_ptr<SpdySerializedFrame> resp3(
824 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(5, false)); 833 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5));
825 scoped_ptr<SpdyFrame> fbody3(spdy_util_.ConstructSpdyBodyFrame(5, true)); 834 scoped_ptr<SpdySerializedFrame> body3(
835 spdy_util_.ConstructSpdyBodyFrame(5, false));
836 scoped_ptr<SpdySerializedFrame> fbody3(
837 spdy_util_.ConstructSpdyBodyFrame(5, true));
826 838
827 MockWrite writes[] = { 839 MockWrite writes[] = {
828 CreateMockWrite(*req, 0), 840 CreateMockWrite(*req, 0),
829 CreateMockWrite(*req2, 3), 841 CreateMockWrite(*req2, 3),
830 CreateMockWrite(*req3, 6), 842 CreateMockWrite(*req3, 6),
831 }; 843 };
832 MockRead reads[] = { 844 MockRead reads[] = {
833 CreateMockRead(*resp, 1), 845 CreateMockRead(*resp, 1),
834 CreateMockRead(*body, 2), 846 CreateMockRead(*body, 2),
835 CreateMockRead(*resp2, 4), 847 CreateMockRead(*resp2, 4),
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
896 out.rv = ReadTransaction(trans1.get(), &out.response_data); 908 out.rv = ReadTransaction(trans1.get(), &out.response_data);
897 helper.VerifyDataConsumed(); 909 helper.VerifyDataConsumed();
898 EXPECT_EQ(OK, out.rv); 910 EXPECT_EQ(OK, out.rv);
899 911
900 EXPECT_EQ(OK, out.rv); 912 EXPECT_EQ(OK, out.rv);
901 EXPECT_EQ("HTTP/1.1 200", out.status_line); 913 EXPECT_EQ("HTTP/1.1 200", out.status_line);
902 EXPECT_EQ("hello!hello!", out.response_data); 914 EXPECT_EQ("hello!hello!", out.response_data);
903 } 915 }
904 916
905 TEST_P(SpdyNetworkTransactionTest, TwoGetsLateBinding) { 917 TEST_P(SpdyNetworkTransactionTest, TwoGetsLateBinding) {
906 scoped_ptr<SpdyFrame> req( 918 scoped_ptr<SpdySerializedFrame> req(
907 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 919 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
908 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 920 scoped_ptr<SpdySerializedFrame> resp(
909 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 921 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
910 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 922 scoped_ptr<SpdySerializedFrame> body(
923 spdy_util_.ConstructSpdyBodyFrame(1, false));
924 scoped_ptr<SpdySerializedFrame> fbody(
925 spdy_util_.ConstructSpdyBodyFrame(1, true));
911 926
912 scoped_ptr<SpdyFrame> req2( 927 scoped_ptr<SpdySerializedFrame> req2(
913 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 928 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
914 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 929 scoped_ptr<SpdySerializedFrame> resp2(
915 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 930 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
916 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 931 scoped_ptr<SpdySerializedFrame> body2(
932 spdy_util_.ConstructSpdyBodyFrame(3, false));
933 scoped_ptr<SpdySerializedFrame> fbody2(
934 spdy_util_.ConstructSpdyBodyFrame(3, true));
917 935
918 MockWrite writes[] = { 936 MockWrite writes[] = {
919 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 3), 937 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 3),
920 }; 938 };
921 MockRead reads[] = { 939 MockRead reads[] = {
922 CreateMockRead(*resp, 1), 940 CreateMockRead(*resp, 1),
923 CreateMockRead(*body, 2), 941 CreateMockRead(*body, 2),
924 CreateMockRead(*resp2, 4), 942 CreateMockRead(*resp2, 4),
925 CreateMockRead(*body2, 5), 943 CreateMockRead(*body2, 5),
926 CreateMockRead(*fbody, 6), 944 CreateMockRead(*fbody, 6),
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
981 out.response_info = *response2; 999 out.response_info = *response2;
982 out.rv = ReadTransaction(trans2.get(), &out.response_data); 1000 out.rv = ReadTransaction(trans2.get(), &out.response_data);
983 EXPECT_EQ(OK, out.rv); 1001 EXPECT_EQ(OK, out.rv);
984 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1002 EXPECT_EQ("HTTP/1.1 200", out.status_line);
985 EXPECT_EQ("hello!hello!", out.response_data); 1003 EXPECT_EQ("hello!hello!", out.response_data);
986 1004
987 helper.VerifyDataConsumed(); 1005 helper.VerifyDataConsumed();
988 } 1006 }
989 1007
990 TEST_P(SpdyNetworkTransactionTest, TwoGetsLateBindingFromPreconnect) { 1008 TEST_P(SpdyNetworkTransactionTest, TwoGetsLateBindingFromPreconnect) {
991 scoped_ptr<SpdyFrame> req( 1009 scoped_ptr<SpdySerializedFrame> req(
992 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1010 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
993 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1011 scoped_ptr<SpdySerializedFrame> resp(
994 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1012 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
995 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1013 scoped_ptr<SpdySerializedFrame> body(
1014 spdy_util_.ConstructSpdyBodyFrame(1, false));
1015 scoped_ptr<SpdySerializedFrame> fbody(
1016 spdy_util_.ConstructSpdyBodyFrame(1, true));
996 1017
997 scoped_ptr<SpdyFrame> req2( 1018 scoped_ptr<SpdySerializedFrame> req2(
998 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 1019 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
999 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1020 scoped_ptr<SpdySerializedFrame> resp2(
1000 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 1021 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
1001 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 1022 scoped_ptr<SpdySerializedFrame> body2(
1023 spdy_util_.ConstructSpdyBodyFrame(3, false));
1024 scoped_ptr<SpdySerializedFrame> fbody2(
1025 spdy_util_.ConstructSpdyBodyFrame(3, true));
1002 1026
1003 MockWrite writes[] = { 1027 MockWrite writes[] = {
1004 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 3), 1028 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 3),
1005 }; 1029 };
1006 MockRead reads[] = { 1030 MockRead reads[] = {
1007 CreateMockRead(*resp, 1), 1031 CreateMockRead(*resp, 1),
1008 CreateMockRead(*body, 2), 1032 CreateMockRead(*body, 2),
1009 CreateMockRead(*resp2, 4), 1033 CreateMockRead(*resp2, 4),
1010 CreateMockRead(*body2, 5), 1034 CreateMockRead(*body2, 5),
1011 CreateMockRead(*fbody, 6), 1035 CreateMockRead(*fbody, 6),
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1086 } 1110 }
1087 1111
1088 // Similar to ThreeGets above, however this test adds a SETTINGS 1112 // Similar to ThreeGets above, however this test adds a SETTINGS
1089 // frame. The SETTINGS frame is read during the IO loop waiting on 1113 // frame. The SETTINGS frame is read during the IO loop waiting on
1090 // the first transaction completion, and sets a maximum concurrent 1114 // the first transaction completion, and sets a maximum concurrent
1091 // stream limit of 1. This means that our IO loop exists after the 1115 // stream limit of 1. This means that our IO loop exists after the
1092 // second transaction completes, so we can assert on read_index(). 1116 // second transaction completes, so we can assert on read_index().
1093 TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) { 1117 TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrent) {
1094 // Construct the request. 1118 // Construct the request.
1095 // Each request fully completes before the next starts. 1119 // Each request fully completes before the next starts.
1096 scoped_ptr<SpdyFrame> req( 1120 scoped_ptr<SpdySerializedFrame> req(
1097 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1121 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1098 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1122 scoped_ptr<SpdySerializedFrame> resp(
1099 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1123 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1100 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1124 scoped_ptr<SpdySerializedFrame> body(
1125 spdy_util_.ConstructSpdyBodyFrame(1, false));
1126 scoped_ptr<SpdySerializedFrame> fbody(
1127 spdy_util_.ConstructSpdyBodyFrame(1, true));
1101 spdy_util_.UpdateWithStreamDestruction(1); 1128 spdy_util_.UpdateWithStreamDestruction(1);
1102 1129
1103 scoped_ptr<SpdyFrame> req2( 1130 scoped_ptr<SpdySerializedFrame> req2(
1104 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 1131 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
1105 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1132 scoped_ptr<SpdySerializedFrame> resp2(
1106 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 1133 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
1107 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 1134 scoped_ptr<SpdySerializedFrame> body2(
1135 spdy_util_.ConstructSpdyBodyFrame(3, false));
1136 scoped_ptr<SpdySerializedFrame> fbody2(
1137 spdy_util_.ConstructSpdyBodyFrame(3, true));
1108 spdy_util_.UpdateWithStreamDestruction(3); 1138 spdy_util_.UpdateWithStreamDestruction(3);
1109 1139
1110 scoped_ptr<SpdyFrame> req3( 1140 scoped_ptr<SpdySerializedFrame> req3(
1111 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true)); 1141 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, LOWEST, true));
1112 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); 1142 scoped_ptr<SpdySerializedFrame> resp3(
1113 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(5, false)); 1143 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5));
1114 scoped_ptr<SpdyFrame> fbody3(spdy_util_.ConstructSpdyBodyFrame(5, true)); 1144 scoped_ptr<SpdySerializedFrame> body3(
1145 spdy_util_.ConstructSpdyBodyFrame(5, false));
1146 scoped_ptr<SpdySerializedFrame> fbody3(
1147 spdy_util_.ConstructSpdyBodyFrame(5, true));
1115 1148
1116 SettingsMap settings; 1149 SettingsMap settings;
1117 const uint32_t max_concurrent_streams = 1; 1150 const uint32_t max_concurrent_streams = 1;
1118 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1151 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1119 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1152 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1120 scoped_ptr<SpdyFrame> settings_frame( 1153 scoped_ptr<SpdySerializedFrame> settings_frame(
1121 spdy_util_.ConstructSpdySettings(settings)); 1154 spdy_util_.ConstructSpdySettings(settings));
1122 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1155 scoped_ptr<SpdySerializedFrame> settings_ack(
1156 spdy_util_.ConstructSpdySettingsAck());
1123 1157
1124 MockWrite writes[] = { 1158 MockWrite writes[] = {
1125 CreateMockWrite(*req, 0), 1159 CreateMockWrite(*req, 0),
1126 CreateMockWrite(*settings_ack, 5), 1160 CreateMockWrite(*settings_ack, 5),
1127 CreateMockWrite(*req2, 6), 1161 CreateMockWrite(*req2, 6),
1128 CreateMockWrite(*req3, 10), 1162 CreateMockWrite(*req3, 10),
1129 }; 1163 };
1130 1164
1131 MockRead reads[] = { 1165 MockRead reads[] = {
1132 CreateMockRead(*settings_frame, 1), 1166 CreateMockRead(*settings_frame, 1),
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
1216 EXPECT_EQ(OK, out.rv); 1250 EXPECT_EQ(OK, out.rv);
1217 } 1251 }
1218 1252
1219 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds 1253 // Similar to ThreeGetsWithMaxConcurrent above, however this test adds
1220 // a fourth transaction. The third and fourth transactions have 1254 // a fourth transaction. The third and fourth transactions have
1221 // different data ("hello!" vs "hello!hello!") and because of the 1255 // different data ("hello!" vs "hello!hello!") and because of the
1222 // user specified priority, we expect to see them inverted in 1256 // user specified priority, we expect to see them inverted in
1223 // the response from the server. 1257 // the response from the server.
1224 TEST_P(SpdyNetworkTransactionTest, FourGetsWithMaxConcurrentPriority) { 1258 TEST_P(SpdyNetworkTransactionTest, FourGetsWithMaxConcurrentPriority) {
1225 // Construct the request. 1259 // Construct the request.
1226 scoped_ptr<SpdyFrame> req( 1260 scoped_ptr<SpdySerializedFrame> req(
1227 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1261 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1228 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1262 scoped_ptr<SpdySerializedFrame> resp(
1229 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1263 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1230 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1264 scoped_ptr<SpdySerializedFrame> body(
1265 spdy_util_.ConstructSpdyBodyFrame(1, false));
1266 scoped_ptr<SpdySerializedFrame> fbody(
1267 spdy_util_.ConstructSpdyBodyFrame(1, true));
1231 spdy_util_.UpdateWithStreamDestruction(1); 1268 spdy_util_.UpdateWithStreamDestruction(1);
1232 1269
1233 scoped_ptr<SpdyFrame> req2( 1270 scoped_ptr<SpdySerializedFrame> req2(
1234 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 1271 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
1235 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1272 scoped_ptr<SpdySerializedFrame> resp2(
1236 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 1273 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
1237 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 1274 scoped_ptr<SpdySerializedFrame> body2(
1275 spdy_util_.ConstructSpdyBodyFrame(3, false));
1276 scoped_ptr<SpdySerializedFrame> fbody2(
1277 spdy_util_.ConstructSpdyBodyFrame(3, true));
1238 spdy_util_.UpdateWithStreamDestruction(3); 1278 spdy_util_.UpdateWithStreamDestruction(3);
1239 1279
1240 scoped_ptr<SpdyFrame> req4( 1280 scoped_ptr<SpdySerializedFrame> req4(
1241 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, HIGHEST, true)); 1281 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, HIGHEST, true));
1242 scoped_ptr<SpdyFrame> resp4(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); 1282 scoped_ptr<SpdySerializedFrame> resp4(
1243 scoped_ptr<SpdyFrame> fbody4(spdy_util_.ConstructSpdyBodyFrame(5, true)); 1283 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5));
1284 scoped_ptr<SpdySerializedFrame> fbody4(
1285 spdy_util_.ConstructSpdyBodyFrame(5, true));
1244 spdy_util_.UpdateWithStreamDestruction(5); 1286 spdy_util_.UpdateWithStreamDestruction(5);
1245 1287
1246 scoped_ptr<SpdyFrame> req3( 1288 scoped_ptr<SpdySerializedFrame> req3(
1247 spdy_util_.ConstructSpdyGet(nullptr, 0, 7, LOWEST, true)); 1289 spdy_util_.ConstructSpdyGet(nullptr, 0, 7, LOWEST, true));
1248 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 7)); 1290 scoped_ptr<SpdySerializedFrame> resp3(
1249 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(7, false)); 1291 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 7));
1250 scoped_ptr<SpdyFrame> fbody3(spdy_util_.ConstructSpdyBodyFrame(7, true)); 1292 scoped_ptr<SpdySerializedFrame> body3(
1293 spdy_util_.ConstructSpdyBodyFrame(7, false));
1294 scoped_ptr<SpdySerializedFrame> fbody3(
1295 spdy_util_.ConstructSpdyBodyFrame(7, true));
1251 1296
1252 SettingsMap settings; 1297 SettingsMap settings;
1253 const uint32_t max_concurrent_streams = 1; 1298 const uint32_t max_concurrent_streams = 1;
1254 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1299 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1255 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1300 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1256 scoped_ptr<SpdyFrame> settings_frame( 1301 scoped_ptr<SpdySerializedFrame> settings_frame(
1257 spdy_util_.ConstructSpdySettings(settings)); 1302 spdy_util_.ConstructSpdySettings(settings));
1258 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1303 scoped_ptr<SpdySerializedFrame> settings_ack(
1304 spdy_util_.ConstructSpdySettingsAck());
1259 MockWrite writes[] = { 1305 MockWrite writes[] = {
1260 CreateMockWrite(*req, 0), 1306 CreateMockWrite(*req, 0),
1261 CreateMockWrite(*settings_ack, 5), 1307 CreateMockWrite(*settings_ack, 5),
1262 // By making these synchronous, it guarantees that they are not *started* 1308 // By making these synchronous, it guarantees that they are not *started*
1263 // before their sequence number, which in turn verifies that only a single 1309 // before their sequence number, which in turn verifies that only a single
1264 // request is in-flight at a time. 1310 // request is in-flight at a time.
1265 CreateMockWrite(*req2, 6, SYNCHRONOUS), 1311 CreateMockWrite(*req2, 6, SYNCHRONOUS),
1266 CreateMockWrite(*req4, 10, SYNCHRONOUS), 1312 CreateMockWrite(*req4, 10, SYNCHRONOUS),
1267 CreateMockWrite(*req3, 13, SYNCHRONOUS), 1313 CreateMockWrite(*req3, 13, SYNCHRONOUS),
1268 }; 1314 };
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1368 helper.VerifyDataConsumed(); 1414 helper.VerifyDataConsumed();
1369 EXPECT_EQ(OK, out.rv); 1415 EXPECT_EQ(OK, out.rv);
1370 } 1416 }
1371 1417
1372 // Similar to ThreeGetsMaxConcurrrent above, however, this test 1418 // Similar to ThreeGetsMaxConcurrrent above, however, this test
1373 // deletes a session in the middle of the transaction to ensure 1419 // deletes a session in the middle of the transaction to ensure
1374 // that we properly remove pendingcreatestream objects from 1420 // that we properly remove pendingcreatestream objects from
1375 // the spdy_session 1421 // the spdy_session
1376 TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) { 1422 TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentDelete) {
1377 // Construct the request. 1423 // Construct the request.
1378 scoped_ptr<SpdyFrame> req( 1424 scoped_ptr<SpdySerializedFrame> req(
1379 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1425 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1380 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1426 scoped_ptr<SpdySerializedFrame> resp(
1381 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1427 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1382 scoped_ptr<SpdyFrame> fbody(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1428 scoped_ptr<SpdySerializedFrame> body(
1429 spdy_util_.ConstructSpdyBodyFrame(1, false));
1430 scoped_ptr<SpdySerializedFrame> fbody(
1431 spdy_util_.ConstructSpdyBodyFrame(1, true));
1383 spdy_util_.UpdateWithStreamDestruction(1); 1432 spdy_util_.UpdateWithStreamDestruction(1);
1384 1433
1385 scoped_ptr<SpdyFrame> req2( 1434 scoped_ptr<SpdySerializedFrame> req2(
1386 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 1435 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
1387 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1436 scoped_ptr<SpdySerializedFrame> resp2(
1388 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, false)); 1437 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
1389 scoped_ptr<SpdyFrame> fbody2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 1438 scoped_ptr<SpdySerializedFrame> body2(
1439 spdy_util_.ConstructSpdyBodyFrame(3, false));
1440 scoped_ptr<SpdySerializedFrame> fbody2(
1441 spdy_util_.ConstructSpdyBodyFrame(3, true));
1390 1442
1391 SettingsMap settings; 1443 SettingsMap settings;
1392 const uint32_t max_concurrent_streams = 1; 1444 const uint32_t max_concurrent_streams = 1;
1393 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1445 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1394 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1446 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1395 scoped_ptr<SpdyFrame> settings_frame( 1447 scoped_ptr<SpdySerializedFrame> settings_frame(
1396 spdy_util_.ConstructSpdySettings(settings)); 1448 spdy_util_.ConstructSpdySettings(settings));
1397 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1449 scoped_ptr<SpdySerializedFrame> settings_ack(
1450 spdy_util_.ConstructSpdySettingsAck());
1398 1451
1399 MockWrite writes[] = { 1452 MockWrite writes[] = {
1400 CreateMockWrite(*req, 0), 1453 CreateMockWrite(*req, 0),
1401 CreateMockWrite(*settings_ack, 5), 1454 CreateMockWrite(*settings_ack, 5),
1402 CreateMockWrite(*req2, 6), 1455 CreateMockWrite(*req2, 6),
1403 }; 1456 };
1404 MockRead reads[] = { 1457 MockRead reads[] = {
1405 CreateMockRead(*settings_frame, 1), 1458 CreateMockRead(*settings_frame, 1),
1406 CreateMockRead(*resp, 2), 1459 CreateMockRead(*resp, 2),
1407 CreateMockRead(*body, 3), 1460 CreateMockRead(*body, 3),
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1500 CompletionCallback callback_; 1553 CompletionCallback callback_;
1501 }; 1554 };
1502 1555
1503 } // namespace 1556 } // namespace
1504 1557
1505 // Similar to ThreeGetsMaxConcurrrentDelete above, however, this test 1558 // Similar to ThreeGetsMaxConcurrrentDelete above, however, this test
1506 // closes the socket while we have a pending transaction waiting for 1559 // closes the socket while we have a pending transaction waiting for
1507 // a pending stream creation. http://crbug.com/52901 1560 // a pending stream creation. http://crbug.com/52901
1508 TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentSocketClose) { 1561 TEST_P(SpdyNetworkTransactionTest, ThreeGetsWithMaxConcurrentSocketClose) {
1509 // Construct the request. 1562 // Construct the request.
1510 scoped_ptr<SpdyFrame> req( 1563 scoped_ptr<SpdySerializedFrame> req(
1511 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 1564 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1512 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1565 scoped_ptr<SpdySerializedFrame> resp(
1513 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1566 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1514 scoped_ptr<SpdyFrame> fin_body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1567 scoped_ptr<SpdySerializedFrame> body(
1568 spdy_util_.ConstructSpdyBodyFrame(1, false));
1569 scoped_ptr<SpdySerializedFrame> fin_body(
1570 spdy_util_.ConstructSpdyBodyFrame(1, true));
1515 spdy_util_.UpdateWithStreamDestruction(1); 1571 spdy_util_.UpdateWithStreamDestruction(1);
1516 1572
1517 scoped_ptr<SpdyFrame> req2( 1573 scoped_ptr<SpdySerializedFrame> req2(
1518 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 1574 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
1519 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 1575 scoped_ptr<SpdySerializedFrame> resp2(
1576 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
1520 1577
1521 SettingsMap settings; 1578 SettingsMap settings;
1522 const uint32_t max_concurrent_streams = 1; 1579 const uint32_t max_concurrent_streams = 1;
1523 settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 1580 settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
1524 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams); 1581 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, max_concurrent_streams);
1525 scoped_ptr<SpdyFrame> settings_frame( 1582 scoped_ptr<SpdySerializedFrame> settings_frame(
1526 spdy_util_.ConstructSpdySettings(settings)); 1583 spdy_util_.ConstructSpdySettings(settings));
1527 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 1584 scoped_ptr<SpdySerializedFrame> settings_ack(
1585 spdy_util_.ConstructSpdySettingsAck());
1528 1586
1529 MockWrite writes[] = { 1587 MockWrite writes[] = {
1530 CreateMockWrite(*req, 0), 1588 CreateMockWrite(*req, 0),
1531 CreateMockWrite(*settings_ack, 5), 1589 CreateMockWrite(*settings_ack, 5),
1532 CreateMockWrite(*req2, 6), 1590 CreateMockWrite(*req2, 6),
1533 }; 1591 };
1534 MockRead reads[] = { 1592 MockRead reads[] = {
1535 CreateMockRead(*settings_frame, 1), 1593 CreateMockRead(*settings_frame, 1),
1536 CreateMockRead(*resp, 2), 1594 CreateMockRead(*resp, 2),
1537 CreateMockRead(*body, 3), 1595 CreateMockRead(*body, 3),
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
1600 1658
1601 // Test that a simple PUT request works. 1659 // Test that a simple PUT request works.
1602 TEST_P(SpdyNetworkTransactionTest, Put) { 1660 TEST_P(SpdyNetworkTransactionTest, Put) {
1603 // Setup the request 1661 // Setup the request
1604 HttpRequestInfo request; 1662 HttpRequestInfo request;
1605 request.method = "PUT"; 1663 request.method = "PUT";
1606 request.url = GURL(GetDefaultUrl()); 1664 request.url = GURL(GetDefaultUrl());
1607 1665
1608 scoped_ptr<SpdyHeaderBlock> put_headers( 1666 scoped_ptr<SpdyHeaderBlock> put_headers(
1609 spdy_util_.ConstructPutHeaderBlock(GetDefaultUrl(), 0)); 1667 spdy_util_.ConstructPutHeaderBlock(GetDefaultUrl(), 0));
1610 scoped_ptr<SpdyFrame> req( 1668 scoped_ptr<SpdySerializedFrame> req(
1611 spdy_util_.ConstructSpdySyn(1, *put_headers, LOWEST, true)); 1669 spdy_util_.ConstructSpdySyn(1, *put_headers, LOWEST, true));
1612 MockWrite writes[] = { 1670 MockWrite writes[] = {
1613 CreateMockWrite(*req, 0), 1671 CreateMockWrite(*req, 0),
1614 }; 1672 };
1615 1673
1616 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1674 scoped_ptr<SpdySerializedFrame> resp(
1617 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1675 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1676 scoped_ptr<SpdySerializedFrame> body(
1677 spdy_util_.ConstructSpdyBodyFrame(1, true));
1618 MockRead reads[] = { 1678 MockRead reads[] = {
1619 CreateMockRead(*resp, 1), 1679 CreateMockRead(*resp, 1),
1620 CreateMockRead(*body, 2), 1680 CreateMockRead(*body, 2),
1621 MockRead(ASYNC, 0, 3) // EOF 1681 MockRead(ASYNC, 0, 3) // EOF
1622 }; 1682 };
1623 1683
1624 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1684 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1625 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1685 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1626 BoundNetLog(), GetParam(), NULL); 1686 BoundNetLog(), GetParam(), NULL);
1627 helper.RunToCompletion(&data); 1687 helper.RunToCompletion(&data);
1628 TransactionHelperResult out = helper.output(); 1688 TransactionHelperResult out = helper.output();
1629 1689
1630 EXPECT_EQ(OK, out.rv); 1690 EXPECT_EQ(OK, out.rv);
1631 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1691 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1632 } 1692 }
1633 1693
1634 // Test that a simple HEAD request works. 1694 // Test that a simple HEAD request works.
1635 TEST_P(SpdyNetworkTransactionTest, Head) { 1695 TEST_P(SpdyNetworkTransactionTest, Head) {
1636 // Setup the request 1696 // Setup the request
1637 HttpRequestInfo request; 1697 HttpRequestInfo request;
1638 request.method = "HEAD"; 1698 request.method = "HEAD";
1639 request.url = GURL(GetDefaultUrl()); 1699 request.url = GURL(GetDefaultUrl());
1640 1700
1641 scoped_ptr<SpdyHeaderBlock> head_headers( 1701 scoped_ptr<SpdyHeaderBlock> head_headers(
1642 spdy_util_.ConstructHeadHeaderBlock(GetDefaultUrl(), 0)); 1702 spdy_util_.ConstructHeadHeaderBlock(GetDefaultUrl(), 0));
1643 scoped_ptr<SpdyFrame> req( 1703 scoped_ptr<SpdySerializedFrame> req(
1644 spdy_util_.ConstructSpdySyn(1, *head_headers, LOWEST, true)); 1704 spdy_util_.ConstructSpdySyn(1, *head_headers, LOWEST, true));
1645 MockWrite writes[] = { 1705 MockWrite writes[] = {
1646 CreateMockWrite(*req, 0), 1706 CreateMockWrite(*req, 0),
1647 }; 1707 };
1648 1708
1649 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 1709 scoped_ptr<SpdySerializedFrame> resp(
1650 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1710 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1711 scoped_ptr<SpdySerializedFrame> body(
1712 spdy_util_.ConstructSpdyBodyFrame(1, true));
1651 MockRead reads[] = { 1713 MockRead reads[] = {
1652 CreateMockRead(*resp, 1), 1714 CreateMockRead(*resp, 1),
1653 CreateMockRead(*body, 2), 1715 CreateMockRead(*body, 2),
1654 MockRead(ASYNC, 0, 3) // EOF 1716 MockRead(ASYNC, 0, 3) // EOF
1655 }; 1717 };
1656 1718
1657 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1719 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1658 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1720 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1659 BoundNetLog(), GetParam(), NULL); 1721 BoundNetLog(), GetParam(), NULL);
1660 helper.RunToCompletion(&data); 1722 helper.RunToCompletion(&data);
1661 TransactionHelperResult out = helper.output(); 1723 TransactionHelperResult out = helper.output();
1662 1724
1663 EXPECT_EQ(OK, out.rv); 1725 EXPECT_EQ(OK, out.rv);
1664 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1726 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1665 } 1727 }
1666 1728
1667 // Test that a simple POST works. 1729 // Test that a simple POST works.
1668 TEST_P(SpdyNetworkTransactionTest, Post) { 1730 TEST_P(SpdyNetworkTransactionTest, Post) {
1669 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 1731 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost(
1670 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0)); 1732 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0));
1671 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1733 scoped_ptr<SpdySerializedFrame> body(
1734 spdy_util_.ConstructSpdyBodyFrame(1, true));
1672 MockWrite writes[] = { 1735 MockWrite writes[] = {
1673 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame 1736 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame
1674 }; 1737 };
1675 1738
1676 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1739 scoped_ptr<SpdySerializedFrame> resp(
1740 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1677 MockRead reads[] = { 1741 MockRead reads[] = {
1678 CreateMockRead(*resp, 2), 1742 CreateMockRead(*resp, 2),
1679 CreateMockRead(*body, 3), 1743 CreateMockRead(*body, 3),
1680 MockRead(ASYNC, 0, 4) // EOF 1744 MockRead(ASYNC, 0, 4) // EOF
1681 }; 1745 };
1682 1746
1683 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1747 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1684 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY, 1748 NormalSpdyTransactionHelper helper(CreatePostRequest(), DEFAULT_PRIORITY,
1685 BoundNetLog(), GetParam(), NULL); 1749 BoundNetLog(), GetParam(), NULL);
1686 helper.RunToCompletion(&data); 1750 helper.RunToCompletion(&data);
1687 TransactionHelperResult out = helper.output(); 1751 TransactionHelperResult out = helper.output();
1688 EXPECT_EQ(OK, out.rv); 1752 EXPECT_EQ(OK, out.rv);
1689 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1753 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1690 EXPECT_EQ("hello!", out.response_data); 1754 EXPECT_EQ("hello!", out.response_data);
1691 } 1755 }
1692 1756
1693 // Test that a POST with a file works. 1757 // Test that a POST with a file works.
1694 TEST_P(SpdyNetworkTransactionTest, FilePost) { 1758 TEST_P(SpdyNetworkTransactionTest, FilePost) {
1695 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 1759 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost(
1696 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0)); 1760 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0));
1697 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1761 scoped_ptr<SpdySerializedFrame> body(
1762 spdy_util_.ConstructSpdyBodyFrame(1, true));
1698 MockWrite writes[] = { 1763 MockWrite writes[] = {
1699 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame 1764 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame
1700 }; 1765 };
1701 1766
1702 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1767 scoped_ptr<SpdySerializedFrame> resp(
1768 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1703 MockRead reads[] = { 1769 MockRead reads[] = {
1704 CreateMockRead(*resp, 2), 1770 CreateMockRead(*resp, 2),
1705 CreateMockRead(*body, 3), 1771 CreateMockRead(*body, 3),
1706 MockRead(ASYNC, 0, 4) // EOF 1772 MockRead(ASYNC, 0, 4) // EOF
1707 }; 1773 };
1708 1774
1709 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1775 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1710 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY, 1776 NormalSpdyTransactionHelper helper(CreateFilePostRequest(), DEFAULT_PRIORITY,
1711 BoundNetLog(), GetParam(), NULL); 1777 BoundNetLog(), GetParam(), NULL);
1712 helper.RunToCompletion(&data); 1778 helper.RunToCompletion(&data);
(...skipping 20 matching lines...) Expand all
1733 helper.AddData(&data); 1799 helper.AddData(&data);
1734 helper.RunDefaultTest(); 1800 helper.RunDefaultTest();
1735 1801
1736 base::RunLoop().RunUntilIdle(); 1802 base::RunLoop().RunUntilIdle();
1737 helper.VerifyDataNotConsumed(); 1803 helper.VerifyDataNotConsumed();
1738 EXPECT_EQ(ERR_ACCESS_DENIED, helper.output().rv); 1804 EXPECT_EQ(ERR_ACCESS_DENIED, helper.output().rv);
1739 } 1805 }
1740 1806
1741 // Test that a complex POST works. 1807 // Test that a complex POST works.
1742 TEST_P(SpdyNetworkTransactionTest, ComplexPost) { 1808 TEST_P(SpdyNetworkTransactionTest, ComplexPost) {
1743 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 1809 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost(
1744 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0)); 1810 GetDefaultUrl(), 1, kUploadDataSize, LOWEST, NULL, 0));
1745 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1811 scoped_ptr<SpdySerializedFrame> body(
1812 spdy_util_.ConstructSpdyBodyFrame(1, true));
1746 MockWrite writes[] = { 1813 MockWrite writes[] = {
1747 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame 1814 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), // POST upload frame
1748 }; 1815 };
1749 1816
1750 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1817 scoped_ptr<SpdySerializedFrame> resp(
1818 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1751 MockRead reads[] = { 1819 MockRead reads[] = {
1752 CreateMockRead(*resp, 2), 1820 CreateMockRead(*resp, 2),
1753 CreateMockRead(*body, 3), 1821 CreateMockRead(*body, 3),
1754 MockRead(ASYNC, 0, 4) // EOF 1822 MockRead(ASYNC, 0, 4) // EOF
1755 }; 1823 };
1756 1824
1757 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1825 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1758 NormalSpdyTransactionHelper helper(CreateComplexPostRequest(), 1826 NormalSpdyTransactionHelper helper(CreateComplexPostRequest(),
1759 DEFAULT_PRIORITY, 1827 DEFAULT_PRIORITY,
1760 BoundNetLog(), GetParam(), NULL); 1828 BoundNetLog(), GetParam(), NULL);
1761 helper.RunToCompletion(&data); 1829 helper.RunToCompletion(&data);
1762 TransactionHelperResult out = helper.output(); 1830 TransactionHelperResult out = helper.output();
1763 EXPECT_EQ(OK, out.rv); 1831 EXPECT_EQ(OK, out.rv);
1764 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1832 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1765 EXPECT_EQ("hello!", out.response_data); 1833 EXPECT_EQ("hello!", out.response_data);
1766 } 1834 }
1767 1835
1768 // Test that a chunked POST works. 1836 // Test that a chunked POST works.
1769 TEST_P(SpdyNetworkTransactionTest, ChunkedPost) { 1837 TEST_P(SpdyNetworkTransactionTest, ChunkedPost) {
1770 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1838 scoped_ptr<SpdySerializedFrame> req(
1771 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1839 spdy_util_.ConstructChunkedSpdyPost(NULL, 0));
1840 scoped_ptr<SpdySerializedFrame> body(
1841 spdy_util_.ConstructSpdyBodyFrame(1, true));
1772 MockWrite writes[] = { 1842 MockWrite writes[] = {
1773 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1), 1843 CreateMockWrite(*req, 0), CreateMockWrite(*body, 1),
1774 }; 1844 };
1775 1845
1776 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1846 scoped_ptr<SpdySerializedFrame> resp(
1847 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1777 MockRead reads[] = { 1848 MockRead reads[] = {
1778 CreateMockRead(*resp, 2), 1849 CreateMockRead(*resp, 2),
1779 CreateMockRead(*body, 3), 1850 CreateMockRead(*body, 3),
1780 MockRead(ASYNC, 0, 4) // EOF 1851 MockRead(ASYNC, 0, 4) // EOF
1781 }; 1852 };
1782 1853
1783 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1854 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1784 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), 1855 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
1785 DEFAULT_PRIORITY, 1856 DEFAULT_PRIORITY,
1786 BoundNetLog(), GetParam(), NULL); 1857 BoundNetLog(), GetParam(), NULL);
1787 1858
1788 // These chunks get merged into a single frame when being sent. 1859 // These chunks get merged into a single frame when being sent.
1789 const int kFirstChunkSize = kUploadDataSize/2; 1860 const int kFirstChunkSize = kUploadDataSize/2;
1790 upload_chunked_data_stream()->AppendData(kUploadData, kFirstChunkSize, false); 1861 upload_chunked_data_stream()->AppendData(kUploadData, kFirstChunkSize, false);
1791 upload_chunked_data_stream()->AppendData( 1862 upload_chunked_data_stream()->AppendData(
1792 kUploadData + kFirstChunkSize, kUploadDataSize - kFirstChunkSize, true); 1863 kUploadData + kFirstChunkSize, kUploadDataSize - kFirstChunkSize, true);
1793 1864
1794 helper.RunToCompletion(&data); 1865 helper.RunToCompletion(&data);
1795 TransactionHelperResult out = helper.output(); 1866 TransactionHelperResult out = helper.output();
1796 EXPECT_EQ(OK, out.rv); 1867 EXPECT_EQ(OK, out.rv);
1797 EXPECT_EQ("HTTP/1.1 200", out.status_line); 1868 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1798 EXPECT_EQ(kUploadData, out.response_data); 1869 EXPECT_EQ(kUploadData, out.response_data);
1799 } 1870 }
1800 1871
1801 // Test that a chunked POST works with chunks appended after transaction starts. 1872 // Test that a chunked POST works with chunks appended after transaction starts.
1802 TEST_P(SpdyNetworkTransactionTest, DelayedChunkedPost) { 1873 TEST_P(SpdyNetworkTransactionTest, DelayedChunkedPost) {
1803 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 1874 scoped_ptr<SpdySerializedFrame> req(
1804 scoped_ptr<SpdyFrame> chunk1(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1875 spdy_util_.ConstructChunkedSpdyPost(NULL, 0));
1805 scoped_ptr<SpdyFrame> chunk2(spdy_util_.ConstructSpdyBodyFrame(1, false)); 1876 scoped_ptr<SpdySerializedFrame> chunk1(
1806 scoped_ptr<SpdyFrame> chunk3(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1877 spdy_util_.ConstructSpdyBodyFrame(1, false));
1878 scoped_ptr<SpdySerializedFrame> chunk2(
1879 spdy_util_.ConstructSpdyBodyFrame(1, false));
1880 scoped_ptr<SpdySerializedFrame> chunk3(
1881 spdy_util_.ConstructSpdyBodyFrame(1, true));
1807 MockWrite writes[] = { 1882 MockWrite writes[] = {
1808 CreateMockWrite(*req, 0), 1883 CreateMockWrite(*req, 0),
1809 CreateMockWrite(*chunk1, 1), 1884 CreateMockWrite(*chunk1, 1),
1810 CreateMockWrite(*chunk2, 2), 1885 CreateMockWrite(*chunk2, 2),
1811 CreateMockWrite(*chunk3, 3), 1886 CreateMockWrite(*chunk3, 3),
1812 }; 1887 };
1813 1888
1814 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1889 scoped_ptr<SpdySerializedFrame> resp(
1890 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1815 MockRead reads[] = { 1891 MockRead reads[] = {
1816 CreateMockRead(*resp, 4), 1892 CreateMockRead(*resp, 4),
1817 CreateMockRead(*chunk1, 5), 1893 CreateMockRead(*chunk1, 5),
1818 CreateMockRead(*chunk2, 6), 1894 CreateMockRead(*chunk2, 6),
1819 CreateMockRead(*chunk3, 7), 1895 CreateMockRead(*chunk3, 7),
1820 MockRead(ASYNC, 0, 8) // EOF 1896 MockRead(ASYNC, 0, 8) // EOF
1821 }; 1897 };
1822 1898
1823 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1899 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1824 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), 1900 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1857 HttpRequestInfo request; 1933 HttpRequestInfo request;
1858 request.method = "POST"; 1934 request.method = "POST";
1859 request.url = GURL(GetDefaultUrl()); 1935 request.url = GURL(GetDefaultUrl());
1860 // Create an empty UploadData. 1936 // Create an empty UploadData.
1861 request.upload_data_stream = NULL; 1937 request.upload_data_stream = NULL;
1862 1938
1863 // When request.upload_data_stream is NULL for post, content-length is 1939 // When request.upload_data_stream is NULL for post, content-length is
1864 // expected to be 0. 1940 // expected to be 0.
1865 scoped_ptr<SpdyHeaderBlock> req_block( 1941 scoped_ptr<SpdyHeaderBlock> req_block(
1866 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), 0)); 1942 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), 0));
1867 scoped_ptr<SpdyFrame> req( 1943 scoped_ptr<SpdySerializedFrame> req(
1868 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, true)); 1944 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, true));
1869 1945
1870 MockWrite writes[] = { 1946 MockWrite writes[] = {
1871 CreateMockWrite(*req, 0), 1947 CreateMockWrite(*req, 0),
1872 }; 1948 };
1873 1949
1874 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1950 scoped_ptr<SpdySerializedFrame> resp(
1875 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1951 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1952 scoped_ptr<SpdySerializedFrame> body(
1953 spdy_util_.ConstructSpdyBodyFrame(1, true));
1876 MockRead reads[] = { 1954 MockRead reads[] = {
1877 CreateMockRead(*resp, 1), 1955 CreateMockRead(*resp, 1),
1878 CreateMockRead(*body, 2), 1956 CreateMockRead(*body, 2),
1879 MockRead(ASYNC, 0, 3) // EOF 1957 MockRead(ASYNC, 0, 3) // EOF
1880 }; 1958 };
1881 1959
1882 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 1960 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1883 1961
1884 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 1962 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1885 BoundNetLog(), GetParam(), NULL); 1963 BoundNetLog(), GetParam(), NULL);
(...skipping 14 matching lines...) Expand all
1900 // Setup the request 1978 // Setup the request
1901 HttpRequestInfo request; 1979 HttpRequestInfo request;
1902 request.method = "POST"; 1980 request.method = "POST";
1903 request.url = GURL(GetDefaultUrl()); 1981 request.url = GURL(GetDefaultUrl());
1904 request.upload_data_stream = &stream; 1982 request.upload_data_stream = &stream;
1905 1983
1906 const uint64_t kContentLength = 0; 1984 const uint64_t kContentLength = 0;
1907 1985
1908 scoped_ptr<SpdyHeaderBlock> req_block( 1986 scoped_ptr<SpdyHeaderBlock> req_block(
1909 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), kContentLength)); 1987 spdy_util_.ConstructPostHeaderBlock(GetDefaultUrl(), kContentLength));
1910 scoped_ptr<SpdyFrame> req( 1988 scoped_ptr<SpdySerializedFrame> req(
1911 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, true)); 1989 spdy_util_.ConstructSpdySyn(1, *req_block, LOWEST, true));
1912 1990
1913 MockWrite writes[] = { 1991 MockWrite writes[] = {
1914 CreateMockWrite(*req, 0), 1992 CreateMockWrite(*req, 0),
1915 }; 1993 };
1916 1994
1917 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 1995 scoped_ptr<SpdySerializedFrame> resp(
1918 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 1996 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1997 scoped_ptr<SpdySerializedFrame> body(
1998 spdy_util_.ConstructSpdyBodyFrame(1, true));
1919 MockRead reads[] = { 1999 MockRead reads[] = {
1920 CreateMockRead(*resp, 1), 2000 CreateMockRead(*resp, 1),
1921 CreateMockRead(*body, 2), 2001 CreateMockRead(*body, 2),
1922 MockRead(ASYNC, 0, 3) // EOF 2002 MockRead(ASYNC, 0, 3) // EOF
1923 }; 2003 };
1924 2004
1925 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2005 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1926 2006
1927 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, 2007 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY,
1928 BoundNetLog(), GetParam(), NULL); 2008 BoundNetLog(), GetParam(), NULL);
1929 helper.RunToCompletion(&data); 2009 helper.RunToCompletion(&data);
1930 TransactionHelperResult out = helper.output(); 2010 TransactionHelperResult out = helper.output();
1931 EXPECT_EQ(OK, out.rv); 2011 EXPECT_EQ(OK, out.rv);
1932 EXPECT_EQ("HTTP/1.1 200", out.status_line); 2012 EXPECT_EQ("HTTP/1.1 200", out.status_line);
1933 EXPECT_EQ("hello!", out.response_data); 2013 EXPECT_EQ("hello!", out.response_data);
1934 } 2014 }
1935 2015
1936 // While we're doing a post, the server sends the reply before upload completes. 2016 // While we're doing a post, the server sends the reply before upload completes.
1937 TEST_P(SpdyNetworkTransactionTest, ResponseBeforePostCompletes) { 2017 TEST_P(SpdyNetworkTransactionTest, ResponseBeforePostCompletes) {
1938 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 2018 scoped_ptr<SpdySerializedFrame> req(
1939 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2019 spdy_util_.ConstructChunkedSpdyPost(NULL, 0));
2020 scoped_ptr<SpdySerializedFrame> body(
2021 spdy_util_.ConstructSpdyBodyFrame(1, true));
1940 MockWrite writes[] = { 2022 MockWrite writes[] = {
1941 CreateMockWrite(*req, 0), 2023 CreateMockWrite(*req, 0),
1942 CreateMockWrite(*body, 3), 2024 CreateMockWrite(*body, 3),
1943 }; 2025 };
1944 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 2026 scoped_ptr<SpdySerializedFrame> resp(
2027 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
1945 MockRead reads[] = { 2028 MockRead reads[] = {
1946 CreateMockRead(*resp, 1), 2029 CreateMockRead(*resp, 1),
1947 CreateMockRead(*body, 2), 2030 CreateMockRead(*body, 2),
1948 MockRead(ASYNC, 0, 4) // EOF 2031 MockRead(ASYNC, 0, 4) // EOF
1949 }; 2032 };
1950 2033
1951 // Write the request headers, and read the complete response 2034 // Write the request headers, and read the complete response
1952 // while still waiting for chunked request data. 2035 // while still waiting for chunked request data.
1953 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2036 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
1954 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(), 2037 NormalSpdyTransactionHelper helper(CreateChunkedPostRequest(),
(...skipping 18 matching lines...) Expand all
1973 std::string response_body; 2056 std::string response_body;
1974 EXPECT_EQ(OK, ReadTransaction(helper.trans(), &response_body)); 2057 EXPECT_EQ(OK, ReadTransaction(helper.trans(), &response_body));
1975 EXPECT_EQ(kUploadData, response_body); 2058 EXPECT_EQ(kUploadData, response_body);
1976 helper.VerifyDataConsumed(); 2059 helper.VerifyDataConsumed();
1977 } 2060 }
1978 2061
1979 // The client upon cancellation tries to send a RST_STREAM frame. The mock 2062 // The client upon cancellation tries to send a RST_STREAM frame. The mock
1980 // socket causes the TCP write to return zero. This test checks that the client 2063 // socket causes the TCP write to return zero. This test checks that the client
1981 // tries to queue up the RST_STREAM frame again. 2064 // tries to queue up the RST_STREAM frame again.
1982 TEST_P(SpdyNetworkTransactionTest, SocketWriteReturnsZero) { 2065 TEST_P(SpdyNetworkTransactionTest, SocketWriteReturnsZero) {
1983 scoped_ptr<SpdyFrame> req( 2066 scoped_ptr<SpdySerializedFrame> req(
1984 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2067 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
1985 scoped_ptr<SpdyFrame> rst( 2068 scoped_ptr<SpdySerializedFrame> rst(
1986 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 2069 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1987 MockWrite writes[] = { 2070 MockWrite writes[] = {
1988 CreateMockWrite(*req.get(), 0, SYNCHRONOUS), 2071 CreateMockWrite(*req.get(), 0, SYNCHRONOUS),
1989 MockWrite(SYNCHRONOUS, 0, 0, 2), 2072 MockWrite(SYNCHRONOUS, 0, 0, 2),
1990 CreateMockWrite(*rst.get(), 3, SYNCHRONOUS), 2073 CreateMockWrite(*rst.get(), 3, SYNCHRONOUS),
1991 }; 2074 };
1992 2075
1993 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2076 scoped_ptr<SpdySerializedFrame> resp(
2077 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
1994 MockRead reads[] = { 2078 MockRead reads[] = {
1995 CreateMockRead(*resp.get(), 1, ASYNC), 2079 CreateMockRead(*resp.get(), 1, ASYNC),
1996 MockRead(ASYNC, 0, 0, 4) // EOF 2080 MockRead(ASYNC, 0, 0, 4) // EOF
1997 }; 2081 };
1998 2082
1999 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2083 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2000 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2084 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2001 BoundNetLog(), GetParam(), NULL); 2085 BoundNetLog(), GetParam(), NULL);
2002 helper.RunPreTestSetup(); 2086 helper.RunPreTestSetup();
2003 helper.AddData(&data); 2087 helper.AddData(&data);
2004 HttpNetworkTransaction* trans = helper.trans(); 2088 HttpNetworkTransaction* trans = helper.trans();
2005 2089
2006 TestCompletionCallback callback; 2090 TestCompletionCallback callback;
2007 int rv = trans->Start( 2091 int rv = trans->Start(
2008 &CreateGetRequest(), callback.callback(), BoundNetLog()); 2092 &CreateGetRequest(), callback.callback(), BoundNetLog());
2009 EXPECT_EQ(OK, callback.GetResult(rv)); 2093 EXPECT_EQ(OK, callback.GetResult(rv));
2010 2094
2011 helper.ResetTrans(); 2095 helper.ResetTrans();
2012 base::RunLoop().RunUntilIdle(); 2096 base::RunLoop().RunUntilIdle();
2013 2097
2014 helper.VerifyDataConsumed(); 2098 helper.VerifyDataConsumed();
2015 } 2099 }
2016 2100
2017 // Test that the transaction doesn't crash when we don't have a reply. 2101 // Test that the transaction doesn't crash when we don't have a reply.
2018 TEST_P(SpdyNetworkTransactionTest, ResponseWithoutSynReply) { 2102 TEST_P(SpdyNetworkTransactionTest, ResponseWithoutSynReply) {
2019 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2103 scoped_ptr<SpdySerializedFrame> body(
2104 spdy_util_.ConstructSpdyBodyFrame(1, true));
2020 MockRead reads[] = { 2105 MockRead reads[] = {
2021 CreateMockRead(*body, 1), MockRead(ASYNC, 0, 3) // EOF 2106 CreateMockRead(*body, 1), MockRead(ASYNC, 0, 3) // EOF
2022 }; 2107 };
2023 2108
2024 scoped_ptr<SpdyFrame> req( 2109 scoped_ptr<SpdySerializedFrame> req(
2025 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2110 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2026 scoped_ptr<SpdyFrame> rst( 2111 scoped_ptr<SpdySerializedFrame> rst(
2027 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 2112 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
2028 MockWrite writes[] = { 2113 MockWrite writes[] = {
2029 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), 2114 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2),
2030 }; 2115 };
2031 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2116 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2032 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2117 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2033 BoundNetLog(), GetParam(), NULL); 2118 BoundNetLog(), GetParam(), NULL);
2034 helper.RunToCompletion(&data); 2119 helper.RunToCompletion(&data);
2035 TransactionHelperResult out = helper.output(); 2120 TransactionHelperResult out = helper.output();
2036 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 2121 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
2037 } 2122 }
2038 2123
2039 // Test that the transaction doesn't crash when we get two replies on the same 2124 // Test that the transaction doesn't crash when we get two replies on the same
2040 // stream ID. See http://crbug.com/45639. 2125 // stream ID. See http://crbug.com/45639.
2041 TEST_P(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) { 2126 TEST_P(SpdyNetworkTransactionTest, ResponseWithTwoSynReplies) {
2042 scoped_ptr<SpdyFrame> req( 2127 scoped_ptr<SpdySerializedFrame> req(
2043 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2128 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2044 scoped_ptr<SpdyFrame> rst( 2129 scoped_ptr<SpdySerializedFrame> rst(
2045 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 2130 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
2046 MockWrite writes[] = { 2131 MockWrite writes[] = {
2047 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), 2132 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
2048 }; 2133 };
2049 2134
2050 scoped_ptr<SpdyFrame> resp0( 2135 scoped_ptr<SpdySerializedFrame> resp0(
2051 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 2136 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
2052 scoped_ptr<SpdyFrame> resp1( 2137 scoped_ptr<SpdySerializedFrame> resp1(
2053 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 2138 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
2054 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2139 scoped_ptr<SpdySerializedFrame> body(
2140 spdy_util_.ConstructSpdyBodyFrame(1, true));
2055 MockRead reads[] = { 2141 MockRead reads[] = {
2056 CreateMockRead(*resp0, 1), CreateMockRead(*resp1, 2), 2142 CreateMockRead(*resp0, 1), CreateMockRead(*resp1, 2),
2057 CreateMockRead(*body, 3), MockRead(ASYNC, 0, 5) // EOF 2143 CreateMockRead(*body, 3), MockRead(ASYNC, 0, 5) // EOF
2058 }; 2144 };
2059 2145
2060 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2146 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2061 2147
2062 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2148 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2063 BoundNetLog(), GetParam(), NULL); 2149 BoundNetLog(), GetParam(), NULL);
2064 helper.RunPreTestSetup(); 2150 helper.RunPreTestSetup();
(...skipping 13 matching lines...) Expand all
2078 EXPECT_TRUE(response->was_fetched_via_spdy); 2164 EXPECT_TRUE(response->was_fetched_via_spdy);
2079 std::string response_data; 2165 std::string response_data;
2080 rv = ReadTransaction(trans, &response_data); 2166 rv = ReadTransaction(trans, &response_data);
2081 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, rv); 2167 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, rv);
2082 2168
2083 helper.VerifyDataConsumed(); 2169 helper.VerifyDataConsumed();
2084 } 2170 }
2085 2171
2086 TEST_P(SpdyNetworkTransactionTest, ResetReplyWithTransferEncoding) { 2172 TEST_P(SpdyNetworkTransactionTest, ResetReplyWithTransferEncoding) {
2087 // Construct the request. 2173 // Construct the request.
2088 scoped_ptr<SpdyFrame> req( 2174 scoped_ptr<SpdySerializedFrame> req(
2089 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2175 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2090 scoped_ptr<SpdyFrame> rst( 2176 scoped_ptr<SpdySerializedFrame> rst(
2091 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 2177 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
2092 MockWrite writes[] = { 2178 MockWrite writes[] = {
2093 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), 2179 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2),
2094 }; 2180 };
2095 2181
2096 const char* const headers[] = { 2182 const char* const headers[] = {
2097 "transfer-encoding", "chunked" 2183 "transfer-encoding", "chunked"
2098 }; 2184 };
2099 scoped_ptr<SpdyFrame> resp( 2185 scoped_ptr<SpdySerializedFrame> resp(
2100 spdy_util_.ConstructSpdyGetSynReply(headers, 1, 1)); 2186 spdy_util_.ConstructSpdyGetSynReply(headers, 1, 1));
2101 scoped_ptr<SpdyFrame> body( 2187 scoped_ptr<SpdySerializedFrame> body(
2102 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2188 spdy_util_.ConstructSpdyBodyFrame(1, true));
2103 MockRead reads[] = { 2189 MockRead reads[] = {
2104 CreateMockRead(*resp, 1), 2190 CreateMockRead(*resp, 1),
2105 CreateMockRead(*body, 3), 2191 CreateMockRead(*body, 3),
2106 MockRead(ASYNC, 0, 4) // EOF 2192 MockRead(ASYNC, 0, 4) // EOF
2107 }; 2193 };
2108 2194
2109 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2195 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2110 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2196 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2111 BoundNetLog(), GetParam(), NULL); 2197 BoundNetLog(), GetParam(), NULL);
2112 helper.RunToCompletion(&data); 2198 helper.RunToCompletion(&data);
2113 TransactionHelperResult out = helper.output(); 2199 TransactionHelperResult out = helper.output();
2114 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 2200 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
2115 2201
2116 helper.session()->spdy_session_pool()->CloseAllSessions(); 2202 helper.session()->spdy_session_pool()->CloseAllSessions();
2117 helper.VerifyDataConsumed(); 2203 helper.VerifyDataConsumed();
2118 } 2204 }
2119 2205
2120 TEST_P(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) { 2206 TEST_P(SpdyNetworkTransactionTest, ResetPushWithTransferEncoding) {
2121 // Construct the request. 2207 // Construct the request.
2122 scoped_ptr<SpdyFrame> req( 2208 scoped_ptr<SpdySerializedFrame> req(
2123 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2209 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2124 scoped_ptr<SpdyFrame> rst( 2210 scoped_ptr<SpdySerializedFrame> rst(
2125 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2211 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2126 MockWrite writes[] = { 2212 MockWrite writes[] = {
2127 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), 2213 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
2128 }; 2214 };
2129 2215
2130 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2216 scoped_ptr<SpdySerializedFrame> resp(
2217 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2131 const char* const headers[] = { 2218 const char* const headers[] = {
2132 "transfer-encoding", "chunked" 2219 "transfer-encoding", "chunked"
2133 }; 2220 };
2134 scoped_ptr<SpdyFrame> push( 2221 scoped_ptr<SpdySerializedFrame> push(
2135 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1, 2222 spdy_util_.ConstructSpdyPush(headers, arraysize(headers) / 2, 2, 1,
2136 GetDefaultUrlWithPath("/1").c_str())); 2223 GetDefaultUrlWithPath("/1").c_str()));
2137 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2224 scoped_ptr<SpdySerializedFrame> body(
2225 spdy_util_.ConstructSpdyBodyFrame(1, true));
2138 MockRead reads[] = { 2226 MockRead reads[] = {
2139 CreateMockRead(*resp, 1), 2227 CreateMockRead(*resp, 1),
2140 CreateMockRead(*push, 2), 2228 CreateMockRead(*push, 2),
2141 CreateMockRead(*body, 3), 2229 CreateMockRead(*body, 3),
2142 MockRead(ASYNC, 0, 5) // EOF 2230 MockRead(ASYNC, 0, 5) // EOF
2143 }; 2231 };
2144 2232
2145 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2233 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2146 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2234 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2147 BoundNetLog(), GetParam(), NULL); 2235 BoundNetLog(), GetParam(), NULL);
2148 helper.RunToCompletion(&data); 2236 helper.RunToCompletion(&data);
2149 TransactionHelperResult out = helper.output(); 2237 TransactionHelperResult out = helper.output();
2150 EXPECT_EQ(OK, out.rv); 2238 EXPECT_EQ(OK, out.rv);
2151 EXPECT_EQ("HTTP/1.1 200", out.status_line); 2239 EXPECT_EQ("HTTP/1.1 200", out.status_line);
2152 EXPECT_EQ("hello!", out.response_data); 2240 EXPECT_EQ("hello!", out.response_data);
2153 2241
2154 helper.session()->spdy_session_pool()->CloseAllSessions(); 2242 helper.session()->spdy_session_pool()->CloseAllSessions();
2155 helper.VerifyDataConsumed(); 2243 helper.VerifyDataConsumed();
2156 } 2244 }
2157 2245
2158 TEST_P(SpdyNetworkTransactionTest, CancelledTransaction) { 2246 TEST_P(SpdyNetworkTransactionTest, CancelledTransaction) {
2159 // Construct the request. 2247 // Construct the request.
2160 scoped_ptr<SpdyFrame> req( 2248 scoped_ptr<SpdySerializedFrame> req(
2161 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2249 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2162 MockWrite writes[] = { 2250 MockWrite writes[] = {
2163 CreateMockWrite(*req), 2251 CreateMockWrite(*req),
2164 }; 2252 };
2165 2253
2166 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2254 scoped_ptr<SpdySerializedFrame> resp(
2255 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2167 MockRead reads[] = { 2256 MockRead reads[] = {
2168 CreateMockRead(*resp), 2257 CreateMockRead(*resp),
2169 // This following read isn't used by the test, except during the 2258 // This following read isn't used by the test, except during the
2170 // RunUntilIdle() call at the end since the SpdySession survives the 2259 // RunUntilIdle() call at the end since the SpdySession survives the
2171 // HttpNetworkTransaction and still tries to continue Read()'ing. Any 2260 // HttpNetworkTransaction and still tries to continue Read()'ing. Any
2172 // MockRead will do here. 2261 // MockRead will do here.
2173 MockRead(ASYNC, 0, 0) // EOF 2262 MockRead(ASYNC, 0, 0) // EOF
2174 }; 2263 };
2175 2264
2176 StaticSocketDataProvider data(reads, arraysize(reads), 2265 StaticSocketDataProvider data(reads, arraysize(reads),
(...skipping 12 matching lines...) Expand all
2189 helper.ResetTrans(); // Cancel the transaction. 2278 helper.ResetTrans(); // Cancel the transaction.
2190 2279
2191 // Flush the MessageLoop while the SpdySessionDependencies (in particular, the 2280 // Flush the MessageLoop while the SpdySessionDependencies (in particular, the
2192 // MockClientSocketFactory) are still alive. 2281 // MockClientSocketFactory) are still alive.
2193 base::RunLoop().RunUntilIdle(); 2282 base::RunLoop().RunUntilIdle();
2194 helper.VerifyDataNotConsumed(); 2283 helper.VerifyDataNotConsumed();
2195 } 2284 }
2196 2285
2197 // Verify that the client sends a Rst Frame upon cancelling the stream. 2286 // Verify that the client sends a Rst Frame upon cancelling the stream.
2198 TEST_P(SpdyNetworkTransactionTest, CancelledTransactionSendRst) { 2287 TEST_P(SpdyNetworkTransactionTest, CancelledTransactionSendRst) {
2199 scoped_ptr<SpdyFrame> req( 2288 scoped_ptr<SpdySerializedFrame> req(
2200 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2289 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2201 scoped_ptr<SpdyFrame> rst( 2290 scoped_ptr<SpdySerializedFrame> rst(
2202 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 2291 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
2203 MockWrite writes[] = { 2292 MockWrite writes[] = {
2204 CreateMockWrite(*req, 0, SYNCHRONOUS), 2293 CreateMockWrite(*req, 0, SYNCHRONOUS),
2205 CreateMockWrite(*rst, 2, SYNCHRONOUS), 2294 CreateMockWrite(*rst, 2, SYNCHRONOUS),
2206 }; 2295 };
2207 2296
2208 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2297 scoped_ptr<SpdySerializedFrame> resp(
2298 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2209 MockRead reads[] = { 2299 MockRead reads[] = {
2210 CreateMockRead(*resp, 1, ASYNC), 2300 CreateMockRead(*resp, 1, ASYNC),
2211 MockRead(ASYNC, 0, 0, 3) // EOF 2301 MockRead(ASYNC, 0, 0, 3) // EOF
2212 }; 2302 };
2213 2303
2214 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2304 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2215 2305
2216 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2306 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2217 BoundNetLog(), 2307 BoundNetLog(),
2218 GetParam(), NULL); 2308 GetParam(), NULL);
(...skipping 10 matching lines...) Expand all
2229 helper.ResetTrans(); 2319 helper.ResetTrans();
2230 base::RunLoop().RunUntilIdle(); 2320 base::RunLoop().RunUntilIdle();
2231 2321
2232 helper.VerifyDataConsumed(); 2322 helper.VerifyDataConsumed();
2233 } 2323 }
2234 2324
2235 // Verify that the client can correctly deal with the user callback attempting 2325 // Verify that the client can correctly deal with the user callback attempting
2236 // to start another transaction on a session that is closing down. See 2326 // to start another transaction on a session that is closing down. See
2237 // http://crbug.com/47455 2327 // http://crbug.com/47455
2238 TEST_P(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) { 2328 TEST_P(SpdyNetworkTransactionTest, StartTransactionOnReadCallback) {
2239 scoped_ptr<SpdyFrame> req( 2329 scoped_ptr<SpdySerializedFrame> req(
2240 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2330 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2241 MockWrite writes[] = {CreateMockWrite(*req)}; 2331 MockWrite writes[] = {CreateMockWrite(*req)};
2242 MockWrite writes2[] = {CreateMockWrite(*req, 0)}; 2332 MockWrite writes2[] = {CreateMockWrite(*req, 0)};
2243 2333
2244 // The indicated length of this frame is longer than its actual length. When 2334 // The indicated length of this frame is longer than its actual length. When
2245 // the session receives an empty frame after this one, it shuts down the 2335 // the session receives an empty frame after this one, it shuts down the
2246 // session, and calls the read callback with the incomplete data. 2336 // session, and calls the read callback with the incomplete data.
2247 const uint8_t kGetBodyFrame2[] = { 2337 const uint8_t kGetBodyFrame2[] = {
2248 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 2338 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
2249 0x07, 'h', 'e', 'l', 'l', 'o', '!', 2339 0x07, 'h', 'e', 'l', 'l', 'o', '!',
2250 }; 2340 };
2251 2341
2252 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2342 scoped_ptr<SpdySerializedFrame> resp(
2343 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2253 MockRead reads[] = { 2344 MockRead reads[] = {
2254 CreateMockRead(*resp, 1), 2345 CreateMockRead(*resp, 1),
2255 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 2346 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
2256 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2), 2347 MockRead(ASYNC, reinterpret_cast<const char*>(kGetBodyFrame2),
2257 arraysize(kGetBodyFrame2), 3), 2348 arraysize(kGetBodyFrame2), 3),
2258 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause 2349 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause
2259 MockRead(ASYNC, 0, 0, 5), // EOF 2350 MockRead(ASYNC, 0, 0, 5), // EOF
2260 }; 2351 };
2261 MockRead reads2[] = { 2352 MockRead reads2[] = {
2262 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 0, 2), // EOF 2353 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 0, 2), // EOF
(...skipping 30 matching lines...) Expand all
2293 // This finishes the read. 2384 // This finishes the read.
2294 data.Resume(); 2385 data.Resume();
2295 base::RunLoop().RunUntilIdle(); 2386 base::RunLoop().RunUntilIdle();
2296 helper.VerifyDataConsumed(); 2387 helper.VerifyDataConsumed();
2297 } 2388 }
2298 2389
2299 // Verify that the client can correctly deal with the user callback deleting the 2390 // Verify that the client can correctly deal with the user callback deleting the
2300 // transaction. Failures will usually be valgrind errors. See 2391 // transaction. Failures will usually be valgrind errors. See
2301 // http://crbug.com/46925 2392 // http://crbug.com/46925
2302 TEST_P(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) { 2393 TEST_P(SpdyNetworkTransactionTest, DeleteSessionOnReadCallback) {
2303 scoped_ptr<SpdyFrame> req( 2394 scoped_ptr<SpdySerializedFrame> req(
2304 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2395 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2305 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 2396 MockWrite writes[] = {CreateMockWrite(*req, 0)};
2306 2397
2307 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2398 scoped_ptr<SpdySerializedFrame> resp(
2308 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2399 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2400 scoped_ptr<SpdySerializedFrame> body(
2401 spdy_util_.ConstructSpdyBodyFrame(1, true));
2309 MockRead reads[] = { 2402 MockRead reads[] = {
2310 CreateMockRead(*resp.get(), 1), 2403 CreateMockRead(*resp.get(), 1),
2311 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 2404 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
2312 CreateMockRead(*body.get(), 3), 2405 CreateMockRead(*body.get(), 3),
2313 MockRead(ASYNC, 0, 0, 4), // EOF 2406 MockRead(ASYNC, 0, 0, 4), // EOF
2314 }; 2407 };
2315 2408
2316 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2409 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2317 2410
2318 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2411 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
(...skipping 30 matching lines...) Expand all
2349 scoped_ptr<SpdyHeaderBlock> headers( 2442 scoped_ptr<SpdyHeaderBlock> headers(
2350 spdy_util_.ConstructGetHeaderBlock(GetDefaultUrl())); 2443 spdy_util_.ConstructGetHeaderBlock(GetDefaultUrl()));
2351 (*headers)["user-agent"] = ""; 2444 (*headers)["user-agent"] = "";
2352 (*headers)["accept-encoding"] = "gzip, deflate"; 2445 (*headers)["accept-encoding"] = "gzip, deflate";
2353 scoped_ptr<SpdyHeaderBlock> headers2( 2446 scoped_ptr<SpdyHeaderBlock> headers2(
2354 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php")); 2447 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php"));
2355 (*headers2)["user-agent"] = ""; 2448 (*headers2)["user-agent"] = "";
2356 (*headers2)["accept-encoding"] = "gzip, deflate"; 2449 (*headers2)["accept-encoding"] = "gzip, deflate";
2357 2450
2358 // Setup writes/reads to www.example.org 2451 // Setup writes/reads to www.example.org
2359 scoped_ptr<SpdyFrame> req( 2452 scoped_ptr<SpdySerializedFrame> req(
2360 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, true)); 2453 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, true));
2361 scoped_ptr<SpdyFrame> req2( 2454 scoped_ptr<SpdySerializedFrame> req2(
2362 spdy_util_.ConstructSpdySyn(1, *headers2, LOWEST, true)); 2455 spdy_util_.ConstructSpdySyn(1, *headers2, LOWEST, true));
2363 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReplyRedirect(1)); 2456 scoped_ptr<SpdySerializedFrame> resp(
2457 spdy_util_.ConstructSpdyGetSynReplyRedirect(1));
2364 MockWrite writes[] = { 2458 MockWrite writes[] = {
2365 CreateMockWrite(*req, 1), 2459 CreateMockWrite(*req, 1),
2366 }; 2460 };
2367 MockRead reads[] = { 2461 MockRead reads[] = {
2368 CreateMockRead(*resp, 2), 2462 CreateMockRead(*resp, 2),
2369 MockRead(ASYNC, 0, 0, 3) // EOF 2463 MockRead(ASYNC, 0, 0, 3) // EOF
2370 }; 2464 };
2371 2465
2372 // Setup writes/reads to www.foo.com 2466 // Setup writes/reads to www.foo.com
2373 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2467 scoped_ptr<SpdySerializedFrame> resp2(
2374 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2468 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2469 scoped_ptr<SpdySerializedFrame> body2(
2470 spdy_util_.ConstructSpdyBodyFrame(1, true));
2375 MockWrite writes2[] = { 2471 MockWrite writes2[] = {
2376 CreateMockWrite(*req2, 1), 2472 CreateMockWrite(*req2, 1),
2377 }; 2473 };
2378 MockRead reads2[] = { 2474 MockRead reads2[] = {
2379 CreateMockRead(*resp2, 2), 2475 CreateMockRead(*resp2, 2),
2380 CreateMockRead(*body2, 3), 2476 CreateMockRead(*body2, 3),
2381 MockRead(ASYNC, 0, 0, 4) // EOF 2477 MockRead(ASYNC, 0, 0, 4) // EOF
2382 }; 2478 };
2383 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2479 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2384 SequencedSocketData data2(reads2, arraysize(reads2), writes2, 2480 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
2417 2513
2418 // Send a spdy request to www.example.org. Get a pushed stream that redirects to 2514 // Send a spdy request to www.example.org. Get a pushed stream that redirects to
2419 // www.foo.com. 2515 // www.foo.com.
2420 TEST_P(SpdyNetworkTransactionTest, DISABLED_RedirectServerPush) { 2516 TEST_P(SpdyNetworkTransactionTest, DISABLED_RedirectServerPush) {
2421 scoped_ptr<SpdyHeaderBlock> headers( 2517 scoped_ptr<SpdyHeaderBlock> headers(
2422 spdy_util_.ConstructGetHeaderBlock(GetDefaultUrl())); 2518 spdy_util_.ConstructGetHeaderBlock(GetDefaultUrl()));
2423 (*headers)["user-agent"] = ""; 2519 (*headers)["user-agent"] = "";
2424 (*headers)["accept-encoding"] = "gzip, deflate"; 2520 (*headers)["accept-encoding"] = "gzip, deflate";
2425 2521
2426 // Setup writes/reads to www.example.org 2522 // Setup writes/reads to www.example.org
2427 scoped_ptr<SpdyFrame> req( 2523 scoped_ptr<SpdySerializedFrame> req(
2428 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, true)); 2524 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, true));
2429 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2525 scoped_ptr<SpdySerializedFrame> resp(
2430 scoped_ptr<SpdyFrame> rep(spdy_util_.ConstructSpdyPush( 2526 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2527 scoped_ptr<SpdySerializedFrame> rep(spdy_util_.ConstructSpdyPush(
2431 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str(), 2528 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str(),
2432 "301 Moved Permanently", "http://www.foo.com/index.php")); 2529 "301 Moved Permanently", "http://www.foo.com/index.php"));
2433 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2530 scoped_ptr<SpdySerializedFrame> body(
2434 scoped_ptr<SpdyFrame> rst( 2531 spdy_util_.ConstructSpdyBodyFrame(1, true));
2532 scoped_ptr<SpdySerializedFrame> rst(
2435 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); 2533 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_CANCEL));
2436 MockWrite writes[] = { 2534 MockWrite writes[] = {
2437 CreateMockWrite(*req, 1), 2535 CreateMockWrite(*req, 1),
2438 CreateMockWrite(*rst, 6), 2536 CreateMockWrite(*rst, 6),
2439 }; 2537 };
2440 MockRead reads[] = { 2538 MockRead reads[] = {
2441 CreateMockRead(*resp, 2), 2539 CreateMockRead(*resp, 2),
2442 CreateMockRead(*rep, 3), 2540 CreateMockRead(*rep, 3),
2443 CreateMockRead(*body, 4), 2541 CreateMockRead(*body, 4),
2444 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause 2542 MockRead(ASYNC, ERR_IO_PENDING, 5), // Force a pause
2445 MockRead(ASYNC, 0, 0, 7) // EOF 2543 MockRead(ASYNC, 0, 0, 7) // EOF
2446 }; 2544 };
2447 2545
2448 // Setup writes/reads to www.foo.com 2546 // Setup writes/reads to www.foo.com
2449 scoped_ptr<SpdyHeaderBlock> headers2( 2547 scoped_ptr<SpdyHeaderBlock> headers2(
2450 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php")); 2548 spdy_util_.ConstructGetHeaderBlock("http://www.foo.com/index.php"));
2451 (*headers2)["user-agent"] = ""; 2549 (*headers2)["user-agent"] = "";
2452 (*headers2)["accept-encoding"] = "gzip, deflate"; 2550 (*headers2)["accept-encoding"] = "gzip, deflate";
2453 scoped_ptr<SpdyFrame> req2( 2551 scoped_ptr<SpdySerializedFrame> req2(
2454 spdy_util_.ConstructSpdySyn(1, *headers2, LOWEST, true)); 2552 spdy_util_.ConstructSpdySyn(1, *headers2, LOWEST, true));
2455 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2553 scoped_ptr<SpdySerializedFrame> resp2(
2456 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2554 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2555 scoped_ptr<SpdySerializedFrame> body2(
2556 spdy_util_.ConstructSpdyBodyFrame(1, true));
2457 MockWrite writes2[] = { 2557 MockWrite writes2[] = {
2458 CreateMockWrite(*req2, 1), 2558 CreateMockWrite(*req2, 1),
2459 }; 2559 };
2460 MockRead reads2[] = { 2560 MockRead reads2[] = {
2461 CreateMockRead(*resp2, 2), 2561 CreateMockRead(*resp2, 2),
2462 CreateMockRead(*body2, 3), 2562 CreateMockRead(*body2, 3),
2463 MockRead(ASYNC, 0, 0, 5) // EOF 2563 MockRead(ASYNC, 0, 0, 5) // EOF
2464 }; 2564 };
2465 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2565 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2466 SequencedSocketData data2(reads2, arraysize(reads2), writes2, 2566 SequencedSocketData data2(reads2, arraysize(reads2), writes2,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2501 std::string contents2("hello!"); 2601 std::string contents2("hello!");
2502 EXPECT_EQ(contents2, d2.data_received()); 2602 EXPECT_EQ(contents2, d2.data_received());
2503 } 2603 }
2504 EXPECT_TRUE(data.AllReadDataConsumed()); 2604 EXPECT_TRUE(data.AllReadDataConsumed());
2505 EXPECT_TRUE(data.AllWriteDataConsumed()); 2605 EXPECT_TRUE(data.AllWriteDataConsumed());
2506 EXPECT_TRUE(data2.AllReadDataConsumed()); 2606 EXPECT_TRUE(data2.AllReadDataConsumed());
2507 EXPECT_TRUE(data2.AllWriteDataConsumed()); 2607 EXPECT_TRUE(data2.AllWriteDataConsumed());
2508 } 2608 }
2509 2609
2510 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) { 2610 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame) {
2511 scoped_ptr<SpdyFrame> stream1_syn( 2611 scoped_ptr<SpdySerializedFrame> stream1_syn(
2512 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2612 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2513 scoped_ptr<SpdyFrame> stream1_body( 2613 scoped_ptr<SpdySerializedFrame> stream1_body(
2514 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2614 spdy_util_.ConstructSpdyBodyFrame(1, true));
2515 MockWrite writes[] = { 2615 MockWrite writes[] = {
2516 CreateMockWrite(*stream1_syn, 0), 2616 CreateMockWrite(*stream1_syn, 0),
2517 }; 2617 };
2518 2618
2519 scoped_ptr<SpdyFrame> 2619 scoped_ptr<SpdySerializedFrame> stream1_reply(
2520 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2620 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2521 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2621 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2522 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2622 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2523 const char kPushedData[] = "pushed"; 2623 const char kPushedData[] = "pushed";
2524 scoped_ptr<SpdyFrame> stream2_body( 2624 scoped_ptr<SpdySerializedFrame> stream2_body(
2525 spdy_util_.ConstructSpdyBodyFrame( 2625 spdy_util_.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
2526 2, kPushedData, strlen(kPushedData), true)); 2626 true));
2527 MockRead reads[] = { 2627 MockRead reads[] = {
2528 CreateMockRead(*stream1_reply, 1), 2628 CreateMockRead(*stream1_reply, 1),
2529 CreateMockRead(*stream2_syn, 2), 2629 CreateMockRead(*stream2_syn, 2),
2530 CreateMockRead(*stream1_body, 3, SYNCHRONOUS), 2630 CreateMockRead(*stream1_body, 3, SYNCHRONOUS),
2531 CreateMockRead(*stream2_body, 4), 2631 CreateMockRead(*stream2_body, 4),
2532 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2632 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2533 }; 2633 };
2534 2634
2535 HttpResponseInfo response; 2635 HttpResponseInfo response;
2536 HttpResponseInfo response2; 2636 HttpResponseInfo response2;
2537 std::string expected_push_result("pushed"); 2637 std::string expected_push_result("pushed");
2538 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2638 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2539 RunServerPushTest(&data, 2639 RunServerPushTest(&data,
2540 &response, 2640 &response,
2541 &response2, 2641 &response2,
2542 expected_push_result); 2642 expected_push_result);
2543 2643
2544 // Verify the SYN_REPLY. 2644 // Verify the SYN_REPLY.
2545 EXPECT_TRUE(response.headers.get() != NULL); 2645 EXPECT_TRUE(response.headers.get() != NULL);
2546 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2646 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2547 2647
2548 // Verify the pushed stream. 2648 // Verify the pushed stream.
2549 EXPECT_TRUE(response2.headers.get() != NULL); 2649 EXPECT_TRUE(response2.headers.get() != NULL);
2550 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2650 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2551 } 2651 }
2552 2652
2553 TEST_P(SpdyNetworkTransactionTest, ServerPushBeforeSynReply) { 2653 TEST_P(SpdyNetworkTransactionTest, ServerPushBeforeSynReply) {
2554 scoped_ptr<SpdyFrame> stream1_syn( 2654 scoped_ptr<SpdySerializedFrame> stream1_syn(
2555 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2655 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2556 MockWrite writes[] = { 2656 MockWrite writes[] = {
2557 CreateMockWrite(*stream1_syn, 0), 2657 CreateMockWrite(*stream1_syn, 0),
2558 }; 2658 };
2559 2659
2560 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2660 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2561 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2661 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2562 scoped_ptr<SpdyFrame> 2662 scoped_ptr<SpdySerializedFrame> stream1_reply(
2563 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2663 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2564 scoped_ptr<SpdyFrame> stream1_body( 2664 scoped_ptr<SpdySerializedFrame> stream1_body(
2565 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2665 spdy_util_.ConstructSpdyBodyFrame(1, true));
2566 const char kPushedData[] = "pushed"; 2666 const char kPushedData[] = "pushed";
2567 scoped_ptr<SpdyFrame> stream2_body( 2667 scoped_ptr<SpdySerializedFrame> stream2_body(
2568 spdy_util_.ConstructSpdyBodyFrame( 2668 spdy_util_.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
2569 2, kPushedData, strlen(kPushedData), true)); 2669 true));
2570 MockRead reads[] = { 2670 MockRead reads[] = {
2571 CreateMockRead(*stream2_syn, 1), 2671 CreateMockRead(*stream2_syn, 1),
2572 CreateMockRead(*stream1_reply, 2), 2672 CreateMockRead(*stream1_reply, 2),
2573 CreateMockRead(*stream1_body, 3, SYNCHRONOUS), 2673 CreateMockRead(*stream1_body, 3, SYNCHRONOUS),
2574 CreateMockRead(*stream2_body, 4), 2674 CreateMockRead(*stream2_body, 4),
2575 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2675 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2576 }; 2676 };
2577 2677
2578 HttpResponseInfo response; 2678 HttpResponseInfo response;
2579 HttpResponseInfo response2; 2679 HttpResponseInfo response2;
2580 std::string expected_push_result("pushed"); 2680 std::string expected_push_result("pushed");
2581 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2681 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2582 RunServerPushTest(&data, 2682 RunServerPushTest(&data,
2583 &response, 2683 &response,
2584 &response2, 2684 &response2,
2585 expected_push_result); 2685 expected_push_result);
2586 2686
2587 // Verify the SYN_REPLY. 2687 // Verify the SYN_REPLY.
2588 EXPECT_TRUE(response.headers.get() != NULL); 2688 EXPECT_TRUE(response.headers.get() != NULL);
2589 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2689 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2590 2690
2591 // Verify the pushed stream. 2691 // Verify the pushed stream.
2592 EXPECT_TRUE(response2.headers.get() != NULL); 2692 EXPECT_TRUE(response2.headers.get() != NULL);
2593 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2693 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2594 } 2694 }
2595 2695
2596 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) { 2696 TEST_P(SpdyNetworkTransactionTest, ServerPushSingleDataFrame2) {
2597 scoped_ptr<SpdyFrame> stream1_syn( 2697 scoped_ptr<SpdySerializedFrame> stream1_syn(
2598 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2698 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2599 MockWrite writes[] = { 2699 MockWrite writes[] = {
2600 CreateMockWrite(*stream1_syn, 0), 2700 CreateMockWrite(*stream1_syn, 0),
2601 }; 2701 };
2602 2702
2603 scoped_ptr<SpdyFrame> 2703 scoped_ptr<SpdySerializedFrame> stream1_reply(
2604 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2704 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2605 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2705 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2606 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2706 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2607 const char kPushedData[] = "pushed"; 2707 const char kPushedData[] = "pushed";
2608 scoped_ptr<SpdyFrame> stream2_body( 2708 scoped_ptr<SpdySerializedFrame> stream2_body(
2609 spdy_util_.ConstructSpdyBodyFrame( 2709 spdy_util_.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
2610 2, kPushedData, strlen(kPushedData), true)); 2710 true));
2611 scoped_ptr<SpdyFrame> 2711 scoped_ptr<SpdySerializedFrame> stream1_body(
2612 stream1_body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 2712 spdy_util_.ConstructSpdyBodyFrame(1, true));
2613 MockRead reads[] = { 2713 MockRead reads[] = {
2614 CreateMockRead(*stream1_reply, 1), 2714 CreateMockRead(*stream1_reply, 1),
2615 CreateMockRead(*stream2_syn, 2), 2715 CreateMockRead(*stream2_syn, 2),
2616 CreateMockRead(*stream2_body, 3), 2716 CreateMockRead(*stream2_body, 3),
2617 CreateMockRead(*stream1_body, 4, SYNCHRONOUS), 2717 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
2618 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2718 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2619 }; 2719 };
2620 2720
2621 HttpResponseInfo response; 2721 HttpResponseInfo response;
2622 HttpResponseInfo response2; 2722 HttpResponseInfo response2;
2623 std::string expected_push_result("pushed"); 2723 std::string expected_push_result("pushed");
2624 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2724 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2625 RunServerPushTest(&data, 2725 RunServerPushTest(&data,
2626 &response, 2726 &response,
2627 &response2, 2727 &response2,
2628 expected_push_result); 2728 expected_push_result);
2629 2729
2630 // Verify the SYN_REPLY. 2730 // Verify the SYN_REPLY.
2631 EXPECT_TRUE(response.headers.get() != NULL); 2731 EXPECT_TRUE(response.headers.get() != NULL);
2632 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2732 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2633 2733
2634 // Verify the pushed stream. 2734 // Verify the pushed stream.
2635 EXPECT_TRUE(response2.headers.get() != NULL); 2735 EXPECT_TRUE(response2.headers.get() != NULL);
2636 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2736 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2637 } 2737 }
2638 2738
2639 TEST_P(SpdyNetworkTransactionTest, ServerPushServerAborted) { 2739 TEST_P(SpdyNetworkTransactionTest, ServerPushServerAborted) {
2640 scoped_ptr<SpdyFrame> stream1_syn( 2740 scoped_ptr<SpdySerializedFrame> stream1_syn(
2641 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2741 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2642 scoped_ptr<SpdyFrame> stream1_body( 2742 scoped_ptr<SpdySerializedFrame> stream1_body(
2643 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2743 spdy_util_.ConstructSpdyBodyFrame(1, true));
2644 MockWrite writes[] = { 2744 MockWrite writes[] = {
2645 CreateMockWrite(*stream1_syn, 0), 2745 CreateMockWrite(*stream1_syn, 0),
2646 }; 2746 };
2647 2747
2648 scoped_ptr<SpdyFrame> 2748 scoped_ptr<SpdySerializedFrame> stream1_reply(
2649 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2749 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2650 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2750 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2651 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2751 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2652 scoped_ptr<SpdyFrame> stream2_rst( 2752 scoped_ptr<SpdySerializedFrame> stream2_rst(
2653 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 2753 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2654 MockRead reads[] = { 2754 MockRead reads[] = {
2655 CreateMockRead(*stream1_reply, 1), 2755 CreateMockRead(*stream1_reply, 1),
2656 CreateMockRead(*stream2_syn, 2), 2756 CreateMockRead(*stream2_syn, 2),
2657 CreateMockRead(*stream2_rst, 3), 2757 CreateMockRead(*stream2_rst, 3),
2658 CreateMockRead(*stream1_body, 4, SYNCHRONOUS), 2758 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
2659 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 2759 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2660 }; 2760 };
2661 2761
2662 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2762 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
(...skipping 19 matching lines...) Expand all
2682 2782
2683 // Verify the SYN_REPLY. 2783 // Verify the SYN_REPLY.
2684 HttpResponseInfo response = *trans->GetResponseInfo(); 2784 HttpResponseInfo response = *trans->GetResponseInfo();
2685 EXPECT_TRUE(response.headers.get() != NULL); 2785 EXPECT_TRUE(response.headers.get() != NULL);
2686 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2786 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2687 } 2787 }
2688 2788
2689 // Verify that we don't leak streams and that we properly send a reset 2789 // Verify that we don't leak streams and that we properly send a reset
2690 // if the server pushes the same stream twice. 2790 // if the server pushes the same stream twice.
2691 TEST_P(SpdyNetworkTransactionTest, ServerPushDuplicate) { 2791 TEST_P(SpdyNetworkTransactionTest, ServerPushDuplicate) {
2692 scoped_ptr<SpdyFrame> stream1_syn( 2792 scoped_ptr<SpdySerializedFrame> stream1_syn(
2693 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2793 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2694 scoped_ptr<SpdyFrame> stream1_body( 2794 scoped_ptr<SpdySerializedFrame> stream1_body(
2695 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2795 spdy_util_.ConstructSpdyBodyFrame(1, true));
2696 scoped_ptr<SpdyFrame> stream3_rst( 2796 scoped_ptr<SpdySerializedFrame> stream3_rst(
2697 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR)); 2797 spdy_util_.ConstructSpdyRstStream(4, RST_STREAM_PROTOCOL_ERROR));
2698 MockWrite writes[] = { 2798 MockWrite writes[] = {
2699 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream3_rst, 4), 2799 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream3_rst, 4),
2700 }; 2800 };
2701 2801
2702 scoped_ptr<SpdyFrame> 2802 scoped_ptr<SpdySerializedFrame> stream1_reply(
2703 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2803 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2704 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2804 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2705 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2805 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2706 const char kPushedData[] = "pushed"; 2806 const char kPushedData[] = "pushed";
2707 scoped_ptr<SpdyFrame> stream2_body( 2807 scoped_ptr<SpdySerializedFrame> stream2_body(
2708 spdy_util_.ConstructSpdyBodyFrame( 2808 spdy_util_.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
2709 2, kPushedData, strlen(kPushedData), true)); 2809 true));
2710 scoped_ptr<SpdyFrame> stream3_syn(spdy_util_.ConstructSpdyPush( 2810 scoped_ptr<SpdySerializedFrame> stream3_syn(spdy_util_.ConstructSpdyPush(
2711 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2811 NULL, 0, 4, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2712 MockRead reads[] = { 2812 MockRead reads[] = {
2713 CreateMockRead(*stream1_reply, 1), 2813 CreateMockRead(*stream1_reply, 1),
2714 CreateMockRead(*stream2_syn, 2), 2814 CreateMockRead(*stream2_syn, 2),
2715 CreateMockRead(*stream3_syn, 3), 2815 CreateMockRead(*stream3_syn, 3),
2716 CreateMockRead(*stream1_body, 5), 2816 CreateMockRead(*stream1_body, 5),
2717 CreateMockRead(*stream2_body, 6), 2817 CreateMockRead(*stream2_body, 6),
2718 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause 2818 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 7), // Force a pause
2719 }; 2819 };
2720 2820
2721 HttpResponseInfo response; 2821 HttpResponseInfo response;
2722 HttpResponseInfo response2; 2822 HttpResponseInfo response2;
2723 std::string expected_push_result("pushed"); 2823 std::string expected_push_result("pushed");
2724 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2824 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2725 RunServerPushTest(&data, 2825 RunServerPushTest(&data,
2726 &response, 2826 &response,
2727 &response2, 2827 &response2,
2728 expected_push_result); 2828 expected_push_result);
2729 2829
2730 // Verify the SYN_REPLY. 2830 // Verify the SYN_REPLY.
2731 EXPECT_TRUE(response.headers.get() != NULL); 2831 EXPECT_TRUE(response.headers.get() != NULL);
2732 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2832 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2733 2833
2734 // Verify the pushed stream. 2834 // Verify the pushed stream.
2735 EXPECT_TRUE(response2.headers.get() != NULL); 2835 EXPECT_TRUE(response2.headers.get() != NULL);
2736 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2836 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2737 } 2837 }
2738 2838
2739 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) { 2839 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrame) {
2740 scoped_ptr<SpdyFrame> stream1_syn( 2840 scoped_ptr<SpdySerializedFrame> stream1_syn(
2741 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2841 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2742 scoped_ptr<SpdyFrame> stream1_body( 2842 scoped_ptr<SpdySerializedFrame> stream1_body(
2743 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2843 spdy_util_.ConstructSpdyBodyFrame(1, true));
2744 MockWrite writes[] = { 2844 MockWrite writes[] = {
2745 CreateMockWrite(*stream1_syn, 0), 2845 CreateMockWrite(*stream1_syn, 0),
2746 }; 2846 };
2747 2847
2748 scoped_ptr<SpdyFrame> 2848 scoped_ptr<SpdySerializedFrame> stream1_reply(
2749 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2849 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2750 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2850 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2751 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2851 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2752 static const char kPushedData[] = "pushed my darling hello my baby"; 2852 static const char kPushedData[] = "pushed my darling hello my baby";
2753 scoped_ptr<SpdyFrame> stream2_body_base( 2853 scoped_ptr<SpdySerializedFrame> stream2_body_base(
2754 spdy_util_.ConstructSpdyBodyFrame( 2854 spdy_util_.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
2755 2, kPushedData, strlen(kPushedData), true)); 2855 true));
2756 const size_t kChunkSize = strlen(kPushedData) / 4; 2856 const size_t kChunkSize = strlen(kPushedData) / 4;
2757 scoped_ptr<SpdyFrame> stream2_body1( 2857 scoped_ptr<SpdySerializedFrame> stream2_body1(
2758 new SpdyFrame(stream2_body_base->data(), kChunkSize, false)); 2858 new SpdySerializedFrame(stream2_body_base->data(), kChunkSize, false));
2759 scoped_ptr<SpdyFrame> stream2_body2( 2859 scoped_ptr<SpdySerializedFrame> stream2_body2(new SpdySerializedFrame(
2760 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false)); 2860 stream2_body_base->data() + kChunkSize, kChunkSize, false));
2761 scoped_ptr<SpdyFrame> stream2_body3( 2861 scoped_ptr<SpdySerializedFrame> stream2_body3(new SpdySerializedFrame(
2762 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize, 2862 stream2_body_base->data() + 2 * kChunkSize, kChunkSize, false));
2763 kChunkSize, false)); 2863 scoped_ptr<SpdySerializedFrame> stream2_body4(new SpdySerializedFrame(
2764 scoped_ptr<SpdyFrame> stream2_body4( 2864 stream2_body_base->data() + 3 * kChunkSize,
2765 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize, 2865 stream2_body_base->size() - 3 * kChunkSize, false));
2766 stream2_body_base->size() - 3 * kChunkSize, false));
2767 MockRead reads[] = { 2866 MockRead reads[] = {
2768 CreateMockRead(*stream1_reply, 1), 2867 CreateMockRead(*stream1_reply, 1),
2769 CreateMockRead(*stream2_syn, 2), 2868 CreateMockRead(*stream2_syn, 2),
2770 CreateMockRead(*stream2_body1, 3), 2869 CreateMockRead(*stream2_body1, 3),
2771 CreateMockRead(*stream2_body2, 4), 2870 CreateMockRead(*stream2_body2, 4),
2772 CreateMockRead(*stream2_body3, 5), 2871 CreateMockRead(*stream2_body3, 5),
2773 CreateMockRead(*stream2_body4, 6), 2872 CreateMockRead(*stream2_body4, 6),
2774 CreateMockRead(*stream1_body, 7, SYNCHRONOUS), 2873 CreateMockRead(*stream1_body, 7, SYNCHRONOUS),
2775 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause 2874 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8), // Force a pause
2776 }; 2875 };
2777 2876
2778 HttpResponseInfo response; 2877 HttpResponseInfo response;
2779 HttpResponseInfo response2; 2878 HttpResponseInfo response2;
2780 std::string expected_push_result("pushed my darling hello my baby"); 2879 std::string expected_push_result("pushed my darling hello my baby");
2781 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2880 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2782 RunServerPushTest(&data, &response, &response2, kPushedData); 2881 RunServerPushTest(&data, &response, &response2, kPushedData);
2783 2882
2784 // Verify the SYN_REPLY. 2883 // Verify the SYN_REPLY.
2785 EXPECT_TRUE(response.headers.get() != NULL); 2884 EXPECT_TRUE(response.headers.get() != NULL);
2786 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2885 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2787 2886
2788 // Verify the pushed stream. 2887 // Verify the pushed stream.
2789 EXPECT_TRUE(response2.headers.get() != NULL); 2888 EXPECT_TRUE(response2.headers.get() != NULL);
2790 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2889 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2791 } 2890 }
2792 2891
2793 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) { 2892 TEST_P(SpdyNetworkTransactionTest, ServerPushMultipleDataFrameInterrupted) {
2794 scoped_ptr<SpdyFrame> stream1_syn( 2893 scoped_ptr<SpdySerializedFrame> stream1_syn(
2795 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2894 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2796 scoped_ptr<SpdyFrame> stream1_body( 2895 scoped_ptr<SpdySerializedFrame> stream1_body(
2797 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2896 spdy_util_.ConstructSpdyBodyFrame(1, true));
2798 MockWrite writes[] = { 2897 MockWrite writes[] = {
2799 CreateMockWrite(*stream1_syn, 0), 2898 CreateMockWrite(*stream1_syn, 0),
2800 }; 2899 };
2801 2900
2802 scoped_ptr<SpdyFrame> 2901 scoped_ptr<SpdySerializedFrame> stream1_reply(
2803 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2902 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2804 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2903 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2805 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 2904 NULL, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
2806 static const char kPushedData[] = "pushed my darling hello my baby"; 2905 static const char kPushedData[] = "pushed my darling hello my baby";
2807 scoped_ptr<SpdyFrame> stream2_body_base( 2906 scoped_ptr<SpdySerializedFrame> stream2_body_base(
2808 spdy_util_.ConstructSpdyBodyFrame( 2907 spdy_util_.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
2809 2, kPushedData, strlen(kPushedData), true)); 2908 true));
2810 const size_t kChunkSize = strlen(kPushedData) / 4; 2909 const size_t kChunkSize = strlen(kPushedData) / 4;
2811 scoped_ptr<SpdyFrame> stream2_body1( 2910 scoped_ptr<SpdySerializedFrame> stream2_body1(
2812 new SpdyFrame(stream2_body_base->data(), kChunkSize, false)); 2911 new SpdySerializedFrame(stream2_body_base->data(), kChunkSize, false));
2813 scoped_ptr<SpdyFrame> stream2_body2( 2912 scoped_ptr<SpdySerializedFrame> stream2_body2(new SpdySerializedFrame(
2814 new SpdyFrame(stream2_body_base->data() + kChunkSize, kChunkSize, false)); 2913 stream2_body_base->data() + kChunkSize, kChunkSize, false));
2815 scoped_ptr<SpdyFrame> stream2_body3( 2914 scoped_ptr<SpdySerializedFrame> stream2_body3(new SpdySerializedFrame(
2816 new SpdyFrame(stream2_body_base->data() + 2 * kChunkSize, 2915 stream2_body_base->data() + 2 * kChunkSize, kChunkSize, false));
2817 kChunkSize, false)); 2916 scoped_ptr<SpdySerializedFrame> stream2_body4(new SpdySerializedFrame(
2818 scoped_ptr<SpdyFrame> stream2_body4( 2917 stream2_body_base->data() + 3 * kChunkSize,
2819 new SpdyFrame(stream2_body_base->data() + 3 * kChunkSize, 2918 stream2_body_base->size() - 3 * kChunkSize, false));
2820 stream2_body_base->size() - 3 * kChunkSize, false));
2821 MockRead reads[] = { 2919 MockRead reads[] = {
2822 CreateMockRead(*stream1_reply, 1), 2920 CreateMockRead(*stream1_reply, 1),
2823 CreateMockRead(*stream2_syn, 2), 2921 CreateMockRead(*stream2_syn, 2),
2824 CreateMockRead(*stream2_body1, 3), 2922 CreateMockRead(*stream2_body1, 3),
2825 CreateMockRead(*stream2_body2, 4), 2923 CreateMockRead(*stream2_body2, 4),
2826 CreateMockRead(*stream2_body3, 5), 2924 CreateMockRead(*stream2_body3, 5),
2827 CreateMockRead(*stream2_body4, 6), 2925 CreateMockRead(*stream2_body4, 6),
2828 CreateMockRead(*stream1_body.get(), 7, SYNCHRONOUS), 2926 CreateMockRead(*stream1_body.get(), 7, SYNCHRONOUS),
2829 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8) // Force a pause. 2927 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 8) // Force a pause.
2830 }; 2928 };
2831 2929
2832 HttpResponseInfo response; 2930 HttpResponseInfo response;
2833 HttpResponseInfo response2; 2931 HttpResponseInfo response2;
2834 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2932 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2835 RunServerPushTest(&data, &response, &response2, kPushedData); 2933 RunServerPushTest(&data, &response, &response2, kPushedData);
2836 2934
2837 // Verify the SYN_REPLY. 2935 // Verify the SYN_REPLY.
2838 EXPECT_TRUE(response.headers.get() != NULL); 2936 EXPECT_TRUE(response.headers.get() != NULL);
2839 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2937 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2840 2938
2841 // Verify the pushed stream. 2939 // Verify the pushed stream.
2842 EXPECT_TRUE(response2.headers.get() != NULL); 2940 EXPECT_TRUE(response2.headers.get() != NULL);
2843 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 2941 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
2844 } 2942 }
2845 2943
2846 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) { 2944 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID0) {
2847 scoped_ptr<SpdyFrame> stream1_syn( 2945 scoped_ptr<SpdySerializedFrame> stream1_syn(
2848 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2946 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2849 scoped_ptr<SpdyFrame> goaway; 2947 scoped_ptr<SpdySerializedFrame> goaway;
2850 if (spdy_util_.spdy_version() == SPDY3) { 2948 if (spdy_util_.spdy_version() == SPDY3) {
2851 goaway.reset(spdy_util_.ConstructSpdyGoAway(0, GOAWAY_PROTOCOL_ERROR, 2949 goaway.reset(spdy_util_.ConstructSpdyGoAway(0, GOAWAY_PROTOCOL_ERROR,
2852 "Push on even stream id.")); 2950 "Push on even stream id."));
2853 } else { 2951 } else {
2854 goaway.reset(spdy_util_.ConstructSpdyGoAway( 2952 goaway.reset(spdy_util_.ConstructSpdyGoAway(
2855 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_CONTROL_FRAME).")); 2953 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_CONTROL_FRAME)."));
2856 } 2954 }
2857 MockWrite writes[] = { 2955 MockWrite writes[] = {
2858 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*goaway, 3), 2956 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*goaway, 3),
2859 }; 2957 };
2860 2958
2861 scoped_ptr<SpdyFrame> 2959 scoped_ptr<SpdySerializedFrame> stream1_reply(
2862 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 2960 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2863 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 2961 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2864 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str())); 2962 NULL, 0, 2, 0, GetDefaultUrlWithPath("/foo.dat").c_str()));
2865 MockRead reads[] = { 2963 MockRead reads[] = {
2866 CreateMockRead(*stream1_reply, 1), 2964 CreateMockRead(*stream1_reply, 1),
2867 CreateMockRead(*stream2_syn, 2), 2965 CreateMockRead(*stream2_syn, 2),
2868 }; 2966 };
2869 2967
2870 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 2968 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2871 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 2969 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2872 BoundNetLog(), GetParam(), NULL); 2970 BoundNetLog(), GetParam(), NULL);
2873 2971
(...skipping 14 matching lines...) Expand all
2888 EXPECT_TRUE(data.AllReadDataConsumed()); 2986 EXPECT_TRUE(data.AllReadDataConsumed());
2889 EXPECT_TRUE(data.AllWriteDataConsumed()); 2987 EXPECT_TRUE(data.AllWriteDataConsumed());
2890 2988
2891 // Verify the SYN_REPLY. 2989 // Verify the SYN_REPLY.
2892 HttpResponseInfo response = *trans->GetResponseInfo(); 2990 HttpResponseInfo response = *trans->GetResponseInfo();
2893 EXPECT_TRUE(response.headers.get() != NULL); 2991 EXPECT_TRUE(response.headers.get() != NULL);
2894 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 2992 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2895 } 2993 }
2896 2994
2897 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) { 2995 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidAssociatedStreamID9) {
2898 scoped_ptr<SpdyFrame> stream1_syn( 2996 scoped_ptr<SpdySerializedFrame> stream1_syn(
2899 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 2997 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2900 scoped_ptr<SpdyFrame> stream1_body( 2998 scoped_ptr<SpdySerializedFrame> stream1_body(
2901 spdy_util_.ConstructSpdyBodyFrame(1, true)); 2999 spdy_util_.ConstructSpdyBodyFrame(1, true));
2902 scoped_ptr<SpdyFrame> stream2_rst( 3000 scoped_ptr<SpdySerializedFrame> stream2_rst(
2903 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); 3001 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM));
2904 MockWrite writes[] = { 3002 MockWrite writes[] = {
2905 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3), 3003 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3),
2906 }; 3004 };
2907 3005
2908 scoped_ptr<SpdyFrame> 3006 scoped_ptr<SpdySerializedFrame> stream1_reply(
2909 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3007 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2910 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 3008 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
2911 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str())); 3009 NULL, 0, 2, 9, GetDefaultUrlWithPath("/foo.dat").c_str()));
2912 MockRead reads[] = { 3010 MockRead reads[] = {
2913 CreateMockRead(*stream1_reply, 1), 3011 CreateMockRead(*stream1_reply, 1),
2914 CreateMockRead(*stream2_syn, 2), 3012 CreateMockRead(*stream2_syn, 2),
2915 CreateMockRead(*stream1_body, 4), 3013 CreateMockRead(*stream1_body, 4),
2916 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause 3014 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), // Force a pause
2917 }; 3015 };
2918 3016
2919 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3017 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2920 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3018 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
(...skipping 16 matching lines...) Expand all
2937 EXPECT_TRUE(data.AllReadDataConsumed()); 3035 EXPECT_TRUE(data.AllReadDataConsumed());
2938 EXPECT_TRUE(data.AllWriteDataConsumed()); 3036 EXPECT_TRUE(data.AllWriteDataConsumed());
2939 3037
2940 // Verify the SYN_REPLY. 3038 // Verify the SYN_REPLY.
2941 HttpResponseInfo response = *trans->GetResponseInfo(); 3039 HttpResponseInfo response = *trans->GetResponseInfo();
2942 EXPECT_TRUE(response.headers.get() != NULL); 3040 EXPECT_TRUE(response.headers.get() != NULL);
2943 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 3041 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2944 } 3042 }
2945 3043
2946 TEST_P(SpdyNetworkTransactionTest, ServerPushNoURL) { 3044 TEST_P(SpdyNetworkTransactionTest, ServerPushNoURL) {
2947 scoped_ptr<SpdyFrame> stream1_syn( 3045 scoped_ptr<SpdySerializedFrame> stream1_syn(
2948 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3046 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
2949 scoped_ptr<SpdyFrame> stream1_body( 3047 scoped_ptr<SpdySerializedFrame> stream1_body(
2950 spdy_util_.ConstructSpdyBodyFrame(1, true)); 3048 spdy_util_.ConstructSpdyBodyFrame(1, true));
2951 scoped_ptr<SpdyFrame> stream2_rst( 3049 scoped_ptr<SpdySerializedFrame> stream2_rst(
2952 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR)); 3050 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_PROTOCOL_ERROR));
2953 MockWrite writes[] = { 3051 MockWrite writes[] = {
2954 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3), 3052 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*stream2_rst, 3),
2955 }; 3053 };
2956 3054
2957 scoped_ptr<SpdyFrame> 3055 scoped_ptr<SpdySerializedFrame> stream1_reply(
2958 stream1_reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3056 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
2959 scoped_ptr<SpdyHeaderBlock> incomplete_headers(new SpdyHeaderBlock()); 3057 scoped_ptr<SpdyHeaderBlock> incomplete_headers(new SpdyHeaderBlock());
2960 (*incomplete_headers)[spdy_util_.GetStatusKey()] = "200 OK"; 3058 (*incomplete_headers)[spdy_util_.GetStatusKey()] = "200 OK";
2961 (*incomplete_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 3059 (*incomplete_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
2962 (*incomplete_headers)["hello"] = "bye"; 3060 (*incomplete_headers)["hello"] = "bye";
2963 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 3061 scoped_ptr<SpdySerializedFrame> stream2_syn(
2964 std::move(incomplete_headers), 2, 1)); 3062 spdy_util_.ConstructInitialSpdyPushFrame(std::move(incomplete_headers), 2,
3063 1));
2965 MockRead reads[] = { 3064 MockRead reads[] = {
2966 CreateMockRead(*stream1_reply, 1), 3065 CreateMockRead(*stream1_reply, 1),
2967 CreateMockRead(*stream2_syn, 2), 3066 CreateMockRead(*stream2_syn, 2),
2968 CreateMockRead(*stream1_body, 4), 3067 CreateMockRead(*stream1_body, 4),
2969 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause 3068 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5) // Force a pause
2970 }; 3069 };
2971 3070
2972 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3071 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
2973 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3072 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
2974 BoundNetLog(), GetParam(), NULL); 3073 BoundNetLog(), GetParam(), NULL);
(...skipping 16 matching lines...) Expand all
2991 EXPECT_TRUE(data.AllWriteDataConsumed()); 3090 EXPECT_TRUE(data.AllWriteDataConsumed());
2992 3091
2993 // Verify the SYN_REPLY. 3092 // Verify the SYN_REPLY.
2994 HttpResponseInfo response = *trans->GetResponseInfo(); 3093 HttpResponseInfo response = *trans->GetResponseInfo();
2995 EXPECT_TRUE(response.headers.get() != NULL); 3094 EXPECT_TRUE(response.headers.get() != NULL);
2996 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 3095 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
2997 } 3096 }
2998 3097
2999 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY. 3098 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY.
3000 TEST_P(SpdyNetworkTransactionTest, ServerPushOnPushedStream) { 3099 TEST_P(SpdyNetworkTransactionTest, ServerPushOnPushedStream) {
3001 scoped_ptr<SpdyFrame> stream1_syn( 3100 scoped_ptr<SpdySerializedFrame> stream1_syn(
3002 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3101 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3003 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3102 scoped_ptr<SpdySerializedFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3004 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id.")); 3103 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id."));
3005 MockWrite writes[] = { 3104 MockWrite writes[] = {
3006 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*goaway, 4), 3105 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*goaway, 4),
3007 }; 3106 };
3008 3107
3009 scoped_ptr<SpdyFrame> stream1_reply( 3108 scoped_ptr<SpdySerializedFrame> stream1_reply(
3010 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3109 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3011 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 3110 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
3012 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 3111 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
3013 scoped_ptr<SpdyFrame> stream3_syn(spdy_util_.ConstructSpdyPush( 3112 scoped_ptr<SpdySerializedFrame> stream3_syn(spdy_util_.ConstructSpdyPush(
3014 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str())); 3113 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str()));
3015 MockRead reads[] = { 3114 MockRead reads[] = {
3016 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2), 3115 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2),
3017 CreateMockRead(*stream3_syn, 3), 3116 CreateMockRead(*stream3_syn, 3),
3018 }; 3117 };
3019 3118
3020 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3119 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3021 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3120 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3022 BoundNetLog(), GetParam(), nullptr); 3121 BoundNetLog(), GetParam(), nullptr);
3023 helper.RunToCompletion(&data); 3122 helper.RunToCompletion(&data);
3024 } 3123 }
3025 3124
3026 // PUSH_PROMISE on a closed client-initiated stream should trigger RST_STREAM. 3125 // PUSH_PROMISE on a closed client-initiated stream should trigger RST_STREAM.
3027 TEST_P(SpdyNetworkTransactionTest, ServerPushOnClosedStream) { 3126 TEST_P(SpdyNetworkTransactionTest, ServerPushOnClosedStream) {
3028 scoped_ptr<SpdyFrame> stream1_syn( 3127 scoped_ptr<SpdySerializedFrame> stream1_syn(
3029 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3128 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3030 scoped_ptr<SpdyFrame> rst( 3129 scoped_ptr<SpdySerializedFrame> rst(
3031 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM)); 3130 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_INVALID_STREAM));
3032 MockWrite writes[] = { 3131 MockWrite writes[] = {
3033 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*rst, 5), 3132 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*rst, 5),
3034 }; 3133 };
3035 3134
3036 scoped_ptr<SpdyFrame> stream1_reply( 3135 scoped_ptr<SpdySerializedFrame> stream1_reply(
3037 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 3136 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
3038 scoped_ptr<SpdyFrame> stream1_body( 3137 scoped_ptr<SpdySerializedFrame> stream1_body(
3039 spdy_util_.ConstructSpdyBodyFrame(1, true)); 3138 spdy_util_.ConstructSpdyBodyFrame(1, true));
3040 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 3139 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
3041 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 3140 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
3042 MockRead reads[] = { 3141 MockRead reads[] = {
3043 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream1_body, 2), 3142 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream1_body, 2),
3044 CreateMockRead(*stream2_syn, 3), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4), 3143 CreateMockRead(*stream2_syn, 3), MockRead(SYNCHRONOUS, ERR_IO_PENDING, 4),
3045 }; 3144 };
3046 3145
3047 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3146 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3048 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3147 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3049 BoundNetLog(), GetParam(), nullptr); 3148 BoundNetLog(), GetParam(), nullptr);
3050 helper.RunPreTestSetup(); 3149 helper.RunPreTestSetup();
(...skipping 11 matching lines...) Expand all
3062 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 3161 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
3063 3162
3064 EXPECT_TRUE(data.AllReadDataConsumed()); 3163 EXPECT_TRUE(data.AllReadDataConsumed());
3065 EXPECT_TRUE(data.AllWriteDataConsumed()); 3164 EXPECT_TRUE(data.AllWriteDataConsumed());
3066 VerifyStreamsClosed(helper); 3165 VerifyStreamsClosed(helper);
3067 } 3166 }
3068 3167
3069 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY even if 3168 // PUSH_PROMISE on a server-initiated stream should trigger GOAWAY even if
3070 // stream is closed. 3169 // stream is closed.
3071 TEST_P(SpdyNetworkTransactionTest, ServerPushOnClosedPushedStream) { 3170 TEST_P(SpdyNetworkTransactionTest, ServerPushOnClosedPushedStream) {
3072 scoped_ptr<SpdyFrame> stream1_syn( 3171 scoped_ptr<SpdySerializedFrame> stream1_syn(
3073 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3172 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3074 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3173 scoped_ptr<SpdySerializedFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3075 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id.")); 3174 2, GOAWAY_PROTOCOL_ERROR, "Push on even stream id."));
3076 MockWrite writes[] = { 3175 MockWrite writes[] = {
3077 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*goaway, 7), 3176 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*goaway, 7),
3078 }; 3177 };
3079 3178
3080 scoped_ptr<SpdyFrame> stream1_reply( 3179 scoped_ptr<SpdySerializedFrame> stream1_reply(
3081 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 3180 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
3082 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructSpdyPush( 3181 scoped_ptr<SpdySerializedFrame> stream2_syn(spdy_util_.ConstructSpdyPush(
3083 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str())); 3182 nullptr, 0, 2, 1, GetDefaultUrlWithPath("/foo.dat").c_str()));
3084 scoped_ptr<SpdyFrame> stream1_body( 3183 scoped_ptr<SpdySerializedFrame> stream1_body(
3085 spdy_util_.ConstructSpdyBodyFrame(1, true)); 3184 spdy_util_.ConstructSpdyBodyFrame(1, true));
3086 const char kPushedData[] = "pushed"; 3185 const char kPushedData[] = "pushed";
3087 scoped_ptr<SpdyFrame> stream2_body(spdy_util_.ConstructSpdyBodyFrame( 3186 scoped_ptr<SpdySerializedFrame> stream2_body(
3088 2, kPushedData, strlen(kPushedData), true)); 3187 spdy_util_.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
3089 scoped_ptr<SpdyFrame> stream3_syn(spdy_util_.ConstructSpdyPush( 3188 true));
3189 scoped_ptr<SpdySerializedFrame> stream3_syn(spdy_util_.ConstructSpdyPush(
3090 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str())); 3190 nullptr, 0, 4, 2, GetDefaultUrlWithPath("/bar.dat").c_str()));
3091 3191
3092 MockRead reads[] = { 3192 MockRead reads[] = {
3093 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2), 3193 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2),
3094 CreateMockRead(*stream1_body, 3), CreateMockRead(*stream2_body, 4), 3194 CreateMockRead(*stream1_body, 3), CreateMockRead(*stream2_body, 4),
3095 MockRead(ASYNC, ERR_IO_PENDING, 5), CreateMockRead(*stream3_syn, 6), 3195 MockRead(ASYNC, ERR_IO_PENDING, 5), CreateMockRead(*stream3_syn, 6),
3096 }; 3196 };
3097 3197
3098 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3198 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3099 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3199 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
3174 test_cases[1].expected_headers["hello"] = "bye"; 3274 test_cases[1].expected_headers["hello"] = "bye";
3175 test_cases[2].expected_headers["hello"] = "bye"; 3275 test_cases[2].expected_headers["hello"] = "bye";
3176 3276
3177 test_cases[0].expected_headers["cookie"] = StringPiece("val1\0val2", 9); 3277 test_cases[0].expected_headers["cookie"] = StringPiece("val1\0val2", 9);
3178 test_cases[2].expected_headers["cookie"] = "val1,val2"; 3278 test_cases[2].expected_headers["cookie"] = "val1,val2";
3179 3279
3180 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3280 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3181 SpdyTestUtil spdy_test_util(GetParam().protocol, 3281 SpdyTestUtil spdy_test_util(GetParam().protocol,
3182 GetParam().priority_to_dependency); 3282 GetParam().priority_to_dependency);
3183 spdy_test_util.set_default_url(GURL(GetDefaultUrl())); 3283 spdy_test_util.set_default_url(GURL(GetDefaultUrl()));
3184 scoped_ptr<SpdyFrame> req( 3284 scoped_ptr<SpdySerializedFrame> req(
3185 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3285 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3186 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 3286 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3187 3287
3188 scoped_ptr<SpdyFrame> resp(spdy_test_util.ConstructSpdyGetSynReply( 3288 scoped_ptr<SpdySerializedFrame> resp(
3189 test_cases[i].extra_headers, test_cases[i].num_headers, 1)); 3289 spdy_test_util.ConstructSpdyGetSynReply(test_cases[i].extra_headers,
3190 scoped_ptr<SpdyFrame> body(spdy_test_util.ConstructSpdyBodyFrame(1, true)); 3290 test_cases[i].num_headers, 1));
3291 scoped_ptr<SpdySerializedFrame> body(
3292 spdy_test_util.ConstructSpdyBodyFrame(1, true));
3191 MockRead reads[] = { 3293 MockRead reads[] = {
3192 CreateMockRead(*resp, 1), 3294 CreateMockRead(*resp, 1),
3193 CreateMockRead(*body, 2), 3295 CreateMockRead(*body, 2),
3194 MockRead(ASYNC, 0, 3) // EOF 3296 MockRead(ASYNC, 0, 3) // EOF
3195 }; 3297 };
3196 3298
3197 SequencedSocketData data(reads, arraysize(reads), writes, 3299 SequencedSocketData data(reads, arraysize(reads), writes,
3198 arraysize(writes)); 3300 arraysize(writes));
3199 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3301 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3200 BoundNetLog(), GetParam(), NULL); 3302 BoundNetLog(), GetParam(), NULL);
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
3264 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(), 3366 {spdy_util_.GetStatusKey(), "200", spdy_util_.GetPathKey(),
3265 "/index.php", spdy_util_.GetVersionKey(), "HTTP/1.1", "vary", 3367 "/index.php", spdy_util_.GetVersionKey(), "HTTP/1.1", "vary",
3266 "friend,enemy", NULL}}}}; 3368 "friend,enemy", NULL}}}};
3267 3369
3268 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3370 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3269 SpdyTestUtil spdy_test_util(GetParam().protocol, 3371 SpdyTestUtil spdy_test_util(GetParam().protocol,
3270 GetParam().priority_to_dependency); 3372 GetParam().priority_to_dependency);
3271 spdy_test_util.set_default_url(GURL(GetDefaultUrl())); 3373 spdy_test_util.set_default_url(GURL(GetDefaultUrl()));
3272 3374
3273 // Construct the request. 3375 // Construct the request.
3274 scoped_ptr<SpdyFrame> frame_req(spdy_test_util.ConstructSpdyGet( 3376 scoped_ptr<SpdySerializedFrame> frame_req(spdy_test_util.ConstructSpdyGet(
3275 test_cases[i].extra_headers[0], test_cases[i].num_headers[0], 1, LOWEST, 3377 test_cases[i].extra_headers[0], test_cases[i].num_headers[0], 1, LOWEST,
3276 true)); 3378 true));
3277 3379
3278 MockWrite writes[] = { 3380 MockWrite writes[] = {
3279 CreateMockWrite(*frame_req, 0), 3381 CreateMockWrite(*frame_req, 0),
3280 }; 3382 };
3281 3383
3282 // Construct the reply. 3384 // Construct the reply.
3283 SpdyHeaderBlock reply_headers; 3385 SpdyHeaderBlock reply_headers;
3284 AppendToHeaderBlock(test_cases[i].extra_headers[1], 3386 AppendToHeaderBlock(test_cases[i].extra_headers[1],
3285 test_cases[i].num_headers[1], 3387 test_cases[i].num_headers[1],
3286 &reply_headers); 3388 &reply_headers);
3287 scoped_ptr<SpdyFrame> frame_reply( 3389 scoped_ptr<SpdySerializedFrame> frame_reply(
3288 spdy_test_util.ConstructSpdyReply(1, reply_headers)); 3390 spdy_test_util.ConstructSpdyReply(1, reply_headers));
3289 3391
3290 scoped_ptr<SpdyFrame> body(spdy_test_util.ConstructSpdyBodyFrame(1, true)); 3392 scoped_ptr<SpdySerializedFrame> body(
3393 spdy_test_util.ConstructSpdyBodyFrame(1, true));
3291 MockRead reads[] = { 3394 MockRead reads[] = {
3292 CreateMockRead(*frame_reply, 1), 3395 CreateMockRead(*frame_reply, 1),
3293 CreateMockRead(*body, 2), 3396 CreateMockRead(*body, 2),
3294 MockRead(ASYNC, 0, 3) // EOF 3397 MockRead(ASYNC, 0, 3) // EOF
3295 }; 3398 };
3296 3399
3297 // Attach the headers to the request. 3400 // Attach the headers to the request.
3298 int header_count = test_cases[i].num_headers[0]; 3401 int header_count = test_cases[i].num_headers[0];
3299 3402
3300 HttpRequestInfo request = CreateGetRequest(); 3403 HttpRequestInfo request = CreateGetRequest();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3358 { 3461 {
3359 0, {NULL}, 3462 0, {NULL},
3360 }, 3463 },
3361 }; 3464 };
3362 3465
3363 for (size_t i = 0; i < arraysize(test_cases); ++i) { 3466 for (size_t i = 0; i < arraysize(test_cases); ++i) {
3364 SpdyTestUtil spdy_test_util(GetParam().protocol, 3467 SpdyTestUtil spdy_test_util(GetParam().protocol,
3365 GetParam().priority_to_dependency); 3468 GetParam().priority_to_dependency);
3366 spdy_test_util.set_default_url(GURL(GetDefaultUrl())); 3469 spdy_test_util.set_default_url(GURL(GetDefaultUrl()));
3367 3470
3368 scoped_ptr<SpdyFrame> req( 3471 scoped_ptr<SpdySerializedFrame> req(
3369 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3472 spdy_test_util.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3370 scoped_ptr<SpdyFrame> rst( 3473 scoped_ptr<SpdySerializedFrame> rst(
3371 spdy_test_util.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 3474 spdy_test_util.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
3372 MockWrite writes[] = { 3475 MockWrite writes[] = {
3373 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2), 3476 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 2),
3374 }; 3477 };
3375 3478
3376 // Construct the reply. 3479 // Construct the reply.
3377 SpdyHeaderBlock reply_headers; 3480 SpdyHeaderBlock reply_headers;
3378 AppendToHeaderBlock( 3481 AppendToHeaderBlock(
3379 test_cases[i].headers, test_cases[i].num_headers, &reply_headers); 3482 test_cases[i].headers, test_cases[i].num_headers, &reply_headers);
3380 scoped_ptr<SpdyFrame> resp( 3483 scoped_ptr<SpdySerializedFrame> resp(
3381 spdy_test_util.ConstructSpdyReply(1, reply_headers)); 3484 spdy_test_util.ConstructSpdyReply(1, reply_headers));
3382 MockRead reads[] = { 3485 MockRead reads[] = {
3383 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3) // EOF 3486 CreateMockRead(*resp, 1), MockRead(ASYNC, 0, 3) // EOF
3384 }; 3487 };
3385 3488
3386 SequencedSocketData data(reads, arraysize(reads), writes, 3489 SequencedSocketData data(reads, arraysize(reads), writes,
3387 arraysize(writes)); 3490 arraysize(writes));
3388 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3491 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3389 BoundNetLog(), GetParam(), NULL); 3492 BoundNetLog(), GetParam(), NULL);
3390 helper.RunToCompletion(&data); 3493 helper.RunToCompletion(&data);
3391 TransactionHelperResult out = helper.output(); 3494 TransactionHelperResult out = helper.output();
3392 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3495 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3393 } 3496 }
3394 } 3497 }
3395 3498
3396 TEST_P(SpdyNetworkTransactionTest, CorruptFrameSessionError) { 3499 TEST_P(SpdyNetworkTransactionTest, CorruptFrameSessionError) {
3397 if (spdy_util_.spdy_version() != SPDY3) { 3500 if (spdy_util_.spdy_version() != SPDY3) {
3398 return; 3501 return;
3399 } 3502 }
3400 3503
3401 scoped_ptr<SpdyFrame> req( 3504 scoped_ptr<SpdySerializedFrame> req(
3402 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3505 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3403 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3506 scoped_ptr<SpdySerializedFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3404 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3507 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3405 MockWrite writes[] = { 3508 MockWrite writes[] = {
3406 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 3), 3509 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 3),
3407 }; 3510 };
3408 3511
3409 // This is the length field that's too short. 3512 // This is the length field that's too short.
3410 scoped_ptr<SpdyFrame> syn_reply_wrong_length( 3513 scoped_ptr<SpdySerializedFrame> syn_reply_wrong_length(
3411 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 3514 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
3412 size_t right_size = 3515 size_t right_size =
3413 syn_reply_wrong_length->size() - 3516 syn_reply_wrong_length->size() -
3414 SpdyConstants::GetControlFrameHeaderSize(spdy_util_.spdy_version()); 3517 SpdyConstants::GetControlFrameHeaderSize(spdy_util_.spdy_version());
3415 size_t wrong_size = right_size - 4; 3518 size_t wrong_size = right_size - 4;
3416 test::SetFrameLength(syn_reply_wrong_length.get(), 3519 test::SetFrameLength(syn_reply_wrong_length.get(),
3417 wrong_size, 3520 wrong_size,
3418 spdy_util_.spdy_version()); 3521 spdy_util_.spdy_version());
3419 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3522 scoped_ptr<SpdySerializedFrame> body(
3523 spdy_util_.ConstructSpdyBodyFrame(1, true));
3420 MockRead reads[] = { 3524 MockRead reads[] = {
3421 MockRead(ASYNC, syn_reply_wrong_length->data(), 3525 MockRead(ASYNC, syn_reply_wrong_length->data(),
3422 syn_reply_wrong_length->size(), 1), 3526 syn_reply_wrong_length->size(), 1),
3423 CreateMockRead(*body, 2), 3527 CreateMockRead(*body, 2),
3424 }; 3528 };
3425 3529
3426 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3530 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3427 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3531 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3428 BoundNetLog(), GetParam(), nullptr); 3532 BoundNetLog(), GetParam(), nullptr);
3429 helper.RunToCompletion(&data); 3533 helper.RunToCompletion(&data);
3430 TransactionHelperResult out = helper.output(); 3534 TransactionHelperResult out = helper.output();
3431 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3535 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3432 } 3536 }
3433 3537
3434 TEST_P(SpdyNetworkTransactionTest, CorruptFrameSessionErrorSpdy4) { 3538 TEST_P(SpdyNetworkTransactionTest, CorruptFrameSessionErrorSpdy4) {
3435 if (spdy_util_.spdy_version() != HTTP2) { 3539 if (spdy_util_.spdy_version() != HTTP2) {
3436 return; 3540 return;
3437 } 3541 }
3438 3542
3439 scoped_ptr<SpdyFrame> req( 3543 scoped_ptr<SpdySerializedFrame> req(
3440 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3544 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3441 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3545 scoped_ptr<SpdySerializedFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3442 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3546 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3443 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)}; 3547 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3444 3548
3445 // This is the length field that's too short. 3549 // This is the length field that's too short.
3446 scoped_ptr<SpdyFrame> syn_reply_wrong_length( 3550 scoped_ptr<SpdySerializedFrame> syn_reply_wrong_length(
3447 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 3551 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
3448 size_t right_size = 3552 size_t right_size =
3449 syn_reply_wrong_length->size() - 3553 syn_reply_wrong_length->size() -
3450 SpdyConstants::GetControlFrameHeaderSize(spdy_util_.spdy_version()); 3554 SpdyConstants::GetControlFrameHeaderSize(spdy_util_.spdy_version());
3451 size_t wrong_size = right_size - 4; 3555 size_t wrong_size = right_size - 4;
3452 test::SetFrameLength(syn_reply_wrong_length.get(), 3556 test::SetFrameLength(syn_reply_wrong_length.get(),
3453 wrong_size, 3557 wrong_size,
3454 spdy_util_.spdy_version()); 3558 spdy_util_.spdy_version());
3455 3559
3456 MockRead reads[] = { 3560 MockRead reads[] = {
3457 MockRead(ASYNC, syn_reply_wrong_length->data(), 3561 MockRead(ASYNC, syn_reply_wrong_length->data(),
3458 syn_reply_wrong_length->size() - 4, 1), 3562 syn_reply_wrong_length->size() - 4, 1),
3459 }; 3563 };
3460 3564
3461 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3565 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3462 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3566 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3463 BoundNetLog(), GetParam(), NULL); 3567 BoundNetLog(), GetParam(), NULL);
3464 helper.RunToCompletion(&data); 3568 helper.RunToCompletion(&data);
3465 TransactionHelperResult out = helper.output(); 3569 TransactionHelperResult out = helper.output();
3466 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); 3570 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv);
3467 } 3571 }
3468 3572
3469 TEST_P(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) { 3573 TEST_P(SpdyNetworkTransactionTest, GoAwayOnDecompressionFailure) {
3470 if (GetParam().protocol < kProtoHTTP2) { 3574 if (GetParam().protocol < kProtoHTTP2) {
3471 // Decompression failures are a stream error in SPDY3. 3575 // Decompression failures are a stream error in SPDY3.
3472 return; 3576 return;
3473 } 3577 }
3474 scoped_ptr<SpdyFrame> req( 3578 scoped_ptr<SpdySerializedFrame> req(
3475 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3579 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3476 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3580 scoped_ptr<SpdySerializedFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3477 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE).")); 3581 0, GOAWAY_COMPRESSION_ERROR, "Framer error: 5 (DECOMPRESS_FAILURE)."));
3478 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)}; 3582 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3479 3583
3480 // Read HEADERS with corrupted payload. 3584 // Read HEADERS with corrupted payload.
3481 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3585 scoped_ptr<SpdySerializedFrame> resp(
3586 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3482 memset(resp->data() + 12, 0xcf, resp->size() - 12); 3587 memset(resp->data() + 12, 0xcf, resp->size() - 12);
3483 MockRead reads[] = {CreateMockRead(*resp, 1)}; 3588 MockRead reads[] = {CreateMockRead(*resp, 1)};
3484 3589
3485 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3590 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3486 NormalSpdyTransactionHelper helper( 3591 NormalSpdyTransactionHelper helper(
3487 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 3592 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
3488 helper.RunToCompletion(&data); 3593 helper.RunToCompletion(&data);
3489 TransactionHelperResult out = helper.output(); 3594 TransactionHelperResult out = helper.output();
3490 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv); 3595 EXPECT_EQ(ERR_SPDY_COMPRESSION_ERROR, out.rv);
3491 } 3596 }
3492 3597
3493 TEST_P(SpdyNetworkTransactionTest, GoAwayOnFrameSizeError) { 3598 TEST_P(SpdyNetworkTransactionTest, GoAwayOnFrameSizeError) {
3494 scoped_ptr<SpdyFrame> req( 3599 scoped_ptr<SpdySerializedFrame> req(
3495 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3600 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3496 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 3601 scoped_ptr<SpdySerializedFrame> goaway(spdy_util_.ConstructSpdyGoAway(
3497 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_CONTROL_FRAME).")); 3602 0, GOAWAY_PROTOCOL_ERROR, "Framer error: 1 (INVALID_CONTROL_FRAME)."));
3498 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)}; 3603 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2)};
3499 3604
3500 // Read WINDOW_UPDATE with incorrectly-sized payload. 3605 // Read WINDOW_UPDATE with incorrectly-sized payload.
3501 // TODO(jgraettinger): SpdyFramer signals this as an INVALID_CONTROL_FRAME, 3606 // TODO(jgraettinger): SpdyFramer signals this as an INVALID_CONTROL_FRAME,
3502 // which is mapped to a protocol error, and not a frame size error. 3607 // which is mapped to a protocol error, and not a frame size error.
3503 scoped_ptr<SpdyFrame> bad_window_update( 3608 scoped_ptr<SpdySerializedFrame> bad_window_update(
3504 spdy_util_.ConstructSpdyWindowUpdate(1, 1)); 3609 spdy_util_.ConstructSpdyWindowUpdate(1, 1));
3505 test::SetFrameLength(bad_window_update.get(), 3610 test::SetFrameLength(bad_window_update.get(),
3506 bad_window_update->size() - 1, 3611 bad_window_update->size() - 1,
3507 spdy_util_.spdy_version()); 3612 spdy_util_.spdy_version());
3508 MockRead reads[] = {CreateMockRead(*bad_window_update, 1)}; 3613 MockRead reads[] = {CreateMockRead(*bad_window_update, 1)};
3509 3614
3510 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3615 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3511 NormalSpdyTransactionHelper helper( 3616 NormalSpdyTransactionHelper helper(
3512 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 3617 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
3513 helper.RunToCompletion(&data); 3618 helper.RunToCompletion(&data);
3514 TransactionHelperResult out = helper.output(); 3619 TransactionHelperResult out = helper.output();
3515 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 3620 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
3516 } 3621 }
3517 3622
3518 // Test that we shutdown correctly on write errors. 3623 // Test that we shutdown correctly on write errors.
3519 TEST_P(SpdyNetworkTransactionTest, WriteError) { 3624 TEST_P(SpdyNetworkTransactionTest, WriteError) {
3520 scoped_ptr<SpdyFrame> req( 3625 scoped_ptr<SpdySerializedFrame> req(
3521 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3626 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3522 MockWrite writes[] = { 3627 MockWrite writes[] = {
3523 // We'll write 10 bytes successfully 3628 // We'll write 10 bytes successfully
3524 MockWrite(ASYNC, req->data(), 10, 1), 3629 MockWrite(ASYNC, req->data(), 10, 1),
3525 // Followed by ERROR! 3630 // Followed by ERROR!
3526 MockWrite(ASYNC, ERR_FAILED, 2), 3631 MockWrite(ASYNC, ERR_FAILED, 2),
3527 // Session drains and attempts to write a GOAWAY: Another ERROR! 3632 // Session drains and attempts to write a GOAWAY: Another ERROR!
3528 MockWrite(ASYNC, ERR_FAILED, 3), 3633 MockWrite(ASYNC, ERR_FAILED, 3),
3529 }; 3634 };
3530 3635
3531 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; 3636 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
3532 3637
3533 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3638 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3534 3639
3535 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3640 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3536 BoundNetLog(), GetParam(), NULL); 3641 BoundNetLog(), GetParam(), NULL);
3537 helper.RunPreTestSetup(); 3642 helper.RunPreTestSetup();
3538 helper.AddData(&data); 3643 helper.AddData(&data);
3539 EXPECT_TRUE(helper.StartDefaultTest()); 3644 EXPECT_TRUE(helper.StartDefaultTest());
3540 helper.FinishDefaultTest(); 3645 helper.FinishDefaultTest();
3541 EXPECT_TRUE(data.AllWriteDataConsumed()); 3646 EXPECT_TRUE(data.AllWriteDataConsumed());
3542 EXPECT_TRUE(data.AllReadDataConsumed()); 3647 EXPECT_TRUE(data.AllReadDataConsumed());
3543 TransactionHelperResult out = helper.output(); 3648 TransactionHelperResult out = helper.output();
3544 EXPECT_EQ(ERR_FAILED, out.rv); 3649 EXPECT_EQ(ERR_FAILED, out.rv);
3545 } 3650 }
3546 3651
3547 // Test that partial writes work. 3652 // Test that partial writes work.
3548 TEST_P(SpdyNetworkTransactionTest, PartialWrite) { 3653 TEST_P(SpdyNetworkTransactionTest, PartialWrite) {
3549 // Chop the SYN_STREAM frame into 5 chunks. 3654 // Chop the SYN_STREAM frame into 5 chunks.
3550 scoped_ptr<SpdyFrame> req( 3655 scoped_ptr<SpdySerializedFrame> req(
3551 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3656 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3552 const int kChunks = 5; 3657 const int kChunks = 5;
3553 scoped_ptr<MockWrite[]> writes(ChopWriteFrame(*req.get(), kChunks)); 3658 scoped_ptr<MockWrite[]> writes(ChopWriteFrame(*req.get(), kChunks));
3554 for (int i = 0; i < kChunks; ++i) { 3659 for (int i = 0; i < kChunks; ++i) {
3555 writes[i].sequence_number = i; 3660 writes[i].sequence_number = i;
3556 } 3661 }
3557 3662
3558 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3663 scoped_ptr<SpdySerializedFrame> resp(
3559 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3664 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3665 scoped_ptr<SpdySerializedFrame> body(
3666 spdy_util_.ConstructSpdyBodyFrame(1, true));
3560 MockRead reads[] = { 3667 MockRead reads[] = {
3561 CreateMockRead(*resp, kChunks), 3668 CreateMockRead(*resp, kChunks),
3562 CreateMockRead(*body, kChunks + 1), 3669 CreateMockRead(*body, kChunks + 1),
3563 MockRead(ASYNC, 0, kChunks + 2) // EOF 3670 MockRead(ASYNC, 0, kChunks + 2) // EOF
3564 }; 3671 };
3565 3672
3566 SequencedSocketData data(reads, arraysize(reads), writes.get(), kChunks); 3673 SequencedSocketData data(reads, arraysize(reads), writes.get(), kChunks);
3567 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3674 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
3568 BoundNetLog(), GetParam(), NULL); 3675 BoundNetLog(), GetParam(), NULL);
3569 helper.RunToCompletion(&data); 3676 helper.RunToCompletion(&data);
3570 TransactionHelperResult out = helper.output(); 3677 TransactionHelperResult out = helper.output();
3571 EXPECT_EQ(OK, out.rv); 3678 EXPECT_EQ(OK, out.rv);
3572 EXPECT_EQ("HTTP/1.1 200", out.status_line); 3679 EXPECT_EQ("HTTP/1.1 200", out.status_line);
3573 EXPECT_EQ("hello!", out.response_data); 3680 EXPECT_EQ("hello!", out.response_data);
3574 } 3681 }
3575 3682
3576 // Test that the NetLog contains good data for a simple GET request. 3683 // Test that the NetLog contains good data for a simple GET request.
3577 TEST_P(SpdyNetworkTransactionTest, NetLog) { 3684 TEST_P(SpdyNetworkTransactionTest, NetLog) {
3578 static const char* const kExtraHeaders[] = { 3685 static const char* const kExtraHeaders[] = {
3579 "user-agent", "Chrome", 3686 "user-agent", "Chrome",
3580 }; 3687 };
3581 scoped_ptr<SpdyFrame> req( 3688 scoped_ptr<SpdySerializedFrame> req(
3582 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, 1, LOWEST, true)); 3689 spdy_util_.ConstructSpdyGet(kExtraHeaders, 1, 1, LOWEST, true));
3583 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 3690 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3584 3691
3585 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3692 scoped_ptr<SpdySerializedFrame> resp(
3586 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 3693 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3694 scoped_ptr<SpdySerializedFrame> body(
3695 spdy_util_.ConstructSpdyBodyFrame(1, true));
3587 MockRead reads[] = { 3696 MockRead reads[] = {
3588 CreateMockRead(*resp, 1), 3697 CreateMockRead(*resp, 1),
3589 CreateMockRead(*body, 2), 3698 CreateMockRead(*body, 2),
3590 MockRead(ASYNC, 0, 3) // EOF 3699 MockRead(ASYNC, 0, 3) // EOF
3591 }; 3700 };
3592 3701
3593 BoundTestNetLog log; 3702 BoundTestNetLog log;
3594 3703
3595 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3704 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3596 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(), 3705 NormalSpdyTransactionHelper helper(CreateGetRequestWithUserAgent(),
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
3662 } 3771 }
3663 } 3772 }
3664 3773
3665 // Since we buffer the IO from the stream to the renderer, this test verifies 3774 // Since we buffer the IO from the stream to the renderer, this test verifies
3666 // that when we read out the maximum amount of data (e.g. we received 50 bytes 3775 // that when we read out the maximum amount of data (e.g. we received 50 bytes
3667 // on the network, but issued a Read for only 5 of those bytes) that the data 3776 // on the network, but issued a Read for only 5 of those bytes) that the data
3668 // flow still works correctly. 3777 // flow still works correctly.
3669 TEST_P(SpdyNetworkTransactionTest, BufferFull) { 3778 TEST_P(SpdyNetworkTransactionTest, BufferFull) {
3670 BufferedSpdyFramer framer(spdy_util_.spdy_version()); 3779 BufferedSpdyFramer framer(spdy_util_.spdy_version());
3671 3780
3672 scoped_ptr<SpdyFrame> req( 3781 scoped_ptr<SpdySerializedFrame> req(
3673 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3782 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3674 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 3783 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3675 3784
3676 // 2 data frames in a single read. 3785 // 2 data frames in a single read.
3677 scoped_ptr<SpdyFrame> data_frame_1( 3786 scoped_ptr<SpdySerializedFrame> data_frame_1(
3678 framer.CreateDataFrame(1, "goodby", 6, DATA_FLAG_NONE)); 3787 framer.CreateDataFrame(1, "goodby", 6, DATA_FLAG_NONE));
3679 scoped_ptr<SpdyFrame> data_frame_2( 3788 scoped_ptr<SpdySerializedFrame> data_frame_2(
3680 framer.CreateDataFrame(1, "e worl", 6, DATA_FLAG_NONE)); 3789 framer.CreateDataFrame(1, "e worl", 6, DATA_FLAG_NONE));
3681 const SpdyFrame* data_frames[2] = { 3790 const SpdySerializedFrame* data_frames[2] = {
3682 data_frame_1.get(), 3791 data_frame_1.get(), data_frame_2.get(),
3683 data_frame_2.get(),
3684 }; 3792 };
3685 char combined_data_frames[100]; 3793 char combined_data_frames[100];
3686 int combined_data_frames_len = 3794 int combined_data_frames_len =
3687 CombineFrames(data_frames, arraysize(data_frames), 3795 CombineFrames(data_frames, arraysize(data_frames),
3688 combined_data_frames, arraysize(combined_data_frames)); 3796 combined_data_frames, arraysize(combined_data_frames));
3689 scoped_ptr<SpdyFrame> last_frame( 3797 scoped_ptr<SpdySerializedFrame> last_frame(
3690 framer.CreateDataFrame(1, "d", 1, DATA_FLAG_FIN)); 3798 framer.CreateDataFrame(1, "d", 1, DATA_FLAG_FIN));
3691 3799
3692 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3800 scoped_ptr<SpdySerializedFrame> resp(
3801 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3693 MockRead reads[] = { 3802 MockRead reads[] = {
3694 CreateMockRead(*resp, 1), 3803 CreateMockRead(*resp, 1),
3695 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 3804 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
3696 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), 3805 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
3697 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause 3806 MockRead(ASYNC, ERR_IO_PENDING, 4), // Force a pause
3698 CreateMockRead(*last_frame, 5), 3807 CreateMockRead(*last_frame, 5),
3699 MockRead(ASYNC, 0, 6) // EOF 3808 MockRead(ASYNC, 0, 6) // EOF
3700 }; 3809 };
3701 3810
3702 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3811 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3755 EXPECT_EQ("HTTP/1.1 200", out.status_line); 3864 EXPECT_EQ("HTTP/1.1 200", out.status_line);
3756 EXPECT_EQ("goodbye world", out.response_data); 3865 EXPECT_EQ("goodbye world", out.response_data);
3757 } 3866 }
3758 3867
3759 // Verify that basic buffering works; when multiple data frames arrive 3868 // Verify that basic buffering works; when multiple data frames arrive
3760 // at the same time, ensure that we don't notify a read completion for 3869 // at the same time, ensure that we don't notify a read completion for
3761 // each data frame individually. 3870 // each data frame individually.
3762 TEST_P(SpdyNetworkTransactionTest, Buffering) { 3871 TEST_P(SpdyNetworkTransactionTest, Buffering) {
3763 BufferedSpdyFramer framer(spdy_util_.spdy_version()); 3872 BufferedSpdyFramer framer(spdy_util_.spdy_version());
3764 3873
3765 scoped_ptr<SpdyFrame> req( 3874 scoped_ptr<SpdySerializedFrame> req(
3766 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3875 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3767 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 3876 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3768 3877
3769 // 4 data frames in a single read. 3878 // 4 data frames in a single read.
3770 scoped_ptr<SpdyFrame> data_frame( 3879 scoped_ptr<SpdySerializedFrame> data_frame(
3771 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); 3880 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE));
3772 scoped_ptr<SpdyFrame> data_frame_fin( 3881 scoped_ptr<SpdySerializedFrame> data_frame_fin(
3773 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN)); 3882 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN));
3774 const SpdyFrame* data_frames[4] = { 3883 const SpdySerializedFrame* data_frames[4] = {
3775 data_frame.get(), 3884 data_frame.get(), data_frame.get(), data_frame.get(),
3776 data_frame.get(), 3885 data_frame_fin.get()};
3777 data_frame.get(),
3778 data_frame_fin.get()
3779 };
3780 char combined_data_frames[100]; 3886 char combined_data_frames[100];
3781 int combined_data_frames_len = 3887 int combined_data_frames_len =
3782 CombineFrames(data_frames, arraysize(data_frames), 3888 CombineFrames(data_frames, arraysize(data_frames),
3783 combined_data_frames, arraysize(combined_data_frames)); 3889 combined_data_frames, arraysize(combined_data_frames));
3784 3890
3785 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3891 scoped_ptr<SpdySerializedFrame> resp(
3892 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3786 MockRead reads[] = { 3893 MockRead reads[] = {
3787 CreateMockRead(*resp, 1), 3894 CreateMockRead(*resp, 1),
3788 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause 3895 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a pause
3789 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), 3896 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
3790 MockRead(ASYNC, 0, 4) // EOF 3897 MockRead(ASYNC, 0, 4) // EOF
3791 }; 3898 };
3792 3899
3793 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 3900 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3794 3901
3795 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 3902 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
3849 3956
3850 EXPECT_EQ(OK, out.rv); 3957 EXPECT_EQ(OK, out.rv);
3851 EXPECT_EQ("HTTP/1.1 200", out.status_line); 3958 EXPECT_EQ("HTTP/1.1 200", out.status_line);
3852 EXPECT_EQ("messagemessagemessagemessage", out.response_data); 3959 EXPECT_EQ("messagemessagemessagemessage", out.response_data);
3853 } 3960 }
3854 3961
3855 // Verify the case where we buffer data but read it after it has been buffered. 3962 // Verify the case where we buffer data but read it after it has been buffered.
3856 TEST_P(SpdyNetworkTransactionTest, BufferedAll) { 3963 TEST_P(SpdyNetworkTransactionTest, BufferedAll) {
3857 BufferedSpdyFramer framer(spdy_util_.spdy_version()); 3964 BufferedSpdyFramer framer(spdy_util_.spdy_version());
3858 3965
3859 scoped_ptr<SpdyFrame> req( 3966 scoped_ptr<SpdySerializedFrame> req(
3860 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 3967 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3861 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 3968 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3862 3969
3863 // 5 data frames in a single read. 3970 // 5 data frames in a single read.
3864 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 3971 scoped_ptr<SpdySerializedFrame> reply(
3865 scoped_ptr<SpdyFrame> data_frame( 3972 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3973 scoped_ptr<SpdySerializedFrame> data_frame(
3866 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); 3974 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE));
3867 scoped_ptr<SpdyFrame> data_frame_fin( 3975 scoped_ptr<SpdySerializedFrame> data_frame_fin(
3868 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN)); 3976 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_FIN));
3869 const SpdyFrame* frames[5] = {reply.get(), data_frame.get(), data_frame.get(), 3977 const SpdySerializedFrame* frames[5] = {reply.get(), data_frame.get(),
3870 data_frame.get(), data_frame_fin.get()}; 3978 data_frame.get(), data_frame.get(),
3979 data_frame_fin.get()};
3871 char combined_frames[200]; 3980 char combined_frames[200];
3872 int combined_frames_len = 3981 int combined_frames_len =
3873 CombineFrames(frames, arraysize(frames), 3982 CombineFrames(frames, arraysize(frames),
3874 combined_frames, arraysize(combined_frames)); 3983 combined_frames, arraysize(combined_frames));
3875 3984
3876 MockRead reads[] = { 3985 MockRead reads[] = {
3877 MockRead(ASYNC, combined_frames, combined_frames_len, 1), 3986 MockRead(ASYNC, combined_frames, combined_frames_len, 1),
3878 MockRead(ASYNC, 0, 2) // EOF 3987 MockRead(ASYNC, 0, 2) // EOF
3879 }; 3988 };
3880 3989
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3933 4042
3934 EXPECT_EQ(OK, out.rv); 4043 EXPECT_EQ(OK, out.rv);
3935 EXPECT_EQ("HTTP/1.1 200", out.status_line); 4044 EXPECT_EQ("HTTP/1.1 200", out.status_line);
3936 EXPECT_EQ("messagemessagemessagemessage", out.response_data); 4045 EXPECT_EQ("messagemessagemessagemessage", out.response_data);
3937 } 4046 }
3938 4047
3939 // Verify the case where we buffer data and close the connection. 4048 // Verify the case where we buffer data and close the connection.
3940 TEST_P(SpdyNetworkTransactionTest, BufferedClosed) { 4049 TEST_P(SpdyNetworkTransactionTest, BufferedClosed) {
3941 BufferedSpdyFramer framer(spdy_util_.spdy_version()); 4050 BufferedSpdyFramer framer(spdy_util_.spdy_version());
3942 4051
3943 scoped_ptr<SpdyFrame> req( 4052 scoped_ptr<SpdySerializedFrame> req(
3944 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4053 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
3945 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 4054 MockWrite writes[] = {CreateMockWrite(*req, 0)};
3946 4055
3947 // All data frames in a single read. 4056 // All data frames in a single read.
3948 // NOTE: We don't FIN the stream. 4057 // NOTE: We don't FIN the stream.
3949 scoped_ptr<SpdyFrame> data_frame( 4058 scoped_ptr<SpdySerializedFrame> data_frame(
3950 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); 4059 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE));
3951 const SpdyFrame* data_frames[4] = { 4060 const SpdySerializedFrame* data_frames[4] = {
3952 data_frame.get(), 4061 data_frame.get(), data_frame.get(), data_frame.get(), data_frame.get()};
3953 data_frame.get(),
3954 data_frame.get(),
3955 data_frame.get()
3956 };
3957 char combined_data_frames[100]; 4062 char combined_data_frames[100];
3958 int combined_data_frames_len = 4063 int combined_data_frames_len =
3959 CombineFrames(data_frames, arraysize(data_frames), 4064 CombineFrames(data_frames, arraysize(data_frames),
3960 combined_data_frames, arraysize(combined_data_frames)); 4065 combined_data_frames, arraysize(combined_data_frames));
3961 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4066 scoped_ptr<SpdySerializedFrame> resp(
4067 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
3962 MockRead reads[] = { 4068 MockRead reads[] = {
3963 CreateMockRead(*resp, 1), 4069 CreateMockRead(*resp, 1),
3964 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait 4070 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait
3965 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3), 4071 MockRead(ASYNC, combined_data_frames, combined_data_frames_len, 3),
3966 MockRead(ASYNC, 0, 4) // EOF 4072 MockRead(ASYNC, 0, 4) // EOF
3967 }; 4073 };
3968 4074
3969 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4075 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
3970 4076
3971 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4077 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
4023 base::RunLoop().RunUntilIdle(); 4129 base::RunLoop().RunUntilIdle();
4024 4130
4025 // Verify that we consumed all test data. 4131 // Verify that we consumed all test data.
4026 helper.VerifyDataConsumed(); 4132 helper.VerifyDataConsumed();
4027 } 4133 }
4028 4134
4029 // Verify the case where we buffer data and cancel the transaction. 4135 // Verify the case where we buffer data and cancel the transaction.
4030 TEST_P(SpdyNetworkTransactionTest, BufferedCancelled) { 4136 TEST_P(SpdyNetworkTransactionTest, BufferedCancelled) {
4031 BufferedSpdyFramer framer(spdy_util_.spdy_version()); 4137 BufferedSpdyFramer framer(spdy_util_.spdy_version());
4032 4138
4033 scoped_ptr<SpdyFrame> req( 4139 scoped_ptr<SpdySerializedFrame> req(
4034 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4140 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4035 scoped_ptr<SpdyFrame> rst( 4141 scoped_ptr<SpdySerializedFrame> rst(
4036 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 4142 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
4037 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4)}; 4143 MockWrite writes[] = {CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4)};
4038 4144
4039 // NOTE: We don't FIN the stream. 4145 // NOTE: We don't FIN the stream.
4040 scoped_ptr<SpdyFrame> data_frame( 4146 scoped_ptr<SpdySerializedFrame> data_frame(
4041 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE)); 4147 framer.CreateDataFrame(1, "message", 7, DATA_FLAG_NONE));
4042 4148
4043 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4149 scoped_ptr<SpdySerializedFrame> resp(
4150 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4044 MockRead reads[] = { 4151 MockRead reads[] = {
4045 CreateMockRead(*resp, 1), 4152 CreateMockRead(*resp, 1),
4046 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait 4153 MockRead(ASYNC, ERR_IO_PENDING, 2), // Force a wait
4047 CreateMockRead(*data_frame, 3), 4154 CreateMockRead(*data_frame, 3),
4048 MockRead(ASYNC, 0, 5) // EOF 4155 MockRead(ASYNC, 0, 5) // EOF
4049 }; 4156 };
4050 4157
4051 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4158 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4052 4159
4053 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4160 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
4119 net_log, GetParam(), NULL); 4226 net_log, GetParam(), NULL);
4120 helper.RunPreTestSetup(); 4227 helper.RunPreTestSetup();
4121 4228
4122 // Verify that no settings exist initially. 4229 // Verify that no settings exist initially.
4123 HostPortPair host_port_pair("www.example.org", helper.port()); 4230 HostPortPair host_port_pair("www.example.org", helper.port());
4124 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); 4231 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool();
4125 EXPECT_TRUE(spdy_session_pool->http_server_properties()->GetSpdySettings( 4232 EXPECT_TRUE(spdy_session_pool->http_server_properties()->GetSpdySettings(
4126 host_port_pair).empty()); 4233 host_port_pair).empty());
4127 4234
4128 // Construct the request. 4235 // Construct the request.
4129 scoped_ptr<SpdyFrame> req( 4236 scoped_ptr<SpdySerializedFrame> req(
4130 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4237 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4131 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 4238 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4132 4239
4133 // Construct the reply. 4240 // Construct the reply.
4134 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock()); 4241 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock());
4135 (*reply_headers)[spdy_util_.GetStatusKey()] = "200"; 4242 (*reply_headers)[spdy_util_.GetStatusKey()] = "200";
4136 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 4243 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
4137 scoped_ptr<SpdyFrame> reply( 4244 scoped_ptr<SpdySerializedFrame> reply(
4138 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, std::move(reply_headers))); 4245 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, std::move(reply_headers)));
4139 4246
4140 const SpdySettingsIds kSampleId1 = SETTINGS_UPLOAD_BANDWIDTH; 4247 const SpdySettingsIds kSampleId1 = SETTINGS_UPLOAD_BANDWIDTH;
4141 unsigned int kSampleValue1 = 0x0a0a0a0a; 4248 unsigned int kSampleValue1 = 0x0a0a0a0a;
4142 const SpdySettingsIds kSampleId2 = SETTINGS_DOWNLOAD_BANDWIDTH; 4249 const SpdySettingsIds kSampleId2 = SETTINGS_DOWNLOAD_BANDWIDTH;
4143 unsigned int kSampleValue2 = 0x0b0b0b0b; 4250 unsigned int kSampleValue2 = 0x0b0b0b0b;
4144 const SpdySettingsIds kSampleId3 = SETTINGS_ROUND_TRIP_TIME; 4251 const SpdySettingsIds kSampleId3 = SETTINGS_ROUND_TRIP_TIME;
4145 unsigned int kSampleValue3 = 0x0c0c0c0c; 4252 unsigned int kSampleValue3 = 0x0c0c0c0c;
4146 scoped_ptr<SpdyFrame> settings_frame; 4253 scoped_ptr<SpdySerializedFrame> settings_frame;
4147 { 4254 {
4148 // Construct the SETTINGS frame. 4255 // Construct the SETTINGS frame.
4149 SettingsMap settings; 4256 SettingsMap settings;
4150 // First add a persisted setting. 4257 // First add a persisted setting.
4151 settings[kSampleId1] = 4258 settings[kSampleId1] =
4152 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, kSampleValue1); 4259 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, kSampleValue1);
4153 // Next add a non-persisted setting. 4260 // Next add a non-persisted setting.
4154 settings[kSampleId2] = 4261 settings[kSampleId2] =
4155 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kSampleValue2); 4262 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kSampleValue2);
4156 // Next add another persisted setting. 4263 // Next add another persisted setting.
4157 settings[kSampleId3] = 4264 settings[kSampleId3] =
4158 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, kSampleValue3); 4265 SettingsFlagsAndValue(SETTINGS_FLAG_PLEASE_PERSIST, kSampleValue3);
4159 settings_frame.reset(spdy_util_.ConstructSpdySettings(settings)); 4266 settings_frame.reset(spdy_util_.ConstructSpdySettings(settings));
4160 } 4267 }
4161 4268
4162 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4269 scoped_ptr<SpdySerializedFrame> body(
4270 spdy_util_.ConstructSpdyBodyFrame(1, true));
4163 MockRead reads[] = { 4271 MockRead reads[] = {
4164 CreateMockRead(*reply, 1), 4272 CreateMockRead(*reply, 1),
4165 CreateMockRead(*body, 2), 4273 CreateMockRead(*body, 2),
4166 CreateMockRead(*settings_frame, 3), 4274 CreateMockRead(*settings_frame, 3),
4167 MockRead(ASYNC, 0, 4) // EOF 4275 MockRead(ASYNC, 0, 4) // EOF
4168 }; 4276 };
4169 4277
4170 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4278 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4171 helper.AddData(&data); 4279 helper.AddData(&data);
4172 helper.RunDefaultTest(); 4280 helper.RunDefaultTest();
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
4253 SETTINGS_FLAG_PLEASE_PERSIST, 4361 SETTINGS_FLAG_PLEASE_PERSIST,
4254 kSampleValue2); 4362 kSampleValue2);
4255 4363
4256 EXPECT_EQ(2u, spdy_session_pool->http_server_properties()->GetSpdySettings( 4364 EXPECT_EQ(2u, spdy_session_pool->http_server_properties()->GetSpdySettings(
4257 host_port_pair).size()); 4365 host_port_pair).size());
4258 4366
4259 // Construct the initial SETTINGS frame. 4367 // Construct the initial SETTINGS frame.
4260 SettingsMap initial_settings; 4368 SettingsMap initial_settings;
4261 initial_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 4369 initial_settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
4262 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); 4370 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams);
4263 scoped_ptr<SpdyFrame> initial_settings_frame( 4371 scoped_ptr<SpdySerializedFrame> initial_settings_frame(
4264 spdy_util_.ConstructSpdySettings(initial_settings)); 4372 spdy_util_.ConstructSpdySettings(initial_settings));
4265 4373
4266 // Construct the persisted SETTINGS frame. 4374 // Construct the persisted SETTINGS frame.
4267 const SettingsMap& settings = 4375 const SettingsMap& settings =
4268 spdy_session_pool->http_server_properties()->GetSpdySettings( 4376 spdy_session_pool->http_server_properties()->GetSpdySettings(
4269 host_port_pair); 4377 host_port_pair);
4270 scoped_ptr<SpdyFrame> settings_frame( 4378 scoped_ptr<SpdySerializedFrame> settings_frame(
4271 spdy_util_.ConstructSpdySettings(settings)); 4379 spdy_util_.ConstructSpdySettings(settings));
4272 4380
4273 // Construct the request. 4381 // Construct the request.
4274 scoped_ptr<SpdyFrame> req( 4382 scoped_ptr<SpdySerializedFrame> req(
4275 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4383 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4276 4384
4277 MockWrite writes[] = { 4385 MockWrite writes[] = {
4278 CreateMockWrite(*initial_settings_frame, 0), 4386 CreateMockWrite(*initial_settings_frame, 0),
4279 CreateMockWrite(*settings_frame, 1), 4387 CreateMockWrite(*settings_frame, 1),
4280 CreateMockWrite(*req, 2), 4388 CreateMockWrite(*req, 2),
4281 }; 4389 };
4282 4390
4283 // Construct the reply. 4391 // Construct the reply.
4284 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock()); 4392 scoped_ptr<SpdyHeaderBlock> reply_headers(new SpdyHeaderBlock());
4285 (*reply_headers)[spdy_util_.GetStatusKey()] = "200"; 4393 (*reply_headers)[spdy_util_.GetStatusKey()] = "200";
4286 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 4394 (*reply_headers)[spdy_util_.GetVersionKey()] = "HTTP/1.1";
4287 scoped_ptr<SpdyFrame> reply( 4395 scoped_ptr<SpdySerializedFrame> reply(
4288 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, std::move(reply_headers))); 4396 spdy_util_.ConstructSpdyFrame(kSynReplyInfo, std::move(reply_headers)));
4289 4397
4290 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4398 scoped_ptr<SpdySerializedFrame> body(
4399 spdy_util_.ConstructSpdyBodyFrame(1, true));
4291 MockRead reads[] = { 4400 MockRead reads[] = {
4292 CreateMockRead(*reply, 3), 4401 CreateMockRead(*reply, 3),
4293 CreateMockRead(*body, 4), 4402 CreateMockRead(*body, 4),
4294 MockRead(ASYNC, 0, 5) // EOF 4403 MockRead(ASYNC, 0, 5) // EOF
4295 }; 4404 };
4296 4405
4297 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4406 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4298 helper.AddData(&data); 4407 helper.AddData(&data);
4299 helper.RunDefaultTest(); 4408 helper.RunDefaultTest();
4300 helper.VerifyDataConsumed(); 4409 helper.VerifyDataConsumed();
(...skipping 19 matching lines...) Expand all
4320 // Verify the second persisted setting. 4429 // Verify the second persisted setting.
4321 SettingsMap::const_iterator it2 = settings_map.find(kSampleId2); 4430 SettingsMap::const_iterator it2 = settings_map.find(kSampleId2);
4322 EXPECT_TRUE(it2 != settings_map.end()); 4431 EXPECT_TRUE(it2 != settings_map.end());
4323 SettingsFlagsAndValue flags_and_value2 = it2->second; 4432 SettingsFlagsAndValue flags_and_value2 = it2->second;
4324 EXPECT_EQ(SETTINGS_FLAG_PERSISTED, flags_and_value2.first); 4433 EXPECT_EQ(SETTINGS_FLAG_PERSISTED, flags_and_value2.first);
4325 EXPECT_EQ(kSampleValue2, flags_and_value2.second); 4434 EXPECT_EQ(kSampleValue2, flags_and_value2.second);
4326 } 4435 }
4327 } 4436 }
4328 4437
4329 TEST_P(SpdyNetworkTransactionTest, GoAwayWithActiveStream) { 4438 TEST_P(SpdyNetworkTransactionTest, GoAwayWithActiveStream) {
4330 scoped_ptr<SpdyFrame> req( 4439 scoped_ptr<SpdySerializedFrame> req(
4331 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4440 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4332 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 4441 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4333 4442
4334 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway()); 4443 scoped_ptr<SpdySerializedFrame> go_away(spdy_util_.ConstructSpdyGoAway());
4335 MockRead reads[] = { 4444 MockRead reads[] = {
4336 CreateMockRead(*go_away, 1), 4445 CreateMockRead(*go_away, 1),
4337 }; 4446 };
4338 4447
4339 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4448 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4340 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4449 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4341 BoundNetLog(), GetParam(), NULL); 4450 BoundNetLog(), GetParam(), NULL);
4342 helper.AddData(&data); 4451 helper.AddData(&data);
4343 helper.RunToCompletion(&data); 4452 helper.RunToCompletion(&data);
4344 TransactionHelperResult out = helper.output(); 4453 TransactionHelperResult out = helper.output();
4345 EXPECT_EQ(ERR_ABORTED, out.rv); 4454 EXPECT_EQ(ERR_ABORTED, out.rv);
4346 } 4455 }
4347 4456
4348 TEST_P(SpdyNetworkTransactionTest, CloseWithActiveStream) { 4457 TEST_P(SpdyNetworkTransactionTest, CloseWithActiveStream) {
4349 scoped_ptr<SpdyFrame> req( 4458 scoped_ptr<SpdySerializedFrame> req(
4350 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4459 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4351 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 4460 MockWrite writes[] = {CreateMockWrite(*req, 0)};
4352 4461
4353 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4462 scoped_ptr<SpdySerializedFrame> resp(
4463 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4354 MockRead reads[] = { 4464 MockRead reads[] = {
4355 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF 4465 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF
4356 }; 4466 };
4357 4467
4358 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4468 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4359 BoundNetLog log; 4469 BoundNetLog log;
4360 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4470 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4361 log, GetParam(), NULL); 4471 log, GetParam(), NULL);
4362 helper.RunPreTestSetup(); 4472 helper.RunPreTestSetup();
4363 helper.AddData(&data); 4473 helper.AddData(&data);
(...skipping 19 matching lines...) Expand all
4383 4493
4384 // HTTP_1_1_REQUIRED results in ERR_HTTP_1_1_REQUIRED. 4494 // HTTP_1_1_REQUIRED results in ERR_HTTP_1_1_REQUIRED.
4385 TEST_P(SpdyNetworkTransactionTest, HTTP11RequiredError) { 4495 TEST_P(SpdyNetworkTransactionTest, HTTP11RequiredError) {
4386 // HTTP_1_1_REQUIRED is only supported by HTTP/2. 4496 // HTTP_1_1_REQUIRED is only supported by HTTP/2.
4387 if (spdy_util_.spdy_version() < HTTP2) 4497 if (spdy_util_.spdy_version() < HTTP2)
4388 return; 4498 return;
4389 4499
4390 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 4500 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4391 BoundNetLog(), GetParam(), nullptr); 4501 BoundNetLog(), GetParam(), nullptr);
4392 4502
4393 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4503 scoped_ptr<SpdySerializedFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4394 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4504 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4395 MockRead reads[] = { 4505 MockRead reads[] = {
4396 CreateMockRead(*go_away, 0), 4506 CreateMockRead(*go_away, 0),
4397 }; 4507 };
4398 SequencedSocketData data(reads, arraysize(reads), nullptr, 0); 4508 SequencedSocketData data(reads, arraysize(reads), nullptr, 0);
4399 4509
4400 helper.RunToCompletion(&data); 4510 helper.RunToCompletion(&data);
4401 TransactionHelperResult out = helper.output(); 4511 TransactionHelperResult out = helper.output();
4402 EXPECT_EQ(ERR_HTTP_1_1_REQUIRED, out.rv); 4512 EXPECT_EQ(ERR_HTTP_1_1_REQUIRED, out.rv);
4403 } 4513 }
(...skipping 15 matching lines...) Expand all
4419 request.url = GURL("https://www.example.org/"); 4529 request.url = GURL("https://www.example.org/");
4420 scoped_ptr<SpdySessionDependencies> session_deps( 4530 scoped_ptr<SpdySessionDependencies> session_deps(
4421 CreateSpdySessionDependencies(GetParam())); 4531 CreateSpdySessionDependencies(GetParam()));
4422 // Do not force SPDY so that second socket can negotiate HTTP/1.1. 4532 // Do not force SPDY so that second socket can negotiate HTTP/1.1.
4423 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 4533 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
4424 GetParam(), std::move(session_deps)); 4534 GetParam(), std::move(session_deps));
4425 4535
4426 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED. 4536 // First socket: HTTP/2 request rejected with HTTP_1_1_REQUIRED.
4427 const char* url = request.url.spec().c_str(); 4537 const char* url = request.url.spec().c_str();
4428 scoped_ptr<SpdyHeaderBlock> headers(spdy_util_.ConstructGetHeaderBlock(url)); 4538 scoped_ptr<SpdyHeaderBlock> headers(spdy_util_.ConstructGetHeaderBlock(url));
4429 scoped_ptr<SpdyFrame> req( 4539 scoped_ptr<SpdySerializedFrame> req(
4430 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, true)); 4540 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, true));
4431 MockWrite writes0[] = {CreateMockWrite(*req, 0)}; 4541 MockWrite writes0[] = {CreateMockWrite(*req, 0)};
4432 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4542 scoped_ptr<SpdySerializedFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4433 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4543 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4434 MockRead reads0[] = {CreateMockRead(*go_away, 1)}; 4544 MockRead reads0[] = {CreateMockRead(*go_away, 1)};
4435 SequencedSocketData data0(reads0, arraysize(reads0), writes0, 4545 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
4436 arraysize(writes0)); 4546 arraysize(writes0));
4437 4547
4438 scoped_ptr<SSLSocketDataProvider> ssl_provider0( 4548 scoped_ptr<SSLSocketDataProvider> ssl_provider0(
4439 new SSLSocketDataProvider(ASYNC, OK)); 4549 new SSLSocketDataProvider(ASYNC, OK));
4440 // Expect HTTP/2 protocols too in SSLConfig. 4550 // Expect HTTP/2 protocols too in SSLConfig.
4441 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP2); 4551 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP2);
4442 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); 4552 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
4508 request.url = GURL("https://www.example.org/"); 4618 request.url = GURL("https://www.example.org/");
4509 scoped_ptr<SpdySessionDependencies> session_deps( 4619 scoped_ptr<SpdySessionDependencies> session_deps(
4510 CreateSpdySessionDependencies( 4620 CreateSpdySessionDependencies(
4511 GetParam(), 4621 GetParam(),
4512 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70"))); 4622 ProxyService::CreateFixedFromPacResult("HTTPS myproxy:70")));
4513 // Do not force SPDY so that second socket can negotiate HTTP/1.1. 4623 // Do not force SPDY so that second socket can negotiate HTTP/1.1.
4514 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 4624 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
4515 GetParam(), std::move(session_deps)); 4625 GetParam(), std::move(session_deps));
4516 4626
4517 // First socket: HTTP/2 CONNECT rejected with HTTP_1_1_REQUIRED. 4627 // First socket: HTTP/2 CONNECT rejected with HTTP_1_1_REQUIRED.
4518 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyConnect( 4628 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyConnect(
4519 nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443))); 4629 nullptr, 0, 1, LOWEST, HostPortPair("www.example.org", 443)));
4520 MockWrite writes0[] = {CreateMockWrite(*req, 0)}; 4630 MockWrite writes0[] = {CreateMockWrite(*req, 0)};
4521 scoped_ptr<SpdyFrame> go_away(spdy_util_.ConstructSpdyGoAway( 4631 scoped_ptr<SpdySerializedFrame> go_away(spdy_util_.ConstructSpdyGoAway(
4522 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please.")); 4632 0, GOAWAY_HTTP_1_1_REQUIRED, "Try again using HTTP/1.1 please."));
4523 MockRead reads0[] = {CreateMockRead(*go_away, 1)}; 4633 MockRead reads0[] = {CreateMockRead(*go_away, 1)};
4524 SequencedSocketData data0(reads0, arraysize(reads0), writes0, 4634 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
4525 arraysize(writes0)); 4635 arraysize(writes0));
4526 4636
4527 scoped_ptr<SSLSocketDataProvider> ssl_provider0( 4637 scoped_ptr<SSLSocketDataProvider> ssl_provider0(
4528 new SSLSocketDataProvider(ASYNC, OK)); 4638 new SSLSocketDataProvider(ASYNC, OK));
4529 // Expect HTTP/2 protocols too in SSLConfig. 4639 // Expect HTTP/2 protocols too in SSLConfig.
4530 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP2); 4640 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoHTTP2);
4531 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31); 4641 ssl_provider0->next_protos_expected_in_ssl_config.push_back(kProtoSPDY31);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
4605 helper.SetSession( 4715 helper.SetSession(
4606 SpdySessionDependencies::SpdyCreateSession(helper.session_deps().get())); 4716 SpdySessionDependencies::SpdyCreateSession(helper.session_deps().get()));
4607 helper.RunPreTestSetup(); 4717 helper.RunPreTestSetup();
4608 HttpNetworkTransaction* trans = helper.trans(); 4718 HttpNetworkTransaction* trans = helper.trans();
4609 4719
4610 const char kConnect443[] = { 4720 const char kConnect443[] = {
4611 "CONNECT www.example.org:443 HTTP/1.1\r\n" 4721 "CONNECT www.example.org:443 HTTP/1.1\r\n"
4612 "Host: www.example.org:443\r\n" 4722 "Host: www.example.org:443\r\n"
4613 "Proxy-Connection: keep-alive\r\n\r\n"}; 4723 "Proxy-Connection: keep-alive\r\n\r\n"};
4614 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"}; 4724 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"};
4615 scoped_ptr<SpdyFrame> req( 4725 scoped_ptr<SpdySerializedFrame> req(
4616 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4726 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4617 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4727 scoped_ptr<SpdySerializedFrame> resp(
4618 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4728 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4729 scoped_ptr<SpdySerializedFrame> body(
4730 spdy_util_.ConstructSpdyBodyFrame(1, true));
4619 4731
4620 MockWrite writes[] = { 4732 MockWrite writes[] = {
4621 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 4733 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
4622 CreateMockWrite(*req, 2), 4734 CreateMockWrite(*req, 2),
4623 }; 4735 };
4624 MockRead reads[] = { 4736 MockRead reads[] = {
4625 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 4737 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
4626 CreateMockRead(*resp, 3), 4738 CreateMockRead(*resp, 3),
4627 CreateMockRead(*body.get(), 4), 4739 CreateMockRead(*body.get(), 4),
4628 MockRead(ASYNC, 0, 0, 5), 4740 MockRead(ASYNC, 0, 0, 5),
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
4667 helper.session_deps() = CreateSpdySessionDependencies( 4779 helper.session_deps() = CreateSpdySessionDependencies(
4668 GetParam(), 4780 GetParam(),
4669 ProxyService::CreateFixedFromPacResult("DIRECT; PROXY myproxy:70")); 4781 ProxyService::CreateFixedFromPacResult("DIRECT; PROXY myproxy:70"));
4670 helper.SetSession( 4782 helper.SetSession(
4671 SpdySessionDependencies::SpdyCreateSession(helper.session_deps().get())); 4783 SpdySessionDependencies::SpdyCreateSession(helper.session_deps().get()));
4672 4784
4673 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool(); 4785 SpdySessionPool* spdy_session_pool = helper.session()->spdy_session_pool();
4674 helper.RunPreTestSetup(); 4786 helper.RunPreTestSetup();
4675 4787
4676 // Construct and send a simple GET request. 4788 // Construct and send a simple GET request.
4677 scoped_ptr<SpdyFrame> req( 4789 scoped_ptr<SpdySerializedFrame> req(
4678 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4790 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4679 MockWrite writes[] = { 4791 MockWrite writes[] = {
4680 CreateMockWrite(*req, 0), 4792 CreateMockWrite(*req, 0),
4681 }; 4793 };
4682 4794
4683 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4795 scoped_ptr<SpdySerializedFrame> resp(
4684 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4796 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4797 scoped_ptr<SpdySerializedFrame> body(
4798 spdy_util_.ConstructSpdyBodyFrame(1, true));
4685 MockRead reads[] = { 4799 MockRead reads[] = {
4686 CreateMockRead(*resp, 1), 4800 CreateMockRead(*resp, 1),
4687 CreateMockRead(*body, 2), 4801 CreateMockRead(*body, 2),
4688 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), // Force a pause 4802 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3), // Force a pause
4689 }; 4803 };
4690 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 4804 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
4691 helper.AddData(&data); 4805 helper.AddData(&data);
4692 HttpNetworkTransaction* trans = helper.trans(); 4806 HttpNetworkTransaction* trans = helper.trans();
4693 4807
4694 TestCompletionCallback callback; 4808 TestCompletionCallback callback;
(...skipping 29 matching lines...) Expand all
4724 // proxy connection. 4838 // proxy connection.
4725 SpdyTestUtil spdy_util_2(GetParam().protocol, 4839 SpdyTestUtil spdy_util_2(GetParam().protocol,
4726 GetParam().priority_to_dependency); 4840 GetParam().priority_to_dependency);
4727 4841
4728 // Set up data for the proxy connection. 4842 // Set up data for the proxy connection.
4729 const char kConnect443[] = { 4843 const char kConnect443[] = {
4730 "CONNECT www.example.org:443 HTTP/1.1\r\n" 4844 "CONNECT www.example.org:443 HTTP/1.1\r\n"
4731 "Host: www.example.org:443\r\n" 4845 "Host: www.example.org:443\r\n"
4732 "Proxy-Connection: keep-alive\r\n\r\n"}; 4846 "Proxy-Connection: keep-alive\r\n\r\n"};
4733 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"}; 4847 const char kHTTP200[] = {"HTTP/1.1 200 OK\r\n\r\n"};
4734 scoped_ptr<SpdyFrame> req2(spdy_util_2.ConstructSpdyGet( 4848 scoped_ptr<SpdySerializedFrame> req2(spdy_util_2.ConstructSpdyGet(
4735 GetDefaultUrlWithPath("/foo.dat").c_str(), 1, LOWEST)); 4849 GetDefaultUrlWithPath("/foo.dat").c_str(), 1, LOWEST));
4736 scoped_ptr<SpdyFrame> resp2(spdy_util_2.ConstructSpdyGetSynReply(NULL, 0, 1)); 4850 scoped_ptr<SpdySerializedFrame> resp2(
4737 scoped_ptr<SpdyFrame> body2(spdy_util_2.ConstructSpdyBodyFrame(1, true)); 4851 spdy_util_2.ConstructSpdyGetSynReply(NULL, 0, 1));
4852 scoped_ptr<SpdySerializedFrame> body2(
4853 spdy_util_2.ConstructSpdyBodyFrame(1, true));
4738 4854
4739 MockWrite writes2[] = { 4855 MockWrite writes2[] = {
4740 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0), 4856 MockWrite(SYNCHRONOUS, kConnect443, arraysize(kConnect443) - 1, 0),
4741 CreateMockWrite(*req2, 2), 4857 CreateMockWrite(*req2, 2),
4742 }; 4858 };
4743 MockRead reads2[] = { 4859 MockRead reads2[] = {
4744 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1), 4860 MockRead(SYNCHRONOUS, kHTTP200, arraysize(kHTTP200) - 1, 1),
4745 CreateMockRead(*resp2, 3), 4861 CreateMockRead(*resp2, 3),
4746 CreateMockRead(*body2, 4), 4862 CreateMockRead(*body2, 4),
4747 MockRead(ASYNC, 0, 5) // EOF 4863 MockRead(ASYNC, 0, 5) // EOF
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
4788 EXPECT_EQ("hello!", response_data); 4904 EXPECT_EQ("hello!", response_data);
4789 4905
4790 helper_proxy.VerifyDataConsumed(); 4906 helper_proxy.VerifyDataConsumed();
4791 } 4907 }
4792 4908
4793 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction 4909 // When we get a TCP-level RST, we need to retry a HttpNetworkTransaction
4794 // on a new connection, if the connection was previously known to be good. 4910 // on a new connection, if the connection was previously known to be good.
4795 // This can happen when a server reboots without saying goodbye, or when 4911 // This can happen when a server reboots without saying goodbye, or when
4796 // we're behind a NAT that masked the RST. 4912 // we're behind a NAT that masked the RST.
4797 TEST_P(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) { 4913 TEST_P(SpdyNetworkTransactionTest, VerifyRetryOnConnectionReset) {
4798 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 4914 scoped_ptr<SpdySerializedFrame> resp(
4799 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 4915 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
4916 scoped_ptr<SpdySerializedFrame> body(
4917 spdy_util_.ConstructSpdyBodyFrame(1, true));
4800 MockRead reads[] = { 4918 MockRead reads[] = {
4801 CreateMockRead(*resp, 1), 4919 CreateMockRead(*resp, 1),
4802 CreateMockRead(*body, 2), 4920 CreateMockRead(*body, 2),
4803 MockRead(ASYNC, ERR_IO_PENDING, 3), 4921 MockRead(ASYNC, ERR_IO_PENDING, 3),
4804 MockRead(ASYNC, ERR_CONNECTION_RESET, 4), 4922 MockRead(ASYNC, ERR_CONNECTION_RESET, 4),
4805 }; 4923 };
4806 4924
4807 MockRead reads2[] = { 4925 MockRead reads2[] = {
4808 CreateMockRead(*resp, 1), 4926 CreateMockRead(*resp, 1),
4809 CreateMockRead(*body, 2), 4927 CreateMockRead(*body, 2),
4810 MockRead(ASYNC, 0, 3) // EOF 4928 MockRead(ASYNC, 0, 3) // EOF
4811 }; 4929 };
4812 4930
4813 scoped_ptr<SpdyFrame> req( 4931 scoped_ptr<SpdySerializedFrame> req(
4814 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 4932 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4815 // In all cases the connection will be reset before req3 can be 4933 // In all cases the connection will be reset before req3 can be
4816 // dispatched, destroying both streams. 4934 // dispatched, destroying both streams.
4817 spdy_util_.UpdateWithStreamDestruction(1); 4935 spdy_util_.UpdateWithStreamDestruction(1);
4818 scoped_ptr<SpdyFrame> req3( 4936 scoped_ptr<SpdySerializedFrame> req3(
4819 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 4937 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
4820 MockWrite writes1[] = {CreateMockWrite(*req, 0), CreateMockWrite(*req3, 5)}; 4938 MockWrite writes1[] = {CreateMockWrite(*req, 0), CreateMockWrite(*req3, 5)};
4821 MockWrite writes2[] = {CreateMockWrite(*req, 0)}; 4939 MockWrite writes2[] = {CreateMockWrite(*req, 0)};
4822 4940
4823 // This test has a couple of variants. 4941 // This test has a couple of variants.
4824 enum { 4942 enum {
4825 // Induce the RST while waiting for our transaction to send. 4943 // Induce the RST while waiting for our transaction to send.
4826 VARIANT_RST_DURING_SEND_COMPLETION = 0, 4944 VARIANT_RST_DURING_SEND_COMPLETION = 0,
4827 // Induce the RST while waiting for our transaction to read. 4945 // Induce the RST while waiting for our transaction to read.
4828 // In this case, the send completed - everything copied into the SNDBUF. 4946 // In this case, the send completed - everything copied into the SNDBUF.
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
4878 } 4996 }
4879 4997
4880 helper.VerifyDataConsumed(); 4998 helper.VerifyDataConsumed();
4881 base::RunLoop().RunUntilIdle(); 4999 base::RunLoop().RunUntilIdle();
4882 } 5000 }
4883 } 5001 }
4884 5002
4885 // Test that turning SPDY on and off works properly. 5003 // Test that turning SPDY on and off works properly.
4886 TEST_P(SpdyNetworkTransactionTest, SpdyOnOffToggle) { 5004 TEST_P(SpdyNetworkTransactionTest, SpdyOnOffToggle) {
4887 HttpStreamFactory::set_spdy_enabled(true); 5005 HttpStreamFactory::set_spdy_enabled(true);
4888 scoped_ptr<SpdyFrame> req( 5006 scoped_ptr<SpdySerializedFrame> req(
4889 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 5007 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4890 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)}; 5008 MockWrite spdy_writes[] = {CreateMockWrite(*req, 0)};
4891 5009
4892 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5010 scoped_ptr<SpdySerializedFrame> resp(
4893 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 5011 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5012 scoped_ptr<SpdySerializedFrame> body(
5013 spdy_util_.ConstructSpdyBodyFrame(1, true));
4894 MockRead spdy_reads[] = { 5014 MockRead spdy_reads[] = {
4895 CreateMockRead(*resp, 1), 5015 CreateMockRead(*resp, 1),
4896 CreateMockRead(*body, 2), 5016 CreateMockRead(*body, 2),
4897 MockRead(ASYNC, 0, 3) // EOF 5017 MockRead(ASYNC, 0, 3) // EOF
4898 }; 5018 };
4899 5019
4900 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes, 5020 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes,
4901 arraysize(spdy_writes)); 5021 arraysize(spdy_writes));
4902 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5022 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
4903 BoundNetLog(), GetParam(), NULL); 5023 BoundNetLog(), GetParam(), NULL);
(...skipping 29 matching lines...) Expand all
4933 5053
4934 HttpStreamFactory::set_spdy_enabled(true); 5054 HttpStreamFactory::set_spdy_enabled(true);
4935 } 5055 }
4936 5056
4937 // Tests that Basic authentication works over SPDY 5057 // Tests that Basic authentication works over SPDY
4938 TEST_P(SpdyNetworkTransactionTest, SpdyBasicAuth) { 5058 TEST_P(SpdyNetworkTransactionTest, SpdyBasicAuth) {
4939 HttpStreamFactory::set_spdy_enabled(true); 5059 HttpStreamFactory::set_spdy_enabled(true);
4940 5060
4941 // The first request will be a bare GET, the second request will be a 5061 // The first request will be a bare GET, the second request will be a
4942 // GET with an Authorization header. 5062 // GET with an Authorization header.
4943 scoped_ptr<SpdyFrame> req_get( 5063 scoped_ptr<SpdySerializedFrame> req_get(
4944 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 5064 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
4945 // Will be refused for lack of auth. 5065 // Will be refused for lack of auth.
4946 spdy_util_.UpdateWithStreamDestruction(1); 5066 spdy_util_.UpdateWithStreamDestruction(1);
4947 const char* const kExtraAuthorizationHeaders[] = { 5067 const char* const kExtraAuthorizationHeaders[] = {
4948 "authorization", "Basic Zm9vOmJhcg==" 5068 "authorization", "Basic Zm9vOmJhcg=="
4949 }; 5069 };
4950 scoped_ptr<SpdyFrame> req_get_authorization(spdy_util_.ConstructSpdyGet( 5070 scoped_ptr<SpdySerializedFrame> req_get_authorization(
4951 kExtraAuthorizationHeaders, arraysize(kExtraAuthorizationHeaders) / 2, 3, 5071 spdy_util_.ConstructSpdyGet(kExtraAuthorizationHeaders,
4952 LOWEST, true)); 5072 arraysize(kExtraAuthorizationHeaders) / 2, 3,
5073 LOWEST, true));
4953 MockWrite spdy_writes[] = { 5074 MockWrite spdy_writes[] = {
4954 CreateMockWrite(*req_get, 0), CreateMockWrite(*req_get_authorization, 3), 5075 CreateMockWrite(*req_get, 0), CreateMockWrite(*req_get_authorization, 3),
4955 }; 5076 };
4956 5077
4957 // The first response is a 401 authentication challenge, and the second 5078 // The first response is a 401 authentication challenge, and the second
4958 // response will be a 200 response since the second request includes a valid 5079 // response will be a 200 response since the second request includes a valid
4959 // Authorization header. 5080 // Authorization header.
4960 const char* const kExtraAuthenticationHeaders[] = { 5081 const char* const kExtraAuthenticationHeaders[] = {
4961 "www-authenticate", 5082 "www-authenticate",
4962 "Basic realm=\"MyRealm\"" 5083 "Basic realm=\"MyRealm\""
4963 }; 5084 };
4964 scoped_ptr<SpdyFrame> resp_authentication( 5085 scoped_ptr<SpdySerializedFrame> resp_authentication(
4965 spdy_util_.ConstructSpdySynReplyError( 5086 spdy_util_.ConstructSpdySynReplyError(
4966 "401 Authentication Required", 5087 "401 Authentication Required", kExtraAuthenticationHeaders,
4967 kExtraAuthenticationHeaders, 5088 arraysize(kExtraAuthenticationHeaders) / 2, 1));
4968 arraysize(kExtraAuthenticationHeaders) / 2, 5089 scoped_ptr<SpdySerializedFrame> body_authentication(
4969 1));
4970 scoped_ptr<SpdyFrame> body_authentication(
4971 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5090 spdy_util_.ConstructSpdyBodyFrame(1, true));
4972 scoped_ptr<SpdyFrame> resp_data( 5091 scoped_ptr<SpdySerializedFrame> resp_data(
4973 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 5092 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
4974 scoped_ptr<SpdyFrame> body_data(spdy_util_.ConstructSpdyBodyFrame(3, true)); 5093 scoped_ptr<SpdySerializedFrame> body_data(
5094 spdy_util_.ConstructSpdyBodyFrame(3, true));
4975 MockRead spdy_reads[] = { 5095 MockRead spdy_reads[] = {
4976 CreateMockRead(*resp_authentication, 1), 5096 CreateMockRead(*resp_authentication, 1),
4977 CreateMockRead(*body_authentication, 2), 5097 CreateMockRead(*body_authentication, 2),
4978 CreateMockRead(*resp_data, 4), 5098 CreateMockRead(*resp_data, 4),
4979 CreateMockRead(*body_data, 5), 5099 CreateMockRead(*body_data, 5),
4980 MockRead(ASYNC, 0, 6), 5100 MockRead(ASYNC, 0, 6),
4981 }; 5101 };
4982 5102
4983 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes, 5103 SequencedSocketData data(spdy_reads, arraysize(spdy_reads), spdy_writes,
4984 arraysize(spdy_writes)); 5104 arraysize(spdy_writes));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
5020 // TODO(cbentzel): This is actually the same response object as before, but 5140 // TODO(cbentzel): This is actually the same response object as before, but
5021 // data has changed. 5141 // data has changed.
5022 const HttpResponseInfo* const response_restart = trans->GetResponseInfo(); 5142 const HttpResponseInfo* const response_restart = trans->GetResponseInfo();
5023 ASSERT_TRUE(response_restart != NULL); 5143 ASSERT_TRUE(response_restart != NULL);
5024 ASSERT_TRUE(response_restart->headers.get() != NULL); 5144 ASSERT_TRUE(response_restart->headers.get() != NULL);
5025 EXPECT_EQ(200, response_restart->headers->response_code()); 5145 EXPECT_EQ(200, response_restart->headers->response_code());
5026 EXPECT_TRUE(response_restart->auth_challenge.get() == NULL); 5146 EXPECT_TRUE(response_restart->auth_challenge.get() == NULL);
5027 } 5147 }
5028 5148
5029 TEST_P(SpdyNetworkTransactionTest, ServerPushWithHeaders) { 5149 TEST_P(SpdyNetworkTransactionTest, ServerPushWithHeaders) {
5030 scoped_ptr<SpdyFrame> stream1_syn( 5150 scoped_ptr<SpdySerializedFrame> stream1_syn(
5031 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 5151 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
5032 MockWrite writes[] = { 5152 MockWrite writes[] = {
5033 CreateMockWrite(*stream1_syn, 0), 5153 CreateMockWrite(*stream1_syn, 0),
5034 }; 5154 };
5035 5155
5036 scoped_ptr<SpdyFrame> stream1_reply( 5156 scoped_ptr<SpdySerializedFrame> stream1_reply(
5037 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 5157 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
5038 5158
5039 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); 5159 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock());
5040 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 5160 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
5041 initial_headers.get()); 5161 initial_headers.get());
5042 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 5162 scoped_ptr<SpdySerializedFrame> stream2_syn(
5043 std::move(initial_headers), 2, 1)); 5163 spdy_util_.ConstructInitialSpdyPushFrame(std::move(initial_headers), 2,
5164 1));
5044 5165
5045 SpdyHeaderBlock late_headers; 5166 SpdyHeaderBlock late_headers;
5046 late_headers[spdy_util_.GetStatusKey()] = "200"; 5167 late_headers[spdy_util_.GetStatusKey()] = "200";
5047 late_headers[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 5168 late_headers[spdy_util_.GetVersionKey()] = "HTTP/1.1";
5048 late_headers["hello"] = "bye"; 5169 late_headers["hello"] = "bye";
5049 scoped_ptr<SpdyFrame> stream2_headers( 5170 scoped_ptr<SpdySerializedFrame> stream2_headers(
5050 spdy_util_.ConstructSpdyResponseHeaders(2, late_headers, false)); 5171 spdy_util_.ConstructSpdyResponseHeaders(2, late_headers, false));
5051 5172
5052 scoped_ptr<SpdyFrame> stream1_body( 5173 scoped_ptr<SpdySerializedFrame> stream1_body(
5053 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5174 spdy_util_.ConstructSpdyBodyFrame(1, true));
5054 5175
5055 const char kPushedData[] = "pushed"; 5176 const char kPushedData[] = "pushed";
5056 scoped_ptr<SpdyFrame> stream2_body( 5177 scoped_ptr<SpdySerializedFrame> stream2_body(
5057 spdy_util_.ConstructSpdyBodyFrame( 5178 spdy_util_.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
5058 2, kPushedData, strlen(kPushedData), true)); 5179 true));
5059 5180
5060 MockRead reads[] = { 5181 MockRead reads[] = {
5061 CreateMockRead(*stream1_reply, 1), 5182 CreateMockRead(*stream1_reply, 1),
5062 CreateMockRead(*stream2_syn, 2), 5183 CreateMockRead(*stream2_syn, 2),
5063 CreateMockRead(*stream2_headers, 3), 5184 CreateMockRead(*stream2_headers, 3),
5064 CreateMockRead(*stream1_body, 4, SYNCHRONOUS), 5185 CreateMockRead(*stream1_body, 4, SYNCHRONOUS),
5065 CreateMockRead(*stream2_body, 5), 5186 CreateMockRead(*stream2_body, 5),
5066 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause 5187 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
5067 }; 5188 };
5068 5189
(...skipping 10 matching lines...) Expand all
5079 EXPECT_TRUE(response.headers.get() != NULL); 5200 EXPECT_TRUE(response.headers.get() != NULL);
5080 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine()); 5201 EXPECT_EQ("HTTP/1.1 200", response.headers->GetStatusLine());
5081 5202
5082 // Verify the pushed stream. 5203 // Verify the pushed stream.
5083 EXPECT_TRUE(response2.headers.get() != NULL); 5204 EXPECT_TRUE(response2.headers.get() != NULL);
5084 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine()); 5205 EXPECT_EQ("HTTP/1.1 200", response2.headers->GetStatusLine());
5085 } 5206 }
5086 5207
5087 TEST_P(SpdyNetworkTransactionTest, ServerPushClaimBeforeHeaders) { 5208 TEST_P(SpdyNetworkTransactionTest, ServerPushClaimBeforeHeaders) {
5088 // We push a stream and attempt to claim it before the headers come down. 5209 // We push a stream and attempt to claim it before the headers come down.
5089 scoped_ptr<SpdyFrame> stream1_syn( 5210 scoped_ptr<SpdySerializedFrame> stream1_syn(
5090 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 5211 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
5091 MockWrite writes[] = { 5212 MockWrite writes[] = {
5092 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS), 5213 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS),
5093 }; 5214 };
5094 5215
5095 scoped_ptr<SpdyFrame> stream1_reply( 5216 scoped_ptr<SpdySerializedFrame> stream1_reply(
5096 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 5217 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
5097 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); 5218 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock());
5098 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 5219 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
5099 initial_headers.get()); 5220 initial_headers.get());
5100 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 5221 scoped_ptr<SpdySerializedFrame> stream2_syn(
5101 std::move(initial_headers), 2, 1)); 5222 spdy_util_.ConstructInitialSpdyPushFrame(std::move(initial_headers), 2,
5102 scoped_ptr<SpdyFrame> stream1_body( 5223 1));
5224 scoped_ptr<SpdySerializedFrame> stream1_body(
5103 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5225 spdy_util_.ConstructSpdyBodyFrame(1, true));
5104 SpdyHeaderBlock late_headers; 5226 SpdyHeaderBlock late_headers;
5105 late_headers[spdy_util_.GetStatusKey()] = "200"; 5227 late_headers[spdy_util_.GetStatusKey()] = "200";
5106 late_headers[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 5228 late_headers[spdy_util_.GetVersionKey()] = "HTTP/1.1";
5107 late_headers["hello"] = "bye"; 5229 late_headers["hello"] = "bye";
5108 scoped_ptr<SpdyFrame> stream2_headers( 5230 scoped_ptr<SpdySerializedFrame> stream2_headers(
5109 spdy_util_.ConstructSpdyResponseHeaders(2, late_headers, false)); 5231 spdy_util_.ConstructSpdyResponseHeaders(2, late_headers, false));
5110 const char kPushedData[] = "pushed"; 5232 const char kPushedData[] = "pushed";
5111 scoped_ptr<SpdyFrame> stream2_body( 5233 scoped_ptr<SpdySerializedFrame> stream2_body(
5112 spdy_util_.ConstructSpdyBodyFrame( 5234 spdy_util_.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
5113 2, kPushedData, strlen(kPushedData), true)); 5235 true));
5114 MockRead reads[] = { 5236 MockRead reads[] = {
5115 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2), 5237 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2),
5116 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), 5238 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4),
5117 CreateMockRead(*stream2_headers, 5), CreateMockRead(*stream2_body, 6), 5239 CreateMockRead(*stream2_headers, 5), CreateMockRead(*stream2_body, 6),
5118 MockRead(ASYNC, ERR_IO_PENDING, 7), MockRead(ASYNC, 0, 8), // EOF 5240 MockRead(ASYNC, ERR_IO_PENDING, 7), MockRead(ASYNC, 0, 8), // EOF
5119 }; 5241 };
5120 5242
5121 HttpResponseInfo response; 5243 HttpResponseInfo response;
5122 HttpResponseInfo response2; 5244 HttpResponseInfo response2;
5123 std::string expected_push_result("pushed"); 5245 std::string expected_push_result("pushed");
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
5186 base::RunLoop().RunUntilIdle(); 5308 base::RunLoop().RunUntilIdle();
5187 5309
5188 // Verify that we consumed all test data. 5310 // Verify that we consumed all test data.
5189 EXPECT_TRUE(data.AllReadDataConsumed()); 5311 EXPECT_TRUE(data.AllReadDataConsumed());
5190 EXPECT_TRUE(data.AllWriteDataConsumed()); 5312 EXPECT_TRUE(data.AllWriteDataConsumed());
5191 } 5313 }
5192 5314
5193 // TODO(baranovich): HTTP 2 does not allow multiple HEADERS frames 5315 // TODO(baranovich): HTTP 2 does not allow multiple HEADERS frames
5194 TEST_P(SpdyNetworkTransactionTest, ServerPushWithTwoHeaderFrames) { 5316 TEST_P(SpdyNetworkTransactionTest, ServerPushWithTwoHeaderFrames) {
5195 // We push a stream and attempt to claim it before the headers come down. 5317 // We push a stream and attempt to claim it before the headers come down.
5196 scoped_ptr<SpdyFrame> stream1_syn( 5318 scoped_ptr<SpdySerializedFrame> stream1_syn(
5197 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 5319 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
5198 MockWrite writes[] = { 5320 MockWrite writes[] = {
5199 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS), 5321 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS),
5200 }; 5322 };
5201 5323
5202 scoped_ptr<SpdyFrame> stream1_reply( 5324 scoped_ptr<SpdySerializedFrame> stream1_reply(
5203 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 5325 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
5204 5326
5205 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); 5327 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock());
5206 if (spdy_util_.spdy_version() < HTTP2) { 5328 if (spdy_util_.spdy_version() < HTTP2) {
5207 // In HTTP/2 PUSH_PROMISE headers won't show up in the response headers. 5329 // In HTTP/2 PUSH_PROMISE headers won't show up in the response headers.
5208 (*initial_headers)["alpha"] = "beta"; 5330 (*initial_headers)["alpha"] = "beta";
5209 } 5331 }
5210 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 5332 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
5211 initial_headers.get()); 5333 initial_headers.get());
5212 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 5334 scoped_ptr<SpdySerializedFrame> stream2_syn(
5213 std::move(initial_headers), 2, 1)); 5335 spdy_util_.ConstructInitialSpdyPushFrame(std::move(initial_headers), 2,
5336 1));
5214 5337
5215 scoped_ptr<SpdyFrame> stream1_body( 5338 scoped_ptr<SpdySerializedFrame> stream1_body(
5216 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5339 spdy_util_.ConstructSpdyBodyFrame(1, true));
5217 5340
5218 SpdyHeaderBlock middle_headers; 5341 SpdyHeaderBlock middle_headers;
5219 middle_headers["hello"] = "bye"; 5342 middle_headers["hello"] = "bye";
5220 scoped_ptr<SpdyFrame> stream2_headers1( 5343 scoped_ptr<SpdySerializedFrame> stream2_headers1(
5221 spdy_util_.ConstructSpdyResponseHeaders(2, middle_headers, false)); 5344 spdy_util_.ConstructSpdyResponseHeaders(2, middle_headers, false));
5222 5345
5223 SpdyHeaderBlock late_headers; 5346 SpdyHeaderBlock late_headers;
5224 late_headers[spdy_util_.GetStatusKey()] = "200"; 5347 late_headers[spdy_util_.GetStatusKey()] = "200";
5225 if (spdy_util_.spdy_version() < HTTP2) { 5348 if (spdy_util_.spdy_version() < HTTP2) {
5226 // HTTP/2 eliminates use of the :version header. 5349 // HTTP/2 eliminates use of the :version header.
5227 late_headers[spdy_util_.GetVersionKey()] = "HTTP/1.1"; 5350 late_headers[spdy_util_.GetVersionKey()] = "HTTP/1.1";
5228 } 5351 }
5229 scoped_ptr<SpdyFrame> stream2_headers2( 5352 scoped_ptr<SpdySerializedFrame> stream2_headers2(
5230 spdy_util_.ConstructSpdyResponseHeaders(2, late_headers, false)); 5353 spdy_util_.ConstructSpdyResponseHeaders(2, late_headers, false));
5231 5354
5232 const char kPushedData[] = "pushed"; 5355 const char kPushedData[] = "pushed";
5233 scoped_ptr<SpdyFrame> stream2_body( 5356 scoped_ptr<SpdySerializedFrame> stream2_body(
5234 spdy_util_.ConstructSpdyBodyFrame( 5357 spdy_util_.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
5235 2, kPushedData, strlen(kPushedData), true)); 5358 true));
5236 5359
5237 MockRead reads[] = { 5360 MockRead reads[] = {
5238 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2), 5361 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2),
5239 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), 5362 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4),
5240 CreateMockRead(*stream2_headers1, 5), 5363 CreateMockRead(*stream2_headers1, 5),
5241 // This is needed to work around https://crbug.com/571102. 5364 // This is needed to work around https://crbug.com/571102.
5242 MockRead(ASYNC, ERR_IO_PENDING, 6), CreateMockRead(*stream2_headers2, 7), 5365 MockRead(ASYNC, ERR_IO_PENDING, 6), CreateMockRead(*stream2_headers2, 7),
5243 CreateMockRead(*stream2_body, 8), MockRead(ASYNC, ERR_IO_PENDING, 9), 5366 CreateMockRead(*stream2_body, 8), MockRead(ASYNC, ERR_IO_PENDING, 9),
5244 MockRead(ASYNC, 0, 10), // EOF 5367 MockRead(ASYNC, 0, 10), // EOF
5245 }; 5368 };
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
5317 data.Resume(); 5440 data.Resume();
5318 base::RunLoop().RunUntilIdle(); 5441 base::RunLoop().RunUntilIdle();
5319 5442
5320 // Verify that we consumed all test data. 5443 // Verify that we consumed all test data.
5321 EXPECT_TRUE(data.AllReadDataConsumed()); 5444 EXPECT_TRUE(data.AllReadDataConsumed());
5322 EXPECT_TRUE(data.AllWriteDataConsumed()); 5445 EXPECT_TRUE(data.AllWriteDataConsumed());
5323 } 5446 }
5324 5447
5325 TEST_P(SpdyNetworkTransactionTest, ServerPushWithNoStatusHeaderFrames) { 5448 TEST_P(SpdyNetworkTransactionTest, ServerPushWithNoStatusHeaderFrames) {
5326 // We push a stream and attempt to claim it before the headers come down. 5449 // We push a stream and attempt to claim it before the headers come down.
5327 scoped_ptr<SpdyFrame> stream1_syn( 5450 scoped_ptr<SpdySerializedFrame> stream1_syn(
5328 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 5451 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
5329 MockWrite writes[] = { 5452 MockWrite writes[] = {
5330 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS), 5453 CreateMockWrite(*stream1_syn, 0, SYNCHRONOUS),
5331 }; 5454 };
5332 5455
5333 scoped_ptr<SpdyFrame> stream1_reply( 5456 scoped_ptr<SpdySerializedFrame> stream1_reply(
5334 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 5457 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
5335 5458
5336 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock()); 5459 scoped_ptr<SpdyHeaderBlock> initial_headers(new SpdyHeaderBlock());
5337 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"), 5460 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/foo.dat"),
5338 initial_headers.get()); 5461 initial_headers.get());
5339 scoped_ptr<SpdyFrame> stream2_syn(spdy_util_.ConstructInitialSpdyPushFrame( 5462 scoped_ptr<SpdySerializedFrame> stream2_syn(
5340 std::move(initial_headers), 2, 1)); 5463 spdy_util_.ConstructInitialSpdyPushFrame(std::move(initial_headers), 2,
5464 1));
5341 5465
5342 scoped_ptr<SpdyFrame> stream1_body( 5466 scoped_ptr<SpdySerializedFrame> stream1_body(
5343 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5467 spdy_util_.ConstructSpdyBodyFrame(1, true));
5344 5468
5345 SpdyHeaderBlock middle_headers; 5469 SpdyHeaderBlock middle_headers;
5346 middle_headers["hello"] = "bye"; 5470 middle_headers["hello"] = "bye";
5347 scoped_ptr<SpdyFrame> stream2_headers1( 5471 scoped_ptr<SpdySerializedFrame> stream2_headers1(
5348 spdy_util_.ConstructSpdyResponseHeaders(2, middle_headers, false)); 5472 spdy_util_.ConstructSpdyResponseHeaders(2, middle_headers, false));
5349 5473
5350 const char kPushedData[] = "pushed"; 5474 const char kPushedData[] = "pushed";
5351 scoped_ptr<SpdyFrame> stream2_body( 5475 scoped_ptr<SpdySerializedFrame> stream2_body(
5352 spdy_util_.ConstructSpdyBodyFrame( 5476 spdy_util_.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
5353 2, kPushedData, strlen(kPushedData), true)); 5477 true));
5354 5478
5355 MockRead reads[] = { 5479 MockRead reads[] = {
5356 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2), 5480 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream2_syn, 2),
5357 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4), 5481 CreateMockRead(*stream1_body, 3), MockRead(ASYNC, ERR_IO_PENDING, 4),
5358 CreateMockRead(*stream2_headers1, 5), CreateMockRead(*stream2_body, 6), 5482 CreateMockRead(*stream2_headers1, 5), CreateMockRead(*stream2_body, 6),
5359 MockRead(ASYNC, ERR_IO_PENDING, 7), MockRead(ASYNC, 0, 8), // EOF 5483 MockRead(ASYNC, ERR_IO_PENDING, 7), MockRead(ASYNC, 0, 8), // EOF
5360 }; 5484 };
5361 5485
5362 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 5486 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5363 5487
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
5414 // Read the final EOF (which will close the session). 5538 // Read the final EOF (which will close the session).
5415 data.Resume(); 5539 data.Resume();
5416 base::RunLoop().RunUntilIdle(); 5540 base::RunLoop().RunUntilIdle();
5417 5541
5418 // Verify that we consumed all test data. 5542 // Verify that we consumed all test data.
5419 EXPECT_TRUE(data.AllReadDataConsumed()); 5543 EXPECT_TRUE(data.AllReadDataConsumed());
5420 EXPECT_TRUE(data.AllWriteDataConsumed()); 5544 EXPECT_TRUE(data.AllWriteDataConsumed());
5421 } 5545 }
5422 5546
5423 TEST_P(SpdyNetworkTransactionTest, SynReplyWithHeaders) { 5547 TEST_P(SpdyNetworkTransactionTest, SynReplyWithHeaders) {
5424 scoped_ptr<SpdyFrame> req( 5548 scoped_ptr<SpdySerializedFrame> req(
5425 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 5549 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
5426 scoped_ptr<SpdyFrame> rst( 5550 scoped_ptr<SpdySerializedFrame> rst(
5427 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 5551 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
5428 MockWrite writes[] = { 5552 MockWrite writes[] = {
5429 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4), 5553 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 4),
5430 }; 5554 };
5431 5555
5432 scoped_ptr<SpdyFrame> stream1_reply( 5556 scoped_ptr<SpdySerializedFrame> stream1_reply(
5433 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5557 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5434 5558
5435 SpdyHeaderBlock late_headers; 5559 SpdyHeaderBlock late_headers;
5436 late_headers["hello"] = "bye"; 5560 late_headers["hello"] = "bye";
5437 scoped_ptr<SpdyFrame> stream1_headers( 5561 scoped_ptr<SpdySerializedFrame> stream1_headers(
5438 spdy_util_.ConstructSpdyResponseHeaders(1, late_headers, false)); 5562 spdy_util_.ConstructSpdyResponseHeaders(1, late_headers, false));
5439 scoped_ptr<SpdyFrame> stream1_body( 5563 scoped_ptr<SpdySerializedFrame> stream1_body(
5440 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5564 spdy_util_.ConstructSpdyBodyFrame(1, true));
5441 MockRead reads[] = { 5565 MockRead reads[] = {
5442 CreateMockRead(*stream1_reply, 1), 5566 CreateMockRead(*stream1_reply, 1),
5443 CreateMockRead(*stream1_headers, 2), 5567 CreateMockRead(*stream1_headers, 2),
5444 CreateMockRead(*stream1_body, 3), 5568 CreateMockRead(*stream1_body, 3),
5445 MockRead(ASYNC, 0, 5) // EOF 5569 MockRead(ASYNC, 0, 5) // EOF
5446 }; 5570 };
5447 5571
5448 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 5572 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5449 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5573 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5450 BoundNetLog(), GetParam(), NULL); 5574 BoundNetLog(), GetParam(), NULL);
5451 helper.RunToCompletion(&data); 5575 helper.RunToCompletion(&data);
5452 TransactionHelperResult out = helper.output(); 5576 TransactionHelperResult out = helper.output();
5453 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 5577 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
5454 } 5578 }
5455 5579
5456 // Tests that receiving HEADERS, DATA, HEADERS, and DATA in that sequence will 5580 // Tests that receiving HEADERS, DATA, HEADERS, and DATA in that sequence will
5457 // trigger a ERR_SPDY_PROTOCOL_ERROR because trailing HEADERS must not be 5581 // trigger a ERR_SPDY_PROTOCOL_ERROR because trailing HEADERS must not be
5458 // followed by any DATA frames. 5582 // followed by any DATA frames.
5459 TEST_P(SpdyNetworkTransactionTest, SyncReplyDataAfterTrailers) { 5583 TEST_P(SpdyNetworkTransactionTest, SyncReplyDataAfterTrailers) {
5460 scoped_ptr<SpdyFrame> req( 5584 scoped_ptr<SpdySerializedFrame> req(
5461 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 5585 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
5462 scoped_ptr<SpdyFrame> rst( 5586 scoped_ptr<SpdySerializedFrame> rst(
5463 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 5587 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
5464 MockWrite writes[] = { 5588 MockWrite writes[] = {
5465 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5), 5589 CreateMockWrite(*req, 0), CreateMockWrite(*rst, 5),
5466 }; 5590 };
5467 5591
5468 scoped_ptr<SpdyFrame> stream1_reply( 5592 scoped_ptr<SpdySerializedFrame> stream1_reply(
5469 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 5593 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
5470 scoped_ptr<SpdyFrame> stream1_body( 5594 scoped_ptr<SpdySerializedFrame> stream1_body(
5471 spdy_util_.ConstructSpdyBodyFrame(1, false)); 5595 spdy_util_.ConstructSpdyBodyFrame(1, false));
5472 5596
5473 SpdyHeaderBlock late_headers; 5597 SpdyHeaderBlock late_headers;
5474 late_headers["hello"] = "bye"; 5598 late_headers["hello"] = "bye";
5475 scoped_ptr<SpdyFrame> stream1_headers( 5599 scoped_ptr<SpdySerializedFrame> stream1_headers(
5476 spdy_util_.ConstructSpdyResponseHeaders(1, late_headers, false)); 5600 spdy_util_.ConstructSpdyResponseHeaders(1, late_headers, false));
5477 scoped_ptr<SpdyFrame> stream1_body2( 5601 scoped_ptr<SpdySerializedFrame> stream1_body2(
5478 spdy_util_.ConstructSpdyBodyFrame(1, true)); 5602 spdy_util_.ConstructSpdyBodyFrame(1, true));
5479 MockRead reads[] = { 5603 MockRead reads[] = {
5480 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream1_body, 2), 5604 CreateMockRead(*stream1_reply, 1), CreateMockRead(*stream1_body, 2),
5481 CreateMockRead(*stream1_headers, 3), CreateMockRead(*stream1_body2, 4), 5605 CreateMockRead(*stream1_headers, 3), CreateMockRead(*stream1_body2, 4),
5482 MockRead(ASYNC, 0, 6) // EOF 5606 MockRead(ASYNC, 0, 6) // EOF
5483 }; 5607 };
5484 5608
5485 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 5609 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5486 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 5610 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5487 BoundNetLog(), GetParam(), NULL); 5611 BoundNetLog(), GetParam(), NULL);
(...skipping 27 matching lines...) Expand all
5515 "https://www.example.org/foo.html", 5639 "https://www.example.org/foo.html",
5516 "https://www.foo.com/foo.js", // Cross domain 5640 "https://www.foo.com/foo.js", // Cross domain
5517 }; 5641 };
5518 5642
5519 for (size_t index = 0; index < arraysize(kTestCases); index += 2) { 5643 for (size_t index = 0; index < arraysize(kTestCases); index += 2) {
5520 const char* url_to_fetch = kTestCases[index]; 5644 const char* url_to_fetch = kTestCases[index];
5521 const char* url_to_push = kTestCases[index + 1]; 5645 const char* url_to_push = kTestCases[index + 1];
5522 5646
5523 SpdyTestUtil spdy_test_util(GetParam().protocol, 5647 SpdyTestUtil spdy_test_util(GetParam().protocol,
5524 GetParam().priority_to_dependency); 5648 GetParam().priority_to_dependency);
5525 scoped_ptr<SpdyFrame> stream1_syn( 5649 scoped_ptr<SpdySerializedFrame> stream1_syn(
5526 spdy_test_util.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); 5650 spdy_test_util.ConstructSpdyGet(url_to_fetch, 1, LOWEST));
5527 scoped_ptr<SpdyFrame> stream1_body( 5651 scoped_ptr<SpdySerializedFrame> stream1_body(
5528 spdy_test_util.ConstructSpdyBodyFrame(1, true)); 5652 spdy_test_util.ConstructSpdyBodyFrame(1, true));
5529 scoped_ptr<SpdyFrame> push_rst( 5653 scoped_ptr<SpdySerializedFrame> push_rst(
5530 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 5654 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
5531 MockWrite writes[] = { 5655 MockWrite writes[] = {
5532 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*push_rst, 3), 5656 CreateMockWrite(*stream1_syn, 0), CreateMockWrite(*push_rst, 3),
5533 }; 5657 };
5534 5658
5535 scoped_ptr<SpdyFrame> stream1_reply( 5659 scoped_ptr<SpdySerializedFrame> stream1_reply(
5536 spdy_test_util.ConstructSpdyGetSynReply(nullptr, 0, 1)); 5660 spdy_test_util.ConstructSpdyGetSynReply(nullptr, 0, 1));
5537 scoped_ptr<SpdyFrame> stream2_syn( 5661 scoped_ptr<SpdySerializedFrame> stream2_syn(
5538 spdy_test_util.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); 5662 spdy_test_util.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push));
5539 const char kPushedData[] = "pushed"; 5663 const char kPushedData[] = "pushed";
5540 scoped_ptr<SpdyFrame> stream2_body(spdy_test_util.ConstructSpdyBodyFrame( 5664 scoped_ptr<SpdySerializedFrame> stream2_body(
5541 2, kPushedData, strlen(kPushedData), true)); 5665 spdy_test_util.ConstructSpdyBodyFrame(2, kPushedData,
5542 scoped_ptr<SpdyFrame> rst( 5666 strlen(kPushedData), true));
5667 scoped_ptr<SpdySerializedFrame> rst(
5543 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_CANCEL)); 5668 spdy_test_util.ConstructSpdyRstStream(2, RST_STREAM_CANCEL));
5544 5669
5545 MockRead reads[] = { 5670 MockRead reads[] = {
5546 CreateMockRead(*stream1_reply, 1), 5671 CreateMockRead(*stream1_reply, 1),
5547 CreateMockRead(*stream2_syn, 2), 5672 CreateMockRead(*stream2_syn, 2),
5548 CreateMockRead(*stream1_body, 4), 5673 CreateMockRead(*stream1_body, 4),
5549 CreateMockRead(*stream2_body, 5), 5674 CreateMockRead(*stream2_body, 5),
5550 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause 5675 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), // Force a pause
5551 }; 5676 };
5552 5677
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
5601 } 5726 }
5602 } 5727 }
5603 5728
5604 // Verify that push works cross origin as long as the certificate is valid for 5729 // Verify that push works cross origin as long as the certificate is valid for
5605 // the pushed authority. 5730 // the pushed authority.
5606 TEST_P(SpdyNetworkTransactionTest, ServerPushValidCrossOrigin) { 5731 TEST_P(SpdyNetworkTransactionTest, ServerPushValidCrossOrigin) {
5607 // "spdy_pooling.pem" is valid for both www.example.org and mail.example.org. 5732 // "spdy_pooling.pem" is valid for both www.example.org and mail.example.org.
5608 const char* url_to_fetch = "https://www.example.org"; 5733 const char* url_to_fetch = "https://www.example.org";
5609 const char* url_to_push = "https://mail.example.org"; 5734 const char* url_to_push = "https://mail.example.org";
5610 5735
5611 scoped_ptr<SpdyFrame> headers( 5736 scoped_ptr<SpdySerializedFrame> headers(
5612 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); 5737 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST));
5613 MockWrite writes[] = { 5738 MockWrite writes[] = {
5614 CreateMockWrite(*headers, 0), 5739 CreateMockWrite(*headers, 0),
5615 }; 5740 };
5616 5741
5617 scoped_ptr<SpdyFrame> reply( 5742 scoped_ptr<SpdySerializedFrame> reply(
5618 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 5743 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
5619 scoped_ptr<SpdyFrame> push( 5744 scoped_ptr<SpdySerializedFrame> push(
5620 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); 5745 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push));
5621 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 5746 scoped_ptr<SpdySerializedFrame> body(
5747 spdy_util_.ConstructSpdyBodyFrame(1, true));
5622 const char kPushedData[] = "pushed"; 5748 const char kPushedData[] = "pushed";
5623 scoped_ptr<SpdyFrame> pushed_body(spdy_util_.ConstructSpdyBodyFrame( 5749 scoped_ptr<SpdySerializedFrame> pushed_body(spdy_util_.ConstructSpdyBodyFrame(
5624 2, kPushedData, strlen(kPushedData), true)); 5750 2, kPushedData, strlen(kPushedData), true));
5625 MockRead reads[] = { 5751 MockRead reads[] = {
5626 CreateMockRead(*reply, 1), 5752 CreateMockRead(*reply, 1),
5627 CreateMockRead(*push, 2), 5753 CreateMockRead(*push, 2),
5628 CreateMockRead(*body, 3), 5754 CreateMockRead(*body, 3),
5629 CreateMockRead(*pushed_body, 4), 5755 CreateMockRead(*pushed_body, 4),
5630 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), 5756 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
5631 }; 5757 };
5632 5758
5633 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 5759 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
5702 if (GetParam().ssl_type != HTTPS_SPDY_VIA_NPN) 5828 if (GetParam().ssl_type != HTTPS_SPDY_VIA_NPN)
5703 return; 5829 return;
5704 5830
5705 const char* url_to_fetch0 = "https://mail.example.org/foo"; 5831 const char* url_to_fetch0 = "https://mail.example.org/foo";
5706 const char* url_to_fetch1 = "https://docs.example.org"; 5832 const char* url_to_fetch1 = "https://docs.example.org";
5707 const char* url_to_push = "https://mail.example.org/bar"; 5833 const char* url_to_push = "https://mail.example.org/bar";
5708 5834
5709 SpdyTestUtil spdy_util_0(GetParam().protocol, 5835 SpdyTestUtil spdy_util_0(GetParam().protocol,
5710 GetParam().priority_to_dependency); 5836 GetParam().priority_to_dependency);
5711 5837
5712 scoped_ptr<SpdyFrame> headers0( 5838 scoped_ptr<SpdySerializedFrame> headers0(
5713 spdy_util_0.ConstructSpdyGet(url_to_fetch0, 1, LOWEST)); 5839 spdy_util_0.ConstructSpdyGet(url_to_fetch0, 1, LOWEST));
5714 MockWrite writes0[] = { 5840 MockWrite writes0[] = {
5715 CreateMockWrite(*headers0, 0), 5841 CreateMockWrite(*headers0, 0),
5716 }; 5842 };
5717 5843
5718 scoped_ptr<SpdyFrame> reply0( 5844 scoped_ptr<SpdySerializedFrame> reply0(
5719 spdy_util_0.ConstructSpdyGetSynReply(nullptr, 0, 1)); 5845 spdy_util_0.ConstructSpdyGetSynReply(nullptr, 0, 1));
5720 const char kData0[] = "first"; 5846 const char kData0[] = "first";
5721 scoped_ptr<SpdyFrame> body0( 5847 scoped_ptr<SpdySerializedFrame> body0(
5722 spdy_util_0.ConstructSpdyBodyFrame(1, kData0, strlen(kData0), true)); 5848 spdy_util_0.ConstructSpdyBodyFrame(1, kData0, strlen(kData0), true));
5723 MockRead reads0[] = { 5849 MockRead reads0[] = {
5724 CreateMockRead(*reply0, 1), 5850 CreateMockRead(*reply0, 1),
5725 CreateMockRead(*body0, 2), 5851 CreateMockRead(*body0, 2),
5726 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3) 5852 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 3)
5727 }; 5853 };
5728 5854
5729 SequencedSocketData data0(reads0, arraysize(reads0), writes0, 5855 SequencedSocketData data0(reads0, arraysize(reads0), writes0,
5730 arraysize(writes0)); 5856 arraysize(writes0));
5731 5857
5732 SpdyTestUtil spdy_util_1(GetParam().protocol, 5858 SpdyTestUtil spdy_util_1(GetParam().protocol,
5733 GetParam().priority_to_dependency); 5859 GetParam().priority_to_dependency);
5734 5860
5735 scoped_ptr<SpdyFrame> headers1( 5861 scoped_ptr<SpdySerializedFrame> headers1(
5736 spdy_util_1.ConstructSpdyGet(url_to_fetch1, 1, LOWEST)); 5862 spdy_util_1.ConstructSpdyGet(url_to_fetch1, 1, LOWEST));
5737 MockWrite writes1[] = { 5863 MockWrite writes1[] = {
5738 CreateMockWrite(*headers1, 0), 5864 CreateMockWrite(*headers1, 0),
5739 }; 5865 };
5740 5866
5741 scoped_ptr<SpdyFrame> reply1( 5867 scoped_ptr<SpdySerializedFrame> reply1(
5742 spdy_util_1.ConstructSpdyGetSynReply(nullptr, 0, 1)); 5868 spdy_util_1.ConstructSpdyGetSynReply(nullptr, 0, 1));
5743 scoped_ptr<SpdyFrame> push( 5869 scoped_ptr<SpdySerializedFrame> push(
5744 spdy_util_1.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); 5870 spdy_util_1.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push));
5745 const char kData1[] = "second"; 5871 const char kData1[] = "second";
5746 scoped_ptr<SpdyFrame> body1( 5872 scoped_ptr<SpdySerializedFrame> body1(
5747 spdy_util_1.ConstructSpdyBodyFrame(1, kData1, strlen(kData1), true)); 5873 spdy_util_1.ConstructSpdyBodyFrame(1, kData1, strlen(kData1), true));
5748 const char kPushedData[] = "pushed"; 5874 const char kPushedData[] = "pushed";
5749 scoped_ptr<SpdyFrame> pushed_body(spdy_util_1.ConstructSpdyBodyFrame( 5875 scoped_ptr<SpdySerializedFrame> pushed_body(
5750 2, kPushedData, strlen(kPushedData), true)); 5876 spdy_util_1.ConstructSpdyBodyFrame(2, kPushedData, strlen(kPushedData),
5877 true));
5751 5878
5752 MockRead reads1[] = { 5879 MockRead reads1[] = {
5753 CreateMockRead(*reply1, 1), 5880 CreateMockRead(*reply1, 1),
5754 CreateMockRead(*push, 2), 5881 CreateMockRead(*push, 2),
5755 CreateMockRead(*body1, 3), 5882 CreateMockRead(*body1, 3),
5756 CreateMockRead(*pushed_body, 4), 5883 CreateMockRead(*pushed_body, 4),
5757 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5), 5884 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 5),
5758 }; 5885 };
5759 5886
5760 SequencedSocketData data1(reads1, arraysize(reads1), writes1, 5887 SequencedSocketData data1(reads1, arraysize(reads1), writes1,
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
5872 ReadResult(trans2.get(), &result2); 5999 ReadResult(trans2.get(), &result2);
5873 EXPECT_EQ(kPushedData, result2); 6000 EXPECT_EQ(kPushedData, result2);
5874 } 6001 }
5875 6002
5876 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidCrossOrigin) { 6003 TEST_P(SpdyNetworkTransactionTest, ServerPushInvalidCrossOrigin) {
5877 // "spdy_pooling.pem" is valid for www.example.org, 6004 // "spdy_pooling.pem" is valid for www.example.org,
5878 // but not for invalid.example.org. 6005 // but not for invalid.example.org.
5879 const char* url_to_fetch = "https://www.example.org"; 6006 const char* url_to_fetch = "https://www.example.org";
5880 const char* url_to_push = "https://invalid.example.org"; 6007 const char* url_to_push = "https://invalid.example.org";
5881 6008
5882 scoped_ptr<SpdyFrame> headers( 6009 scoped_ptr<SpdySerializedFrame> headers(
5883 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST)); 6010 spdy_util_.ConstructSpdyGet(url_to_fetch, 1, LOWEST));
5884 scoped_ptr<SpdyFrame> rst( 6011 scoped_ptr<SpdySerializedFrame> rst(
5885 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM)); 6012 spdy_util_.ConstructSpdyRstStream(2, RST_STREAM_REFUSED_STREAM));
5886 MockWrite writes[] = { 6013 MockWrite writes[] = {
5887 CreateMockWrite(*headers, 0), 6014 CreateMockWrite(*headers, 0),
5888 CreateMockWrite(*rst, 3), 6015 CreateMockWrite(*rst, 3),
5889 }; 6016 };
5890 6017
5891 scoped_ptr<SpdyFrame> reply( 6018 scoped_ptr<SpdySerializedFrame> reply(
5892 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 6019 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
5893 scoped_ptr<SpdyFrame> push( 6020 scoped_ptr<SpdySerializedFrame> push(
5894 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push)); 6021 spdy_util_.ConstructSpdyPush(nullptr, 0, 2, 1, url_to_push));
5895 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 6022 scoped_ptr<SpdySerializedFrame> body(
6023 spdy_util_.ConstructSpdyBodyFrame(1, true));
5896 const char kPushedData[] = "pushed"; 6024 const char kPushedData[] = "pushed";
5897 scoped_ptr<SpdyFrame> pushed_body(spdy_util_.ConstructSpdyBodyFrame( 6025 scoped_ptr<SpdySerializedFrame> pushed_body(spdy_util_.ConstructSpdyBodyFrame(
5898 2, kPushedData, strlen(kPushedData), true)); 6026 2, kPushedData, strlen(kPushedData), true));
5899 MockRead reads[] = { 6027 MockRead reads[] = {
5900 CreateMockRead(*reply, 1), 6028 CreateMockRead(*reply, 1),
5901 CreateMockRead(*push, 2), 6029 CreateMockRead(*push, 2),
5902 CreateMockRead(*body, 4), 6030 CreateMockRead(*body, 4),
5903 CreateMockRead(*pushed_body, 5), 6031 CreateMockRead(*pushed_body, 5),
5904 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6), 6032 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 6),
5905 }; 6033 };
5906 6034
5907 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 6035 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5908 6036
5909 HttpRequestInfo request; 6037 HttpRequestInfo request;
5910 request.method = "GET"; 6038 request.method = "GET";
5911 request.url = GURL(url_to_fetch); 6039 request.url = GURL(url_to_fetch);
5912 request.load_flags = 0; 6040 request.load_flags = 0;
5913 6041
5914 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 6042 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
5915 GetParam(), nullptr); 6043 GetParam(), nullptr);
5916 helper.RunToCompletion(&data); 6044 helper.RunToCompletion(&data);
5917 TransactionHelperResult out = helper.output(); 6045 TransactionHelperResult out = helper.output();
5918 EXPECT_EQ("HTTP/1.1 200", out.status_line); 6046 EXPECT_EQ("HTTP/1.1 200", out.status_line);
5919 EXPECT_EQ("hello!", out.response_data); 6047 EXPECT_EQ("hello!", out.response_data);
5920 } 6048 }
5921 6049
5922 TEST_P(SpdyNetworkTransactionTest, RetryAfterRefused) { 6050 TEST_P(SpdyNetworkTransactionTest, RetryAfterRefused) {
5923 // Construct the request. 6051 // Construct the request.
5924 scoped_ptr<SpdyFrame> req( 6052 scoped_ptr<SpdySerializedFrame> req(
5925 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 6053 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
5926 // Will be destroyed by the RST before stream 3 starts. 6054 // Will be destroyed by the RST before stream 3 starts.
5927 spdy_util_.UpdateWithStreamDestruction(1); 6055 spdy_util_.UpdateWithStreamDestruction(1);
5928 scoped_ptr<SpdyFrame> req2( 6056 scoped_ptr<SpdySerializedFrame> req2(
5929 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 6057 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
5930 MockWrite writes[] = { 6058 MockWrite writes[] = {
5931 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 2), 6059 CreateMockWrite(*req, 0), CreateMockWrite(*req2, 2),
5932 }; 6060 };
5933 6061
5934 scoped_ptr<SpdyFrame> refused( 6062 scoped_ptr<SpdySerializedFrame> refused(
5935 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM)); 6063 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_REFUSED_STREAM));
5936 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 6064 scoped_ptr<SpdySerializedFrame> resp(
5937 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(3, true)); 6065 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
6066 scoped_ptr<SpdySerializedFrame> body(
6067 spdy_util_.ConstructSpdyBodyFrame(3, true));
5938 MockRead reads[] = { 6068 MockRead reads[] = {
5939 CreateMockRead(*refused, 1), 6069 CreateMockRead(*refused, 1),
5940 CreateMockRead(*resp, 3), 6070 CreateMockRead(*resp, 3),
5941 CreateMockRead(*body, 4), 6071 CreateMockRead(*body, 4),
5942 MockRead(ASYNC, 0, 5) // EOF 6072 MockRead(ASYNC, 0, 5) // EOF
5943 }; 6073 };
5944 6074
5945 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 6075 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
5946 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY, 6076 NormalSpdyTransactionHelper helper(CreateGetRequest(), DEFAULT_PRIORITY,
5947 BoundNetLog(), GetParam(), NULL); 6077 BoundNetLog(), GetParam(), NULL);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5979 // Note that the requests and responses created below are expectations 6109 // Note that the requests and responses created below are expectations
5980 // of what the above will produce on the wire, and hence are in the 6110 // of what the above will produce on the wire, and hence are in the
5981 // initial->HIGHEST->LOWEST priority. 6111 // initial->HIGHEST->LOWEST priority.
5982 // 6112 //
5983 // Frames are created by SpdySession just before the write associated 6113 // Frames are created by SpdySession just before the write associated
5984 // with the frame is attempted, so stream dependencies will be based 6114 // with the frame is attempted, so stream dependencies will be based
5985 // on the streams alive at the point of the request write attempt. Thus 6115 // on the streams alive at the point of the request write attempt. Thus
5986 // req1 is alive when req2 is attempted (during but not after the 6116 // req1 is alive when req2 is attempted (during but not after the
5987 // |data.RunFor(2);| statement below) but not when req3 is attempted. 6117 // |data.RunFor(2);| statement below) but not when req3 is attempted.
5988 // The call to spdy_util_.UpdateWithStreamDestruction() reflects this. 6118 // The call to spdy_util_.UpdateWithStreamDestruction() reflects this.
5989 scoped_ptr<SpdyFrame> req1( 6119 scoped_ptr<SpdySerializedFrame> req1(
5990 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 6120 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
5991 scoped_ptr<SpdyFrame> req2( 6121 scoped_ptr<SpdySerializedFrame> req2(
5992 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, HIGHEST, true)); 6122 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, HIGHEST, true));
5993 spdy_util_.UpdateWithStreamDestruction(1); 6123 spdy_util_.UpdateWithStreamDestruction(1);
5994 scoped_ptr<SpdyFrame> req3( 6124 scoped_ptr<SpdySerializedFrame> req3(
5995 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, MEDIUM, true)); 6125 spdy_util_.ConstructSpdyGet(nullptr, 0, 5, MEDIUM, true));
5996 MockWrite writes[] = { 6126 MockWrite writes[] = {
5997 MockWrite(ASYNC, ERR_IO_PENDING, 0), CreateMockWrite(*req1, 1), 6127 MockWrite(ASYNC, ERR_IO_PENDING, 0), CreateMockWrite(*req1, 1),
5998 CreateMockWrite(*req2, 5), CreateMockWrite(*req3, 6), 6128 CreateMockWrite(*req2, 5), CreateMockWrite(*req3, 6),
5999 }; 6129 };
6000 6130
6001 scoped_ptr<SpdyFrame> resp1(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 6131 scoped_ptr<SpdySerializedFrame> resp1(
6002 scoped_ptr<SpdyFrame> body1(spdy_util_.ConstructSpdyBodyFrame(1, true)); 6132 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
6003 scoped_ptr<SpdyFrame> resp2(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 6133 scoped_ptr<SpdySerializedFrame> body1(
6004 scoped_ptr<SpdyFrame> body2(spdy_util_.ConstructSpdyBodyFrame(3, true)); 6134 spdy_util_.ConstructSpdyBodyFrame(1, true));
6005 scoped_ptr<SpdyFrame> resp3(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5)); 6135 scoped_ptr<SpdySerializedFrame> resp2(
6006 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(5, true)); 6136 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3));
6137 scoped_ptr<SpdySerializedFrame> body2(
6138 spdy_util_.ConstructSpdyBodyFrame(3, true));
6139 scoped_ptr<SpdySerializedFrame> resp3(
6140 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 5));
6141 scoped_ptr<SpdySerializedFrame> body3(
6142 spdy_util_.ConstructSpdyBodyFrame(5, true));
6007 MockRead reads[] = { 6143 MockRead reads[] = {
6008 CreateMockRead(*resp1, 2), MockRead(ASYNC, ERR_IO_PENDING, 3), 6144 CreateMockRead(*resp1, 2), MockRead(ASYNC, ERR_IO_PENDING, 3),
6009 CreateMockRead(*body1, 4), CreateMockRead(*resp2, 7), 6145 CreateMockRead(*body1, 4), CreateMockRead(*resp2, 7),
6010 CreateMockRead(*body2, 8), CreateMockRead(*resp3, 9), 6146 CreateMockRead(*body2, 8), CreateMockRead(*resp3, 9),
6011 CreateMockRead(*body3, 10), MockRead(ASYNC, 0, 11) // EOF 6147 CreateMockRead(*body3, 10), MockRead(ASYNC, 0, 11) // EOF
6012 }; 6148 };
6013 6149
6014 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 6150 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6015 NormalSpdyTransactionHelper helper(CreateGetRequest(), LOWEST, 6151 NormalSpdyTransactionHelper helper(CreateGetRequest(), LOWEST,
6016 BoundNetLog(), GetParam(), NULL); 6152 BoundNetLog(), GetParam(), NULL);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
6082 6218
6083 // TODO(agayev): develop a socket data provider where both, reads and 6219 // TODO(agayev): develop a socket data provider where both, reads and
6084 // writes are ordered so that writing tests like these are easy and rewrite 6220 // writes are ordered so that writing tests like these are easy and rewrite
6085 // all these tests using it. Right now we are working around the 6221 // all these tests using it. Right now we are working around the
6086 // limitations as described above and it's not deterministic, tests may 6222 // limitations as described above and it's not deterministic, tests may
6087 // fail under specific circumstances. 6223 // fail under specific circumstances.
6088 TEST_P(SpdyNetworkTransactionTest, WindowUpdateReceived) { 6224 TEST_P(SpdyNetworkTransactionTest, WindowUpdateReceived) {
6089 static int kFrameCount = 2; 6225 static int kFrameCount = 2;
6090 scoped_ptr<std::string> content( 6226 scoped_ptr<std::string> content(
6091 new std::string(kMaxSpdyFrameChunkSize, 'a')); 6227 new std::string(kMaxSpdyFrameChunkSize, 'a'));
6092 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 6228 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost(
6093 GetDefaultUrl(), 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, NULL, 6229 GetDefaultUrl(), 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, NULL,
6094 0)); 6230 0));
6095 scoped_ptr<SpdyFrame> body( 6231 scoped_ptr<SpdySerializedFrame> body(spdy_util_.ConstructSpdyBodyFrame(
6096 spdy_util_.ConstructSpdyBodyFrame( 6232 1, content->c_str(), content->size(), false));
6097 1, content->c_str(), content->size(), false)); 6233 scoped_ptr<SpdySerializedFrame> body_end(spdy_util_.ConstructSpdyBodyFrame(
6098 scoped_ptr<SpdyFrame> body_end( 6234 1, content->c_str(), content->size(), true));
6099 spdy_util_.ConstructSpdyBodyFrame(
6100 1, content->c_str(), content->size(), true));
6101 6235
6102 MockWrite writes[] = { 6236 MockWrite writes[] = {
6103 CreateMockWrite(*req, 0), 6237 CreateMockWrite(*req, 0),
6104 CreateMockWrite(*body, 1), 6238 CreateMockWrite(*body, 1),
6105 CreateMockWrite(*body_end, 2), 6239 CreateMockWrite(*body_end, 2),
6106 }; 6240 };
6107 6241
6108 static const int32_t kDeltaWindowSize = 0xff; 6242 static const int32_t kDeltaWindowSize = 0xff;
6109 static const int kDeltaCount = 4; 6243 static const int kDeltaCount = 4;
6110 scoped_ptr<SpdyFrame> window_update( 6244 scoped_ptr<SpdySerializedFrame> window_update(
6111 spdy_util_.ConstructSpdyWindowUpdate(1, kDeltaWindowSize)); 6245 spdy_util_.ConstructSpdyWindowUpdate(1, kDeltaWindowSize));
6112 scoped_ptr<SpdyFrame> window_update_dummy( 6246 scoped_ptr<SpdySerializedFrame> window_update_dummy(
6113 spdy_util_.ConstructSpdyWindowUpdate(2, kDeltaWindowSize)); 6247 spdy_util_.ConstructSpdyWindowUpdate(2, kDeltaWindowSize));
6114 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 6248 scoped_ptr<SpdySerializedFrame> resp(
6249 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
6115 MockRead reads[] = { 6250 MockRead reads[] = {
6116 CreateMockRead(*window_update_dummy, 3), 6251 CreateMockRead(*window_update_dummy, 3),
6117 CreateMockRead(*window_update_dummy, 4), 6252 CreateMockRead(*window_update_dummy, 4),
6118 CreateMockRead(*window_update_dummy, 5), 6253 CreateMockRead(*window_update_dummy, 5),
6119 CreateMockRead(*window_update, 6), // Four updates, therefore window 6254 CreateMockRead(*window_update, 6), // Four updates, therefore window
6120 CreateMockRead(*window_update, 7), // size should increase by 6255 CreateMockRead(*window_update, 7), // size should increase by
6121 CreateMockRead(*window_update, 8), // kDeltaWindowSize * 4 6256 CreateMockRead(*window_update, 8), // kDeltaWindowSize * 4
6122 CreateMockRead(*window_update, 9), CreateMockRead(*resp, 10), 6257 CreateMockRead(*window_update, 9), CreateMockRead(*resp, 10),
6123 MockRead(ASYNC, ERR_IO_PENDING, 11), CreateMockRead(*body_end, 12), 6258 MockRead(ASYNC, ERR_IO_PENDING, 11), CreateMockRead(*body_end, 12),
6124 MockRead(ASYNC, 0, 13) // EOF 6259 MockRead(ASYNC, 0, 13) // EOF
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
6202 session_max_recv_window_size / 2 + kChunkSize; 6337 session_max_recv_window_size / 2 + kChunkSize;
6203 ASSERT_EQ(0, stream_max_recv_window_size / 2 % kChunkSize); 6338 ASSERT_EQ(0, stream_max_recv_window_size / 2 % kChunkSize);
6204 const int32_t stream_window_update_delta = 6339 const int32_t stream_window_update_delta =
6205 stream_max_recv_window_size / 2 + kChunkSize; 6340 stream_max_recv_window_size / 2 + kChunkSize;
6206 6341
6207 SettingsMap initial_settings; 6342 SettingsMap initial_settings;
6208 initial_settings[SETTINGS_MAX_CONCURRENT_STREAMS] = 6343 initial_settings[SETTINGS_MAX_CONCURRENT_STREAMS] =
6209 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams); 6344 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, kMaxConcurrentPushedStreams);
6210 initial_settings[SETTINGS_INITIAL_WINDOW_SIZE] = 6345 initial_settings[SETTINGS_INITIAL_WINDOW_SIZE] =
6211 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, stream_max_recv_window_size); 6346 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, stream_max_recv_window_size);
6212 scoped_ptr<SpdyFrame> initial_settings_frame( 6347 scoped_ptr<SpdySerializedFrame> initial_settings_frame(
6213 spdy_util_.ConstructSpdySettings(initial_settings)); 6348 spdy_util_.ConstructSpdySettings(initial_settings));
6214 scoped_ptr<SpdyFrame> initial_window_update( 6349 scoped_ptr<SpdySerializedFrame> initial_window_update(
6215 spdy_util_.ConstructSpdyWindowUpdate( 6350 spdy_util_.ConstructSpdyWindowUpdate(
6216 kSessionFlowControlStreamId, 6351 kSessionFlowControlStreamId,
6217 session_max_recv_window_size - default_initial_window_size)); 6352 session_max_recv_window_size - default_initial_window_size));
6218 scoped_ptr<SpdyFrame> req( 6353 scoped_ptr<SpdySerializedFrame> req(
6219 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 6354 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
6220 scoped_ptr<SpdyFrame> session_window_update( 6355 scoped_ptr<SpdySerializedFrame> session_window_update(
6221 spdy_util_.ConstructSpdyWindowUpdate(0, session_window_update_delta)); 6356 spdy_util_.ConstructSpdyWindowUpdate(0, session_window_update_delta));
6222 scoped_ptr<SpdyFrame> stream_window_update( 6357 scoped_ptr<SpdySerializedFrame> stream_window_update(
6223 spdy_util_.ConstructSpdyWindowUpdate(1, stream_window_update_delta)); 6358 spdy_util_.ConstructSpdyWindowUpdate(1, stream_window_update_delta));
6224 6359
6225 std::vector<MockWrite> writes; 6360 std::vector<MockWrite> writes;
6226 if (GetParam().protocol == kProtoHTTP2) { 6361 if (GetParam().protocol == kProtoHTTP2) {
6227 writes.push_back(MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix, 6362 writes.push_back(MockWrite(ASYNC, kHttp2ConnectionHeaderPrefix,
6228 kHttp2ConnectionHeaderPrefixSize, 0)); 6363 kHttp2ConnectionHeaderPrefixSize, 0));
6229 } 6364 }
6230 writes.push_back(CreateMockWrite(*initial_settings_frame, writes.size())); 6365 writes.push_back(CreateMockWrite(*initial_settings_frame, writes.size()));
6231 writes.push_back(CreateMockWrite(*initial_window_update, writes.size())); 6366 writes.push_back(CreateMockWrite(*initial_window_update, writes.size()));
6232 writes.push_back(CreateMockWrite(*req, writes.size())); 6367 writes.push_back(CreateMockWrite(*req, writes.size()));
6233 6368
6234 std::vector<MockRead> reads; 6369 std::vector<MockRead> reads;
6235 scoped_ptr<SpdyFrame> resp( 6370 scoped_ptr<SpdySerializedFrame> resp(
6236 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 6371 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
6237 reads.push_back(CreateMockRead(*resp, writes.size() + reads.size())); 6372 reads.push_back(CreateMockRead(*resp, writes.size() + reads.size()));
6238 6373
6239 std::vector<scoped_ptr<SpdyFrame>> body_frames; 6374 std::vector<scoped_ptr<SpdySerializedFrame>> body_frames;
6240 const std::string body_data(kChunkSize, 'x'); 6375 const std::string body_data(kChunkSize, 'x');
6241 for (size_t remaining = kTargetSize; remaining != 0;) { 6376 for (size_t remaining = kTargetSize; remaining != 0;) {
6242 size_t frame_size = std::min(remaining, body_data.size()); 6377 size_t frame_size = std::min(remaining, body_data.size());
6243 body_frames.push_back(make_scoped_ptr(spdy_util_.ConstructSpdyBodyFrame( 6378 body_frames.push_back(make_scoped_ptr(spdy_util_.ConstructSpdyBodyFrame(
6244 1, body_data.data(), frame_size, false))); 6379 1, body_data.data(), frame_size, false)));
6245 reads.push_back( 6380 reads.push_back(
6246 CreateMockRead(*body_frames.back(), writes.size() + reads.size())); 6381 CreateMockRead(*body_frames.back(), writes.size() + reads.size()));
6247 remaining -= frame_size; 6382 remaining -= frame_size;
6248 } 6383 }
6249 // Yield. 6384 // Yield.
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
6307 } 6442 }
6308 6443
6309 // Test that WINDOW_UPDATE frame causing overflow is handled correctly. 6444 // Test that WINDOW_UPDATE frame causing overflow is handled correctly.
6310 TEST_P(SpdyNetworkTransactionTest, WindowUpdateOverflow) { 6445 TEST_P(SpdyNetworkTransactionTest, WindowUpdateOverflow) {
6311 // Number of full frames we hope to write (but will not, used to 6446 // Number of full frames we hope to write (but will not, used to
6312 // set content-length header correctly) 6447 // set content-length header correctly)
6313 static int kFrameCount = 3; 6448 static int kFrameCount = 3;
6314 6449
6315 scoped_ptr<std::string> content( 6450 scoped_ptr<std::string> content(
6316 new std::string(kMaxSpdyFrameChunkSize, 'a')); 6451 new std::string(kMaxSpdyFrameChunkSize, 'a'));
6317 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 6452 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost(
6318 GetDefaultUrl(), 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, NULL, 6453 GetDefaultUrl(), 1, kMaxSpdyFrameChunkSize * kFrameCount, LOWEST, NULL,
6319 0)); 6454 0));
6320 scoped_ptr<SpdyFrame> body( 6455 scoped_ptr<SpdySerializedFrame> body(spdy_util_.ConstructSpdyBodyFrame(
6321 spdy_util_.ConstructSpdyBodyFrame( 6456 1, content->c_str(), content->size(), false));
6322 1, content->c_str(), content->size(), false)); 6457 scoped_ptr<SpdySerializedFrame> rst(
6323 scoped_ptr<SpdyFrame> rst(
6324 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR)); 6458 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_FLOW_CONTROL_ERROR));
6325 6459
6326 // We're not going to write a data frame with FIN, we'll receive a bad 6460 // We're not going to write a data frame with FIN, we'll receive a bad
6327 // WINDOW_UPDATE while sending a request and will send a RST_STREAM frame. 6461 // WINDOW_UPDATE while sending a request and will send a RST_STREAM frame.
6328 MockWrite writes[] = { 6462 MockWrite writes[] = {
6329 CreateMockWrite(*req, 0), 6463 CreateMockWrite(*req, 0),
6330 CreateMockWrite(*body, 2), 6464 CreateMockWrite(*body, 2),
6331 CreateMockWrite(*rst, 3), 6465 CreateMockWrite(*rst, 3),
6332 }; 6466 };
6333 6467
6334 static const int32_t kDeltaWindowSize = 0x7fffffff; // cause an overflow 6468 static const int32_t kDeltaWindowSize = 0x7fffffff; // cause an overflow
6335 scoped_ptr<SpdyFrame> window_update( 6469 scoped_ptr<SpdySerializedFrame> window_update(
6336 spdy_util_.ConstructSpdyWindowUpdate(1, kDeltaWindowSize)); 6470 spdy_util_.ConstructSpdyWindowUpdate(1, kDeltaWindowSize));
6337 MockRead reads[] = { 6471 MockRead reads[] = {
6338 CreateMockRead(*window_update, 1), 6472 CreateMockRead(*window_update, 1),
6339 MockRead(ASYNC, 0, 4) // EOF 6473 MockRead(ASYNC, 0, 4) // EOF
6340 }; 6474 };
6341 6475
6342 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 6476 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6343 6477
6344 std::vector<scoped_ptr<UploadElementReader>> element_readers; 6478 std::vector<scoped_ptr<UploadElementReader>> element_readers;
6345 for (int i = 0; i < kFrameCount; ++i) { 6479 for (int i = 0; i < kFrameCount; ++i) {
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
6393 // data frame that we will send once the WINDOW_UPDATE is received, 6527 // data frame that we will send once the WINDOW_UPDATE is received,
6394 // therefore +3. 6528 // therefore +3.
6395 size_t num_writes = initial_window_size / kMaxSpdyFrameChunkSize + 3; 6529 size_t num_writes = initial_window_size / kMaxSpdyFrameChunkSize + 3;
6396 6530
6397 // Calculate last frame's size; 0 size data frame is legal. 6531 // Calculate last frame's size; 0 size data frame is legal.
6398 size_t last_frame_size = initial_window_size % kMaxSpdyFrameChunkSize; 6532 size_t last_frame_size = initial_window_size % kMaxSpdyFrameChunkSize;
6399 6533
6400 // Construct content for a data frame of maximum size. 6534 // Construct content for a data frame of maximum size.
6401 std::string content(kMaxSpdyFrameChunkSize, 'a'); 6535 std::string content(kMaxSpdyFrameChunkSize, 'a');
6402 6536
6403 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 6537 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost(
6404 GetDefaultUrl(), 1, initial_window_size + kUploadDataSize, LOWEST, NULL, 6538 GetDefaultUrl(), 1, initial_window_size + kUploadDataSize, LOWEST, NULL,
6405 0)); 6539 0));
6406 6540
6407 // Full frames. 6541 // Full frames.
6408 scoped_ptr<SpdyFrame> body1( 6542 scoped_ptr<SpdySerializedFrame> body1(spdy_util_.ConstructSpdyBodyFrame(
6409 spdy_util_.ConstructSpdyBodyFrame( 6543 1, content.c_str(), content.size(), false));
6410 1, content.c_str(), content.size(), false));
6411 6544
6412 // Last frame to zero out the window size. 6545 // Last frame to zero out the window size.
6413 scoped_ptr<SpdyFrame> body2( 6546 scoped_ptr<SpdySerializedFrame> body2(spdy_util_.ConstructSpdyBodyFrame(
6414 spdy_util_.ConstructSpdyBodyFrame( 6547 1, content.c_str(), last_frame_size, false));
6415 1, content.c_str(), last_frame_size, false));
6416 6548
6417 // Data frame to be sent once WINDOW_UPDATE frame is received. 6549 // Data frame to be sent once WINDOW_UPDATE frame is received.
6418 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(1, true)); 6550 scoped_ptr<SpdySerializedFrame> body3(
6551 spdy_util_.ConstructSpdyBodyFrame(1, true));
6419 6552
6420 // Fill in mock writes. 6553 // Fill in mock writes.
6421 scoped_ptr<MockWrite[]> writes(new MockWrite[num_writes]); 6554 scoped_ptr<MockWrite[]> writes(new MockWrite[num_writes]);
6422 size_t i = 0; 6555 size_t i = 0;
6423 writes[i] = CreateMockWrite(*req, i); 6556 writes[i] = CreateMockWrite(*req, i);
6424 for (i = 1; i < num_writes - 2; i++) 6557 for (i = 1; i < num_writes - 2; i++)
6425 writes[i] = CreateMockWrite(*body1, i); 6558 writes[i] = CreateMockWrite(*body1, i);
6426 writes[i] = CreateMockWrite(*body2, i); 6559 writes[i] = CreateMockWrite(*body2, i);
6427 // The last write must not be attempted until after the WINDOW_UPDATES 6560 // The last write must not be attempted until after the WINDOW_UPDATES
6428 // have been received. 6561 // have been received.
6429 writes[i + 1] = CreateMockWrite(*body3, i + 4, SYNCHRONOUS); 6562 writes[i + 1] = CreateMockWrite(*body3, i + 4, SYNCHRONOUS);
6430 6563
6431 // Construct read frame, give enough space to upload the rest of the 6564 // Construct read frame, give enough space to upload the rest of the
6432 // data. 6565 // data.
6433 scoped_ptr<SpdyFrame> session_window_update( 6566 scoped_ptr<SpdySerializedFrame> session_window_update(
6434 spdy_util_.ConstructSpdyWindowUpdate(0, kUploadDataSize)); 6567 spdy_util_.ConstructSpdyWindowUpdate(0, kUploadDataSize));
6435 scoped_ptr<SpdyFrame> window_update( 6568 scoped_ptr<SpdySerializedFrame> window_update(
6436 spdy_util_.ConstructSpdyWindowUpdate(1, kUploadDataSize)); 6569 spdy_util_.ConstructSpdyWindowUpdate(1, kUploadDataSize));
6437 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 6570 scoped_ptr<SpdySerializedFrame> reply(
6571 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
6438 MockRead reads[] = { 6572 MockRead reads[] = {
6439 MockRead(ASYNC, ERR_IO_PENDING, i + 1), // Force a pause 6573 MockRead(ASYNC, ERR_IO_PENDING, i + 1), // Force a pause
6440 CreateMockRead(*session_window_update, i + 2), 6574 CreateMockRead(*session_window_update, i + 2),
6441 CreateMockRead(*window_update, i + 3), 6575 CreateMockRead(*window_update, i + 3),
6442 // Now the last write will occur. 6576 // Now the last write will occur.
6443 CreateMockRead(*reply, i + 5), 6577 CreateMockRead(*reply, i + 5),
6444 CreateMockRead(*body2, i + 6), 6578 CreateMockRead(*body2, i + 6),
6445 CreateMockRead(*body3, i + 7), 6579 CreateMockRead(*body3, i + 7),
6446 MockRead(ASYNC, 0, i + 8) // EOF 6580 MockRead(ASYNC, 0, i + 8) // EOF
6447 }; 6581 };
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
6499 // frames plus SYN_STREAM plus the last data frame; also we need another 6633 // frames plus SYN_STREAM plus the last data frame; also we need another
6500 // data frame that we will send once the SETTING is received, therefore +3. 6634 // data frame that we will send once the SETTING is received, therefore +3.
6501 size_t num_writes = initial_window_size / kMaxSpdyFrameChunkSize + 3; 6635 size_t num_writes = initial_window_size / kMaxSpdyFrameChunkSize + 3;
6502 6636
6503 // Calculate last frame's size; 0 size data frame is legal. 6637 // Calculate last frame's size; 0 size data frame is legal.
6504 size_t last_frame_size = initial_window_size % kMaxSpdyFrameChunkSize; 6638 size_t last_frame_size = initial_window_size % kMaxSpdyFrameChunkSize;
6505 6639
6506 // Construct content for a data frame of maximum size. 6640 // Construct content for a data frame of maximum size.
6507 std::string content(kMaxSpdyFrameChunkSize, 'a'); 6641 std::string content(kMaxSpdyFrameChunkSize, 'a');
6508 6642
6509 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 6643 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost(
6510 GetDefaultUrl(), 1, initial_window_size + kUploadDataSize, LOWEST, NULL, 6644 GetDefaultUrl(), 1, initial_window_size + kUploadDataSize, LOWEST, NULL,
6511 0)); 6645 0));
6512 6646
6513 // Full frames. 6647 // Full frames.
6514 scoped_ptr<SpdyFrame> body1( 6648 scoped_ptr<SpdySerializedFrame> body1(spdy_util_.ConstructSpdyBodyFrame(
6515 spdy_util_.ConstructSpdyBodyFrame( 6649 1, content.c_str(), content.size(), false));
6516 1, content.c_str(), content.size(), false));
6517 6650
6518 // Last frame to zero out the window size. 6651 // Last frame to zero out the window size.
6519 scoped_ptr<SpdyFrame> body2( 6652 scoped_ptr<SpdySerializedFrame> body2(spdy_util_.ConstructSpdyBodyFrame(
6520 spdy_util_.ConstructSpdyBodyFrame( 6653 1, content.c_str(), last_frame_size, false));
6521 1, content.c_str(), last_frame_size, false));
6522 6654
6523 // Data frame to be sent once SETTINGS frame is received. 6655 // Data frame to be sent once SETTINGS frame is received.
6524 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(1, true)); 6656 scoped_ptr<SpdySerializedFrame> body3(
6657 spdy_util_.ConstructSpdyBodyFrame(1, true));
6525 6658
6526 // Fill in mock reads/writes. 6659 // Fill in mock reads/writes.
6527 std::vector<MockRead> reads; 6660 std::vector<MockRead> reads;
6528 std::vector<MockWrite> writes; 6661 std::vector<MockWrite> writes;
6529 size_t i = 0; 6662 size_t i = 0;
6530 writes.push_back(CreateMockWrite(*req, i++)); 6663 writes.push_back(CreateMockWrite(*req, i++));
6531 while (i < num_writes - 2) 6664 while (i < num_writes - 2)
6532 writes.push_back(CreateMockWrite(*body1, i++)); 6665 writes.push_back(CreateMockWrite(*body1, i++));
6533 writes.push_back(CreateMockWrite(*body2, i++)); 6666 writes.push_back(CreateMockWrite(*body2, i++));
6534 6667
6535 reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, i++)); 6668 reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, i++));
6536 6669
6537 // Construct read frame for SETTINGS that gives enough space to upload the 6670 // Construct read frame for SETTINGS that gives enough space to upload the
6538 // rest of the data. 6671 // rest of the data.
6539 SettingsMap settings; 6672 SettingsMap settings;
6540 settings[SETTINGS_INITIAL_WINDOW_SIZE] = 6673 settings[SETTINGS_INITIAL_WINDOW_SIZE] =
6541 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, initial_window_size * 2); 6674 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, initial_window_size * 2);
6542 scoped_ptr<SpdyFrame> settings_frame_large( 6675 scoped_ptr<SpdySerializedFrame> settings_frame_large(
6543 spdy_util_.ConstructSpdySettings(settings)); 6676 spdy_util_.ConstructSpdySettings(settings));
6544 6677
6545 reads.push_back(CreateMockRead(*settings_frame_large, i++)); 6678 reads.push_back(CreateMockRead(*settings_frame_large, i++));
6546 6679
6547 scoped_ptr<SpdyFrame> session_window_update( 6680 scoped_ptr<SpdySerializedFrame> session_window_update(
6548 spdy_util_.ConstructSpdyWindowUpdate(0, kUploadDataSize)); 6681 spdy_util_.ConstructSpdyWindowUpdate(0, kUploadDataSize));
6549 reads.push_back(CreateMockRead(*session_window_update, i++)); 6682 reads.push_back(CreateMockRead(*session_window_update, i++));
6550 6683
6551 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 6684 scoped_ptr<SpdySerializedFrame> settings_ack(
6685 spdy_util_.ConstructSpdySettingsAck());
6552 writes.push_back(CreateMockWrite(*settings_ack, i++)); 6686 writes.push_back(CreateMockWrite(*settings_ack, i++));
6553 6687
6554 writes.push_back(CreateMockWrite(*body3, i++)); 6688 writes.push_back(CreateMockWrite(*body3, i++));
6555 6689
6556 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 6690 scoped_ptr<SpdySerializedFrame> reply(
6691 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
6557 reads.push_back(CreateMockRead(*reply, i++)); 6692 reads.push_back(CreateMockRead(*reply, i++));
6558 reads.push_back(CreateMockRead(*body2, i++)); 6693 reads.push_back(CreateMockRead(*body2, i++));
6559 reads.push_back(CreateMockRead(*body3, i++)); 6694 reads.push_back(CreateMockRead(*body3, i++));
6560 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF 6695 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF
6561 6696
6562 // Force all writes to happen before any read, last write will not 6697 // Force all writes to happen before any read, last write will not
6563 // actually queue a frame, due to window size being 0. 6698 // actually queue a frame, due to window size being 0.
6564 SequencedSocketData data(reads.data(), reads.size(), writes.data(), 6699 SequencedSocketData data(reads.data(), reads.size(), writes.data(),
6565 writes.size()); 6700 writes.size());
6566 6701
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
6621 // frames plus SYN_STREAM plus the last data frame; also we need another 6756 // frames plus SYN_STREAM plus the last data frame; also we need another
6622 // data frame that we will send once the SETTING is received, therefore +3. 6757 // data frame that we will send once the SETTING is received, therefore +3.
6623 size_t num_writes = initial_window_size / kMaxSpdyFrameChunkSize + 3; 6758 size_t num_writes = initial_window_size / kMaxSpdyFrameChunkSize + 3;
6624 6759
6625 // Calculate last frame's size; 0 size data frame is legal. 6760 // Calculate last frame's size; 0 size data frame is legal.
6626 size_t last_frame_size = initial_window_size % kMaxSpdyFrameChunkSize; 6761 size_t last_frame_size = initial_window_size % kMaxSpdyFrameChunkSize;
6627 6762
6628 // Construct content for a data frame of maximum size. 6763 // Construct content for a data frame of maximum size.
6629 std::string content(kMaxSpdyFrameChunkSize, 'a'); 6764 std::string content(kMaxSpdyFrameChunkSize, 'a');
6630 6765
6631 scoped_ptr<SpdyFrame> req(spdy_util_.ConstructSpdyPost( 6766 scoped_ptr<SpdySerializedFrame> req(spdy_util_.ConstructSpdyPost(
6632 GetDefaultUrl(), 1, initial_window_size + kUploadDataSize, LOWEST, NULL, 6767 GetDefaultUrl(), 1, initial_window_size + kUploadDataSize, LOWEST, NULL,
6633 0)); 6768 0));
6634 6769
6635 // Full frames. 6770 // Full frames.
6636 scoped_ptr<SpdyFrame> body1( 6771 scoped_ptr<SpdySerializedFrame> body1(spdy_util_.ConstructSpdyBodyFrame(
6637 spdy_util_.ConstructSpdyBodyFrame( 6772 1, content.c_str(), content.size(), false));
6638 1, content.c_str(), content.size(), false));
6639 6773
6640 // Last frame to zero out the window size. 6774 // Last frame to zero out the window size.
6641 scoped_ptr<SpdyFrame> body2( 6775 scoped_ptr<SpdySerializedFrame> body2(spdy_util_.ConstructSpdyBodyFrame(
6642 spdy_util_.ConstructSpdyBodyFrame( 6776 1, content.c_str(), last_frame_size, false));
6643 1, content.c_str(), last_frame_size, false));
6644 6777
6645 // Data frame to be sent once SETTINGS frame is received. 6778 // Data frame to be sent once SETTINGS frame is received.
6646 scoped_ptr<SpdyFrame> body3(spdy_util_.ConstructSpdyBodyFrame(1, true)); 6779 scoped_ptr<SpdySerializedFrame> body3(
6780 spdy_util_.ConstructSpdyBodyFrame(1, true));
6647 6781
6648 // Fill in mock reads/writes. 6782 // Fill in mock reads/writes.
6649 std::vector<MockRead> reads; 6783 std::vector<MockRead> reads;
6650 std::vector<MockWrite> writes; 6784 std::vector<MockWrite> writes;
6651 size_t i = 0; 6785 size_t i = 0;
6652 writes.push_back(CreateMockWrite(*req, i++)); 6786 writes.push_back(CreateMockWrite(*req, i++));
6653 while (i < num_writes - 2) 6787 while (i < num_writes - 2)
6654 writes.push_back(CreateMockWrite(*body1, i++)); 6788 writes.push_back(CreateMockWrite(*body1, i++));
6655 writes.push_back(CreateMockWrite(*body2, i++)); 6789 writes.push_back(CreateMockWrite(*body2, i++));
6656 6790
6657 reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, i++)); 6791 reads.push_back(MockRead(ASYNC, ERR_IO_PENDING, i++));
6658 6792
6659 // Construct read frame for SETTINGS that makes the send_window_size 6793 // Construct read frame for SETTINGS that makes the send_window_size
6660 // negative. 6794 // negative.
6661 SettingsMap new_settings; 6795 SettingsMap new_settings;
6662 new_settings[SETTINGS_INITIAL_WINDOW_SIZE] = 6796 new_settings[SETTINGS_INITIAL_WINDOW_SIZE] =
6663 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, initial_window_size / 2); 6797 SettingsFlagsAndValue(SETTINGS_FLAG_NONE, initial_window_size / 2);
6664 scoped_ptr<SpdyFrame> settings_frame_small( 6798 scoped_ptr<SpdySerializedFrame> settings_frame_small(
6665 spdy_util_.ConstructSpdySettings(new_settings)); 6799 spdy_util_.ConstructSpdySettings(new_settings));
6666 // Construct read frames for WINDOW_UPDATE that makes the send_window_size 6800 // Construct read frames for WINDOW_UPDATE that makes the send_window_size
6667 // positive. 6801 // positive.
6668 scoped_ptr<SpdyFrame> session_window_update_init_size( 6802 scoped_ptr<SpdySerializedFrame> session_window_update_init_size(
6669 spdy_util_.ConstructSpdyWindowUpdate(0, initial_window_size)); 6803 spdy_util_.ConstructSpdyWindowUpdate(0, initial_window_size));
6670 scoped_ptr<SpdyFrame> window_update_init_size( 6804 scoped_ptr<SpdySerializedFrame> window_update_init_size(
6671 spdy_util_.ConstructSpdyWindowUpdate(1, initial_window_size)); 6805 spdy_util_.ConstructSpdyWindowUpdate(1, initial_window_size));
6672 6806
6673 reads.push_back(CreateMockRead(*settings_frame_small, i++)); 6807 reads.push_back(CreateMockRead(*settings_frame_small, i++));
6674 reads.push_back(CreateMockRead(*session_window_update_init_size, i++)); 6808 reads.push_back(CreateMockRead(*session_window_update_init_size, i++));
6675 reads.push_back(CreateMockRead(*window_update_init_size, i++)); 6809 reads.push_back(CreateMockRead(*window_update_init_size, i++));
6676 6810
6677 scoped_ptr<SpdyFrame> settings_ack(spdy_util_.ConstructSpdySettingsAck()); 6811 scoped_ptr<SpdySerializedFrame> settings_ack(
6812 spdy_util_.ConstructSpdySettingsAck());
6678 writes.push_back(CreateMockWrite(*settings_ack, i++)); 6813 writes.push_back(CreateMockWrite(*settings_ack, i++));
6679 6814
6680 writes.push_back(CreateMockWrite(*body3, i++)); 6815 writes.push_back(CreateMockWrite(*body3, i++));
6681 6816
6682 scoped_ptr<SpdyFrame> reply(spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 6817 scoped_ptr<SpdySerializedFrame> reply(
6818 spdy_util_.ConstructSpdyPostSynReply(NULL, 0));
6683 reads.push_back(CreateMockRead(*reply, i++)); 6819 reads.push_back(CreateMockRead(*reply, i++));
6684 reads.push_back(CreateMockRead(*body2, i++)); 6820 reads.push_back(CreateMockRead(*body2, i++));
6685 reads.push_back(CreateMockRead(*body3, i++)); 6821 reads.push_back(CreateMockRead(*body3, i++));
6686 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF 6822 reads.push_back(MockRead(ASYNC, 0, i++)); // EOF
6687 6823
6688 // Force all writes to happen before any read, last write will not 6824 // Force all writes to happen before any read, last write will not
6689 // actually queue a frame, due to window size being 0. 6825 // actually queue a frame, due to window size being 0.
6690 SequencedSocketData data(reads.data(), reads.size(), writes.data(), 6826 SequencedSocketData data(reads.data(), reads.size(), writes.data(),
6691 writes.size()); 6827 writes.size());
6692 6828
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
6732 data.Resume(); 6868 data.Resume();
6733 base::RunLoop().RunUntilIdle(); 6869 base::RunLoop().RunUntilIdle();
6734 rv = callback.WaitForResult(); 6870 rv = callback.WaitForResult();
6735 helper.VerifyDataConsumed(); 6871 helper.VerifyDataConsumed();
6736 } 6872 }
6737 6873
6738 TEST_P(SpdyNetworkTransactionTest, GoAwayOnOddPushStreamId) { 6874 TEST_P(SpdyNetworkTransactionTest, GoAwayOnOddPushStreamId) {
6739 scoped_ptr<SpdyHeaderBlock> push_headers(new SpdyHeaderBlock); 6875 scoped_ptr<SpdyHeaderBlock> push_headers(new SpdyHeaderBlock);
6740 spdy_util_.AddUrlToHeaderBlock("http://www.example.org/a.dat", 6876 spdy_util_.AddUrlToHeaderBlock("http://www.example.org/a.dat",
6741 push_headers.get()); 6877 push_headers.get());
6742 scoped_ptr<SpdyFrame> push( 6878 scoped_ptr<SpdySerializedFrame> push(
6743 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 3, 1)); 6879 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_headers), 3, 1));
6744 MockRead reads[] = {CreateMockRead(*push, 1)}; 6880 MockRead reads[] = {CreateMockRead(*push, 1)};
6745 6881
6746 scoped_ptr<SpdyFrame> req( 6882 scoped_ptr<SpdySerializedFrame> req(
6747 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 6883 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
6748 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 6884 scoped_ptr<SpdySerializedFrame> goaway(spdy_util_.ConstructSpdyGoAway(
6749 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id.")); 6885 0, GOAWAY_PROTOCOL_ERROR, "Odd push stream id."));
6750 MockWrite writes[] = { 6886 MockWrite writes[] = {
6751 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2), 6887 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 2),
6752 }; 6888 };
6753 6889
6754 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 6890 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6755 NormalSpdyTransactionHelper helper( 6891 NormalSpdyTransactionHelper helper(
6756 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6892 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6757 helper.RunToCompletion(&data); 6893 helper.RunToCompletion(&data);
6758 TransactionHelperResult out = helper.output(); 6894 TransactionHelperResult out = helper.output();
6759 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 6895 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
6760 } 6896 }
6761 6897
6762 TEST_P(SpdyNetworkTransactionTest, 6898 TEST_P(SpdyNetworkTransactionTest,
6763 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) { 6899 GoAwayOnPushStreamIdLesserOrEqualThanLastAccepted) {
6764 scoped_ptr<SpdyFrame> push_a(spdy_util_.ConstructSpdyPush( 6900 scoped_ptr<SpdySerializedFrame> push_a(spdy_util_.ConstructSpdyPush(
6765 NULL, 0, 4, 1, GetDefaultUrlWithPath("/a.dat").c_str())); 6901 NULL, 0, 4, 1, GetDefaultUrlWithPath("/a.dat").c_str()));
6766 scoped_ptr<SpdyHeaderBlock> push_b_headers(new SpdyHeaderBlock); 6902 scoped_ptr<SpdyHeaderBlock> push_b_headers(new SpdyHeaderBlock);
6767 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/b.dat"), 6903 spdy_util_.AddUrlToHeaderBlock(GetDefaultUrlWithPath("/b.dat"),
6768 push_b_headers.get()); 6904 push_b_headers.get());
6769 scoped_ptr<SpdyFrame> push_b(spdy_util_.ConstructInitialSpdyPushFrame( 6905 scoped_ptr<SpdySerializedFrame> push_b(
6770 std::move(push_b_headers), 2, 1)); 6906 spdy_util_.ConstructInitialSpdyPushFrame(std::move(push_b_headers), 2,
6907 1));
6771 MockRead reads[] = { 6908 MockRead reads[] = {
6772 CreateMockRead(*push_a, 1), CreateMockRead(*push_b, 2), 6909 CreateMockRead(*push_a, 1), CreateMockRead(*push_b, 2),
6773 }; 6910 };
6774 6911
6775 scoped_ptr<SpdyFrame> req( 6912 scoped_ptr<SpdySerializedFrame> req(
6776 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 6913 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
6777 scoped_ptr<SpdyFrame> goaway(spdy_util_.ConstructSpdyGoAway( 6914 scoped_ptr<SpdySerializedFrame> goaway(spdy_util_.ConstructSpdyGoAway(
6778 4, 6915 4, GOAWAY_PROTOCOL_ERROR,
6779 GOAWAY_PROTOCOL_ERROR,
6780 "New push stream id must be greater than the last accepted.")); 6916 "New push stream id must be greater than the last accepted."));
6781 MockWrite writes[] = { 6917 MockWrite writes[] = {
6782 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 3), 6918 CreateMockWrite(*req, 0), CreateMockWrite(*goaway, 3),
6783 }; 6919 };
6784 6920
6785 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 6921 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6786 NormalSpdyTransactionHelper helper( 6922 NormalSpdyTransactionHelper helper(
6787 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 6923 CreateGetRequest(), DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6788 helper.RunToCompletion(&data); 6924 helper.RunToCompletion(&data);
6789 TransactionHelperResult out = helper.output(); 6925 TransactionHelperResult out = helper.output();
6790 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv); 6926 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, out.rv);
6791 } 6927 }
6792 6928
6793 // Regression test for https://crbug.com/493348: request header exceeds 16 kB 6929 // Regression test for https://crbug.com/493348: request header exceeds 16 kB
6794 // and thus sent in multiple frames when using HTTP/2. 6930 // and thus sent in multiple frames when using HTTP/2.
6795 TEST_P(SpdyNetworkTransactionTest, LargeRequest) { 6931 TEST_P(SpdyNetworkTransactionTest, LargeRequest) {
6796 const std::string kKey("foo"); 6932 const std::string kKey("foo");
6797 const std::string kValue(1 << 15, 'z'); 6933 const std::string kValue(1 << 15, 'z');
6798 6934
6799 HttpRequestInfo request; 6935 HttpRequestInfo request;
6800 request.method = "GET"; 6936 request.method = "GET";
6801 request.url = GURL(GetDefaultUrl()); 6937 request.url = GURL(GetDefaultUrl());
6802 request.extra_headers.SetHeader(kKey, kValue); 6938 request.extra_headers.SetHeader(kKey, kValue);
6803 6939
6804 scoped_ptr<SpdyHeaderBlock> headers( 6940 scoped_ptr<SpdyHeaderBlock> headers(
6805 spdy_util_.ConstructGetHeaderBlock(GetDefaultUrl())); 6941 spdy_util_.ConstructGetHeaderBlock(GetDefaultUrl()));
6806 (*headers)[kKey] = kValue; 6942 (*headers)[kKey] = kValue;
6807 scoped_ptr<SpdyFrame> req( 6943 scoped_ptr<SpdySerializedFrame> req(
6808 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, true)); 6944 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, true));
6809 MockWrite writes[] = { 6945 MockWrite writes[] = {
6810 CreateMockWrite(*req, 0), 6946 CreateMockWrite(*req, 0),
6811 }; 6947 };
6812 6948
6813 scoped_ptr<SpdyFrame> resp( 6949 scoped_ptr<SpdySerializedFrame> resp(
6814 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1)); 6950 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
6815 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 6951 scoped_ptr<SpdySerializedFrame> body(
6952 spdy_util_.ConstructSpdyBodyFrame(1, true));
6816 MockRead reads[] = { 6953 MockRead reads[] = {
6817 CreateMockRead(*resp, 1), 6954 CreateMockRead(*resp, 1),
6818 CreateMockRead(*body, 2), 6955 CreateMockRead(*body, 2),
6819 MockRead(ASYNC, 0, 3) // EOF 6956 MockRead(ASYNC, 0, 3) // EOF
6820 }; 6957 };
6821 6958
6822 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 6959 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6823 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 6960 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
6824 GetParam(), nullptr); 6961 GetParam(), nullptr);
6825 helper.RunToCompletion(&data); 6962 helper.RunToCompletion(&data);
6826 TransactionHelperResult out = helper.output(); 6963 TransactionHelperResult out = helper.output();
6827 6964
6828 EXPECT_EQ(OK, out.rv); 6965 EXPECT_EQ(OK, out.rv);
6829 EXPECT_EQ("HTTP/1.1 200", out.status_line); 6966 EXPECT_EQ("HTTP/1.1 200", out.status_line);
6830 EXPECT_EQ("hello!", out.response_data); 6967 EXPECT_EQ("hello!", out.response_data);
6831 } 6968 }
6832 6969
6833 // Regression test for https://crbug.com/535629: response header exceeds 16 kB. 6970 // Regression test for https://crbug.com/535629: response header exceeds 16 kB.
6834 TEST_P(SpdyNetworkTransactionTest, LargeResponseHeader) { 6971 TEST_P(SpdyNetworkTransactionTest, LargeResponseHeader) {
6835 scoped_ptr<SpdyHeaderBlock> headers( 6972 scoped_ptr<SpdyHeaderBlock> headers(
6836 spdy_util_.ConstructGetHeaderBlock(GetDefaultUrl())); 6973 spdy_util_.ConstructGetHeaderBlock(GetDefaultUrl()));
6837 scoped_ptr<SpdyFrame> req( 6974 scoped_ptr<SpdySerializedFrame> req(
6838 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, true)); 6975 spdy_util_.ConstructSpdySyn(1, *headers, LOWEST, true));
6839 MockWrite writes[] = { 6976 MockWrite writes[] = {
6840 CreateMockWrite(*req, 0), 6977 CreateMockWrite(*req, 0),
6841 }; 6978 };
6842 6979
6843 // HPACK decoder implementation limits string literal length to 16 kB. 6980 // HPACK decoder implementation limits string literal length to 16 kB.
6844 const char* response_headers[2]; 6981 const char* response_headers[2];
6845 const std::string kKey(16 * 1024, 'a'); 6982 const std::string kKey(16 * 1024, 'a');
6846 response_headers[0] = kKey.data(); 6983 response_headers[0] = kKey.data();
6847 const std::string kValue(16 * 1024, 'b'); 6984 const std::string kValue(16 * 1024, 'b');
6848 response_headers[1] = kValue.data(); 6985 response_headers[1] = kValue.data();
6849 6986
6850 scoped_ptr<SpdyFrame> resp( 6987 scoped_ptr<SpdySerializedFrame> resp(
6851 spdy_util_.ConstructSpdyGetSynReply(response_headers, 1, 1)); 6988 spdy_util_.ConstructSpdyGetSynReply(response_headers, 1, 1));
6852 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 6989 scoped_ptr<SpdySerializedFrame> body(
6990 spdy_util_.ConstructSpdyBodyFrame(1, true));
6853 MockRead reads[] = { 6991 MockRead reads[] = {
6854 CreateMockRead(*resp, 1), CreateMockRead(*body, 2), 6992 CreateMockRead(*resp, 1), CreateMockRead(*body, 2),
6855 MockRead(ASYNC, 0, 3) // EOF 6993 MockRead(ASYNC, 0, 3) // EOF
6856 }; 6994 };
6857 6995
6858 HttpRequestInfo request; 6996 HttpRequestInfo request;
6859 request.method = "GET"; 6997 request.method = "GET";
6860 request.url = GURL(GetDefaultUrl()); 6998 request.url = GURL(GetDefaultUrl());
6861 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(), 6999 NormalSpdyTransactionHelper helper(request, DEFAULT_PRIORITY, BoundNetLog(),
6862 GetParam(), nullptr); 7000 GetParam(), nullptr);
6863 7001
6864 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes)); 7002 SequencedSocketData data(reads, arraysize(reads), writes, arraysize(writes));
6865 helper.RunToCompletion(&data); 7003 helper.RunToCompletion(&data);
6866 TransactionHelperResult out = helper.output(); 7004 TransactionHelperResult out = helper.output();
6867 7005
6868 EXPECT_EQ(OK, out.rv); 7006 EXPECT_EQ(OK, out.rv);
6869 EXPECT_EQ("HTTP/1.1 200", out.status_line); 7007 EXPECT_EQ("HTTP/1.1 200", out.status_line);
6870 EXPECT_EQ("hello!", out.response_data); 7008 EXPECT_EQ("hello!", out.response_data);
6871 ASSERT_TRUE(out.response_info.headers->HasHeaderValue(kKey, kValue)); 7009 ASSERT_TRUE(out.response_info.headers->HasHeaderValue(kKey, kValue));
6872 } 7010 }
6873 7011
6874 class SpdyNetworkTransactionNoTLSUsageCheckTest 7012 class SpdyNetworkTransactionNoTLSUsageCheckTest
6875 : public SpdyNetworkTransactionTest { 7013 : public SpdyNetworkTransactionTest {
6876 protected: 7014 protected:
6877 void RunNoTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { 7015 void RunNoTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) {
6878 // Construct the request. 7016 // Construct the request.
6879 scoped_ptr<SpdyFrame> req( 7017 scoped_ptr<SpdySerializedFrame> req(
6880 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 7018 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
6881 MockWrite writes[] = {CreateMockWrite(*req, 0)}; 7019 MockWrite writes[] = {CreateMockWrite(*req, 0)};
6882 7020
6883 scoped_ptr<SpdyFrame> resp(spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 7021 scoped_ptr<SpdySerializedFrame> resp(
6884 scoped_ptr<SpdyFrame> body(spdy_util_.ConstructSpdyBodyFrame(1, true)); 7022 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1));
7023 scoped_ptr<SpdySerializedFrame> body(
7024 spdy_util_.ConstructSpdyBodyFrame(1, true));
6885 MockRead reads[] = { 7025 MockRead reads[] = {
6886 CreateMockRead(*resp, 1), 7026 CreateMockRead(*resp, 1),
6887 CreateMockRead(*body, 2), 7027 CreateMockRead(*body, 2),
6888 MockRead(ASYNC, 0, 3) // EOF 7028 MockRead(ASYNC, 0, 3) // EOF
6889 }; 7029 };
6890 7030
6891 SequencedSocketData data(reads, arraysize(reads), writes, 7031 SequencedSocketData data(reads, arraysize(reads), writes,
6892 arraysize(writes)); 7032 arraysize(writes));
6893 HttpRequestInfo request; 7033 HttpRequestInfo request;
6894 request.method = "GET"; 7034 request.method = "GET";
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
6931 // Set to TLS_RSA_WITH_NULL_MD5 7071 // Set to TLS_RSA_WITH_NULL_MD5
6932 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); 7072 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status);
6933 7073
6934 RunNoTLSUsageCheckTest(std::move(ssl_provider)); 7074 RunNoTLSUsageCheckTest(std::move(ssl_provider));
6935 } 7075 }
6936 7076
6937 class SpdyNetworkTransactionTLSUsageCheckTest 7077 class SpdyNetworkTransactionTLSUsageCheckTest
6938 : public SpdyNetworkTransactionTest { 7078 : public SpdyNetworkTransactionTest {
6939 protected: 7079 protected:
6940 void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) { 7080 void RunTLSUsageCheckTest(scoped_ptr<SSLSocketDataProvider> ssl_provider) {
6941 scoped_ptr<SpdyFrame> goaway( 7081 scoped_ptr<SpdySerializedFrame> goaway(
6942 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, "")); 7082 spdy_util_.ConstructSpdyGoAway(0, GOAWAY_INADEQUATE_SECURITY, ""));
6943 MockWrite writes[] = {CreateMockWrite(*goaway)}; 7083 MockWrite writes[] = {CreateMockWrite(*goaway)};
6944 7084
6945 StaticSocketDataProvider data(NULL, 0, writes, arraysize(writes)); 7085 StaticSocketDataProvider data(NULL, 0, writes, arraysize(writes));
6946 HttpRequestInfo request; 7086 HttpRequestInfo request;
6947 request.method = "GET"; 7087 request.method = "GET";
6948 request.url = GURL("https://www.example.org/"); 7088 request.url = GURL("https://www.example.org/");
6949 NormalSpdyTransactionHelper helper( 7089 NormalSpdyTransactionHelper helper(
6950 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL); 7090 request, DEFAULT_PRIORITY, BoundNetLog(), GetParam(), NULL);
6951 helper.RunToCompletionWithSSLData(&data, std::move(ssl_provider)); 7091 helper.RunToCompletionWithSSLData(&data, std::move(ssl_provider));
(...skipping 24 matching lines...) Expand all
6976 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) { 7116 TEST_P(SpdyNetworkTransactionTLSUsageCheckTest, TLSCipherSuiteSucky) {
6977 scoped_ptr<SSLSocketDataProvider> ssl_provider( 7117 scoped_ptr<SSLSocketDataProvider> ssl_provider(
6978 new SSLSocketDataProvider(ASYNC, OK)); 7118 new SSLSocketDataProvider(ASYNC, OK));
6979 // Set to TLS_RSA_WITH_NULL_MD5 7119 // Set to TLS_RSA_WITH_NULL_MD5
6980 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status); 7120 SSLConnectionStatusSetCipherSuite(0x1, &ssl_provider->connection_status);
6981 7121
6982 RunTLSUsageCheckTest(std::move(ssl_provider)); 7122 RunTLSUsageCheckTest(std::move(ssl_provider));
6983 } 7123 }
6984 7124
6985 } // namespace net 7125 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_http_stream_unittest.cc ('k') | net/spdy/spdy_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698