1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "net/quic/quic_alarm.h" 6 7 #include "base/logging.h" 8 #include "testing/gmock/include/gmock/gmock.h" 9 #include "testing/gtest/include/gtest/gtest.h" 10 11 using testing::Return; 12 using testing::Invoke; 13 14 namespace net { 15 namespace test { 16 namespace { 17 18 class MockDelegate : public QuicAlarm::Delegate { 19 public: 20 MOCK_METHOD0(OnAlarm, QuicTime()); 21 }; 22 23 class TestAlarm : public QuicAlarm { 24 public: 25 explicit TestAlarm(QuicAlarm::Delegate* delegate) : QuicAlarm(delegate) {} 26 27 bool scheduled() const { return scheduled_; } 28 29 void FireAlarm() { 30 scheduled_ = false; 31 Fire(); 32 } 33 34 protected: 35 virtual void SetImpl() OVERRIDE { 36 DCHECK(deadline().IsInitialized()); 37 scheduled_ = true; 38 } 39 40 virtual void CancelImpl() OVERRIDE { 41 DCHECK(!deadline().IsInitialized()); 42 scheduled_ = false; 43 } 44 45 private: 46 bool scheduled_; 47 }; 48 49 class QuicAlarmTest : public ::testing::Test { 50 public: 51 QuicAlarmTest() 52 : delegate_(new MockDelegate()), 53 alarm_(delegate_), 54 deadline_(QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(7))), 55 deadline2_(QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(14))), 56 new_deadline_(QuicTime::Zero()) { 57 } 58 59 void ResetAlarm() { 60 alarm_.Set(new_deadline_); 61 } 62 63 MockDelegate* delegate_; // not owned 64 TestAlarm alarm_; 65 QuicTime deadline_; 66 QuicTime deadline2_; 67 QuicTime new_deadline_; 68 }; 69 70 TEST_F(QuicAlarmTest, IsSet) { 71 EXPECT_FALSE(alarm_.IsSet()); 72 } 73 74 TEST_F(QuicAlarmTest, Set) { 75 QuicTime deadline = QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(7)); 76 alarm_.Set(deadline); 77 EXPECT_TRUE(alarm_.IsSet()); 78 EXPECT_TRUE(alarm_.scheduled()); 79 EXPECT_EQ(deadline, alarm_.deadline()); 80 } 81 82 TEST_F(QuicAlarmTest, Cancel) { 83 QuicTime deadline = QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(7)); 84 alarm_.Set(deadline); 85 alarm_.Cancel(); 86 EXPECT_FALSE(alarm_.IsSet()); 87 EXPECT_FALSE(alarm_.scheduled()); 88 EXPECT_EQ(QuicTime::Zero(), alarm_.deadline()); 89 } 90 91 TEST_F(QuicAlarmTest, Fire) { 92 QuicTime deadline = QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(7)); 93 alarm_.Set(deadline); 94 EXPECT_CALL(*delegate_, OnAlarm()).WillOnce(Return(QuicTime::Zero())); 95 alarm_.FireAlarm(); 96 EXPECT_FALSE(alarm_.IsSet()); 97 EXPECT_FALSE(alarm_.scheduled()); 98 EXPECT_EQ(QuicTime::Zero(), alarm_.deadline()); 99 } 100 101 TEST_F(QuicAlarmTest, FireAndResetViaReturn) { 102 alarm_.Set(deadline_); 103 EXPECT_CALL(*delegate_, OnAlarm()).WillOnce(Return(deadline2_)); 104 alarm_.FireAlarm(); 105 EXPECT_TRUE(alarm_.IsSet()); 106 EXPECT_TRUE(alarm_.scheduled()); 107 EXPECT_EQ(deadline2_, alarm_.deadline()); 108 } 109 110 TEST_F(QuicAlarmTest, FireAndResetViaSet) { 111 alarm_.Set(deadline_); 112 new_deadline_ = deadline2_; 113 EXPECT_CALL(*delegate_, OnAlarm()).WillOnce(DoAll( 114 Invoke(this, &QuicAlarmTest::ResetAlarm), 115 Return(QuicTime::Zero()))); 116 alarm_.FireAlarm(); 117 EXPECT_TRUE(alarm_.IsSet()); 118 EXPECT_TRUE(alarm_.scheduled()); 119 EXPECT_EQ(deadline2_, alarm_.deadline()); 120 } 121 122 } // namespace 123 } // namespace test 124 } // namespace net 125