OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include <stdint.h> |
| 6 |
5 #include <cstddef> | 7 #include <cstddef> |
| 8 #include <limits> |
6 #include <string> | 9 #include <string> |
7 #include <vector> | 10 #include <vector> |
8 | 11 |
9 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
10 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
11 #include "base/strings/string_piece.h" | 14 #include "base/strings/string_piece.h" |
12 #include "net/base/completion_callback.h" | 15 #include "net/base/completion_callback.h" |
13 #include "net/base/request_priority.h" | 16 #include "net/base/request_priority.h" |
14 #include "net/log/test_net_log.h" | 17 #include "net/log/test_net_log.h" |
15 #include "net/log/test_net_log_entry.h" | 18 #include "net/log/test_net_log_entry.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 const size_t kPostBodyLength = arraysize(kPostBody); | 54 const size_t kPostBodyLength = arraysize(kPostBody); |
52 const base::StringPiece kPostBodyStringPiece(kPostBody, kPostBodyLength); | 55 const base::StringPiece kPostBodyStringPiece(kPostBody, kPostBodyLength); |
53 | 56 |
54 } // namespace | 57 } // namespace |
55 | 58 |
56 class SpdyStreamTest : public ::testing::Test, | 59 class SpdyStreamTest : public ::testing::Test, |
57 public ::testing::WithParamInterface<TestCase> { | 60 public ::testing::WithParamInterface<TestCase> { |
58 protected: | 61 protected: |
59 // A function that takes a SpdyStream and the number of bytes which | 62 // A function that takes a SpdyStream and the number of bytes which |
60 // will unstall the next frame completely. | 63 // will unstall the next frame completely. |
61 typedef base::Callback<void(const base::WeakPtr<SpdyStream>&, int32)> | 64 typedef base::Callback<void(const base::WeakPtr<SpdyStream>&, int32_t)> |
62 UnstallFunction; | 65 UnstallFunction; |
63 | 66 |
64 SpdyStreamTest() | 67 SpdyStreamTest() |
65 : spdy_util_(GetProtocol(), GetDependenciesFromPriority()), | 68 : spdy_util_(GetProtocol(), GetDependenciesFromPriority()), |
66 session_deps_(GetProtocol()), | 69 session_deps_(GetProtocol()), |
67 offset_(0) { | 70 offset_(0) { |
68 SpdySession::SetPriorityDependencyDefaultForTesting( | 71 SpdySession::SetPriorityDependencyDefaultForTesting( |
69 GetDependenciesFromPriority()); | 72 GetDependenciesFromPriority()); |
70 } | 73 } |
71 | 74 |
(...skipping 751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
823 EXPECT_FALSE(push_stream); | 826 EXPECT_FALSE(push_stream); |
824 | 827 |
825 data.RunFor(2); | 828 data.RunFor(2); |
826 | 829 |
827 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 830 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
828 } | 831 } |
829 | 832 |
830 // The tests below are only for SPDY/3 and above. | 833 // The tests below are only for SPDY/3 and above. |
831 | 834 |
832 // Call IncreaseSendWindowSize on a stream with a large enough delta | 835 // Call IncreaseSendWindowSize on a stream with a large enough delta |
833 // to overflow an int32. The SpdyStream should handle that case | 836 // to overflow an int32_t. The SpdyStream should handle that case |
834 // gracefully. | 837 // gracefully. |
835 TEST_P(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { | 838 TEST_P(SpdyStreamTest, IncreaseSendWindowSizeOverflow) { |
836 session_ = | 839 session_ = |
837 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); | 840 SpdySessionDependencies::SpdyCreateSessionDeterministic(&session_deps_); |
838 | 841 |
839 scoped_ptr<SpdyFrame> req( | 842 scoped_ptr<SpdyFrame> req( |
840 spdy_util_.ConstructSpdyPost( | 843 spdy_util_.ConstructSpdyPost( |
841 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); | 844 kStreamUrl, 1, kPostBodyLength, LOWEST, NULL, 0)); |
842 AddWrite(*req); | 845 AddWrite(*req); |
843 | 846 |
(...skipping 26 matching lines...) Expand all Loading... |
870 | 873 |
871 scoped_ptr<SpdyHeaderBlock> headers( | 874 scoped_ptr<SpdyHeaderBlock> headers( |
872 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); | 875 spdy_util_.ConstructPostHeaderBlock(kStreamUrl, kPostBodyLength)); |
873 EXPECT_EQ(ERR_IO_PENDING, | 876 EXPECT_EQ(ERR_IO_PENDING, |
874 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); | 877 stream->SendRequestHeaders(headers.Pass(), MORE_DATA_TO_SEND)); |
875 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 878 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
876 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 879 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
877 | 880 |
878 data.RunFor(1); | 881 data.RunFor(1); |
879 | 882 |
880 int32 old_send_window_size = stream->send_window_size(); | 883 int32_t old_send_window_size = stream->send_window_size(); |
881 ASSERT_GT(old_send_window_size, 0); | 884 ASSERT_GT(old_send_window_size, 0); |
882 int32 delta_window_size = kint32max - old_send_window_size + 1; | 885 int32_t delta_window_size = |
| 886 std::numeric_limits<int32_t>::max() - old_send_window_size + 1; |
883 stream->IncreaseSendWindowSize(delta_window_size); | 887 stream->IncreaseSendWindowSize(delta_window_size); |
884 EXPECT_EQ(NULL, stream.get()); | 888 EXPECT_EQ(NULL, stream.get()); |
885 | 889 |
886 data.RunFor(2); | 890 data.RunFor(2); |
887 | 891 |
888 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate.WaitForClose()); | 892 EXPECT_EQ(ERR_SPDY_PROTOCOL_ERROR, delegate.WaitForClose()); |
889 } | 893 } |
890 | 894 |
891 // Functions used with | 895 // Functions used with |
892 // RunResumeAfterUnstall{RequestResponse,Bidirectional}Test(). | 896 // RunResumeAfterUnstall{RequestResponse,Bidirectional}Test(). |
893 | 897 |
894 void StallStream(const base::WeakPtr<SpdyStream>& stream) { | 898 void StallStream(const base::WeakPtr<SpdyStream>& stream) { |
895 // Reduce the send window size to 0 to stall. | 899 // Reduce the send window size to 0 to stall. |
896 while (stream->send_window_size() > 0) { | 900 while (stream->send_window_size() > 0) { |
897 stream->DecreaseSendWindowSize( | 901 stream->DecreaseSendWindowSize( |
898 std::min(kMaxSpdyFrameChunkSize, stream->send_window_size())); | 902 std::min(kMaxSpdyFrameChunkSize, stream->send_window_size())); |
899 } | 903 } |
900 } | 904 } |
901 | 905 |
902 void IncreaseStreamSendWindowSize(const base::WeakPtr<SpdyStream>& stream, | 906 void IncreaseStreamSendWindowSize(const base::WeakPtr<SpdyStream>& stream, |
903 int32 delta_window_size) { | 907 int32_t delta_window_size) { |
904 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 908 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
905 stream->IncreaseSendWindowSize(delta_window_size); | 909 stream->IncreaseSendWindowSize(delta_window_size); |
906 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 910 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
907 } | 911 } |
908 | 912 |
909 void AdjustStreamSendWindowSize(const base::WeakPtr<SpdyStream>& stream, | 913 void AdjustStreamSendWindowSize(const base::WeakPtr<SpdyStream>& stream, |
910 int32 delta_window_size) { | 914 int32_t delta_window_size) { |
911 // Make sure that negative adjustments are handled properly. | 915 // Make sure that negative adjustments are handled properly. |
912 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 916 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
913 stream->AdjustSendWindowSize(-delta_window_size); | 917 stream->AdjustSendWindowSize(-delta_window_size); |
914 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 918 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
915 stream->AdjustSendWindowSize(+delta_window_size); | 919 stream->AdjustSendWindowSize(+delta_window_size); |
916 EXPECT_TRUE(stream->send_stalled_by_flow_control()); | 920 EXPECT_TRUE(stream->send_stalled_by_flow_control()); |
917 stream->AdjustSendWindowSize(+delta_window_size); | 921 stream->AdjustSendWindowSize(+delta_window_size); |
918 EXPECT_FALSE(stream->send_stalled_by_flow_control()); | 922 EXPECT_FALSE(stream->send_stalled_by_flow_control()); |
919 } | 923 } |
920 | 924 |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1128 | 1132 |
1129 EXPECT_FALSE(stream->HasUrlFromHeaders()); | 1133 EXPECT_FALSE(stream->HasUrlFromHeaders()); |
1130 | 1134 |
1131 scoped_ptr<SpdyHeaderBlock> headers( | 1135 scoped_ptr<SpdyHeaderBlock> headers( |
1132 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); | 1136 spdy_util_.ConstructGetHeaderBlock(kStreamUrl)); |
1133 EXPECT_EQ(ERR_IO_PENDING, | 1137 EXPECT_EQ(ERR_IO_PENDING, |
1134 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); | 1138 stream->SendRequestHeaders(headers.Pass(), NO_MORE_DATA_TO_SEND)); |
1135 EXPECT_TRUE(stream->HasUrlFromHeaders()); | 1139 EXPECT_TRUE(stream->HasUrlFromHeaders()); |
1136 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); | 1140 EXPECT_EQ(kStreamUrl, stream->GetUrlFromHeaders().spec()); |
1137 | 1141 |
1138 int64 reply_frame_len = reply->size(); | 1142 int64_t reply_frame_len = reply->size(); |
1139 int64 data_header_len = spdy_util_.CreateFramer(false) | 1143 int64_t data_header_len = |
1140 ->GetDataFrameMinimumSize(); | 1144 spdy_util_.CreateFramer(false)->GetDataFrameMinimumSize(); |
1141 int64 data_frame_len = data_header_len + kPostBodyLength; | 1145 int64_t data_frame_len = data_header_len + kPostBodyLength; |
1142 int64 response_len = reply_frame_len + data_frame_len; | 1146 int64_t response_len = reply_frame_len + data_frame_len; |
1143 | 1147 |
1144 EXPECT_EQ(0, stream->raw_received_bytes()); | 1148 EXPECT_EQ(0, stream->raw_received_bytes()); |
1145 data.RunFor(1); // SYN | 1149 data.RunFor(1); // SYN |
1146 EXPECT_EQ(0, stream->raw_received_bytes()); | 1150 EXPECT_EQ(0, stream->raw_received_bytes()); |
1147 data.RunFor(1); // REPLY | 1151 data.RunFor(1); // REPLY |
1148 EXPECT_EQ(reply_frame_len, stream->raw_received_bytes()); | 1152 EXPECT_EQ(reply_frame_len, stream->raw_received_bytes()); |
1149 data.RunFor(1); // DATA | 1153 data.RunFor(1); // DATA |
1150 EXPECT_EQ(response_len, stream->raw_received_bytes()); | 1154 EXPECT_EQ(response_len, stream->raw_received_bytes()); |
1151 data.RunFor(1); // FIN | 1155 data.RunFor(1); // FIN |
1152 | 1156 |
1153 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | 1157 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
1154 } | 1158 } |
1155 | 1159 |
1156 } // namespace test | 1160 } // namespace test |
1157 | 1161 |
1158 } // namespace net | 1162 } // namespace net |
OLD | NEW |