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

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

Issue 1685423002: Task Scheduler. (Closed) Base URL: https://luckyluke-private.googlesource.com/src@a_master
Patch Set: Created 4 years, 10 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
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698