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 <utility> | |
8 | |
9 #include "base/bind.h" | |
10 #include "base/bind_helpers.h" | |
11 #include "base/logging.h" | |
12 #include "base/memory/ref_counted.h" | |
13 #include "base/task_scheduler/priority_queue.h" | |
14 #include "base/task_scheduler/sequence.h" | |
15 #include "base/task_scheduler/shutdown_manager.h" | |
16 #include "base/task_scheduler/task.h" | |
17 #include "base/time/time.h" | |
18 #include "testing/gmock/include/gmock/gmock.h" | |
19 #include "testing/gtest/include/gtest/gtest.h" | |
20 | |
21 namespace base { | |
22 | |
23 // Required by gmock. | |
24 bool operator==(const Closure& closure, const Closure& other_closure) { | |
25 return closure.Equals(other_closure); | |
26 } | |
27 | |
28 namespace task_scheduler { | |
29 | |
30 namespace { | |
31 | |
32 class TestDelayedTaskManager : public DelayedTaskManager { | |
33 public: | |
34 TestDelayedTaskManager() | |
35 : DelayedTaskManager( | |
36 Bind(&TestDelayedTaskManager::OnDelayedTaskReadyTimeChanged, | |
37 Unretained(this)), | |
38 &shutdown_manager_) {} | |
39 | |
40 void IncrementTime(TimeDelta delta) { now_ += delta; } | |
41 MOCK_METHOD0(OnDelayedTaskReadyTimeChanged, void()); | |
42 TimeTicks Now() override { return now_; } | |
43 | |
44 private: | |
45 TimeTicks now_; | |
46 ShutdownManager shutdown_manager_; | |
47 }; | |
48 | |
49 } // namespace | |
50 | |
51 // Check that a task added to a DelayedTaskManager is added to the proper | |
52 // sequence and priority queue by PostReadyTasks() when the current time is | |
fdoray
2016/02/11 17:30:33
current time *becomes
fdoray
2016/02/12 04:16:19
Done.
| |
53 // equal to the task delayed run time. | |
54 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTask) { | |
55 TestDelayedTaskManager manager; | |
56 | |
57 Task task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeTicks()); | |
58 const auto delay = TimeDelta::FromSeconds(1); | |
59 task.delayed_run_time = TimeTicks() + delay; | |
60 | |
61 scoped_refptr<Sequence> sequence(new Sequence); | |
62 PriorityQueue priority_queue(Bind(&DoNothing)); | |
63 | |
64 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
65 manager.AddDelayedTask(task, sequence, &priority_queue); | |
66 testing::Mock::VerifyAndClear(&manager); | |
67 EXPECT_EQ(TimeTicks() + delay, manager.GetNextDelayedTaskReadyTime()); | |
68 | |
69 manager.IncrementTime(delay); | |
70 | |
71 manager.PostReadyTasks(); | |
72 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedTaskReadyTime()); | |
73 EXPECT_EQ(task.posted_from, sequence->PeekTask()->posted_from); | |
74 SequenceSortKey sort_key; | |
75 EXPECT_EQ(sequence.get(), | |
76 priority_queue.BeginTransaction()->PeekSequence(&sort_key).get()); | |
77 } | |
78 | |
79 // Check that a task added to a DelayedTaskManager is added to the proper | |
80 // sequence and priority queue by PostReadyTasks() when the current time is | |
fdoray
2016/02/11 17:30:32
current time *becomes
fdoray
2016/02/12 04:16:19
Done.
| |
81 // greater than the task delayed run time. | |
82 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTaskLate) { | |
83 TestDelayedTaskManager manager; | |
84 | |
85 Task task(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeTicks()); | |
86 const auto delay = TimeDelta::FromSeconds(1); | |
87 task.delayed_run_time = TimeTicks() + delay; | |
88 | |
89 scoped_refptr<Sequence> sequence(new Sequence); | |
90 PriorityQueue priority_queue(Bind(&DoNothing)); | |
91 | |
92 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
93 manager.AddDelayedTask(task, sequence, &priority_queue); | |
94 testing::Mock::VerifyAndClear(&manager); | |
95 EXPECT_EQ(TimeTicks() + delay, manager.GetNextDelayedTaskReadyTime()); | |
96 | |
97 // Increment the time more than the task's delay. | |
98 manager.IncrementTime(TimeDelta::FromSeconds(10)); | |
99 | |
100 manager.PostReadyTasks(); | |
101 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedTaskReadyTime()); | |
102 EXPECT_EQ(task.posted_from, sequence->PeekTask()->posted_from); | |
103 } | |
104 | |
105 // Check that when multiple tasks are added to a DelayedTaskManager, they are | |
106 // all inserted in their respective sequence and priority queue when they become | |
107 // ripe for execution. | |
108 TEST(TaskSchedulerDelayedTaskManagerTest, AddAndPostTasks) { | |
109 TestDelayedTaskManager manager; | |
110 size_t new_num_tasks = 0; | |
111 | |
112 scoped_refptr<Sequence> sequence(new Sequence); | |
113 PriorityQueue priority_queue(Bind(&DoNothing)); | |
114 | |
115 Task task_a(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeTicks()); | |
116 const auto delay_a = TimeDelta::FromSeconds(2); | |
117 task_a.delayed_run_time = TimeTicks() + delay_a; | |
118 | |
119 Task task_b(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeTicks()); | |
120 const auto delay_b = TimeDelta::FromSeconds(2); | |
121 task_b.delayed_run_time = TimeTicks() + delay_b; | |
122 | |
123 Task task_c(FROM_HERE, Bind(&DoNothing), TaskTraits(), TimeTicks()); | |
124 const auto delay_c = TimeDelta::FromSeconds(1); | |
125 task_c.delayed_run_time = TimeTicks() + delay_c; | |
126 | |
127 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
128 manager.AddDelayedTask(std::move(task_a), sequence, &priority_queue); | |
129 testing::Mock::VerifyAndClear(&manager); | |
130 EXPECT_EQ(TimeTicks() + delay_a, manager.GetNextDelayedTaskReadyTime()); | |
131 | |
132 manager.AddDelayedTask(std::move(task_b), sequence, &priority_queue); | |
133 testing::Mock::VerifyAndClear(&manager); | |
134 EXPECT_EQ(TimeTicks() + delay_a, manager.GetNextDelayedTaskReadyTime()); | |
135 | |
136 EXPECT_CALL(manager, OnDelayedTaskReadyTimeChanged()); | |
137 manager.AddDelayedTask(std::move(task_c), sequence, &priority_queue); | |
138 testing::Mock::VerifyAndClear(&manager); | |
139 EXPECT_EQ(TimeTicks() + delay_c, manager.GetNextDelayedTaskReadyTime()); | |
140 | |
141 manager.IncrementTime(delay_c); | |
142 | |
143 manager.PostReadyTasks(); | |
144 EXPECT_EQ(task_c.posted_from, sequence->PeekTask()->posted_from); | |
145 sequence->PopTask(&new_num_tasks); | |
146 EXPECT_EQ(TimeTicks() + delay_a, manager.GetNextDelayedTaskReadyTime()); | |
147 | |
148 manager.IncrementTime(delay_a - delay_c); | |
149 | |
150 manager.PostReadyTasks(); | |
151 EXPECT_EQ(task_a.posted_from, sequence->PeekTask()->posted_from); | |
152 sequence->PopTask(&new_num_tasks); | |
153 EXPECT_EQ(task_b.posted_from, sequence->PeekTask()->posted_from); | |
154 sequence->PopTask(&new_num_tasks); | |
155 EXPECT_EQ(TimeTicks(), manager.GetNextDelayedTaskReadyTime()); | |
156 } | |
157 | |
158 } // namespace task_scheduler | |
159 } // namespace base | |
OLD | NEW |