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

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

Issue 1906083002: TaskScheduler: Remove base/task_scheduler/utils.h/.cc (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@sched_2_stack
Patch Set: typos 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/task_scheduler/delayed_task_manager.h" 5 #include "base/task_scheduler/delayed_task_manager.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
12 #include "base/logging.h"
12 #include "base/memory/ref_counted.h" 13 #include "base/memory/ref_counted.h"
13 #include "base/task_scheduler/scheduler_lock.h" 14 #include "base/task_scheduler/scheduler_lock.h"
14 #include "base/task_scheduler/scheduler_task_executor.h" 15 #include "base/task_scheduler/scheduler_thread_pool.h"
15 #include "base/task_scheduler/sequence.h" 16 #include "base/task_scheduler/sequence.h"
16 #include "base/task_scheduler/task.h" 17 #include "base/task_scheduler/task.h"
17 #include "base/time/time.h" 18 #include "base/time/time.h"
18 #include "testing/gmock/include/gmock/gmock.h" 19 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
20 21
21 namespace base { 22 namespace base {
22 namespace internal { 23 namespace internal {
23 namespace { 24 namespace {
24 25
(...skipping 10 matching lines...) Expand all
35 TimeTicks Now() const override { return now_; } 36 TimeTicks Now() const override { return now_; }
36 37
37 MOCK_METHOD0(OnDelayedRunTimeUpdated, void()); 38 MOCK_METHOD0(OnDelayedRunTimeUpdated, void());
38 39
39 private: 40 private:
40 TimeTicks now_ = TimeTicks::Now(); 41 TimeTicks now_ = TimeTicks::Now();
41 42
42 DISALLOW_COPY_AND_ASSIGN(TestDelayedTaskManager); 43 DISALLOW_COPY_AND_ASSIGN(TestDelayedTaskManager);
43 }; 44 };
44 45
45 class MockSchedulerTaskExecutor : public SchedulerTaskExecutor { 46 class MockSchedulerThreadPool : public SchedulerThreadPool {
46 public: 47 public:
47 void PostTaskWithSequence(std::unique_ptr<Task> task, 48 // SchedulerThreadPool:
48 scoped_refptr<Sequence> sequence) override { 49 scoped_refptr<TaskRunner> CreateTaskRunnerWithTraits(
49 PostTaskWithSequenceMock(task.get(), sequence.get()); 50 const TaskTraits& traits,
51 ExecutionMode execution_mode) override {
52 NOTREACHED();
53 return nullptr;
50 } 54 }
51 55
52 MOCK_METHOD2(PostTaskWithSequenceMock, void(const Task*, const Sequence*)); 56 void ReEnqueueSequence(scoped_refptr<Sequence> sequence,
57 const SequenceSortKey& sequence_sort_key) override {
58 NOTREACHED();
59 }
60
61 bool PostTaskWithSequence(std::unique_ptr<Task> task,
62 scoped_refptr<Sequence> sequence) override {
63 NOTREACHED();
64 return true;
65 }
66
67 void PostTaskWithSequenceNow(std::unique_ptr<Task> task,
68 scoped_refptr<Sequence> sequence) override {
69 PostTaskWithSequenceNowMock(task.get(), sequence.get());
70 }
71
72 MOCK_METHOD2(PostTaskWithSequenceNowMock, void(const Task*, const Sequence*));
53 }; 73 };
54 74
75 } // namespace
76
55 // Verify that GetDelayedRunTime() returns a null TimeTicks when there are 77 // Verify that GetDelayedRunTime() returns a null TimeTicks when there are
56 // no pending delayed tasks. 78 // no pending delayed tasks.
57 TEST(TaskSchedulerDelayedTaskManagerTest, 79 TEST(TaskSchedulerDelayedTaskManagerTest,
58 GetDelayedRunTimeNoPendingDelayedTasks) { 80 GetDelayedRunTimeNoPendingDelayedTasks) {
59 TestDelayedTaskManager manager; 81 TestDelayedTaskManager manager;
60 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 82 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
61 } 83 }
62 84
63 // Verify that a delayed task isn't posted before it is ripe for execution. 85 // Verify that a delayed task isn't posted before it is ripe for execution.
64 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) { 86 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) {
65 testing::StrictMock<TestDelayedTaskManager> manager; 87 testing::StrictMock<TestDelayedTaskManager> manager;
66 88
67 std::unique_ptr<Task> task( 89 std::unique_ptr<Task> task(
68 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 90 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
69 manager.Now() + TimeDelta::FromSeconds(1))); 91 manager.Now() + TimeDelta::FromSeconds(1)));
70 const Task* task_raw = task.get(); 92 const Task* task_raw = task.get();
71 scoped_refptr<Sequence> sequence(new Sequence); 93 scoped_refptr<Sequence> sequence(new Sequence);
72 testing::StrictMock<MockSchedulerTaskExecutor> executor; 94 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
73 95
74 // Add |task| to the DelayedTaskManager. 96 // Add |task| to the DelayedTaskManager.
75 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 97 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
76 manager.AddDelayedTask(std::move(task), sequence, &executor); 98 manager.AddDelayedTask(std::move(task), sequence, &thread_pool);
77 testing::Mock::VerifyAndClear(&manager); 99 testing::Mock::VerifyAndClear(&manager);
78 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 100 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
79 101
80 // Ask the DelayedTaskManager to post tasks that are ripe for execution. Don't 102 // Ask the DelayedTaskManager to post tasks that are ripe for execution. Don't
81 // expect any call to the mock method of |executor|. 103 // expect any call to the mock method of |thread_pool|.
82 manager.PostReadyTasks(); 104 manager.PostReadyTasks();
83 105
84 // The delayed run time shouldn't have changed. 106 // The delayed run time shouldn't have changed.
85 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 107 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
86 } 108 }
87 109
88 // Verify that a delayed task is posted when PostReadyTasks() is called with the 110 // Verify that a delayed task is posted when PostReadyTasks() is called with the
89 // current time equal to the task's delayed run time. 111 // current time equal to the task's delayed run time.
90 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) { 112 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) {
91 testing::StrictMock<TestDelayedTaskManager> manager; 113 testing::StrictMock<TestDelayedTaskManager> manager;
92 114
93 std::unique_ptr<Task> task( 115 std::unique_ptr<Task> task(
94 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 116 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
95 manager.Now() + TimeDelta::FromSeconds(1))); 117 manager.Now() + TimeDelta::FromSeconds(1)));
96 const Task* task_raw = task.get(); 118 const Task* task_raw = task.get();
97 scoped_refptr<Sequence> sequence(new Sequence); 119 scoped_refptr<Sequence> sequence(new Sequence);
98 testing::StrictMock<MockSchedulerTaskExecutor> executor; 120 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
99 121
100 // Add |task| to the DelayedTaskManager. 122 // Add |task| to the DelayedTaskManager.
101 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 123 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
102 manager.AddDelayedTask(std::move(task), sequence, &executor); 124 manager.AddDelayedTask(std::move(task), sequence, &thread_pool);
103 testing::Mock::VerifyAndClear(&manager); 125 testing::Mock::VerifyAndClear(&manager);
104 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 126 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
105 127
106 // Fast-forward time to |task_raw|'s delayed run time. 128 // Fast-forward time to |task_raw|'s delayed run time.
107 manager.SetCurrentTime(task_raw->delayed_run_time); 129 manager.SetCurrentTime(task_raw->delayed_run_time);
108 130
109 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 131 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
110 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_raw, sequence.get())); 132 EXPECT_CALL(thread_pool,
133 PostTaskWithSequenceNowMock(task_raw, sequence.get()));
111 manager.PostReadyTasks(); 134 manager.PostReadyTasks();
112 testing::Mock::VerifyAndClear(&manager); 135 testing::Mock::VerifyAndClear(&manager);
113 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 136 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
114 } 137 }
115 138
116 // Verify that a delayed task is posted when PostReadyTasks() is called with the 139 // Verify that a delayed task is posted when PostReadyTasks() is called with the
117 // current time greater than the task's delayed run time. 140 // current time greater than the task's delayed run time.
118 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) { 141 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) {
119 testing::StrictMock<TestDelayedTaskManager> manager; 142 testing::StrictMock<TestDelayedTaskManager> manager;
120 143
121 std::unique_ptr<Task> task( 144 std::unique_ptr<Task> task(
122 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 145 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
123 manager.Now() + TimeDelta::FromSeconds(1))); 146 manager.Now() + TimeDelta::FromSeconds(1)));
124 const Task* task_raw = task.get(); 147 const Task* task_raw = task.get();
125 scoped_refptr<Sequence> sequence(new Sequence); 148 scoped_refptr<Sequence> sequence(new Sequence);
126 testing::StrictMock<MockSchedulerTaskExecutor> executor; 149 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
127 150
128 // Add |task| to the DelayedTaskManager. 151 // Add |task| to the DelayedTaskManager.
129 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 152 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
130 manager.AddDelayedTask(std::move(task), sequence, &executor); 153 manager.AddDelayedTask(std::move(task), sequence, &thread_pool);
131 testing::Mock::VerifyAndClear(&manager); 154 testing::Mock::VerifyAndClear(&manager);
132 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 155 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
133 156
134 // Fast-forward time to |task_raw|'s delayed run time. 157 // Fast-forward time to |task_raw|'s delayed run time.
135 manager.SetCurrentTime(task_raw->delayed_run_time + 158 manager.SetCurrentTime(task_raw->delayed_run_time +
136 TimeDelta::FromSeconds(10)); 159 TimeDelta::FromSeconds(10));
137 160
138 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 161 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
139 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_raw, sequence.get())); 162 EXPECT_CALL(thread_pool,
163 PostTaskWithSequenceNowMock(task_raw, sequence.get()));
140 manager.PostReadyTasks(); 164 manager.PostReadyTasks();
141 testing::Mock::VerifyAndClear(&manager); 165 testing::Mock::VerifyAndClear(&manager);
142 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 166 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
143 } 167 }
144 168
145 // Verify that when multiple tasks are added to a DelayedTaskManager, they are 169 // Verify that when multiple tasks are added to a DelayedTaskManager, they are
146 // posted when they become ripe for execution. 170 // posted when they become ripe for execution.
147 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) { 171 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) {
148 testing::StrictMock<TestDelayedTaskManager> manager; 172 testing::StrictMock<TestDelayedTaskManager> manager;
149 173
150 scoped_refptr<Sequence> sequence(new Sequence); 174 scoped_refptr<Sequence> sequence(new Sequence);
151 testing::StrictMock<MockSchedulerTaskExecutor> executor; 175 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
152 176
153 std::unique_ptr<Task> task_a( 177 std::unique_ptr<Task> task_a(
154 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 178 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
155 manager.Now() + TimeDelta::FromSeconds(2))); 179 manager.Now() + TimeDelta::FromSeconds(2)));
156 const Task* task_a_raw = task_a.get(); 180 const Task* task_a_raw = task_a.get();
157 181
158 std::unique_ptr<Task> task_b( 182 std::unique_ptr<Task> task_b(
159 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 183 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
160 manager.Now() + TimeDelta::FromSeconds(2))); 184 manager.Now() + TimeDelta::FromSeconds(2)));
161 const Task* task_b_raw = task_b.get(); 185 const Task* task_b_raw = task_b.get();
162 186
163 std::unique_ptr<Task> task_c( 187 std::unique_ptr<Task> task_c(
164 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 188 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
165 manager.Now() + TimeDelta::FromSeconds(1))); 189 manager.Now() + TimeDelta::FromSeconds(1)));
166 const Task* task_c_raw = task_c.get(); 190 const Task* task_c_raw = task_c.get();
167 191
168 // Add |task_a| to the DelayedTaskManager. The delayed run time should be 192 // Add |task_a| to the DelayedTaskManager. The delayed run time should be
169 // updated to |task_a|'s delayed run time. 193 // updated to |task_a|'s delayed run time.
170 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 194 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
171 manager.AddDelayedTask(std::move(task_a), sequence, &executor); 195 manager.AddDelayedTask(std::move(task_a), sequence, &thread_pool);
172 testing::Mock::VerifyAndClear(&manager); 196 testing::Mock::VerifyAndClear(&manager);
173 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 197 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
174 198
175 // Add |task_b| to the DelayedTaskManager. The delayed run time shouldn't 199 // Add |task_b| to the DelayedTaskManager. The delayed run time shouldn't
176 // change. 200 // change.
177 manager.AddDelayedTask(std::move(task_b), sequence, &executor); 201 manager.AddDelayedTask(std::move(task_b), sequence, &thread_pool);
178 testing::Mock::VerifyAndClear(&manager); 202 testing::Mock::VerifyAndClear(&manager);
179 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 203 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
180 204
181 // Add |task_c| to the DelayedTaskManager. The delayed run time should be 205 // Add |task_c| to the DelayedTaskManager. The delayed run time should be
182 // updated to |task_c|'s delayed run time. 206 // updated to |task_c|'s delayed run time.
183 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 207 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
184 manager.AddDelayedTask(std::move(task_c), sequence, &executor); 208 manager.AddDelayedTask(std::move(task_c), sequence, &thread_pool);
185 testing::Mock::VerifyAndClear(&manager); 209 testing::Mock::VerifyAndClear(&manager);
186 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetDelayedRunTime()); 210 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetDelayedRunTime());
187 211
188 // Fast-forward time to |task_c_raw|'s delayed run time. 212 // Fast-forward time to |task_c_raw|'s delayed run time.
189 manager.SetCurrentTime(task_c_raw->delayed_run_time); 213 manager.SetCurrentTime(task_c_raw->delayed_run_time);
190 214
191 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 215 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
192 // |task_c_raw| should be posted and the delayed run time should become 216 // |task_c_raw| should be posted and the delayed run time should become
193 // |task_a_raw|'s delayed run time. 217 // |task_a_raw|'s delayed run time.
194 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_c_raw, sequence.get())); 218 EXPECT_CALL(thread_pool,
219 PostTaskWithSequenceNowMock(task_c_raw, sequence.get()));
195 manager.PostReadyTasks(); 220 manager.PostReadyTasks();
196 testing::Mock::VerifyAndClear(&executor); 221 testing::Mock::VerifyAndClear(&thread_pool);
197 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 222 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
198 223
199 // Fast-forward time to |task_a_raw|'s delayed run time. 224 // Fast-forward time to |task_a_raw|'s delayed run time.
200 manager.SetCurrentTime(task_a_raw->delayed_run_time); 225 manager.SetCurrentTime(task_a_raw->delayed_run_time);
201 226
202 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 227 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
203 // |task_a_raw| and |task_b_raw| should be posted and the delayed run time 228 // |task_a_raw| and |task_b_raw| should be posted and the delayed run time
204 // should become a null TimeTicks. 229 // should become a null TimeTicks.
205 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_a_raw, sequence.get())); 230 EXPECT_CALL(thread_pool,
206 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_b_raw, sequence.get())); 231 PostTaskWithSequenceNowMock(task_a_raw, sequence.get()));
232 EXPECT_CALL(thread_pool,
233 PostTaskWithSequenceNowMock(task_b_raw, sequence.get()));
207 manager.PostReadyTasks(); 234 manager.PostReadyTasks();
208 testing::Mock::VerifyAndClear(&executor); 235 testing::Mock::VerifyAndClear(&thread_pool);
209 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 236 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
210 } 237 }
211 238
212 } // namespace
213 } // namespace internal 239 } // namespace internal
214 } // namespace base 240 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698