| OLD | NEW |
| 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" | 10 #include "base/files/file_path.h" |
| 11 #include "base/files/scoped_temp_dir.h" | 11 #include "base/files/scoped_temp_dir.h" |
| 12 #include "base/test/test_simple_task_runner.h" | 12 #include "base/test/test_simple_task_runner.h" |
| 13 #include "base/threading/thread_task_runner_handle.h" | 13 #include "base/threading/thread_task_runner_handle.h" |
| 14 #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" | 15 #include "components/offline_pages/background/request_queue_store_sql.h" |
| 16 #include "components/offline_pages/background/save_page_request.h" | 16 #include "components/offline_pages/background/save_page_request.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 18 |
| 19 namespace offline_pages { | 19 namespace offline_pages { |
| 20 | 20 |
| 21 using UpdateStatus = RequestQueueStore::UpdateStatus; | 21 using UpdateStatus = RequestQueueStore::UpdateStatus; |
| 22 | 22 |
| 23 namespace { | 23 namespace { |
| 24 const int64_t kRequestId = 42; | 24 const int64_t kRequestId = 42; |
| 25 const GURL kUrl("http://example.com"); | 25 const GURL kUrl("http://example.com"); |
| 26 const ClientId kClientId("bookmark", "1234"); | 26 const ClientId kClientId("bookmark", "1234"); |
| 27 const bool kUserRequested = true; |
| 27 | 28 |
| 28 enum class LastResult { | 29 enum class LastResult { |
| 29 kNone, | 30 kNone, |
| 30 kFalse, | 31 kFalse, |
| 31 kTrue, | 32 kTrue, |
| 32 }; | 33 }; |
| 33 | 34 |
| 34 bool operator==(const SavePageRequest& lhs, const SavePageRequest& rhs) { | 35 bool operator==(const SavePageRequest& lhs, const SavePageRequest& rhs) { |
| 35 return lhs.request_id() == rhs.request_id() && lhs.url() == rhs.url() && | 36 return lhs.request_id() == rhs.request_id() && lhs.url() == rhs.url() && |
| 36 lhs.client_id() == rhs.client_id() && | 37 lhs.client_id() == rhs.client_id() && |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 base::Unretained(this))); | 189 base::Unretained(this))); |
| 189 ASSERT_EQ(LastResult::kNone, this->last_result()); | 190 ASSERT_EQ(LastResult::kNone, this->last_result()); |
| 190 this->PumpLoop(); | 191 this->PumpLoop(); |
| 191 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 192 ASSERT_EQ(LastResult::kTrue, this->last_result()); |
| 192 ASSERT_TRUE(this->last_requests().empty()); | 193 ASSERT_TRUE(this->last_requests().empty()); |
| 193 } | 194 } |
| 194 | 195 |
| 195 TYPED_TEST(RequestQueueStoreTest, AddRequest) { | 196 TYPED_TEST(RequestQueueStoreTest, AddRequest) { |
| 196 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | 197 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); |
| 197 base::Time creation_time = base::Time::Now(); | 198 base::Time creation_time = base::Time::Now(); |
| 198 SavePageRequest request(kRequestId, kUrl, kClientId, creation_time); | 199 SavePageRequest request( |
| 200 kRequestId, kUrl, kClientId, creation_time, kUserRequested); |
| 199 | 201 |
| 200 store->AddOrUpdateRequest( | 202 store->AddOrUpdateRequest( |
| 201 request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | 203 request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, |
| 202 base::Unretained(this))); | 204 base::Unretained(this))); |
| 203 ASSERT_EQ(UpdateStatus::FAILED, this->last_update_status()); | 205 ASSERT_EQ(UpdateStatus::FAILED, this->last_update_status()); |
| 204 this->PumpLoop(); | 206 this->PumpLoop(); |
| 205 ASSERT_EQ(UpdateStatus::UPDATED, this->last_update_status()); | 207 ASSERT_EQ(UpdateStatus::UPDATED, this->last_update_status()); |
| 206 | 208 |
| 207 // Verifying get reqeust results after a request was added. | 209 // Verifying get reqeust results after a request was added. |
| 208 this->ClearResults(); | 210 this->ClearResults(); |
| 209 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | 211 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, |
| 210 base::Unretained(this))); | 212 base::Unretained(this))); |
| 211 ASSERT_EQ(LastResult::kNone, this->last_result()); | 213 ASSERT_EQ(LastResult::kNone, this->last_result()); |
| 212 this->PumpLoop(); | 214 this->PumpLoop(); |
| 213 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 215 ASSERT_EQ(LastResult::kTrue, this->last_result()); |
| 214 ASSERT_EQ(1ul, this->last_requests().size()); | 216 ASSERT_EQ(1ul, this->last_requests().size()); |
| 215 ASSERT_TRUE(request == this->last_requests()[0]); | 217 ASSERT_TRUE(request == this->last_requests()[0]); |
| 216 } | 218 } |
| 217 | 219 |
| 218 TYPED_TEST(RequestQueueStoreTest, UpdateRequest) { | 220 TYPED_TEST(RequestQueueStoreTest, UpdateRequest) { |
| 219 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | 221 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); |
| 220 base::Time creation_time = base::Time::Now(); | 222 base::Time creation_time = base::Time::Now(); |
| 221 SavePageRequest original_request(kRequestId, kUrl, kClientId, creation_time); | 223 SavePageRequest original_request( |
| 224 kRequestId, kUrl, kClientId, creation_time, kUserRequested); |
| 222 store->AddOrUpdateRequest( | 225 store->AddOrUpdateRequest( |
| 223 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | 226 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, |
| 224 base::Unretained(this))); | 227 base::Unretained(this))); |
| 225 this->PumpLoop(); | 228 this->PumpLoop(); |
| 226 this->ClearResults(); | 229 this->ClearResults(); |
| 227 | 230 |
| 228 base::Time new_creation_time = | 231 base::Time new_creation_time = |
| 229 creation_time + base::TimeDelta::FromMinutes(1); | 232 creation_time + base::TimeDelta::FromMinutes(1); |
| 230 base::Time activation_time = creation_time + base::TimeDelta::FromHours(6); | 233 base::Time activation_time = creation_time + base::TimeDelta::FromHours(6); |
| 231 SavePageRequest updated_request(kRequestId, kUrl, kClientId, | 234 SavePageRequest updated_request(kRequestId, kUrl, kClientId, |
| 232 new_creation_time, activation_time); | 235 new_creation_time, activation_time, |
| 236 kUserRequested); |
| 233 store->AddOrUpdateRequest( | 237 store->AddOrUpdateRequest( |
| 234 updated_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | 238 updated_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, |
| 235 base::Unretained(this))); | 239 base::Unretained(this))); |
| 236 ASSERT_EQ(UpdateStatus::FAILED, this->last_update_status()); | 240 ASSERT_EQ(UpdateStatus::FAILED, this->last_update_status()); |
| 237 this->PumpLoop(); | 241 this->PumpLoop(); |
| 238 ASSERT_EQ(UpdateStatus::UPDATED, this->last_update_status()); | 242 ASSERT_EQ(UpdateStatus::UPDATED, this->last_update_status()); |
| 239 | 243 |
| 240 // Verifying get reqeust results after a request was updated. | 244 // Verifying get reqeust results after a request was updated. |
| 241 this->ClearResults(); | 245 this->ClearResults(); |
| 242 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | 246 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, |
| 243 base::Unretained(this))); | 247 base::Unretained(this))); |
| 244 ASSERT_EQ(LastResult::kNone, this->last_result()); | 248 ASSERT_EQ(LastResult::kNone, this->last_result()); |
| 245 this->PumpLoop(); | 249 this->PumpLoop(); |
| 246 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 250 ASSERT_EQ(LastResult::kTrue, this->last_result()); |
| 247 ASSERT_EQ(1ul, this->last_requests().size()); | 251 ASSERT_EQ(1ul, this->last_requests().size()); |
| 248 ASSERT_TRUE(updated_request == this->last_requests()[0]); | 252 ASSERT_TRUE(updated_request == this->last_requests()[0]); |
| 249 } | 253 } |
| 250 | 254 |
| 251 TYPED_TEST(RequestQueueStoreTest, RemoveRequest) { | 255 TYPED_TEST(RequestQueueStoreTest, RemoveRequest) { |
| 252 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | 256 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); |
| 253 base::Time creation_time = base::Time::Now(); | 257 base::Time creation_time = base::Time::Now(); |
| 254 SavePageRequest original_request(kRequestId, kUrl, kClientId, creation_time); | 258 SavePageRequest original_request( |
| 259 kRequestId, kUrl, kClientId, creation_time, kUserRequested); |
| 255 store->AddOrUpdateRequest( | 260 store->AddOrUpdateRequest( |
| 256 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | 261 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, |
| 257 base::Unretained(this))); | 262 base::Unretained(this))); |
| 258 this->PumpLoop(); | 263 this->PumpLoop(); |
| 259 this->ClearResults(); | 264 this->ClearResults(); |
| 260 | 265 |
| 261 std::vector<int64_t> request_ids{kRequestId}; | 266 std::vector<int64_t> request_ids{kRequestId}; |
| 262 store->RemoveRequests(request_ids, | 267 store->RemoveRequests(request_ids, |
| 263 base::Bind(&RequestQueueStoreTestBase::RemoveDone, | 268 base::Bind(&RequestQueueStoreTestBase::RemoveDone, |
| 264 base::Unretained(this))); | 269 base::Unretained(this))); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 283 ASSERT_EQ(LastResult::kNone, this->last_result()); | 288 ASSERT_EQ(LastResult::kNone, this->last_result()); |
| 284 ASSERT_EQ(0, this->last_remove_count()); | 289 ASSERT_EQ(0, this->last_remove_count()); |
| 285 this->PumpLoop(); | 290 this->PumpLoop(); |
| 286 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 291 ASSERT_EQ(LastResult::kTrue, this->last_result()); |
| 287 ASSERT_EQ(0, this->last_remove_count()); | 292 ASSERT_EQ(0, this->last_remove_count()); |
| 288 } | 293 } |
| 289 | 294 |
| 290 TYPED_TEST(RequestQueueStoreTest, ResetStore) { | 295 TYPED_TEST(RequestQueueStoreTest, ResetStore) { |
| 291 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | 296 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); |
| 292 base::Time creation_time = base::Time::Now(); | 297 base::Time creation_time = base::Time::Now(); |
| 293 SavePageRequest original_request(kRequestId, kUrl, kClientId, creation_time); | 298 SavePageRequest original_request( |
| 299 kRequestId, kUrl, kClientId, creation_time, kUserRequested); |
| 294 store->AddOrUpdateRequest( | 300 store->AddOrUpdateRequest( |
| 295 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | 301 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, |
| 296 base::Unretained(this))); | 302 base::Unretained(this))); |
| 297 this->PumpLoop(); | 303 this->PumpLoop(); |
| 298 this->ClearResults(); | 304 this->ClearResults(); |
| 299 | 305 |
| 300 store->Reset(base::Bind(&RequestQueueStoreTestBase::ResetDone, | 306 store->Reset(base::Bind(&RequestQueueStoreTestBase::ResetDone, |
| 301 base::Unretained(this))); | 307 base::Unretained(this))); |
| 302 ASSERT_EQ(LastResult::kNone, this->last_result()); | 308 ASSERT_EQ(LastResult::kNone, this->last_result()); |
| 303 this->PumpLoop(); | 309 this->PumpLoop(); |
| 304 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 310 ASSERT_EQ(LastResult::kTrue, this->last_result()); |
| 305 this->ClearResults(); | 311 this->ClearResults(); |
| 306 | 312 |
| 307 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | 313 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, |
| 308 base::Unretained(this))); | 314 base::Unretained(this))); |
| 309 this->PumpLoop(); | 315 this->PumpLoop(); |
| 310 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 316 ASSERT_EQ(LastResult::kTrue, this->last_result()); |
| 311 ASSERT_TRUE(this->last_requests().empty()); | 317 ASSERT_TRUE(this->last_requests().empty()); |
| 312 } | 318 } |
| 313 | 319 |
| 314 class RequestQueueStoreSQLTest | 320 class RequestQueueStoreSQLTest |
| 315 : public RequestQueueStoreTest<RequestQueueStoreSQLFactory> {}; | 321 : public RequestQueueStoreTest<RequestQueueStoreSQLFactory> {}; |
| 316 | 322 |
| 317 // Makes sure that persistent DB is actually persisting requests across store | 323 // Makes sure that persistent DB is actually persisting requests across store |
| 318 // restarts. | 324 // restarts. |
| 319 TEST_F(RequestQueueStoreSQLTest, SaveCloseReopenRead) { | 325 TEST_F(RequestQueueStoreSQLTest, SaveCloseReopenRead) { |
| 320 std::unique_ptr<RequestQueueStore> store(BuildStore()); | 326 std::unique_ptr<RequestQueueStore> store(BuildStore()); |
| 321 base::Time creation_time = base::Time::Now(); | 327 base::Time creation_time = base::Time::Now(); |
| 322 SavePageRequest original_request(kRequestId, kUrl, kClientId, creation_time); | 328 SavePageRequest original_request( |
| 329 kRequestId, kUrl, kClientId, creation_time, kUserRequested); |
| 323 store->AddOrUpdateRequest( | 330 store->AddOrUpdateRequest( |
| 324 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | 331 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, |
| 325 base::Unretained(this))); | 332 base::Unretained(this))); |
| 326 PumpLoop(); | 333 PumpLoop(); |
| 327 ClearResults(); | 334 ClearResults(); |
| 328 | 335 |
| 329 // Resets the store, using the same temp directory. The contents should be | 336 // Resets the store, using the same temp directory. The contents should be |
| 330 // intact. First reset is done separately to release DB lock. | 337 // intact. First reset is done separately to release DB lock. |
| 331 store.reset(); | 338 store.reset(); |
| 332 store = BuildStore(); | 339 store = BuildStore(); |
| 333 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | 340 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, |
| 334 base::Unretained(this))); | 341 base::Unretained(this))); |
| 335 ASSERT_EQ(LastResult::kNone, this->last_result()); | 342 ASSERT_EQ(LastResult::kNone, this->last_result()); |
| 336 this->PumpLoop(); | 343 this->PumpLoop(); |
| 337 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 344 ASSERT_EQ(LastResult::kTrue, this->last_result()); |
| 338 ASSERT_EQ(1ul, this->last_requests().size()); | 345 ASSERT_EQ(1ul, this->last_requests().size()); |
| 339 ASSERT_TRUE(original_request == this->last_requests()[0]); | 346 ASSERT_TRUE(original_request == this->last_requests()[0]); |
| 340 } | 347 } |
| 341 | 348 |
| 342 } // offline_pages | 349 } // offline_pages |
| OLD | NEW |