OLD | NEW |
| (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/background/request_queue_store.h" | |
6 | |
7 #include <memory> | |
8 | |
9 #include "base/bind.h" | |
10 #include "base/files/file_path.h" | |
11 #include "base/files/scoped_temp_dir.h" | |
12 #include "base/test/test_simple_task_runner.h" | |
13 #include "base/threading/thread_task_runner_handle.h" | |
14 #include "components/offline_pages/background/request_queue.h" | |
15 #include "components/offline_pages/background/request_queue_in_memory_store.h" | |
16 #include "components/offline_pages/background/request_queue_store_sql.h" | |
17 #include "components/offline_pages/background/save_page_request.h" | |
18 #include "testing/gtest/include/gtest/gtest.h" | |
19 | |
20 namespace offline_pages { | |
21 | |
22 using UpdateStatus = RequestQueueStore::UpdateStatus; | |
23 | |
24 namespace { | |
25 const int64_t kRequestId = 42; | |
26 const int64_t kRequestId2 = 44; | |
27 const int64_t kRequestId3 = 47; | |
28 const GURL kUrl("http://example.com"); | |
29 const GURL kUrl2("http://another-example.com"); | |
30 const ClientId kClientId("bookmark", "1234"); | |
31 const ClientId kClientId2("async", "5678"); | |
32 const bool kUserRequested = true; | |
33 | |
34 enum class LastResult { | |
35 RESULT_NONE, | |
36 RESULT_FALSE, | |
37 RESULT_TRUE, | |
38 }; | |
39 | |
40 } // namespace | |
41 | |
42 // Class that serves as a base for testing different implementations of the | |
43 // |RequestQueueStore|. Specific implementations extend the templatized version | |
44 // of this class and provide appropriate store factory. | |
45 class RequestQueueStoreTestBase : public testing::Test { | |
46 public: | |
47 RequestQueueStoreTestBase(); | |
48 | |
49 // Test overrides. | |
50 void TearDown() override; | |
51 | |
52 void PumpLoop(); | |
53 void ClearResults(); | |
54 void InitializeStore(RequestQueueStore* store); | |
55 | |
56 void InitializeCallback(bool success); | |
57 // Callback used for get requests. | |
58 void GetRequestsDone(bool result, | |
59 std::vector<std::unique_ptr<SavePageRequest>> requests); | |
60 // Callback used for add/update request. | |
61 void AddOrUpdateDone(UpdateStatus result); | |
62 void AddRequestDone(ItemActionStatus status); | |
63 void UpdateRequestDone(std::unique_ptr<UpdateRequestsResult> result); | |
64 // Callback used for reset. | |
65 void ResetDone(bool result); | |
66 | |
67 LastResult last_result() const { return last_result_; } | |
68 UpdateStatus last_update_status() const { return last_update_status_; } | |
69 const std::vector<std::unique_ptr<SavePageRequest>>& last_requests() const { | |
70 return last_requests_; | |
71 } | |
72 ItemActionStatus last_add_status() const { return last_add_status_; } | |
73 | |
74 UpdateRequestsResult* last_update_result() const { | |
75 return last_update_result_.get(); | |
76 } | |
77 | |
78 protected: | |
79 base::ScopedTempDir temp_directory_; | |
80 | |
81 private: | |
82 LastResult last_result_; | |
83 UpdateStatus last_update_status_; | |
84 ItemActionStatus last_add_status_; | |
85 std::unique_ptr<UpdateRequestsResult> last_update_result_; | |
86 std::vector<std::unique_ptr<SavePageRequest>> last_requests_; | |
87 | |
88 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | |
89 base::ThreadTaskRunnerHandle task_runner_handle_; | |
90 }; | |
91 | |
92 RequestQueueStoreTestBase::RequestQueueStoreTestBase() | |
93 : last_result_(LastResult::RESULT_NONE), | |
94 last_update_status_(UpdateStatus::FAILED), | |
95 last_add_status_(ItemActionStatus::NOT_FOUND), | |
96 task_runner_(new base::TestSimpleTaskRunner), | |
97 task_runner_handle_(task_runner_) { | |
98 EXPECT_TRUE(temp_directory_.CreateUniqueTempDir()); | |
99 } | |
100 | |
101 void RequestQueueStoreTestBase::TearDown() { | |
102 // Wait for all the pieces of the store to delete itself properly. | |
103 PumpLoop(); | |
104 } | |
105 | |
106 void RequestQueueStoreTestBase::PumpLoop() { | |
107 task_runner_->RunUntilIdle(); | |
108 } | |
109 | |
110 void RequestQueueStoreTestBase::ClearResults() { | |
111 last_result_ = LastResult::RESULT_NONE; | |
112 last_update_status_ = UpdateStatus::FAILED; | |
113 last_add_status_ = ItemActionStatus::NOT_FOUND; | |
114 last_requests_.clear(); | |
115 last_update_result_.reset(nullptr); | |
116 } | |
117 | |
118 void RequestQueueStoreTestBase::InitializeStore(RequestQueueStore* store) { | |
119 store->Initialize(base::Bind(&RequestQueueStoreTestBase::InitializeCallback, | |
120 base::Unretained(this))); | |
121 PumpLoop(); | |
122 ASSERT_EQ(LastResult::RESULT_TRUE, this->last_result()); | |
123 ClearResults(); | |
124 } | |
125 | |
126 void RequestQueueStoreTestBase::InitializeCallback(bool success) { | |
127 last_result_ = success ? LastResult::RESULT_TRUE : LastResult::RESULT_FALSE; | |
128 } | |
129 | |
130 void RequestQueueStoreTestBase::GetRequestsDone( | |
131 bool result, | |
132 std::vector<std::unique_ptr<SavePageRequest>> requests) { | |
133 last_result_ = result ? LastResult::RESULT_TRUE : LastResult::RESULT_FALSE; | |
134 last_requests_ = std::move(requests); | |
135 } | |
136 | |
137 void RequestQueueStoreTestBase::AddOrUpdateDone(UpdateStatus status) { | |
138 last_update_status_ = status; | |
139 } | |
140 | |
141 void RequestQueueStoreTestBase::AddRequestDone(ItemActionStatus status) { | |
142 last_add_status_ = status; | |
143 } | |
144 | |
145 void RequestQueueStoreTestBase::UpdateRequestDone( | |
146 std::unique_ptr<UpdateRequestsResult> result) { | |
147 last_update_result_ = std::move(result); | |
148 } | |
149 | |
150 void RequestQueueStoreTestBase::ResetDone(bool result) { | |
151 last_result_ = result ? LastResult::RESULT_TRUE : LastResult::RESULT_FALSE; | |
152 } | |
153 | |
154 // Defines interface for the store factory. | |
155 class RequestQueueStoreFactory { | |
156 public: | |
157 virtual RequestQueueStore* BuildStore(const base::FilePath& path) = 0; | |
158 }; | |
159 | |
160 // Implements a store factory for in memory store. | |
161 class RequestQueueInMemoryStoreFactory : public RequestQueueStoreFactory { | |
162 public: | |
163 RequestQueueStore* BuildStore(const base::FilePath& path) override { | |
164 RequestQueueStore* store = new RequestQueueInMemoryStore(); | |
165 return store; | |
166 } | |
167 }; | |
168 | |
169 // Implements a store factory for SQLite based implementation of the store. | |
170 class RequestQueueStoreSQLFactory : public RequestQueueStoreFactory { | |
171 public: | |
172 RequestQueueStore* BuildStore(const base::FilePath& path) override { | |
173 RequestQueueStore* store = | |
174 new RequestQueueStoreSQL(base::ThreadTaskRunnerHandle::Get(), path); | |
175 return store; | |
176 } | |
177 }; | |
178 | |
179 // Defines a store test fixture templatized by the store factory. | |
180 template <typename T> | |
181 class RequestQueueStoreTest : public RequestQueueStoreTestBase { | |
182 public: | |
183 std::unique_ptr<RequestQueueStore> BuildStore(); | |
184 | |
185 protected: | |
186 T factory_; | |
187 }; | |
188 | |
189 template <typename T> | |
190 std::unique_ptr<RequestQueueStore> RequestQueueStoreTest<T>::BuildStore() { | |
191 std::unique_ptr<RequestQueueStore> store( | |
192 factory_.BuildStore(temp_directory_.GetPath())); | |
193 return store; | |
194 } | |
195 | |
196 // |StoreTypes| lists all factories, based on which the tests will be created. | |
197 typedef testing::Types<RequestQueueInMemoryStoreFactory, | |
198 RequestQueueStoreSQLFactory> | |
199 StoreTypes; | |
200 | |
201 // This portion causes test fixtures to be defined. | |
202 // Notice that in the store we are using "this->" to refer to the methods | |
203 // defined on the |RequestQuieueStoreBaseTest| class. That's by design. | |
204 TYPED_TEST_CASE(RequestQueueStoreTest, StoreTypes); | |
205 | |
206 TYPED_TEST(RequestQueueStoreTest, GetRequestsEmpty) { | |
207 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | |
208 this->InitializeStore(store.get()); | |
209 | |
210 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | |
211 base::Unretained(this))); | |
212 ASSERT_EQ(LastResult::RESULT_NONE, this->last_result()); | |
213 this->PumpLoop(); | |
214 ASSERT_EQ(LastResult::RESULT_TRUE, this->last_result()); | |
215 ASSERT_TRUE(this->last_requests().empty()); | |
216 } | |
217 | |
218 TYPED_TEST(RequestQueueStoreTest, GetRequestsByIds) { | |
219 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | |
220 this->InitializeStore(store.get()); | |
221 | |
222 base::Time creation_time = base::Time::Now(); | |
223 SavePageRequest request1(kRequestId, kUrl, kClientId, creation_time, | |
224 kUserRequested); | |
225 store->AddRequest(request1, | |
226 base::Bind(&RequestQueueStoreTestBase::AddRequestDone, | |
227 base::Unretained(this))); | |
228 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, | |
229 kUserRequested); | |
230 store->AddRequest(request2, | |
231 base::Bind(&RequestQueueStoreTestBase::AddRequestDone, | |
232 base::Unretained(this))); | |
233 this->PumpLoop(); | |
234 this->ClearResults(); | |
235 | |
236 std::vector<int64_t> request_ids{kRequestId, kRequestId2}; | |
237 store->GetRequestsByIds( | |
238 request_ids, base::Bind(&RequestQueueStoreTestBase::UpdateRequestDone, | |
239 base::Unretained(this))); | |
240 | |
241 ASSERT_FALSE(this->last_update_result()); | |
242 this->PumpLoop(); | |
243 ASSERT_TRUE(this->last_update_result()); | |
244 EXPECT_EQ(2UL, this->last_update_result()->item_statuses.size()); | |
245 EXPECT_EQ(kRequestId, this->last_update_result()->item_statuses[0].first); | |
246 EXPECT_EQ(ItemActionStatus::SUCCESS, | |
247 this->last_update_result()->item_statuses[0].second); | |
248 EXPECT_EQ(kRequestId2, this->last_update_result()->item_statuses[1].first); | |
249 EXPECT_EQ(ItemActionStatus::SUCCESS, | |
250 this->last_update_result()->item_statuses[1].second); | |
251 EXPECT_EQ(2UL, this->last_update_result()->updated_items.size()); | |
252 EXPECT_EQ(request1, this->last_update_result()->updated_items.at(0)); | |
253 EXPECT_EQ(request2, this->last_update_result()->updated_items.at(1)); | |
254 this->ClearResults(); | |
255 | |
256 request_ids.clear(); | |
257 request_ids.push_back(kRequestId); | |
258 request_ids.push_back(kRequestId3); | |
259 request_ids.push_back(kRequestId); | |
260 | |
261 store->GetRequestsByIds( | |
262 request_ids, base::Bind(&RequestQueueStoreTestBase::UpdateRequestDone, | |
263 base::Unretained(this))); | |
264 | |
265 ASSERT_FALSE(this->last_update_result()); | |
266 this->PumpLoop(); | |
267 ASSERT_TRUE(this->last_update_result()); | |
268 EXPECT_EQ(2UL, this->last_update_result()->item_statuses.size()); | |
269 EXPECT_EQ(kRequestId, this->last_update_result()->item_statuses[0].first); | |
270 EXPECT_EQ(ItemActionStatus::SUCCESS, | |
271 this->last_update_result()->item_statuses[0].second); | |
272 EXPECT_EQ(kRequestId3, this->last_update_result()->item_statuses[1].first); | |
273 EXPECT_EQ(ItemActionStatus::NOT_FOUND, | |
274 this->last_update_result()->item_statuses[1].second); | |
275 EXPECT_EQ(1UL, this->last_update_result()->updated_items.size()); | |
276 EXPECT_EQ(request1, this->last_update_result()->updated_items.at(0)); | |
277 } | |
278 | |
279 TYPED_TEST(RequestQueueStoreTest, AddRequest) { | |
280 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | |
281 this->InitializeStore(store.get()); | |
282 | |
283 base::Time creation_time = base::Time::Now(); | |
284 SavePageRequest request( | |
285 kRequestId, kUrl, kClientId, creation_time, kUserRequested); | |
286 | |
287 store->AddRequest(request, | |
288 base::Bind(&RequestQueueStoreTestBase::AddRequestDone, | |
289 base::Unretained(this))); | |
290 ASSERT_EQ(ItemActionStatus::NOT_FOUND, this->last_add_status()); | |
291 this->PumpLoop(); | |
292 ASSERT_EQ(ItemActionStatus::SUCCESS, this->last_add_status()); | |
293 | |
294 // Verifying get reqeust results after a request was added. | |
295 this->ClearResults(); | |
296 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | |
297 base::Unretained(this))); | |
298 ASSERT_EQ(LastResult::RESULT_NONE, this->last_result()); | |
299 this->PumpLoop(); | |
300 ASSERT_EQ(LastResult::RESULT_TRUE, this->last_result()); | |
301 ASSERT_EQ(1ul, this->last_requests().size()); | |
302 ASSERT_EQ(request, *(this->last_requests()[0].get())); | |
303 | |
304 // Verify it is not possible to add the same request twice. | |
305 this->ClearResults(); | |
306 store->AddRequest(request, | |
307 base::Bind(&RequestQueueStoreTestBase::AddRequestDone, | |
308 base::Unretained(this))); | |
309 ASSERT_EQ(ItemActionStatus::NOT_FOUND, this->last_add_status()); | |
310 this->PumpLoop(); | |
311 ASSERT_EQ(ItemActionStatus::ALREADY_EXISTS, this->last_add_status()); | |
312 | |
313 // Check that there is still only one item in the store. | |
314 this->ClearResults(); | |
315 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | |
316 base::Unretained(this))); | |
317 ASSERT_EQ(LastResult::RESULT_NONE, this->last_result()); | |
318 this->PumpLoop(); | |
319 ASSERT_EQ(LastResult::RESULT_TRUE, this->last_result()); | |
320 ASSERT_EQ(1ul, this->last_requests().size()); | |
321 } | |
322 | |
323 TYPED_TEST(RequestQueueStoreTest, UpdateRequest) { | |
324 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | |
325 this->InitializeStore(store.get()); | |
326 | |
327 base::Time creation_time = base::Time::Now(); | |
328 SavePageRequest original_request( | |
329 kRequestId, kUrl, kClientId, creation_time, kUserRequested); | |
330 store->AddRequest(original_request, | |
331 base::Bind(&RequestQueueStoreTestBase::AddRequestDone, | |
332 base::Unretained(this))); | |
333 this->PumpLoop(); | |
334 this->ClearResults(); | |
335 | |
336 base::Time new_creation_time = | |
337 creation_time + base::TimeDelta::FromMinutes(1); | |
338 base::Time activation_time = creation_time + base::TimeDelta::FromHours(6); | |
339 // Try updating an existing request. | |
340 SavePageRequest updated_request(kRequestId, kUrl, kClientId, | |
341 new_creation_time, activation_time, | |
342 kUserRequested); | |
343 // Try to update a non-existing request. | |
344 SavePageRequest updated_request2(kRequestId2, kUrl, kClientId, | |
345 new_creation_time, activation_time, | |
346 kUserRequested); | |
347 std::vector<SavePageRequest> requests_to_update{updated_request, | |
348 updated_request2}; | |
349 store->UpdateRequests( | |
350 requests_to_update, | |
351 base::Bind(&RequestQueueStoreTestBase::UpdateRequestDone, | |
352 base::Unretained(this))); | |
353 ASSERT_FALSE(this->last_update_result()); | |
354 this->PumpLoop(); | |
355 ASSERT_TRUE(this->last_update_result()); | |
356 EXPECT_EQ(2UL, this->last_update_result()->item_statuses.size()); | |
357 EXPECT_EQ(kRequestId, this->last_update_result()->item_statuses[0].first); | |
358 EXPECT_EQ(ItemActionStatus::SUCCESS, | |
359 this->last_update_result()->item_statuses[0].second); | |
360 EXPECT_EQ(kRequestId2, this->last_update_result()->item_statuses[1].first); | |
361 EXPECT_EQ(ItemActionStatus::NOT_FOUND, | |
362 this->last_update_result()->item_statuses[1].second); | |
363 EXPECT_EQ(1UL, this->last_update_result()->updated_items.size()); | |
364 EXPECT_EQ(updated_request, | |
365 *(this->last_update_result()->updated_items.begin())); | |
366 | |
367 // Verifying get reqeust results after a request was updated. | |
368 this->ClearResults(); | |
369 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | |
370 base::Unretained(this))); | |
371 ASSERT_EQ(LastResult::RESULT_NONE, this->last_result()); | |
372 this->PumpLoop(); | |
373 ASSERT_EQ(LastResult::RESULT_TRUE, this->last_result()); | |
374 ASSERT_EQ(1ul, this->last_requests().size()); | |
375 ASSERT_EQ(updated_request, *(this->last_requests()[0].get())); | |
376 } | |
377 | |
378 TYPED_TEST(RequestQueueStoreTest, RemoveRequests) { | |
379 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | |
380 this->InitializeStore(store.get()); | |
381 | |
382 base::Time creation_time = base::Time::Now(); | |
383 SavePageRequest request1(kRequestId, kUrl, kClientId, creation_time, | |
384 kUserRequested); | |
385 store->AddRequest(request1, | |
386 base::Bind(&RequestQueueStoreTestBase::AddRequestDone, | |
387 base::Unretained(this))); | |
388 SavePageRequest request2(kRequestId2, kUrl2, kClientId2, creation_time, | |
389 kUserRequested); | |
390 store->AddRequest(request2, | |
391 base::Bind(&RequestQueueStoreTestBase::AddRequestDone, | |
392 base::Unretained(this))); | |
393 this->PumpLoop(); | |
394 this->ClearResults(); | |
395 | |
396 std::vector<int64_t> request_ids{kRequestId, kRequestId2}; | |
397 store->RemoveRequests( | |
398 request_ids, base::Bind(&RequestQueueStoreTestBase::UpdateRequestDone, | |
399 base::Unretained(this))); | |
400 | |
401 ASSERT_FALSE(this->last_update_result()); | |
402 this->PumpLoop(); | |
403 ASSERT_TRUE(this->last_update_result()); | |
404 EXPECT_EQ(2UL, this->last_update_result()->item_statuses.size()); | |
405 EXPECT_EQ(kRequestId, this->last_update_result()->item_statuses[0].first); | |
406 EXPECT_EQ(ItemActionStatus::SUCCESS, | |
407 this->last_update_result()->item_statuses[0].second); | |
408 EXPECT_EQ(kRequestId2, this->last_update_result()->item_statuses[1].first); | |
409 EXPECT_EQ(ItemActionStatus::SUCCESS, | |
410 this->last_update_result()->item_statuses[1].second); | |
411 EXPECT_EQ(2UL, this->last_update_result()->updated_items.size()); | |
412 EXPECT_EQ(request1, this->last_update_result()->updated_items.at(0)); | |
413 EXPECT_EQ(request2, this->last_update_result()->updated_items.at(1)); | |
414 this->ClearResults(); | |
415 | |
416 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | |
417 base::Unretained(this))); | |
418 this->PumpLoop(); | |
419 ASSERT_EQ(LastResult::RESULT_TRUE, this->last_result()); | |
420 ASSERT_TRUE(this->last_requests().empty()); | |
421 this->ClearResults(); | |
422 | |
423 // Try to remove a request that is not in the queue. | |
424 store->RemoveRequests( | |
425 request_ids, base::Bind(&RequestQueueStoreTestBase::UpdateRequestDone, | |
426 base::Unretained(this))); | |
427 ASSERT_FALSE(this->last_update_result()); | |
428 this->PumpLoop(); | |
429 ASSERT_TRUE(this->last_update_result()); | |
430 // When requests are missing, we expect the results to say so, but since they | |
431 // are missing, no requests should have been returned. | |
432 EXPECT_EQ(2UL, this->last_update_result()->item_statuses.size()); | |
433 EXPECT_EQ(kRequestId, this->last_update_result()->item_statuses[0].first); | |
434 EXPECT_EQ(ItemActionStatus::NOT_FOUND, | |
435 this->last_update_result()->item_statuses[0].second); | |
436 EXPECT_EQ(kRequestId2, this->last_update_result()->item_statuses[1].first); | |
437 EXPECT_EQ(ItemActionStatus::NOT_FOUND, | |
438 this->last_update_result()->item_statuses[1].second); | |
439 EXPECT_EQ(0UL, this->last_update_result()->updated_items.size()); | |
440 } | |
441 | |
442 TYPED_TEST(RequestQueueStoreTest, ResetStore) { | |
443 std::unique_ptr<RequestQueueStore> store(this->BuildStore()); | |
444 this->InitializeStore(store.get()); | |
445 | |
446 base::Time creation_time = base::Time::Now(); | |
447 SavePageRequest original_request( | |
448 kRequestId, kUrl, kClientId, creation_time, kUserRequested); | |
449 store->AddRequest(original_request, | |
450 base::Bind(&RequestQueueStoreTestBase::AddRequestDone, | |
451 base::Unretained(this))); | |
452 this->PumpLoop(); | |
453 this->ClearResults(); | |
454 | |
455 store->Reset(base::Bind(&RequestQueueStoreTestBase::ResetDone, | |
456 base::Unretained(this))); | |
457 ASSERT_EQ(LastResult::RESULT_NONE, this->last_result()); | |
458 this->PumpLoop(); | |
459 ASSERT_EQ(LastResult::RESULT_TRUE, this->last_result()); | |
460 this->ClearResults(); | |
461 | |
462 this->InitializeStore(store.get()); | |
463 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | |
464 base::Unretained(this))); | |
465 this->PumpLoop(); | |
466 ASSERT_EQ(LastResult::RESULT_TRUE, this->last_result()); | |
467 ASSERT_TRUE(this->last_requests().empty()); | |
468 } | |
469 | |
470 class RequestQueueStoreSQLTest | |
471 : public RequestQueueStoreTest<RequestQueueStoreSQLFactory> {}; | |
472 | |
473 // Makes sure that persistent DB is actually persisting requests across store | |
474 // restarts. | |
475 TEST_F(RequestQueueStoreSQLTest, SaveCloseReopenRead) { | |
476 std::unique_ptr<RequestQueueStore> store(BuildStore()); | |
477 this->InitializeStore(store.get()); | |
478 | |
479 base::Time creation_time = base::Time::Now(); | |
480 SavePageRequest original_request( | |
481 kRequestId, kUrl, kClientId, creation_time, kUserRequested); | |
482 store->AddRequest(original_request, | |
483 base::Bind(&RequestQueueStoreTestBase::AddRequestDone, | |
484 base::Unretained(this))); | |
485 PumpLoop(); | |
486 ClearResults(); | |
487 | |
488 // Resets the store, using the same temp directory. The contents should be | |
489 // intact. First reset is done separately to release DB lock. | |
490 store.reset(); | |
491 store = BuildStore(); | |
492 this->InitializeStore(store.get()); | |
493 | |
494 store->GetRequests(base::Bind(&RequestQueueStoreTestBase::GetRequestsDone, | |
495 base::Unretained(this))); | |
496 ASSERT_EQ(LastResult::RESULT_NONE, this->last_result()); | |
497 this->PumpLoop(); | |
498 ASSERT_EQ(LastResult::RESULT_TRUE, this->last_result()); | |
499 ASSERT_EQ(1ul, this->last_requests().size()); | |
500 ASSERT_TRUE(original_request == *(this->last_requests().at(0).get())); | |
501 } | |
502 | |
503 } // offline_pages | |
OLD | NEW |