| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 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/offline_page_model.h" | 5 #include "components/offline_pages/offline_page_model.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/bind.h" | 11 #include "base/bind.h" |
| 12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
| 13 #include "base/feature_list.h" | 13 #include "base/feature_list.h" |
| 14 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
| 15 #include "base/files/scoped_temp_dir.h" | 15 #include "base/files/scoped_temp_dir.h" |
| 16 #include "base/run_loop.h" | 16 #include "base/run_loop.h" |
| 17 #include "base/single_thread_task_runner.h" | 17 #include "base/single_thread_task_runner.h" |
| 18 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
| 19 #include "base/strings/utf_string_conversions.h" | 19 #include "base/strings/utf_string_conversions.h" |
| 20 #include "base/test/test_mock_time_task_runner.h" | 20 #include "base/test/test_mock_time_task_runner.h" |
| 21 #include "base/thread_task_runner_handle.h" | 21 #include "base/thread_task_runner_handle.h" |
| 22 #include "base/time/time.h" | 22 #include "base/time/time.h" |
| 23 #include "components/bookmarks/browser/bookmark_client.h" | |
| 24 #include "components/bookmarks/browser/bookmark_model.h" | |
| 25 #include "components/bookmarks/browser/bookmark_node.h" | |
| 26 #include "components/bookmarks/browser/bookmark_storage.h" | |
| 27 #include "components/bookmarks/browser/bookmark_undo_delegate.h" | |
| 28 #include "components/bookmarks/browser/bookmark_undo_provider.h" | |
| 29 #include "components/bookmarks/test/test_bookmark_client.h" | |
| 30 #include "components/offline_pages/offline_page_bookmark_bridge.h" | |
| 31 #include "components/offline_pages/offline_page_feature.h" | 23 #include "components/offline_pages/offline_page_feature.h" |
| 32 #include "components/offline_pages/offline_page_item.h" | 24 #include "components/offline_pages/offline_page_item.h" |
| 33 #include "components/offline_pages/offline_page_switches.h" | 25 #include "components/offline_pages/offline_page_switches.h" |
| 34 #include "components/offline_pages/offline_page_test_archiver.h" | 26 #include "components/offline_pages/offline_page_test_archiver.h" |
| 35 #include "components/offline_pages/offline_page_test_store.h" | 27 #include "components/offline_pages/offline_page_test_store.h" |
| 36 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 37 #include "url/gurl.h" | 29 #include "url/gurl.h" |
| 38 | 30 |
| 39 using SavePageResult = offline_pages::OfflinePageModel::SavePageResult; | 31 using SavePageResult = offline_pages::OfflinePageModel::SavePageResult; |
| 40 using DeletePageResult = offline_pages::OfflinePageModel::DeletePageResult; | 32 using DeletePageResult = offline_pages::OfflinePageModel::DeletePageResult; |
| 41 using GetAllPagesResult = offline_pages::OfflinePageModel::GetAllPagesResult; | 33 using GetAllPagesResult = offline_pages::OfflinePageModel::GetAllPagesResult; |
| 42 | 34 |
| 43 namespace offline_pages { | 35 namespace offline_pages { |
| 44 | 36 |
| 45 namespace { | 37 namespace { |
| 38 const char kTestClientNamespace[] = "CLIENT_NAMESPACE"; |
| 46 const GURL kTestUrl("http://example.com"); | 39 const GURL kTestUrl("http://example.com"); |
| 47 const ClientId kTestPageBookmarkId1(BOOKMARK_NAMESPACE, "1234"); | |
| 48 const GURL kTestUrl2("http://other.page.com"); | 40 const GURL kTestUrl2("http://other.page.com"); |
| 49 const GURL kTestUrl3("http://test.xyz"); | 41 const GURL kTestUrl3("http://test.xyz"); |
| 50 const GURL kFileUrl("file:///foo"); | 42 const GURL kFileUrl("file:///foo"); |
| 51 const ClientId kTestPageBookmarkId2(BOOKMARK_NAMESPACE, "5678"); | 43 const ClientId kTestClientId1(kTestClientNamespace, "1234"); |
| 52 const ClientId kTestPageBookmarkId3(BOOKMARK_NAMESPACE, "42"); | 44 const ClientId kTestClientId2(kTestClientNamespace, "5678"); |
| 45 const ClientId kTestClientId3(kTestClientNamespace, "42"); |
| 53 const int64_t kTestFileSize = 876543LL; | 46 const int64_t kTestFileSize = 876543LL; |
| 54 | 47 |
| 55 bool URLSpecContains(std::string contains_value, const GURL& url) { | 48 bool URLSpecContains(std::string contains_value, const GURL& url) { |
| 56 std::string spec = url.spec(); | 49 std::string spec = url.spec(); |
| 57 return spec.find(contains_value) != std::string::npos; | 50 return spec.find(contains_value) != std::string::npos; |
| 58 } | 51 } |
| 59 | 52 |
| 60 } // namespace | 53 } // namespace |
| 61 | 54 |
| 62 class OfflinePageModelTest | 55 class OfflinePageModelTest |
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 | 293 |
| 301 bool OfflinePageModelTest::HasPages(std::string name_space) { | 294 bool OfflinePageModelTest::HasPages(std::string name_space) { |
| 302 model()->HasPages( | 295 model()->HasPages( |
| 303 name_space, | 296 name_space, |
| 304 base::Bind(&OfflinePageModelTest::OnHasPagesDone, AsWeakPtr())); | 297 base::Bind(&OfflinePageModelTest::OnHasPagesDone, AsWeakPtr())); |
| 305 PumpLoop(); | 298 PumpLoop(); |
| 306 return last_has_pages_result_; | 299 return last_has_pages_result_; |
| 307 } | 300 } |
| 308 | 301 |
| 309 TEST_F(OfflinePageModelTest, SavePageSuccessful) { | 302 TEST_F(OfflinePageModelTest, SavePageSuccessful) { |
| 310 EXPECT_FALSE(HasPages(BOOKMARK_NAMESPACE)); | 303 EXPECT_FALSE(HasPages(kTestClientNamespace)); |
| 311 SavePage(kTestUrl, kTestPageBookmarkId1); | 304 SavePage(kTestUrl, kTestClientId1); |
| 312 EXPECT_TRUE(HasPages(BOOKMARK_NAMESPACE)); | 305 EXPECT_TRUE(HasPages(kTestClientNamespace)); |
| 313 | 306 |
| 314 OfflinePageTestStore* store = GetStore(); | 307 OfflinePageTestStore* store = GetStore(); |
| 315 EXPECT_EQ(kTestUrl, store->last_saved_page().url); | 308 EXPECT_EQ(kTestUrl, store->last_saved_page().url); |
| 316 EXPECT_EQ(kTestPageBookmarkId1.id, store->last_saved_page().client_id.id); | 309 EXPECT_EQ(kTestClientId1.id, store->last_saved_page().client_id.id); |
| 317 EXPECT_EQ(kTestPageBookmarkId1.name_space, | 310 EXPECT_EQ(kTestClientId1.name_space, |
| 318 store->last_saved_page().client_id.name_space); | 311 store->last_saved_page().client_id.name_space); |
| 319 // Save last_archiver_path since it will be referred to later. | 312 // Save last_archiver_path since it will be referred to later. |
| 320 base::FilePath archiver_path = last_archiver_path(); | 313 base::FilePath archiver_path = last_archiver_path(); |
| 321 EXPECT_EQ(archiver_path, store->last_saved_page().file_path); | 314 EXPECT_EQ(archiver_path, store->last_saved_page().file_path); |
| 322 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size); | 315 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size); |
| 323 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); | 316 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); |
| 324 ResetResults(); | 317 ResetResults(); |
| 325 | 318 |
| 326 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); | 319 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); |
| 327 | 320 |
| 328 EXPECT_EQ(1UL, offline_pages.size()); | 321 EXPECT_EQ(1UL, offline_pages.size()); |
| 329 EXPECT_EQ(kTestUrl, offline_pages[0].url); | 322 EXPECT_EQ(kTestUrl, offline_pages[0].url); |
| 330 EXPECT_EQ(kTestPageBookmarkId1.id, offline_pages[0].client_id.id); | 323 EXPECT_EQ(kTestClientId1.id, offline_pages[0].client_id.id); |
| 331 EXPECT_EQ(kTestPageBookmarkId1.name_space, | 324 EXPECT_EQ(kTestClientId1.name_space, offline_pages[0].client_id.name_space); |
| 332 offline_pages[0].client_id.name_space); | |
| 333 EXPECT_EQ(archiver_path, offline_pages[0].file_path); | 325 EXPECT_EQ(archiver_path, offline_pages[0].file_path); |
| 334 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size); | 326 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size); |
| 335 EXPECT_EQ(0, offline_pages[0].access_count); | 327 EXPECT_EQ(0, offline_pages[0].access_count); |
| 336 EXPECT_EQ(0, offline_pages[0].flags); | 328 EXPECT_EQ(0, offline_pages[0].flags); |
| 337 } | 329 } |
| 338 | 330 |
| 339 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverCancelled) { | 331 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverCancelled) { |
| 340 SavePageWithArchiverResult( | 332 SavePageWithArchiverResult( |
| 341 kTestUrl, | 333 kTestUrl, kTestClientId1, |
| 342 kTestPageBookmarkId1, | |
| 343 OfflinePageArchiver::ArchiverResult::ERROR_CANCELED); | 334 OfflinePageArchiver::ArchiverResult::ERROR_CANCELED); |
| 344 EXPECT_EQ(SavePageResult::CANCELLED, last_save_result()); | 335 EXPECT_EQ(SavePageResult::CANCELLED, last_save_result()); |
| 345 } | 336 } |
| 346 | 337 |
| 347 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverDeviceFull) { | 338 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverDeviceFull) { |
| 348 SavePageWithArchiverResult( | 339 SavePageWithArchiverResult( |
| 349 kTestUrl, | 340 kTestUrl, kTestClientId1, |
| 350 kTestPageBookmarkId1, | |
| 351 OfflinePageArchiver::ArchiverResult::ERROR_DEVICE_FULL); | 341 OfflinePageArchiver::ArchiverResult::ERROR_DEVICE_FULL); |
| 352 EXPECT_EQ(SavePageResult::DEVICE_FULL, last_save_result()); | 342 EXPECT_EQ(SavePageResult::DEVICE_FULL, last_save_result()); |
| 353 } | 343 } |
| 354 | 344 |
| 355 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverContentUnavailable) { | 345 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverContentUnavailable) { |
| 356 SavePageWithArchiverResult( | 346 SavePageWithArchiverResult( |
| 357 kTestUrl, | 347 kTestUrl, kTestClientId1, |
| 358 kTestPageBookmarkId1, | |
| 359 OfflinePageArchiver::ArchiverResult::ERROR_CONTENT_UNAVAILABLE); | 348 OfflinePageArchiver::ArchiverResult::ERROR_CONTENT_UNAVAILABLE); |
| 360 EXPECT_EQ(SavePageResult::CONTENT_UNAVAILABLE, last_save_result()); | 349 EXPECT_EQ(SavePageResult::CONTENT_UNAVAILABLE, last_save_result()); |
| 361 } | 350 } |
| 362 | 351 |
| 363 TEST_F(OfflinePageModelTest, SavePageOfflineCreationFailed) { | 352 TEST_F(OfflinePageModelTest, SavePageOfflineCreationFailed) { |
| 364 SavePageWithArchiverResult( | 353 SavePageWithArchiverResult( |
| 365 kTestUrl, | 354 kTestUrl, kTestClientId1, |
| 366 kTestPageBookmarkId1, | |
| 367 OfflinePageArchiver::ArchiverResult::ERROR_ARCHIVE_CREATION_FAILED); | 355 OfflinePageArchiver::ArchiverResult::ERROR_ARCHIVE_CREATION_FAILED); |
| 368 EXPECT_EQ(SavePageResult::ARCHIVE_CREATION_FAILED, last_save_result()); | 356 EXPECT_EQ(SavePageResult::ARCHIVE_CREATION_FAILED, last_save_result()); |
| 369 } | 357 } |
| 370 | 358 |
| 371 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverReturnedWrongUrl) { | 359 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverReturnedWrongUrl) { |
| 372 scoped_ptr<OfflinePageTestArchiver> archiver( | 360 scoped_ptr<OfflinePageTestArchiver> archiver( |
| 373 BuildArchiver(GURL("http://other.random.url.com"), | 361 BuildArchiver(GURL("http://other.random.url.com"), |
| 374 OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); | 362 OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); |
| 375 model()->SavePage( | 363 model()->SavePage( |
| 376 kTestUrl, kTestPageBookmarkId1, std::move(archiver), | 364 kTestUrl, kTestClientId1, std::move(archiver), |
| 377 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); | 365 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); |
| 378 PumpLoop(); | 366 PumpLoop(); |
| 379 EXPECT_EQ(SavePageResult::ARCHIVE_CREATION_FAILED, last_save_result()); | 367 EXPECT_EQ(SavePageResult::ARCHIVE_CREATION_FAILED, last_save_result()); |
| 380 } | 368 } |
| 381 | 369 |
| 382 TEST_F(OfflinePageModelTest, SavePageOfflineCreationStoreWriteFailure) { | 370 TEST_F(OfflinePageModelTest, SavePageOfflineCreationStoreWriteFailure) { |
| 383 GetStore()->set_test_scenario( | 371 GetStore()->set_test_scenario( |
| 384 OfflinePageTestStore::TestScenario::WRITE_FAILED); | 372 OfflinePageTestStore::TestScenario::WRITE_FAILED); |
| 385 SavePage(kTestUrl, kTestPageBookmarkId1); | 373 SavePage(kTestUrl, kTestClientId1); |
| 386 EXPECT_EQ(SavePageResult::STORE_FAILURE, last_save_result()); | 374 EXPECT_EQ(SavePageResult::STORE_FAILURE, last_save_result()); |
| 387 } | 375 } |
| 388 | 376 |
| 389 TEST_F(OfflinePageModelTest, SavePageLocalFileFailed) { | 377 TEST_F(OfflinePageModelTest, SavePageLocalFileFailed) { |
| 390 // Don't create archiver since it will not be needed for pages that are not | 378 // Don't create archiver since it will not be needed for pages that are not |
| 391 // going to be saved. | 379 // going to be saved. |
| 392 model()->SavePage( | 380 model()->SavePage( |
| 393 kFileUrl, kTestPageBookmarkId1, scoped_ptr<OfflinePageTestArchiver>(), | 381 kFileUrl, kTestClientId1, scoped_ptr<OfflinePageTestArchiver>(), |
| 394 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); | 382 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); |
| 395 PumpLoop(); | 383 PumpLoop(); |
| 396 EXPECT_EQ(SavePageResult::SKIPPED, last_save_result()); | 384 EXPECT_EQ(SavePageResult::SKIPPED, last_save_result()); |
| 397 } | 385 } |
| 398 | 386 |
| 399 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverTwoPages) { | 387 TEST_F(OfflinePageModelTest, SavePageOfflineArchiverTwoPages) { |
| 400 scoped_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( | 388 scoped_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( |
| 401 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); | 389 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); |
| 402 // archiver_ptr will be valid until after first PumpLoop() call after | 390 // archiver_ptr will be valid until after first PumpLoop() call after |
| 403 // CompleteCreateArchive() is called. | 391 // CompleteCreateArchive() is called. |
| 404 OfflinePageTestArchiver* archiver_ptr = archiver.get(); | 392 OfflinePageTestArchiver* archiver_ptr = archiver.get(); |
| 405 archiver_ptr->set_delayed(true); | 393 archiver_ptr->set_delayed(true); |
| 406 model()->SavePage( | 394 model()->SavePage( |
| 407 kTestUrl, kTestPageBookmarkId1, std::move(archiver), | 395 kTestUrl, kTestClientId1, std::move(archiver), |
| 408 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); | 396 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); |
| 409 EXPECT_TRUE(archiver_ptr->create_archive_called()); | 397 EXPECT_TRUE(archiver_ptr->create_archive_called()); |
| 410 | 398 |
| 411 // Request to save another page. | 399 // Request to save another page. |
| 412 SavePage(kTestUrl2, kTestPageBookmarkId2); | 400 SavePage(kTestUrl2, kTestClientId2); |
| 413 | 401 |
| 414 OfflinePageTestStore* store = GetStore(); | 402 OfflinePageTestStore* store = GetStore(); |
| 415 | 403 |
| 416 EXPECT_EQ(kTestUrl2, store->last_saved_page().url); | 404 EXPECT_EQ(kTestUrl2, store->last_saved_page().url); |
| 417 EXPECT_EQ(kTestPageBookmarkId2, store->last_saved_page().client_id); | 405 EXPECT_EQ(kTestClientId2, store->last_saved_page().client_id); |
| 418 base::FilePath archiver_path2 = last_archiver_path(); | 406 base::FilePath archiver_path2 = last_archiver_path(); |
| 419 EXPECT_EQ(archiver_path2, store->last_saved_page().file_path); | 407 EXPECT_EQ(archiver_path2, store->last_saved_page().file_path); |
| 420 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size); | 408 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size); |
| 421 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); | 409 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); |
| 422 | 410 |
| 423 ResetResults(); | 411 ResetResults(); |
| 424 | 412 |
| 425 archiver_ptr->CompleteCreateArchive(); | 413 archiver_ptr->CompleteCreateArchive(); |
| 426 // After this pump loop archiver_ptr is invalid. | 414 // After this pump loop archiver_ptr is invalid. |
| 427 PumpLoop(); | 415 PumpLoop(); |
| 428 | 416 |
| 429 EXPECT_EQ(kTestUrl, store->last_saved_page().url); | 417 EXPECT_EQ(kTestUrl, store->last_saved_page().url); |
| 430 EXPECT_EQ(kTestPageBookmarkId1, store->last_saved_page().client_id); | 418 EXPECT_EQ(kTestClientId1, store->last_saved_page().client_id); |
| 431 base::FilePath archiver_path = last_archiver_path(); | 419 base::FilePath archiver_path = last_archiver_path(); |
| 432 EXPECT_EQ(archiver_path, store->last_saved_page().file_path); | 420 EXPECT_EQ(archiver_path, store->last_saved_page().file_path); |
| 433 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size); | 421 EXPECT_EQ(kTestFileSize, store->last_saved_page().file_size); |
| 434 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); | 422 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); |
| 435 | 423 |
| 436 ResetResults(); | 424 ResetResults(); |
| 437 | 425 |
| 438 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); | 426 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); |
| 439 | 427 |
| 440 EXPECT_EQ(2UL, offline_pages.size()); | 428 EXPECT_EQ(2UL, offline_pages.size()); |
| 441 // Offline IDs are random, so the order of the pages is also random | 429 // Offline IDs are random, so the order of the pages is also random |
| 442 // So load in the right page for the validation below. | 430 // So load in the right page for the validation below. |
| 443 const OfflinePageItem* page1; | 431 const OfflinePageItem* page1; |
| 444 const OfflinePageItem* page2; | 432 const OfflinePageItem* page2; |
| 445 if (offline_pages[0].client_id == kTestPageBookmarkId1) { | 433 if (offline_pages[0].client_id == kTestClientId1) { |
| 446 page1 = &offline_pages[0]; | 434 page1 = &offline_pages[0]; |
| 447 page2 = &offline_pages[1]; | 435 page2 = &offline_pages[1]; |
| 448 } else { | 436 } else { |
| 449 page1 = &offline_pages[1]; | 437 page1 = &offline_pages[1]; |
| 450 page2 = &offline_pages[0]; | 438 page2 = &offline_pages[0]; |
| 451 } | 439 } |
| 452 | 440 |
| 453 EXPECT_EQ(kTestUrl, page1->url); | 441 EXPECT_EQ(kTestUrl, page1->url); |
| 454 EXPECT_EQ(kTestPageBookmarkId1, page1->client_id); | 442 EXPECT_EQ(kTestClientId1, page1->client_id); |
| 455 EXPECT_EQ(archiver_path, page1->file_path); | 443 EXPECT_EQ(archiver_path, page1->file_path); |
| 456 EXPECT_EQ(kTestFileSize, page1->file_size); | 444 EXPECT_EQ(kTestFileSize, page1->file_size); |
| 457 EXPECT_EQ(0, page1->access_count); | 445 EXPECT_EQ(0, page1->access_count); |
| 458 EXPECT_EQ(0, page1->flags); | 446 EXPECT_EQ(0, page1->flags); |
| 459 EXPECT_EQ(kTestUrl2, page2->url); | 447 EXPECT_EQ(kTestUrl2, page2->url); |
| 460 EXPECT_EQ(kTestPageBookmarkId2, page2->client_id); | 448 EXPECT_EQ(kTestClientId2, page2->client_id); |
| 461 EXPECT_EQ(archiver_path2, page2->file_path); | 449 EXPECT_EQ(archiver_path2, page2->file_path); |
| 462 EXPECT_EQ(kTestFileSize, page2->file_size); | 450 EXPECT_EQ(kTestFileSize, page2->file_size); |
| 463 EXPECT_EQ(0, page2->access_count); | 451 EXPECT_EQ(0, page2->access_count); |
| 464 EXPECT_EQ(0, page2->flags); | 452 EXPECT_EQ(0, page2->flags); |
| 465 } | 453 } |
| 466 | 454 |
| 467 TEST_F(OfflinePageModelTest, MarkPageAccessed) { | 455 TEST_F(OfflinePageModelTest, MarkPageAccessed) { |
| 468 SavePage(kTestUrl, kTestPageBookmarkId1); | 456 SavePage(kTestUrl, kTestClientId1); |
| 469 | 457 |
| 470 // This will increase access_count by one. | 458 // This will increase access_count by one. |
| 471 model()->MarkPageAccessed(last_save_offline_id()); | 459 model()->MarkPageAccessed(last_save_offline_id()); |
| 472 PumpLoop(); | 460 PumpLoop(); |
| 473 | 461 |
| 474 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); | 462 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); |
| 475 | 463 |
| 476 EXPECT_EQ(1UL, offline_pages.size()); | 464 EXPECT_EQ(1UL, offline_pages.size()); |
| 477 EXPECT_EQ(kTestUrl, offline_pages[0].url); | 465 EXPECT_EQ(kTestUrl, offline_pages[0].url); |
| 478 EXPECT_EQ(kTestPageBookmarkId1, offline_pages[0].client_id); | 466 EXPECT_EQ(kTestClientId1, offline_pages[0].client_id); |
| 479 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size); | 467 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size); |
| 480 EXPECT_EQ(1, offline_pages[0].access_count); | 468 EXPECT_EQ(1, offline_pages[0].access_count); |
| 481 } | 469 } |
| 482 | 470 |
| 483 TEST_F(OfflinePageModelTest, MarkPageForDeletion) { | 471 TEST_F(OfflinePageModelTest, MarkPageForDeletion) { |
| 484 SavePage(kTestUrl, kTestPageBookmarkId1); | 472 SavePage(kTestUrl, kTestClientId1); |
| 485 | 473 |
| 486 GURL offline_url = GetAllPages().begin()->GetOfflineURL(); | 474 GURL offline_url = GetAllPages().begin()->GetOfflineURL(); |
| 487 | 475 |
| 488 // Delete the page with undo tiggerred. | 476 // Delete the page with undo tiggerred. |
| 489 model()->MarkPageForDeletion( | 477 model()->MarkPageForDeletion( |
| 490 last_save_offline_id(), | 478 last_save_offline_id(), |
| 491 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); | 479 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); |
| 492 PumpLoop(); | 480 PumpLoop(); |
| 493 | 481 |
| 494 // GetAllPages will not return the page that is marked for deletion. | 482 // GetAllPages will not return the page that is marked for deletion. |
| 495 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); | 483 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); |
| 496 EXPECT_EQ(0UL, offline_pages.size()); | 484 EXPECT_EQ(0UL, offline_pages.size()); |
| 497 | 485 |
| 498 EXPECT_FALSE(HasPages(BOOKMARK_NAMESPACE)); | 486 EXPECT_FALSE(HasPages(kTestClientNamespace)); |
| 499 EXPECT_EQ(nullptr, model()->GetPageByOnlineURL(kTestUrl)); | 487 EXPECT_EQ(nullptr, model()->GetPageByOnlineURL(kTestUrl)); |
| 500 EXPECT_EQ(nullptr, model()->GetPageByOfflineId(last_save_offline_id())); | 488 EXPECT_EQ(nullptr, model()->GetPageByOfflineId(last_save_offline_id())); |
| 501 EXPECT_EQ(nullptr, model()->GetPageByOfflineURL(offline_url)); | 489 EXPECT_EQ(nullptr, model()->GetPageByOfflineURL(offline_url)); |
| 502 | 490 |
| 503 // Undo the deletion. | 491 // Undo the deletion. |
| 504 model()->UndoPageDeletion(last_save_offline_id()); | 492 model()->UndoPageDeletion(last_save_offline_id()); |
| 505 PumpLoop(); | 493 PumpLoop(); |
| 506 | 494 |
| 507 // GetAllPages will now return the restored page. | 495 // GetAllPages will now return the restored page. |
| 508 const std::vector<OfflinePageItem>& offline_pages_after_undo = GetAllPages(); | 496 const std::vector<OfflinePageItem>& offline_pages_after_undo = GetAllPages(); |
| 509 EXPECT_EQ(1UL, offline_pages_after_undo.size()); | 497 EXPECT_EQ(1UL, offline_pages_after_undo.size()); |
| 510 } | 498 } |
| 511 | 499 |
| 512 TEST_F(OfflinePageModelTest, FinalizePageDeletion) { | 500 TEST_F(OfflinePageModelTest, FinalizePageDeletion) { |
| 513 scoped_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( | 501 scoped_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( |
| 514 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); | 502 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); |
| 515 model()->SavePage( | 503 model()->SavePage( |
| 516 kTestUrl, kTestPageBookmarkId1, std::move(archiver), | 504 kTestUrl, kTestClientId1, std::move(archiver), |
| 517 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); | 505 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); |
| 518 PumpLoop(); | 506 PumpLoop(); |
| 519 | 507 |
| 520 // Mark the page for deletion. | 508 // Mark the page for deletion. |
| 521 model()->MarkPageForDeletion( | 509 model()->MarkPageForDeletion( |
| 522 last_save_offline_id(), | 510 last_save_offline_id(), |
| 523 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); | 511 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); |
| 524 PumpLoop(); | 512 PumpLoop(); |
| 525 | 513 |
| 526 EXPECT_EQ(1UL, GetStore()->GetAllPages().size()); | 514 EXPECT_EQ(1UL, GetStore()->GetAllPages().size()); |
| 527 | 515 |
| 528 // Fast forward to trigger the page deletion. | 516 // Fast forward to trigger the page deletion. |
| 529 FastForwardBy(OfflinePageModel::GetFinalDeletionDelayForTesting()); | 517 FastForwardBy(OfflinePageModel::GetFinalDeletionDelayForTesting()); |
| 530 | 518 |
| 531 EXPECT_EQ(0UL, GetStore()->GetAllPages().size()); | 519 EXPECT_EQ(0UL, GetStore()->GetAllPages().size()); |
| 532 } | 520 } |
| 533 | 521 |
| 534 TEST_F(OfflinePageModelTest, SavePageAfterMarkingPageForDeletion) { | 522 TEST_F(OfflinePageModelTest, SavePageAfterMarkingPageForDeletion) { |
| 535 scoped_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( | 523 scoped_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( |
| 536 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); | 524 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); |
| 537 model()->SavePage( | 525 model()->SavePage( |
| 538 kTestUrl, kTestPageBookmarkId1, std::move(archiver), | 526 kTestUrl, kTestClientId1, std::move(archiver), |
| 539 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); | 527 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); |
| 540 PumpLoop(); | 528 PumpLoop(); |
| 541 | 529 |
| 542 // Mark the page for deletion. | 530 // Mark the page for deletion. |
| 543 model()->MarkPageForDeletion( | 531 model()->MarkPageForDeletion( |
| 544 last_save_offline_id(), | 532 last_save_offline_id(), |
| 545 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); | 533 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); |
| 546 PumpLoop(); | 534 PumpLoop(); |
| 547 | 535 |
| 548 EXPECT_EQ(1UL, GetStore()->GetAllPages().size()); | 536 EXPECT_EQ(1UL, GetStore()->GetAllPages().size()); |
| 549 | 537 |
| 550 // Re-save the same page. | 538 // Re-save the same page. |
| 551 scoped_ptr<OfflinePageTestArchiver> archiver2(BuildArchiver( | 539 scoped_ptr<OfflinePageTestArchiver> archiver2(BuildArchiver( |
| 552 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); | 540 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); |
| 553 model()->SavePage( | 541 model()->SavePage( |
| 554 kTestUrl, kTestPageBookmarkId1, std::move(archiver2), | 542 kTestUrl, kTestClientId1, std::move(archiver2), |
| 555 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); | 543 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); |
| 556 | 544 |
| 557 // Fast forward to trigger the page cleanup. | 545 // Fast forward to trigger the page cleanup. |
| 558 FastForwardBy(OfflinePageModel::GetFinalDeletionDelayForTesting()); | 546 FastForwardBy(OfflinePageModel::GetFinalDeletionDelayForTesting()); |
| 559 | 547 |
| 560 // The re-saved page should still exist. | 548 // The re-saved page should still exist. |
| 561 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); | 549 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); |
| 562 ASSERT_EQ(1UL, offline_pages.size()); | 550 ASSERT_EQ(1UL, offline_pages.size()); |
| 563 EXPECT_EQ(kTestUrl, offline_pages[0].url); | 551 EXPECT_EQ(kTestUrl, offline_pages[0].url); |
| 564 EXPECT_EQ(kTestPageBookmarkId1, offline_pages[0].client_id); | 552 EXPECT_EQ(kTestClientId1, offline_pages[0].client_id); |
| 565 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size); | 553 EXPECT_EQ(kTestFileSize, offline_pages[0].file_size); |
| 566 EXPECT_EQ(0, offline_pages[0].access_count); | 554 EXPECT_EQ(0, offline_pages[0].access_count); |
| 567 } | 555 } |
| 568 | 556 |
| 569 TEST_F(OfflinePageModelTest, GetAllPagesStoreEmpty) { | 557 TEST_F(OfflinePageModelTest, GetAllPagesStoreEmpty) { |
| 570 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); | 558 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); |
| 571 | 559 |
| 572 EXPECT_EQ(0UL, offline_pages.size()); | 560 EXPECT_EQ(0UL, offline_pages.size()); |
| 573 } | 561 } |
| 574 | 562 |
| 575 TEST_F(OfflinePageModelTest, GetAllPagesStoreFailure) { | 563 TEST_F(OfflinePageModelTest, GetAllPagesStoreFailure) { |
| 576 GetStore()->set_test_scenario( | 564 GetStore()->set_test_scenario( |
| 577 OfflinePageTestStore::TestScenario::LOAD_FAILED); | 565 OfflinePageTestStore::TestScenario::LOAD_FAILED); |
| 578 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); | 566 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); |
| 579 | 567 |
| 580 EXPECT_EQ(0UL, offline_pages.size()); | 568 EXPECT_EQ(0UL, offline_pages.size()); |
| 581 } | 569 } |
| 582 | 570 |
| 583 TEST_F(OfflinePageModelTest, DeletePageSuccessful) { | 571 TEST_F(OfflinePageModelTest, DeletePageSuccessful) { |
| 584 OfflinePageTestStore* store = GetStore(); | 572 OfflinePageTestStore* store = GetStore(); |
| 585 | 573 |
| 586 // Save one page. | 574 // Save one page. |
| 587 SavePage(kTestUrl, kTestPageBookmarkId1); | 575 SavePage(kTestUrl, kTestClientId1); |
| 588 int64_t offline1 = last_save_offline_id(); | 576 int64_t offline1 = last_save_offline_id(); |
| 589 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); | 577 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); |
| 590 EXPECT_EQ(1u, store->GetAllPages().size()); | 578 EXPECT_EQ(1u, store->GetAllPages().size()); |
| 591 | 579 |
| 592 ResetResults(); | 580 ResetResults(); |
| 593 | 581 |
| 594 // Save another page. | 582 // Save another page. |
| 595 SavePage(kTestUrl2, kTestPageBookmarkId2); | 583 SavePage(kTestUrl2, kTestClientId2); |
| 596 int64_t offline2 = last_save_offline_id(); | 584 int64_t offline2 = last_save_offline_id(); |
| 597 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); | 585 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); |
| 598 EXPECT_EQ(2u, store->GetAllPages().size()); | 586 EXPECT_EQ(2u, store->GetAllPages().size()); |
| 599 | 587 |
| 600 ResetResults(); | 588 ResetResults(); |
| 601 | 589 |
| 602 // Delete one page. | 590 // Delete one page. |
| 603 DeletePage(offline1, | 591 DeletePage(offline1, |
| 604 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); | 592 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); |
| 605 | 593 |
| 606 PumpLoop(); | 594 PumpLoop(); |
| 607 | 595 |
| 608 EXPECT_EQ(last_deleted_offline_id(), offline1); | 596 EXPECT_EQ(last_deleted_offline_id(), offline1); |
| 609 EXPECT_EQ(last_deleted_client_id(), kTestPageBookmarkId1); | 597 EXPECT_EQ(last_deleted_client_id(), kTestClientId1); |
| 610 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); | 598 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); |
| 611 ASSERT_EQ(1u, store->GetAllPages().size()); | 599 ASSERT_EQ(1u, store->GetAllPages().size()); |
| 612 EXPECT_EQ(kTestUrl2, store->GetAllPages()[0].url); | 600 EXPECT_EQ(kTestUrl2, store->GetAllPages()[0].url); |
| 613 | 601 |
| 614 // Delete another page. | 602 // Delete another page. |
| 615 DeletePage(offline2, | 603 DeletePage(offline2, |
| 616 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); | 604 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); |
| 617 | 605 |
| 618 ResetResults(); | 606 ResetResults(); |
| 619 | 607 |
| 620 PumpLoop(); | 608 PumpLoop(); |
| 621 | 609 |
| 622 EXPECT_EQ(last_deleted_offline_id(), offline2); | 610 EXPECT_EQ(last_deleted_offline_id(), offline2); |
| 623 EXPECT_EQ(last_deleted_client_id(), kTestPageBookmarkId2); | 611 EXPECT_EQ(last_deleted_client_id(), kTestClientId2); |
| 624 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); | 612 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); |
| 625 EXPECT_EQ(0u, store->GetAllPages().size()); | 613 EXPECT_EQ(0u, store->GetAllPages().size()); |
| 626 } | 614 } |
| 627 | 615 |
| 628 TEST_F(OfflinePageModelTest, DeletePageByPredicate) { | 616 TEST_F(OfflinePageModelTest, DeletePageByPredicate) { |
| 629 OfflinePageTestStore* store = GetStore(); | 617 OfflinePageTestStore* store = GetStore(); |
| 630 | 618 |
| 631 // Save one page. | 619 // Save one page. |
| 632 SavePage(kTestUrl, kTestPageBookmarkId1); | 620 SavePage(kTestUrl, kTestClientId1); |
| 633 int64_t offline1 = last_save_offline_id(); | 621 int64_t offline1 = last_save_offline_id(); |
| 634 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); | 622 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); |
| 635 EXPECT_EQ(1u, store->GetAllPages().size()); | 623 EXPECT_EQ(1u, store->GetAllPages().size()); |
| 636 | 624 |
| 637 ResetResults(); | 625 ResetResults(); |
| 638 | 626 |
| 639 // Save another page. | 627 // Save another page. |
| 640 SavePage(kTestUrl2, kTestPageBookmarkId2); | 628 SavePage(kTestUrl2, kTestClientId2); |
| 641 int64_t offline2 = last_save_offline_id(); | 629 int64_t offline2 = last_save_offline_id(); |
| 642 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); | 630 EXPECT_EQ(SavePageResult::SUCCESS, last_save_result()); |
| 643 EXPECT_EQ(2u, store->GetAllPages().size()); | 631 EXPECT_EQ(2u, store->GetAllPages().size()); |
| 644 | 632 |
| 645 ResetResults(); | 633 ResetResults(); |
| 646 | 634 |
| 647 // Delete the second page. | 635 // Delete the second page. |
| 648 model()->DeletePagesByURLPredicate( | 636 model()->DeletePagesByURLPredicate( |
| 649 base::Bind(&URLSpecContains, "page.com"), | 637 base::Bind(&URLSpecContains, "page.com"), |
| 650 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); | 638 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); |
| 651 | 639 |
| 652 PumpLoop(); | 640 PumpLoop(); |
| 653 | 641 |
| 654 EXPECT_EQ(last_deleted_offline_id(), offline2); | 642 EXPECT_EQ(last_deleted_offline_id(), offline2); |
| 655 EXPECT_EQ(last_deleted_client_id(), kTestPageBookmarkId2); | 643 EXPECT_EQ(last_deleted_client_id(), kTestClientId2); |
| 656 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); | 644 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); |
| 657 ASSERT_EQ(1u, store->GetAllPages().size()); | 645 ASSERT_EQ(1u, store->GetAllPages().size()); |
| 658 EXPECT_EQ(kTestUrl, store->GetAllPages()[0].url); | 646 EXPECT_EQ(kTestUrl, store->GetAllPages()[0].url); |
| 659 | 647 |
| 660 ResetResults(); | 648 ResetResults(); |
| 661 | 649 |
| 662 // Delete the first page. | 650 // Delete the first page. |
| 663 model()->DeletePagesByURLPredicate( | 651 model()->DeletePagesByURLPredicate( |
| 664 base::Bind(&URLSpecContains, "example.com"), | 652 base::Bind(&URLSpecContains, "example.com"), |
| 665 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); | 653 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); |
| 666 | 654 |
| 667 PumpLoop(); | 655 PumpLoop(); |
| 668 | 656 |
| 669 EXPECT_EQ(last_deleted_offline_id(), offline1); | 657 EXPECT_EQ(last_deleted_offline_id(), offline1); |
| 670 EXPECT_EQ(last_deleted_client_id(), kTestPageBookmarkId1); | 658 EXPECT_EQ(last_deleted_client_id(), kTestClientId1); |
| 671 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); | 659 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); |
| 672 EXPECT_EQ(0u, store->GetAllPages().size()); | 660 EXPECT_EQ(0u, store->GetAllPages().size()); |
| 673 } | 661 } |
| 674 | 662 |
| 675 TEST_F(OfflinePageModelTest, DeletePageNotFound) { | 663 TEST_F(OfflinePageModelTest, DeletePageNotFound) { |
| 676 DeletePage(1234LL, | 664 DeletePage(1234LL, |
| 677 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); | 665 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); |
| 678 EXPECT_EQ(DeletePageResult::NOT_FOUND, last_delete_result()); | 666 EXPECT_EQ(DeletePageResult::NOT_FOUND, last_delete_result()); |
| 679 | 667 |
| 680 ResetResults(); | 668 ResetResults(); |
| 681 | 669 |
| 682 model()->DeletePagesByURLPredicate( | 670 model()->DeletePagesByURLPredicate( |
| 683 base::Bind(&URLSpecContains, "page.com"), | 671 base::Bind(&URLSpecContains, "page.com"), |
| 684 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); | 672 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); |
| 685 EXPECT_EQ(DeletePageResult::NOT_FOUND, last_delete_result()); | 673 EXPECT_EQ(DeletePageResult::NOT_FOUND, last_delete_result()); |
| 686 } | 674 } |
| 687 | 675 |
| 688 TEST_F(OfflinePageModelTest, DeletePageStoreFailureOnRemove) { | 676 TEST_F(OfflinePageModelTest, DeletePageStoreFailureOnRemove) { |
| 689 // Save a page. | 677 // Save a page. |
| 690 SavePage(kTestUrl, kTestPageBookmarkId1); | 678 SavePage(kTestUrl, kTestClientId1); |
| 691 int64_t offline_id = last_save_offline_id(); | 679 int64_t offline_id = last_save_offline_id(); |
| 692 ResetResults(); | 680 ResetResults(); |
| 693 | 681 |
| 694 // Try to delete this page. | 682 // Try to delete this page. |
| 695 GetStore()->set_test_scenario( | 683 GetStore()->set_test_scenario( |
| 696 OfflinePageTestStore::TestScenario::REMOVE_FAILED); | 684 OfflinePageTestStore::TestScenario::REMOVE_FAILED); |
| 697 DeletePage(offline_id, | 685 DeletePage(offline_id, |
| 698 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); | 686 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); |
| 699 PumpLoop(); | 687 PumpLoop(); |
| 700 EXPECT_EQ(DeletePageResult::STORE_FAILURE, last_delete_result()); | 688 EXPECT_EQ(DeletePageResult::STORE_FAILURE, last_delete_result()); |
| 701 } | 689 } |
| 702 | 690 |
| 703 TEST_F(OfflinePageModelTest, DetectThatOfflineCopyIsMissing) { | 691 TEST_F(OfflinePageModelTest, DetectThatOfflineCopyIsMissing) { |
| 704 // Save a page. | 692 // Save a page. |
| 705 SavePage(kTestUrl, kTestPageBookmarkId1); | 693 SavePage(kTestUrl, kTestClientId1); |
| 706 int64_t offline_id = last_save_offline_id(); | 694 int64_t offline_id = last_save_offline_id(); |
| 707 | 695 |
| 708 ResetResults(); | 696 ResetResults(); |
| 709 | 697 |
| 710 const OfflinePageItem* page = model()->GetPageByOfflineId(offline_id); | 698 const OfflinePageItem* page = model()->GetPageByOfflineId(offline_id); |
| 711 | 699 |
| 712 // Delete the offline copy of the page and check the metadata. | 700 // Delete the offline copy of the page and check the metadata. |
| 713 base::DeleteFile(page->file_path, false); | 701 base::DeleteFile(page->file_path, false); |
| 714 model()->CheckForExternalFileDeletion(); | 702 model()->CheckForExternalFileDeletion(); |
| 715 PumpLoop(); | 703 PumpLoop(); |
| 716 | 704 |
| 717 EXPECT_EQ(last_deleted_offline_id(), offline_id); | 705 EXPECT_EQ(last_deleted_offline_id(), offline_id); |
| 718 EXPECT_EQ(0UL, GetAllPages().size()); | 706 EXPECT_EQ(0UL, GetAllPages().size()); |
| 719 } | 707 } |
| 720 | 708 |
| 721 TEST_F(OfflinePageModelTest, DetectThatOfflineCopyIsMissingAfterLoad) { | 709 TEST_F(OfflinePageModelTest, DetectThatOfflineCopyIsMissingAfterLoad) { |
| 722 // Save a page. | 710 // Save a page. |
| 723 SavePage(kTestUrl, kTestPageBookmarkId1); | 711 SavePage(kTestUrl, kTestClientId1); |
| 724 PumpLoop(); | 712 PumpLoop(); |
| 725 int64_t offline_id = last_save_offline_id(); | 713 int64_t offline_id = last_save_offline_id(); |
| 726 | 714 |
| 727 ResetResults(); | 715 ResetResults(); |
| 728 | 716 |
| 729 const OfflinePageItem* page = model()->GetPageByOfflineId(offline_id); | 717 const OfflinePageItem* page = model()->GetPageByOfflineId(offline_id); |
| 730 // Delete the offline copy of the page and check the metadata. | 718 // Delete the offline copy of the page and check the metadata. |
| 731 base::DeleteFile(page->file_path, false); | 719 base::DeleteFile(page->file_path, false); |
| 732 // Reseting the model should trigger the metadata consistency check as well. | 720 // Reseting the model should trigger the metadata consistency check as well. |
| 733 ResetModel(); | 721 ResetModel(); |
| 734 PumpLoop(); | 722 PumpLoop(); |
| 735 | 723 |
| 736 EXPECT_EQ(last_deleted_offline_id(), offline_id); | 724 EXPECT_EQ(last_deleted_offline_id(), offline_id); |
| 737 EXPECT_EQ(0UL, GetAllPages().size()); | 725 EXPECT_EQ(0UL, GetAllPages().size()); |
| 738 } | 726 } |
| 739 | 727 |
| 740 TEST_F(OfflinePageModelTest, DeleteMultiplePages) { | 728 TEST_F(OfflinePageModelTest, DeleteMultiplePages) { |
| 741 OfflinePageTestStore* store = GetStore(); | 729 OfflinePageTestStore* store = GetStore(); |
| 742 | 730 |
| 743 // Save 3 pages. | 731 // Save 3 pages. |
| 744 scoped_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( | 732 scoped_ptr<OfflinePageTestArchiver> archiver(BuildArchiver( |
| 745 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); | 733 kTestUrl, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); |
| 746 model()->SavePage( | 734 model()->SavePage( |
| 747 kTestUrl, kTestPageBookmarkId1, std::move(archiver), | 735 kTestUrl, kTestClientId1, std::move(archiver), |
| 748 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); | 736 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); |
| 749 PumpLoop(); | 737 PumpLoop(); |
| 750 int64_t offline1 = last_save_offline_id(); | 738 int64_t offline1 = last_save_offline_id(); |
| 751 | 739 |
| 752 scoped_ptr<OfflinePageTestArchiver> archiver2(BuildArchiver( | 740 scoped_ptr<OfflinePageTestArchiver> archiver2(BuildArchiver( |
| 753 kTestUrl2, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); | 741 kTestUrl2, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); |
| 754 model()->SavePage( | 742 model()->SavePage( |
| 755 kTestUrl2, kTestPageBookmarkId2, std::move(archiver2), | 743 kTestUrl2, kTestClientId2, std::move(archiver2), |
| 756 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); | 744 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); |
| 757 PumpLoop(); | 745 PumpLoop(); |
| 758 int64_t offline2 = last_save_offline_id(); | 746 int64_t offline2 = last_save_offline_id(); |
| 759 | 747 |
| 760 scoped_ptr<OfflinePageTestArchiver> archiver3(BuildArchiver( | 748 scoped_ptr<OfflinePageTestArchiver> archiver3(BuildArchiver( |
| 761 kTestUrl3, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); | 749 kTestUrl3, OfflinePageArchiver::ArchiverResult::SUCCESSFULLY_CREATED)); |
| 762 model()->SavePage( | 750 model()->SavePage( |
| 763 kTestUrl3, kTestPageBookmarkId3, std::move(archiver3), | 751 kTestUrl3, kTestClientId3, std::move(archiver3), |
| 764 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); | 752 base::Bind(&OfflinePageModelTest::OnSavePageDone, AsWeakPtr())); |
| 765 PumpLoop(); | 753 PumpLoop(); |
| 766 | 754 |
| 767 EXPECT_EQ(3u, store->GetAllPages().size()); | 755 EXPECT_EQ(3u, store->GetAllPages().size()); |
| 768 | 756 |
| 769 // Delete multiple pages. | 757 // Delete multiple pages. |
| 770 std::vector<int64_t> ids_to_delete; | 758 std::vector<int64_t> ids_to_delete; |
| 771 ids_to_delete.push_back(offline2); | 759 ids_to_delete.push_back(offline2); |
| 772 ids_to_delete.push_back(offline1); | 760 ids_to_delete.push_back(offline1); |
| 773 ids_to_delete.push_back(23434LL); // Non-existent ID. | 761 ids_to_delete.push_back(23434LL); // Non-existent ID. |
| 774 model()->DeletePagesByOfflineId( | 762 model()->DeletePagesByOfflineId( |
| 775 ids_to_delete, | 763 ids_to_delete, |
| 776 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); | 764 base::Bind(&OfflinePageModelTest::OnDeletePageDone, AsWeakPtr())); |
| 777 PumpLoop(); | 765 PumpLoop(); |
| 778 | 766 |
| 779 // Success is expected if at least one page is deleted successfully. | 767 // Success is expected if at least one page is deleted successfully. |
| 780 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); | 768 EXPECT_EQ(DeletePageResult::SUCCESS, last_delete_result()); |
| 781 EXPECT_EQ(1u, store->GetAllPages().size()); | 769 EXPECT_EQ(1u, store->GetAllPages().size()); |
| 782 } | 770 } |
| 783 | 771 |
| 784 TEST_F(OfflinePageModelTest, GetPageByOfflineId) { | 772 TEST_F(OfflinePageModelTest, GetPageByOfflineId) { |
| 785 SavePage(kTestUrl, kTestPageBookmarkId1); | 773 SavePage(kTestUrl, kTestClientId1); |
| 786 int64_t offline1 = last_save_offline_id(); | 774 int64_t offline1 = last_save_offline_id(); |
| 787 SavePage(kTestUrl2, kTestPageBookmarkId2); | 775 SavePage(kTestUrl2, kTestClientId2); |
| 788 int64_t offline2 = last_save_offline_id(); | 776 int64_t offline2 = last_save_offline_id(); |
| 789 | 777 |
| 790 const OfflinePageItem* page = model()->GetPageByOfflineId(offline1); | 778 const OfflinePageItem* page = model()->GetPageByOfflineId(offline1); |
| 791 ASSERT_TRUE(page); | 779 ASSERT_TRUE(page); |
| 792 EXPECT_EQ(kTestUrl, page->url); | 780 EXPECT_EQ(kTestUrl, page->url); |
| 793 EXPECT_EQ(kTestPageBookmarkId1, page->client_id); | 781 EXPECT_EQ(kTestClientId1, page->client_id); |
| 794 EXPECT_EQ(kTestFileSize, page->file_size); | 782 EXPECT_EQ(kTestFileSize, page->file_size); |
| 795 | 783 |
| 796 page = model()->GetPageByOfflineId(offline2); | 784 page = model()->GetPageByOfflineId(offline2); |
| 797 ASSERT_TRUE(page); | 785 ASSERT_TRUE(page); |
| 798 EXPECT_EQ(kTestUrl2, page->url); | 786 EXPECT_EQ(kTestUrl2, page->url); |
| 799 EXPECT_EQ(kTestPageBookmarkId2, page->client_id); | 787 EXPECT_EQ(kTestClientId2, page->client_id); |
| 800 EXPECT_EQ(kTestFileSize, page->file_size); | 788 EXPECT_EQ(kTestFileSize, page->file_size); |
| 801 | 789 |
| 802 page = model()->GetPageByOfflineId(-42); | 790 page = model()->GetPageByOfflineId(-42); |
| 803 EXPECT_FALSE(page); | 791 EXPECT_FALSE(page); |
| 804 } | 792 } |
| 805 | 793 |
| 806 TEST_F(OfflinePageModelTest, GetPageByOfflineURL) { | 794 TEST_F(OfflinePageModelTest, GetPageByOfflineURL) { |
| 807 SavePage(kTestUrl, kTestPageBookmarkId1); | 795 SavePage(kTestUrl, kTestClientId1); |
| 808 int64_t offline1 = last_save_offline_id(); | 796 int64_t offline1 = last_save_offline_id(); |
| 809 | 797 |
| 810 OfflinePageTestStore* store = GetStore(); | 798 OfflinePageTestStore* store = GetStore(); |
| 811 GURL offline_url = store->last_saved_page().GetOfflineURL(); | 799 GURL offline_url = store->last_saved_page().GetOfflineURL(); |
| 812 | 800 |
| 813 SavePage(kTestUrl2, kTestPageBookmarkId2); | 801 SavePage(kTestUrl2, kTestClientId2); |
| 814 | 802 |
| 815 GURL offline_url2 = store->last_saved_page().GetOfflineURL(); | 803 GURL offline_url2 = store->last_saved_page().GetOfflineURL(); |
| 816 int64_t offline2 = last_save_offline_id(); | 804 int64_t offline2 = last_save_offline_id(); |
| 817 | 805 |
| 818 const OfflinePageItem* page = model()->GetPageByOfflineURL(offline_url2); | 806 const OfflinePageItem* page = model()->GetPageByOfflineURL(offline_url2); |
| 819 EXPECT_TRUE(page); | 807 EXPECT_TRUE(page); |
| 820 EXPECT_EQ(kTestUrl2, page->url); | 808 EXPECT_EQ(kTestUrl2, page->url); |
| 821 EXPECT_EQ(kTestPageBookmarkId2, page->client_id); | 809 EXPECT_EQ(kTestClientId2, page->client_id); |
| 822 EXPECT_EQ(offline2, page->offline_id); | 810 EXPECT_EQ(offline2, page->offline_id); |
| 823 | 811 |
| 824 page = model()->GetPageByOfflineURL(offline_url); | 812 page = model()->GetPageByOfflineURL(offline_url); |
| 825 EXPECT_TRUE(page); | 813 EXPECT_TRUE(page); |
| 826 EXPECT_EQ(kTestUrl, page->url); | 814 EXPECT_EQ(kTestUrl, page->url); |
| 827 EXPECT_EQ(kTestPageBookmarkId1, page->client_id); | 815 EXPECT_EQ(kTestClientId1, page->client_id); |
| 828 EXPECT_EQ(offline1, page->offline_id); | 816 EXPECT_EQ(offline1, page->offline_id); |
| 829 | 817 |
| 830 page = model()->GetPageByOfflineURL(GURL("http://foo")); | 818 page = model()->GetPageByOfflineURL(GURL("http://foo")); |
| 831 EXPECT_FALSE(page); | 819 EXPECT_FALSE(page); |
| 832 } | 820 } |
| 833 | 821 |
| 834 TEST_F(OfflinePageModelTest, GetPageByOnlineURL) { | 822 TEST_F(OfflinePageModelTest, GetPageByOnlineURL) { |
| 835 SavePage(kTestUrl, kTestPageBookmarkId1); | 823 SavePage(kTestUrl, kTestClientId1); |
| 836 SavePage(kTestUrl2, kTestPageBookmarkId2); | 824 SavePage(kTestUrl2, kTestClientId2); |
| 837 | 825 |
| 838 const OfflinePageItem* page = model()->GetPageByOnlineURL(kTestUrl2); | 826 const OfflinePageItem* page = model()->GetPageByOnlineURL(kTestUrl2); |
| 839 EXPECT_TRUE(page); | 827 EXPECT_TRUE(page); |
| 840 EXPECT_EQ(kTestUrl2, page->url); | 828 EXPECT_EQ(kTestUrl2, page->url); |
| 841 EXPECT_EQ(kTestPageBookmarkId2, page->client_id); | 829 EXPECT_EQ(kTestClientId2, page->client_id); |
| 842 | 830 |
| 843 page = model()->GetPageByOnlineURL(kTestUrl); | 831 page = model()->GetPageByOnlineURL(kTestUrl); |
| 844 EXPECT_TRUE(page); | 832 EXPECT_TRUE(page); |
| 845 EXPECT_EQ(kTestUrl, page->url); | 833 EXPECT_EQ(kTestUrl, page->url); |
| 846 EXPECT_EQ(kTestPageBookmarkId1, page->client_id); | 834 EXPECT_EQ(kTestClientId1, page->client_id); |
| 847 | 835 |
| 848 page = model()->GetPageByOnlineURL(GURL("http://foo")); | 836 page = model()->GetPageByOnlineURL(GURL("http://foo")); |
| 849 EXPECT_FALSE(page); | 837 EXPECT_FALSE(page); |
| 850 } | 838 } |
| 851 | 839 |
| 852 // Test that model returns pages that are older than 30 days as candidates for | 840 // Test that model returns pages that are older than 30 days as candidates for |
| 853 // clean up, hence the numbers in time delta. | 841 // clean up, hence the numbers in time delta. |
| 854 TEST_F(OfflinePageModelTest, GetPagesToCleanUp) { | 842 TEST_F(OfflinePageModelTest, GetPagesToCleanUp) { |
| 855 base::Time now = base::Time::Now(); | 843 base::Time now = base::Time::Now(); |
| 856 | 844 |
| 857 SavePage(kTestUrl, kTestPageBookmarkId1); | 845 SavePage(kTestUrl, kTestClientId1); |
| 858 GetStore()->UpdateLastAccessTime(last_save_offline_id(), | 846 GetStore()->UpdateLastAccessTime(last_save_offline_id(), |
| 859 now - base::TimeDelta::FromDays(40)); | 847 now - base::TimeDelta::FromDays(40)); |
| 860 | 848 |
| 861 SavePage(kTestUrl2, kTestPageBookmarkId2); | 849 SavePage(kTestUrl2, kTestClientId2); |
| 862 GetStore()->UpdateLastAccessTime(last_save_offline_id(), | 850 GetStore()->UpdateLastAccessTime(last_save_offline_id(), |
| 863 now - base::TimeDelta::FromDays(31)); | 851 now - base::TimeDelta::FromDays(31)); |
| 864 | 852 |
| 865 SavePage(kTestUrl3, kTestPageBookmarkId3); | 853 SavePage(kTestUrl3, kTestClientId3); |
| 866 GetStore()->UpdateLastAccessTime(last_save_offline_id(), | 854 GetStore()->UpdateLastAccessTime(last_save_offline_id(), |
| 867 now - base::TimeDelta::FromDays(29)); | 855 now - base::TimeDelta::FromDays(29)); |
| 868 | 856 |
| 869 ResetModel(); | 857 ResetModel(); |
| 870 | 858 |
| 871 // Only page_1 and page_2 are expected to be picked up by the model as page_3 | 859 // Only page_1 and page_2 are expected to be picked up by the model as page_3 |
| 872 // has not been in the store long enough. | 860 // has not been in the store long enough. |
| 873 std::vector<OfflinePageItem> pages_to_clean_up = model()->GetPagesToCleanUp(); | 861 std::vector<OfflinePageItem> pages_to_clean_up = model()->GetPagesToCleanUp(); |
| 874 // Offline IDs are random, so the order of the pages is also random | 862 // Offline IDs are random, so the order of the pages is also random |
| 875 // So load in the right page for the validation below. | 863 // So load in the right page for the validation below. |
| 876 const OfflinePageItem* page1; | 864 const OfflinePageItem* page1; |
| 877 const OfflinePageItem* page2; | 865 const OfflinePageItem* page2; |
| 878 if (pages_to_clean_up[0].client_id == kTestPageBookmarkId1) { | 866 if (pages_to_clean_up[0].client_id == kTestClientId1) { |
| 879 page1 = &pages_to_clean_up[0]; | 867 page1 = &pages_to_clean_up[0]; |
| 880 page2 = &pages_to_clean_up[1]; | 868 page2 = &pages_to_clean_up[1]; |
| 881 } else { | 869 } else { |
| 882 page1 = &pages_to_clean_up[1]; | 870 page1 = &pages_to_clean_up[1]; |
| 883 page2 = &pages_to_clean_up[0]; | 871 page2 = &pages_to_clean_up[0]; |
| 884 } | 872 } |
| 885 | 873 |
| 886 EXPECT_EQ(2UL, pages_to_clean_up.size()); | 874 EXPECT_EQ(2UL, pages_to_clean_up.size()); |
| 887 EXPECT_EQ(kTestUrl, page1->url); | 875 EXPECT_EQ(kTestUrl, page1->url); |
| 888 EXPECT_EQ(kTestPageBookmarkId1, page1->client_id); | 876 EXPECT_EQ(kTestClientId1, page1->client_id); |
| 889 EXPECT_EQ(kTestUrl2, page2->url); | 877 EXPECT_EQ(kTestUrl2, page2->url); |
| 890 EXPECT_EQ(kTestPageBookmarkId2, page2->client_id); | 878 EXPECT_EQ(kTestClientId2, page2->client_id); |
| 891 } | 879 } |
| 892 | 880 |
| 893 TEST_F(OfflinePageModelTest, CanSavePage) { | 881 TEST_F(OfflinePageModelTest, CanSavePage) { |
| 894 EXPECT_TRUE(OfflinePageModel::CanSavePage(GURL("http://foo"))); | 882 EXPECT_TRUE(OfflinePageModel::CanSavePage(GURL("http://foo"))); |
| 895 EXPECT_TRUE(OfflinePageModel::CanSavePage(GURL("https://foo"))); | 883 EXPECT_TRUE(OfflinePageModel::CanSavePage(GURL("https://foo"))); |
| 896 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("file:///foo"))); | 884 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("file:///foo"))); |
| 897 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("data:image/png;base64,ab"))); | 885 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("data:image/png;base64,ab"))); |
| 898 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("chrome://version"))); | 886 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("chrome://version"))); |
| 899 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("chrome-native://newtab/"))); | 887 EXPECT_FALSE(OfflinePageModel::CanSavePage(GURL("chrome-native://newtab/"))); |
| 900 } | 888 } |
| 901 | 889 |
| 902 TEST_F(OfflinePageModelTest, ClearAll) { | 890 TEST_F(OfflinePageModelTest, ClearAll) { |
| 903 SavePage(kTestUrl, kTestPageBookmarkId1); | 891 SavePage(kTestUrl, kTestClientId1); |
| 904 SavePage(kTestUrl2, kTestPageBookmarkId2); | 892 SavePage(kTestUrl2, kTestClientId2); |
| 905 | 893 |
| 906 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); | 894 const std::vector<OfflinePageItem>& offline_pages = GetAllPages(); |
| 907 EXPECT_EQ(2UL, offline_pages.size()); | 895 EXPECT_EQ(2UL, offline_pages.size()); |
| 908 EXPECT_EQ(2UL, GetStore()->GetAllPages().size()); | 896 EXPECT_EQ(2UL, GetStore()->GetAllPages().size()); |
| 909 base::FilePath archiver_path = offline_pages[0].file_path; | 897 base::FilePath archiver_path = offline_pages[0].file_path; |
| 910 EXPECT_TRUE(base::PathExists(archiver_path)); | 898 EXPECT_TRUE(base::PathExists(archiver_path)); |
| 911 | 899 |
| 912 // ClearAll should delete all the files and wipe out both cache and store. | 900 // ClearAll should delete all the files and wipe out both cache and store. |
| 913 model()->ClearAll( | 901 model()->ClearAll( |
| 914 base::Bind(&OfflinePageModelTest::OnClearAllDone, AsWeakPtr())); | 902 base::Bind(&OfflinePageModelTest::OnClearAllDone, AsWeakPtr())); |
| 915 PumpLoop(); | 903 PumpLoop(); |
| 916 EXPECT_EQ(0UL, GetAllPages().size()); | 904 EXPECT_EQ(0UL, GetAllPages().size()); |
| 917 EXPECT_EQ(0UL, GetStore()->GetAllPages().size()); | 905 EXPECT_EQ(0UL, GetStore()->GetAllPages().size()); |
| 918 EXPECT_FALSE(base::PathExists(archiver_path)); | 906 EXPECT_FALSE(base::PathExists(archiver_path)); |
| 919 | 907 |
| 920 // The model should reload the store after the reset. All model operations | 908 // The model should reload the store after the reset. All model operations |
| 921 // should continue to work. | 909 // should continue to work. |
| 922 SavePage(kTestUrl2, kTestPageBookmarkId2); | 910 SavePage(kTestUrl2, kTestClientId2); |
| 923 EXPECT_EQ(1UL, GetAllPages().size()); | 911 EXPECT_EQ(1UL, GetAllPages().size()); |
| 924 EXPECT_EQ(1UL, GetStore()->GetAllPages().size()); | 912 EXPECT_EQ(1UL, GetStore()->GetAllPages().size()); |
| 925 } | 913 } |
| 926 | 914 |
| 927 class OfflinePageModelBookmarkChangeTest : | 915 TEST_F(OfflinePageModelTest, SaveRetrieveMultipleClientIds) { |
| 928 public OfflinePageModelTest, | 916 EXPECT_FALSE(HasPages(kTestClientNamespace)); |
| 929 public bookmarks::BookmarkUndoDelegate { | 917 SavePage(kTestUrl, kTestClientId1); |
| 930 public: | 918 int64_t offline1 = last_save_offline_id(); |
| 931 OfflinePageModelBookmarkChangeTest(); | 919 EXPECT_TRUE(HasPages(kTestClientNamespace)); |
| 932 ~OfflinePageModelBookmarkChangeTest() override; | |
| 933 | 920 |
| 934 void SetUp() override; | 921 SavePage(kTestUrl, kTestClientId1); |
| 935 void TearDown() override; | |
| 936 | |
| 937 // bookmarks::BookmarkUndoDelegate implementation. | |
| 938 void SetUndoProvider(bookmarks::BookmarkUndoProvider* provider) override; | |
| 939 void OnBookmarkNodeRemoved(bookmarks::BookmarkModel* model, | |
| 940 const bookmarks::BookmarkNode* parent, | |
| 941 int index, | |
| 942 scoped_ptr<bookmarks::BookmarkNode> node) override; | |
| 943 | |
| 944 const bookmarks::BookmarkNode* CreateBookmarkNode(const GURL& url); | |
| 945 void UndoBookmarkRemoval(); | |
| 946 | |
| 947 bookmarks::BookmarkModel* bookmark_model() const { | |
| 948 return bookmark_model_.get(); | |
| 949 } | |
| 950 | |
| 951 private: | |
| 952 scoped_ptr<bookmarks::BookmarkModel> bookmark_model_; | |
| 953 bookmarks::BookmarkUndoProvider* bookmark_undo_provider_; | |
| 954 const bookmarks::BookmarkNode* removed_bookmark_parent_; | |
| 955 int removed_bookmark_index_; | |
| 956 scoped_ptr<bookmarks::BookmarkNode> removed_bookmark_node_; | |
| 957 }; | |
| 958 | |
| 959 OfflinePageModelBookmarkChangeTest::OfflinePageModelBookmarkChangeTest() | |
| 960 : OfflinePageModelTest(), | |
| 961 bookmark_model_(bookmarks::TestBookmarkClient::CreateModel()), | |
| 962 bookmark_undo_provider_(nullptr), | |
| 963 removed_bookmark_parent_(nullptr), | |
| 964 removed_bookmark_index_(-1) {} | |
| 965 | |
| 966 OfflinePageModelBookmarkChangeTest::~OfflinePageModelBookmarkChangeTest() { | |
| 967 } | |
| 968 | |
| 969 void OfflinePageModelBookmarkChangeTest::SetUp() { | |
| 970 OfflinePageModelTest::SetUp(); | |
| 971 bookmark_model_->AddObserver( | |
| 972 new OfflinePageBookmarkBridge(model(), bookmark_model())); | |
| 973 } | |
| 974 | |
| 975 void OfflinePageModelBookmarkChangeTest::TearDown() { | |
| 976 OfflinePageModelTest::TearDown(); | |
| 977 bookmark_model_.reset(); | |
| 978 } | |
| 979 | |
| 980 void OfflinePageModelBookmarkChangeTest::SetUndoProvider( | |
| 981 bookmarks::BookmarkUndoProvider* provider) { | |
| 982 bookmark_undo_provider_ = provider; | |
| 983 } | |
| 984 | |
| 985 void OfflinePageModelBookmarkChangeTest::OnBookmarkNodeRemoved( | |
| 986 bookmarks::BookmarkModel* model, | |
| 987 const bookmarks::BookmarkNode* parent, | |
| 988 int index, | |
| 989 scoped_ptr<bookmarks::BookmarkNode> node) { | |
| 990 removed_bookmark_parent_ = parent; | |
| 991 removed_bookmark_index_ = index; | |
| 992 removed_bookmark_node_ = std::move(node); | |
| 993 } | |
| 994 | |
| 995 const bookmarks::BookmarkNode* | |
| 996 OfflinePageModelBookmarkChangeTest::CreateBookmarkNode(const GURL& url) { | |
| 997 const bookmarks::BookmarkNode* bookmark_root = | |
| 998 bookmark_model()->bookmark_bar_node(); | |
| 999 return bookmark_model()->AddURL(bookmark_root, 0, base::string16(), url); | |
| 1000 } | |
| 1001 | |
| 1002 void OfflinePageModelBookmarkChangeTest::UndoBookmarkRemoval() { | |
| 1003 bookmark_undo_provider_->RestoreRemovedNode( | |
| 1004 removed_bookmark_parent_, removed_bookmark_index_, | |
| 1005 std::move(removed_bookmark_node_)); | |
| 1006 removed_bookmark_parent_ = nullptr; | |
| 1007 removed_bookmark_index_ = -1; | |
| 1008 } | |
| 1009 | |
| 1010 TEST_F(OfflinePageModelBookmarkChangeTest, ChangeBookmakeTitle) { | |
| 1011 // Creates a bookmark without offline copy. | |
| 1012 const bookmarks::BookmarkNode* bookmark_node = CreateBookmarkNode(kTestUrl); | |
| 1013 EXPECT_EQ(0UL, GetAllPages().size()); | |
| 1014 | |
| 1015 // Changing the bookmark title should have no effect. | |
| 1016 bookmark_model()->SetTitle( | |
| 1017 bookmark_node, base::string16(base::ASCIIToUTF16("foo"))); | |
| 1018 PumpLoop(); | |
| 1019 EXPECT_EQ(0UL, GetAllPages().size()); | |
| 1020 | |
| 1021 // Adds an offline copy for the bookmark. | |
| 1022 SavePage(kTestUrl, ClientId(BOOKMARK_NAMESPACE, | |
| 1023 base::Int64ToString(bookmark_node->id()))); | |
| 1024 EXPECT_EQ(1UL, GetAllPages().size()); | |
| 1025 | |
| 1026 // Changes the bookmark title. The offline copy was not affected. | |
| 1027 bookmark_model()->SetTitle( | |
| 1028 bookmark_node, base::string16(base::ASCIIToUTF16("bar"))); | |
| 1029 PumpLoop(); | |
| 1030 EXPECT_EQ(1UL, GetAllPages().size()); | |
| 1031 } | |
| 1032 | |
| 1033 TEST_F(OfflinePageModelBookmarkChangeTest, ChangeBookmakeURL) { | |
| 1034 // Creates a bookmark without offline copy. | |
| 1035 const bookmarks::BookmarkNode* bookmark_node = CreateBookmarkNode(kTestUrl2); | |
| 1036 EXPECT_EQ(0UL, GetAllPages().size()); | |
| 1037 | |
| 1038 // Changing the bookmark URL should have no effect. Chrome should not crash. | |
| 1039 // (http://crbug.com/560518) | |
| 1040 bookmark_model()->SetURL(bookmark_node, kTestUrl); | |
| 1041 PumpLoop(); | |
| 1042 EXPECT_EQ(0UL, GetAllPages().size()); | |
| 1043 | |
| 1044 // Adds an offline copy for the bookmark. | |
| 1045 SavePage(kTestUrl, ClientId(BOOKMARK_NAMESPACE, | |
| 1046 base::Int64ToString(bookmark_node->id()))); | |
| 1047 EXPECT_EQ(1UL, GetAllPages().size()); | |
| 1048 | |
| 1049 // The offline copy should be removed upon the bookmark URL change. | |
| 1050 // (http://crbug.com/558929) | |
| 1051 bookmark_model()->SetURL(bookmark_node, kTestUrl2); | |
| 1052 PumpLoop(); | |
| 1053 EXPECT_EQ(0UL, GetAllPages().size()); | |
| 1054 } | |
| 1055 | |
| 1056 TEST_F(OfflinePageModelBookmarkChangeTest, RemoveBookmark) { | |
| 1057 // Creates a bookmark without offline copy. | |
| 1058 const bookmarks::BookmarkNode* bookmark_node = CreateBookmarkNode(kTestUrl2); | |
| 1059 EXPECT_EQ(0UL, GetAllPages().size()); | |
| 1060 | |
| 1061 // Removing the bookmark should have no effect. | |
| 1062 bookmark_model()->Remove(bookmark_node); | |
| 1063 PumpLoop(); | |
| 1064 EXPECT_EQ(0UL, GetAllPages().size()); | |
| 1065 | |
| 1066 // Creates a bookmark with offline copy. | |
| 1067 bookmark_node = CreateBookmarkNode(kTestUrl); | |
| 1068 ClientId client_id = | |
| 1069 ClientId(BOOKMARK_NAMESPACE, base::Int64ToString(bookmark_node->id())); | |
| 1070 SavePage(kTestUrl, client_id); | |
| 1071 EXPECT_EQ(1UL, GetAllPages().size()); | |
| 1072 | |
| 1073 // The offline copy should also be removed upon the bookmark removal. | |
| 1074 bookmark_model()->Remove(bookmark_node); | |
| 1075 PumpLoop(); | |
| 1076 EXPECT_EQ(client_id, last_deleted_client_id()); | |
| 1077 EXPECT_EQ(0UL, GetAllPages().size()); | |
| 1078 } | |
| 1079 | |
| 1080 TEST_F(OfflinePageModelBookmarkChangeTest, UndoBookmarkRemoval) { | |
| 1081 // Enables undo support. | |
| 1082 bookmark_model()->SetUndoDelegate(this); | |
| 1083 | |
| 1084 // Creates a bookmark without offline copy. | |
| 1085 const bookmarks::BookmarkNode* bookmark_node = CreateBookmarkNode(kTestUrl2); | |
| 1086 EXPECT_EQ(0UL, GetAllPages().size()); | |
| 1087 | |
| 1088 // Removing the bookmark and undoing the removal should have no effect. | |
| 1089 bookmark_model()->Remove(bookmark_node); | |
| 1090 PumpLoop(); | |
| 1091 UndoBookmarkRemoval(); | |
| 1092 PumpLoop(); | |
| 1093 EXPECT_EQ(0UL, GetAllPages().size()); | |
| 1094 | |
| 1095 // Creates a bookmark with offline copy. | |
| 1096 bookmark_node = CreateBookmarkNode(kTestUrl); | |
| 1097 SavePage(kTestUrl, ClientId(BOOKMARK_NAMESPACE, | |
| 1098 base::Int64ToString(bookmark_node->id()))); | |
| 1099 EXPECT_EQ(1UL, GetAllPages().size()); | |
| 1100 | |
| 1101 // The offline copy should also be removed upon the bookmark removal. | |
| 1102 bookmark_model()->Remove(bookmark_node); | |
| 1103 PumpLoop(); | |
| 1104 EXPECT_EQ(0UL, GetAllPages().size()); | |
| 1105 | |
| 1106 // The offline copy should be restored upon the bookmark restore. | |
| 1107 UndoBookmarkRemoval(); | |
| 1108 PumpLoop(); | |
| 1109 EXPECT_EQ(1UL, GetAllPages().size()); | |
| 1110 } | |
| 1111 | |
| 1112 TEST_F(OfflinePageModelTest, SaveRetrieveMultipleClientIds) { | |
| 1113 EXPECT_FALSE(HasPages(BOOKMARK_NAMESPACE)); | |
| 1114 SavePage(kTestUrl, kTestPageBookmarkId1); | |
| 1115 int64_t offline1 = last_save_offline_id(); | |
| 1116 EXPECT_TRUE(HasPages(BOOKMARK_NAMESPACE)); | |
| 1117 | |
| 1118 SavePage(kTestUrl, kTestPageBookmarkId1); | |
| 1119 int64_t offline2 = last_save_offline_id(); | 922 int64_t offline2 = last_save_offline_id(); |
| 1120 | 923 |
| 1121 EXPECT_NE(offline1, offline2); | 924 EXPECT_NE(offline1, offline2); |
| 1122 | 925 |
| 1123 const std::vector<int64_t> ids = | 926 const std::vector<int64_t> ids = |
| 1124 model()->GetOfflineIdsForClientId(kTestPageBookmarkId1); | 927 model()->GetOfflineIdsForClientId(kTestClientId1); |
| 1125 | 928 |
| 1126 EXPECT_EQ(2UL, ids.size()); | 929 EXPECT_EQ(2UL, ids.size()); |
| 1127 | 930 |
| 1128 std::set<int64_t> id_set; | 931 std::set<int64_t> id_set; |
| 1129 for (size_t i = 0; i < ids.size(); i++) { | 932 for (size_t i = 0; i < ids.size(); i++) { |
| 1130 id_set.insert(ids[i]); | 933 id_set.insert(ids[i]); |
| 1131 } | 934 } |
| 1132 | 935 |
| 1133 EXPECT_TRUE(id_set.find(offline1) != id_set.end()); | 936 EXPECT_TRUE(id_set.find(offline1) != id_set.end()); |
| 1134 EXPECT_TRUE(id_set.find(offline2) != id_set.end()); | 937 EXPECT_TRUE(id_set.find(offline2) != id_set.end()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1160 // Check if feature is correctly enabled by command-line flag. | 963 // Check if feature is correctly enabled by command-line flag. |
| 1161 base::FeatureList::ClearInstanceForTesting(); | 964 base::FeatureList::ClearInstanceForTesting(); |
| 1162 scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); | 965 scoped_ptr<base::FeatureList> feature_list(new base::FeatureList); |
| 1163 feature_list->InitializeFromCommandLine( | 966 feature_list->InitializeFromCommandLine( |
| 1164 offline_pages::kOfflinePagesBackgroundLoadingFeature.name, ""); | 967 offline_pages::kOfflinePagesBackgroundLoadingFeature.name, ""); |
| 1165 base::FeatureList::SetInstance(std::move(feature_list)); | 968 base::FeatureList::SetInstance(std::move(feature_list)); |
| 1166 EXPECT_TRUE(offline_pages::IsOfflinePagesBackgroundLoadingEnabled()); | 969 EXPECT_TRUE(offline_pages::IsOfflinePagesBackgroundLoadingEnabled()); |
| 1167 } | 970 } |
| 1168 | 971 |
| 1169 } // namespace offline_pages | 972 } // namespace offline_pages |
| OLD | NEW |