OLD | NEW |
---|---|
(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/task_scheduler/scheduler_lock.h" | |
13 #include "base/task_scheduler/task.h" | |
14 #include "base/time/time.h" | |
15 #include "testing/gmock/include/gmock/gmock.h" | |
16 #include "testing/gtest/include/gtest/gtest.h" | |
17 | |
18 namespace base { | |
19 namespace internal { | |
20 namespace { | |
21 | |
22 class TestDelayedTaskManager : public DelayedTaskManager { | |
23 public: | |
24 TestDelayedTaskManager() | |
25 : DelayedTaskManager( | |
26 Bind(&TestDelayedTaskManager::OnDelayedTaskReadyTimeChanged, | |
27 Unretained(this))) {} | |
28 | |
29 void SetCurrentTime(TimeTicks now) { now_ = now; } | |
30 TimeTicks Now() const override { return now_; } | |
gab
2016/04/07 21:32:08
// DelayedTaskManager:
fdoray
2016/04/08 17:24:51
Done.
| |
31 | |
32 MOCK_METHOD0(OnDelayedTaskReadyTimeChanged, void()); | |
33 | |
34 DelayedTaskManager::PostTaskCallback GetPostTaskCallback() { | |
35 return Bind(&TestDelayedTaskManager::PostTaskCallback, Unretained(this)); | |
36 } | |
37 | |
38 void PostTaskCallback(std::unique_ptr<Task> task) { | |
gab
2016/04/07 21:32:09
private since you only use it from GetPostTaskCall
fdoray
2016/04/08 17:24:51
Done.
| |
39 PostTaskCallbackMock(task.get()); | |
40 | |
41 // Acquire a SchedulerLock with no predecessor to verify that no lock | |
42 // dependency is imposed on this callback. | |
43 SchedulerLock lock; | |
44 AutoSchedulerLock auto_lock(lock); | |
45 } | |
46 | |
47 MOCK_METHOD1(PostTaskCallbackMock, void(const Task*)); | |
48 | |
49 private: | |
50 TimeTicks now_; | |
51 }; | |
gab
2016/04/07 21:32:09
DISALLOW_COPY_AND_ASSIGN
fdoray
2016/04/08 17:24:52
Done.
| |
52 | |
53 // Verify that GetNextDelayedRunTime() returns a null TimeTicks when there are | |
54 // no pending delayed tasks. | |
55 TEST(TaskSchedulerDelayedTaskManagerTest, | |
56 GetNextDelayedRunTimeNoPendingDelayedTasks) { | |
57 TestDelayedTaskManager manager; | |
58 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
59 } | |
60 | |
61 // Verify that a delayed task's callback is invoked when PostReadyTasks() is | |
62 // called with the current time equal to the task's delayed run time. | |
63 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTask) { | |
64 testing::StrictMock<TestDelayedTaskManager> manager; | |
65 | |
66 std::unique_ptr<Task> task( | |
67 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
68 task->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(1); | |
gab
2016/04/07 21:32:08
I'm not sure relying on the null value of TimeTick
fdoray
2016/04/08 17:24:52
Is manager.Now() + TimeDelta::FromSeconds(1) ok?
gab
2016/04/08 18:03:55
Yes.
| |
69 const Task* task_raw = task.get(); | |
70 | |
71 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
72 manager.AddDelayedTask(std::move(task), manager.GetPostTaskCallback()); | |
73 testing::Mock::VerifyAndClear(&manager); | |
74 EXPECT_EQ(task_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
75 | |
76 manager.SetCurrentTime(task_raw->delayed_run_time); | |
77 | |
78 EXPECT_CALL(manager, PostTaskCallbackMock(task_raw)); | |
79 manager.PostReadyTasks(); | |
80 testing::Mock::VerifyAndClear(&manager); | |
81 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
82 } | |
83 | |
84 // Verify that a delayed task's callback is invoked when PostReadyTasks() is | |
85 // called with the current time greater than the task's delayed run time. | |
86 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTaskLate) { | |
87 testing::StrictMock<TestDelayedTaskManager> manager; | |
88 | |
89 std::unique_ptr<Task> task( | |
90 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
91 task->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(1); | |
92 const Task* task_raw = task.get(); | |
93 | |
94 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
95 manager.AddDelayedTask(std::move(task), manager.GetPostTaskCallback()); | |
96 testing::Mock::VerifyAndClear(&manager); | |
97 EXPECT_EQ(task_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
98 | |
99 manager.SetCurrentTime(task_raw->delayed_run_time + | |
100 TimeDelta::FromSeconds(10)); | |
101 | |
102 EXPECT_CALL(manager, PostTaskCallbackMock(task_raw)); | |
103 manager.PostReadyTasks(); | |
104 testing::Mock::VerifyAndClear(&manager); | |
105 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
106 } | |
107 | |
108 // Verify that when multiple tasks are added to a DelayedTaskManager, their | |
109 // respective callback is invoked when they become ripe for execution. | |
110 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTasks) { | |
111 testing::StrictMock<TestDelayedTaskManager> manager; | |
112 | |
113 std::unique_ptr<Task> task_a( | |
114 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
115 task_a->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(2); | |
116 const Task* task_a_raw = task_a.get(); | |
117 | |
118 std::unique_ptr<Task> task_b( | |
119 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
120 task_b->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(2); | |
121 const Task* task_b_raw = task_b.get(); | |
122 | |
123 std::unique_ptr<Task> task_c( | |
124 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
125 task_c->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(1); | |
126 const Task* task_c_raw = task_c.get(); | |
127 | |
128 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
129 manager.AddDelayedTask(std::move(task_a), manager.GetPostTaskCallback()); | |
130 testing::Mock::VerifyAndClear(&manager); | |
131 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
132 | |
133 manager.AddDelayedTask(std::move(task_b), manager.GetPostTaskCallback()); | |
134 testing::Mock::VerifyAndClear(&manager); | |
135 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
136 | |
137 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
138 manager.AddDelayedTask(std::move(task_c), manager.GetPostTaskCallback()); | |
139 testing::Mock::VerifyAndClear(&manager); | |
140 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
141 | |
142 manager.SetCurrentTime(task_c_raw->delayed_run_time); | |
143 | |
144 EXPECT_CALL(manager, PostTaskCallbackMock(task_c_raw)); | |
145 manager.PostReadyTasks(); | |
146 testing::Mock::VerifyAndClear(&manager); | |
147 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
148 | |
149 manager.SetCurrentTime(task_a_raw->delayed_run_time); | |
150 | |
151 EXPECT_CALL(manager, PostTaskCallbackMock(task_a_raw)); | |
152 EXPECT_CALL(manager, PostTaskCallbackMock(task_b_raw)); | |
153 manager.PostReadyTasks(); | |
154 testing::Mock::VerifyAndClear(&manager); | |
155 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
156 } | |
157 | |
158 } // namespace | |
159 } // namespace internal | |
160 } // namespace base | |
OLD | NEW |