| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "components/offline_pages/core/task_queue.h" |
| 6 |
| 7 #include <memory> |
| 8 |
| 9 #include "base/bind.h" |
| 10 #include "base/test/test_simple_task_runner.h" |
| 11 #include "base/threading/thread_task_runner_handle.h" |
| 12 #include "components/offline_pages/core/test_task.h" |
| 13 #include "testing/gtest/include/gtest/gtest.h" |
| 14 |
| 15 namespace offline_pages { |
| 16 |
| 17 using TaskState = TestTask::TaskState; |
| 18 |
| 19 class OfflineTaskQueueTest : public testing::Test { |
| 20 public: |
| 21 OfflineTaskQueueTest(); |
| 22 |
| 23 void TaskCompleted(Task* task); |
| 24 void PumpLoop(); |
| 25 |
| 26 Task* completed_task() const { return completed_task_; } |
| 27 |
| 28 private: |
| 29 Task* completed_task_; |
| 30 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 31 base::ThreadTaskRunnerHandle task_runner_handle_; |
| 32 }; |
| 33 |
| 34 OfflineTaskQueueTest::OfflineTaskQueueTest() |
| 35 : completed_task_(nullptr), |
| 36 task_runner_(new base::TestSimpleTaskRunner), |
| 37 task_runner_handle_(task_runner_) {} |
| 38 |
| 39 void OfflineTaskQueueTest::PumpLoop() { |
| 40 task_runner_->RunUntilIdle(); |
| 41 } |
| 42 |
| 43 void OfflineTaskQueueTest::TaskCompleted(Task* task) { |
| 44 completed_task_ = task; |
| 45 } |
| 46 |
| 47 TEST_F(OfflineTaskQueueTest, AddAndRunSingleTask) { |
| 48 ConsumedResource resource; |
| 49 std::unique_ptr<TestTask> task(new TestTask(&resource)); |
| 50 TestTask* task_ptr = task.get(); |
| 51 TaskQueue queue; |
| 52 EXPECT_EQ(TaskState::NOT_STARTED, task_ptr->state()); |
| 53 queue.AddTask(std::move(task)); |
| 54 EXPECT_TRUE(queue.HasPendingTasks()); |
| 55 EXPECT_TRUE(queue.HasRunningTask()); |
| 56 EXPECT_EQ(TaskState::STEP_1, task_ptr->state()); |
| 57 EXPECT_TRUE(resource.HasNextStep()); |
| 58 resource.CompleteStep(); |
| 59 |
| 60 EXPECT_EQ(TaskState::STEP_2, task_ptr->state()); |
| 61 EXPECT_TRUE(resource.HasNextStep()); |
| 62 resource.CompleteStep(); |
| 63 |
| 64 EXPECT_EQ(TaskState::COMPLETED, task_ptr->state()); |
| 65 EXPECT_FALSE(resource.HasNextStep()); |
| 66 PumpLoop(); // Deletes task, task_ptr is invalid after that. |
| 67 |
| 68 EXPECT_FALSE(queue.HasRunningTask()); |
| 69 EXPECT_FALSE(queue.HasPendingTasks()); |
| 70 } |
| 71 |
| 72 TEST_F(OfflineTaskQueueTest, AddAndRunMultipleTasks) { |
| 73 ConsumedResource resource; |
| 74 std::unique_ptr<TestTask> task_1(new TestTask(&resource)); |
| 75 TestTask* task_1_ptr = task_1.get(); |
| 76 std::unique_ptr<TestTask> task_2(new TestTask(&resource)); |
| 77 TestTask* task_2_ptr = task_2.get(); |
| 78 |
| 79 TaskQueue queue; |
| 80 EXPECT_EQ(TaskState::NOT_STARTED, task_1_ptr->state()); |
| 81 EXPECT_EQ(TaskState::NOT_STARTED, task_2_ptr->state()); |
| 82 queue.AddTask(std::move(task_1)); |
| 83 queue.AddTask(std::move(task_2)); |
| 84 EXPECT_TRUE(queue.HasPendingTasks()); |
| 85 EXPECT_TRUE(queue.HasRunningTask()); |
| 86 EXPECT_EQ(TaskState::STEP_1, task_1_ptr->state()); |
| 87 EXPECT_EQ(TaskState::NOT_STARTED, task_2_ptr->state()); |
| 88 resource.CompleteStep(); |
| 89 |
| 90 EXPECT_EQ(TaskState::STEP_2, task_1_ptr->state()); |
| 91 EXPECT_EQ(TaskState::NOT_STARTED, task_2_ptr->state()); |
| 92 resource.CompleteStep(); |
| 93 |
| 94 EXPECT_EQ(TaskState::COMPLETED, task_1_ptr->state()); |
| 95 EXPECT_EQ(TaskState::NOT_STARTED, task_2_ptr->state()); |
| 96 PumpLoop(); // Deletes task_1, task_1_ptr is invalid after that. |
| 97 EXPECT_EQ(TaskState::STEP_1, task_2_ptr->state()); |
| 98 } |
| 99 |
| 100 TEST_F(OfflineTaskQueueTest, LeaveEarly) { |
| 101 ConsumedResource resource; |
| 102 std::unique_ptr<TestTask> task( |
| 103 new TestTask(&resource, true /* leave early */)); |
| 104 TestTask* task_ptr = task.get(); |
| 105 TaskQueue queue; |
| 106 EXPECT_EQ(TaskState::NOT_STARTED, task_ptr->state()); |
| 107 queue.AddTask(std::move(task)); |
| 108 EXPECT_TRUE(queue.HasPendingTasks()); |
| 109 EXPECT_TRUE(queue.HasRunningTask()); |
| 110 EXPECT_EQ(TaskState::STEP_1, task_ptr->state()); |
| 111 EXPECT_TRUE(resource.HasNextStep()); |
| 112 resource.CompleteStep(); |
| 113 |
| 114 // Notice STEP_2 was omitted and task went from STEP_1 to completed. |
| 115 EXPECT_EQ(TaskState::COMPLETED, task_ptr->state()); |
| 116 EXPECT_FALSE(resource.HasNextStep()); |
| 117 PumpLoop(); // Deletes task, task_ptr is invalid after that. |
| 118 |
| 119 EXPECT_FALSE(queue.HasPendingTasks()); |
| 120 EXPECT_FALSE(queue.HasRunningTask()); |
| 121 } |
| 122 |
| 123 } // namespace offline_pages |
| OLD | NEW |