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

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

Powered by Google App Engine
This is Rietveld 408576698