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

Side by Side Diff: components/offline_pages/background/request_queue_store_unittest.cc

Issue 2053163002: [Offline pages] Adding persistent request queue based on SQLite (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixing code comments Created 4 years, 6 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/offline_pages/background/request_queue_store.h" 5 #include "components/offline_pages/background/request_queue_store.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/files/file_path.h"
11 #include "base/files/scoped_temp_dir.h"
10 #include "base/test/test_simple_task_runner.h" 12 #include "base/test/test_simple_task_runner.h"
11 #include "base/threading/thread_task_runner_handle.h" 13 #include "base/threading/thread_task_runner_handle.h"
12 #include "components/offline_pages/background/request_queue_in_memory_store.h" 14 #include "components/offline_pages/background/request_queue_in_memory_store.h"
15 #include "components/offline_pages/background/request_queue_store_sql.h"
13 #include "components/offline_pages/background/save_page_request.h" 16 #include "components/offline_pages/background/save_page_request.h"
14 #include "testing/gtest/include/gtest/gtest.h" 17 #include "testing/gtest/include/gtest/gtest.h"
15 18
16 namespace offline_pages { 19 namespace offline_pages {
17 20
18 using UpdateStatus = RequestQueueStore::UpdateStatus; 21 using UpdateStatus = RequestQueueStore::UpdateStatus;
19 22
20 namespace { 23 namespace {
21 const int64_t kRequestId = 42; 24 const int64_t kRequestId = 42;
22 const GURL kUrl("http://example.com"); 25 const GURL kUrl("http://example.com");
23 const ClientId kClientId("bookmark", "1234"); 26 const ClientId kClientId("bookmark", "1234");
24 27
28 enum class LastResult {
29 kNone,
30 kFalse,
31 kTrue,
32 };
33
25 bool operator==(const SavePageRequest& lhs, const SavePageRequest& rhs) { 34 bool operator==(const SavePageRequest& lhs, const SavePageRequest& rhs) {
26 return lhs.request_id() == rhs.request_id() && lhs.url() == rhs.url() && 35 return lhs.request_id() == rhs.request_id() && lhs.url() == rhs.url() &&
27 lhs.client_id() == rhs.client_id() && 36 lhs.client_id() == rhs.client_id() &&
28 lhs.creation_time() == rhs.creation_time() && 37 lhs.creation_time() == rhs.creation_time() &&
29 lhs.activation_time() == rhs.activation_time() && 38 lhs.activation_time() == rhs.activation_time() &&
30 lhs.attempt_count() == rhs.attempt_count() && 39 lhs.attempt_count() == rhs.attempt_count() &&
31 lhs.last_attempt_time() == rhs.last_attempt_time(); 40 lhs.last_attempt_time() == rhs.last_attempt_time();
32 } 41 }
33 42
34 } // namespace 43 } // namespace
35 44
36 class RequestQueueInMemoryStoreTest : public testing::Test { 45 // Class that serves as a base for testing different implementations of the
46 // |RequestQueueStore|. Specific implementations extend the templatized version
47 // of this class and provide appropriate store factory.
48 class RequestQueueStoreTestBase : public testing::Test {
37 public: 49 public:
38 enum class LastResult { 50 RequestQueueStoreTestBase();
39 RESULT_NONE,
40 RESULT_FALSE,
41 RESULT_TRUE,
42 };
43
44 RequestQueueInMemoryStoreTest();
45 51
46 // Test overrides. 52 // Test overrides.
47 void SetUp() override; 53 void TearDown() override;
48
49 RequestQueueStore* store() { return store_.get(); }
50 54
51 void PumpLoop(); 55 void PumpLoop();
52 void ResetResults(); 56 void ClearResults();
53 57
54 // Callback used for get requests. 58 // Callback used for get requests.
55 void GetRequestsDone(bool result, 59 void GetRequestsDone(bool result,
56 const std::vector<SavePageRequest>& requests); 60 const std::vector<SavePageRequest>& requests);
57 // Callback used for add/update request. 61 // Callback used for add/update request.
58 void AddOrUpdateDone(UpdateStatus result); 62 void AddOrUpdateDone(UpdateStatus result);
59 // Callback used for remove requests. 63 // Callback used for remove requests.
60 void RemoveDone(bool result, int count); 64 void RemoveDone(bool result, int count);
61 // Callback used for reset. 65 // Callback used for reset.
62 void ResetDone(bool result); 66 void ResetDone(bool result);
63 67
64 LastResult last_result() const { return last_result_; } 68 LastResult last_result() const { return last_result_; }
65
66 UpdateStatus last_update_status() const { return last_update_status_; } 69 UpdateStatus last_update_status() const { return last_update_status_; }
67
68 int last_remove_count() const { return last_remove_count_; } 70 int last_remove_count() const { return last_remove_count_; }
69
70 const std::vector<SavePageRequest>& last_requests() const { 71 const std::vector<SavePageRequest>& last_requests() const {
71 return last_requests_; 72 return last_requests_;
72 } 73 }
73 74
75 protected:
76 base::ScopedTempDir temp_directory_;
77
74 private: 78 private:
75 std::unique_ptr<RequestQueueInMemoryStore> store_;
76 LastResult last_result_; 79 LastResult last_result_;
77 UpdateStatus last_update_status_; 80 UpdateStatus last_update_status_;
78 int last_remove_count_; 81 int last_remove_count_;
79 std::vector<SavePageRequest> last_requests_; 82 std::vector<SavePageRequest> last_requests_;
83
80 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; 84 scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
81 base::ThreadTaskRunnerHandle task_runner_handle_; 85 base::ThreadTaskRunnerHandle task_runner_handle_;
82 }; 86 };
83 87
84 RequestQueueInMemoryStoreTest::RequestQueueInMemoryStoreTest() 88 RequestQueueStoreTestBase::RequestQueueStoreTestBase()
85 : last_result_(LastResult::RESULT_NONE), 89 : last_result_(LastResult::kNone),
86 last_update_status_(UpdateStatus::FAILED), 90 last_update_status_(UpdateStatus::FAILED),
87 last_remove_count_(0), 91 last_remove_count_(0),
88 task_runner_(new base::TestSimpleTaskRunner), 92 task_runner_(new base::TestSimpleTaskRunner),
89 task_runner_handle_(task_runner_) {} 93 task_runner_handle_(task_runner_) {
90 94 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir());
91 void RequestQueueInMemoryStoreTest::SetUp() { 95 }
92 store_.reset(new RequestQueueInMemoryStore()); 96
93 } 97 void RequestQueueStoreTestBase::TearDown() {
94 98 // Wait for all the pieces of the store to delete itself properly.
95 void RequestQueueInMemoryStoreTest::PumpLoop() { 99 PumpLoop();
100 }
101
102 void RequestQueueStoreTestBase::PumpLoop() {
96 task_runner_->RunUntilIdle(); 103 task_runner_->RunUntilIdle();
97 } 104 }
98 105
99 void RequestQueueInMemoryStoreTest::ResetResults() { 106 void RequestQueueStoreTestBase::ClearResults() {
100 last_result_ = LastResult::RESULT_NONE; 107 last_result_ = LastResult::kNone;
101 last_update_status_ = UpdateStatus::FAILED; 108 last_update_status_ = UpdateStatus::FAILED;
102 last_remove_count_ = 0; 109 last_remove_count_ = 0;
103 last_requests_.clear(); 110 last_requests_.clear();
104 } 111 }
105 112
106 void RequestQueueInMemoryStoreTest::GetRequestsDone( 113 void RequestQueueStoreTestBase::GetRequestsDone(
107 bool result, 114 bool result,
108 const std::vector<SavePageRequest>& requests) { 115 const std::vector<SavePageRequest>& requests) {
109 last_result_ = result ? LastResult::RESULT_TRUE : LastResult::RESULT_FALSE; 116 last_result_ = result ? LastResult::kTrue : LastResult::kFalse;
110 last_requests_ = requests; 117 last_requests_ = requests;
111 } 118 }
112 119
113 void RequestQueueInMemoryStoreTest::AddOrUpdateDone(UpdateStatus status) { 120 void RequestQueueStoreTestBase::AddOrUpdateDone(UpdateStatus status) {
114 last_update_status_ = status; 121 last_update_status_ = status;
115 } 122 }
116 123
117 void RequestQueueInMemoryStoreTest::RemoveDone(bool result, int count) { 124 void RequestQueueStoreTestBase::RemoveDone(bool result, int count) {
118 last_result_ = result ? LastResult::RESULT_TRUE : LastResult::RESULT_FALSE; 125 last_result_ = result ? LastResult::kTrue : LastResult::kFalse;
119 last_remove_count_ = count; 126 last_remove_count_ = count;
120 } 127 }
121 128
122 void RequestQueueInMemoryStoreTest::ResetDone(bool result) { 129 void RequestQueueStoreTestBase::ResetDone(bool result) {
123 last_result_ = result ? LastResult::RESULT_TRUE : LastResult::RESULT_FALSE; 130 last_result_ = result ? LastResult::kTrue : LastResult::kFalse;
124 } 131 }
125 132
126 TEST_F(RequestQueueInMemoryStoreTest, GetRequestsEmpty) { 133 // Defines interface for the store factory.
127 store()->GetRequests(base::Bind( 134 class RequestQueueStoreFactory {
128 &RequestQueueInMemoryStoreTest::GetRequestsDone, base::Unretained(this))); 135 public:
129 ASSERT_EQ(LastResult::RESULT_NONE, last_result()); 136 virtual RequestQueueStore* BuildStore(const base::FilePath& path) = 0;
130 PumpLoop(); 137 };
131 ASSERT_EQ(LastResult::RESULT_TRUE, last_result()); 138
132 ASSERT_TRUE(last_requests().empty()); 139 // Implements a store factory for in memory store.
133 } 140 class RequestQueueInMemoryStoreFactory : public RequestQueueStoreFactory {
134 141 public:
135 TEST_F(RequestQueueInMemoryStoreTest, AddRequest) { 142 RequestQueueStore* BuildStore(const base::FilePath& path) override {
143 RequestQueueStore* store = new RequestQueueInMemoryStore();
144 return store;
145 }
146 };
147
148 // Implements a store factory for SQLite based implementation of the store.
149 class RequestQueueStoreSQLFactory : public RequestQueueStoreFactory {
150 public:
151 RequestQueueStore* BuildStore(const base::FilePath& path) override {
152 RequestQueueStore* store =
153 new RequestQueueStoreSQL(base::ThreadTaskRunnerHandle::Get(), path);
154 return store;
155 }
156 };
157
158 // Defines a store test fixture templatized by the store factory.
159 template <typename T>
160 class RequestQueueStoreTest : public RequestQueueStoreTestBase {
161 public:
162 std::unique_ptr<RequestQueueStore> BuildStore();
163
164 protected:
165 T factory_;
166 };
167
168 template <typename T>
169 std::unique_ptr<RequestQueueStore> RequestQueueStoreTest<T>::BuildStore() {
170 std::unique_ptr<RequestQueueStore> store(
171 factory_.BuildStore(temp_directory_.path()));
172 return store;
173 }
174
175 // |StoreTypes| lists all factories, based on which the tests will be created.
176 typedef testing::Types<RequestQueueInMemoryStoreFactory,
177 RequestQueueStoreSQLFactory>
178 StoreTypes;
179
180 // This portion causes test fixtures to be defined.
181 // Notice that in the store we are using "this->" to refer to the methods
182 // defined on the |RequestQuieueStoreBaseTest| class. That's by design.
183 TYPED_TEST_CASE(RequestQueueStoreTest, StoreTypes);
184
185 TYPED_TEST(RequestQueueStoreTest, GetRequestsEmpty) {
186 std::unique_ptr<RequestQueueStore> store(this->BuildStore());
187 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone,
188 base::Unretained(this)));
189 ASSERT_EQ(LastResult::kNone, this->last_result());
190 this->PumpLoop();
191 ASSERT_EQ(LastResult::kTrue, this->last_result());
192 ASSERT_TRUE(this->last_requests().empty());
193 }
194
195 TYPED_TEST(RequestQueueStoreTest, AddRequest) {
196 std::unique_ptr<RequestQueueStore> store(this->BuildStore());
136 base::Time creation_time = base::Time::Now(); 197 base::Time creation_time = base::Time::Now();
137 SavePageRequest request(kRequestId, kUrl, kClientId, creation_time); 198 SavePageRequest request(kRequestId, kUrl, kClientId, creation_time);
138 199
139 store()->AddOrUpdateRequest( 200 store->AddOrUpdateRequest(
140 request, base::Bind(&RequestQueueInMemoryStoreTest::AddOrUpdateDone, 201 request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone,
141 base::Unretained(this))); 202 base::Unretained(this)));
142 ASSERT_EQ(UpdateStatus::FAILED, last_update_status()); 203 ASSERT_EQ(UpdateStatus::FAILED, this->last_update_status());
143 PumpLoop(); 204 this->PumpLoop();
144 ASSERT_EQ(UpdateStatus::ADDED, last_update_status()); 205 ASSERT_EQ(UpdateStatus::UPDATED, this->last_update_status());
145 206
146 // Verifying get reqeust results after a request was added. 207 // Verifying get reqeust results after a request was added.
147 ResetResults(); 208 this->ClearResults();
148 store()->GetRequests(base::Bind( 209 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone,
149 &RequestQueueInMemoryStoreTest::GetRequestsDone, base::Unretained(this))); 210 base::Unretained(this)));
150 ASSERT_EQ(LastResult::RESULT_NONE, last_result()); 211 ASSERT_EQ(LastResult::kNone, this->last_result());
151 PumpLoop(); 212 this->PumpLoop();
152 ASSERT_EQ(LastResult::RESULT_TRUE, last_result()); 213 ASSERT_EQ(LastResult::kTrue, this->last_result());
153 ASSERT_EQ(1ul, last_requests().size()); 214 ASSERT_EQ(1ul, this->last_requests().size());
154 ASSERT_TRUE(request == last_requests()[0]); 215 ASSERT_TRUE(request == this->last_requests()[0]);
155 } 216 }
156 217
157 TEST_F(RequestQueueInMemoryStoreTest, UpdateRequest) { 218 TYPED_TEST(RequestQueueStoreTest, UpdateRequest) {
219 std::unique_ptr<RequestQueueStore> store(this->BuildStore());
158 base::Time creation_time = base::Time::Now(); 220 base::Time creation_time = base::Time::Now();
159 SavePageRequest original_request(kRequestId, kUrl, kClientId, creation_time); 221 SavePageRequest original_request(kRequestId, kUrl, kClientId, creation_time);
160 store()->AddOrUpdateRequest( 222 store->AddOrUpdateRequest(
161 original_request, 223 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone,
162 base::Bind(&RequestQueueInMemoryStoreTest::AddOrUpdateDone, 224 base::Unretained(this)));
163 base::Unretained(this))); 225 this->PumpLoop();
164 PumpLoop(); 226 this->ClearResults();
165 ResetResults();
166 227
167 base::Time new_creation_time = 228 base::Time new_creation_time =
168 creation_time + base::TimeDelta::FromMinutes(1); 229 creation_time + base::TimeDelta::FromMinutes(1);
169 base::Time activation_time = creation_time + base::TimeDelta::FromHours(6); 230 base::Time activation_time = creation_time + base::TimeDelta::FromHours(6);
170 SavePageRequest updated_request(kRequestId, kUrl, kClientId, 231 SavePageRequest updated_request(kRequestId, kUrl, kClientId,
171 new_creation_time, activation_time); 232 new_creation_time, activation_time);
172 store()->AddOrUpdateRequest( 233 store->AddOrUpdateRequest(
173 updated_request, 234 updated_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone,
174 base::Bind(&RequestQueueInMemoryStoreTest::AddOrUpdateDone, 235 base::Unretained(this)));
175 base::Unretained(this))); 236 ASSERT_EQ(UpdateStatus::FAILED, this->last_update_status());
176 ASSERT_EQ(UpdateStatus::FAILED, last_update_status()); 237 this->PumpLoop();
177 PumpLoop(); 238 ASSERT_EQ(UpdateStatus::UPDATED, this->last_update_status());
178 ASSERT_EQ(UpdateStatus::UPDATED, last_update_status());
179 239
180 // Verifying get reqeust results after a request was updated. 240 // Verifying get reqeust results after a request was updated.
181 ResetResults(); 241 this->ClearResults();
182 store()->GetRequests(base::Bind( 242 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone,
183 &RequestQueueInMemoryStoreTest::GetRequestsDone, base::Unretained(this))); 243 base::Unretained(this)));
184 ASSERT_EQ(LastResult::RESULT_NONE, last_result()); 244 ASSERT_EQ(LastResult::kNone, this->last_result());
185 PumpLoop(); 245 this->PumpLoop();
186 ASSERT_EQ(LastResult::RESULT_TRUE, last_result()); 246 ASSERT_EQ(LastResult::kTrue, this->last_result());
187 ASSERT_EQ(1ul, last_requests().size()); 247 ASSERT_EQ(1ul, this->last_requests().size());
188 ASSERT_TRUE(updated_request == last_requests()[0]); 248 ASSERT_TRUE(updated_request == this->last_requests()[0]);
189 } 249 }
190 250
191 TEST_F(RequestQueueInMemoryStoreTest, RemoveRequest) { 251 TYPED_TEST(RequestQueueStoreTest, RemoveRequest) {
252 std::unique_ptr<RequestQueueStore> store(this->BuildStore());
192 base::Time creation_time = base::Time::Now(); 253 base::Time creation_time = base::Time::Now();
193 SavePageRequest original_request(kRequestId, kUrl, kClientId, creation_time); 254 SavePageRequest original_request(kRequestId, kUrl, kClientId, creation_time);
194 store()->AddOrUpdateRequest( 255 store->AddOrUpdateRequest(
195 original_request, 256 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone,
196 base::Bind(&RequestQueueInMemoryStoreTest::AddOrUpdateDone, 257 base::Unretained(this)));
197 base::Unretained(this))); 258 this->PumpLoop();
198 PumpLoop(); 259 this->ClearResults();
199 ResetResults();
200 260
201 std::vector<int64_t> request_ids{kRequestId}; 261 std::vector<int64_t> request_ids{kRequestId};
202 store()->RemoveRequests(request_ids, 262 store->RemoveRequests(request_ids,
203 base::Bind(&RequestQueueInMemoryStoreTest::RemoveDone, 263 base::Bind(&RequestQueueStoreTestBase::RemoveDone,
204 base::Unretained(this))); 264 base::Unretained(this)));
205 ASSERT_EQ(LastResult::RESULT_NONE, last_result()); 265 ASSERT_EQ(LastResult::kNone, this->last_result());
206 ASSERT_EQ(0, last_remove_count()); 266 ASSERT_EQ(0, this->last_remove_count());
207 PumpLoop(); 267 this->PumpLoop();
208 ASSERT_EQ(LastResult::RESULT_TRUE, last_result()); 268 ASSERT_EQ(LastResult::kTrue, this->last_result());
209 ASSERT_EQ(1, last_remove_count()); 269 ASSERT_EQ(1, this->last_remove_count());
210 ASSERT_EQ(0ul, last_requests().size()); 270 this->ClearResults();
211 ResetResults(); 271
272 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone,
273 base::Unretained(this)));
274 this->PumpLoop();
275 ASSERT_EQ(LastResult::kTrue, this->last_result());
276 ASSERT_TRUE(this->last_requests().empty());
277 this->ClearResults();
212 278
213 // Removing a request that is missing fails. 279 // Removing a request that is missing fails.
214 store()->RemoveRequests(request_ids, 280 store->RemoveRequests(request_ids,
215 base::Bind(&RequestQueueInMemoryStoreTest::RemoveDone, 281 base::Bind(&RequestQueueStoreTestBase::RemoveDone,
216 base::Unretained(this))); 282 base::Unretained(this)));
217 ASSERT_EQ(LastResult::RESULT_NONE, last_result()); 283 ASSERT_EQ(LastResult::kNone, this->last_result());
218 ASSERT_EQ(0, last_remove_count()); 284 ASSERT_EQ(0, this->last_remove_count());
219 PumpLoop(); 285 this->PumpLoop();
220 ASSERT_EQ(LastResult::RESULT_FALSE, last_result()); 286 ASSERT_EQ(LastResult::kTrue, this->last_result());
221 ASSERT_EQ(0, last_remove_count()); 287 ASSERT_EQ(0, this->last_remove_count());
222 } 288 }
223 289
224 TEST_F(RequestQueueInMemoryStoreTest, ResetStore) { 290 TYPED_TEST(RequestQueueStoreTest, ResetStore) {
291 std::unique_ptr<RequestQueueStore> store(this->BuildStore());
225 base::Time creation_time = base::Time::Now(); 292 base::Time creation_time = base::Time::Now();
226 SavePageRequest original_request(kRequestId, kUrl, kClientId, creation_time); 293 SavePageRequest original_request(kRequestId, kUrl, kClientId, creation_time);
227 store()->AddOrUpdateRequest( 294 store->AddOrUpdateRequest(
228 original_request, 295 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone,
229 base::Bind(&RequestQueueInMemoryStoreTest::AddOrUpdateDone, 296 base::Unretained(this)));
230 base::Unretained(this))); 297 this->PumpLoop();
231 PumpLoop(); 298 this->ClearResults();
232 ResetResults(); 299
233 300 store->Reset(base::Bind(&RequestQueueStoreTestBase::ResetDone,
234 store()->Reset(base::Bind(&RequestQueueInMemoryStoreTest::ResetDone, 301 base::Unretained(this)));
235 base::Unretained(this))); 302 ASSERT_EQ(LastResult::kNone, this->last_result());
236 ASSERT_EQ(LastResult::RESULT_NONE, last_result()); 303 this->PumpLoop();
237 PumpLoop(); 304 ASSERT_EQ(LastResult::kTrue, this->last_result());
238 ASSERT_EQ(LastResult::RESULT_TRUE, last_result()); 305 this->ClearResults();
239 ASSERT_EQ(0ul, last_requests().size()); 306
307 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone,
308 base::Unretained(this)));
309 this->PumpLoop();
310 ASSERT_EQ(LastResult::kTrue, this->last_result());
311 ASSERT_TRUE(this->last_requests().empty());
240 } 312 }
241 313
242 } // offline_pages 314 } // offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698