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/background/remove_requests_task.h"
6
7 #include <memory>
8
9 #include "base/bind.h"
10 #include "base/callback_helpers.h"
11 #include "base/test/test_mock_time_task_runner.h"
12 #include "base/threading/thread_task_runner_handle.h"
13 #include "components/offline_pages/core/background/request_queue_store.h"
14 #include "components/offline_pages/core/background/request_queue_task_test_base.h"
15 #include "components/offline_pages/core/background/test_request_queue_store.h"
16 #include "components/offline_pages/core/offline_clock.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18
19 namespace offline_pages {
20 namespace {
21 const int64_t kRequestId1 = 42;
22 const int64_t kRequestId2 = 43;
23 const int64_t kRequestId3 = 44;
24
25 const ClientId kClientId1("bookmark", "1234");
26 const ClientId kClientId2("async", "5678");
27
28 // TODO(https://crbug.com/1042727): Fix test GURL scoping and remove this getter
29 // function.
Url1()30 GURL Url1() {
31 return GURL("http://example.com");
32 }
Url2()33 GURL Url2() {
34 return GURL("http://another-example.com");
35 }
36
37 class RemoveRequestsTaskTest : public RequestQueueTaskTestBase {
38 public:
RemoveRequestsTaskTest()39 RemoveRequestsTaskTest() {}
~RemoveRequestsTaskTest()40 ~RemoveRequestsTaskTest() override {}
41
42 void PumpLoop();
43
44 void AddRequestsToStore();
45 void RemoveRequestsCallback(UpdateRequestsResult result);
46
last_result() const47 UpdateRequestsResult* last_result() const { return result_.get(); }
48
49 private:
AddRequestDone(AddRequestResult result)50 static void AddRequestDone(AddRequestResult result) {
51 ASSERT_EQ(AddRequestResult::SUCCESS, result);
52 }
53
54 std::unique_ptr<UpdateRequestsResult> result_;
55 };
56
PumpLoop()57 void RemoveRequestsTaskTest::PumpLoop() {
58 task_runner_->RunUntilIdle();
59 }
60
AddRequestsToStore()61 void RemoveRequestsTaskTest::AddRequestsToStore() {
62 base::Time creation_time = OfflineTimeNow();
63 SavePageRequest request_1(kRequestId1, Url1(), kClientId1, creation_time,
64 true);
65 store_.AddRequest(request_1, RequestQueue::AddOptions(),
66 base::BindOnce(&RemoveRequestsTaskTest::AddRequestDone));
67 SavePageRequest request_2(kRequestId2, Url2(), kClientId2, creation_time,
68 true);
69 store_.AddRequest(request_2, RequestQueue::AddOptions(),
70 base::BindOnce(&RemoveRequestsTaskTest::AddRequestDone));
71 PumpLoop();
72 }
73
RemoveRequestsCallback(UpdateRequestsResult result)74 void RemoveRequestsTaskTest::RemoveRequestsCallback(
75 UpdateRequestsResult result) {
76 result_ = std::make_unique<UpdateRequestsResult>(std::move(result));
77 }
78
TEST_F(RemoveRequestsTaskTest,RemoveWhenStoreEmpty)79 TEST_F(RemoveRequestsTaskTest, RemoveWhenStoreEmpty) {
80 InitializeStore();
81
82 std::vector<int64_t> request_ids{kRequestId1};
83 RemoveRequestsTask task(
84 &store_, request_ids,
85 base::BindOnce(&RemoveRequestsTaskTest::RemoveRequestsCallback,
86 base::Unretained(this)));
87 task.Execute(base::DoNothing());
88 PumpLoop();
89 ASSERT_TRUE(last_result());
90 EXPECT_EQ(1UL, last_result()->item_statuses.size());
91 EXPECT_EQ(kRequestId1, last_result()->item_statuses.at(0).first);
92 EXPECT_EQ(ItemActionStatus::NOT_FOUND,
93 last_result()->item_statuses.at(0).second);
94 EXPECT_EQ(0UL, last_result()->updated_items.size());
95 }
96
TEST_F(RemoveRequestsTaskTest,RemoveSingleItem)97 TEST_F(RemoveRequestsTaskTest, RemoveSingleItem) {
98 InitializeStore();
99 AddRequestsToStore();
100
101 std::vector<int64_t> request_ids{kRequestId1};
102 RemoveRequestsTask task(
103 &store_, request_ids,
104 base::BindOnce(&RemoveRequestsTaskTest::RemoveRequestsCallback,
105 base::Unretained(this)));
106 task.Execute(base::DoNothing());
107 PumpLoop();
108 ASSERT_TRUE(last_result());
109 EXPECT_EQ(1UL, last_result()->item_statuses.size());
110 EXPECT_EQ(kRequestId1, last_result()->item_statuses.at(0).first);
111 EXPECT_EQ(ItemActionStatus::SUCCESS,
112 last_result()->item_statuses.at(0).second);
113 EXPECT_EQ(1UL, last_result()->updated_items.size());
114 EXPECT_EQ(kRequestId1, last_result()->updated_items.at(0).request_id());
115 }
116
TEST_F(RemoveRequestsTaskTest,RemoveMultipleItems)117 TEST_F(RemoveRequestsTaskTest, RemoveMultipleItems) {
118 InitializeStore();
119 AddRequestsToStore();
120
121 std::vector<int64_t> request_ids{kRequestId1, kRequestId2};
122 RemoveRequestsTask task(
123 &store_, request_ids,
124 base::BindOnce(&RemoveRequestsTaskTest::RemoveRequestsCallback,
125 base::Unretained(this)));
126 task.Execute(base::DoNothing());
127 PumpLoop();
128 ASSERT_TRUE(last_result());
129 EXPECT_EQ(2UL, last_result()->item_statuses.size());
130 EXPECT_EQ(kRequestId1, last_result()->item_statuses.at(0).first);
131 EXPECT_EQ(ItemActionStatus::SUCCESS,
132 last_result()->item_statuses.at(0).second);
133 EXPECT_EQ(kRequestId2, last_result()->item_statuses.at(1).first);
134 EXPECT_EQ(ItemActionStatus::SUCCESS,
135 last_result()->item_statuses.at(1).second);
136 EXPECT_EQ(2UL, last_result()->updated_items.size());
137 EXPECT_EQ(kRequestId1, last_result()->updated_items.at(0).request_id());
138 EXPECT_EQ(kRequestId2, last_result()->updated_items.at(1).request_id());
139 }
140
TEST_F(RemoveRequestsTaskTest,DeleteWithEmptyIdList)141 TEST_F(RemoveRequestsTaskTest, DeleteWithEmptyIdList) {
142 InitializeStore();
143
144 std::vector<int64_t> request_ids;
145 RemoveRequestsTask task(
146 &store_, request_ids,
147 base::BindOnce(&RemoveRequestsTaskTest::RemoveRequestsCallback,
148 base::Unretained(this)));
149 task.Execute(base::DoNothing());
150 PumpLoop();
151 ASSERT_TRUE(last_result());
152 EXPECT_EQ(0UL, last_result()->item_statuses.size());
153 EXPECT_EQ(0UL, last_result()->updated_items.size());
154 }
155
TEST_F(RemoveRequestsTaskTest,RemoveMissingItem)156 TEST_F(RemoveRequestsTaskTest, RemoveMissingItem) {
157 InitializeStore();
158 AddRequestsToStore();
159
160 std::vector<int64_t> request_ids{kRequestId1, kRequestId3};
161 RemoveRequestsTask task(
162 &store_, request_ids,
163 base::BindOnce(&RemoveRequestsTaskTest::RemoveRequestsCallback,
164 base::Unretained(this)));
165 task.Execute(base::DoNothing());
166 PumpLoop();
167 ASSERT_TRUE(last_result());
168 EXPECT_EQ(2UL, last_result()->item_statuses.size());
169 EXPECT_EQ(kRequestId1, last_result()->item_statuses.at(0).first);
170 EXPECT_EQ(ItemActionStatus::SUCCESS,
171 last_result()->item_statuses.at(0).second);
172 EXPECT_EQ(kRequestId3, last_result()->item_statuses.at(1).first);
173 EXPECT_EQ(ItemActionStatus::NOT_FOUND,
174 last_result()->item_statuses.at(1).second);
175 EXPECT_EQ(1UL, last_result()->updated_items.size());
176 EXPECT_EQ(kRequestId1, last_result()->updated_items.at(0).request_id());
177 }
178
179 } // namespace
180 } // namespace offline_pages
181