| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |