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