1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file. 4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "net/quic/quic_alarm.h" 6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/logging.h" 8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "testing/gmock/include/gmock/gmock.h" 9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "testing/gtest/include/gtest/gtest.h" 10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochusing testing::Return; 12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochusing testing::Invoke; 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace net { 15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace test { 16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace { 17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass MockDelegate : public QuicAlarm::Delegate { 19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public: 20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch MOCK_METHOD0(OnAlarm, QuicTime()); 21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}; 22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass TestAlarm : public QuicAlarm { 24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public: 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) explicit TestAlarm(QuicAlarm::Delegate* delegate) : QuicAlarm(delegate) {} 26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool scheduled() const { return scheduled_; } 28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void FireAlarm() { 30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scheduled_ = false; 31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Fire(); 32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch protected: 35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void SetImpl() OVERRIDE { 36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(deadline().IsInitialized()); 37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scheduled_ = true; 38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch virtual void CancelImpl() OVERRIDE { 41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch DCHECK(!deadline().IsInitialized()); 42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch scheduled_ = false; 43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch private: 46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch bool scheduled_; 47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}; 48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass QuicAlarmTest : public ::testing::Test { 50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public: 51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch QuicAlarmTest() 52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch : delegate_(new MockDelegate()), 53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch alarm_(delegate_), 54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch deadline_(QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(7))), 55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch deadline2_(QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(14))), 56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_deadline_(QuicTime::Zero()) { 57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void ResetAlarm() { 60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch alarm_.Set(new_deadline_); 61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch } 62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch MockDelegate* delegate_; // not owned 64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch TestAlarm alarm_; 65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch QuicTime deadline_; 66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch QuicTime deadline2_; 67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch QuicTime new_deadline_; 68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}; 69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(QuicAlarmTest, IsSet) { 71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(alarm_.IsSet()); 72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(QuicAlarmTest, Set) { 75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch QuicTime deadline = QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(7)); 76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch alarm_.Set(deadline); 77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(alarm_.IsSet()); 78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(alarm_.scheduled()); 79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(deadline, alarm_.deadline()); 80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(QuicAlarmTest, Cancel) { 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch QuicTime deadline = QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(7)); 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch alarm_.Set(deadline); 85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch alarm_.Cancel(); 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(alarm_.IsSet()); 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(alarm_.scheduled()); 88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(QuicTime::Zero(), alarm_.deadline()); 89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(QuicAlarmTest, Update) { 9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicTime deadline = QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(7)); 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) alarm_.Set(deadline); 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicTime new_deadline = QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(8)); 9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) alarm_.Update(new_deadline, QuicTime::Delta::Zero()); 9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(alarm_.IsSet()); 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_TRUE(alarm_.scheduled()); 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(new_deadline, alarm_.deadline()); 9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(QuicAlarmTest, UpdateWithZero) { 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) QuicTime deadline = QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(7)); 10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) alarm_.Set(deadline); 10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) alarm_.Update(QuicTime::Zero(), QuicTime::Delta::Zero()); 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(alarm_.IsSet()); 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_FALSE(alarm_.scheduled()); 10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ(QuicTime::Zero(), alarm_.deadline()); 10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 110ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(QuicAlarmTest, Fire) { 111ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch QuicTime deadline = QuicTime::Zero().Add(QuicTime::Delta::FromSeconds(7)); 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch alarm_.Set(deadline); 113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_CALL(*delegate_, OnAlarm()).WillOnce(Return(QuicTime::Zero())); 114ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch alarm_.FireAlarm(); 115ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(alarm_.IsSet()); 116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_FALSE(alarm_.scheduled()); 117ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(QuicTime::Zero(), alarm_.deadline()); 118ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 119ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(QuicAlarmTest, FireAndResetViaReturn) { 121ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch alarm_.Set(deadline_); 122ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_CALL(*delegate_, OnAlarm()).WillOnce(Return(deadline2_)); 123ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch alarm_.FireAlarm(); 124ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(alarm_.IsSet()); 125ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(alarm_.scheduled()); 126ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(deadline2_, alarm_.deadline()); 127ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 128ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 129ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(QuicAlarmTest, FireAndResetViaSet) { 130ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch alarm_.Set(deadline_); 131ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch new_deadline_ = deadline2_; 132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_CALL(*delegate_, OnAlarm()).WillOnce(DoAll( 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Invoke(this, &QuicAlarmTest::ResetAlarm), 134ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch Return(QuicTime::Zero()))); 135ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch alarm_.FireAlarm(); 136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(alarm_.IsSet()); 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_TRUE(alarm_.scheduled()); 138ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_EQ(deadline2_, alarm_.deadline()); 139ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 141ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace 142ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace test 143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} // namespace net 144