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

Side by Side Diff: base/test/task_runner_test_template.h

Issue 1705943002: TaskScheduler [5/9] Task Tracker (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@s_3_pq
Patch Set: fix PostTask comment Created 4 years, 9 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
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 // This file defines tests that implementations of TaskRunner should 5 // This file defines tests that implementations of TaskRunner should
6 // pass in order to be conformant, as well as test cases for optional behavior. 6 // pass in order to be conformant, as well as test cases for optional behavior.
7 // Here's how you use it to test your implementation. 7 // Here's how you use it to test your implementation.
8 // 8 //
9 // Say your class is called MyTaskRunner. Then you need to define a 9 // Say your class is called MyTaskRunner. Then you need to define a
10 // class called MyTaskRunnerTestDelegate in my_task_runner_unittest.cc 10 // class called MyTaskRunnerTestDelegate in my_task_runner_unittest.cc
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 #include "base/single_thread_task_runner.h" 65 #include "base/single_thread_task_runner.h"
66 #include "base/synchronization/condition_variable.h" 66 #include "base/synchronization/condition_variable.h"
67 #include "base/synchronization/lock.h" 67 #include "base/synchronization/lock.h"
68 #include "base/task_runner.h" 68 #include "base/task_runner.h"
69 #include "base/threading/thread.h" 69 #include "base/threading/thread.h"
70 #include "base/tracked_objects.h" 70 #include "base/tracked_objects.h"
71 #include "testing/gtest/include/gtest/gtest.h" 71 #include "testing/gtest/include/gtest/gtest.h"
72 72
73 namespace base { 73 namespace base {
74 74
75 namespace internal { 75 namespace testing {
gab 2016/03/01 22:18:47 Let's do this change in another CL -- feel free to
robliao 2016/03/01 22:29:42 Since this is base/test, this should probably be n
fdoray 2016/03/02 00:38:41 TODO(fdoray): Do this in another CL before sending
76 76
77 // Utility class that keeps track of how many times particular tasks 77 // Utility class that keeps track of how many times particular tasks
78 // are run. 78 // are run.
79 class TaskTracker : public RefCountedThreadSafe<TaskTracker> { 79 class TaskTracker : public RefCountedThreadSafe<TaskTracker> {
80 public: 80 public:
81 TaskTracker(); 81 TaskTracker();
82 82
83 // Returns a closure that runs the given task and increments the run 83 // Returns a closure that runs the given task and increments the run
84 // count of |i| by one. |task| may be null. It is guaranteed that 84 // count of |i| by one. |task| may be null. It is guaranteed that
85 // only one task wrapped by a given tracker will be run at a time. 85 // only one task wrapped by a given tracker will be run at a time.
(...skipping 12 matching lines...) Expand all
98 void RunTask(const Closure& task, int i); 98 void RunTask(const Closure& task, int i);
99 99
100 mutable Lock lock_; 100 mutable Lock lock_;
101 std::map<int, int> task_run_counts_; 101 std::map<int, int> task_run_counts_;
102 int task_runs_; 102 int task_runs_;
103 ConditionVariable task_runs_cv_; 103 ConditionVariable task_runs_cv_;
104 104
105 DISALLOW_COPY_AND_ASSIGN(TaskTracker); 105 DISALLOW_COPY_AND_ASSIGN(TaskTracker);
106 }; 106 };
107 107
108 } // namespace internal 108 } // namespace testing
109 109
110 template <typename TaskRunnerTestDelegate> 110 template <typename TaskRunnerTestDelegate>
111 class TaskRunnerTest : public testing::Test { 111 class TaskRunnerTest : public ::testing::Test {
112 protected: 112 protected:
113 TaskRunnerTest() : task_tracker_(new internal::TaskTracker()) {} 113 TaskRunnerTest() : task_tracker_(new testing::TaskTracker()) {}
114 114
115 const scoped_refptr<internal::TaskTracker> task_tracker_; 115 const scoped_refptr<testing::TaskTracker> task_tracker_;
116 TaskRunnerTestDelegate delegate_; 116 TaskRunnerTestDelegate delegate_;
117 }; 117 };
118 118
119 TYPED_TEST_CASE_P(TaskRunnerTest); 119 TYPED_TEST_CASE_P(TaskRunnerTest);
120 120
121 // We can't really test much, since TaskRunner provides very few 121 // We can't really test much, since TaskRunner provides very few
122 // guarantees. 122 // guarantees.
123 123
124 // Post a bunch of tasks to the task runner. They should all 124 // Post a bunch of tasks to the task runner. They should all
125 // complete. 125 // complete.
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 this->delegate_.StopTaskRunner(); 164 this->delegate_.StopTaskRunner();
165 165
166 EXPECT_EQ(expected_task_run_counts, 166 EXPECT_EQ(expected_task_run_counts,
167 this->task_tracker_->GetTaskRunCounts()); 167 this->task_tracker_->GetTaskRunCounts());
168 } 168 }
169 169
170 // The TaskRunnerTest test case verifies behaviour that is expected from a 170 // The TaskRunnerTest test case verifies behaviour that is expected from a
171 // task runner in order to be conformant. 171 // task runner in order to be conformant.
172 REGISTER_TYPED_TEST_CASE_P(TaskRunnerTest, Basic, Delayed); 172 REGISTER_TYPED_TEST_CASE_P(TaskRunnerTest, Basic, Delayed);
173 173
174 namespace internal { 174 namespace testing {
175 175
176 // Calls RunsTasksOnCurrentThread() on |task_runner| and expects it to 176 // Calls RunsTasksOnCurrentThread() on |task_runner| and expects it to
177 // equal |expected_value|. 177 // equal |expected_value|.
178 void ExpectRunsTasksOnCurrentThread( 178 void ExpectRunsTasksOnCurrentThread(
179 bool expected_value, 179 bool expected_value,
180 const scoped_refptr<TaskRunner>& task_runner); 180 const scoped_refptr<TaskRunner>& task_runner);
181 181
182 } // namespace internal 182 } // namespace testing
183 183
184 template <typename TaskRunnerTestDelegate> 184 template <typename TaskRunnerTestDelegate>
185 class TaskRunnerAffinityTest : public TaskRunnerTest<TaskRunnerTestDelegate> {}; 185 class TaskRunnerAffinityTest : public TaskRunnerTest<TaskRunnerTestDelegate> {};
186 186
187 TYPED_TEST_CASE_P(TaskRunnerAffinityTest); 187 TYPED_TEST_CASE_P(TaskRunnerAffinityTest);
188 188
189 // Post a bunch of tasks to the task runner as well as to a separate 189 // Post a bunch of tasks to the task runner as well as to a separate
190 // thread, each checking the value of RunsTasksOnCurrentThread(), 190 // thread, each checking the value of RunsTasksOnCurrentThread(),
191 // which should return true for the tasks posted on the task runner 191 // which should return true for the tasks posted on the task runner
192 // and false for the tasks posted on the separate thread. 192 // and false for the tasks posted on the separate thread.
193 TYPED_TEST_P(TaskRunnerAffinityTest, RunsTasksOnCurrentThread) { 193 TYPED_TEST_P(TaskRunnerAffinityTest, RunsTasksOnCurrentThread) {
194 std::map<int, int> expected_task_run_counts; 194 std::map<int, int> expected_task_run_counts;
195 195
196 Thread thread("Non-task-runner thread"); 196 Thread thread("Non-task-runner thread");
197 ASSERT_TRUE(thread.Start()); 197 ASSERT_TRUE(thread.Start());
198 this->delegate_.StartTaskRunner(); 198 this->delegate_.StartTaskRunner();
199 199
200 scoped_refptr<TaskRunner> task_runner = this->delegate_.GetTaskRunner(); 200 scoped_refptr<TaskRunner> task_runner = this->delegate_.GetTaskRunner();
201 // Post each ith task i+1 times on the task runner and i+1 times on 201 // Post each ith task i+1 times on the task runner and i+1 times on
202 // the non-task-runner thread. 202 // the non-task-runner thread.
203 for (int i = 0; i < 20; ++i) { 203 for (int i = 0; i < 20; ++i) {
204 const Closure& ith_task_runner_task = 204 const Closure& ith_task_runner_task =
205 this->task_tracker_->WrapTask( 205 this->task_tracker_->WrapTask(
206 Bind(&internal::ExpectRunsTasksOnCurrentThread, 206 Bind(&testing::ExpectRunsTasksOnCurrentThread,
207 true, task_runner), 207 true, task_runner),
208 i); 208 i);
209 const Closure& ith_non_task_runner_task = 209 const Closure& ith_non_task_runner_task =
210 this->task_tracker_->WrapTask( 210 this->task_tracker_->WrapTask(
211 Bind(&internal::ExpectRunsTasksOnCurrentThread, 211 Bind(&testing::ExpectRunsTasksOnCurrentThread,
212 false, task_runner), 212 false, task_runner),
213 i); 213 i);
214 for (int j = 0; j < i + 1; ++j) { 214 for (int j = 0; j < i + 1; ++j) {
215 task_runner->PostTask(FROM_HERE, ith_task_runner_task); 215 task_runner->PostTask(FROM_HERE, ith_task_runner_task);
216 thread.task_runner()->PostTask(FROM_HERE, ith_non_task_runner_task); 216 thread.task_runner()->PostTask(FROM_HERE, ith_non_task_runner_task);
217 expected_task_run_counts[i] += 2; 217 expected_task_run_counts[i] += 2;
218 } 218 }
219 } 219 }
220 220
221 this->delegate_.StopTaskRunner(); 221 this->delegate_.StopTaskRunner();
222 thread.Stop(); 222 thread.Stop();
223 223
224 EXPECT_EQ(expected_task_run_counts, 224 EXPECT_EQ(expected_task_run_counts,
225 this->task_tracker_->GetTaskRunCounts()); 225 this->task_tracker_->GetTaskRunCounts());
226 } 226 }
227 227
228 // TaskRunnerAffinityTest tests that the TaskRunner implementation 228 // TaskRunnerAffinityTest tests that the TaskRunner implementation
229 // can determine if tasks will never be run on a specific thread. 229 // can determine if tasks will never be run on a specific thread.
230 REGISTER_TYPED_TEST_CASE_P(TaskRunnerAffinityTest, RunsTasksOnCurrentThread); 230 REGISTER_TYPED_TEST_CASE_P(TaskRunnerAffinityTest, RunsTasksOnCurrentThread);
231 231
232 } // namespace base 232 } // namespace base
233 233
234 #endif // BASE_TEST_TASK_RUNNER_TEST_TEMPLATE_H_ 234 #endif // BASE_TEST_TASK_RUNNER_TEST_TEMPLATE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698