| 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.h" | 5 #include "components/offline_pages/background/request_queue.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 void SetUp() override; | 42 void SetUp() override; |
| 43 | 43 |
| 44 void PumpLoop(); | 44 void PumpLoop(); |
| 45 | 45 |
| 46 // Callback for adding requests. | 46 // Callback for adding requests. |
| 47 void AddRequestDone(AddRequestResult result, const SavePageRequest& request); | 47 void AddRequestDone(AddRequestResult result, const SavePageRequest& request); |
| 48 // Callback for getting requests. | 48 // Callback for getting requests. |
| 49 void GetRequestsDone(GetRequestsResult result, | 49 void GetRequestsDone(GetRequestsResult result, |
| 50 const std::vector<SavePageRequest>& requests); | 50 const std::vector<SavePageRequest>& requests); |
| 51 // Callback for removing request. | 51 // Callback for removing request. |
| 52 void RemoveRequestDone(UpdateRequestResult result); | 52 void RemoveRequestDone( |
| 53 const RequestQueue::UpdateMultipleRequestResults& results); |
| 53 | 54 |
| 54 void UpdateRequestDone(UpdateRequestResult result); | 55 void UpdateRequestDone(UpdateRequestResult result); |
| 55 | 56 |
| 56 RequestQueue* queue() { return queue_.get(); } | 57 RequestQueue* queue() { return queue_.get(); } |
| 57 | 58 |
| 58 AddRequestResult last_add_result() const { return last_add_result_; } | 59 AddRequestResult last_add_result() const { return last_add_result_; } |
| 59 SavePageRequest* last_added_request() { | 60 SavePageRequest* last_added_request() { |
| 60 return last_added_request_.get(); | 61 return last_added_request_.get(); |
| 61 } | 62 } |
| 62 | 63 |
| 63 UpdateRequestResult last_remove_result() const { return last_remove_result_; } | 64 const RequestQueue::UpdateMultipleRequestResults& last_remove_results() |
| 65 const { |
| 66 return last_remove_results_; |
| 67 } |
| 64 | 68 |
| 65 UpdateRequestResult last_update_result() const { return last_update_result_; } | 69 UpdateRequestResult last_update_result() const { return last_update_result_; } |
| 66 | 70 |
| 67 GetRequestsResult last_get_requests_result() const { | 71 GetRequestsResult last_get_requests_result() const { |
| 68 return last_get_requests_result_; | 72 return last_get_requests_result_; |
| 69 } | 73 } |
| 70 const std::vector<SavePageRequest>& last_requests() const { | 74 const std::vector<SavePageRequest>& last_requests() const { |
| 71 return last_requests_; | 75 return last_requests_; |
| 72 } | 76 } |
| 73 | 77 |
| 74 private: | 78 private: |
| 75 AddRequestResult last_add_result_; | 79 AddRequestResult last_add_result_; |
| 76 std::unique_ptr<SavePageRequest> last_added_request_; | 80 std::unique_ptr<SavePageRequest> last_added_request_; |
| 77 | 81 RequestQueue::UpdateMultipleRequestResults last_remove_results_; |
| 78 UpdateRequestResult last_remove_result_; | |
| 79 UpdateRequestResult last_update_result_; | 82 UpdateRequestResult last_update_result_; |
| 80 | 83 |
| 81 GetRequestsResult last_get_requests_result_; | 84 GetRequestsResult last_get_requests_result_; |
| 82 std::vector<SavePageRequest> last_requests_; | 85 std::vector<SavePageRequest> last_requests_; |
| 83 | 86 |
| 84 std::unique_ptr<RequestQueue> queue_; | 87 std::unique_ptr<RequestQueue> queue_; |
| 85 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 88 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 86 base::ThreadTaskRunnerHandle task_runner_handle_; | 89 base::ThreadTaskRunnerHandle task_runner_handle_; |
| 87 }; | 90 }; |
| 88 | 91 |
| 89 RequestQueueTest::RequestQueueTest() | 92 RequestQueueTest::RequestQueueTest() |
| 90 : last_add_result_(AddRequestResult::STORE_FAILURE), | 93 : last_add_result_(AddRequestResult::STORE_FAILURE), |
| 91 last_remove_result_(UpdateRequestResult::STORE_FAILURE), | |
| 92 last_update_result_(UpdateRequestResult::STORE_FAILURE), | 94 last_update_result_(UpdateRequestResult::STORE_FAILURE), |
| 93 last_get_requests_result_(GetRequestsResult::STORE_FAILURE), | 95 last_get_requests_result_(GetRequestsResult::STORE_FAILURE), |
| 94 task_runner_(new base::TestSimpleTaskRunner), | 96 task_runner_(new base::TestSimpleTaskRunner), |
| 95 task_runner_handle_(task_runner_) {} | 97 task_runner_handle_(task_runner_) {} |
| 96 | 98 |
| 97 RequestQueueTest::~RequestQueueTest() {} | 99 RequestQueueTest::~RequestQueueTest() {} |
| 98 | 100 |
| 99 void RequestQueueTest::SetUp() { | 101 void RequestQueueTest::SetUp() { |
| 100 std::unique_ptr<RequestQueueInMemoryStore> store( | 102 std::unique_ptr<RequestQueueInMemoryStore> store( |
| 101 new RequestQueueInMemoryStore()); | 103 new RequestQueueInMemoryStore()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 112 last_added_request_.reset(new SavePageRequest(request)); | 114 last_added_request_.reset(new SavePageRequest(request)); |
| 113 } | 115 } |
| 114 | 116 |
| 115 void RequestQueueTest::GetRequestsDone( | 117 void RequestQueueTest::GetRequestsDone( |
| 116 GetRequestsResult result, | 118 GetRequestsResult result, |
| 117 const std::vector<SavePageRequest>& requests) { | 119 const std::vector<SavePageRequest>& requests) { |
| 118 last_get_requests_result_ = result; | 120 last_get_requests_result_ = result; |
| 119 last_requests_ = requests; | 121 last_requests_ = requests; |
| 120 } | 122 } |
| 121 | 123 |
| 122 void RequestQueueTest::RemoveRequestDone(UpdateRequestResult result) { | 124 void RequestQueueTest::RemoveRequestDone( |
| 123 last_remove_result_ = result; | 125 const RequestQueue::UpdateMultipleRequestResults& results) { |
| 126 last_remove_results_ = results; |
| 124 } | 127 } |
| 125 | 128 |
| 126 void RequestQueueTest::UpdateRequestDone(UpdateRequestResult result) { | 129 void RequestQueueTest::UpdateRequestDone(UpdateRequestResult result) { |
| 127 last_update_result_ = result; | 130 last_update_result_ = result; |
| 128 } | 131 } |
| 129 | 132 |
| 130 TEST_F(RequestQueueTest, GetRequestsEmpty) { | 133 TEST_F(RequestQueueTest, GetRequestsEmpty) { |
| 131 queue()->GetRequests( | 134 queue()->GetRequests( |
| 132 base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this))); | 135 base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this))); |
| 133 PumpLoop(); | 136 PumpLoop(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 155 | 158 |
| 156 TEST_F(RequestQueueTest, RemoveRequest) { | 159 TEST_F(RequestQueueTest, RemoveRequest) { |
| 157 base::Time creation_time = base::Time::Now(); | 160 base::Time creation_time = base::Time::Now(); |
| 158 SavePageRequest request( | 161 SavePageRequest request( |
| 159 kRequestId, kUrl, kClientId, creation_time, kUserRequested); | 162 kRequestId, kUrl, kClientId, creation_time, kUserRequested); |
| 160 queue()->AddRequest(request, base::Bind(&RequestQueueTest::AddRequestDone, | 163 queue()->AddRequest(request, base::Bind(&RequestQueueTest::AddRequestDone, |
| 161 base::Unretained(this))); | 164 base::Unretained(this))); |
| 162 PumpLoop(); | 165 PumpLoop(); |
| 163 ASSERT_EQ(kRequestId, last_added_request()->request_id()); | 166 ASSERT_EQ(kRequestId, last_added_request()->request_id()); |
| 164 | 167 |
| 165 queue()->RemoveRequest( | 168 std::vector<int64_t> remove_requests; |
| 166 kRequestId, | 169 remove_requests.push_back(kRequestId); |
| 170 queue()->RemoveRequests( |
| 171 remove_requests, |
| 167 base::Bind(&RequestQueueTest::RemoveRequestDone, base::Unretained(this))); | 172 base::Bind(&RequestQueueTest::RemoveRequestDone, base::Unretained(this))); |
| 168 PumpLoop(); | 173 PumpLoop(); |
| 169 ASSERT_EQ(UpdateRequestResult::SUCCESS, last_remove_result()); | 174 ASSERT_EQ(1ul, last_remove_results().size()); |
| 175 ASSERT_EQ(UpdateRequestResult::SUCCESS, last_remove_results().at(0).second); |
| 170 | 176 |
| 171 queue()->GetRequests( | 177 queue()->GetRequests( |
| 172 base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this))); | 178 base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this))); |
| 173 PumpLoop(); | 179 PumpLoop(); |
| 174 ASSERT_EQ(GetRequestsResult::SUCCESS, last_get_requests_result()); | 180 ASSERT_EQ(GetRequestsResult::SUCCESS, last_get_requests_result()); |
| 175 ASSERT_EQ(0ul, last_requests().size()); | 181 ASSERT_EQ(0ul, last_requests().size()); |
| 176 } | 182 } |
| 177 | 183 |
| 178 TEST_F(RequestQueueTest, RemoveRequestByClientId) { | 184 TEST_F(RequestQueueTest, RemoveSeveralRequests) { |
| 179 base::Time creation_time = base::Time::Now(); | 185 base::Time creation_time = base::Time::Now(); |
| 180 // Put two requests on the queue with different client IDs. | |
| 181 SavePageRequest request(kRequestId, kUrl, kClientId, creation_time, | 186 SavePageRequest request(kRequestId, kUrl, kClientId, creation_time, |
| 182 kUserRequested); | 187 kUserRequested); |
| 183 queue()->AddRequest(request, base::Bind(&RequestQueueTest::AddRequestDone, | 188 queue()->AddRequest(request, base::Bind(&RequestQueueTest::AddRequestDone, |
| 184 base::Unretained(this))); | 189 base::Unretained(this))); |
| 190 PumpLoop(); |
| 191 ASSERT_EQ(kRequestId, last_added_request()->request_id()); |
| 192 |
| 185 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, | 193 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, |
| 186 kUserRequested); | 194 kUserRequested); |
| 187 queue()->AddRequest(request2, base::Bind(&RequestQueueTest::AddRequestDone, | 195 queue()->AddRequest(request2, base::Bind(&RequestQueueTest::AddRequestDone, |
| 188 base::Unretained(this))); | 196 base::Unretained(this))); |
| 189 PumpLoop(); | 197 PumpLoop(); |
| 198 ASSERT_EQ(kRequestId2, last_added_request()->request_id()); |
| 199 |
| 200 std::vector<int64_t> remove_requests; |
| 201 remove_requests.push_back(kRequestId); |
| 202 remove_requests.push_back(kRequestId2); |
| 203 queue()->RemoveRequests( |
| 204 remove_requests, |
| 205 base::Bind(&RequestQueueTest::RemoveRequestDone, base::Unretained(this))); |
| 206 PumpLoop(); |
| 207 ASSERT_EQ(2ul, last_remove_results().size()); |
| 208 ASSERT_EQ(UpdateRequestResult::SUCCESS, last_remove_results().at(0).second); |
| 209 ASSERT_EQ(UpdateRequestResult::SUCCESS, last_remove_results().at(1).second); |
| 210 ASSERT_EQ(kRequestId, last_remove_results().at(0).first); |
| 211 ASSERT_EQ(kRequestId2, last_remove_results().at(1).first); |
| 190 | 212 |
| 191 queue()->GetRequests( | 213 queue()->GetRequests( |
| 192 base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this))); | 214 base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this))); |
| 193 PumpLoop(); | 215 PumpLoop(); |
| 194 ASSERT_EQ(GetRequestsResult::SUCCESS, last_get_requests_result()); | 216 ASSERT_EQ(GetRequestsResult::SUCCESS, last_get_requests_result()); |
| 195 ASSERT_EQ(2ul, last_requests().size()); | 217 ASSERT_EQ(0ul, last_requests().size()); |
| 196 | |
| 197 std::vector<ClientId> client_ids; | |
| 198 client_ids.push_back(kClientId); | |
| 199 | |
| 200 // Removing the first client ID should leave only the second on the queue. | |
| 201 queue()->RemoveRequestsByClientId( | |
| 202 client_ids, | |
| 203 base::Bind(&RequestQueueTest::RemoveRequestDone, base::Unretained(this))); | |
| 204 PumpLoop(); | |
| 205 ASSERT_EQ(UpdateRequestResult::SUCCESS, last_remove_result()); | |
| 206 | |
| 207 queue()->GetRequests( | |
| 208 base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this))); | |
| 209 PumpLoop(); | |
| 210 ASSERT_EQ(GetRequestsResult::SUCCESS, last_get_requests_result()); | |
| 211 ASSERT_EQ(1ul, last_requests().size()); | |
| 212 ASSERT_EQ(kClientId2, last_requests().front().client_id()); | |
| 213 } | 218 } |
| 214 | 219 |
| 215 // A longer test populating the request queue with more than one item, properly | 220 // A longer test populating the request queue with more than one item, properly |
| 216 // listing multiple items and removing the right item. | 221 // listing multiple items and removing the right item. |
| 217 TEST_F(RequestQueueTest, MultipleRequestsAddGetRemove) { | 222 TEST_F(RequestQueueTest, MultipleRequestsAddGetRemove) { |
| 218 base::Time creation_time = base::Time::Now(); | 223 base::Time creation_time = base::Time::Now(); |
| 219 SavePageRequest request1( | 224 SavePageRequest request1( |
| 220 kRequestId, kUrl, kClientId, creation_time, kUserRequested); | 225 kRequestId, kUrl, kClientId, creation_time, kUserRequested); |
| 221 queue()->AddRequest(request1, base::Bind(&RequestQueueTest::AddRequestDone, | 226 queue()->AddRequest(request1, base::Bind(&RequestQueueTest::AddRequestDone, |
| 222 base::Unretained(this))); | 227 base::Unretained(this))); |
| 223 PumpLoop(); | 228 PumpLoop(); |
| 224 ASSERT_EQ(request1.request_id(), last_added_request()->request_id()); | 229 ASSERT_EQ(request1.request_id(), last_added_request()->request_id()); |
| 225 SavePageRequest request2( | 230 SavePageRequest request2( |
| 226 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); | 231 kRequestId2, kUrl2, kClientId2, creation_time, kUserRequested); |
| 227 queue()->AddRequest(request2, base::Bind(&RequestQueueTest::AddRequestDone, | 232 queue()->AddRequest(request2, base::Bind(&RequestQueueTest::AddRequestDone, |
| 228 base::Unretained(this))); | 233 base::Unretained(this))); |
| 229 PumpLoop(); | 234 PumpLoop(); |
| 230 ASSERT_EQ(request2.request_id(), last_added_request()->request_id()); | 235 ASSERT_EQ(request2.request_id(), last_added_request()->request_id()); |
| 231 | 236 |
| 232 queue()->GetRequests( | 237 queue()->GetRequests( |
| 233 base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this))); | 238 base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this))); |
| 234 PumpLoop(); | 239 PumpLoop(); |
| 235 ASSERT_EQ(GetRequestsResult::SUCCESS, last_get_requests_result()); | 240 ASSERT_EQ(GetRequestsResult::SUCCESS, last_get_requests_result()); |
| 236 ASSERT_EQ(2ul, last_requests().size()); | 241 ASSERT_EQ(2ul, last_requests().size()); |
| 237 | 242 |
| 238 queue()->RemoveRequest( | 243 std::vector<int64_t> remove_requests; |
| 239 request1.request_id(), | 244 remove_requests.push_back(request1.request_id()); |
| 245 queue()->RemoveRequests( |
| 246 remove_requests, |
| 240 base::Bind(&RequestQueueTest::RemoveRequestDone, base::Unretained(this))); | 247 base::Bind(&RequestQueueTest::RemoveRequestDone, base::Unretained(this))); |
| 241 PumpLoop(); | 248 PumpLoop(); |
| 242 ASSERT_EQ(UpdateRequestResult::SUCCESS, last_remove_result()); | 249 ASSERT_EQ(1ul, last_remove_results().size()); |
| 250 ASSERT_EQ(kRequestId, last_remove_results().at(0).first); |
| 251 ASSERT_EQ(UpdateRequestResult::SUCCESS, last_remove_results().at(0).second); |
| 243 | 252 |
| 244 queue()->GetRequests( | 253 queue()->GetRequests( |
| 245 base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this))); | 254 base::Bind(&RequestQueueTest::GetRequestsDone, base::Unretained(this))); |
| 246 PumpLoop(); | 255 PumpLoop(); |
| 247 ASSERT_EQ(GetRequestsResult::SUCCESS, last_get_requests_result()); | 256 ASSERT_EQ(GetRequestsResult::SUCCESS, last_get_requests_result()); |
| 248 ASSERT_EQ(1ul, last_requests().size()); | 257 ASSERT_EQ(1ul, last_requests().size()); |
| 249 ASSERT_EQ(request2.request_id(), last_requests()[0].request_id()); | 258 ASSERT_EQ(request2.request_id(), last_requests()[0].request_id()); |
| 250 } | 259 } |
| 251 | 260 |
| 252 TEST_F(RequestQueueTest, UpdateRequest) { | 261 TEST_F(RequestQueueTest, UpdateRequest) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 288 | 297 |
| 289 // Try to update request1 when only request2 is in the queue. | 298 // Try to update request1 when only request2 is in the queue. |
| 290 queue()->UpdateRequest( | 299 queue()->UpdateRequest( |
| 291 request1, | 300 request1, |
| 292 base::Bind(&RequestQueueTest::UpdateRequestDone, base::Unretained(this))); | 301 base::Bind(&RequestQueueTest::UpdateRequestDone, base::Unretained(this))); |
| 293 PumpLoop(); | 302 PumpLoop(); |
| 294 ASSERT_EQ(UpdateRequestResult::REQUEST_DOES_NOT_EXIST, last_update_result()); | 303 ASSERT_EQ(UpdateRequestResult::REQUEST_DOES_NOT_EXIST, last_update_result()); |
| 295 } | 304 } |
| 296 | 305 |
| 297 } // namespace offline_pages | 306 } // namespace offline_pages |
| OLD | NEW |