Chromium Code Reviews| Index: cc/resources/worker_pool_unittest.cc |
| diff --git a/cc/resources/worker_pool_unittest.cc b/cc/resources/worker_pool_unittest.cc |
| old mode 100644 |
| new mode 100755 |
| index f7c5a951df6de92dffb4b344f2fce408b06f3298..a37df64a0366114a25d16d36ee48e61caec3f3bd |
| --- a/cc/resources/worker_pool_unittest.cc |
| +++ b/cc/resources/worker_pool_unittest.cc |
| @@ -6,6 +6,7 @@ |
| #include <vector> |
| +#include "base/memory/scoped_vector.h" |
| #include "cc/base/completion_event.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| @@ -13,6 +14,8 @@ namespace cc { |
| namespace { |
| +const int kWorkerPoolCount = 3; |
| + |
| class FakeWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
| public: |
| FakeWorkerPoolTaskImpl(const base::Closure& callback, |
| @@ -60,7 +63,7 @@ class FakeWorkerPool : public WorkerPool { |
| unsigned dependent_count; |
| unsigned priority; |
| }; |
| - FakeWorkerPool() : WorkerPool(1, "test") {} |
| + FakeWorkerPool() : WorkerPool() {} |
| virtual ~FakeWorkerPool() {} |
| static scoped_ptr<FakeWorkerPool> Create() { |
| @@ -144,249 +147,310 @@ class WorkerPoolTest : public testing::Test { |
| // Overridden from testing::Test: |
| virtual void SetUp() OVERRIDE { |
| - worker_pool_ = FakeWorkerPool::Create(); |
| + for (int i = 0; i < kWorkerPoolCount; ++i) |
| + worker_pools_.push_back(FakeWorkerPool::Create().release()); |
|
reveman
2014/01/14 07:35:44
nit: push_back(Create().release()) is awkward. Cou
sohanjg
2014/01/14 08:10:00
Done.
|
| } |
| virtual void TearDown() OVERRIDE { |
| - worker_pool_->Shutdown(); |
| - worker_pool_->CheckForCompletedTasks(); |
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + worker_pools_[i]->Shutdown(); |
| + worker_pools_[i]->CheckForCompletedTasks(); |
| + } |
| } |
| - void ResetIds() { |
| - run_task_ids_.clear(); |
| - on_task_completed_ids_.clear(); |
| + void ResetIAllWorkerPoolds() { |
|
reveman
2014/01/14 07:35:44
Typo in function name: s/ResetIAllWorkerPoolds/Res
sohanjg
2014/01/14 08:10:00
Done.
|
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + run_task_ids_[i].clear(); |
| + on_task_completed_ids_[i].clear(); |
| + } |
| } |
| - void RunAllTasks() { |
| - worker_pool_->WaitForTasksToComplete(); |
| - worker_pool_->CheckForCompletedTasks(); |
| + void RunAllTasksforWorkerPool(int worker_pool_index) { |
| + worker_pools_[worker_pool_index]->WaitForTasksToComplete(); |
| + worker_pools_[worker_pool_index]->CheckForCompletedTasks(); |
| } |
| - FakeWorkerPool* worker_pool() { |
| - return worker_pool_.get(); |
| + FakeWorkerPool* worker_pool(int worker_pool_index) { |
| + return worker_pools_[worker_pool_index]; |
| } |
| - void RunTask(unsigned id) { |
| - run_task_ids_.push_back(id); |
| + void RunTask(int worker_pool_index, unsigned id) { |
| + run_task_ids_[worker_pool_index].push_back(id); |
| } |
| - void OnTaskCompleted(unsigned id) { |
| - on_task_completed_ids_.push_back(id); |
| + void OnTaskCompleted(int worker_pool_index, unsigned id) { |
| + on_task_completed_ids_[worker_pool_index].push_back(id); |
| } |
| - const std::vector<unsigned>& run_task_ids() { |
| - return run_task_ids_; |
| + const std::vector<unsigned>& run_task_ids(int worker_pool_index) { |
| + return run_task_ids_[worker_pool_index]; |
| } |
| - const std::vector<unsigned>& on_task_completed_ids() { |
| - return on_task_completed_ids_; |
| + const std::vector<unsigned>& on_task_completed_ids(int worker_pool_index) { |
| + return on_task_completed_ids_[worker_pool_index]; |
| } |
| private: |
| - scoped_ptr<FakeWorkerPool> worker_pool_; |
| - std::vector<unsigned> run_task_ids_; |
| - std::vector<unsigned> on_task_completed_ids_; |
| + ScopedVector<FakeWorkerPool> worker_pools_; |
| + std::vector<unsigned> run_task_ids_[kWorkerPoolCount]; |
| + std::vector<unsigned> on_task_completed_ids_[kWorkerPoolCount]; |
| }; |
| TEST_F(WorkerPoolTest, Basic) { |
| - EXPECT_EQ(0u, run_task_ids().size()); |
| - EXPECT_EQ(0u, on_task_completed_ids().size()); |
| - |
| - worker_pool()->ScheduleTasks( |
| - std::vector<FakeWorkerPool::Task>( |
| - 1, |
| - FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| - base::Unretained(this), |
| - 0u), |
| - base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| - base::Unretained(this), |
| - 0u), |
| - base::Closure(), |
| - 1u, |
| - 0u))); |
| - RunAllTasks(); |
| - |
| - EXPECT_EQ(1u, run_task_ids().size()); |
| - EXPECT_EQ(1u, on_task_completed_ids().size()); |
| - |
| - worker_pool()->ScheduleTasks( |
| - std::vector<FakeWorkerPool::Task>( |
| - 1, |
| - FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| - base::Unretained(this), |
| - 0u), |
| - base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| - base::Unretained(this), |
| - 0u), |
| - base::Bind(&WorkerPoolTest::RunTask, |
| - base::Unretained(this), |
| - 0u), |
| - 1u, |
| - 0u))); |
| - RunAllTasks(); |
| - |
| - EXPECT_EQ(3u, run_task_ids().size()); |
| - EXPECT_EQ(2u, on_task_completed_ids().size()); |
| - |
| - worker_pool()->ScheduleTasks( |
| - std::vector<FakeWorkerPool::Task>( |
| - 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| - base::Unretained(this), |
| - 0u), |
| - base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| - base::Unretained(this), |
| - 0u), |
| - base::Bind(&WorkerPoolTest::RunTask, |
| - base::Unretained(this), |
| - 0u), |
| - 2u, |
| - 0u))); |
| - RunAllTasks(); |
| - |
| - EXPECT_EQ(6u, run_task_ids().size()); |
| - EXPECT_EQ(3u, on_task_completed_ids().size()); |
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + EXPECT_EQ(0u, run_task_ids(i).size()); |
| + EXPECT_EQ(0u, on_task_completed_ids(i).size()); |
| + |
| + worker_pool(i)->ScheduleTasks( |
| + std::vector<FakeWorkerPool::Task>( |
| + 1, |
| + FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| + base::Unretained(this), |
| + i, |
| + 0u), |
| + base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| + base::Unretained(this), |
| + i, |
| + 0u), |
| + base::Closure(), |
| + 1u, |
| + 0u))); |
| + } |
|
reveman
2014/01/14 07:35:44
nit: think blank line after this would look better
sohanjg
2014/01/14 08:10:00
Done.
|
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + RunAllTasksforWorkerPool(i); |
| + |
| + EXPECT_EQ(1u, run_task_ids(i).size()); |
| + EXPECT_EQ(1u, on_task_completed_ids(i).size()); |
| + } |
| + |
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + worker_pool(i)->ScheduleTasks( |
| + std::vector<FakeWorkerPool::Task>( |
| + 1, |
| + FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| + base::Unretained(this), |
| + i, |
| + 0u), |
| + base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| + base::Unretained(this), |
| + i, |
| + 0u), |
| + base::Bind(&WorkerPoolTest::RunTask, |
| + base::Unretained(this), |
| + i, |
| + 0u), |
| + 1u, |
| + 0u))); |
| + } |
|
reveman
2014/01/14 07:35:44
nit: and blank line here
sohanjg
2014/01/14 08:10:00
Done.
|
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + RunAllTasksforWorkerPool(i); |
| + |
| + EXPECT_EQ(3u, run_task_ids(i).size()); |
| + EXPECT_EQ(2u, on_task_completed_ids(i).size()); |
| + } |
| + |
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + worker_pool(i)->ScheduleTasks( |
| + std::vector<FakeWorkerPool::Task>( |
| + 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| + base::Unretained(this), |
| + i, |
| + 0u), |
| + base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| + base::Unretained(this), |
| + i, |
| + 0u), |
| + base::Bind(&WorkerPoolTest::RunTask, |
| + base::Unretained(this), |
| + i, |
| + 0u), |
| + 2u, |
| + 0u))); |
| + } |
|
reveman
2014/01/14 07:35:44
nit: and blank line here
|
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + RunAllTasksforWorkerPool(i); |
| + |
| + EXPECT_EQ(6u, run_task_ids(i).size()); |
| + EXPECT_EQ(3u, on_task_completed_ids(i).size()); |
| + } |
| } |
| TEST_F(WorkerPoolTest, Dependencies) { |
| - worker_pool()->ScheduleTasks( |
| - std::vector<FakeWorkerPool::Task>( |
| - 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| - base::Unretained(this), |
| - 0u), |
| - base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| - base::Unretained(this), |
| - 0u), |
| - base::Bind(&WorkerPoolTest::RunTask, |
| - base::Unretained(this), |
| - 1u), |
| - 1u, |
| - 0u))); |
| - RunAllTasks(); |
| - |
| - // Check if task ran before dependent. |
| - ASSERT_EQ(2u, run_task_ids().size()); |
| - EXPECT_EQ(0u, run_task_ids()[0]); |
| - EXPECT_EQ(1u, run_task_ids()[1]); |
| - ASSERT_EQ(1u, on_task_completed_ids().size()); |
| - EXPECT_EQ(0u, on_task_completed_ids()[0]); |
| - |
| - worker_pool()->ScheduleTasks( |
| - std::vector<FakeWorkerPool::Task>( |
| - 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| - base::Unretained(this), |
| - 2u), |
| - base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| - base::Unretained(this), |
| - 2u), |
| - base::Bind(&WorkerPoolTest::RunTask, |
| - base::Unretained(this), |
| - 3u), |
| - 2u, |
| - 0u))); |
| - RunAllTasks(); |
| - |
| - // Task should only run once. |
| - ASSERT_EQ(5u, run_task_ids().size()); |
| - EXPECT_EQ(2u, run_task_ids()[2]); |
| - EXPECT_EQ(3u, run_task_ids()[3]); |
| - EXPECT_EQ(3u, run_task_ids()[4]); |
| - ASSERT_EQ(2u, on_task_completed_ids().size()); |
| - EXPECT_EQ(2u, on_task_completed_ids()[1]); |
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + worker_pool(i)->ScheduleTasks( |
| + std::vector<FakeWorkerPool::Task>( |
| + 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| + base::Unretained(this), |
| + i, |
| + 0u), |
| + base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| + base::Unretained(this), |
| + i, |
| + 0u), |
| + base::Bind(&WorkerPoolTest::RunTask, |
| + base::Unretained(this), |
| + i, |
| + 1u), |
| + 1u, |
| + 0u))); |
| + } |
|
reveman
2014/01/14 07:35:44
nit: and blank line here
sohanjg
2014/01/14 08:10:00
Done.
|
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + RunAllTasksforWorkerPool(i); |
| + |
| + // Check if task ran before dependent. |
| + ASSERT_EQ(2u, run_task_ids(i).size()); |
| + EXPECT_EQ(0u, run_task_ids(i)[0]); |
| + EXPECT_EQ(1u, run_task_ids(i)[1]); |
| + ASSERT_EQ(1u, on_task_completed_ids(i).size()); |
| + EXPECT_EQ(0u, on_task_completed_ids(i)[0]); |
| + } |
| + |
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + worker_pool(i)->ScheduleTasks( |
| + std::vector<FakeWorkerPool::Task>( |
| + 1, FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| + base::Unretained(this), |
| + i, |
| + 2u), |
| + base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| + base::Unretained(this), |
| + i, |
| + 2u), |
| + base::Bind(&WorkerPoolTest::RunTask, |
| + base::Unretained(this), |
| + i, |
| + 3u), |
| + 2u, |
| + 0u))); |
| + } |
| + |
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + RunAllTasksforWorkerPool(i); |
| + |
| + // Task should only run once. |
| + ASSERT_EQ(5u, run_task_ids(i).size()); |
| + EXPECT_EQ(2u, run_task_ids(i)[2]); |
| + EXPECT_EQ(3u, run_task_ids(i)[3]); |
| + EXPECT_EQ(3u, run_task_ids(i)[4]); |
| + ASSERT_EQ(2u, on_task_completed_ids(i).size()); |
| + EXPECT_EQ(2u, on_task_completed_ids(i)[1]); |
| + } |
| } |
| TEST_F(WorkerPoolTest, Priority) { |
| - { |
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| FakeWorkerPool::Task tasks[] = { |
| FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| base::Unretained(this), |
| + i, |
| 0u), |
| base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| base::Unretained(this), |
| + i, |
| 0u), |
| base::Bind(&WorkerPoolTest::RunTask, |
| base::Unretained(this), |
| + i, |
| 2u), |
| 1u, |
| 1u), // Priority 1 |
| FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| base::Unretained(this), |
| + i, |
| 1u), |
| base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| base::Unretained(this), |
| + i, |
| 1u), |
| base::Bind(&WorkerPoolTest::RunTask, |
| base::Unretained(this), |
| + i, |
| 3u), |
| 1u, |
| 0u) // Priority 0 |
| }; |
| - worker_pool()->ScheduleTasks( |
| + worker_pool(i)->ScheduleTasks( |
| std::vector<FakeWorkerPool::Task>(tasks, tasks + arraysize(tasks))); |
| } |
| - RunAllTasks(); |
| - |
| - // Check if tasks ran in order of priority. |
| - ASSERT_EQ(4u, run_task_ids().size()); |
| - EXPECT_EQ(1u, run_task_ids()[0]); |
| - EXPECT_EQ(3u, run_task_ids()[1]); |
| - EXPECT_EQ(0u, run_task_ids()[2]); |
| - EXPECT_EQ(2u, run_task_ids()[3]); |
| - ASSERT_EQ(2u, on_task_completed_ids().size()); |
| - EXPECT_EQ(1u, on_task_completed_ids()[0]); |
| - EXPECT_EQ(0u, on_task_completed_ids()[1]); |
| - |
| - ResetIds(); |
| - { |
| + |
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + RunAllTasksforWorkerPool(i); |
| + |
| + // Check if tasks ran in order of priority. |
| + ASSERT_EQ(4u, run_task_ids(i).size()); |
| + EXPECT_EQ(1u, run_task_ids(i)[0]); |
| + EXPECT_EQ(3u, run_task_ids(i)[1]); |
| + EXPECT_EQ(0u, run_task_ids(i)[2]); |
| + EXPECT_EQ(2u, run_task_ids(i)[3]); |
| + ASSERT_EQ(2u, on_task_completed_ids(i).size()); |
| + EXPECT_EQ(1u, on_task_completed_ids(i)[0]); |
| + EXPECT_EQ(0u, on_task_completed_ids(i)[1]); |
| + } |
| + |
| + ResetIAllWorkerPoolds(); |
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| std::vector<FakeWorkerPool::Task> tasks; |
| tasks.push_back( |
| FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| base::Unretained(this), |
| + i, |
| 0u), |
| base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| base::Unretained(this), |
| + i, |
| 0u), |
| base::Bind(&WorkerPoolTest::RunTask, |
| base::Unretained(this), |
| + i, |
| 3u), |
| 1u, // 1 dependent |
| 1u)); // Priority 1 |
| tasks.push_back( |
| FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| base::Unretained(this), |
| + i, |
| 1u), |
| base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| base::Unretained(this), |
| + i, |
| 1u), |
| base::Bind(&WorkerPoolTest::RunTask, |
| base::Unretained(this), |
| + i, |
| 4u), |
| 2u, // 2 dependents |
| 1u)); // Priority 1 |
| tasks.push_back( |
| FakeWorkerPool::Task(base::Bind(&WorkerPoolTest::RunTask, |
| base::Unretained(this), |
| + i, |
| 2u), |
| base::Bind(&WorkerPoolTest::OnTaskCompleted, |
| base::Unretained(this), |
| + i, |
| 2u), |
| base::Bind(&WorkerPoolTest::RunTask, |
| base::Unretained(this), |
| + i, |
| 5u), |
| 1u, // 1 dependent |
| 0u)); // Priority 0 |
| - worker_pool()->ScheduleTasks(tasks); |
| + worker_pool(i)->ScheduleTasks(tasks); |
| + } |
| + |
| + for (int i = 0; i < kWorkerPoolCount; ++i) { |
| + RunAllTasksforWorkerPool(i); |
| + |
| + // Check if tasks ran in order of priority and that task with more |
| + // dependents ran first when priority is the same. |
| + ASSERT_LE(3u, run_task_ids(i).size()); |
| + EXPECT_EQ(2u, run_task_ids(i)[0]); |
| + EXPECT_EQ(5u, run_task_ids(i)[1]); |
| + EXPECT_EQ(1u, run_task_ids(i)[2]); |
| + ASSERT_EQ(3u, on_task_completed_ids(i).size()); |
| + EXPECT_EQ(2u, on_task_completed_ids(i)[0]); |
| + EXPECT_EQ(1u, on_task_completed_ids(i)[1]); |
| + EXPECT_EQ(0u, on_task_completed_ids(i)[2]); |
| } |
| - RunAllTasks(); |
| - |
| - // Check if tasks ran in order of priority and that task with more |
| - // dependents ran first when priority is the same. |
| - ASSERT_LE(3u, run_task_ids().size()); |
| - EXPECT_EQ(2u, run_task_ids()[0]); |
| - EXPECT_EQ(5u, run_task_ids()[1]); |
| - EXPECT_EQ(1u, run_task_ids()[2]); |
| - ASSERT_EQ(3u, on_task_completed_ids().size()); |
| - EXPECT_EQ(2u, on_task_completed_ids()[0]); |
| - EXPECT_EQ(1u, on_task_completed_ids()[1]); |
| - EXPECT_EQ(0u, on_task_completed_ids()[2]); |
| } |
| } // namespace |