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

Side by Side Diff: components/offline_pages/offline_page_model_unittest.cc

Issue 2011763005: Splits the OfflinePageModel into and interface and and implementation class. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix unittest Created 4 years, 7 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
(Empty)
1 // Copyright 2015 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/offline_page_model.h"
6
7 #include <stdint.h>
8 #include <algorithm>
9 #include <utility>
10
11 #include "base/bind.h"
12 #include "base/command_line.h"
13 #include "base/feature_list.h"
14 #include "base/files/file_util.h"
15 #include "base/files/scoped_temp_dir.h"
16 #include "base/optional.h"
17 #include "base/run_loop.h"
18 #include "base/single_thread_task_runner.h"
19 #include "base/strings/string_number_conversions.h"
20 #include "base/strings/utf_string_conversions.h"
21 #include "base/test/test_mock_time_task_runner.h"
22 #include "base/threading/thread_task_runner_handle.h"
23 #include "base/time/time.h"
24 #include "components/offline_pages/client_policy_controller.h"
25 #include "components/offline_pages/offline_page_client_policy.h"
26 #include "components/offline_pages/offline_page_feature.h"
27 #include "components/offline_pages/offline_page_item.h"
28 #include "components/offline_pages/offline_page_storage_manager.h"
29 #include "components/offline_pages/offline_page_test_archiver.h"
30 #include "components/offline_pages/offline_page_test_store.h"
31 #include "components/offline_pages/offline_page_types.h"
32 #include "testing/gtest/include/gtest/gtest.h"
33 #include "url/gurl.h"
34
35 namespace offline_pages {
36
37 namespace {
38 const char kTestClientNamespace[] = "CLIENT_NAMESPACE";
39 const GURL kTestUrl("http://example.com");
40 const GURL kTestUrl2("http://other.page.com");
41 const GURL kTestUrl3("http://test.xyz");
42 const GURL kFileUrl("file:///foo");
43 const ClientId kTestClientId1(kTestClientNamespace, "1234");
44 const ClientId kTestClientId2(kTestClientNamespace, "5678");
45 const ClientId kTestClientId3(kTestClientNamespace, "42");
46 const int64_t kTestFileSize = 876543LL;
47
48 bool URLSpecContains(std::string contains_value, const GURL& url) {
49 std::string spec = url.spec();
50 return spec.find(contains_value) != std::string::npos;
51 }
52
53 } // namespace
54
55 class OfflinePageModelTest
56 : public testing::Test,
57 public OfflinePageModel::Observer,
58 public OfflinePageTestArchiver::Observer,
59 public base::SupportsWeakPtr<OfflinePageModelTest> {
60 public:
61 OfflinePageModelTest();
62 ~OfflinePageModelTest() override;
63
64 void SetUp() override;
65 void TearDown() override;
66
67 // OfflinePageModel::Observer implementation.
68 void OfflinePageModelLoaded(OfflinePageModel* model) override;
69 void OfflinePageModelChanged(OfflinePageModel* model) override;
70 void OfflinePageDeleted(int64_t offline_id,
71 const ClientId& client_id) override;
72
73 // OfflinePageTestArchiver::Observer implementation.
74 void SetLastPathCreatedByArchiver(const base::FilePath& file_path) override;
75
76 // OfflinePageModel callbacks.
77 void OnSavePageDone(SavePageResult result, int64_t offline_id);
78 void OnDeletePageDone(DeletePageResult result);
79 void OnHasPagesDone(bool result);
80 void OnCheckPagesExistOfflineDone(const CheckPagesExistOfflineResult& result);
81 void OnClearAllDone();
82 void OnGetOfflineIdsForClientIdDone(MultipleOfflineIdResult* storage,
83 const MultipleOfflineIdResult& result);
84 void OnGetSingleOfflinePageItemResult(
85 SingleOfflinePageItemResult* storage,
86 const SingleOfflinePageItemResult& result);
87 void OnGetMultipleOfflinePageItemsResult(
88 MultipleOfflinePageItemResult* storage,
89 const MultipleOfflinePageItemResult& result);
90
91 // OfflinePageMetadataStore callbacks.
92 void OnStoreUpdateDone(bool /* success */);
93
94 std::unique_ptr<OfflinePageTestArchiver> BuildArchiver(
95 const GURL& url,
96 OfflinePageArchiver::ArchiverResult result);
97 std::unique_ptr<OfflinePageMetadataStore> BuildStore();
98 std::unique_ptr<OfflinePageModel> BuildModel(
99 std::unique_ptr<OfflinePageMetadataStore> store);
100 void ResetModel();
101
102 // Utility methods.
103 // Runs until all of the tasks that are not delayed are gone from the task
104 // queue.
105 void PumpLoop();
106 // Fast-forwards virtual time by |delta|, causing tasks with a remaining
107 // delay less than or equal to |delta| to be executed.
108 void FastForwardBy(base::TimeDelta delta);
109 void ResetResults();
110
111 OfflinePageTestStore* GetStore();
112
113 MultipleOfflinePageItemResult GetAllPages();
114
115 // Returns the offline ID of the saved page.
116 std::pair<SavePageResult, int64_t> SavePage(const GURL& url,
117 ClientId client_id);
118
119 void SavePageWithArchiverResult(const GURL& url,
120 ClientId client_id,
121 OfflinePageArchiver::ArchiverResult result);
122
123 void DeletePage(int64_t offline_id,
124 const DeletePageCallback& callback) {
125 std::vector<int64_t> offline_ids;
126 offline_ids.push_back(offline_id);
127 model()->DeletePagesByOfflineId(offline_ids, callback);
128 }
129
130 bool HasPages(std::string name_space);
131
132 CheckPagesExistOfflineResult CheckPagesExistOffline(std::set<GURL>);
133
134 MultipleOfflineIdResult GetOfflineIdsForClientId(const ClientId& client_id);
135
136 SingleOfflinePageItemResult GetPageByOfflineId(int64_t offline_id);
137
138 base::Optional<OfflinePageItem> GetPagesByOnlineURL(const GURL& offline_url);
139
140 SingleOfflinePageItemResult GetPageByOfflineURL(const GURL& offline_url);
141
142 OfflinePageModel* model() { return model_.get(); }
143
144 int64_t last_save_offline_id() const { return last_save_offline_id_; }
145
146 SavePageResult last_save_result() const {
147 return last_save_result_;
148 }
149
150 DeletePageResult last_delete_result() const {
151 return last_delete_result_;
152 }
153
154 int64_t last_deleted_offline_id() const { return last_deleted_offline_id_; }
155
156 ClientId last_deleted_client_id() const { return last_deleted_client_id_; }
157
158 const base::FilePath& last_archiver_path() { return last_archiver_path_; }
159
160 int last_cleared_pages_count() const { return last_cleared_pages_count_; }
161
162 DeletePageResult last_clear_page_result() const {
163 return last_clear_page_result_;
164 }
165
166 private:
167 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
168 base::ThreadTaskRunnerHandle task_runner_handle_;
169 base::ScopedTempDir temp_dir_;
170
171 std::unique_ptr<OfflinePageModel> model_;
172 SavePageResult last_save_result_;
173 int64_t last_save_offline_id_;
174 DeletePageResult last_delete_result_;
175 base::FilePath last_archiver_path_;
176 int64_t last_deleted_offline_id_;
177 ClientId last_deleted_client_id_;
178 bool last_has_pages_result_;
179 CheckPagesExistOfflineResult last_pages_exist_result_;
180 int last_cleared_pages_count_;
181 DeletePageResult last_clear_page_result_;
182 };
183
184 OfflinePageModelTest::OfflinePageModelTest()
185 : task_runner_(new base::TestMockTimeTaskRunner),
186 task_runner_handle_(task_runner_),
187 last_save_result_(SavePageResult::CANCELLED),
188 last_save_offline_id_(-1),
189 last_delete_result_(DeletePageResult::CANCELLED),
190 last_deleted_offline_id_(-1) {}
191
192 OfflinePageModelTest::~OfflinePageModelTest() {
193 }
194
195 void OfflinePageModelTest::SetUp() {
196 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
197 model_ = BuildModel(BuildStore());
198 model_->AddObserver(this);
199 PumpLoop();
200 }
201
202 void OfflinePageModelTest::TearDown() {
203 model_->RemoveObserver(this);
204 model_.reset();
205 PumpLoop();
206 }
207
208 void OfflinePageModelTest::OfflinePageModelLoaded(OfflinePageModel* model) {
209 ASSERT_EQ(model_.get(), model);
210 }
211
212 void OfflinePageModelTest::OfflinePageModelChanged(OfflinePageModel* model) {
213 ASSERT_EQ(model_.get(), model);
214 }
215
216 void OfflinePageModelTest::OfflinePageDeleted(int64_t offline_id,
217 const ClientId& client_id) {
218 last_deleted_offline_id_ = offline_id;
219 last_deleted_client_id_ = client_id;
220 }
221
222 void OfflinePageModelTest::SetLastPathCreatedByArchiver(
223 const base::FilePath& file_path) {
224 last_archiver_path_ = file_path;
225 }
226
227 void OfflinePageModelTest::OnSavePageDone(SavePageResult result,
228 int64_t offline_id) {
229 last_save_result_ = result;
230 last_save_offline_id_ = offline_id;
231 }
232
233 void OfflinePageModelTest::OnDeletePageDone(DeletePageResult result) {
234 last_delete_result_ = result;
235 }
236
237 void OfflinePageModelTest::OnHasPagesDone(bool result) {
238 last_has_pages_result_ = result;
239 }
240
241 void OfflinePageModelTest::OnCheckPagesExistOfflineDone(
242 const CheckPagesExistOfflineResult& result) {
243 last_pages_exist_result_ = result;
244 }
245
246 void OfflinePageModelTest::OnClearAllDone() {
247 PumpLoop();
248 }
249
250 void OfflinePageModelTest::OnStoreUpdateDone(bool /* success - ignored */) {
251 }
252
253 std::unique_ptr<OfflinePageTestArchiver> OfflinePageModelTest::BuildArchiver(
254 const GURL& url,
255 OfflinePageArchiver::ArchiverResult result) {
256 return std::unique_ptr<OfflinePageTestArchiver>(new OfflinePageTestArchiver(
257 this, url, result, kTestFileSize, base::ThreadTaskRunnerHandle::Get()));
258 }
259
260 std::unique_ptr<OfflinePageMetadataStore> OfflinePageModelTest::BuildStore() {
261 return std::unique_ptr<OfflinePageMetadataStore>(
262 new OfflinePageTestStore(base::ThreadTaskRunnerHandle::Get()));
263 }
264
265 std::unique_ptr<OfflinePageModel> OfflinePageModelTest::BuildModel(
266 std::unique_ptr<OfflinePageMetadataStore> store) {
267 return std::unique_ptr<OfflinePageModel>(new OfflinePageModel(
268 std::move(store), temp_dir_.path(), base::ThreadTaskRunnerHandle::Get()));
269 }
270
271 void OfflinePageModelTest::ResetModel() {
272 model_->RemoveObserver(this);
273 OfflinePageTestStore* old_store = GetStore();
274 std::unique_ptr<OfflinePageMetadataStore> new_store(
275 new OfflinePageTestStore(*old_store));
276 model_ = BuildModel(std::move(new_store));
277 model_->AddObserver(this);
278 PumpLoop();
279 }
280
281 void OfflinePageModelTest::PumpLoop() {
282 task_runner_->RunUntilIdle();
283 }
284
285 void OfflinePageModelTest::FastForwardBy(base::TimeDelta delta) {
286 task_runner_->FastForwardBy(delta);
287 }
288
289 void OfflinePageModelTest::ResetResults() {
290 last_save_result_ = SavePageResult::CANCELLED;
291 last_delete_result_ = DeletePageResult::CANCELLED;
292 last_archiver_path_.clear();
293 last_pages_exist_result_.clear();
294 last_cleared_pages_count_ = 0;
295 }
296
297 OfflinePageTestStore* OfflinePageModelTest::GetStore() {
298 return static_cast<OfflinePageTestStore*>(model()->GetStoreForTesting());
299 }
300
301 std::pair<SavePageResult, int64_t> OfflinePageModelTest::SavePage(
302 const GURL& url,
303 ClientId client_id) {
304 SavePageWithArchiverResult(
305 url, client_id,
306 OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED);
307 return std::make_pair(last_save_result_, last_save_offline_id_);
308 }
309
310 void OfflinePageModelTest::SavePageWithArchiverResult(
311 const GURL& url,
312 ClientId client_id,
313 OfflinePageArchiver::ArchiverResult result) {
314 std::unique_ptr<OfflinePageTestArchiver> archiver(BuildArchiver(url, result));
315 model()->SavePage(
316 url, client_id, std::move(archiver),
317 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
318 PumpLoop();
319 }
320
321 MultipleOfflinePageItemResult OfflinePageModelTest::GetAllPages() {
322 MultipleOfflinePageItemResult result;
323 model()->GetAllPages(
324 base::Bind(&OfflinePageModelTest::OnGetMultipleOfflinePageItemsResult,
325 AsWeakPtr(), base::Unretained(&result)));
326 PumpLoop();
327 return result;
328 }
329
330 CheckPagesExistOfflineResult OfflinePageModelTest::CheckPagesExistOffline(
331 std::set<GURL> pages) {
332 model()->CheckPagesExistOffline(
333 pages, base::Bind(&OfflinePageModelTest::OnCheckPagesExistOfflineDone,
334 AsWeakPtr()));
335 PumpLoop();
336 return last_pages_exist_result_;
337 }
338
339 MultipleOfflineIdResult OfflinePageModelTest::GetOfflineIdsForClientId(
340 const ClientId& client_id) {
341 MultipleOfflineIdResult result;
342 model()->GetOfflineIdsForClientId(
343 client_id,
344 base::Bind(&OfflinePageModelTest::OnGetOfflineIdsForClientIdDone,
345 AsWeakPtr(), base::Unretained(&result)));
346 PumpLoop();
347 return result;
348 }
349
350 void OfflinePageModelTest::OnGetOfflineIdsForClientIdDone(
351 MultipleOfflineIdResult* storage,
352 const MultipleOfflineIdResult& result) {
353 *storage = result;
354 }
355
356 SingleOfflinePageItemResult OfflinePageModelTest::GetPageByOfflineId(
357 int64_t offline_id) {
358 SingleOfflinePageItemResult result;
359 model()->GetPageByOfflineId(
360 offline_id,
361 base::Bind(&OfflinePageModelTest::OnGetSingleOfflinePageItemResult,
362 AsWeakPtr(), base::Unretained(&result)));
363 PumpLoop();
364 return result;
365 }
366
367 SingleOfflinePageItemResult OfflinePageModelTest::GetPageByOfflineURL(
368 const GURL& offline_url) {
369 SingleOfflinePageItemResult result;
370 model()->GetPageByOfflineURL(
371 offline_url,
372 base::Bind(&OfflinePageModelTest::OnGetSingleOfflinePageItemResult,
373 AsWeakPtr(), base::Unretained(&result)));
374 PumpLoop();
375 return result;
376 }
377
378 void OfflinePageModelTest::OnGetSingleOfflinePageItemResult(
379 SingleOfflinePageItemResult* storage,
380 const SingleOfflinePageItemResult& result) {
381 *storage = result;
382 }
383
384 void OfflinePageModelTest::OnGetMultipleOfflinePageItemsResult(
385 MultipleOfflinePageItemResult* storage,
386 const MultipleOfflinePageItemResult& result) {
387 *storage = result;
388 }
389
390 base::Optional<OfflinePageItem> OfflinePageModelTest::GetPagesByOnlineURL(
391 const GURL& online_url) {
392 MultipleOfflinePageItemResult result;
393 model()->GetPagesByOnlineURL(
394 online_url,
395 base::Bind(&OfflinePageModelTest::OnGetMultipleOfflinePageItemsResult,
396 AsWeakPtr(), base::Unretained(&result)));
397 PumpLoop();
398 if (result.size() > 0)
399 return base::make_optional(result[0]);
400 return base::nullopt;
401 }
402
403 bool OfflinePageModelTest::HasPages(std::string name_space) {
404 model()->HasPages(
405 name_space,
406 base::Bind(&OfflinePageModelTest::OnHasPagesDone, AsWeakPtr()));
407 PumpLoop();
408 return last_has_pages_result_;
409 }
410
411 TEST_F(OfflinePageModelTest, SavePageSuccessful) {
412 EXPECT_FALSE(HasPages(kTestClientNamespace));
413 SavePage(kTestUrl, kTestClientId1);
414 EXPECT_TRUE(HasPages(kTestClientNamespace));
415
416 OfflinePageTestStore* store = GetStore();
417 EXPECT_EQ(kTestUrl, store->last_saved_page().url);
418 EXPECT_EQ(kTestClientId1.id, store->last_saved_page().client_id.id);
419 EXPECT_EQ(kTestClientId1.name_space,
420 store->last_saved_page().client_id.name_space);
421 // Save last_archiver_path since it will be referred to later.
422 base::FilePath archiver_path = last_archiver_path();
423 EXPECT_EQ(archiver_path, store->last_saved_page().file_path);
424 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size);
425 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
426 ResetResults();
427
428 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
429
430 EXPECT_EQ(1UL, offline_pages.size());
431 EXPECT_EQ(kTestUrl, offline_pages[0].url);
432 EXPECT_EQ(kTestClientId1.id, offline_pages[0].client_id.id);
433 EXPECT_EQ(kTestClientId1.name_space, offline_pages[0].client_id.name_space);
434 EXPECT_EQ(archiver_path, offline_pages[0].file_path);
435 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size);
436 EXPECT_EQ(0, offline_pages[0].access_count);
437 EXPECT_EQ(0, offline_pages[0].flags);
438 }
439
440 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverCancelled) {
441 SavePageWithArchiverResult(
442 kTestUrl, kTestClientId1,
443 OfflinePageArchiver::ArchiverResult::ERROR_CANCELED);
444 EXPECT_EQ(SavePageResult::CANCELLED, last_save_result());
445 }
446
447 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverDeviceFull) {
448 SavePageWithArchiverResult(
449 kTestUrl, kTestClientId1,
450 OfflinePageArchiver::ArchiverResult::ERROR_DEVICE_FULL);
451 EXPECT_EQ(SavePageResult::DEVICE_FULL, last_save_result());
452 }
453
454 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverContentUnavailable) {
455 SavePageWithArchiverResult(
456 kTestUrl, kTestClientId1,
457 OfflinePageArchiver::ArchiverResult::ERROR_CONTENT_UNAVAILABLE);
458 EXPECT_EQ(SavePageResult::CONTENT_UNAVAILABLE, last_save_result());
459 }
460
461 TEST_F(OfflinePageModelTest, SavePageOfflineCreationFailed) {
462 SavePageWithArchiverResult(
463 kTestUrl, kTestClientId1,
464 OfflinePageArchiver::ArchiverResult::ERROR_ARCHIVE_CREATION_FAILED);
465 EXPECT_EQ(SavePageResult::ARCHIVE_CREATION_FAILED, last_save_result());
466 }
467
468 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverReturnedWrongUrl) {
469 std::unique_ptr<OfflinePageTestArchiver> archiver(
470 BuildArchiver(GURL("http://other.random.url.com"),
471 OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED));
472 model()->SavePage(
473 kTestUrl, kTestClientId1, std::move(archiver),
474 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
475 PumpLoop();
476 EXPECT_EQ(SavePageResult::ARCHIVE_CREATION_FAILED, last_save_result());
477 }
478
479 TEST_F(OfflinePageModelTest, SavePageOfflineCreationStoreWriteFailure) {
480 GetStore()->set_test_scenario(
481 OfflinePageTestStore::TestScenario::WRITE_FAILED);
482 SavePage(kTestUrl, kTestClientId1);
483 EXPECT_EQ(SavePageResult::STORE_FAILURE, last_save_result());
484 }
485
486 TEST_F(OfflinePageModelTest, SavePageLocalFileFailed) {
487 // Don't create archiver since it will not be needed for pages that are not
488 // going to be saved.
489 model()->SavePage(
490 kFileUrl, kTestClientId1, std::unique_ptr<OfflinePageTestArchiver>(),
491 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
492 PumpLoop();
493 EXPECT_EQ(SavePageResult::SKIPPED, last_save_result());
494 }
495
496 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverTwoPages) {
497 std::unique_ptr<OfflinePageTestArchiver> archiver(BuildArchiver(
498 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED));
499 // archiver_ptr will be valid until after first PumpLoop() call after
500 // CompleteCreateArchive() is called.
501 OfflinePageTestArchiver* archiver_ptr = archiver.get();
502 archiver_ptr->set_delayed(true);
503 model()->SavePage(
504 kTestUrl, kTestClientId1, std::move(archiver),
505 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
506 EXPECT_TRUE(archiver_ptr->create_archive_called());
507
508 // Request to save another page.
509 SavePage(kTestUrl2, kTestClientId2);
510
511 OfflinePageTestStore* store = GetStore();
512
513 EXPECT_EQ(kTestUrl2, store->last_saved_page().url);
514 EXPECT_EQ(kTestClientId2, store->last_saved_page().client_id);
515 base::FilePath archiver_path2 = last_archiver_path();
516 EXPECT_EQ(archiver_path2, store->last_saved_page().file_path);
517 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size);
518 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
519
520 ResetResults();
521
522 archiver_ptr->CompleteCreateArchive();
523 // After this pump loop archiver_ptr is invalid.
524 PumpLoop();
525
526 EXPECT_EQ(kTestUrl, store->last_saved_page().url);
527 EXPECT_EQ(kTestClientId1, store->last_saved_page().client_id);
528 base::FilePath archiver_path = last_archiver_path();
529 EXPECT_EQ(archiver_path, store->last_saved_page().file_path);
530 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size);
531 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
532
533 ResetResults();
534
535 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
536
537 EXPECT_EQ(2UL, offline_pages.size());
538 // Offline IDs are random, so the order of the pages is also random
539 // So load in the right page for the validation below.
540 const OfflinePageItem* page1;
541 const OfflinePageItem* page2;
542 if (offline_pages[0].client_id == kTestClientId1) {
543 page1 = &offline_pages[0];
544 page2 = &offline_pages[1];
545 } else {
546 page1 = &offline_pages[1];
547 page2 = &offline_pages[0];
548 }
549
550 EXPECT_EQ(kTestUrl, page1->url);
551 EXPECT_EQ(kTestClientId1, page1->client_id);
552 EXPECT_EQ(archiver_path, page1->file_path);
553 EXPECT_EQ(kTestFileSize, page1->file_size);
554 EXPECT_EQ(0, page1->access_count);
555 EXPECT_EQ(0, page1->flags);
556 EXPECT_EQ(kTestUrl2, page2->url);
557 EXPECT_EQ(kTestClientId2, page2->client_id);
558 EXPECT_EQ(archiver_path2, page2->file_path);
559 EXPECT_EQ(kTestFileSize, page2->file_size);
560 EXPECT_EQ(0, page2->access_count);
561 EXPECT_EQ(0, page2->flags);
562 }
563
564 TEST_F(OfflinePageModelTest, MarkPageAccessed) {
565 SavePage(kTestUrl, kTestClientId1);
566
567 // This will increase access_count by one.
568 model()->MarkPageAccessed(last_save_offline_id());
569 PumpLoop();
570
571 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
572
573 EXPECT_EQ(1UL, offline_pages.size());
574 EXPECT_EQ(kTestUrl, offline_pages[0].url);
575 EXPECT_EQ(kTestClientId1, offline_pages[0].client_id);
576 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size);
577 EXPECT_EQ(1, offline_pages[0].access_count);
578 }
579
580 TEST_F(OfflinePageModelTest, GetAllPagesStoreEmpty) {
581 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
582
583 EXPECT_EQ(0UL, offline_pages.size());
584 }
585
586 TEST_F(OfflinePageModelTest, GetAllPagesStoreFailure) {
587 GetStore()->set_test_scenario(
588 OfflinePageTestStore::TestScenario::LOAD_FAILED);
589 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
590
591 EXPECT_EQ(0UL, offline_pages.size());
592 }
593
594 TEST_F(OfflinePageModelTest, DeletePageSuccessful) {
595 OfflinePageTestStore* store = GetStore();
596
597 // Save one page.
598 SavePage(kTestUrl, kTestClientId1);
599 int64_t offline1 = last_save_offline_id();
600 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
601 EXPECT_EQ(1u, store->GetAllPages().size());
602
603 ResetResults();
604
605 // Save another page.
606 SavePage(kTestUrl2, kTestClientId2);
607 int64_t offline2 = last_save_offline_id();
608 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
609 EXPECT_EQ(2u, store->GetAllPages().size());
610
611 ResetResults();
612
613 // Delete one page.
614 DeletePage(offline1,
615 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
616
617 PumpLoop();
618
619 EXPECT_EQ(last_deleted_offline_id(), offline1);
620 EXPECT_EQ(last_deleted_client_id(), kTestClientId1);
621 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
622 ASSERT_EQ(1u, store->GetAllPages().size());
623 EXPECT_EQ(kTestUrl2, store->GetAllPages()[0].url);
624
625 // Delete another page.
626 DeletePage(offline2,
627 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
628
629 ResetResults();
630
631 PumpLoop();
632
633 EXPECT_EQ(last_deleted_offline_id(), offline2);
634 EXPECT_EQ(last_deleted_client_id(), kTestClientId2);
635 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
636 EXPECT_EQ(0u, store->GetAllPages().size());
637 }
638
639 TEST_F(OfflinePageModelTest, DeletePageByPredicate) {
640 OfflinePageTestStore* store = GetStore();
641
642 // Save one page.
643 SavePage(kTestUrl, kTestClientId1);
644 int64_t offline1 = last_save_offline_id();
645 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
646 EXPECT_EQ(1u, store->GetAllPages().size());
647
648 ResetResults();
649
650 // Save another page.
651 SavePage(kTestUrl2, kTestClientId2);
652 int64_t offline2 = last_save_offline_id();
653 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result());
654 EXPECT_EQ(2u, store->GetAllPages().size());
655
656 ResetResults();
657
658 // Delete the second page.
659 model()->DeletePagesByURLPredicate(
660 base::Bind(&URLSpecContains, "page.com"),
661 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
662
663 PumpLoop();
664
665 EXPECT_EQ(last_deleted_offline_id(), offline2);
666 EXPECT_EQ(last_deleted_client_id(), kTestClientId2);
667 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
668 ASSERT_EQ(1u, store->GetAllPages().size());
669 EXPECT_EQ(kTestUrl, store->GetAllPages()[0].url);
670
671 ResetResults();
672
673 // Delete the first page.
674 model()->DeletePagesByURLPredicate(
675 base::Bind(&URLSpecContains, "example.com"),
676 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
677
678 PumpLoop();
679
680 EXPECT_EQ(last_deleted_offline_id(), offline1);
681 EXPECT_EQ(last_deleted_client_id(), kTestClientId1);
682 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
683 EXPECT_EQ(0u, store->GetAllPages().size());
684 }
685
686 TEST_F(OfflinePageModelTest, DeletePageNotFound) {
687 DeletePage(1234LL,
688 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
689 EXPECT_EQ(DeletePageResult::NOT_FOUND, last_delete_result());
690
691 ResetResults();
692
693 model()->DeletePagesByURLPredicate(
694 base::Bind(&URLSpecContains, "page.com"),
695 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
696 EXPECT_EQ(DeletePageResult::NOT_FOUND, last_delete_result());
697 }
698
699 TEST_F(OfflinePageModelTest, DeletePageStoreFailureOnRemove) {
700 // Save a page.
701 SavePage(kTestUrl, kTestClientId1);
702 int64_t offline_id = last_save_offline_id();
703 ResetResults();
704
705 // Try to delete this page.
706 GetStore()->set_test_scenario(
707 OfflinePageTestStore::TestScenario::REMOVE_FAILED);
708 DeletePage(offline_id,
709 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
710 PumpLoop();
711 EXPECT_EQ(DeletePageResult::STORE_FAILURE, last_delete_result());
712 }
713
714 TEST_F(OfflinePageModelTest, DetectThatOfflineCopyIsMissing) {
715 // Save a page.
716 SavePage(kTestUrl, kTestClientId1);
717 int64_t offline_id = last_save_offline_id();
718
719 ResetResults();
720
721 base::Optional<OfflinePageItem> page = GetPageByOfflineId(offline_id);
722
723 // Delete the offline copy of the page and check the metadata.
724 base::DeleteFile(page->file_path, false);
725 model()->CheckForExternalFileDeletion();
726 PumpLoop();
727
728 EXPECT_EQ(last_deleted_offline_id(), offline_id);
729 EXPECT_EQ(0UL, GetAllPages().size());
730 }
731
732 TEST_F(OfflinePageModelTest, DetectThatOfflineCopyIsMissingAfterLoad) {
733 // Save a page.
734 SavePage(kTestUrl, kTestClientId1);
735 PumpLoop();
736 int64_t offline_id = last_save_offline_id();
737
738 ResetResults();
739
740 base::Optional<OfflinePageItem> page = GetPageByOfflineId(offline_id);
741 // Delete the offline copy of the page and check the metadata.
742 base::DeleteFile(page->file_path, false);
743 // Reseting the model should trigger the metadata consistency check as well.
744 ResetModel();
745 PumpLoop();
746
747 EXPECT_EQ(last_deleted_offline_id(), offline_id);
748 EXPECT_EQ(0UL, GetAllPages().size());
749 }
750
751 TEST_F(OfflinePageModelTest, DeleteMultiplePages) {
752 OfflinePageTestStore* store = GetStore();
753
754 // Save 3 pages.
755 std::unique_ptr<OfflinePageTestArchiver> archiver(BuildArchiver(
756 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED));
757 model()->SavePage(
758 kTestUrl, kTestClientId1, std::move(archiver),
759 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
760 PumpLoop();
761 int64_t offline1 = last_save_offline_id();
762
763 std::unique_ptr<OfflinePageTestArchiver> archiver2(BuildArchiver(
764 kTestUrl2, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED));
765 model()->SavePage(
766 kTestUrl2, kTestClientId2, std::move(archiver2),
767 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
768 PumpLoop();
769 int64_t offline2 = last_save_offline_id();
770
771 std::unique_ptr<OfflinePageTestArchiver> archiver3(BuildArchiver(
772 kTestUrl3, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED));
773 model()->SavePage(
774 kTestUrl3, kTestClientId3, std::move(archiver3),
775 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr()));
776 PumpLoop();
777
778 EXPECT_EQ(3u, store->GetAllPages().size());
779
780 // Delete multiple pages.
781 std::vector<int64_t> ids_to_delete;
782 ids_to_delete.push_back(offline2);
783 ids_to_delete.push_back(offline1);
784 ids_to_delete.push_back(23434LL); // Non-existent ID.
785 model()->DeletePagesByOfflineId(
786 ids_to_delete,
787 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr()));
788 PumpLoop();
789
790 // Success is expected if at least one page is deleted successfully.
791 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result());
792 EXPECT_EQ(1u, store->GetAllPages().size());
793 }
794
795 TEST_F(OfflinePageModelTest, GetPageByOfflineId) {
796 SavePage(kTestUrl, kTestClientId1);
797 int64_t offline1 = last_save_offline_id();
798 SavePage(kTestUrl2, kTestClientId2);
799 int64_t offline2 = last_save_offline_id();
800
801 base::Optional<OfflinePageItem> page = GetPageByOfflineId(offline1);
802 bool page_exists = page != base::nullopt;
803 EXPECT_TRUE(page_exists);
804 EXPECT_EQ(kTestUrl, page->url);
805 EXPECT_EQ(kTestClientId1, page->client_id);
806 EXPECT_EQ(kTestFileSize, page->file_size);
807
808 page = GetPageByOfflineId(offline2);
809 page_exists = page != base::nullopt;
810 EXPECT_TRUE(page_exists);
811 EXPECT_EQ(kTestUrl2, page->url);
812 EXPECT_EQ(kTestClientId2, page->client_id);
813 EXPECT_EQ(kTestFileSize, page->file_size);
814
815 page = GetPageByOfflineId(-42);
816 page_exists = page != base::nullopt;
817 EXPECT_FALSE(page_exists);
818 }
819
820 TEST_F(OfflinePageModelTest, GetPageByOfflineURL) {
821 SavePage(kTestUrl, kTestClientId1);
822 int64_t offline1 = last_save_offline_id();
823
824 OfflinePageTestStore* store = GetStore();
825 GURL offline_url = store->last_saved_page().GetOfflineURL();
826
827 SavePage(kTestUrl2, kTestClientId2);
828
829 GURL offline_url2 = store->last_saved_page().GetOfflineURL();
830 int64_t offline2 = last_save_offline_id();
831
832 SingleOfflinePageItemResult page = GetPageByOfflineURL(offline_url2);
833 EXPECT_TRUE(page != base::nullopt);
834 EXPECT_EQ(kTestUrl2, page->url);
835 EXPECT_EQ(kTestClientId2, page->client_id);
836 EXPECT_EQ(offline2, page->offline_id);
837
838 page = GetPageByOfflineURL(offline_url);
839 EXPECT_TRUE(page != base::nullopt);
840 EXPECT_EQ(kTestUrl, page->url);
841 EXPECT_EQ(kTestClientId1, page->client_id);
842 EXPECT_EQ(offline1, page->offline_id);
843
844 page = GetPageByOfflineURL(GURL("http://foo"));
845 EXPECT_TRUE(page == base::nullopt);
846 }
847
848 TEST_F(OfflinePageModelTest, GetPagesByOnlineURL) {
849 SavePage(kTestUrl, kTestClientId1);
850 SavePage(kTestUrl2, kTestClientId2);
851
852 base::Optional<OfflinePageItem> page = GetPagesByOnlineURL(kTestUrl2);
853 EXPECT_EQ(kTestUrl2, page->url);
854 EXPECT_EQ(kTestClientId2, page->client_id);
855
856 page = GetPagesByOnlineURL(kTestUrl);
857 EXPECT_EQ(kTestUrl, page->url);
858 EXPECT_EQ(kTestClientId1, page->client_id);
859
860 page = GetPagesByOnlineURL(GURL("http://foo"));
861 EXPECT_TRUE(base::nullopt == page);
862 }
863
864 TEST_F(OfflinePageModelTest, CheckPagesExistOffline) {
865 SavePage(kTestUrl, kTestClientId1);
866 SavePage(kTestUrl2, kTestClientId2);
867
868 std::set<GURL> input;
869 input.insert(kTestUrl);
870 input.insert(kTestUrl2);
871 input.insert(kTestUrl3);
872
873 CheckPagesExistOfflineResult existing_pages = CheckPagesExistOffline(input);
874 EXPECT_EQ(2U, existing_pages.size());
875 EXPECT_NE(existing_pages.end(), existing_pages.find(kTestUrl));
876 EXPECT_NE(existing_pages.end(), existing_pages.find(kTestUrl2));
877 EXPECT_EQ(existing_pages.end(), existing_pages.find(kTestUrl3));
878 }
879
880 TEST_F(OfflinePageModelTest, CanSavePage) {
881 EXPECT_TRUE(OfflinePageModel::CanSavePage(GURL("http://foo")));
882 EXPECT_TRUE(OfflinePageModel::CanSavePage(GURL("https://foo")));
883 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("file:///foo")));
884 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("data:image/png;base64,ab")));
885 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("chrome://version")));
886 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("chrome-native://newtab/")));
887 }
888
889 TEST_F(OfflinePageModelTest, ClearAll) {
890 SavePage(kTestUrl, kTestClientId1);
891 SavePage(kTestUrl2, kTestClientId2);
892
893 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
894 EXPECT_EQ(2UL, offline_pages.size());
895 EXPECT_EQ(2UL, GetStore()->GetAllPages().size());
896 base::FilePath archiver_path = offline_pages[0].file_path;
897 EXPECT_TRUE(base::PathExists(archiver_path));
898
899 // ClearAll should delete all the files and wipe out both cache and store.
900 model()->ClearAll(
901 base::Bind(&OfflinePageModelTest::OnClearAllDone, AsWeakPtr()));
902 PumpLoop();
903 EXPECT_EQ(0UL, GetAllPages().size());
904 EXPECT_EQ(0UL, GetStore()->GetAllPages().size());
905 EXPECT_FALSE(base::PathExists(archiver_path));
906
907 // The model should reload the store after the reset. All model operations
908 // should continue to work.
909 SavePage(kTestUrl2, kTestClientId2);
910 EXPECT_EQ(1UL, GetAllPages().size());
911 EXPECT_EQ(1UL, GetStore()->GetAllPages().size());
912 }
913
914 TEST_F(OfflinePageModelTest, SaveRetrieveMultipleClientIds) {
915 EXPECT_FALSE(HasPages(kTestClientNamespace));
916 SavePage(kTestUrl, kTestClientId1);
917 int64_t offline1 = last_save_offline_id();
918 EXPECT_TRUE(HasPages(kTestClientNamespace));
919
920 SavePage(kTestUrl, kTestClientId1);
921 int64_t offline2 = last_save_offline_id();
922
923 EXPECT_NE(offline1, offline2);
924
925 const std::vector<int64_t> ids = GetOfflineIdsForClientId(kTestClientId1);
926
927 EXPECT_EQ(2UL, ids.size());
928
929 std::set<int64_t> id_set;
930 for (size_t i = 0; i < ids.size(); i++) {
931 id_set.insert(ids[i]);
932 }
933
934 EXPECT_TRUE(id_set.find(offline1) != id_set.end());
935 EXPECT_TRUE(id_set.find(offline2) != id_set.end());
936 }
937
938 TEST_F(OfflinePageModelTest, GetBestPage) {
939 // We will save 3 pages - two for the same URL, and one for a different URL.
940 // Correct behavior will pick the most recently saved page for the correct
941 // URL.
942 std::pair<SavePageResult, int64_t> saved_pages[3];
943 saved_pages[0] = SavePage(kTestUrl, kTestClientId1);
944 saved_pages[1] = SavePage(kTestUrl, kTestClientId1);
945 saved_pages[2] = SavePage(kTestUrl2, kTestClientId2);
946
947 for (const auto& save_result : saved_pages) {
948 ASSERT_EQ(OfflinePageModel::SavePageResult::SUCCESS,
949 std::get<0>(save_result));
950 }
951
952 const OfflinePageItem* offline_page =
953 model()->MaybeGetBestPageForOnlineURL(kTestUrl);
954 ASSERT_TRUE(nullptr != offline_page);
955
956 EXPECT_EQ(std::get<1>(saved_pages[1]), offline_page->offline_id);
957 }
958
959 TEST_F(OfflinePageModelTest, ExpirePages) {
960 // We will save 3 pages and then expire 2 of them.
961 std::pair<SavePageResult, int64_t> saved_pages[3];
962 saved_pages[0] = SavePage(kTestUrl, kTestClientId1);
963 saved_pages[1] = SavePage(kTestUrl2, kTestClientId2);
964 saved_pages[2] = SavePage(kTestUrl3, kTestClientId3);
965
966 for (const auto& save_result : saved_pages) {
967 ASSERT_EQ(OfflinePageModel::SavePageResult::SUCCESS,
968 std::get<0>(save_result));
969 }
970
971 // First two pages will be expired.
972 std::vector<int64_t> pages_to_expire = {std::get<1>(saved_pages[0]),
973 std::get<1>(saved_pages[1])};
974 // Pages are marked as expired if they have an expiration_time set.
975 base::Time expiration_time =
976 base::Time::Now() + base::TimeDelta::FromMinutes(5);
977
978 model()->ExpirePages(pages_to_expire, expiration_time);
979 PumpLoop();
980
981 const std::vector<OfflinePageItem>& offline_pages = GetAllPages();
982 for (const auto& offline_page : offline_pages) {
983 if (std::find(pages_to_expire.begin(), pages_to_expire.end(),
984 offline_page.offline_id) != pages_to_expire.end()) {
985 EXPECT_EQ(expiration_time, offline_page.expiration_time);
986 EXPECT_TRUE(offline_page.IsExpired());
987 } else {
988 EXPECT_EQ(base::Time(), offline_page.expiration_time);
989 EXPECT_FALSE(offline_page.IsExpired());
990 }
991 }
992 }
993
994 TEST(CommandLineFlagsTest, OfflineBookmarks) {
995 // Disabled by default.
996 EXPECT_FALSE(offline_pages::IsOfflineBookmarksEnabled());
997
998 // Check if feature is correctly enabled by command-line flag.
999 base::FeatureList::ClearInstanceForTesting();
1000 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
1001 feature_list->InitializeFromCommandLine(
1002 offline_pages::kOfflineBookmarksFeature.name, "");
1003 base::FeatureList::SetInstance(std::move(feature_list));
1004 EXPECT_TRUE(offline_pages::IsOfflineBookmarksEnabled());
1005 }
1006
1007 TEST(CommandLineFlagsTest, OffliningRecentPages) {
1008 // Enable offline bookmarks feature first.
1009 // TODO(dimich): once offline pages are enabled by default, remove this.
1010 base::FeatureList::ClearInstanceForTesting();
1011 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
1012 feature_list->InitializeFromCommandLine(
1013 offline_pages::kOfflineBookmarksFeature.name, "");
1014 base::FeatureList::SetInstance(std::move(feature_list));
1015
1016 // This feature is still disabled by default.
1017 EXPECT_FALSE(offline_pages::IsOffliningRecentPagesEnabled());
1018
1019 // Check if feature is correctly enabled by command-line flag.
1020 base::FeatureList::ClearInstanceForTesting();
1021 std::unique_ptr<base::FeatureList> feature_list2(new base::FeatureList);
1022 feature_list2->InitializeFromCommandLine(
1023 std::string(offline_pages::kOfflineBookmarksFeature.name) + "," +
1024 offline_pages::kOffliningRecentPagesFeature.name,
1025 "");
1026 base::FeatureList::SetInstance(std::move(feature_list2));
1027 EXPECT_TRUE(offline_pages::IsOffliningRecentPagesEnabled());
1028 }
1029
1030 TEST(CommandLineFlagsTest, OfflinePagesBackgroundLoading) {
1031 // Enable offline bookmarks feature first.
1032 // TODO(dimich): once offline pages are enabled by default, remove this.
1033 base::FeatureList::ClearInstanceForTesting();
1034 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
1035 feature_list->InitializeFromCommandLine(
1036 offline_pages::kOfflineBookmarksFeature.name, "");
1037 base::FeatureList::SetInstance(std::move(feature_list));
1038
1039 // This feature is still disabled by default.
1040 EXPECT_FALSE(offline_pages::IsOfflinePagesBackgroundLoadingEnabled());
1041
1042 // Check if feature is correctly enabled by command-line flag.
1043 base::FeatureList::ClearInstanceForTesting();
1044 std::unique_ptr<base::FeatureList> feature_list2(new base::FeatureList);
1045 feature_list2->InitializeFromCommandLine(
1046 std::string(offline_pages::kOfflineBookmarksFeature.name) + "," +
1047 offline_pages::kOfflinePagesBackgroundLoadingFeature.name,
1048 "");
1049 base::FeatureList::SetInstance(std::move(feature_list2));
1050 EXPECT_TRUE(offline_pages::IsOfflinePagesBackgroundLoadingEnabled());
1051 }
1052
1053 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698