OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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_connection_helper.h" | |
6 | |
7 #include "net/quic/test_tools/mock_clock.h" | |
8 #include "net/quic/test_tools/mock_random.h" | |
9 #include "net/quic/test_tools/test_task_runner.h" | |
10 #include "testing/gtest/include/gtest/gtest.h" | |
11 | |
12 namespace net { | |
13 namespace test { | |
14 namespace { | |
15 | |
16 class TestDelegate : public QuicAlarm::Delegate { | |
17 public: | |
18 TestDelegate() : fired_(false) {} | |
19 | |
20 QuicTime OnAlarm() override { | |
21 fired_ = true; | |
22 return QuicTime::Zero(); | |
23 } | |
24 | |
25 bool fired() const { return fired_; } | |
26 void Clear() { fired_ = false; } | |
27 | |
28 private: | |
29 bool fired_; | |
30 }; | |
31 | |
32 class QuicConnectionHelperTest : public ::testing::Test { | |
33 protected: | |
34 QuicConnectionHelperTest() | |
35 : runner_(new TestTaskRunner(&clock_)), | |
36 helper_(runner_.get(), &clock_, &random_generator_) {} | |
37 | |
38 scoped_refptr<TestTaskRunner> runner_; | |
39 QuicConnectionHelper helper_; | |
40 MockClock clock_; | |
41 MockRandom random_generator_; | |
42 }; | |
43 | |
44 TEST_F(QuicConnectionHelperTest, GetClock) { | |
45 EXPECT_EQ(&clock_, helper_.GetClock()); | |
46 } | |
47 | |
48 TEST_F(QuicConnectionHelperTest, GetRandomGenerator) { | |
49 EXPECT_EQ(&random_generator_, helper_.GetRandomGenerator()); | |
50 } | |
51 | |
52 TEST_F(QuicConnectionHelperTest, CreateAlarm) { | |
53 TestDelegate* delegate = new TestDelegate(); | |
54 scoped_ptr<QuicAlarm> alarm(helper_.CreateAlarm(delegate)); | |
55 | |
56 QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(1); | |
57 alarm->Set(clock_.Now().Add(delta)); | |
58 | |
59 // Verify that the alarm task has been posted. | |
60 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); | |
61 EXPECT_EQ(base::TimeDelta::FromMicroseconds(delta.ToMicroseconds()), | |
62 runner_->GetPostedTasks()[0].delay); | |
63 | |
64 runner_->RunNextTask(); | |
65 EXPECT_EQ(QuicTime::Zero().Add(delta), clock_.Now()); | |
66 EXPECT_TRUE(delegate->fired()); | |
67 } | |
68 | |
69 TEST_F(QuicConnectionHelperTest, CreateAlarmAndCancel) { | |
70 TestDelegate* delegate = new TestDelegate(); | |
71 scoped_ptr<QuicAlarm> alarm(helper_.CreateAlarm(delegate)); | |
72 | |
73 QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(1); | |
74 alarm->Set(clock_.Now().Add(delta)); | |
75 alarm->Cancel(); | |
76 | |
77 // The alarm task should still be posted. | |
78 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); | |
79 EXPECT_EQ(base::TimeDelta::FromMicroseconds(delta.ToMicroseconds()), | |
80 runner_->GetPostedTasks()[0].delay); | |
81 | |
82 runner_->RunNextTask(); | |
83 EXPECT_EQ(QuicTime::Zero().Add(delta), clock_.Now()); | |
84 EXPECT_FALSE(delegate->fired()); | |
85 } | |
86 | |
87 TEST_F(QuicConnectionHelperTest, CreateAlarmAndReset) { | |
88 TestDelegate* delegate = new TestDelegate(); | |
89 scoped_ptr<QuicAlarm> alarm(helper_.CreateAlarm(delegate)); | |
90 | |
91 QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(1); | |
92 alarm->Set(clock_.Now().Add(delta)); | |
93 alarm->Cancel(); | |
94 QuicTime::Delta new_delta = QuicTime::Delta::FromMicroseconds(3); | |
95 alarm->Set(clock_.Now().Add(new_delta)); | |
96 | |
97 // The alarm task should still be posted. | |
98 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); | |
99 EXPECT_EQ(base::TimeDelta::FromMicroseconds(delta.ToMicroseconds()), | |
100 runner_->GetPostedTasks()[0].delay); | |
101 | |
102 runner_->RunNextTask(); | |
103 EXPECT_EQ(QuicTime::Zero().Add(delta), clock_.Now()); | |
104 EXPECT_FALSE(delegate->fired()); | |
105 | |
106 // The alarm task should be posted again. | |
107 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); | |
108 | |
109 runner_->RunNextTask(); | |
110 EXPECT_EQ(QuicTime::Zero().Add(new_delta), clock_.Now()); | |
111 EXPECT_TRUE(delegate->fired()); | |
112 } | |
113 | |
114 TEST_F(QuicConnectionHelperTest, CreateAlarmAndResetEarlier) { | |
115 TestDelegate* delegate = new TestDelegate(); | |
116 scoped_ptr<QuicAlarm> alarm(helper_.CreateAlarm(delegate)); | |
117 | |
118 QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(3); | |
119 alarm->Set(clock_.Now().Add(delta)); | |
120 alarm->Cancel(); | |
121 QuicTime::Delta new_delta = QuicTime::Delta::FromMicroseconds(1); | |
122 alarm->Set(clock_.Now().Add(new_delta)); | |
123 | |
124 // Both alarm tasks will be posted. | |
125 ASSERT_EQ(2u, runner_->GetPostedTasks().size()); | |
126 | |
127 // The earlier task will execute and will fire the alarm-> | |
128 runner_->RunNextTask(); | |
129 EXPECT_EQ(QuicTime::Zero().Add(new_delta), clock_.Now()); | |
130 EXPECT_TRUE(delegate->fired()); | |
131 delegate->Clear(); | |
132 | |
133 // The latter task is still posted. | |
134 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); | |
135 | |
136 // When the latter task is executed, the weak ptr will be invalid and | |
137 // the alarm will not fire. | |
138 runner_->RunNextTask(); | |
139 EXPECT_EQ(QuicTime::Zero().Add(delta), clock_.Now()); | |
140 EXPECT_FALSE(delegate->fired()); | |
141 } | |
142 | |
143 TEST_F(QuicConnectionHelperTest, CreateAlarmAndUpdate) { | |
144 TestDelegate* delegate = new TestDelegate(); | |
145 scoped_ptr<QuicAlarm> alarm(helper_.CreateAlarm(delegate)); | |
146 | |
147 const QuicClock* clock = helper_.GetClock(); | |
148 QuicTime start = clock->Now(); | |
149 QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(1); | |
150 alarm->Set(clock->Now().Add(delta)); | |
151 QuicTime::Delta new_delta = QuicTime::Delta::FromMicroseconds(3); | |
152 alarm->Update(clock->Now().Add(new_delta), | |
153 QuicTime::Delta::FromMicroseconds(1)); | |
154 | |
155 // The alarm task should still be posted. | |
156 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); | |
157 EXPECT_EQ(base::TimeDelta::FromMicroseconds(delta.ToMicroseconds()), | |
158 runner_->GetPostedTasks()[0].delay); | |
159 | |
160 runner_->RunNextTask(); | |
161 EXPECT_EQ(QuicTime::Zero().Add(delta), clock->Now()); | |
162 EXPECT_FALSE(delegate->fired()); | |
163 | |
164 // Move the alarm forward 1us and ensure it doesn't move forward. | |
165 alarm->Update(clock->Now().Add(new_delta), | |
166 QuicTime::Delta::FromMicroseconds(2)); | |
167 | |
168 ASSERT_EQ(1u, runner_->GetPostedTasks().size()); | |
169 EXPECT_EQ(base::TimeDelta::FromMicroseconds( | |
170 new_delta.Subtract(delta).ToMicroseconds()), | |
171 runner_->GetPostedTasks()[0].delay); | |
172 runner_->RunNextTask(); | |
173 EXPECT_EQ(start.Add(new_delta), clock->Now()); | |
174 EXPECT_TRUE(delegate->fired()); | |
175 | |
176 // Set the alarm via an update call. | |
177 new_delta = QuicTime::Delta::FromMicroseconds(5); | |
178 alarm->Update(clock->Now().Add(new_delta), | |
179 QuicTime::Delta::FromMicroseconds(1)); | |
180 EXPECT_TRUE(alarm->IsSet()); | |
181 | |
182 // Update it with an uninitialized time and ensure it's cancelled. | |
183 alarm->Update(QuicTime::Zero(), QuicTime::Delta::FromMicroseconds(1)); | |
184 EXPECT_FALSE(alarm->IsSet()); | |
185 } | |
186 | |
187 } // namespace | |
188 } // namespace test | |
189 } // namespace net | |
OLD | NEW |