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

Side by Side Diff: components/offline_pages/core/background/reconcile_task_unittest.cc

Issue 2568613002: Reconcile the request queue on startup. (Closed)
Patch Set: compile fix Created 4 years 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/background/reconcile_task.h"
6
7 #include <memory>
8 #include <set>
9
10 #include "base/bind.h"
11 #include "base/test/test_simple_task_runner.h"
12 #include "base/threading/thread_task_runner_handle.h"
13 #include "components/offline_pages/core/background/request_coordinator.h"
14 #include "components/offline_pages/core/background/request_queue_in_memory_store .h"
15 #include "components/offline_pages/core/background/request_queue_store.h"
16 #include "components/offline_pages/core/background/save_page_request.h"
17 #include "testing/gtest/include/gtest/gtest.h"
18
19 namespace offline_pages {
20
21 namespace {
22 // Data for request 1.
23 const int64_t kRequestId1 = 17;
24 const GURL kUrl1("https://google.com");
25 const ClientId kClientId1("bookmark", "1234");
26 // Data for request 2.
27 const int64_t kRequestId2 = 42;
28 const GURL kUrl2("http://nytimes.com");
29 const ClientId kClientId2("bookmark", "5678");
30 const bool kUserRequested = true;
31
32 // Default request
33 const SavePageRequest kEmptyRequest(0UL,
34 GURL(""),
35 ClientId("", ""),
36 base::Time(),
37 true);
38 } // namespace
39
40 class ReconcileTaskTest : public testing::Test {
41 public:
42 ReconcileTaskTest();
43
44 ~ReconcileTaskTest() override;
45
46 void SetUp() override;
47
48 void PumpLoop();
49
50 void AddRequestDone(ItemActionStatus status);
51
52 void GetRequestsCallback(
53 bool success,
54 std::vector<std::unique_ptr<SavePageRequest>> requests);
55
56 void ReconcileCallback(std::unique_ptr<UpdateRequestsResult> result);
57
58 void QueueRequests(const SavePageRequest& request1,
59 const SavePageRequest& request2);
60
61 // Reset the factory and the task using the current policy.
62 void MakeTask();
63
64 ReconcileTask* task() { return task_.get(); }
65 RequestQueueStore* store() { return store_.get(); }
66 std::vector<std::unique_ptr<SavePageRequest>>& found_requests() {
67 return found_requests_;
68 }
69
70 protected:
71 void InitializeStoreDone(bool success);
72
73 std::unique_ptr<RequestQueueStore> store_;
74 std::unique_ptr<ReconcileTask> task_;
75 std::vector<std::unique_ptr<SavePageRequest>> found_requests_;
76 bool reconcile_called_;
77
78 private:
79 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
80 base::ThreadTaskRunnerHandle task_runner_handle_;
81 };
82
83 ReconcileTaskTest::ReconcileTaskTest()
84 : reconcile_called_(false),
85 task_runner_(new base::TestSimpleTaskRunner),
86 task_runner_handle_(task_runner_) {}
87
88 ReconcileTaskTest::~ReconcileTaskTest() {}
89
90 void ReconcileTaskTest::SetUp() {
91 DeviceConditions conditions;
92 store_.reset(new RequestQueueInMemoryStore());
93 MakeTask();
94
95 store_->Initialize(base::Bind(&ReconcileTaskTest::InitializeStoreDone,
96 base::Unretained(this)));
97 PumpLoop();
98 }
99
100 void ReconcileTaskTest::PumpLoop() {
101 task_runner_->RunUntilIdle();
102 }
103
104 void ReconcileTaskTest::AddRequestDone(ItemActionStatus status) {
105 ASSERT_EQ(ItemActionStatus::SUCCESS, status);
106 }
107
108 void ReconcileTaskTest::GetRequestsCallback(
109 bool success,
110 std::vector<std::unique_ptr<SavePageRequest>> requests) {
111 found_requests_ = std::move(requests);
112 }
113
114 void ReconcileTaskTest::ReconcileCallback(
115 std::unique_ptr<UpdateRequestsResult> result) {
116 reconcile_called_ = true;
117 // Make sure the item in the callback is now AVAILABLE.
118 EXPECT_EQ(SavePageRequest::RequestState::AVAILABLE,
119 result->updated_items.at(0).request_state());
120 }
121
122 // Test helper to queue the two given requests.
123 void ReconcileTaskTest::QueueRequests(const SavePageRequest& request1,
124 const SavePageRequest& request2) {
125 DeviceConditions conditions;
126 std::set<int64_t> disabled_requests;
127 // Add test requests on the Queue.
128 store_->AddRequest(request1, base::Bind(&ReconcileTaskTest::AddRequestDone,
129 base::Unretained(this)));
130 store_->AddRequest(request2, base::Bind(&ReconcileTaskTest::AddRequestDone,
131 base::Unretained(this)));
132
133 // Pump the loop to give the async queue the opportunity to do the adds.
134 PumpLoop();
135 }
136
137 void ReconcileTaskTest::MakeTask() {
138 task_.reset(new ReconcileTask(
139 store_.get(), base::Bind(&ReconcileTaskTest::ReconcileCallback,
140 base::Unretained(this))));
141 }
142
143 void ReconcileTaskTest::InitializeStoreDone(bool success) {
144 ASSERT_TRUE(success);
145 }
146
147 TEST_F(ReconcileTaskTest, Reconcile) {
148 base::Time creation_time = base::Time::Now();
149 // Request2 will be expired, request1 will be current.
150 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
151 kUserRequested);
152 request1.set_request_state(SavePageRequest::RequestState::PAUSED);
153 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
154 kUserRequested);
155 request2.set_request_state(SavePageRequest::RequestState::OFFLINING);
156 QueueRequests(request1, request2);
157
158 // Initiate cleanup.
159 task()->Run();
160 PumpLoop();
161
162 // See what is left in the queue, should be just the other request.
163 store()->GetRequests(base::Bind(&ReconcileTaskTest::GetRequestsCallback,
164 base::Unretained(this)));
165 PumpLoop();
166 EXPECT_EQ(2UL, found_requests().size());
167
168 // in case requests come back in a different order, check which is where.
169 int request1_index = 0;
170 int request2_index = 1;
171 if (found_requests().at(0)->request_id() != kRequestId1) {
172 request1_index = 1;
173 request2_index = 0;
174 }
175 EXPECT_EQ(SavePageRequest::RequestState::PAUSED,
176 found_requests().at(request1_index)->request_state());
177 EXPECT_EQ(SavePageRequest::RequestState::AVAILABLE,
178 found_requests().at(request2_index)->request_state());
179 EXPECT_TRUE(reconcile_called_);
180 }
181
182 TEST_F(ReconcileTaskTest, NothingToReconcile) {
183 base::Time creation_time = base::Time::Now();
184 // Request2 will be expired, request1 will be current.
185 SavePageRequest request1(kRequestId1, kUrl1, kClientId1, creation_time,
186 kUserRequested);
187 request1.set_request_state(SavePageRequest::RequestState::PAUSED);
188 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time,
189 kUserRequested);
190 request2.set_request_state(SavePageRequest::RequestState::AVAILABLE);
191 QueueRequests(request1, request2);
192
193 // Initiate cleanup.
194 task()->Run();
195 PumpLoop();
196
197 // See what is left in the queue, should be just the other request.
198 store()->GetRequests(base::Bind(&ReconcileTaskTest::GetRequestsCallback,
199 base::Unretained(this)));
200 PumpLoop();
201 EXPECT_EQ(2UL, found_requests().size());
202
203 // in case requests come back in a different order, check which is where.
204 int request1_index = 0;
205 int request2_index = 1;
206 if (found_requests().at(0)->request_id() != kRequestId1) {
207 request1_index = 1;
208 request2_index = 0;
209 }
210 // Requests should still be in their starting states.
211 EXPECT_EQ(SavePageRequest::RequestState::PAUSED,
212 found_requests().at(request1_index)->request_state());
213 EXPECT_EQ(SavePageRequest::RequestState::AVAILABLE,
214 found_requests().at(request2_index)->request_state());
215 // In this case, we do not expect the reconcile callback to be called.
216 EXPECT_FALSE(reconcile_called_);
217 }
218
219 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698