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