Index: net/quic/quic_connection_test.cc |
diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc |
index fe117665ec2b2ddfe1a0fee20faa54cef5a84e29..4ac928482a98d16c6f7480948a9ca380db658c7b 100644 |
--- a/net/quic/quic_connection_test.cc |
+++ b/net/quic/quic_connection_test.cc |
@@ -14,6 +14,7 @@ |
#include "net/quic/crypto/null_encrypter.h" |
#include "net/quic/crypto/quic_decrypter.h" |
#include "net/quic/crypto/quic_encrypter.h" |
+#include "net/quic/quic_ack_notifier.h" |
#include "net/quic/quic_flags.h" |
#include "net/quic/quic_protocol.h" |
#include "net/quic/quic_utils.h" |
@@ -26,6 +27,7 @@ |
#include "net/quic/test_tools/quic_sent_packet_manager_peer.h" |
#include "net/quic/test_tools/quic_test_utils.h" |
#include "net/quic/test_tools/simple_quic_framer.h" |
+#include "net/test/gtest_util.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -4136,7 +4138,7 @@ TEST_P(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) { |
ProcessFecPacket(2, 1, true, !kEntropyFlag, packet); |
} |
-TEST_P(QuicConnectionTest, NetworkChangeVisitorCallbacksChangeFecState) { |
+TEST_P(QuicConnectionTest, NetworkChangeVisitorCwndCallbackChangesFecState) { |
QuicPacketCreator* creator = |
QuicConnectionPeer::GetPacketCreator(&connection_); |
size_t max_packets_per_fec_group = creator->max_packets_per_fec_group(); |
@@ -4153,6 +4155,47 @@ TEST_P(QuicConnectionTest, NetworkChangeVisitorCallbacksChangeFecState) { |
EXPECT_LT(max_packets_per_fec_group, creator->max_packets_per_fec_group()); |
} |
+TEST_P(QuicConnectionTest, NetworkChangeVisitorConfigCallbackChangesFecState) { |
+ QuicSentPacketManager* sent_packet_manager = |
+ QuicConnectionPeer::GetSentPacketManager(&connection_); |
+ QuicSentPacketManager::NetworkChangeVisitor* visitor = |
+ QuicSentPacketManagerPeer::GetNetworkChangeVisitor(sent_packet_manager); |
+ EXPECT_TRUE(visitor); |
+ |
+ QuicPacketGenerator* generator = |
+ QuicConnectionPeer::GetPacketGenerator(&connection_); |
+ EXPECT_EQ(QuicTime::Delta::Zero(), generator->fec_timeout()); |
+ |
+ // Verify that sending a config with a new initial rtt changes fec timeout. |
+ // Create and process a config with a non-zero initial RTT. |
+ EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _, _)); |
+ QuicConfig config; |
+ config.SetInitialRoundTripTimeUsToSend(300000); |
+ connection_.SetFromConfig(config); |
+ EXPECT_LT(QuicTime::Delta::Zero(), generator->fec_timeout()); |
+} |
+ |
+TEST_P(QuicConnectionTest, NetworkChangeVisitorRttCallbackChangesFecState) { |
+ // Verify that sending a config with a new initial rtt changes fec timeout. |
+ QuicSentPacketManager* sent_packet_manager = |
+ QuicConnectionPeer::GetSentPacketManager(&connection_); |
+ QuicSentPacketManager::NetworkChangeVisitor* visitor = |
+ QuicSentPacketManagerPeer::GetNetworkChangeVisitor(sent_packet_manager); |
+ EXPECT_TRUE(visitor); |
+ |
+ QuicPacketGenerator* generator = |
+ QuicConnectionPeer::GetPacketGenerator(&connection_); |
+ EXPECT_EQ(QuicTime::Delta::Zero(), generator->fec_timeout()); |
+ |
+ // Increase FEC timeout by increasing RTT. |
+ RttStats* rtt_stats = |
+ QuicSentPacketManagerPeer::GetRttStats(sent_packet_manager); |
+ rtt_stats->UpdateRtt(QuicTime::Delta::FromMilliseconds(300), |
+ QuicTime::Delta::Zero(), QuicTime::Zero()); |
+ visitor->OnRttChange(); |
+ EXPECT_LT(QuicTime::Delta::Zero(), generator->fec_timeout()); |
+} |
+ |
class MockQuicConnectionDebugVisitor |
: public QuicConnectionDebugVisitor { |
public: |
@@ -4248,6 +4291,17 @@ TEST_P(QuicConnectionTest, ControlFramesInstigateAcks) { |
EXPECT_TRUE(ack_alarm->IsSet()); |
} |
+TEST_P(QuicConnectionTest, NoDataNoFin) { |
+ ValueRestore<bool> old_flag(&FLAGS_quic_empty_data_no_fin_early_return, true); |
+ // Make sure that a call to SendStreamWithData, with no data and no FIN, does |
+ // not result in a QuicAckNotifier being used-after-free (fail under ASAN). |
+ // Regression test for b/18594622 |
+ scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
+ EXPECT_DFATAL( |
+ connection_.SendStreamDataWithString(3, "", 0, !kFin, delegate.get()), |
+ "Attempt to send empty stream frame"); |
+} |
+ |
} // namespace |
} // namespace test |
} // namespace net |