| Index: net/quic/quic_flow_controller_test.cc
|
| diff --git a/net/quic/quic_flow_controller_test.cc b/net/quic/quic_flow_controller_test.cc
|
| deleted file mode 100644
|
| index d2e040b421c8de930c48abf986ce254f9ca1a327..0000000000000000000000000000000000000000
|
| --- a/net/quic/quic_flow_controller_test.cc
|
| +++ /dev/null
|
| @@ -1,375 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "net/quic/quic_flow_controller.h"
|
| -
|
| -#include <memory>
|
| -
|
| -#include "base/format_macros.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "net/quic/quic_flags.h"
|
| -#include "net/quic/quic_utils.h"
|
| -#include "net/quic/test_tools/quic_connection_peer.h"
|
| -#include "net/quic/test_tools/quic_flow_controller_peer.h"
|
| -#include "net/quic/test_tools/quic_sent_packet_manager_peer.h"
|
| -#include "net/quic/test_tools/quic_test_utils.h"
|
| -#include "net/test/gtest_util.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -
|
| -using testing::_;
|
| -
|
| -namespace net {
|
| -namespace test {
|
| -
|
| -// Receive window auto-tuning uses RTT in its logic.
|
| -const int64_t kRtt = 100;
|
| -
|
| -class QuicFlowControllerTest : public ::testing::Test {
|
| - public:
|
| - QuicFlowControllerTest()
|
| - : stream_id_(1234),
|
| - send_window_(kInitialSessionFlowControlWindowForTest),
|
| - receive_window_(kInitialSessionFlowControlWindowForTest),
|
| - connection_(&helper_, &alarm_factory_, Perspective::IS_CLIENT) {}
|
| -
|
| - void Initialize() {
|
| - flow_controller_.reset(
|
| - new QuicFlowController(&connection_, stream_id_, Perspective::IS_CLIENT,
|
| - send_window_, receive_window_, false));
|
| - }
|
| -
|
| - protected:
|
| - QuicStreamId stream_id_;
|
| - QuicByteCount send_window_;
|
| - QuicByteCount receive_window_;
|
| - std::unique_ptr<QuicFlowController> flow_controller_;
|
| - MockQuicConnectionHelper helper_;
|
| - MockAlarmFactory alarm_factory_;
|
| - MockQuicConnection connection_;
|
| -};
|
| -
|
| -TEST_F(QuicFlowControllerTest, SendingBytes) {
|
| - Initialize();
|
| -
|
| - EXPECT_FALSE(flow_controller_->IsBlocked());
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(send_window_, flow_controller_->SendWindowSize());
|
| -
|
| - // Send some bytes, but not enough to block.
|
| - flow_controller_->AddBytesSent(send_window_ / 2);
|
| - EXPECT_FALSE(flow_controller_->IsBlocked());
|
| - EXPECT_EQ(send_window_ / 2, flow_controller_->SendWindowSize());
|
| -
|
| - // Send enough bytes to block.
|
| - flow_controller_->AddBytesSent(send_window_ / 2);
|
| - EXPECT_TRUE(flow_controller_->IsBlocked());
|
| - EXPECT_EQ(0u, flow_controller_->SendWindowSize());
|
| -
|
| - // BLOCKED frame should get sent.
|
| - EXPECT_CALL(connection_, SendBlocked(stream_id_)).Times(1);
|
| - flow_controller_->MaybeSendBlocked();
|
| -
|
| - // Update the send window, and verify this has unblocked.
|
| - EXPECT_TRUE(flow_controller_->UpdateSendWindowOffset(2 * send_window_));
|
| - EXPECT_FALSE(flow_controller_->IsBlocked());
|
| - EXPECT_EQ(send_window_, flow_controller_->SendWindowSize());
|
| -
|
| - // Updating with a smaller offset doesn't change anything.
|
| - EXPECT_FALSE(flow_controller_->UpdateSendWindowOffset(send_window_ / 10));
|
| - EXPECT_EQ(send_window_, flow_controller_->SendWindowSize());
|
| -
|
| - // Try to send more bytes, violating flow control.
|
| - EXPECT_CALL(connection_,
|
| - CloseConnection(QUIC_FLOW_CONTROL_SENT_TOO_MUCH_DATA, _, _));
|
| - EXPECT_DFATAL(flow_controller_->AddBytesSent(send_window_ * 10),
|
| - base::StringPrintf("Trying to send an extra %" PRIu64 " bytes",
|
| - send_window_ * 10));
|
| - EXPECT_TRUE(flow_controller_->IsBlocked());
|
| - EXPECT_EQ(0u, flow_controller_->SendWindowSize());
|
| -}
|
| -
|
| -TEST_F(QuicFlowControllerTest, ReceivingBytes) {
|
| - Initialize();
|
| -
|
| - EXPECT_FALSE(flow_controller_->IsBlocked());
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - // Receive some bytes, updating highest received offset, but not enough to
|
| - // fill flow control receive window.
|
| - EXPECT_TRUE(
|
| - flow_controller_->UpdateHighestReceivedOffset(1 + receive_window_ / 2));
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ((receive_window_ / 2) - 1,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - // Consume enough bytes to send a WINDOW_UPDATE frame.
|
| - EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(1);
|
| -
|
| - flow_controller_->AddBytesConsumed(1 + receive_window_ / 2);
|
| -
|
| - // Result is that once again we have a fully open receive window.
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -}
|
| -
|
| -TEST_F(QuicFlowControllerTest, OnlySendBlockedFrameOncePerOffset) {
|
| - Initialize();
|
| -
|
| - // Test that we don't send duplicate BLOCKED frames. We should only send one
|
| - // BLOCKED frame at a given send window offset.
|
| - EXPECT_FALSE(flow_controller_->IsBlocked());
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(send_window_, flow_controller_->SendWindowSize());
|
| -
|
| - // Send enough bytes to block.
|
| - flow_controller_->AddBytesSent(send_window_);
|
| - EXPECT_TRUE(flow_controller_->IsBlocked());
|
| - EXPECT_EQ(0u, flow_controller_->SendWindowSize());
|
| -
|
| - // Expect that 2 BLOCKED frames should get sent in total.
|
| - EXPECT_CALL(connection_, SendBlocked(stream_id_)).Times(2);
|
| -
|
| - // BLOCKED frame should get sent.
|
| - flow_controller_->MaybeSendBlocked();
|
| -
|
| - // BLOCKED frame should not get sent again until our send offset changes.
|
| - flow_controller_->MaybeSendBlocked();
|
| - flow_controller_->MaybeSendBlocked();
|
| - flow_controller_->MaybeSendBlocked();
|
| - flow_controller_->MaybeSendBlocked();
|
| - flow_controller_->MaybeSendBlocked();
|
| -
|
| - // Update the send window, then send enough bytes to block again.
|
| - EXPECT_TRUE(flow_controller_->UpdateSendWindowOffset(2 * send_window_));
|
| - EXPECT_FALSE(flow_controller_->IsBlocked());
|
| - EXPECT_EQ(send_window_, flow_controller_->SendWindowSize());
|
| - flow_controller_->AddBytesSent(send_window_);
|
| - EXPECT_TRUE(flow_controller_->IsBlocked());
|
| - EXPECT_EQ(0u, flow_controller_->SendWindowSize());
|
| -
|
| - // BLOCKED frame should get sent as send offset has changed.
|
| - flow_controller_->MaybeSendBlocked();
|
| -}
|
| -
|
| -TEST_F(QuicFlowControllerTest, ReceivingBytesFastIncreasesFlowWindow) {
|
| - // This test will generate two WINDOW_UPDATE frames.
|
| - EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(2);
|
| -
|
| - Initialize();
|
| - flow_controller_->set_auto_tune_receive_window(true);
|
| -
|
| - // Make sure clock is inititialized.
|
| - connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
|
| -
|
| - QuicSentPacketManagerInterface* manager =
|
| - QuicConnectionPeer::GetSentPacketManager(&connection_, kDefaultPathId);
|
| -
|
| - RttStats* rtt_stats = const_cast<RttStats*>(manager->GetRttStats());
|
| - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRtt),
|
| - QuicTime::Delta::Zero(), QuicTime::Zero());
|
| -
|
| - EXPECT_FALSE(flow_controller_->IsBlocked());
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - QuicByteCount threshold =
|
| - QuicFlowControllerPeer::WindowUpdateThreshold(flow_controller_.get());
|
| -
|
| - QuicStreamOffset receive_offset = threshold + 1;
|
| - // Receive some bytes, updating highest received offset, but not enough to
|
| - // fill flow control receive window.
|
| - EXPECT_TRUE(flow_controller_->UpdateHighestReceivedOffset(receive_offset));
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest - receive_offset,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - // Consume enough bytes to send a WINDOW_UPDATE frame.
|
| - flow_controller_->AddBytesConsumed(threshold + 1);
|
| - // Result is that once again we have a fully open receive window.
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - // Move time forward, but by less than two RTTs. Then receive and consume
|
| - // some more, forcing a second WINDOW_UPDATE with an increased max window
|
| - // size.
|
| - connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2 * kRtt - 1));
|
| - receive_offset += threshold + 1;
|
| - EXPECT_TRUE(flow_controller_->UpdateHighestReceivedOffset(receive_offset));
|
| - flow_controller_->AddBytesConsumed(threshold + 1);
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - QuicByteCount new_threshold =
|
| - QuicFlowControllerPeer::WindowUpdateThreshold(flow_controller_.get());
|
| - EXPECT_GT(new_threshold, threshold);
|
| -}
|
| -
|
| -TEST_F(QuicFlowControllerTest, ReceivingBytesFastNoAutoTune) {
|
| - // This test will generate two WINDOW_UPDATE frames.
|
| - EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(2);
|
| -
|
| - Initialize();
|
| - flow_controller_->set_auto_tune_receive_window(false);
|
| -
|
| - // Make sure clock is inititialized.
|
| - connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
|
| -
|
| - QuicSentPacketManagerInterface* manager =
|
| - QuicConnectionPeer::GetSentPacketManager(&connection_, kDefaultPathId);
|
| -
|
| - RttStats* rtt_stats = const_cast<RttStats*>(manager->GetRttStats());
|
| - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRtt),
|
| - QuicTime::Delta::Zero(), QuicTime::Zero());
|
| -
|
| - EXPECT_FALSE(flow_controller_->IsBlocked());
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - QuicByteCount threshold =
|
| - QuicFlowControllerPeer::WindowUpdateThreshold(flow_controller_.get());
|
| -
|
| - QuicStreamOffset receive_offset = threshold + 1;
|
| - // Receive some bytes, updating highest received offset, but not enough to
|
| - // fill flow control receive window.
|
| - EXPECT_TRUE(flow_controller_->UpdateHighestReceivedOffset(receive_offset));
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest - receive_offset,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - // Consume enough bytes to send a WINDOW_UPDATE frame.
|
| - flow_controller_->AddBytesConsumed(threshold + 1);
|
| - // Result is that once again we have a fully open receive window.
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - // Move time forward, but by less than two RTTs. Then receive and consume
|
| - // some more, forcing a second WINDOW_UPDATE with an increased max window
|
| - // size.
|
| - connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2 * kRtt - 1));
|
| - receive_offset += threshold + 1;
|
| - EXPECT_TRUE(flow_controller_->UpdateHighestReceivedOffset(receive_offset));
|
| - flow_controller_->AddBytesConsumed(threshold + 1);
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - QuicByteCount new_threshold =
|
| - QuicFlowControllerPeer::WindowUpdateThreshold(flow_controller_.get());
|
| - EXPECT_EQ(new_threshold, threshold);
|
| -}
|
| -
|
| -TEST_F(QuicFlowControllerTest, ReceivingBytesNormalStableFlowWindow) {
|
| - // This test will generate two WINDOW_UPDATE frames.
|
| - EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(2);
|
| -
|
| - Initialize();
|
| - flow_controller_->set_auto_tune_receive_window(true);
|
| -
|
| - // Make sure clock is inititialized.
|
| - connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
|
| -
|
| - QuicSentPacketManagerInterface* manager =
|
| - QuicConnectionPeer::GetSentPacketManager(&connection_, kDefaultPathId);
|
| - RttStats* rtt_stats = const_cast<RttStats*>(manager->GetRttStats());
|
| - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRtt),
|
| - QuicTime::Delta::Zero(), QuicTime::Zero());
|
| -
|
| - EXPECT_FALSE(flow_controller_->IsBlocked());
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - QuicByteCount threshold =
|
| - QuicFlowControllerPeer::WindowUpdateThreshold(flow_controller_.get());
|
| -
|
| - QuicStreamOffset receive_offset = threshold + 1;
|
| - // Receive some bytes, updating highest received offset, but not enough to
|
| - // fill flow control receive window.
|
| - EXPECT_TRUE(flow_controller_->UpdateHighestReceivedOffset(receive_offset));
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest - receive_offset,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - flow_controller_->AddBytesConsumed(threshold + 1);
|
| -
|
| - // Result is that once again we have a fully open receive window.
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - // Move time forward, but by more than two RTTs. Then receive and consume
|
| - // some more, forcing a second WINDOW_UPDATE with unchanged max window size.
|
| - connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2 * kRtt + 1));
|
| -
|
| - receive_offset += threshold + 1;
|
| - EXPECT_TRUE(flow_controller_->UpdateHighestReceivedOffset(receive_offset));
|
| -
|
| - flow_controller_->AddBytesConsumed(threshold + 1);
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| -
|
| - QuicByteCount new_threshold =
|
| - QuicFlowControllerPeer::WindowUpdateThreshold(flow_controller_.get());
|
| -
|
| - EXPECT_EQ(new_threshold, threshold);
|
| -}
|
| -
|
| -TEST_F(QuicFlowControllerTest, ReceivingBytesNormalNoAutoTune) {
|
| - // This test will generate two WINDOW_UPDATE frames.
|
| - EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(2);
|
| -
|
| - Initialize();
|
| - flow_controller_->set_auto_tune_receive_window(false);
|
| -
|
| - // Make sure clock is inititialized.
|
| - connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
|
| -
|
| - QuicSentPacketManagerInterface* manager =
|
| - QuicConnectionPeer::GetSentPacketManager(&connection_, kDefaultPathId);
|
| - RttStats* rtt_stats = const_cast<RttStats*>(manager->GetRttStats());
|
| - rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(kRtt),
|
| - QuicTime::Delta::Zero(), QuicTime::Zero());
|
| -
|
| - EXPECT_FALSE(flow_controller_->IsBlocked());
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - QuicByteCount threshold =
|
| - QuicFlowControllerPeer::WindowUpdateThreshold(flow_controller_.get());
|
| -
|
| - QuicStreamOffset receive_offset = threshold + 1;
|
| - // Receive some bytes, updating highest received offset, but not enough to
|
| - // fill flow control receive window.
|
| - EXPECT_TRUE(flow_controller_->UpdateHighestReceivedOffset(receive_offset));
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest - receive_offset,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - flow_controller_->AddBytesConsumed(threshold + 1);
|
| -
|
| - // Result is that once again we have a fully open receive window.
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| - EXPECT_EQ(kInitialSessionFlowControlWindowForTest,
|
| - QuicFlowControllerPeer::ReceiveWindowSize(flow_controller_.get()));
|
| -
|
| - // Move time forward, but by more than two RTTs. Then receive and consume
|
| - // some more, forcing a second WINDOW_UPDATE with unchanged max window size.
|
| - connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(2 * kRtt + 1));
|
| -
|
| - receive_offset += threshold + 1;
|
| - EXPECT_TRUE(flow_controller_->UpdateHighestReceivedOffset(receive_offset));
|
| -
|
| - flow_controller_->AddBytesConsumed(threshold + 1);
|
| - EXPECT_FALSE(flow_controller_->FlowControlViolation());
|
| -
|
| - QuicByteCount new_threshold =
|
| - QuicFlowControllerPeer::WindowUpdateThreshold(flow_controller_.get());
|
| -
|
| - EXPECT_EQ(new_threshold, threshold);
|
| -}
|
| -
|
| -} // namespace test
|
| -} // namespace net
|
|
|