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

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: 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/memory/ref_counted.h" 12 #include "base/memory/ref_counted.h"
13 #include "base/task_scheduler/scheduler_lock.h" 13 #include "base/task_scheduler/scheduler_lock.h"
14 #include "base/task_scheduler/scheduler_task_executor.h" 14 #include "base/task_scheduler/scheduler_thread_pool_interface.h"
15 #include "base/task_scheduler/sequence.h" 15 #include "base/task_scheduler/sequence.h"
16 #include "base/task_scheduler/task.h" 16 #include "base/task_scheduler/task.h"
17 #include "base/time/time.h" 17 #include "base/time/time.h"
18 #include "testing/gmock/include/gmock/gmock.h" 18 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h" 19 #include "testing/gtest/include/gtest/gtest.h"
20 20
21 namespace base { 21 namespace base {
22 namespace internal { 22 namespace internal {
23 namespace { 23 namespace {
24 24
(...skipping 10 matching lines...) Expand all
35 TimeTicks Now() const override { return now_; } 35 TimeTicks Now() const override { return now_; }
36 36
37 MOCK_METHOD0(OnDelayedRunTimeUpdated, void()); 37 MOCK_METHOD0(OnDelayedRunTimeUpdated, void());
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 MockSchedulerTaskExecutor : public SchedulerTaskExecutor { 45 class MockSchedulerThreadPool : public SchedulerThreadPoolInterface {
46 public: 46 public:
47 void PostTaskWithSequence(std::unique_ptr<Task> task, 47 void PostTaskWithSequenceNow(std::unique_ptr<Task> task,
48 scoped_refptr<Sequence> sequence) override { 48 scoped_refptr<Sequence> sequence) override {
49 PostTaskWithSequenceMock(task.get(), sequence.get()); 49 PostTaskWithSequenceNowMock(task.get(), sequence.get());
50 } 50 }
51 51
52 MOCK_METHOD2(PostTaskWithSequenceMock, void(const Task*, const Sequence*)); 52 MOCK_METHOD2(PostTaskWithSequenceNowMock, void(const Task*, const Sequence*));
53 }; 53 };
54 54
55 // Verify that GetDelayedRunTime() returns a null TimeTicks when there are 55 // Verify that GetDelayedRunTime() returns a null TimeTicks when there are
56 // no pending delayed tasks. 56 // no pending delayed tasks.
57 TEST(TaskSchedulerDelayedTaskManagerTest, 57 TEST(TaskSchedulerDelayedTaskManagerTest,
58 GetDelayedRunTimeNoPendingDelayedTasks) { 58 GetDelayedRunTimeNoPendingDelayedTasks) {
59 TestDelayedTaskManager manager; 59 TestDelayedTaskManager manager;
60 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 60 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
61 } 61 }
62 62
63 // Verify that a delayed task isn't posted before it is ripe for execution. 63 // Verify that a delayed task isn't posted before it is ripe for execution.
64 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) { 64 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTaskBeforeDelayedRunTime) {
65 testing::StrictMock<TestDelayedTaskManager> manager; 65 testing::StrictMock<TestDelayedTaskManager> manager;
66 66
67 std::unique_ptr<Task> task( 67 std::unique_ptr<Task> task(
68 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 68 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
69 manager.Now() + TimeDelta::FromSeconds(1))); 69 manager.Now() + TimeDelta::FromSeconds(1)));
70 const Task* task_raw = task.get(); 70 const Task* task_raw = task.get();
71 scoped_refptr<Sequence> sequence(new Sequence); 71 scoped_refptr<Sequence> sequence(new Sequence);
72 testing::StrictMock<MockSchedulerTaskExecutor> executor; 72 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
73 73
74 // Add |task| to the DelayedTaskManager. 74 // Add |task| to the DelayedTaskManager.
75 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 75 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
76 manager.AddDelayedTask(std::move(task), sequence, &executor); 76 manager.AddDelayedTask(std::move(task), sequence, &thread_pool);
77 testing::Mock::VerifyAndClear(&manager); 77 testing::Mock::VerifyAndClear(&manager);
78 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 78 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
79 79
80 // Ask the DelayedTaskManager to post tasks that are ripe for execution. Don't 80 // Ask the DelayedTaskManager to post tasks that are ripe for execution. Don't
81 // expect any call to the mock method of |executor|. 81 // expect any call to the mock method of |thread_pool|.
82 manager.PostReadyTasks(); 82 manager.PostReadyTasks();
83 83
84 // The delayed run time shouldn't have changed. 84 // The delayed run time shouldn't have changed.
85 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 85 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
86 } 86 }
87 87
88 // Verify that a delayed task is posted when PostReadyTasks() is called with the 88 // Verify that a delayed task is posted when PostReadyTasks() is called with the
89 // current time equal to the task's delayed run time. 89 // current time equal to the task's delayed run time.
90 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) { 90 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAtDelayedRunTime) {
91 testing::StrictMock<TestDelayedTaskManager> manager; 91 testing::StrictMock<TestDelayedTaskManager> manager;
92 92
93 std::unique_ptr<Task> task( 93 std::unique_ptr<Task> task(
94 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 94 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
95 manager.Now() + TimeDelta::FromSeconds(1))); 95 manager.Now() + TimeDelta::FromSeconds(1)));
96 const Task* task_raw = task.get(); 96 const Task* task_raw = task.get();
97 scoped_refptr<Sequence> sequence(new Sequence); 97 scoped_refptr<Sequence> sequence(new Sequence);
98 testing::StrictMock<MockSchedulerTaskExecutor> executor; 98 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
99 99
100 // Add |task| to the DelayedTaskManager. 100 // Add |task| to the DelayedTaskManager.
101 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 101 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
102 manager.AddDelayedTask(std::move(task), sequence, &executor); 102 manager.AddDelayedTask(std::move(task), sequence, &thread_pool);
103 testing::Mock::VerifyAndClear(&manager); 103 testing::Mock::VerifyAndClear(&manager);
104 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 104 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
105 105
106 // Fast-forward time to |task_raw|'s delayed run time. 106 // Fast-forward time to |task_raw|'s delayed run time.
107 manager.SetCurrentTime(task_raw->delayed_run_time); 107 manager.SetCurrentTime(task_raw->delayed_run_time);
108 108
109 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 109 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
110 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_raw, sequence.get())); 110 EXPECT_CALL(thread_pool,
111 PostTaskWithSequenceNowMock(task_raw, sequence.get()));
111 manager.PostReadyTasks(); 112 manager.PostReadyTasks();
112 testing::Mock::VerifyAndClear(&manager); 113 testing::Mock::VerifyAndClear(&manager);
113 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 114 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
114 } 115 }
115 116
116 // Verify that a delayed task is posted when PostReadyTasks() is called with the 117 // Verify that a delayed task is posted when PostReadyTasks() is called with the
117 // current time greater than the task's delayed run time. 118 // current time greater than the task's delayed run time.
118 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) { 119 TEST(TaskSchedulerDelayedTaskManagerTest, PostReadyTasksAfterDelayedRunTime) {
119 testing::StrictMock<TestDelayedTaskManager> manager; 120 testing::StrictMock<TestDelayedTaskManager> manager;
120 121
121 std::unique_ptr<Task> task( 122 std::unique_ptr<Task> task(
122 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 123 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
123 manager.Now() + TimeDelta::FromSeconds(1))); 124 manager.Now() + TimeDelta::FromSeconds(1)));
124 const Task* task_raw = task.get(); 125 const Task* task_raw = task.get();
125 scoped_refptr<Sequence> sequence(new Sequence); 126 scoped_refptr<Sequence> sequence(new Sequence);
126 testing::StrictMock<MockSchedulerTaskExecutor> executor; 127 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
127 128
128 // Add |task| to the DelayedTaskManager. 129 // Add |task| to the DelayedTaskManager.
129 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 130 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
130 manager.AddDelayedTask(std::move(task), sequence, &executor); 131 manager.AddDelayedTask(std::move(task), sequence, &thread_pool);
131 testing::Mock::VerifyAndClear(&manager); 132 testing::Mock::VerifyAndClear(&manager);
132 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime()); 133 EXPECT_EQ(task_raw->delayed_run_time, manager.GetDelayedRunTime());
133 134
134 // Fast-forward time to |task_raw|'s delayed run time. 135 // Fast-forward time to |task_raw|'s delayed run time.
135 manager.SetCurrentTime(task_raw->delayed_run_time + 136 manager.SetCurrentTime(task_raw->delayed_run_time +
136 TimeDelta::FromSeconds(10)); 137 TimeDelta::FromSeconds(10));
137 138
138 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 139 // Ask the DelayedTaskManager to post tasks that are ripe for execution.
139 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_raw, sequence.get())); 140 EXPECT_CALL(thread_pool,
141 PostTaskWithSequenceNowMock(task_raw, sequence.get()));
140 manager.PostReadyTasks(); 142 manager.PostReadyTasks();
141 testing::Mock::VerifyAndClear(&manager); 143 testing::Mock::VerifyAndClear(&manager);
142 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 144 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
143 } 145 }
144 146
145 // Verify that when multiple tasks are added to a DelayedTaskManager, they are 147 // Verify that when multiple tasks are added to a DelayedTaskManager, they are
146 // posted when they become ripe for execution. 148 // posted when they become ripe for execution.
147 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) { 149 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostReadyTasks) {
148 testing::StrictMock<TestDelayedTaskManager> manager; 150 testing::StrictMock<TestDelayedTaskManager> manager;
149 151
150 scoped_refptr<Sequence> sequence(new Sequence); 152 scoped_refptr<Sequence> sequence(new Sequence);
151 testing::StrictMock<MockSchedulerTaskExecutor> executor; 153 testing::StrictMock<MockSchedulerThreadPool> thread_pool;
152 154
153 std::unique_ptr<Task> task_a( 155 std::unique_ptr<Task> task_a(
154 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 156 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
155 manager.Now() + TimeDelta::FromSeconds(2))); 157 manager.Now() + TimeDelta::FromSeconds(2)));
156 const Task* task_a_raw = task_a.get(); 158 const Task* task_a_raw = task_a.get();
157 159
158 std::unique_ptr<Task> task_b( 160 std::unique_ptr<Task> task_b(
159 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 161 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
160 manager.Now() + TimeDelta::FromSeconds(2))); 162 manager.Now() + TimeDelta::FromSeconds(2)));
161 const Task* task_b_raw = task_b.get(); 163 const Task* task_b_raw = task_b.get();
162 164
163 std::unique_ptr<Task> task_c( 165 std::unique_ptr<Task> task_c(
164 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(), 166 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits(),
165 manager.Now() + TimeDelta::FromSeconds(1))); 167 manager.Now() + TimeDelta::FromSeconds(1)));
166 const Task* task_c_raw = task_c.get(); 168 const Task* task_c_raw = task_c.get();
167 169
168 // Add |task_a| to the DelayedTaskManager. The delayed run time should be 170 // Add |task_a| to the DelayedTaskManager. The delayed run time should be
169 // updated to |task_a|'s delayed run time. 171 // updated to |task_a|'s delayed run time.
170 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 172 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
171 manager.AddDelayedTask(std::move(task_a), sequence, &executor); 173 manager.AddDelayedTask(std::move(task_a), sequence, &thread_pool);
172 testing::Mock::VerifyAndClear(&manager); 174 testing::Mock::VerifyAndClear(&manager);
173 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 175 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
174 176
175 // Add |task_b| to the DelayedTaskManager. The delayed run time shouldn't 177 // Add |task_b| to the DelayedTaskManager. The delayed run time shouldn't
176 // change. 178 // change.
177 manager.AddDelayedTask(std::move(task_b), sequence, &executor); 179 manager.AddDelayedTask(std::move(task_b), sequence, &thread_pool);
178 testing::Mock::VerifyAndClear(&manager); 180 testing::Mock::VerifyAndClear(&manager);
179 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 181 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
180 182
181 // Add |task_c| to the DelayedTaskManager. The delayed run time should be 183 // Add |task_c| to the DelayedTaskManager. The delayed run time should be
182 // updated to |task_c|'s delayed run time. 184 // updated to |task_c|'s delayed run time.
183 EXPECT_CALL(manager, OnDelayedRunTimeUpdated()); 185 EXPECT_CALL(manager, OnDelayedRunTimeUpdated());
184 manager.AddDelayedTask(std::move(task_c), sequence, &executor); 186 manager.AddDelayedTask(std::move(task_c), sequence, &thread_pool);
185 testing::Mock::VerifyAndClear(&manager); 187 testing::Mock::VerifyAndClear(&manager);
186 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetDelayedRunTime()); 188 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetDelayedRunTime());
187 189
188 // Fast-forward time to |task_c_raw|'s delayed run time. 190 // Fast-forward time to |task_c_raw|'s delayed run time.
189 manager.SetCurrentTime(task_c_raw->delayed_run_time); 191 manager.SetCurrentTime(task_c_raw->delayed_run_time);
190 192
191 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 193 // 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 194 // |task_c_raw| should be posted and the delayed run time should become
193 // |task_a_raw|'s delayed run time. 195 // |task_a_raw|'s delayed run time.
194 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_c_raw, sequence.get())); 196 EXPECT_CALL(thread_pool,
197 PostTaskWithSequenceNowMock(task_c_raw, sequence.get()));
195 manager.PostReadyTasks(); 198 manager.PostReadyTasks();
196 testing::Mock::VerifyAndClear(&executor); 199 testing::Mock::VerifyAndClear(&thread_pool);
197 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime()); 200 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetDelayedRunTime());
198 201
199 // Fast-forward time to |task_a_raw|'s delayed run time. 202 // Fast-forward time to |task_a_raw|'s delayed run time.
200 manager.SetCurrentTime(task_a_raw->delayed_run_time); 203 manager.SetCurrentTime(task_a_raw->delayed_run_time);
201 204
202 // Ask the DelayedTaskManager to post tasks that are ripe for execution. 205 // 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 206 // |task_a_raw| and |task_b_raw| should be posted and the delayed run time
204 // should become a null TimeTicks. 207 // should become a null TimeTicks.
205 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_a_raw, sequence.get())); 208 EXPECT_CALL(thread_pool,
206 EXPECT_CALL(executor, PostTaskWithSequenceMock(task_b_raw, sequence.get())); 209 PostTaskWithSequenceNowMock(task_a_raw, sequence.get()));
210 EXPECT_CALL(thread_pool,
211 PostTaskWithSequenceNowMock(task_b_raw, sequence.get()));
207 manager.PostReadyTasks(); 212 manager.PostReadyTasks();
208 testing::Mock::VerifyAndClear(&executor); 213 testing::Mock::VerifyAndClear(&thread_pool);
209 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime()); 214 EXPECT_EQ(TimeTicks(), manager.GetDelayedRunTime());
210 } 215 }
211 216
212 } // namespace 217 } // namespace
213 } // namespace internal 218 } // namespace internal
214 } // namespace base 219 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698