Index: net/tools/quic/quic_server_session_test.cc |
diff --git a/net/tools/quic/quic_server_session_test.cc b/net/tools/quic/quic_server_session_test.cc |
deleted file mode 100644 |
index 71c2b42854db0baaa82b52c52a7829ec5a7584e8..0000000000000000000000000000000000000000 |
--- a/net/tools/quic/quic_server_session_test.cc |
+++ /dev/null |
@@ -1,432 +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/tools/quic/quic_server_session.h" |
- |
-#include "net/quic/crypto/cached_network_parameters.h" |
-#include "net/quic/crypto/quic_crypto_server_config.h" |
-#include "net/quic/crypto/quic_random.h" |
-#include "net/quic/quic_connection.h" |
-#include "net/quic/quic_crypto_server_stream.h" |
-#include "net/quic/quic_flags.h" |
-#include "net/quic/quic_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_data_stream_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_sustained_bandwidth_recorder_peer.h" |
-#include "net/quic/test_tools/quic_test_utils.h" |
-#include "net/tools/quic/quic_spdy_server_stream.h" |
-#include "net/tools/quic/test_tools/quic_test_utils.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using __gnu_cxx::vector; |
-using net::test::MockConnection; |
-using net::test::QuicConfigPeer; |
-using net::test::QuicConnectionPeer; |
-using net::test::QuicDataStreamPeer; |
-using net::test::QuicSentPacketManagerPeer; |
-using net::test::QuicSessionPeer; |
-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::kClientDataStreamId4; |
-using std::string; |
-using testing::StrictMock; |
-using testing::_; |
- |
-namespace net { |
-namespace tools { |
-namespace test { |
- |
-class QuicServerSessionPeer { |
- public: |
- static QuicDataStream* GetIncomingDataStream( |
- QuicServerSession* s, QuicStreamId id) { |
- return s->GetIncomingDataStream(id); |
- } |
- static QuicDataStream* GetDataStream(QuicServerSession* s, QuicStreamId id) { |
- return s->GetDataStream(id); |
- } |
- static void SetCryptoStream(QuicServerSession* s, |
- QuicCryptoServerStream* crypto_stream) { |
- s->crypto_stream_.reset(crypto_stream); |
- } |
-}; |
- |
-namespace { |
- |
-const size_t kMaxStreamsForTest = 10; |
- |
-class QuicServerSessionTest : public ::testing::TestWithParam<QuicVersion> { |
- protected: |
- QuicServerSessionTest() |
- : crypto_config_(QuicCryptoServerConfig::TESTING, |
- QuicRandom::GetInstance()) { |
- config_.SetMaxStreamsPerConnection(kMaxStreamsForTest, |
- kMaxStreamsForTest); |
- config_.SetInitialStreamFlowControlWindowToSend( |
- kInitialStreamFlowControlWindowForTest); |
- config_.SetInitialSessionFlowControlWindowToSend( |
- kInitialSessionFlowControlWindowForTest); |
- |
- connection_ = |
- new StrictMock<MockConnection>(true, SupportedVersions(GetParam())); |
- session_.reset(new QuicServerSession(config_, connection_, &owner_)); |
- MockClock clock; |
- handshake_message_.reset(crypto_config_.AddDefaultConfig( |
- QuicRandom::GetInstance(), &clock, |
- QuicCryptoServerConfig::ConfigOptions())); |
- session_->InitializeSession(crypto_config_); |
- visitor_ = QuicConnectionPeer::GetVisitor(connection_); |
- } |
- |
- QuicVersion version() const { return connection_->version(); } |
- |
- StrictMock<MockQuicServerSessionVisitor> owner_; |
- StrictMock<MockConnection>* connection_; |
- QuicConfig config_; |
- QuicCryptoServerConfig crypto_config_; |
- scoped_ptr<QuicServerSession> session_; |
- scoped_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, QuicServerSessionTest, |
- ::testing::ValuesIn(QuicSupportedVersions())); |
- |
-TEST_P(QuicServerSessionTest, CloseStreamDueToReset) { |
- // Open a stream, then reset it. |
- // Send two bytes of payload to open it. |
- QuicStreamFrame data1(kClientDataStreamId1, false, 0, MakeIOVector("HT")); |
- vector<QuicStreamFrame> frames; |
- frames.push_back(data1); |
- session_->OnStreamFrames(frames); |
- EXPECT_EQ(1u, session_->GetNumOpenStreams()); |
- |
- // Send a reset (and expect the peer to send a RST in response). |
- QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_STREAM_NO_ERROR, 0); |
- EXPECT_CALL(*connection_, |
- SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0)); |
- visitor_->OnRstStream(rst1); |
- EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
- |
- // Send the same two bytes of payload in a new packet. |
- visitor_->OnStreamFrames(frames); |
- |
- // The stream should not be re-opened. |
- EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
- EXPECT_TRUE(connection_->connected()); |
-} |
- |
-TEST_P(QuicServerSessionTest, NeverOpenStreamDueToReset) { |
- // Send a reset (and expect the peer to send a RST in response). |
- QuicRstStreamFrame rst1(kClientDataStreamId1, QUIC_STREAM_NO_ERROR, 0); |
- EXPECT_CALL(*connection_, |
- SendRstStream(kClientDataStreamId1, QUIC_RST_ACKNOWLEDGEMENT, 0)); |
- visitor_->OnRstStream(rst1); |
- EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
- |
- // Send two bytes of payload. |
- QuicStreamFrame data1(kClientDataStreamId1, false, 0, MakeIOVector("HT")); |
- vector<QuicStreamFrame> frames; |
- frames.push_back(data1); |
- visitor_->OnStreamFrames(frames); |
- |
- // The stream should never be opened, now that the reset is received. |
- EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
- EXPECT_TRUE(connection_->connected()); |
-} |
- |
-TEST_P(QuicServerSessionTest, AcceptClosedStream) { |
- vector<QuicStreamFrame> frames; |
- // Send (empty) compressed headers followed by two bytes of data. |
- frames.push_back(QuicStreamFrame(kClientDataStreamId1, false, 0, |
- MakeIOVector("\1\0\0\0\0\0\0\0HT"))); |
- frames.push_back(QuicStreamFrame(kClientDataStreamId2, false, 0, |
- MakeIOVector("\2\0\0\0\0\0\0\0HT"))); |
- visitor_->OnStreamFrames(frames); |
- EXPECT_EQ(2u, session_->GetNumOpenStreams()); |
- |
- // Send a reset (and expect the peer to send a RST in response). |
- QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_NO_ERROR, 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. |
- frames.clear(); |
- frames.push_back( |
- QuicStreamFrame(kClientDataStreamId1, false, 2, MakeIOVector("TP"))); |
- frames.push_back( |
- QuicStreamFrame(kClientDataStreamId2, false, 2, MakeIOVector("TP"))); |
- visitor_->OnStreamFrames(frames); |
- // The stream should never be opened, now that the reset is received. |
- EXPECT_EQ(1u, session_->GetNumOpenStreams()); |
- EXPECT_TRUE(connection_->connected()); |
-} |
- |
-TEST_P(QuicServerSessionTest, MaxOpenStreams) { |
- // Test that the server closes the connection 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. |
- |
- // The slightly increased stream limit is set during config negotiation. It |
- // should be either an increase of 10 over negotiated limit, or a fixed |
- // percentage scaling, whichever is larger. Test both before continuing. |
- EXPECT_EQ(kMaxStreamsForTest, session_->get_max_open_streams()); |
- session_->OnConfigNegotiated(); |
- EXPECT_LT(kMaxStreamsMultiplier * kMaxStreamsForTest, |
- kMaxStreamsForTest + kMaxStreamsMinimumIncrement); |
- EXPECT_EQ(kMaxStreamsForTest + kMaxStreamsMinimumIncrement, |
- session_->get_max_open_streams()); |
- EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
- 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(QuicServerSessionPeer::GetIncomingDataStream(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(QuicServerSessionPeer::GetIncomingDataStream(session_.get(), |
- stream_id)); |
- stream_id += 2; |
- } |
- |
- // Now violate the server's internal stream limit. |
- EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); |
- stream_id += 2; |
- EXPECT_FALSE( |
- QuicServerSessionPeer::GetIncomingDataStream(session_.get(), stream_id)); |
-} |
- |
-TEST_P(QuicServerSessionTest, MaxOpenStreamsImplicit) { |
- // Test that the server closes the connection if a client attempts to open too |
- // many data streams implicitly. The server accepts slightly more than the |
- // negotiated stream limit to deal with rare cases where a client FIN/RST is |
- // lost. |
- |
- // The slightly increased stream limit is set during config negotiation. |
- EXPECT_EQ(kMaxStreamsForTest, session_->get_max_open_streams()); |
- session_->OnConfigNegotiated(); |
- EXPECT_LT(kMaxStreamsMultiplier * kMaxStreamsForTest, |
- kMaxStreamsForTest + kMaxStreamsMinimumIncrement); |
- EXPECT_EQ(kMaxStreamsForTest + kMaxStreamsMinimumIncrement, |
- session_->get_max_open_streams()); |
- |
- EXPECT_EQ(0u, session_->GetNumOpenStreams()); |
- EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream( |
- session_.get(), kClientDataStreamId1)); |
- // Implicitly open streams up to the server's limit. |
- const int kActualMaxStreams = |
- kMaxStreamsForTest + kMaxStreamsMinimumIncrement; |
- const int kMaxValidStreamId = |
- kClientDataStreamId1 + (kActualMaxStreams - 1) * 2; |
- EXPECT_TRUE(QuicServerSessionPeer::GetIncomingDataStream( |
- session_.get(), kMaxValidStreamId)); |
- |
- // Opening a further stream will result in connection close. |
- EXPECT_CALL(*connection_, SendConnectionClose(QUIC_TOO_MANY_OPEN_STREAMS)); |
- EXPECT_FALSE(QuicServerSessionPeer::GetIncomingDataStream( |
- session_.get(), kMaxValidStreamId + 2)); |
-} |
- |
-TEST_P(QuicServerSessionTest, GetEvenIncomingError) { |
- // Incoming streams on the server session must be odd. |
- EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_STREAM_ID)); |
- EXPECT_EQ(nullptr, |
- QuicServerSessionPeer::GetIncomingDataStream(session_.get(), 4)); |
-} |
- |
-TEST_P(QuicServerSessionTest, SetFecProtectionFromConfig) { |
- ValueRestore<bool> old_flag(&FLAGS_enable_quic_fec, true); |
- |
- // Set received config to have FEC connection option. |
- QuicTagVector copt; |
- copt.push_back(kFHDR); |
- QuicConfigPeer::SetReceivedConnectionOptions(session_->config(), copt); |
- session_->OnConfigNegotiated(); |
- |
- // Verify that headers stream is always protected and data streams are |
- // optionally protected. |
- EXPECT_EQ(FEC_PROTECT_ALWAYS, |
- QuicSessionPeer::GetHeadersStream(session_.get())->fec_policy()); |
- QuicDataStream* stream = QuicServerSessionPeer::GetIncomingDataStream( |
- session_.get(), kClientDataStreamId1); |
- ASSERT_TRUE(stream); |
- EXPECT_EQ(FEC_PROTECT_OPTIONAL, stream->fec_policy()); |
-} |
- |
-class MockQuicCryptoServerStream : public QuicCryptoServerStream { |
- public: |
- explicit MockQuicCryptoServerStream( |
- const QuicCryptoServerConfig& crypto_config, QuicSession* session) |
- : QuicCryptoServerStream(crypto_config, session) {} |
- ~MockQuicCryptoServerStream() override {} |
- |
- MOCK_METHOD1(SendServerConfigUpdate, |
- void(const CachedNetworkParameters* cached_network_parameters)); |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(MockQuicCryptoServerStream); |
-}; |
- |
-TEST_P(QuicServerSessionTest, BandwidthEstimates) { |
- // Test that bandwidth estimate updates are sent to the client, only after the |
- // bandwidth estimate has changes sufficiently, and enough time has passed, |
- // and we don't have any other data to write. |
- |
- int32 bandwidth_estimate_kbytes_per_second = 123; |
- int32 max_bandwidth_estimate_kbytes_per_second = 134; |
- int32 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_, session_.get()); |
- QuicServerSessionPeer::SetCryptoStream(session_.get(), crypto_stream); |
- |
- // Set some initial bandwidth values. |
- QuicSentPacketManager* sent_packet_manager = |
- QuicConnectionPeer::GetSentPacketManager(session_->connection()); |
- QuicSustainedBandwidthRecorder& bandwidth_recorder = |
- QuicSentPacketManagerPeer::GetBandwidthRecorder(sent_packet_manager); |
- // Seed an rtt measurement equal to the initial default rtt. |
- RttStats* rtt_stats = |
- QuicSentPacketManagerPeer::GetRttStats(sent_packet_manager); |
- 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_->MarkWriteBlocked(kCryptoStreamId, |
- QuicWriteBlockedList::kHighestPriority); |
- 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 srtt_ms = |
- sent_packet_manager->GetRttStats()->smoothed_rtt().ToMilliseconds(); |
- now = now.Add(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::SetSequenceNumberOfLastSentPacket( |
- 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); |
- session_->OnCongestionWindowChange(now); |
-} |
- |
-TEST_P(QuicServerSessionTest, BandwidthResumptionExperiment) { |
- ValueRestore<bool> old_flag( |
- &FLAGS_quic_enable_bandwidth_resumption_experiment, true); |
- |
- // Test that if a client provides a CachedNetworkParameters with the same |
- // serving region as the current server, 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); |
- |
- 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->set_previous_cached_network_params(cached_network_params); |
- EXPECT_CALL(*connection_, ResumeConnectionState(_)).Times(0); |
- session_->OnConfigNegotiated(); |
- |
- // Same serving region results in CachedNetworkParameters being stored. |
- cached_network_params.set_serving_region(kTestServingRegion); |
- crypto_stream->set_previous_cached_network_params(cached_network_params); |
- EXPECT_CALL(*connection_, ResumeConnectionState(_)).Times(1); |
- session_->OnConfigNegotiated(); |
-} |
- |
-} // namespace |
-} // namespace test |
-} // namespace tools |
-} // namespace net |