Index: net/tools/quic/quic_epoll_connection_helper_test.cc |
diff --git a/net/tools/quic/quic_epoll_connection_helper_test.cc b/net/tools/quic/quic_epoll_connection_helper_test.cc |
index 56e2d20dfaa274744605763e792ec07ebf85fa55..0f977f4fb305f5d620e089a4d0a283ecc60a7c5a 100644 |
--- a/net/tools/quic/quic_epoll_connection_helper_test.cc |
+++ b/net/tools/quic/quic_epoll_connection_helper_test.cc |
@@ -4,232 +4,103 @@ |
#include "net/tools/quic/quic_epoll_connection_helper.h" |
-#include "net/quic/crypto/crypto_protocol.h" |
-#include "net/quic/crypto/quic_decrypter.h" |
-#include "net/quic/crypto/quic_encrypter.h" |
#include "net/quic/crypto/quic_random.h" |
-#include "net/quic/quic_connection.h" |
-#include "net/quic/quic_framer.h" |
-#include "net/quic/test_tools/quic_connection_peer.h" |
-#include "net/quic/test_tools/quic_test_utils.h" |
#include "net/tools/quic/test_tools/mock_epoll_server.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-using net::test::FramerVisitorCapturingFrames; |
-using net::test::MockSendAlgorithm; |
-using net::test::QuicConnectionPeer; |
-using net::test::MockConnectionVisitor; |
using net::tools::test::MockEpollServer; |
-using testing::_; |
-using testing::AnyNumber; |
-using testing::Return; |
namespace net { |
namespace tools { |
namespace test { |
namespace { |
-const char kData[] = "foo"; |
-const bool kFromPeer = true; |
- |
-class TestWriter : public QuicPacketWriter { |
+class TestDelegate : public QuicAlarm::Delegate { |
public: |
- // QuicPacketWriter |
- virtual WriteResult WritePacket( |
- const char* buffer, size_t buf_len, |
- const IPAddressNumber& self_address, |
- const IPEndPoint& peer_address, |
- QuicBlockedWriterInterface* blocked_writer) OVERRIDE { |
- QuicFramer framer(QuicSupportedVersions(), QuicTime::Zero(), true); |
- FramerVisitorCapturingFrames visitor; |
- framer.set_visitor(&visitor); |
- QuicEncryptedPacket packet(buffer, buf_len); |
- EXPECT_TRUE(framer.ProcessPacket(packet)); |
- header_ = *visitor.header(); |
- return WriteResult(WRITE_STATUS_OK, packet.length()); |
- } |
+ TestDelegate() : fired_(false) {} |
- virtual bool IsWriteBlockedDataBuffered() const OVERRIDE { |
- return false; |
+ virtual QuicTime OnAlarm() OVERRIDE { |
+ fired_ = true; |
+ return QuicTime::Zero(); |
} |
- // Returns the header from the last packet written. |
- const QuicPacketHeader& header() { return header_; } |
+ bool fired() const { return fired_; } |
private: |
- QuicPacketHeader header_; |
-}; |
- |
-class TestConnection : public QuicConnection { |
- public: |
- TestConnection(QuicGuid guid, |
- IPEndPoint address, |
- QuicEpollConnectionHelper* helper, |
- TestWriter* writer) |
- : QuicConnection(guid, address, helper, writer, false, |
- QuicSupportedVersions()) { |
- } |
- |
- void SendAck() { |
- QuicConnectionPeer::SendAck(this); |
- } |
- |
- void SetSendAlgorithm(SendAlgorithmInterface* send_algorithm) { |
- QuicConnectionPeer::SetSendAlgorithm(this, send_algorithm); |
- } |
+ bool fired_; |
}; |
class QuicEpollConnectionHelperTest : public ::testing::Test { |
protected: |
- QuicEpollConnectionHelperTest() |
- : guid_(42), |
- framer_(QuicSupportedVersions(), QuicTime::Zero(), false), |
- send_algorithm_(new testing::StrictMock<MockSendAlgorithm>), |
- helper_(&epoll_server_), |
- connection_(guid_, IPEndPoint(), &helper_, &writer_), |
- frame_(3, false, 0, MakeIOVector(kData)) { |
- connection_.set_visitor(&visitor_); |
- connection_.SetSendAlgorithm(send_algorithm_); |
- epoll_server_.set_timeout_in_us(-1); |
- EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _, _, _)). |
- WillRepeatedly(Return(QuicTime::Delta::Zero())); |
- EXPECT_CALL(*send_algorithm_, BandwidthEstimate()).WillRepeatedly(Return( |
- QuicBandwidth::FromKBitsPerSecond(100))); |
- EXPECT_CALL(*send_algorithm_, SmoothedRtt()).WillRepeatedly(Return( |
- QuicTime::Delta::FromMilliseconds(100))); |
- ON_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
- .WillByDefault(Return(true)); |
- } |
- |
- QuicPacket* ConstructDataPacket(QuicPacketSequenceNumber number, |
- QuicFecGroupNumber fec_group) { |
- QuicPacketHeader header; |
- header.public_header.version_flag = false; |
- header.public_header.reset_flag = false; |
- header.fec_flag = false; |
- header.entropy_flag = false; |
- header.packet_sequence_number = number; |
- header.is_in_fec_group = fec_group == 0 ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; |
- header.fec_group = fec_group; |
- |
- QuicFrames frames; |
- frames.push_back(QuicFrame(&frame_)); |
- return framer_.BuildUnsizedDataPacket(header, frames).packet; |
- } |
- |
- QuicGuid guid_; |
- QuicFramer framer_; |
+ QuicEpollConnectionHelperTest() : helper_(&epoll_server_) {} |
MockEpollServer epoll_server_; |
- testing::StrictMock<MockSendAlgorithm>* send_algorithm_; |
QuicEpollConnectionHelper helper_; |
- TestWriter writer_; |
- TestConnection connection_; |
- testing::StrictMock<MockConnectionVisitor> visitor_; |
- |
- QuicStreamFrame frame_; |
}; |
-TEST_F(QuicEpollConnectionHelperTest, DISABLED_TestRTORetransmission) { |
- EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( |
- Return(QuicTime::Delta::Zero())); |
- const int64 kDefaultRetransmissionTimeMs = 500; |
- |
- char buffer[] = "foo"; |
- const size_t packet_size = |
- QuicPacketCreator::StreamFramePacketOverhead( |
- framer_.version(), PACKET_8BYTE_GUID, kIncludeVersion, |
- PACKET_1BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP) + |
- arraysize(buffer) - 1; |
- |
- EXPECT_CALL(*send_algorithm_, |
- OnPacketSent(_, 1, packet_size, NOT_RETRANSMISSION, _)); |
- EXPECT_CALL(*send_algorithm_, OnPacketAbandoned(1, packet_size)); |
- EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(Return(true)); |
- EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); |
- IOVector data; |
- data.Append(buffer, 3); |
- connection_.SendStreamData(1, data, 0, false, NULL); |
- EXPECT_EQ(1u, writer_.header().packet_sequence_number); |
- EXPECT_CALL(*send_algorithm_, |
- OnPacketSent(_, 2, packet_size, RTO_RETRANSMISSION, _)); |
- epoll_server_.AdvanceByAndCallCallbacks(kDefaultRetransmissionTimeMs * 1000); |
- |
- EXPECT_EQ(2u, writer_.header().packet_sequence_number); |
+TEST_F(QuicEpollConnectionHelperTest, GetClock) { |
+ const QuicClock* clock = helper_.GetClock(); |
+ QuicTime start = clock->Now(); |
+ |
+ QuicTime::Delta delta = QuicTime::Delta::FromMilliseconds(5); |
+ epoll_server_.AdvanceBy(delta.ToMicroseconds()); |
+ |
+ EXPECT_EQ(start.Add(delta), clock->Now()); |
} |
-TEST_F(QuicEpollConnectionHelperTest, InitialTimeout) { |
- EXPECT_TRUE(connection_.connected()); |
- |
- EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 1, _, NOT_RETRANSMISSION, |
- HAS_RETRANSMITTABLE_DATA)); |
- EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillOnce( |
- Return(QuicTime::Delta::FromMicroseconds(1))); |
- EXPECT_CALL(visitor_, |
- OnConnectionClosed(QUIC_CONNECTION_TIMED_OUT, !kFromPeer)); |
- epoll_server_.WaitForEventsAndExecuteCallbacks(); |
- EXPECT_FALSE(connection_.connected()); |
- EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000, epoll_server_.NowInUsec()); |
+TEST_F(QuicEpollConnectionHelperTest, GetRandomGenerator) { |
+ QuicRandom* random = helper_.GetRandomGenerator(); |
+ EXPECT_EQ(QuicRandom::GetInstance(), random); |
} |
-TEST_F(QuicEpollConnectionHelperTest, TimeoutAfterSend) { |
- EXPECT_TRUE(connection_.connected()); |
- EXPECT_EQ(0, epoll_server_.NowInUsec()); |
- |
- // When we send a packet, the timeout will change to 5000 + |
- // kDefaultInitialTimeoutSecs. |
- epoll_server_.AdvanceBy(5000); |
- EXPECT_EQ(5000, epoll_server_.NowInUsec()); |
- |
- // Send an ack so we don't set the retransmission alarm. |
- EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 1, _, NOT_RETRANSMISSION, |
- NO_RETRANSMITTABLE_DATA)); |
- connection_.SendAck(); |
- |
- // The original alarm will fire. We should not time out because we had a |
- // network event at t=5000. The alarm will reregister. |
- epoll_server_.WaitForEventsAndExecuteCallbacks(); |
- EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000, epoll_server_.NowInUsec()); |
- |
- // This time, we should time out. |
- EXPECT_CALL(visitor_, |
- OnConnectionClosed(QUIC_CONNECTION_TIMED_OUT, !kFromPeer)); |
- EXPECT_CALL(*send_algorithm_, OnPacketSent(_, 2, _, NOT_RETRANSMISSION, |
- HAS_RETRANSMITTABLE_DATA)); |
- EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillOnce( |
- Return(QuicTime::Delta::FromMicroseconds(1))); |
- epoll_server_.WaitForEventsAndExecuteCallbacks(); |
- EXPECT_EQ(kDefaultInitialTimeoutSecs * 1000000 + 5000, |
- epoll_server_.NowInUsec()); |
- EXPECT_FALSE(connection_.connected()); |
+TEST_F(QuicEpollConnectionHelperTest, CreateAlarm) { |
+ TestDelegate* delegate = new TestDelegate(); |
+ scoped_ptr<QuicAlarm> alarm(helper_.CreateAlarm(delegate)); |
+ |
+ const QuicClock* clock = helper_.GetClock(); |
+ QuicTime start = clock->Now(); |
+ QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(1); |
+ alarm->Set(start.Add(delta)); |
+ |
+ epoll_server_.AdvanceByAndCallCallbacks(delta.ToMicroseconds()); |
+ EXPECT_EQ(start.Add(delta), clock->Now()); |
+} |
+ |
+TEST_F(QuicEpollConnectionHelperTest, CreateAlarmAndCancel) { |
+ TestDelegate* delegate = new TestDelegate(); |
+ scoped_ptr<QuicAlarm> alarm(helper_.CreateAlarm(delegate)); |
+ |
+ const QuicClock* clock = helper_.GetClock(); |
+ QuicTime start = clock->Now(); |
+ QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(1); |
+ alarm->Set(start.Add(delta)); |
+ alarm->Cancel(); |
+ |
+ epoll_server_.AdvanceByExactlyAndCallCallbacks(delta.ToMicroseconds()); |
+ EXPECT_EQ(start.Add(delta), clock->Now()); |
+ EXPECT_FALSE(delegate->fired()); |
} |
-TEST_F(QuicEpollConnectionHelperTest, SendSchedulerDelayThenSend) { |
- // Test that if we send a packet with a delay, it ends up queued. |
- EXPECT_CALL(*send_algorithm_, RetransmissionDelay()).WillRepeatedly( |
- Return(QuicTime::Delta::Zero())); |
- EXPECT_CALL( |
- *send_algorithm_, TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce( |
- Return(QuicTime::Delta::FromMicroseconds(1))); |
- connection_.OnSerializedPacket( |
- SerializedPacket(1, PACKET_6BYTE_SEQUENCE_NUMBER, |
- ConstructDataPacket(1, 0), 0, |
- new RetransmittableFrames)); |
- |
- EXPECT_CALL(*send_algorithm_, |
- OnPacketSent(_, 1, _, NOT_RETRANSMISSION, _)); |
- EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
- |
- // Advance the clock to fire the alarm, and configure the scheduler |
- // to permit the packet to be sent. |
- EXPECT_CALL(*send_algorithm_, |
- TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillRepeatedly( |
- Return(QuicTime::Delta::Zero())); |
- EXPECT_CALL(visitor_, OnCanWrite()).WillOnce(Return(true)); |
- EXPECT_CALL(visitor_, HasPendingHandshake()).Times(AnyNumber()); |
- epoll_server_.AdvanceByAndCallCallbacks(1); |
- EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
+TEST_F(QuicEpollConnectionHelperTest, CreateAlarmAndReset) { |
+ TestDelegate* delegate = new TestDelegate(); |
+ scoped_ptr<QuicAlarm> alarm(helper_.CreateAlarm(delegate)); |
+ |
+ const QuicClock* clock = helper_.GetClock(); |
+ QuicTime start = clock->Now(); |
+ QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(1); |
+ alarm->Set(clock->Now().Add(delta)); |
+ alarm->Cancel(); |
+ QuicTime::Delta new_delta = QuicTime::Delta::FromMicroseconds(3); |
+ alarm->Set(clock->Now().Add(new_delta)); |
+ |
+ epoll_server_.AdvanceByExactlyAndCallCallbacks(delta.ToMicroseconds()); |
+ EXPECT_EQ(start.Add(delta), clock->Now()); |
+ EXPECT_FALSE(delegate->fired()); |
+ |
+ epoll_server_.AdvanceByExactlyAndCallCallbacks( |
+ new_delta.Subtract(delta).ToMicroseconds()); |
+ EXPECT_EQ(start.Add(new_delta), clock->Now()); |
+ EXPECT_TRUE(delegate->fired()); |
} |
} // namespace |