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

Side by Side Diff: components/offline_pages/core/task_queue_unittest.cc

Issue 2359933007: [Offline pages] Introduces TaskQueue to serialize tasks that asynchronously access SQLStore (Closed)
Patch Set: Addressing feedback from Dmitry Created 4 years, 2 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
(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
OLDNEW
« no previous file with comments | « components/offline_pages/core/task_queue.cc ('k') | components/offline_pages/core/task_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698