| // 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_ack_notifier.h" | 
 |  | 
 | #include "net/quic/test_tools/quic_test_utils.h" | 
 | #include "testing/gmock/include/gmock/gmock.h" | 
 | #include "testing/gtest/include/gtest/gtest.h" | 
 |  | 
 | using testing::_; | 
 |  | 
 | namespace net { | 
 | namespace test { | 
 | namespace { | 
 |  | 
 | class QuicAckNotifierTest : public ::testing::Test { | 
 |  protected: | 
 |   QuicAckNotifierTest() : zero_(QuicTime::Delta::Zero()) {} | 
 |  | 
 |   void SetUp() override { | 
 |     delegate_ = new MockAckNotifierDelegate; | 
 |     notifier_.reset(new QuicAckNotifier(delegate_)); | 
 |  | 
 |     notifier_->AddSequenceNumber(26, 100); | 
 |     notifier_->AddSequenceNumber(99, 20); | 
 |     notifier_->AddSequenceNumber(1234, 3); | 
 |   } | 
 |  | 
 |   MockAckNotifierDelegate* delegate_; | 
 |   scoped_ptr<QuicAckNotifier> notifier_; | 
 |   QuicTime::Delta zero_; | 
 | }; | 
 |  | 
 | // Should trigger callback when we receive acks for all the registered seqnums. | 
 | TEST_F(QuicAckNotifierTest, TriggerCallback) { | 
 |   EXPECT_CALL(*delegate_, OnAckNotification(0, 0, zero_)).Times(1); | 
 |   EXPECT_FALSE(notifier_->OnAck(26, zero_)); | 
 |   EXPECT_FALSE(notifier_->OnAck(99, zero_)); | 
 |   EXPECT_TRUE(notifier_->OnAck(1234, zero_)); | 
 | } | 
 |  | 
 | // Should not trigger callback if we never provide all the seqnums. | 
 | TEST_F(QuicAckNotifierTest, DoesNotTrigger) { | 
 |   // Should not trigger callback as not all packets have been seen. | 
 |   EXPECT_CALL(*delegate_, OnAckNotification(_, _, _)).Times(0); | 
 |   EXPECT_FALSE(notifier_->OnAck(26, zero_)); | 
 |   EXPECT_FALSE(notifier_->OnAck(99, zero_)); | 
 | } | 
 |  | 
 | // Should trigger even after updating sequence numbers and receiving ACKs for | 
 | // new sequeunce numbers. | 
 | TEST_F(QuicAckNotifierTest, UpdateSeqNums) { | 
 |   // Update a couple of the sequence numbers (i.e. retransmitted packets) | 
 |   notifier_->OnPacketRetransmitted(20); | 
 |   notifier_->OnPacketRetransmitted(3); | 
 |  | 
 |   EXPECT_CALL(*delegate_, OnAckNotification(2, 20 + 3, _)).Times(1); | 
 |   EXPECT_FALSE(notifier_->OnAck(26, zero_));    // original | 
 |   EXPECT_FALSE(notifier_->OnAck(3000, zero_));  // updated | 
 |   EXPECT_TRUE(notifier_->OnAck(3001, zero_));   // updated | 
 | } | 
 |  | 
 | // Make sure the delegate is called with the delta time from the last ACK. | 
 | TEST_F(QuicAckNotifierTest, DeltaTime) { | 
 |   const QuicTime::Delta first_delta = QuicTime::Delta::FromSeconds(5); | 
 |   const QuicTime::Delta second_delta = QuicTime::Delta::FromSeconds(33); | 
 |   const QuicTime::Delta third_delta = QuicTime::Delta::FromSeconds(10); | 
 |  | 
 |   EXPECT_CALL(*delegate_, OnAckNotification(0, 0, third_delta)).Times(1); | 
 |   EXPECT_FALSE(notifier_->OnAck(26, first_delta)); | 
 |   EXPECT_FALSE(notifier_->OnAck(99, second_delta)); | 
 |   EXPECT_TRUE(notifier_->OnAck(1234, third_delta)); | 
 | } | 
 |  | 
 | }  // namespace | 
 | }  // namespace test | 
 | }  // namespace net |