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

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 gn problems, adding missing test file to build 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.HasTasks());
55 EXPECT_TRUE(queue.CurrentlyRunning());
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.CurrentlyRunning());
69 EXPECT_FALSE(queue.HasTasks());
70 }
71
72 TEST_F(OfflineTaskQueueTest, AddAndRunMultipleTasks) {
73 ConsumedResource resource;
Pete Williamson 2016/09/29 00:54:44 Would it be safer to have different resources for
fgorski 2016/09/29 17:37:37 No, why? The point is that tasks share the resourc
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.HasTasks());
85 EXPECT_TRUE(queue.CurrentlyRunning());
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, LeaveEearly) {
Pete Williamson 2016/09/29 00:54:44 nit - LeaveEearly -> LeaveEarly
fgorski 2016/09/29 17:37:37 Done.
101 ConsumedResource resource;
102 std::unique_ptr<TestTask> task(new TestTask(&resource, true));
103 TestTask* task_ptr = task.get();
104 TaskQueue queue;
105 EXPECT_EQ(TaskState::NOT_STARTED, task_ptr->state());
106 queue.AddTask(std::move(task));
107 EXPECT_TRUE(queue.HasTasks());
108 EXPECT_TRUE(queue.CurrentlyRunning());
109 EXPECT_EQ(TaskState::STEP_1, task_ptr->state());
110 EXPECT_TRUE(resource.HasNextStep());
111 resource.CompleteStep();
Pete Williamson 2016/09/29 00:54:44 I don't see how this causes an early exit. Commen
fgorski 2016/09/29 17:37:37 Done.
112
113 EXPECT_EQ(TaskState::COMPLETED, task_ptr->state());
114 EXPECT_FALSE(resource.HasNextStep());
115 PumpLoop(); // Deletes task, task_ptr is invalid after that.
116
117 EXPECT_FALSE(queue.CurrentlyRunning());
118 EXPECT_FALSE(queue.HasTasks());
119 }
120
121 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698