| Index: net/quic/quic_server_session_base_test.cc
|
| diff --git a/net/quic/quic_server_session_base_test.cc b/net/quic/quic_server_session_base_test.cc
|
| deleted file mode 100644
|
| index b41fdf8476cedadabe4219e9c8707e5d48145ffe..0000000000000000000000000000000000000000
|
| --- a/net/quic/quic_server_session_base_test.cc
|
| +++ /dev/null
|
| @@ -1,566 +0,0 @@
|
| -// Copyright 2013 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_server_session_base.h"
|
| -
|
| -#include <cstdint>
|
| -#include <memory>
|
| -
|
| -#include "base/macros.h"
|
| -#include "net/quic/crypto/quic_crypto_server_config.h"
|
| -#include "net/quic/crypto/quic_random.h"
|
| -#include "net/quic/proto/cached_network_parameters.pb.h"
|
| -#include "net/quic/quic_connection.h"
|
| -#include "net/quic/quic_crypto_server_stream.h"
|
| -#include "net/quic/quic_utils.h"
|
| -#include "net/quic/test_tools/crypto_test_utils.h"
|
| -#include "net/quic/test_tools/quic_config_peer.h"
|
| -#include "net/quic/test_tools/quic_connection_peer.h"
|
| -#include "net/quic/test_tools/quic_sent_packet_manager_peer.h"
|
| -#include "net/quic/test_tools/quic_session_peer.h"
|
| -#include "net/quic/test_tools/quic_spdy_session_peer.h"
|
| -#include "net/quic/test_tools/quic_spdy_stream_peer.h"
|
| -#include "net/quic/test_tools/quic_sustained_bandwidth_recorder_peer.h"
|
| -#include "net/quic/test_tools/quic_test_utils.h"
|
| -#include "net/test/gtest_util.h"
|
| -#include "net/tools/quic/quic_simple_server_stream.h"
|
| -#include "net/tools/quic/test_tools/mock_quic_server_session_visitor.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using net::test::CryptoTestUtils;
|
| -using net::test::MockQuicConnection;
|
| -using net::test::MockQuicConnectionHelper;
|
| -using net::test::QuicConfigPeer;
|
| -using net::test::QuicConnectionPeer;
|
| -using net::test::QuicSpdyStreamPeer;
|
| -using net::test::QuicSentPacketManagerPeer;
|
| -using net::test::QuicSessionPeer;
|
| -using net::test::QuicSpdySessionPeer;
|
| -using net::test::QuicSustainedBandwidthRecorderPeer;
|
| -using net::test::SupportedVersions;
|
| -using net::test::ValueRestore;
|
| -using net::test::kClientDataStreamId1;
|
| -using net::test::kClientDataStreamId2;
|
| -using net::test::kClientDataStreamId3;
|
| -using net::test::kInitialSessionFlowControlWindowForTest;
|
| -using net::test::kInitialStreamFlowControlWindowForTest;
|
| -using std::string;
|
| -using testing::StrictMock;
|
| -using testing::_;
|
| -
|
| -namespace net {
|
| -namespace test {
|
| -
|
| -class QuicServerSessionBasePeer {
|
| - public:
|
| - static ReliableQuicStream* GetOrCreateDynamicStream(QuicServerSessionBase* s,
|
| - QuicStreamId id) {
|
| - return s->GetOrCreateDynamicStream(id);
|
| - }
|
| - static void SetCryptoStream(QuicServerSessionBase* s,
|
| - QuicCryptoServerStream* crypto_stream) {
|
| - s->crypto_stream_.reset(crypto_stream);
|
| - s->static_streams()[kCryptoStreamId] = crypto_stream;
|
| - }
|
| - static bool IsBandwidthResumptionEnabled(QuicServerSessionBase* s) {
|
| - return s->bandwidth_resumption_enabled_;
|
| - }
|
| -};
|
| -
|
| -namespace {
|
| -
|
| -class TestServerSession : public QuicServerSessionBase {
|
| - public:
|
| - TestServerSession(const QuicConfig& config,
|
| - QuicConnection* connection,
|
| - QuicServerSessionBase::Visitor* visitor,
|
| - QuicServerSessionBase::Helper* helper,
|
| - const QuicCryptoServerConfig* crypto_config,
|
| - QuicCompressedCertsCache* compressed_certs_cache)
|
| - : QuicServerSessionBase(config,
|
| - connection,
|
| - visitor,
|
| - helper,
|
| - crypto_config,
|
| - compressed_certs_cache) {}
|
| -
|
| - ~TestServerSession() override{};
|
| -
|
| - protected:
|
| - QuicSpdyStream* CreateIncomingDynamicStream(QuicStreamId id) override {
|
| - if (!ShouldCreateIncomingDynamicStream(id)) {
|
| - return nullptr;
|
| - }
|
| - QuicSpdyStream* stream = new QuicSimpleServerStream(id, this);
|
| - ActivateStream(stream);
|
| - return stream;
|
| - }
|
| -
|
| - QuicSpdyStream* CreateOutgoingDynamicStream(SpdyPriority priority) override {
|
| - if (!ShouldCreateOutgoingDynamicStream()) {
|
| - return nullptr;
|
| - }
|
| -
|
| - QuicSpdyStream* stream =
|
| - new QuicSimpleServerStream(GetNextOutgoingStreamId(), this);
|
| - stream->SetPriority(priority);
|
| - ActivateStream(stream);
|
| - return stream;
|
| - }
|
| -
|
| - QuicCryptoServerStreamBase* CreateQuicCryptoServerStream(
|
| - const QuicCryptoServerConfig* crypto_config,
|
| - QuicCompressedCertsCache* compressed_certs_cache) override {
|
| - return new QuicCryptoServerStream(
|
| - crypto_config, compressed_certs_cache,
|
| - FLAGS_enable_quic_stateless_reject_support, this);
|
| - }
|
| -};
|
| -
|
| -const size_t kMaxStreamsForTest = 10;
|
| -
|
| -class QuicServerSessionBaseTest : public ::testing::TestWithParam<QuicVersion> {
|
| - protected:
|
| - QuicServerSessionBaseTest()
|
| - : crypto_config_(QuicCryptoServerConfig::TESTING,
|
| - QuicRandom::GetInstance(),
|
| - CryptoTestUtils::ProofSourceForTesting()),
|
| - compressed_certs_cache_(
|
| - QuicCompressedCertsCache::kQuicCompressedCertsCacheSize) {
|
| - FLAGS_quic_always_log_bugs_for_tests = true;
|
| - config_.SetMaxStreamsPerConnection(kMaxStreamsForTest, kMaxStreamsForTest);
|
| - config_.SetMaxIncomingDynamicStreamsToSend(kMaxStreamsForTest);
|
| - QuicConfigPeer::SetReceivedMaxIncomingDynamicStreams(&config_,
|
| - kMaxStreamsForTest);
|
| - config_.SetInitialStreamFlowControlWindowToSend(
|
| - kInitialStreamFlowControlWindowForTest);
|
| - config_.SetInitialSessionFlowControlWindowToSend(
|
| - kInitialSessionFlowControlWindowForTest);
|
| -
|
| - connection_ = new StrictMock<MockQuicConnection>(
|
| - &helper_, &alarm_factory_, Perspective::IS_SERVER,
|
| - SupportedVersions(GetParam()));
|
| - session_.reset(new TestServerSession(config_, connection_, &owner_,
|
| - &session_helper_, &crypto_config_,
|
| - &compressed_certs_cache_));
|
| - MockClock clock;
|
| - handshake_message_.reset(crypto_config_.AddDefaultConfig(
|
| - QuicRandom::GetInstance(), &clock,
|
| - QuicCryptoServerConfig::ConfigOptions()));
|
| - session_->Initialize();
|
| - visitor_ = QuicConnectionPeer::GetVisitor(connection_);
|
| - }
|
| -
|
| - StrictMock<MockQuicServerSessionVisitor> owner_;
|
| - StrictMock<MockQuicServerSessionHelper> session_helper_;
|
| - MockQuicConnectionHelper helper_;
|
| - MockAlarmFactory alarm_factory_;
|
| - StrictMock<MockQuicConnection>* connection_;
|
| - QuicConfig config_;
|
| - QuicCryptoServerConfig crypto_config_;
|
| - QuicCompressedCertsCache compressed_certs_cache_;
|
| - std::unique_ptr<TestServerSession> session_;
|
| - std::unique_ptr<CryptoHandshakeMessage> handshake_message_;
|
| - QuicConnectionVisitorInterface* visitor_;
|
| -};
|
| -
|
| -// Compares CachedNetworkParameters.
|
| -MATCHER_P(EqualsProto, network_params, "") {
|
| - CachedNetworkParameters reference(network_params);
|
| - return (arg->bandwidth_estimate_bytes_per_second() ==
|
| - reference.bandwidth_estimate_bytes_per_second() &&
|
| - arg->bandwidth_estimate_bytes_per_second() ==
|
| - reference.bandwidth_estimate_bytes_per_second() &&
|
| - arg->max_bandwidth_estimate_bytes_per_second() ==
|
| - reference.max_bandwidth_estimate_bytes_per_second() &&
|
| - arg->max_bandwidth_timestamp_seconds() ==
|
| - reference.max_bandwidth_timestamp_seconds() &&
|
| - arg->min_rtt_ms() == reference.min_rtt_ms() &&
|
| - arg->previous_connection_state() ==
|
| - reference.previous_connection_state());
|
| -}
|
| -
|
| -INSTANTIATE_TEST_CASE_P(Tests,
|
| - QuicServerSessionBaseTest,
|
| - ::testing::ValuesIn(QuicSupportedVersions()));
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, ServerPushDisabledByDefault) {
|
| - // Without the client explicitly sending kSPSH, server push will be disabled
|
| - // at the server.
|
| - EXPECT_FALSE(
|
| - session_->config()->HasReceivedConnectionOptions() &&
|
| - ContainsQuicTag(session_->config()->ReceivedConnectionOptions(), kSPSH));
|
| - session_->OnConfigNegotiated();
|
| - EXPECT_FALSE(session_->server_push_enabled());
|
| -}
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, CloseStreamDueToReset) {
|
| - // Open a stream, then reset it.
|
| - // Send two bytes of payload to open it.
|
| - QuicStreamFrame data1(kClientDataStreamId1, false, 0, StringPiece("HT"));
|
| - session_->OnStreamFrame(data1);
|
| - EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams());
|
| -
|
| - // Send a reset (and expect the peer to send a RST in response).
|
| - QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM,
|
| - 0);
|
| - EXPECT_CALL(*connection_,
|
| - SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0));
|
| - visitor_->OnRstStream(rst1);
|
| - EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
|
| -
|
| - // Send the same two bytes of payload in a new packet.
|
| - visitor_->OnStreamFrame(data1);
|
| -
|
| - // The stream should not be re-opened.
|
| - EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
|
| - EXPECT_TRUE(connection_->connected());
|
| -}
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, NeverOpenStreamDueToReset) {
|
| - // Send a reset (and expect the peer to send a RST in response).
|
| - QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM,
|
| - 0);
|
| - EXPECT_CALL(*connection_,
|
| - SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0));
|
| - visitor_->OnRstStream(rst1);
|
| - EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
|
| -
|
| - // Send two bytes of payload.
|
| - QuicStreamFrame data1(kClientDataStreamId1, false, 0, StringPiece("HT"));
|
| - visitor_->OnStreamFrame(data1);
|
| -
|
| - // The stream should never be opened, now that the reset is received.
|
| - EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
|
| - EXPECT_TRUE(connection_->connected());
|
| -}
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, AcceptClosedStream) {
|
| - // Send (empty) compressed headers followed by two bytes of data.
|
| - QuicStreamFrame frame1(kClientDataStreamId1, false, 0,
|
| - StringPiece("\1\0\0\0\0\0\0\0HT"));
|
| - QuicStreamFrame frame2(kClientDataStreamId2, false, 0,
|
| - StringPiece("\2\0\0\0\0\0\0\0HT"));
|
| - visitor_->OnStreamFrame(frame1);
|
| - visitor_->OnStreamFrame(frame2);
|
| - EXPECT_EQ(2u, session_->GetNumOpenIncomingStreams());
|
| -
|
| - // Send a reset (and expect the peer to send a RST in response).
|
| - QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_ERROR_PROCESSING_STREAM, 0);
|
| - EXPECT_CALL(*connection_,
|
| - SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0));
|
| - visitor_->OnRstStream(rst);
|
| -
|
| - // If we were tracking, we'd probably want to reject this because it's data
|
| - // past the reset point of stream 3. As it's a closed stream we just drop the
|
| - // data on the floor, but accept the packet because it has data for stream 5.
|
| - QuicStreamFrame frame3(kClientDataStreamId1, false, 2, StringPiece("TP"));
|
| - QuicStreamFrame frame4(kClientDataStreamId2, false, 2, StringPiece("TP"));
|
| - visitor_->OnStreamFrame(frame3);
|
| - visitor_->OnStreamFrame(frame4);
|
| - // The stream should never be opened, now that the reset is received.
|
| - EXPECT_EQ(1u, session_->GetNumOpenIncomingStreams());
|
| - EXPECT_TRUE(connection_->connected());
|
| -}
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, MaxOpenStreams) {
|
| - // Test that the server refuses if a client attempts to open too many data
|
| - // streams. The server accepts slightly more than the negotiated stream limit
|
| - // to deal with rare cases where a client FIN/RST is lost.
|
| -
|
| - if (GetParam() <= QUIC_VERSION_34) {
|
| - EXPECT_EQ(kMaxStreamsForTest, session_->max_open_incoming_streams());
|
| - }
|
| -
|
| - // The slightly increased stream limit is set during config negotiation. It
|
| - // is either an increase of 10 over negotiated limit, or a fixed percentage
|
| - // scaling, whichever is larger. Test both before continuing.
|
| - session_->OnConfigNegotiated();
|
| - EXPECT_LT(kMaxStreamsMultiplier * kMaxStreamsForTest,
|
| - kMaxStreamsForTest + kMaxStreamsMinimumIncrement);
|
| - EXPECT_EQ(kMaxStreamsForTest + kMaxStreamsMinimumIncrement,
|
| - session_->max_open_incoming_streams());
|
| - EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
|
| - QuicStreamId stream_id = kClientDataStreamId1;
|
| - // Open the max configured number of streams, should be no problem.
|
| - for (size_t i = 0; i < kMaxStreamsForTest; ++i) {
|
| - EXPECT_TRUE(QuicServerSessionBasePeer::GetOrCreateDynamicStream(
|
| - session_.get(), stream_id));
|
| - stream_id += 2;
|
| - }
|
| -
|
| - // Open more streams: server should accept slightly more than the limit.
|
| - for (size_t i = 0; i < kMaxStreamsMinimumIncrement; ++i) {
|
| - EXPECT_TRUE(QuicServerSessionBasePeer::GetOrCreateDynamicStream(
|
| - session_.get(), stream_id));
|
| - stream_id += 2;
|
| - }
|
| -
|
| - // Now violate the server's internal stream limit.
|
| - stream_id += 2;
|
| - EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(0);
|
| - EXPECT_CALL(*connection_, SendRstStream(stream_id, QUIC_REFUSED_STREAM, 0));
|
| - // Even if the connection remains open, the stream creation should fail.
|
| - EXPECT_FALSE(QuicServerSessionBasePeer::GetOrCreateDynamicStream(
|
| - session_.get(), stream_id));
|
| -}
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, MaxAvailableStreams) {
|
| - // Test that the server closes the connection if a client makes too many data
|
| - // streams available. The server accepts slightly more than the negotiated
|
| - // stream limit to deal with rare cases where a client FIN/RST is lost.
|
| -
|
| - if (GetParam() <= QUIC_VERSION_34) {
|
| - // The slightly increased stream limit is set during config negotiation.
|
| - EXPECT_EQ(kMaxStreamsForTest, session_->max_open_incoming_streams());
|
| - }
|
| - session_->OnConfigNegotiated();
|
| - const size_t kAvailableStreamLimit = session_->MaxAvailableStreams();
|
| - EXPECT_EQ(
|
| - session_->max_open_incoming_streams() * kMaxAvailableStreamsMultiplier,
|
| - session_->MaxAvailableStreams());
|
| - // The protocol specification requires that there can be at least 10 times
|
| - // as many available streams as the connection's maximum open streams.
|
| - EXPECT_LE(10 * kMaxStreamsForTest, kAvailableStreamLimit);
|
| -
|
| - EXPECT_EQ(0u, session_->GetNumOpenIncomingStreams());
|
| - EXPECT_TRUE(QuicServerSessionBasePeer::GetOrCreateDynamicStream(
|
| - session_.get(), kClientDataStreamId1));
|
| -
|
| - // Establish available streams up to the server's limit.
|
| - const int kLimitingStreamId =
|
| - kClientDataStreamId1 + (kAvailableStreamLimit)*2 + 2;
|
| - EXPECT_TRUE(QuicServerSessionBasePeer::GetOrCreateDynamicStream(
|
| - session_.get(), kLimitingStreamId));
|
| -
|
| - // A further available stream will result in connection close.
|
| - EXPECT_CALL(*connection_,
|
| - CloseConnection(QUIC_TOO_MANY_AVAILABLE_STREAMS, _, _));
|
| - // This forces stream kLimitingStreamId + 2 to become available, which
|
| - // violates the quota.
|
| - EXPECT_FALSE(QuicServerSessionBasePeer::GetOrCreateDynamicStream(
|
| - session_.get(), kLimitingStreamId + 4));
|
| -}
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, EnableServerPushThroughConnectionOption) {
|
| - // Assume server received server push connection option.
|
| - QuicTagVector copt;
|
| - copt.push_back(kSPSH);
|
| - QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt);
|
| - session_->OnConfigNegotiated();
|
| - EXPECT_TRUE(session_->server_push_enabled());
|
| -}
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, GetEvenIncomingError) {
|
| - // Incoming streams on the server session must be odd.
|
| - EXPECT_CALL(*connection_, CloseConnection(QUIC_INVALID_STREAM_ID, _, _));
|
| - EXPECT_EQ(nullptr, QuicServerSessionBasePeer::GetOrCreateDynamicStream(
|
| - session_.get(), 4));
|
| -}
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, GetStreamDisconnected) {
|
| - // Don't create new streams if the connection is disconnected.
|
| - QuicConnectionPeer::TearDownLocalConnectionState(connection_);
|
| - EXPECT_DFATAL(
|
| - QuicServerSessionBasePeer::GetOrCreateDynamicStream(session_.get(), 5),
|
| - "ShouldCreateIncomingDynamicStream called when disconnected");
|
| -}
|
| -
|
| -class MockQuicCryptoServerStream : public QuicCryptoServerStream {
|
| - public:
|
| - explicit MockQuicCryptoServerStream(
|
| - const QuicCryptoServerConfig* crypto_config,
|
| - QuicCompressedCertsCache* compressed_certs_cache,
|
| - QuicServerSessionBase* session)
|
| - : QuicCryptoServerStream(crypto_config,
|
| - compressed_certs_cache,
|
| - FLAGS_enable_quic_stateless_reject_support,
|
| - session) {}
|
| - ~MockQuicCryptoServerStream() override {}
|
| -
|
| - MOCK_METHOD1(SendServerConfigUpdate,
|
| - void(const CachedNetworkParameters* cached_network_parameters));
|
| -
|
| - void set_encryption_established(bool has_established) {
|
| - encryption_established_ = has_established;
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(MockQuicCryptoServerStream);
|
| -};
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, BandwidthEstimates) {
|
| - // Test that bandwidth estimate updates are sent to the client, only when
|
| - // bandwidth resumption is enabled, the bandwidth estimate has changed
|
| - // sufficiently, enough time has passed,
|
| - // and we don't have any other data to write.
|
| -
|
| - // Client has sent kBWRE connection option to trigger bandwidth resumption.
|
| - // Disable this flag because if connection uses multipath sent packet manager,
|
| - // static_cast here does not work.
|
| - QuicTagVector copt;
|
| - copt.push_back(kBWRE);
|
| - QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt);
|
| - session_->OnConfigNegotiated();
|
| - EXPECT_TRUE(
|
| - QuicServerSessionBasePeer::IsBandwidthResumptionEnabled(session_.get()));
|
| -
|
| - int32_t bandwidth_estimate_kbytes_per_second = 123;
|
| - int32_t max_bandwidth_estimate_kbytes_per_second = 134;
|
| - int32_t max_bandwidth_estimate_timestamp = 1122334455;
|
| - const string serving_region = "not a real region";
|
| - session_->set_serving_region(serving_region);
|
| -
|
| - MockQuicCryptoServerStream* crypto_stream = new MockQuicCryptoServerStream(
|
| - &crypto_config_, &compressed_certs_cache_, session_.get());
|
| - QuicServerSessionBasePeer::SetCryptoStream(session_.get(), crypto_stream);
|
| -
|
| - // Set some initial bandwidth values.
|
| - QuicSentPacketManager* sent_packet_manager =
|
| - QuicConnectionPeer::GetSentPacketManager(session_->connection(),
|
| - kDefaultPathId);
|
| - QuicSustainedBandwidthRecorder& bandwidth_recorder =
|
| - QuicSentPacketManagerPeer::GetBandwidthRecorder(sent_packet_manager);
|
| - // Seed an rtt measurement equal to the initial default rtt.
|
| - RttStats* rtt_stats =
|
| - const_cast<RttStats*>(sent_packet_manager->GetRttStats());
|
| - rtt_stats->UpdateRtt(
|
| - QuicTime::Delta::FromMicroseconds(rtt_stats->initial_rtt_us()),
|
| - QuicTime::Delta::Zero(), QuicTime::Zero());
|
| - QuicSustainedBandwidthRecorderPeer::SetBandwidthEstimate(
|
| - &bandwidth_recorder, bandwidth_estimate_kbytes_per_second);
|
| - QuicSustainedBandwidthRecorderPeer::SetMaxBandwidthEstimate(
|
| - &bandwidth_recorder, max_bandwidth_estimate_kbytes_per_second,
|
| - max_bandwidth_estimate_timestamp);
|
| - // Queue up some pending data.
|
| - session_->MarkConnectionLevelWriteBlocked(kCryptoStreamId);
|
| - EXPECT_TRUE(session_->HasDataToWrite());
|
| -
|
| - // There will be no update sent yet - not enough time has passed.
|
| - QuicTime now = QuicTime::Zero();
|
| - session_->OnCongestionWindowChange(now);
|
| -
|
| - // Bandwidth estimate has now changed sufficiently but not enough time has
|
| - // passed to send a Server Config Update.
|
| - bandwidth_estimate_kbytes_per_second =
|
| - bandwidth_estimate_kbytes_per_second * 1.6;
|
| - session_->OnCongestionWindowChange(now);
|
| -
|
| - // Bandwidth estimate has now changed sufficiently and enough time has passed,
|
| - // but not enough packets have been sent.
|
| - int64_t srtt_ms =
|
| - sent_packet_manager->GetRttStats()->smoothed_rtt().ToMilliseconds();
|
| - now = now + QuicTime::Delta::FromMilliseconds(
|
| - kMinIntervalBetweenServerConfigUpdatesRTTs * srtt_ms);
|
| - session_->OnCongestionWindowChange(now);
|
| -
|
| - // The connection no longer has pending data to be written.
|
| - session_->OnCanWrite();
|
| - EXPECT_FALSE(session_->HasDataToWrite());
|
| - session_->OnCongestionWindowChange(now);
|
| -
|
| - // Bandwidth estimate has now changed sufficiently, enough time has passed,
|
| - // and enough packets have been sent.
|
| - QuicConnectionPeer::SetPacketNumberOfLastSentPacket(
|
| - session_->connection(), kMinPacketsBetweenServerConfigUpdates);
|
| -
|
| - // Verify that the proto has exactly the values we expect.
|
| - CachedNetworkParameters expected_network_params;
|
| - expected_network_params.set_bandwidth_estimate_bytes_per_second(
|
| - bandwidth_recorder.BandwidthEstimate().ToBytesPerSecond());
|
| - expected_network_params.set_max_bandwidth_estimate_bytes_per_second(
|
| - bandwidth_recorder.MaxBandwidthEstimate().ToBytesPerSecond());
|
| - expected_network_params.set_max_bandwidth_timestamp_seconds(
|
| - bandwidth_recorder.MaxBandwidthTimestamp());
|
| - expected_network_params.set_min_rtt_ms(session_->connection()
|
| - ->sent_packet_manager()
|
| - .GetRttStats()
|
| - ->min_rtt()
|
| - .ToMilliseconds());
|
| - expected_network_params.set_previous_connection_state(
|
| - CachedNetworkParameters::CONGESTION_AVOIDANCE);
|
| - expected_network_params.set_timestamp(
|
| - session_->connection()->clock()->WallNow().ToUNIXSeconds());
|
| - expected_network_params.set_serving_region(serving_region);
|
| -
|
| - EXPECT_CALL(*crypto_stream,
|
| - SendServerConfigUpdate(EqualsProto(expected_network_params)))
|
| - .Times(1);
|
| - EXPECT_CALL(*connection_, OnSendConnectionState(_)).Times(1);
|
| - session_->OnCongestionWindowChange(now);
|
| -}
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, BandwidthResumptionExperiment) {
|
| - // Test that if a client provides a CachedNetworkParameters with the same
|
| - // serving region as the current server, and which was made within an hour of
|
| - // now, that this data is passed down to the send algorithm.
|
| -
|
| - // Client has sent kBWRE connection option to trigger bandwidth resumption.
|
| - QuicTagVector copt;
|
| - copt.push_back(kBWRE);
|
| - QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt);
|
| -
|
| - const string kTestServingRegion = "a serving region";
|
| - session_->set_serving_region(kTestServingRegion);
|
| -
|
| - // Set the time to be one hour + one second from the 0 baseline.
|
| - connection_->AdvanceTime(
|
| - QuicTime::Delta::FromSeconds(kNumSecondsPerHour + 1));
|
| -
|
| - QuicCryptoServerStream* crypto_stream = static_cast<QuicCryptoServerStream*>(
|
| - QuicSessionPeer::GetCryptoStream(session_.get()));
|
| -
|
| - // No effect if no CachedNetworkParameters provided.
|
| - EXPECT_CALL(*connection_, ResumeConnectionState(_, _)).Times(0);
|
| - session_->OnConfigNegotiated();
|
| -
|
| - // No effect if CachedNetworkParameters provided, but different serving
|
| - // regions.
|
| - CachedNetworkParameters cached_network_params;
|
| - cached_network_params.set_bandwidth_estimate_bytes_per_second(1);
|
| - cached_network_params.set_serving_region("different serving region");
|
| - crypto_stream->SetPreviousCachedNetworkParams(cached_network_params);
|
| - EXPECT_CALL(*connection_, ResumeConnectionState(_, _)).Times(0);
|
| - session_->OnConfigNegotiated();
|
| -
|
| - // Same serving region, but timestamp is too old, should have no effect.
|
| - cached_network_params.set_serving_region(kTestServingRegion);
|
| - cached_network_params.set_timestamp(0);
|
| - crypto_stream->SetPreviousCachedNetworkParams(cached_network_params);
|
| - EXPECT_CALL(*connection_, ResumeConnectionState(_, _)).Times(0);
|
| - session_->OnConfigNegotiated();
|
| -
|
| - // Same serving region, and timestamp is recent: estimate is stored.
|
| - cached_network_params.set_timestamp(
|
| - connection_->clock()->WallNow().ToUNIXSeconds());
|
| - crypto_stream->SetPreviousCachedNetworkParams(cached_network_params);
|
| - EXPECT_CALL(*connection_, ResumeConnectionState(_, _)).Times(1);
|
| - session_->OnConfigNegotiated();
|
| -}
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, BandwidthMaxEnablesResumption) {
|
| - EXPECT_FALSE(
|
| - QuicServerSessionBasePeer::IsBandwidthResumptionEnabled(session_.get()));
|
| -
|
| - // Client has sent kBWMX connection option to trigger bandwidth resumption.
|
| - QuicTagVector copt;
|
| - copt.push_back(kBWMX);
|
| - QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt);
|
| - session_->OnConfigNegotiated();
|
| - EXPECT_TRUE(
|
| - QuicServerSessionBasePeer::IsBandwidthResumptionEnabled(session_.get()));
|
| -}
|
| -
|
| -TEST_P(QuicServerSessionBaseTest, NoBandwidthResumptionByDefault) {
|
| - EXPECT_FALSE(
|
| - QuicServerSessionBasePeer::IsBandwidthResumptionEnabled(session_.get()));
|
| - session_->OnConfigNegotiated();
|
| - EXPECT_FALSE(
|
| - QuicServerSessionBasePeer::IsBandwidthResumptionEnabled(session_.get()));
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace test
|
| -} // namespace net
|
|
|