Index: base/task_scheduler/test_task_factory.cc |
diff --git a/base/task_scheduler/test_task_factory.cc b/base/task_scheduler/test_task_factory.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6bd54bfeab71b2e6866aac29a24a5cadbdfe09f8 |
--- /dev/null |
+++ b/base/task_scheduler/test_task_factory.cc |
@@ -0,0 +1,80 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/task_scheduler/test_task_factory.h" |
+ |
+#include "base/bind.h" |
+#include "base/bind_helpers.h" |
+#include "base/location.h" |
+#include "base/synchronization/waitable_event.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace base { |
+namespace internal { |
+ |
+TestTaskFactory::TestTaskFactory(scoped_refptr<TaskRunner> task_runner, |
+ ExecutionMode execution_mode) |
+ : cv_(&lock_), |
+ task_runner_(std::move(task_runner)), |
+ execution_mode_(execution_mode) { |
+ // Detach |thread_checker_| from the current thread. It will be attached to |
+ // the first thread that calls ThreadCheckerImpl::CalledOnValidThread(). |
+ thread_checker_.DetachFromThread(); |
+} |
+ |
+TestTaskFactory::~TestTaskFactory() { |
+ WaitForAllTasksToRun(); |
+} |
+ |
+void TestTaskFactory::PostTask(PostNestedTask post_nested_task, |
+ WaitableEvent* event) { |
+ AutoLock auto_lock(lock_); |
+ EXPECT_TRUE(task_runner_->PostTask( |
robliao
2016/04/21 01:38:17
Given that this is a utility, EXPECT_TRUE is proba
fdoray
2016/04/22 15:54:03
Moved the EXPECT_TRUE to callers.
Do you suggest
robliao
2016/04/22 23:04:19
The overarching question here is would consumers o
fdoray
2016/04/25 14:25:01
I added comments in the header file to document th
|
+ FROM_HERE, |
+ Bind(&TestTaskFactory::RunTaskCallback, Unretained(this), |
+ num_posted_tasks_++, post_nested_task, Unretained(event)))); |
+} |
+ |
+void TestTaskFactory::WaitForAllTasksToRun() const { |
+ AutoLock auto_lock(lock_); |
+ while (ran_tasks_.size() < num_posted_tasks_) |
+ cv_.Wait(); |
+} |
+ |
+void TestTaskFactory::RunTaskCallback(size_t task_index, |
+ PostNestedTask post_nested_task, |
+ WaitableEvent* event) { |
+ if (post_nested_task == PostNestedTask::YES) |
+ PostTask(PostNestedTask::NO, nullptr); |
+ |
+ EXPECT_TRUE(task_runner_->RunsTasksOnCurrentThread()); |
+ |
+ { |
+ AutoLock auto_lock(lock_); |
+ |
+ if (task_index >= num_posted_tasks_) |
+ ADD_FAILURE() << "A task with an invalid index ran."; |
+ |
+ if ((execution_mode_ == ExecutionMode::SINGLE_THREADED || |
+ execution_mode_ == ExecutionMode::SEQUENCED) && |
+ task_index != ran_tasks_.size()) { |
+ ADD_FAILURE() << "A task didn't run in the expected order."; |
+ } |
+ |
+ if (execution_mode_ == ExecutionMode::SINGLE_THREADED) |
+ EXPECT_TRUE(thread_checker_.CalledOnValidThread()); |
+ |
+ if (ran_tasks_.find(task_index) != ran_tasks_.end()) |
+ ADD_FAILURE() << "A task ran more than once."; |
+ ran_tasks_.insert(task_index); |
+ |
+ cv_.Signal(); |
+ } |
+ |
+ if (event) |
+ event->Wait(); |
+} |
+ |
+} // namespace internal |
+} // namespace base |