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() override { return now_; } | |
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) { | |
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 MOCK_METHOD1(PostTaskCallbackMock, void(const Task*)); | |
robliao
2016/04/04 17:59:53
Nit: linebreak above here.
fdoray
2016/04/04 19:52:19
Done.
| |
47 | |
48 private: | |
49 TimeTicks now_; | |
50 }; | |
51 | |
52 // Verify that GetNextDelayedRunTime() returns a null TimeTicks when there are | |
53 // no pending delayed tasks. | |
54 TEST(TaskSchedulerDelayedTaskManagerTest, | |
55 GetNextDelayedRunTimeNoPendingDelayedTasks) { | |
56 TestDelayedTaskManager manager; | |
57 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
58 } | |
59 | |
60 // Verify that a delayed task's callback is invoked when PostReadyTasks() is | |
61 // called with the current time equal to the task's delayed run time. | |
62 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTask) { | |
63 testing::StrictMock<TestDelayedTaskManager> manager; | |
64 | |
65 std::unique_ptr<Task> task( | |
66 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
67 task->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(1); | |
68 const Task* task_raw = task.get(); | |
69 | |
70 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
71 manager.AddDelayedTask(std::move(task), manager.GetPostTaskCallback()); | |
72 testing::Mock::VerifyAndClear(&manager); | |
73 EXPECT_EQ(task_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
74 | |
75 manager.SetCurrentTime(task_raw->delayed_run_time); | |
76 | |
77 EXPECT_CALL(manager, PostTaskCallbackMock(task_raw)); | |
78 manager.PostReadyTasks(); | |
79 testing::Mock::VerifyAndClear(&manager); | |
80 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
81 } | |
82 | |
83 // Verify that a delayed task's callback is invoked when PostReadyTasks() is | |
84 // called with the current time greater than the task's delayed run time. | |
85 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTaskLate) { | |
86 testing::StrictMock<TestDelayedTaskManager> manager; | |
87 | |
88 std::unique_ptr<Task> task( | |
89 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
90 task->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(1); | |
91 const Task* task_raw = task.get(); | |
92 | |
93 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
94 manager.AddDelayedTask(std::move(task), manager.GetPostTaskCallback()); | |
95 testing::Mock::VerifyAndClear(&manager); | |
96 EXPECT_EQ(task_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
97 | |
98 manager.SetCurrentTime(task_raw->delayed_run_time + | |
99 TimeDelta::FromSeconds(10)); | |
100 | |
101 EXPECT_CALL(manager, PostTaskCallbackMock(task_raw)); | |
102 manager.PostReadyTasks(); | |
103 testing::Mock::VerifyAndClear(&manager); | |
104 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
105 } | |
106 | |
107 // Verify that when multiple tasks are added to a DelayedTaskManager, their | |
108 // respective callback is invoked when they become ripe for execution. | |
109 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTasks) { | |
110 testing::StrictMock<TestDelayedTaskManager> manager; | |
111 | |
112 std::unique_ptr<Task> task_a( | |
113 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
114 task_a->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(2); | |
115 const Task* task_a_raw = task_a.get(); | |
116 | |
117 std::unique_ptr<Task> task_b( | |
118 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
119 task_b->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(2); | |
120 const Task* task_b_raw = task_b.get(); | |
121 | |
122 std::unique_ptr<Task> task_c( | |
123 new Task(FROM_HERE, Bind(&DoNothing), TaskTraits())); | |
124 task_c->delayed_run_time = TimeTicks() + TimeDelta::FromSeconds(1); | |
125 const Task* task_c_raw = task_c.get(); | |
126 | |
127 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
128 manager.AddDelayedTask(std::move(task_a), manager.GetPostTaskCallback()); | |
129 testing::Mock::VerifyAndClear(&manager); | |
130 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
131 | |
132 manager.AddDelayedTask(std::move(task_b), manager.GetPostTaskCallback()); | |
133 testing::Mock::VerifyAndClear(&manager); | |
134 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
135 | |
136 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
137 manager.AddDelayedTask(std::move(task_c), manager.GetPostTaskCallback()); | |
138 testing::Mock::VerifyAndClear(&manager); | |
139 EXPECT_EQ(task_c_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
140 | |
141 manager.SetCurrentTime(task_c_raw->delayed_run_time); | |
142 | |
143 EXPECT_CALL(manager, PostTaskCallbackMock(task_c_raw)); | |
144 manager.PostReadyTasks(); | |
145 testing::Mock::VerifyAndClear(&manager); | |
146 EXPECT_EQ(task_a_raw->delayed_run_time, manager.GetNextDelayedRunTime()); | |
147 | |
148 manager.SetCurrentTime(task_a_raw->delayed_run_time); | |
149 | |
150 EXPECT_CALL(manager, PostTaskCallbackMock(task_a_raw)); | |
151 EXPECT_CALL(manager, PostTaskCallbackMock(task_b_raw)); | |
152 manager.PostReadyTasks(); | |
153 testing::Mock::VerifyAndClear(&manager); | |
154 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedRunTime()); | |
155 } | |
156 | |
157 } // namespace | |
158 } // namespace internal | |
159 } // namespace base | |
OLD | NEW |