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

Side by Side Diff: cc/test/ordered_simple_task_runner_unittest.cc

Issue 387493002: Fixing and enhancing OrderedSimpleTaskRunner to allow 100% deterministic tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixing the gn build. Created 6 years, 4 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 <string> 5 #include <string>
6 6
7 #include "base/cancelable_callback.h" 7 #include "base/cancelable_callback.h"
8 #include "base/format_macros.h"
8 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
9 #include "base/strings/stringprintf.h" 10 #include "base/strings/stringprintf.h"
10 #include "base/test/test_pending_task.h" 11 #include "base/test/test_pending_task.h"
11 #include "cc/test/ordered_simple_task_runner.h" 12 #include "cc/test/ordered_simple_task_runner.h"
12 #include "testing/gtest/include/gtest/gtest.h" 13 #include "testing/gtest/include/gtest/gtest.h"
13 14
15 #define RUN_AND_CHECK_RESULT(expected_result) \
16 task_runner_->RunPendingTasks(); \
17 EXPECT_EQ(expected_result, executed_tasks_); \
18 executed_tasks_ = "";
19
14 namespace cc { 20 namespace cc {
15 21
16 class OrderedSimpleTaskRunnerTest : public testing::Test { 22 class OrderedSimpleTaskRunnerTest : public testing::Test {
17 public: 23 public:
18 OrderedSimpleTaskRunnerTest() { 24 OrderedSimpleTaskRunnerTest() : now_src_() {
19 task_runner_ = new OrderedSimpleTaskRunner; 25 task_runner_ = new OrderedSimpleTaskRunner(now_src_, true);
20 } 26 }
21 virtual ~OrderedSimpleTaskRunnerTest() {} 27 virtual ~OrderedSimpleTaskRunnerTest() {}
22 28
23 protected: 29 protected:
24 void CreateAndPostTask(int task_num, base::TimeDelta delay) { 30 std::string executed_tasks_;
31 scoped_refptr<TestNowSource> now_src_;
32 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
33
34 void PostTask(int task_num, base::TimeDelta delay) {
25 base::Closure test_task = base::Bind(&OrderedSimpleTaskRunnerTest::Task, 35 base::Closure test_task = base::Bind(&OrderedSimpleTaskRunnerTest::Task,
26 base::Unretained(this), 36 base::Unretained(this),
27 task_num); 37 task_num);
28 task_runner_->PostDelayedTask(FROM_HERE, test_task, delay); 38 task_runner_->PostDelayedTask(FROM_HERE, test_task, delay);
29 } 39 }
30 40
31 void RunAndCheckResult(const std::string expected_result) { 41 void PostTaskWhichPostsInstantTask(int task_num, base::TimeDelta delay) {
32 task_runner_->RunPendingTasks(); 42 base::Closure test_task =
33 EXPECT_EQ(expected_result, executed_tasks_); 43 base::Bind(&OrderedSimpleTaskRunnerTest::TaskWhichPostsInstantTask,
44 base::Unretained(this),
45 task_num);
46 task_runner_->PostDelayedTask(FROM_HERE, test_task, delay);
47 }
48
49 void PostTaskWhichPostsDelayedTask(int task_num,
50 base::TimeDelta delay1,
51 base::TimeDelta delay2) {
52 base::Closure test_task =
53 base::Bind(&OrderedSimpleTaskRunnerTest::TaskWhichPostsDelayedTask,
54 base::Unretained(this),
55 task_num,
56 delay2);
57 task_runner_->PostDelayedTask(FROM_HERE, test_task, delay1);
58 }
59
60 void PostTaskWhichCallsRun(int task_num, base::TimeDelta delay) {
61 base::Closure test_task =
62 base::Bind(&OrderedSimpleTaskRunnerTest::TaskWhichCallsRun,
63 base::Unretained(this),
64 task_num);
65 task_runner_->PostDelayedTask(FROM_HERE, test_task, delay);
34 } 66 }
35 67
36 private: 68 private:
37 std::string executed_tasks_;
38 scoped_refptr<OrderedSimpleTaskRunner> task_runner_;
39
40 void Task(int task_num) { 69 void Task(int task_num) {
41 if (!executed_tasks_.empty()) 70 if (!executed_tasks_.empty())
42 executed_tasks_ += " "; 71 executed_tasks_ += " ";
43 executed_tasks_ += base::StringPrintf("%d", task_num); 72 executed_tasks_ +=
73 base::StringPrintf("%d(%" PRId64 "ms)",
74 task_num,
75 now_src_->Now().ToInternalValue() /
76 base::Time::kMicrosecondsPerMillisecond);
77 }
78
79 void TaskWhichPostsInstantTask(int task_num) {
80 Task(task_num);
81 PostTask(-task_num, base::TimeDelta());
82 }
83
84 void TaskWhichPostsDelayedTask(int task_num, base::TimeDelta delay) {
85 Task(task_num);
86 PostTask(-task_num, delay);
87 }
88
89 void TaskWhichCallsRun(int task_num) {
90 Task(task_num);
91 task_runner_->RunPendingTasks();
44 } 92 }
45 93
46 DISALLOW_COPY_AND_ASSIGN(OrderedSimpleTaskRunnerTest); 94 DISALLOW_COPY_AND_ASSIGN(OrderedSimpleTaskRunnerTest);
47 }; 95 };
48 96
49 TEST_F(OrderedSimpleTaskRunnerTest, BasicOrderingTest) { 97 TEST_F(OrderedSimpleTaskRunnerTest, SimpleOrderingTest) {
50 CreateAndPostTask(1, base::TimeDelta()); 98 PostTask(1, base::TimeDelta());
51 CreateAndPostTask(2, base::TimeDelta()); 99 PostTask(2, base::TimeDelta());
52 CreateAndPostTask(3, base::TimeDelta()); 100 PostTask(3, base::TimeDelta());
53 101
54 RunAndCheckResult("1 2 3"); 102 RUN_AND_CHECK_RESULT("1(0ms) 2(0ms) 3(0ms)");
103 RUN_AND_CHECK_RESULT("");
104 }
105
106 TEST_F(OrderedSimpleTaskRunnerTest, SimpleOrderingTestPostingTasks) {
107 PostTaskWhichPostsInstantTask(1, base::TimeDelta());
108 PostTaskWhichPostsInstantTask(2, base::TimeDelta());
109 PostTaskWhichPostsInstantTask(3, base::TimeDelta());
110
111 RUN_AND_CHECK_RESULT("1(0ms) 2(0ms) 3(0ms)");
112 RUN_AND_CHECK_RESULT("-1(0ms) -2(0ms) -3(0ms)");
113 RUN_AND_CHECK_RESULT("");
114 }
115
116 TEST_F(OrderedSimpleTaskRunnerTest, SimpleOrderingTestPostingDelayedTasks) {
117 PostTaskWhichPostsDelayedTask(
118 1, base::TimeDelta(), base::TimeDelta::FromMilliseconds(1));
119 PostTaskWhichPostsDelayedTask(
120 2, base::TimeDelta(), base::TimeDelta::FromMilliseconds(1));
121 PostTaskWhichPostsDelayedTask(
122 3, base::TimeDelta(), base::TimeDelta::FromMilliseconds(1));
123
124 RUN_AND_CHECK_RESULT("1(0ms) 2(0ms) 3(0ms)");
125 RUN_AND_CHECK_RESULT("-1(1ms) -2(1ms) -3(1ms)");
126 RUN_AND_CHECK_RESULT("");
127 }
128
129 TEST_F(OrderedSimpleTaskRunnerTest,
130 SimpleOrderingTestPostingReordingDelayedTasks) {
131 PostTaskWhichPostsDelayedTask(1,
132 base::TimeDelta::FromMilliseconds(1),
133 base::TimeDelta::FromMilliseconds(20));
134 PostTaskWhichPostsDelayedTask(2,
135 base::TimeDelta::FromMilliseconds(2),
136 base::TimeDelta::FromMilliseconds(5));
137 PostTaskWhichPostsDelayedTask(3,
138 base::TimeDelta::FromMilliseconds(3),
139 base::TimeDelta::FromMilliseconds(5));
140
141 RUN_AND_CHECK_RESULT("1(1ms) 2(2ms) 3(3ms)");
142 RUN_AND_CHECK_RESULT("-2(7ms) -3(8ms) -1(21ms)");
143 RUN_AND_CHECK_RESULT("");
144 }
145
146 TEST_F(OrderedSimpleTaskRunnerTest,
147 SimpleOrderingTestPostingReordingDelayedTasksOverlap) {
148 PostTaskWhichPostsDelayedTask(1,
149 base::TimeDelta::FromMilliseconds(1),
150 base::TimeDelta::FromMilliseconds(5));
151 PostTaskWhichPostsDelayedTask(2,
152 base::TimeDelta::FromMilliseconds(5),
153 base::TimeDelta::FromMilliseconds(10));
154 PostTaskWhichPostsDelayedTask(3,
155 base::TimeDelta::FromMilliseconds(10),
156 base::TimeDelta::FromMilliseconds(1));
157
158 RUN_AND_CHECK_RESULT("1(1ms) 2(5ms)");
159 RUN_AND_CHECK_RESULT("-1(6ms) 3(10ms)");
160 RUN_AND_CHECK_RESULT("-3(11ms) -2(15ms)");
161 RUN_AND_CHECK_RESULT("");
162 }
163
164 TEST_F(OrderedSimpleTaskRunnerTest, SimpleOrderingTestPostingAndRentrantTasks) {
165 PostTaskWhichPostsInstantTask(1, base::TimeDelta());
166 PostTaskWhichCallsRun(2, base::TimeDelta());
167 PostTaskWhichPostsInstantTask(3, base::TimeDelta());
168
169 RUN_AND_CHECK_RESULT("1(0ms) 2(0ms) 3(0ms)");
170 RUN_AND_CHECK_RESULT("-1(0ms) -3(0ms)");
171 RUN_AND_CHECK_RESULT("");
172 }
173
174 TEST_F(OrderedSimpleTaskRunnerTest,
175 SimpleOrderingTestPostingDelayedAndRentrantTasks) {
176 PostTaskWhichPostsDelayedTask(
177 1, base::TimeDelta(), base::TimeDelta::FromMilliseconds(1));
178 PostTaskWhichCallsRun(2, base::TimeDelta());
179 PostTaskWhichPostsDelayedTask(
180 3, base::TimeDelta(), base::TimeDelta::FromMilliseconds(1));
181
182 RUN_AND_CHECK_RESULT("1(0ms) 2(0ms) 3(0ms)");
183 RUN_AND_CHECK_RESULT("-1(1ms) -3(1ms)");
184 RUN_AND_CHECK_RESULT("");
55 } 185 }
56 186
57 TEST_F(OrderedSimpleTaskRunnerTest, OrderingTestWithDelayedTasks) { 187 TEST_F(OrderedSimpleTaskRunnerTest, OrderingTestWithDelayedTasks) {
58 CreateAndPostTask(1, base::TimeDelta()); 188 PostTask(1, base::TimeDelta());
59 CreateAndPostTask(2, base::TimeDelta::FromMilliseconds(15)); 189 PostTask(2, base::TimeDelta::FromMilliseconds(15));
60 CreateAndPostTask(3, base::TimeDelta()); 190 PostTask(3, base::TimeDelta());
61 CreateAndPostTask(4, base::TimeDelta::FromMilliseconds(8)); 191 PostTask(4, base::TimeDelta::FromMilliseconds(8));
62 192
63 RunAndCheckResult("1 3 4 2"); 193 RUN_AND_CHECK_RESULT("1(0ms) 3(0ms) 4(8ms) 2(15ms)");
194 RUN_AND_CHECK_RESULT("");
195 }
196
197 TEST_F(OrderedSimpleTaskRunnerTest, OrderingTestWithDelayedPostingTasks) {
198 PostTaskWhichPostsInstantTask(1, base::TimeDelta());
199 PostTaskWhichPostsInstantTask(2, base::TimeDelta::FromMilliseconds(15));
200 PostTaskWhichPostsInstantTask(3, base::TimeDelta());
201 PostTaskWhichPostsInstantTask(4, base::TimeDelta::FromMilliseconds(8));
202
203 RUN_AND_CHECK_RESULT("1(0ms) 3(0ms)");
204 RUN_AND_CHECK_RESULT("-1(0ms) -3(0ms) 4(8ms)");
205 RUN_AND_CHECK_RESULT("-4(8ms) 2(15ms)");
206 RUN_AND_CHECK_RESULT("-2(15ms)");
207 RUN_AND_CHECK_RESULT("");
208 }
209
210 TEST_F(OrderedSimpleTaskRunnerTest, OrderingTestWithDelayedTasksManualNow) {
211 task_runner_->SetAutoAdvanceNowToPendingTasks(false);
212 PostTask(1, base::TimeDelta());
213 PostTask(2, base::TimeDelta::FromMilliseconds(15));
214 PostTask(3, base::TimeDelta());
215 PostTask(4, base::TimeDelta::FromMilliseconds(8));
216
217 RUN_AND_CHECK_RESULT("1(0ms) 3(0ms)");
218 RUN_AND_CHECK_RESULT("");
219 EXPECT_EQ(task_runner_->NextPendingTaskDelay(),
220 base::TimeDelta::FromMilliseconds(8));
221 EXPECT_EQ(task_runner_->DelayToNextPendingTask(),
222 base::TimeDelta::FromMilliseconds(8));
223 now_src_->SetNow(base::TimeTicks::FromInternalValue(5000));
224 EXPECT_EQ(task_runner_->NextPendingTaskDelay(),
225 base::TimeDelta::FromMilliseconds(8));
226 EXPECT_EQ(task_runner_->DelayToNextPendingTask(),
227 base::TimeDelta::FromMilliseconds(3));
228 now_src_->SetNow(base::TimeTicks::FromInternalValue(25000));
229 EXPECT_EQ(task_runner_->NextPendingTaskDelay(),
230 base::TimeDelta::FromMilliseconds(8));
231 EXPECT_EQ(task_runner_->DelayToNextPendingTask(), base::TimeDelta());
232 RUN_AND_CHECK_RESULT("4(25ms) 2(25ms)");
233 RUN_AND_CHECK_RESULT("");
64 } 234 }
65 235
66 } // namespace cc 236 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698