Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Side by Side Diff: base/task_scheduler/delayed_task_manager_unittest.cc

Issue 1806473002: TaskScheduler [9] Delayed Task Manager (Closed) Base URL: https://luckyluke-private.googlesource.com/src@s_5_worker_thread
Patch Set: CR gab #17 Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 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 "base/task_scheduler/delayed_task_manager.h"
6
7 #include <memory>
8 #include <utility>
9
10 #include "base/bind.h"
11 #include "base/bind_helpers.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/task_scheduler/priority_queue.h"
14 #include "base/task_scheduler/scheduler_lock.h"
15 #include "base/task_scheduler/sequence.h"
16 #include "base/task_scheduler/task.h"
17 #include "base/time/time.h"
18 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 namespace base {
22 namespace internal {
23 namespace {
24
25 class TestDelayedTaskManager : public DelayedTaskManager {
26 public:
27 TestDelayedTaskManager()
28 : DelayedTaskManager(
29 Bind(&TestDelayedTaskManager::OnDelayedRunTimeUpdated,
30 Unretained(this))) {}
31
32 void SetCurrentTime(TimeTicks now) { now_ = now; }
33
34 // DelayedTaskManager:
35 TimeTicks Now() const override { return now_; }
36
37 MOCK_METHOD0(OnDelayedRunTimeUpdated, void());
38
39 private:
40 TimeTicks now_ = TimeTicks::Now();
41
42 DISALLOW_COPY_AND_ASSIGN(TestDelayedTaskManager);
43 };
44
45 // Verify that GetDelayedRunTime() returns a null TimeTicks when there are
46 // no pending delayed tasks.
47 TEST(TaskSchedulerDelayedTaskManagerTest,
48 GetDelayedRunTimeNoPendingDelayedTasks) {
49 TestDelayedTaskManager manager;
50 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
51 }
52
53 // Verify that a delayed task isn't posted before it is ripe for execution.
54 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) {
55 testing::StrictMock<TestDelayedTaskManager> manager;
56
57 std::unique_ptr<Task> task(
58 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits()));
59 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
60 const Task* task_raw = task.get();
61 scoped_refptr<Sequence> sequence(new Sequence);
62 PriorityQueue priority_queue(Bind(&DoNothing));
63
64 // Add |task| to the DelayedTaskManager.
65 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
66 manager.AddDelayedTask(std::move(task), sequence, &priority_queue);
67 testing::Mock::VerifyAndClear(&manager);
68 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
69
70 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
71 manager.PostReadyTasks();
72
73 // The delayed run time shouldn't have changed.
74 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
75
76 // |sequence| and |priority_queue| should be empty.
77 EXPECT_EQ(nullptr, sequence->PeekTask());
78 EXPECT_TRUE(priority_queue.BeginTransaction()->Peek().is_null());
79 }
80
81 // Verify that a delayed task is posted when PostReadyTasks() is called with the
82 // current time equal to the task's delayed run time.
83 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) {
84 testing::StrictMock<TestDelayedTaskManager> manager;
85
86 std::unique_ptr<Task> task(
87 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits()));
88 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
89 const Task* task_raw = task.get();
90 scoped_refptr<Sequence> sequence(new Sequence);
91 PriorityQueue priority_queue(Bind(&DoNothing));
92
93 // Add |task| to the DelayedTaskManager.
94 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
95 manager.AddDelayedTask(std::move(task), sequence, &priority_queue);
96 testing::Mock::VerifyAndClear(&manager);
97 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
98
99 // Fast-forward time to |task_raw|'s delayed run time.
100 manager.SetCurrentTime(task_raw->delayed_run_time);
101
102 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
103 manager.PostReadyTasks();
104 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
105
106 // Expect to find |task_raw| in |sequence| and |sequence| in |priority_queue|.
107 EXPECT_EQ(task_raw, sequence->PeekTask());
108 EXPECT_EQ(sequence, priority_queue.BeginTransaction()->Peek().sequence);
109 }
110
111 // Verify that a delayed task is posted when PostReadyTasks() is called with the
112 // current time greater than the task's delayed run time.
113 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) {
114 testing::StrictMock<TestDelayedTaskManager> manager;
115
116 std::unique_ptr<Task> task(
117 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits()));
118 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
119 const Task* task_raw = task.get();
120 scoped_refptr<Sequence> sequence(new Sequence);
121 PriorityQueue priority_queue(Bind(&DoNothing));
122
123 // Add |task| to the DelayedTaskManager.
124 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
125 manager.AddDelayedTask(std::move(task), sequence, &priority_queue);
126 testing::Mock::VerifyAndClear(&manager);
127 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
128
129 // Fast-forward time after |task_raw|'s delayed run time.
130 manager.SetCurrentTime(task_raw->delayed_run_time +
131 TimeDelta::FromSeconds(10));
132
133 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
134 manager.PostReadyTasks();
135 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
136
137 // Expect to find |task_raw| in |sequence| and |sequence| in |priority_queue|.
138 EXPECT_EQ(task_raw, sequence->PeekTask());
139 EXPECT_EQ(sequence, priority_queue.BeginTransaction()->Peek().sequence);
140 }
141
142 // Verify that when multiple tasks are added to a DelayedTaskManager, they are
143 // posted when they become ripe for execution.
144 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) {
145 testing::StrictMock<TestDelayedTaskManager> manager;
146
147 scoped_refptr<Sequence> sequence(new Sequence);
148 PriorityQueue priority_queue(Bind(&DoNothing));
149
150 std::unique_ptr<Task> task_a(
151 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits()));
152 task_a->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(2);
153 const Task* task_a_raw = task_a.get();
154
155 std::unique_ptr<Task> task_b(
156 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits()));
157 task_b->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(2);
158 const Task* task_b_raw = task_b.get();
159
160 std::unique_ptr<Task> task_c(
161 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits()));
162 task_c->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
163 const Task* task_c_raw = task_c.get();
164
165 // Add |task_a| to the DelayedTaskManager. The delayed run time should be
166 // updated to |task_a|'s delayed run time.
167 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
168 manager.AddDelayedTask(std::move(task_a), sequence, &priority_queue);
169 testing::Mock::VerifyAndClear(&manager);
170 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
171
172 // Add |task_b| to the DelayedTaskManager. The delayed run time shouldn't
173 // change.
174 manager.AddDelayedTask(std::move(task_b), sequence, &priority_queue);
175 testing::Mock::VerifyAndClear(&manager);
176 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
177
178 // Add |task_c| to the DelayedTaskManager. The delayed run time should be
179 // updated to |task_c|'s delayed run time.
180 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
181 manager.AddDelayedTask(std::move(task_c), sequence, &priority_queue);
182 testing::Mock::VerifyAndClear(&manager);
183 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetDelayedRunTime());
184
185 // Fast-forward time to |task_c_raw|'s delayed run time.
186 manager.SetCurrentTime(task_c_raw->delayed_run_time);
187
188 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
189 // |sequence| should be added to |priority_queue|, |task_c_raw| should be
190 // added to |sequence| and the delayed run time should become
191 // |task_a_raw|'s delayed run time.
192 manager.PostReadyTasks();
193 EXPECT_EQ(sequence, priority_queue.BeginTransaction()->Peek().sequence);
194 priority_queue.BeginTransaction()->Pop();
195 EXPECT_TRUE(priority_queue.BeginTransaction()->Peek().is_null());
196 EXPECT_EQ(task_c_raw, sequence->PeekTask());
197 sequence->PopTask();
198 EXPECT_FALSE(sequence->PeekTask());
199 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
200
201 // Fast-forward time to |task_a_raw|'s delayed run time.
202 manager.SetCurrentTime(task_a_raw->delayed_run_time);
203
204 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
205 // |sequence| should be added to |priority_queue|, |task_a_raw| and
206 // |task_b_raw| should be added to |sequence| and the delayed run time
207 // should become a null TimeTicks.
208 manager.PostReadyTasks();
209 EXPECT_EQ(sequence, priority_queue.BeginTransaction()->Peek().sequence);
210 priority_queue.BeginTransaction()->Pop();
211 EXPECT_TRUE(priority_queue.BeginTransaction()->Peek().is_null());
212 EXPECT_EQ(task_a_raw, sequence->PeekTask());
213 sequence->PopTask();
214 EXPECT_EQ(task_b_raw, sequence->PeekTask());
215 sequence->PopTask();
216 EXPECT_FALSE(sequence->PeekTask());
217 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
218 }
219
220 } // namespace
221 } // namespace internal
222 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698