| 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.h" |
| 14 #include "components/offline_pages/background/request_queue_in_memory_store.h" | 15 #include "components/offline_pages/background/request_queue_in_memory_store.h" |
| 15 #include "components/offline_pages/background/request_queue_store_sql.h" | 16 #include "components/offline_pages/background/request_queue_store_sql.h" |
| 16 #include "components/offline_pages/background/save_page_request.h" | 17 #include "components/offline_pages/background/save_page_request.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
| 18 | 19 |
| 19 namespace offline_pages { | 20 namespace offline_pages { |
| 20 | 21 |
| 21 using UpdateStatus = RequestQueueStore::UpdateStatus; | 22 using UpdateStatus = RequestQueueStore::UpdateStatus; |
| 22 | 23 |
| 23 namespace { | 24 namespace { |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 | 61 |
| 61 void PumpLoop(); | 62 void PumpLoop(); |
| 62 void ClearResults(); | 63 void ClearResults(); |
| 63 | 64 |
| 64 // Callback used for get requests. | 65 // Callback used for get requests. |
| 65 void GetRequestsDone(bool result, | 66 void GetRequestsDone(bool result, |
| 66 const std::vector<SavePageRequest>& requests); | 67 const std::vector<SavePageRequest>& requests); |
| 67 // Callback used for add/update request. | 68 // Callback used for add/update request. |
| 68 void AddOrUpdateDone(UpdateStatus result); | 69 void AddOrUpdateDone(UpdateStatus result); |
| 69 // Callback used for remove requests. | 70 // Callback used for remove requests. |
| 70 void RemoveDone(bool result, int count); | 71 void RemoveDone( |
| 72 const std::vector<int64_t>& request_ids, |
| 73 const std::vector<RequestQueue::UpdateRequestResult>& results); |
| 71 // Callback used for reset. | 74 // Callback used for reset. |
| 72 void ResetDone(bool result); | 75 void ResetDone(bool result); |
| 73 | 76 |
| 74 LastResult last_result() const { return last_result_; } | 77 LastResult last_result() const { return last_result_; } |
| 75 UpdateStatus last_update_status() const { return last_update_status_; } | 78 UpdateStatus last_update_status() const { return last_update_status_; } |
| 76 int last_remove_count() const { return last_remove_count_; } | 79 const std::vector<int64_t>& last_remove_request_ids() { |
| 80 return last_remove_request_ids_; |
| 81 } |
| 82 const std::vector<RequestQueue::UpdateRequestResult>& last_remove_results() |
| 83 const { |
| 84 return last_remove_results_; |
| 85 } |
| 77 const std::vector<SavePageRequest>& last_requests() const { | 86 const std::vector<SavePageRequest>& last_requests() const { |
| 78 return last_requests_; | 87 return last_requests_; |
| 79 } | 88 } |
| 80 | 89 |
| 81 protected: | 90 protected: |
| 82 base::ScopedTempDir temp_directory_; | 91 base::ScopedTempDir temp_directory_; |
| 83 | 92 |
| 84 private: | 93 private: |
| 85 LastResult last_result_; | 94 LastResult last_result_; |
| 86 UpdateStatus last_update_status_; | 95 UpdateStatus last_update_status_; |
| 87 int last_remove_count_; | 96 std::vector<int64_t> last_remove_request_ids_; |
| 97 std::vector<RequestQueue::UpdateRequestResult> last_remove_results_; |
| 88 std::vector<SavePageRequest> last_requests_; | 98 std::vector<SavePageRequest> last_requests_; |
| 89 | 99 |
| 90 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 100 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 91 base::ThreadTaskRunnerHandle task_runner_handle_; | 101 base::ThreadTaskRunnerHandle task_runner_handle_; |
| 92 }; | 102 }; |
| 93 | 103 |
| 94 RequestQueueStoreTestBase::RequestQueueStoreTestBase() | 104 RequestQueueStoreTestBase::RequestQueueStoreTestBase() |
| 95 : last_result_(LastResult::kNone), | 105 : last_result_(LastResult::kNone), |
| 96 last_update_status_(UpdateStatus::FAILED), | 106 last_update_status_(UpdateStatus::FAILED), |
| 97 last_remove_count_(0), | |
| 98 task_runner_(new base::TestSimpleTaskRunner), | 107 task_runner_(new base::TestSimpleTaskRunner), |
| 99 task_runner_handle_(task_runner_) { | 108 task_runner_handle_(task_runner_) { |
| 100 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir()); | 109 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir()); |
| 101 } | 110 } |
| 102 | 111 |
| 103 void RequestQueueStoreTestBase::TearDown() { | 112 void RequestQueueStoreTestBase::TearDown() { |
| 104 // Wait for all the pieces of the store to delete itself properly. | 113 // Wait for all the pieces of the store to delete itself properly. |
| 105 PumpLoop(); | 114 PumpLoop(); |
| 106 } | 115 } |
| 107 | 116 |
| 108 void RequestQueueStoreTestBase::PumpLoop() { | 117 void RequestQueueStoreTestBase::PumpLoop() { |
| 109 task_runner_->RunUntilIdle(); | 118 task_runner_->RunUntilIdle(); |
| 110 } | 119 } |
| 111 | 120 |
| 112 void RequestQueueStoreTestBase::ClearResults() { | 121 void RequestQueueStoreTestBase::ClearResults() { |
| 113 last_result_ = LastResult::kNone; | 122 last_result_ = LastResult::kNone; |
| 114 last_update_status_ = UpdateStatus::FAILED; | 123 last_update_status_ = UpdateStatus::FAILED; |
| 115 last_remove_count_ = 0; | 124 last_remove_request_ids_.clear(); |
| 125 last_remove_results_.clear(); |
| 116 last_requests_.clear(); | 126 last_requests_.clear(); |
| 117 } | 127 } |
| 118 | 128 |
| 119 void RequestQueueStoreTestBase::GetRequestsDone( | 129 void RequestQueueStoreTestBase::GetRequestsDone( |
| 120 bool result, | 130 bool result, |
| 121 const std::vector<SavePageRequest>& requests) { | 131 const std::vector<SavePageRequest>& requests) { |
| 122 last_result_ = result ? LastResult::kTrue : LastResult::kFalse; | 132 last_result_ = result ? LastResult::kTrue : LastResult::kFalse; |
| 123 last_requests_ = requests; | 133 last_requests_ = requests; |
| 124 } | 134 } |
| 125 | 135 |
| 126 void RequestQueueStoreTestBase::AddOrUpdateDone(UpdateStatus status) { | 136 void RequestQueueStoreTestBase::AddOrUpdateDone(UpdateStatus status) { |
| 127 last_update_status_ = status; | 137 last_update_status_ = status; |
| 128 } | 138 } |
| 129 | 139 |
| 130 void RequestQueueStoreTestBase::RemoveDone(bool result, int count) { | 140 void RequestQueueStoreTestBase::RemoveDone( |
| 131 last_result_ = result ? LastResult::kTrue : LastResult::kFalse; | 141 const std::vector<int64_t>& request_ids, |
| 132 last_remove_count_ = count; | 142 const std::vector<RequestQueue::UpdateRequestResult>& results) { |
| 143 last_remove_request_ids_ = request_ids; |
| 144 last_remove_results_ = results; |
| 133 } | 145 } |
| 134 | 146 |
| 135 void RequestQueueStoreTestBase::ResetDone(bool result) { | 147 void RequestQueueStoreTestBase::ResetDone(bool result) { |
| 136 last_result_ = result ? LastResult::kTrue : LastResult::kFalse; | 148 last_result_ = result ? LastResult::kTrue : LastResult::kFalse; |
| 137 } | 149 } |
| 138 | 150 |
| 139 // Defines interface for the store factory. | 151 // Defines interface for the store factory. |
| 140 class RequestQueueStoreFactory { | 152 class RequestQueueStoreFactory { |
| 141 public: | 153 public: |
| 142 virtual RequestQueueStore* BuildStore(const base::FilePath& path) = 0; | 154 virtual RequestQueueStore* BuildStore(const base::FilePath& path) = 0; |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 this->ClearResults(); | 262 this->ClearResults(); |
| 251 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | 263 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, |
| 252 base::Unretained(this))); | 264 base::Unretained(this))); |
| 253 ASSERT_EQ(LastResult::kNone, this->last_result()); | 265 ASSERT_EQ(LastResult::kNone, this->last_result()); |
| 254 this->PumpLoop(); | 266 this->PumpLoop(); |
| 255 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 267 ASSERT_EQ(LastResult::kTrue, this->last_result()); |
| 256 ASSERT_EQ(1ul, this->last_requests().size()); | 268 ASSERT_EQ(1ul, this->last_requests().size()); |
| 257 ASSERT_TRUE(updated_request == this->last_requests()[0]); | 269 ASSERT_TRUE(updated_request == this->last_requests()[0]); |
| 258 } | 270 } |
| 259 | 271 |
| 260 TYPED_TEST(RequestQueueStoreTest, RemoveRequest) { | 272 TYPED_TEST(RequestQueueStoreTest, RemoveRequests) { |
| 261 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | 273 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); |
| 262 base::Time creation_time = base::Time::Now(); | 274 base::Time creation_time = base::Time::Now(); |
| 263 SavePageRequest original_request( | 275 SavePageRequest request1(kRequestId, kUrl, kClientId, creation_time, |
| 264 kRequestId, kUrl, kClientId, creation_time, kUserRequested); | 276 kUserRequested); |
| 265 store->AddOrUpdateRequest( | 277 store->AddOrUpdateRequest( |
| 266 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | 278 request1, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, |
| 267 base::Unretained(this))); | 279 base::Unretained(this))); |
| 280 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, |
| 281 kUserRequested); |
| 282 store->AddOrUpdateRequest( |
| 283 request2, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, |
| 284 base::Unretained(this))); |
| 268 this->PumpLoop(); | 285 this->PumpLoop(); |
| 269 this->ClearResults(); | 286 this->ClearResults(); |
| 270 | 287 |
| 271 std::vector<int64_t> request_ids{kRequestId}; | 288 std::vector<int64_t> request_ids{kRequestId, kRequestId2}; |
| 272 store->RemoveRequests(request_ids, | 289 store->RemoveRequests(request_ids, |
| 273 base::Bind(&RequestQueueStoreTestBase::RemoveDone, | 290 base::Bind(&RequestQueueStoreTestBase::RemoveDone, |
| 274 base::Unretained(this))); | 291 base::Unretained(this))); |
| 275 ASSERT_EQ(LastResult::kNone, this->last_result()); | 292 ASSERT_EQ(0ul, this->last_remove_request_ids().size()); |
| 276 ASSERT_EQ(0, this->last_remove_count()); | 293 ASSERT_EQ(0ul, this->last_remove_results().size()); |
| 277 this->PumpLoop(); | 294 this->PumpLoop(); |
| 278 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 295 ASSERT_EQ(2ul, this->last_remove_request_ids().size()); |
| 279 ASSERT_EQ(1, this->last_remove_count()); | 296 ASSERT_EQ(2ul, this->last_remove_results().size()); |
| 297 ASSERT_EQ(RequestQueue::UpdateRequestResult::SUCCESS, |
| 298 this->last_remove_results().at(0)); |
| 299 ASSERT_EQ(RequestQueue::UpdateRequestResult::SUCCESS, |
| 300 this->last_remove_results().at(1)); |
| 280 this->ClearResults(); | 301 this->ClearResults(); |
| 281 | 302 |
| 282 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | 303 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, |
| 283 base::Unretained(this))); | 304 base::Unretained(this))); |
| 284 this->PumpLoop(); | 305 this->PumpLoop(); |
| 285 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 306 ASSERT_EQ(LastResult::kTrue, this->last_result()); |
| 286 ASSERT_TRUE(this->last_requests().empty()); | 307 ASSERT_TRUE(this->last_requests().empty()); |
| 287 this->ClearResults(); | 308 this->ClearResults(); |
| 288 | 309 |
| 289 // Try to remove a request that is not in the queue. | 310 // Try to remove a request that is not in the queue. |
| 290 store->RemoveRequests(request_ids, | 311 store->RemoveRequests(request_ids, |
| 291 base::Bind(&RequestQueueStoreTestBase::RemoveDone, | 312 base::Bind(&RequestQueueStoreTestBase::RemoveDone, |
| 292 base::Unretained(this))); | 313 base::Unretained(this))); |
| 293 ASSERT_EQ(LastResult::kNone, this->last_result()); | 314 ASSERT_EQ(LastResult::kNone, this->last_result()); |
| 294 ASSERT_EQ(0, this->last_remove_count()); | |
| 295 this->PumpLoop(); | 315 this->PumpLoop(); |
| 296 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 316 ASSERT_EQ(2ul, this->last_remove_results().size()); |
| 297 ASSERT_EQ(0, this->last_remove_count()); | 317 // Since the SQL statement returns true on a delete of an item that isn't |
| 298 } | 318 // present, SQL is returning SUCCESS, but the memory is returning |
| 299 | 319 // REQUEST_DOES_NOT_EXIST, so we just check that the result is not failure. |
| 300 TYPED_TEST(RequestQueueStoreTest, RemoveRequestByClientId) { | 320 ASSERT_NE(RequestQueue::UpdateRequestResult::STORE_FAILURE, |
| 301 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | 321 this->last_remove_results().at(0)); |
| 302 base::Time creation_time = base::Time::Now(); | 322 ASSERT_NE(RequestQueue::UpdateRequestResult::STORE_FAILURE, |
| 303 | 323 this->last_remove_results().at(1)); |
| 304 // Create requests and add them to the queue. | |
| 305 SavePageRequest request1(kRequestId, kUrl, kClientId, creation_time, | |
| 306 kUserRequested); | |
| 307 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, | |
| 308 kUserRequested); | |
| 309 store->AddOrUpdateRequest( | |
| 310 request1, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | |
| 311 base::Unretained(this))); | |
| 312 store->AddOrUpdateRequest( | |
| 313 request2, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | |
| 314 base::Unretained(this))); | |
| 315 this->PumpLoop(); | |
| 316 this->ClearResults(); | |
| 317 | |
| 318 // Remove a request. | |
| 319 std::vector<ClientId> client_ids_to_delete{kClientId}; | |
| 320 store->RemoveRequestsByClientId( | |
| 321 client_ids_to_delete, | |
| 322 base::Bind( | |
| 323 &RequestQueueStoreTestBase::RemoveDone, base::Unretained(this))); | |
| 324 ASSERT_EQ(LastResult::kNone, this->last_result()); | |
| 325 ASSERT_EQ(0, this->last_remove_count()); | |
| 326 this->PumpLoop(); | |
| 327 ASSERT_EQ(LastResult::kTrue, this->last_result()); | |
| 328 ASSERT_EQ(1, this->last_remove_count()); | |
| 329 this->ClearResults(); | |
| 330 | |
| 331 // Check to see what remains in the queue. Removed request should be gone. | |
| 332 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | |
| 333 base::Unretained(this))); | |
| 334 this->PumpLoop(); | |
| 335 ASSERT_EQ(LastResult::kTrue, this->last_result()); | |
| 336 // The other request should still be in the queue. | |
| 337 ASSERT_EQ(1UL, this->last_requests().size()); | |
| 338 ASSERT_EQ(kClientId2, this->last_requests().at(0).client_id()); | |
| 339 this->ClearResults(); | |
| 340 | |
| 341 // Try to remove a request that is not in the queue. | |
| 342 store->RemoveRequestsByClientId( | |
| 343 client_ids_to_delete, | |
| 344 base::Bind( | |
| 345 &RequestQueueStoreTestBase::RemoveDone, base::Unretained(this))); | |
| 346 this->PumpLoop(); | |
| 347 ASSERT_EQ(LastResult::kTrue, this->last_result()); | |
| 348 ASSERT_EQ(0, this->last_remove_count()); | |
| 349 } | |
| 350 | |
| 351 TYPED_TEST(RequestQueueStoreTest, RemoveRequestWithSameClientId) { | |
| 352 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | |
| 353 base::Time creation_time = base::Time::Now(); | |
| 354 | |
| 355 // Create requests and add them to the queue. | |
| 356 SavePageRequest request1(kRequestId, kUrl, kClientId, creation_time, | |
| 357 kUserRequested); | |
| 358 SavePageRequest request2(kRequestId2, kUrl2, kClientId, creation_time, | |
| 359 kUserRequested); | |
| 360 store->AddOrUpdateRequest( | |
| 361 request1, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | |
| 362 base::Unretained(this))); | |
| 363 store->AddOrUpdateRequest( | |
| 364 request2, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | |
| 365 base::Unretained(this))); | |
| 366 this->PumpLoop(); | |
| 367 this->ClearResults(); | |
| 368 | |
| 369 // Remove a request. | |
| 370 std::vector<ClientId> client_ids_to_delete{kClientId}; | |
| 371 store->RemoveRequestsByClientId( | |
| 372 client_ids_to_delete, | |
| 373 base::Bind( | |
| 374 &RequestQueueStoreTestBase::RemoveDone, base::Unretained(this))); | |
| 375 ASSERT_EQ(LastResult::kNone, this->last_result()); | |
| 376 ASSERT_EQ(0, this->last_remove_count()); | |
| 377 this->PumpLoop(); | |
| 378 ASSERT_EQ(LastResult::kTrue, this->last_result()); | |
| 379 ASSERT_EQ(2, this->last_remove_count()); | |
| 380 this->ClearResults(); | |
| 381 | |
| 382 // Check to see what remains in the queue. Removed request should be gone. | |
| 383 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | |
| 384 base::Unretained(this))); | |
| 385 this->PumpLoop(); | |
| 386 ASSERT_EQ(LastResult::kTrue, this->last_result()); | |
| 387 // The other request should still be in the queue. | |
| 388 ASSERT_TRUE(this->last_requests().empty()); | |
| 389 this->ClearResults(); | |
| 390 } | 324 } |
| 391 | 325 |
| 392 TYPED_TEST(RequestQueueStoreTest, ResetStore) { | 326 TYPED_TEST(RequestQueueStoreTest, ResetStore) { |
| 393 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | 327 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); |
| 394 base::Time creation_time = base::Time::Now(); | 328 base::Time creation_time = base::Time::Now(); |
| 395 SavePageRequest original_request( | 329 SavePageRequest original_request( |
| 396 kRequestId, kUrl, kClientId, creation_time, kUserRequested); | 330 kRequestId, kUrl, kClientId, creation_time, kUserRequested); |
| 397 store->AddOrUpdateRequest( | 331 store->AddOrUpdateRequest( |
| 398 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, | 332 original_request, base::Bind(&RequestQueueStoreTestBase::AddOrUpdateDone, |
| 399 base::Unretained(this))); | 333 base::Unretained(this))); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | 371 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, |
| 438 base::Unretained(this))); | 372 base::Unretained(this))); |
| 439 ASSERT_EQ(LastResult::kNone, this->last_result()); | 373 ASSERT_EQ(LastResult::kNone, this->last_result()); |
| 440 this->PumpLoop(); | 374 this->PumpLoop(); |
| 441 ASSERT_EQ(LastResult::kTrue, this->last_result()); | 375 ASSERT_EQ(LastResult::kTrue, this->last_result()); |
| 442 ASSERT_EQ(1ul, this->last_requests().size()); | 376 ASSERT_EQ(1ul, this->last_requests().size()); |
| 443 ASSERT_TRUE(original_request == this->last_requests()[0]); | 377 ASSERT_TRUE(original_request == this->last_requests()[0]); |
| 444 } | 378 } |
| 445 | 379 |
| 446 } // offline_pages | 380 } // offline_pages |
| OLD | NEW |