| 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 |