| Index: net/quic/reliable_quic_stream_test.cc
|
| diff --git a/net/quic/reliable_quic_stream_test.cc b/net/quic/reliable_quic_stream_test.cc
|
| index 23602a349a3f73f00e1e298c9e4155ce0c586e55..b1208e24dbd165bdf8c45c1a848eb83882283a40 100644
|
| --- a/net/quic/reliable_quic_stream_test.cc
|
| +++ b/net/quic/reliable_quic_stream_test.cc
|
| @@ -10,6 +10,7 @@
|
| #include "net/quic/quic_utils.h"
|
| #include "net/quic/quic_write_blocked_list.h"
|
| #include "net/quic/spdy_utils.h"
|
| +#include "net/quic/test_tools/quic_flow_controller_peer.h"
|
| #include "net/quic/test_tools/quic_session_peer.h"
|
| #include "net/quic/test_tools/quic_test_utils.h"
|
| #include "net/quic/test_tools/reliable_quic_stream_peer.h"
|
| @@ -58,10 +59,6 @@ class TestStream : public ReliableQuicStream {
|
| return QuicUtils::HighestPriority();
|
| }
|
|
|
| - virtual bool IsFlowControlEnabled() const OVERRIDE {
|
| - return true;
|
| - }
|
| -
|
| using ReliableQuicStream::WriteOrBufferData;
|
| using ReliableQuicStream::CloseReadSide;
|
| using ReliableQuicStream::CloseWriteSide;
|
| @@ -75,7 +72,9 @@ class TestStream : public ReliableQuicStream {
|
| class ReliableQuicStreamTest : public ::testing::TestWithParam<bool> {
|
| public:
|
| ReliableQuicStreamTest()
|
| - : initial_flow_control_window_bytes_(kMaxPacketSize) {
|
| + : initial_flow_control_window_bytes_(kMaxPacketSize),
|
| + zero_(QuicTime::Delta::Zero()),
|
| + supported_versions_(QuicSupportedVersions()) {
|
| headers_[":host"] = "www.google.com";
|
| headers_[":path"] = "/index.hml";
|
| headers_[":scheme"] = "https";
|
| @@ -105,8 +104,13 @@ class ReliableQuicStreamTest : public ::testing::TestWithParam<bool> {
|
| "JBCScs_ejbKaqBDoB7ZGxTvqlrB__2ZmnHHjCr8RgMRtKNtIeuZAo ";
|
| }
|
|
|
| + void set_supported_versions(const QuicVersionVector& versions) {
|
| + supported_versions_ = versions;
|
| + }
|
| +
|
| void Initialize(bool stream_should_process_data) {
|
| - connection_ = new StrictMock<MockConnection>(kIsServer);
|
| + connection_ =
|
| + new StrictMock<MockConnection>(kIsServer, supported_versions_);
|
| session_.reset(new StrictMock<MockSession>(connection_));
|
|
|
| // New streams rely on having the peer's flow control receive window
|
| @@ -137,6 +141,8 @@ class ReliableQuicStreamTest : public ::testing::TestWithParam<bool> {
|
| SpdyHeaderBlock headers_;
|
| QuicWriteBlockedList* write_blocked_list_;
|
| uint32 initial_flow_control_window_bytes_;
|
| + QuicTime::Delta zero_;
|
| + QuicVersionVector supported_versions_;
|
| };
|
|
|
| TEST_F(ReliableQuicStreamTest, WriteAllData) {
|
| @@ -319,13 +325,15 @@ TEST_F(ReliableQuicStreamTest, StreamFlowControlMultipleWindowUpdates) {
|
|
|
| // Initially should be default.
|
| EXPECT_EQ(initial_flow_control_window_bytes_,
|
| - ReliableQuicStreamPeer::SendWindowOffset(stream_.get()));
|
| + QuicFlowControllerPeer::SendWindowOffset(
|
| + stream_.get()->flow_controller()));
|
|
|
| // Check a single WINDOW_UPDATE results in correct offset.
|
| QuicWindowUpdateFrame window_update_1(stream_->id(), 1234);
|
| stream_->OnWindowUpdateFrame(window_update_1);
|
| EXPECT_EQ(window_update_1.byte_offset,
|
| - ReliableQuicStreamPeer::SendWindowOffset(stream_.get()));
|
| + QuicFlowControllerPeer::SendWindowOffset(
|
| + stream_.get()->flow_controller()));
|
|
|
| // Now send a few more WINDOW_UPDATES and make sure that only the largest is
|
| // remembered.
|
| @@ -336,7 +344,32 @@ TEST_F(ReliableQuicStreamTest, StreamFlowControlMultipleWindowUpdates) {
|
| stream_->OnWindowUpdateFrame(window_update_3);
|
| stream_->OnWindowUpdateFrame(window_update_4);
|
| EXPECT_EQ(window_update_3.byte_offset,
|
| - ReliableQuicStreamPeer::SendWindowOffset(stream_.get()));
|
| + QuicFlowControllerPeer::SendWindowOffset(
|
| + stream_.get()->flow_controller()));
|
| +}
|
| +
|
| +TEST_F(ReliableQuicStreamTest, StreamFlowControlShouldNotBlockInLessThanQ017) {
|
| + // TODO(rjshade): Remove this test when we no longer have any versions <
|
| + // QUIC_VERSION_17.
|
| + ValueRestore<bool> old_flag(&FLAGS_enable_quic_stream_flow_control, true);
|
| +
|
| + // Make sure we are using a version which does not support flow control.
|
| + QuicVersion kTestQuicVersions[] = {QUIC_VERSION_16};
|
| + QuicVersionVector versions;
|
| + for (size_t i = 0; i < arraysize(kTestQuicVersions); ++i) {
|
| + versions.push_back(kTestQuicVersions[i]);
|
| + }
|
| + set_supported_versions(versions);
|
| +
|
| + // Peer is not talking QUIC_VERSION_17 so assumes that it can send a zero
|
| + // length flow control receive window with no consequences.
|
| + set_initial_flow_control_window_bytes(0);
|
| +
|
| + Initialize(kShouldProcessData);
|
| +
|
| + // The stream should _not_ be flow control blocked, because we are not talking
|
| + // a version which has flow control enabled.
|
| + EXPECT_FALSE(stream_->flow_controller()->IsBlocked());
|
| }
|
|
|
| void SaveProxyAckNotifierDelegate(
|
| @@ -357,6 +390,9 @@ TEST_F(ReliableQuicStreamTest, WriteOrBufferDataWithQuicAckNotifier) {
|
| const int kSecondWriteSize = 50;
|
| const int kLastWriteSize = kDataSize - kFirstWriteSize - kSecondWriteSize;
|
|
|
| + // Set a large flow control send window so this doesn't interfere with test.
|
| + stream_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1);
|
| +
|
| scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate;
|
|
|
| EXPECT_CALL(*session_, WritevData(kStreamId, _, _, _, _)).WillOnce(DoAll(
|
| @@ -384,13 +420,13 @@ TEST_F(ReliableQuicStreamTest, WriteOrBufferDataWithQuicAckNotifier) {
|
|
|
| // There were two writes, so OnAckNotification is not propagated
|
| // until the third Ack arrives.
|
| - proxy_delegate->OnAckNotification(1, 2, 3, 4);
|
| - proxy_delegate->OnAckNotification(10, 20, 30, 40);
|
| + proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_);
|
| + proxy_delegate->OnAckNotification(10, 20, 30, 40, zero_);
|
|
|
| // The arguments to delegate->OnAckNotification are the sum of the
|
| // arguments to proxy_delegate OnAckNotification calls.
|
| - EXPECT_CALL(*delegate, OnAckNotification(111, 222, 333, 444));
|
| - proxy_delegate->OnAckNotification(100, 200, 300, 400);
|
| + EXPECT_CALL(*delegate, OnAckNotification(111, 222, 333, 444, zero_));
|
| + proxy_delegate->OnAckNotification(100, 200, 300, 400, zero_);
|
| }
|
|
|
| // Verify delegate behavior when packets are acked before the
|
| @@ -406,6 +442,9 @@ TEST_F(ReliableQuicStreamTest, WriteOrBufferDataAckNotificationBeforeFlush) {
|
|
|
| const int kInitialWriteSize = 100;
|
|
|
| + // Set a large flow control send window so this doesn't interfere with test.
|
| + stream_->flow_controller()->UpdateSendWindowOffset(kDataSize + 1);
|
| +
|
| scoped_refptr<QuicAckNotifier::DelegateInterface> proxy_delegate;
|
|
|
| EXPECT_CALL(*session_, WritevData(kStreamId, _, _, _, _)).WillOnce(DoAll(
|
| @@ -416,7 +455,7 @@ TEST_F(ReliableQuicStreamTest, WriteOrBufferDataAckNotificationBeforeFlush) {
|
| EXPECT_TRUE(write_blocked_list_->HasWriteBlockedStreams());
|
|
|
| // Handle the ack of the first write.
|
| - proxy_delegate->OnAckNotification(1, 2, 3, 4);
|
| + proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_);
|
| proxy_delegate = NULL;
|
|
|
| EXPECT_CALL(*session_, WritevData(kStreamId, _, _, _, _)).WillOnce(DoAll(
|
| @@ -426,8 +465,8 @@ TEST_F(ReliableQuicStreamTest, WriteOrBufferDataAckNotificationBeforeFlush) {
|
| stream_->OnCanWrite();
|
|
|
| // Handle the ack for the second write.
|
| - EXPECT_CALL(*delegate, OnAckNotification(101, 202, 303, 404));
|
| - proxy_delegate->OnAckNotification(100, 200, 300, 400);
|
| + EXPECT_CALL(*delegate, OnAckNotification(101, 202, 303, 404, zero_));
|
| + proxy_delegate->OnAckNotification(100, 200, 300, 400, zero_);
|
| }
|
|
|
| // Verify delegate behavior when WriteOrBufferData does not buffer.
|
| @@ -447,8 +486,8 @@ TEST_F(ReliableQuicStreamTest, WriteAndBufferDataWithAckNotiferNoBuffer) {
|
| EXPECT_FALSE(write_blocked_list_->HasWriteBlockedStreams());
|
|
|
| // Handle the ack.
|
| - EXPECT_CALL(*delegate, OnAckNotification(1, 2, 3, 4));
|
| - proxy_delegate->OnAckNotification(1, 2, 3, 4);
|
| + EXPECT_CALL(*delegate, OnAckNotification(1, 2, 3, 4, zero_));
|
| + proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_);
|
| }
|
|
|
| // Verify delegate behavior when WriteOrBufferData buffers all the data.
|
| @@ -472,8 +511,8 @@ TEST_F(ReliableQuicStreamTest, BufferOnWriteAndBufferDataWithAckNotifer) {
|
| stream_->OnCanWrite();
|
|
|
| // Handle the ack.
|
| - EXPECT_CALL(*delegate, OnAckNotification(1, 2, 3, 4));
|
| - proxy_delegate->OnAckNotification(1, 2, 3, 4);
|
| + EXPECT_CALL(*delegate, OnAckNotification(1, 2, 3, 4, zero_));
|
| + proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_);
|
| }
|
|
|
| // Verify delegate behavior when WriteOrBufferData when the FIN is
|
| @@ -500,9 +539,9 @@ TEST_F(ReliableQuicStreamTest, WriteAndBufferDataWithAckNotiferOnlyFinRemains) {
|
| stream_->OnCanWrite();
|
|
|
| // Handle the acks.
|
| - proxy_delegate->OnAckNotification(1, 2, 3, 4);
|
| - EXPECT_CALL(*delegate, OnAckNotification(11, 22, 33, 44));
|
| - proxy_delegate->OnAckNotification(10, 20, 30, 40);
|
| + proxy_delegate->OnAckNotification(1, 2, 3, 4, zero_);
|
| + EXPECT_CALL(*delegate, OnAckNotification(11, 22, 33, 44, zero_));
|
| + proxy_delegate->OnAckNotification(10, 20, 30, 40, zero_);
|
| }
|
|
|
| } // namespace
|
|
|