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

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

Issue 1876363004: TaskScheduler [11] Support ExecutionMode::SINGLE_THREADED. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@8_delayed
Patch Set: all post tasks go through SchedulerThreadPool 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"
(...skipping 27 matching lines...) Expand all
38 38
39 private: 39 private:
40 TimeTicks now_ = TimeTicks::Now(); 40 TimeTicks now_ = TimeTicks::Now();
41 41
42 DISALLOW_COPY_AND_ASSIGN(TestDelayedTaskManager); 42 DISALLOW_COPY_AND_ASSIGN(TestDelayedTaskManager);
43 }; 43 };
44 44
45 class MockSchedulerThreadPool : public SchedulerThreadPoolInterface { 45 class MockSchedulerThreadPool : public SchedulerThreadPoolInterface {
46 public: 46 public:
47 void PostTaskWithSequenceNow(std::unique_ptr<Task> task, 47 void PostTaskWithSequenceNow(std::unique_ptr<Task> task,
48 scoped_refptr<Sequence> sequence) override { 48 scoped_refptr<Sequence> sequence,
49 PostTaskWithSequenceNowMock(task.get(), sequence.get()); 49 SchedulerWorkerThread* worker_thread) override {
50 PostTaskWithSequenceNowMock(task.get(), sequence.get(), worker_thread);
50 } 51 }
51 52
52 MOCK_METHOD2(PostTaskWithSequenceNowMock, void(const Task*, const Sequence*)); 53 MOCK_METHOD3(PostTaskWithSequenceNowMock,
54 void(const Task*,
55 const Sequence*,
56 const SchedulerWorkerThread* worker_thread));
53 }; 57 };
54 58
55 // Verify that GetDelayedRunTime() returns a null TimeTicks when there are 59 // Verify that GetDelayedRunTime() returns a null TimeTicks when there are
56 // no pending delayed tasks. 60 // no pending delayed tasks.
57 TEST(TaskSchedulerDelayedTaskManagerTest, 61 TEST(TaskSchedulerDelayedTaskManagerTest,
58 GetDelayedRunTimeNoPendingDelayedTasks) { 62 GetDelayedRunTimeNoPendingDelayedTasks) {
59 TestDelayedTaskManager manager; 63 TestDelayedTaskManager manager;
60 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 64 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
61 } 65 }
62 66
63 // Verify that a delayed task isn't posted before it is ripe for execution. 67 // Verify that a delayed task isn't posted before it is ripe for execution.
64 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) { 68 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) {
65 testing::StrictMock<TestDelayedTaskManager> manager; 69 testing::StrictMock<TestDelayedTaskManager> manager;
66 70
67 std::unique_ptr<Task> task( 71 std::unique_ptr<Task> task(
68 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); 72 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta()));
69 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); 73 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
70 const Task* task_raw = task.get(); 74 const Task* task_raw = task.get();
71 scoped_refptr<Sequence> sequence(new Sequence); 75 scoped_refptr<Sequence> sequence(new Sequence);
72 testing::StrictMock<MockSchedulerThreadPool> thread_pool; 76 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
73 77
74 // Add |task| to the DelayedTaskManager. 78 // Add |task| to the DelayedTaskManager.
75 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 79 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
76 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); 80 manager.AddDelayedTask(std::move(task), sequence, nullptr, &thread_pool);
77 testing::Mock::VerifyAndClear(&manager); 81 testing::Mock::VerifyAndClear(&manager);
78 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 82 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
79 83
80 // Ask the DelayedTaskManager to post tasks that are ripe for execution. Don't 84 // Ask the DelayedTaskManager to post tasks that are ripe for execution. Don't
81 // expect any call to the mock method of |thread_pool|. 85 // expect any call to the mock method of |thread_pool|.
82 manager.PostReadyTasks(); 86 manager.PostReadyTasks();
83 87
84 // The delayed run time shouldn't have changed. 88 // The delayed run time shouldn't have changed.
85 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 89 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
86 } 90 }
87 91
88 // Verify that a delayed task is posted when PostReadyTasks() is called with the 92 // Verify that a delayed task is posted when PostReadyTasks() is called with the
89 // current time equal to the task's delayed run time. 93 // current time equal to the task's delayed run time.
90 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) { 94 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) {
91 testing::StrictMock<TestDelayedTaskManager> manager; 95 testing::StrictMock<TestDelayedTaskManager> manager;
92 96
93 std::unique_ptr<Task> task( 97 std::unique_ptr<Task> task(
94 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); 98 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta()));
95 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); 99 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
96 const Task* task_raw = task.get(); 100 const Task* task_raw = task.get();
97 scoped_refptr<Sequence> sequence(new Sequence); 101 scoped_refptr<Sequence> sequence(new Sequence);
98 testing::StrictMock<MockSchedulerThreadPool> thread_pool; 102 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
99 103
100 // Add |task| to the DelayedTaskManager. 104 // Add |task| to the DelayedTaskManager.
101 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 105 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
102 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); 106 manager.AddDelayedTask(std::move(task), sequence, nullptr, &thread_pool);
103 testing::Mock::VerifyAndClear(&manager); 107 testing::Mock::VerifyAndClear(&manager);
104 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 108 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
105 109
106 // Fast-forward time to |task_raw|'s delayed run time. 110 // Fast-forward time to |task_raw|'s delayed run time.
107 manager.SetCurrentTime(task_raw->delayed_run_time); 111 manager.SetCurrentTime(task_raw->delayed_run_time);
108 112
109 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 113 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
110 EXPECT_CALL(thread_pool, 114 EXPECT_CALL(thread_pool,
111 PostTaskWithSequenceNowMock(task_raw, sequence.get())); 115 PostTaskWithSequenceNowMock(task_raw, sequence.get(), nullptr));
112 manager.PostReadyTasks(); 116 manager.PostReadyTasks();
113 testing::Mock::VerifyAndClear(&manager); 117 testing::Mock::VerifyAndClear(&manager);
114 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 118 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
115 } 119 }
116 120
117 // Verify that a delayed task is posted when PostReadyTasks() is called with the 121 // Verify that a delayed task is posted when PostReadyTasks() is called with the
118 // current time greater than the task's delayed run time. 122 // current time greater than the task's delayed run time.
119 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) { 123 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) {
120 testing::StrictMock<TestDelayedTaskManager> manager; 124 testing::StrictMock<TestDelayedTaskManager> manager;
121 125
122 std::unique_ptr<Task> task( 126 std::unique_ptr<Task> task(
123 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); 127 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta()));
124 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); 128 task->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
125 const Task* task_raw = task.get(); 129 const Task* task_raw = task.get();
126 scoped_refptr<Sequence> sequence(new Sequence); 130 scoped_refptr<Sequence> sequence(new Sequence);
127 testing::StrictMock<MockSchedulerThreadPool> thread_pool; 131 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
128 132
129 // Add |task| to the DelayedTaskManager. 133 // Add |task| to the DelayedTaskManager.
130 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 134 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
131 manager.AddDelayedTask(std::move(task), sequence, &thread_pool); 135 manager.AddDelayedTask(std::move(task), sequence, nullptr, &thread_pool);
132 testing::Mock::VerifyAndClear(&manager); 136 testing::Mock::VerifyAndClear(&manager);
133 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 137 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
134 138
135 // Fast-forward time to |task_raw|'s delayed run time. 139 // Fast-forward time to |task_raw|'s delayed run time.
136 manager.SetCurrentTime(task_raw->delayed_run_time + 140 manager.SetCurrentTime(task_raw->delayed_run_time +
137 TimeDelta::FromSeconds(10)); 141 TimeDelta::FromSeconds(10));
138 142
139 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 143 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
140 EXPECT_CALL(thread_pool, 144 EXPECT_CALL(thread_pool,
141 PostTaskWithSequenceNowMock(task_raw, sequence.get())); 145 PostTaskWithSequenceNowMock(task_raw, sequence.get(), nullptr));
142 manager.PostReadyTasks(); 146 manager.PostReadyTasks();
143 testing::Mock::VerifyAndClear(&manager); 147 testing::Mock::VerifyAndClear(&manager);
144 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 148 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
145 } 149 }
146 150
147 // Verify that when multiple tasks are added to a DelayedTaskManager, they are 151 // Verify that when multiple tasks are added to a DelayedTaskManager, they are
148 // posted when they become ripe for execution. 152 // posted when they become ripe for execution.
149 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) { 153 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) {
150 testing::StrictMock<TestDelayedTaskManager> manager; 154 testing::StrictMock<TestDelayedTaskManager> manager;
151 155
(...skipping 11 matching lines...) Expand all
163 const Task* task_b_raw = task_b.get(); 167 const Task* task_b_raw = task_b.get();
164 168
165 std::unique_ptr<Task> task_c( 169 std::unique_ptr<Task> task_c(
166 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta())); 170 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeDelta()));
167 task_c->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1); 171 task_c->delayed_run_time = manager.Now() + TimeDelta::FromSeconds(1);
168 const Task* task_c_raw = task_c.get(); 172 const Task* task_c_raw = task_c.get();
169 173
170 // Add |task_a| to the DelayedTaskManager. The delayed run time should be 174 // Add |task_a| to the DelayedTaskManager. The delayed run time should be
171 // updated to |task_a|'s delayed run time. 175 // updated to |task_a|'s delayed run time.
172 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 176 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
173 manager.AddDelayedTask(std::move(task_a), sequence, &thread_pool); 177 manager.AddDelayedTask(std::move(task_a), sequence, nullptr, &thread_pool);
174 testing::Mock::VerifyAndClear(&manager); 178 testing::Mock::VerifyAndClear(&manager);
175 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 179 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
176 180
177 // Add |task_b| to the DelayedTaskManager. The delayed run time shouldn't 181 // Add |task_b| to the DelayedTaskManager. The delayed run time shouldn't
178 // change. 182 // change.
179 manager.AddDelayedTask(std::move(task_b), sequence, &thread_pool); 183 manager.AddDelayedTask(std::move(task_b), sequence, nullptr, &thread_pool);
180 testing::Mock::VerifyAndClear(&manager); 184 testing::Mock::VerifyAndClear(&manager);
181 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 185 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
182 186
183 // Add |task_c| to the DelayedTaskManager. The delayed run time should be 187 // Add |task_c| to the DelayedTaskManager. The delayed run time should be
184 // updated to |task_c|'s delayed run time. 188 // updated to |task_c|'s delayed run time.
185 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 189 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
186 manager.AddDelayedTask(std::move(task_c), sequence, &thread_pool); 190 manager.AddDelayedTask(std::move(task_c), sequence, nullptr, &thread_pool);
187 testing::Mock::VerifyAndClear(&manager); 191 testing::Mock::VerifyAndClear(&manager);
188 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetDelayedRunTime()); 192 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetDelayedRunTime());
189 193
190 // Fast-forward time to |task_c_raw|'s delayed run time. 194 // Fast-forward time to |task_c_raw|'s delayed run time.
191 manager.SetCurrentTime(task_c_raw->delayed_run_time); 195 manager.SetCurrentTime(task_c_raw->delayed_run_time);
192 196
193 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 197 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
194 // |task_c_raw| should be posted and the delayed run time should become 198 // |task_c_raw| should be posted and the delayed run time should become
195 // |task_a_raw|'s delayed run time. 199 // |task_a_raw|'s delayed run time.
196 EXPECT_CALL(thread_pool, 200 EXPECT_CALL(thread_pool,
197 PostTaskWithSequenceNowMock(task_c_raw, sequence.get())); 201 PostTaskWithSequenceNowMock(task_c_raw, sequence.get(), nullptr));
198 manager.PostReadyTasks(); 202 manager.PostReadyTasks();
199 testing::Mock::VerifyAndClear(&thread_pool); 203 testing::Mock::VerifyAndClear(&thread_pool);
200 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 204 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
201 205
202 // Fast-forward time to |task_a_raw|'s delayed run time. 206 // Fast-forward time to |task_a_raw|'s delayed run time.
203 manager.SetCurrentTime(task_a_raw->delayed_run_time); 207 manager.SetCurrentTime(task_a_raw->delayed_run_time);
204 208
205 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 209 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
206 // |task_a_raw| and |task_b_raw| should be posted and the delayed run time 210 // |task_a_raw| and |task_b_raw| should be posted and the delayed run time
207 // should become a null TimeTicks. 211 // should become a null TimeTicks.
208 EXPECT_CALL(thread_pool, 212 EXPECT_CALL(thread_pool,
209 PostTaskWithSequenceNowMock(task_a_raw, sequence.get())); 213 PostTaskWithSequenceNowMock(task_a_raw, sequence.get(), nullptr));
210 EXPECT_CALL(thread_pool, 214 EXPECT_CALL(thread_pool,
211 PostTaskWithSequenceNowMock(task_b_raw, sequence.get())); 215 PostTaskWithSequenceNowMock(task_b_raw, sequence.get(), nullptr));
212 manager.PostReadyTasks(); 216 manager.PostReadyTasks();
213 testing::Mock::VerifyAndClear(&thread_pool); 217 testing::Mock::VerifyAndClear(&thread_pool);
214 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 218 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
215 } 219 }
216 220
217 } // namespace 221 } // namespace
218 } // namespace internal 222 } // namespace internal
219 } // namespace base 223 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698