Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <errno.h> | 5 #include <errno.h> |
| 6 #include <string> | 6 #include <string> |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 408 | 408 |
| 409 FilePath GetCacheFilePath(const std::string& resource_id, | 409 FilePath GetCacheFilePath(const std::string& resource_id, |
| 410 const std::string& md5, | 410 const std::string& md5, |
| 411 GDataCache::CacheSubDirectoryType sub_dir_type, | 411 GDataCache::CacheSubDirectoryType sub_dir_type, |
| 412 GDataCache::CachedFileOrigin file_origin) { | 412 GDataCache::CachedFileOrigin file_origin) { |
| 413 return cache_->GetCacheFilePath(resource_id, md5, sub_dir_type, | 413 return cache_->GetCacheFilePath(resource_id, md5, sub_dir_type, |
| 414 file_origin); | 414 file_origin); |
| 415 } | 415 } |
| 416 | 416 |
| 417 // Helper function to call GetCacheEntry from origin thread. | 417 // Helper function to call GetCacheEntry from origin thread. |
| 418 scoped_ptr<GDataCache::CacheEntry> GetCacheEntryFromOriginThread( | 418 bool GetCacheEntryFromOriginThread(const std::string& resource_id, |
| 419 const std::string& resource_id, | 419 const std::string& md5, |
| 420 const std::string& md5) { | 420 GDataCache::CacheEntry* cache_entry) { |
| 421 scoped_ptr<GDataCache::CacheEntry> cache_entry; | 421 bool result = false; |
| 422 content::BrowserThread::GetBlockingPool() | 422 content::BrowserThread::GetBlockingPool() |
| 423 ->GetSequencedTaskRunner(sequence_token_)->PostTask( | 423 ->GetSequencedTaskRunner(sequence_token_)->PostTask( |
| 424 FROM_HERE, | 424 FROM_HERE, |
| 425 base::Bind( | 425 base::Bind( |
| 426 &GDataFileSystemTest::GetCacheEntryFromOriginThreadInternal, | 426 &GDataFileSystemTest::GetCacheEntryFromOriginThreadInternal, |
| 427 base::Unretained(this), | 427 base::Unretained(this), |
| 428 resource_id, | 428 resource_id, |
| 429 md5, | 429 md5, |
| 430 &cache_entry)); | 430 cache_entry, |
| 431 &result)); | |
| 431 test_util::RunBlockingPoolTask(); | 432 test_util::RunBlockingPoolTask(); |
| 432 return cache_entry.Pass(); | 433 return result; |
| 433 } | 434 } |
| 434 | 435 |
| 435 // Used to implement GetCacheEntry. | 436 // Used to implement GetCacheEntry. |
| 436 void GetCacheEntryFromOriginThreadInternal( | 437 void GetCacheEntryFromOriginThreadInternal( |
| 437 const std::string& resource_id, | 438 const std::string& resource_id, |
| 438 const std::string& md5, | 439 const std::string& md5, |
| 439 scoped_ptr<GDataCache::CacheEntry>* cache_entry) { | 440 GDataCache::CacheEntry* cache_entry, |
| 440 cache_entry->reset(cache_->GetCacheEntry(resource_id, md5).release()); | 441 bool* result) { |
| 442 *result = cache_->GetCacheEntry(resource_id, md5, cache_entry); | |
| 441 } | 443 } |
| 442 | 444 |
| 443 // Returns true if the cache entry exists for the given resource ID and MD5. | 445 // Returns true if the cache entry exists for the given resource ID and MD5. |
| 444 bool CacheEntryExists(const std::string& resource_id, | 446 bool CacheEntryExists(const std::string& resource_id, |
| 445 const std::string& md5) { | 447 const std::string& md5) { |
| 446 return GetCacheEntryFromOriginThread(resource_id, md5).get(); | 448 GDataCache::CacheEntry cache_entry; |
| 449 return GetCacheEntryFromOriginThread(resource_id, md5, &cache_entry); | |
| 447 } | 450 } |
| 448 | 451 |
| 449 // Returns true if the cache file exists for the given resource ID and MD5. | 452 // Returns true if the cache file exists for the given resource ID and MD5. |
| 450 bool CacheFileExists(const std::string& resource_id, | 453 bool CacheFileExists(const std::string& resource_id, |
| 451 const std::string& md5) { | 454 const std::string& md5) { |
| 452 const FilePath file_path = cache_->GetCacheFilePath( | 455 const FilePath file_path = cache_->GetCacheFilePath( |
| 453 resource_id, | 456 resource_id, |
| 454 md5, | 457 md5, |
| 455 GDataCache::CACHE_TYPE_TMP, | 458 GDataCache::CACHE_TYPE_TMP, |
| 456 GDataCache::CACHED_FILE_FROM_SERVER); | 459 GDataCache::CACHED_FILE_FROM_SERVER); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 470 | 473 |
| 471 cache_->StoreOnUIThread( | 474 cache_->StoreOnUIThread( |
| 472 resource_id, md5, source_path, | 475 resource_id, md5, source_path, |
| 473 GDataCache::FILE_OPERATION_COPY, | 476 GDataCache::FILE_OPERATION_COPY, |
| 474 base::Bind(&GDataFileSystemTest::VerifyCacheFileState, | 477 base::Bind(&GDataFileSystemTest::VerifyCacheFileState, |
| 475 base::Unretained(this))); | 478 base::Unretained(this))); |
| 476 | 479 |
| 477 test_util::RunBlockingPoolTask(); | 480 test_util::RunBlockingPoolTask(); |
| 478 } | 481 } |
| 479 | 482 |
| 480 void TestRemoveFromCache(const std::string& resource_id, | |
|
achuithb
2012/07/11 19:09:59
Did this code move elsewhere or is it not needed a
hashimoto
2012/07/12 05:15:19
Sorry for missing description.
The tests which wer
satorux1
2012/07/12 07:58:46
Thank you for removing this! BTW, you could've rem
| |
| 481 base::PlatformFileError expected_error) { | |
| 482 expected_error_ = expected_error; | |
| 483 | |
| 484 cache_->RemoveOnUIThread( | |
| 485 resource_id, | |
| 486 base::Bind(&GDataFileSystemTest::VerifyRemoveFromCache, | |
| 487 base::Unretained(this))); | |
| 488 | |
| 489 test_util::RunBlockingPoolTask(); | |
| 490 } | |
| 491 | |
| 492 void VerifyRemoveFromCache(base::PlatformFileError error, | |
| 493 const std::string& resource_id, | |
| 494 const std::string& md5) { | |
| 495 ++num_callback_invocations_; | |
| 496 | |
| 497 EXPECT_EQ(expected_error_, error); | |
| 498 | |
| 499 // Verify cache map. | |
| 500 scoped_ptr<GDataCache::CacheEntry> cache_entry = | |
| 501 GetCacheEntryFromOriginThread(resource_id, md5); | |
| 502 if (cache_entry.get()) | |
| 503 EXPECT_TRUE(cache_entry->IsDirty()); | |
| 504 | |
| 505 // If entry doesn't exist, verify that: | |
| 506 // - no files with "<resource_id>.* exists in persistent and tmp dirs | |
| 507 // - no "<resource_id>" symlink exists in pinned and outgoing dirs. | |
| 508 std::vector<PathToVerify> paths_to_verify; | |
| 509 paths_to_verify.push_back( // Index 0: CACHE_TYPE_TMP. | |
| 510 PathToVerify(cache_->GetCacheFilePath(resource_id, "*", | |
| 511 GDataCache::CACHE_TYPE_TMP, | |
| 512 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); | |
| 513 paths_to_verify.push_back( // Index 1: CACHE_TYPE_PERSISTENT. | |
| 514 PathToVerify(cache_->GetCacheFilePath(resource_id, "*", | |
| 515 GDataCache::CACHE_TYPE_PERSISTENT, | |
| 516 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); | |
| 517 paths_to_verify.push_back( // Index 2: CACHE_TYPE_PINNED. | |
| 518 PathToVerify(cache_->GetCacheFilePath(resource_id, "", | |
| 519 GDataCache::CACHE_TYPE_PINNED, | |
| 520 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); | |
| 521 paths_to_verify.push_back( // Index 3: CACHE_TYPE_OUTGOING. | |
| 522 PathToVerify(cache_->GetCacheFilePath(resource_id, "", | |
| 523 GDataCache::CACHE_TYPE_OUTGOING, | |
| 524 GDataCache::CACHED_FILE_FROM_SERVER), FilePath())); | |
| 525 if (!cache_entry.get()) { | |
| 526 for (size_t i = 0; i < paths_to_verify.size(); ++i) { | |
| 527 file_util::FileEnumerator enumerator( | |
| 528 paths_to_verify[i].path_to_scan.DirName(), false /* not recursive*/, | |
| 529 static_cast<file_util::FileEnumerator::FileType>( | |
| 530 file_util::FileEnumerator::FILES | | |
| 531 file_util::FileEnumerator::SHOW_SYM_LINKS), | |
| 532 paths_to_verify[i].path_to_scan.BaseName().value()); | |
| 533 EXPECT_TRUE(enumerator.Next().empty()); | |
| 534 } | |
| 535 } else { | |
| 536 // Entry is dirty, verify that: | |
| 537 // - no files with "<resource_id>.*" exist in tmp dir | |
| 538 // - only 1 "<resource_id>.local" exists in persistent dir | |
| 539 // - only 1 <resource_id> exists in outgoing dir | |
| 540 // - if entry is pinned, only 1 <resource_id> exists in pinned dir. | |
| 541 | |
| 542 // Change expected_existing_path of CACHE_TYPE_PERSISTENT (index 1). | |
| 543 paths_to_verify[1].expected_existing_path = | |
| 544 GetCacheFilePath(resource_id, | |
| 545 std::string(), | |
| 546 GDataCache::CACHE_TYPE_PERSISTENT, | |
| 547 GDataCache::CACHED_FILE_LOCALLY_MODIFIED); | |
| 548 | |
| 549 // Change expected_existing_path of CACHE_TYPE_OUTGOING (index 3). | |
| 550 paths_to_verify[3].expected_existing_path = | |
| 551 GetCacheFilePath(resource_id, | |
| 552 std::string(), | |
| 553 GDataCache::CACHE_TYPE_OUTGOING, | |
| 554 GDataCache::CACHED_FILE_FROM_SERVER); | |
| 555 | |
| 556 if (cache_entry->IsPinned()) { | |
| 557 // Change expected_existing_path of CACHE_TYPE_PINNED (index 2). | |
| 558 paths_to_verify[2].expected_existing_path = | |
| 559 GetCacheFilePath(resource_id, | |
| 560 std::string(), | |
| 561 GDataCache::CACHE_TYPE_PINNED, | |
| 562 GDataCache::CACHED_FILE_FROM_SERVER); | |
| 563 } | |
| 564 | |
| 565 for (size_t i = 0; i < paths_to_verify.size(); ++i) { | |
| 566 const struct PathToVerify& verify = paths_to_verify[i]; | |
| 567 file_util::FileEnumerator enumerator( | |
| 568 verify.path_to_scan.DirName(), false /* not recursive*/, | |
| 569 static_cast<file_util::FileEnumerator::FileType>( | |
| 570 file_util::FileEnumerator::FILES | | |
| 571 file_util::FileEnumerator::SHOW_SYM_LINKS), | |
| 572 verify.path_to_scan.BaseName().value()); | |
| 573 size_t num_files_found = 0; | |
| 574 for (FilePath current = enumerator.Next(); !current.empty(); | |
| 575 current = enumerator.Next()) { | |
| 576 ++num_files_found; | |
| 577 EXPECT_EQ(verify.expected_existing_path, current); | |
| 578 } | |
| 579 if (verify.expected_existing_path.empty()) | |
| 580 EXPECT_EQ(0U, num_files_found); | |
| 581 else | |
| 582 EXPECT_EQ(1U, num_files_found); | |
| 583 } | |
| 584 } | |
| 585 } | |
| 586 | |
| 587 void TestPin( | 483 void TestPin( |
| 588 const std::string& resource_id, | 484 const std::string& resource_id, |
| 589 const std::string& md5, | 485 const std::string& md5, |
| 590 base::PlatformFileError expected_error, | 486 base::PlatformFileError expected_error, |
| 591 int expected_cache_state, | 487 int expected_cache_state, |
| 592 GDataCache::CacheSubDirectoryType expected_sub_dir_type) { | 488 GDataCache::CacheSubDirectoryType expected_sub_dir_type) { |
| 593 expected_error_ = expected_error; | 489 expected_error_ = expected_error; |
| 594 expected_cache_state_ = expected_cache_state; | 490 expected_cache_state_ = expected_cache_state; |
| 595 expected_sub_dir_type_ = expected_sub_dir_type; | 491 expected_sub_dir_type_ = expected_sub_dir_type; |
| 596 | 492 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 690 } | 586 } |
| 691 | 587 |
| 692 void VerifyCacheFileState(base::PlatformFileError error, | 588 void VerifyCacheFileState(base::PlatformFileError error, |
| 693 const std::string& resource_id, | 589 const std::string& resource_id, |
| 694 const std::string& md5) { | 590 const std::string& md5) { |
| 695 ++num_callback_invocations_; | 591 ++num_callback_invocations_; |
| 696 | 592 |
| 697 EXPECT_EQ(expected_error_, error); | 593 EXPECT_EQ(expected_error_, error); |
| 698 | 594 |
| 699 // Verify cache map. | 595 // Verify cache map. |
| 700 scoped_ptr<GDataCache::CacheEntry> cache_entry = | 596 GDataCache::CacheEntry cache_entry; |
| 701 GetCacheEntryFromOriginThread(resource_id, md5); | 597 const bool cache_entry_found = |
| 598 GetCacheEntryFromOriginThread(resource_id, md5, &cache_entry); | |
| 702 if (GDataCache::IsCachePresent(expected_cache_state_) || | 599 if (GDataCache::IsCachePresent(expected_cache_state_) || |
| 703 GDataCache::IsCachePinned(expected_cache_state_)) { | 600 GDataCache::IsCachePinned(expected_cache_state_)) { |
| 704 ASSERT_TRUE(cache_entry.get()); | 601 ASSERT_TRUE(cache_entry_found); |
| 705 EXPECT_EQ(expected_cache_state_, cache_entry->cache_state); | 602 EXPECT_EQ(expected_cache_state_, cache_entry.cache_state); |
| 706 EXPECT_EQ(expected_sub_dir_type_, cache_entry->GetSubDirectoryType()); | 603 EXPECT_EQ(expected_sub_dir_type_, cache_entry.GetSubDirectoryType()); |
| 707 } else { | 604 } else { |
| 708 EXPECT_FALSE(cache_entry.get()); | 605 EXPECT_FALSE(cache_entry_found); |
| 709 } | 606 } |
| 710 | 607 |
| 711 // Verify actual cache file. | 608 // Verify actual cache file. |
| 712 FilePath dest_path = cache_->GetCacheFilePath( | 609 FilePath dest_path = cache_->GetCacheFilePath( |
| 713 resource_id, | 610 resource_id, |
| 714 md5, | 611 md5, |
| 715 GDataCache::IsCachePinned(expected_cache_state_) || | 612 GDataCache::IsCachePinned(expected_cache_state_) || |
| 716 GDataCache::IsCacheDirty(expected_cache_state_) ? | 613 GDataCache::IsCacheDirty(expected_cache_state_) ? |
| 717 GDataCache::CACHE_TYPE_PERSISTENT : | 614 GDataCache::CACHE_TYPE_PERSISTENT : |
| 718 GDataCache::CACHE_TYPE_TMP, | 615 GDataCache::CACHE_TYPE_TMP, |
| (...skipping 1907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2626 | 2523 |
| 2627 // Try to close the same file twice. | 2524 // Try to close the same file twice. |
| 2628 file_system_->CloseFile(kFileInRoot, close_file_callback); | 2525 file_system_->CloseFile(kFileInRoot, close_file_callback); |
| 2629 message_loop_.Run(); | 2526 message_loop_.Run(); |
| 2630 | 2527 |
| 2631 // It must fail. | 2528 // It must fail. |
| 2632 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, callback_helper_->last_error_); | 2529 EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, callback_helper_->last_error_); |
| 2633 } | 2530 } |
| 2634 | 2531 |
| 2635 } // namespace gdata | 2532 } // namespace gdata |
| OLD | NEW |