190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file. 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <string> 690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/files/file_path.h" 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/fake_free_disk_space_getter.h" 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chromeos/drive/file_system_util.h" 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/remove_stale_cache_files.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/resource_metadata.h" 1690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/test_util.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h" 1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace drive { 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace internal { 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class RemoveStaleCacheFilesTest : public testing::Test { 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected: 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void SetUp() OVERRIDE { 2790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fake_free_disk_space_getter_.reset(new FakeFreeDiskSpaceGetter); 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch metadata_storage_.reset(new ResourceMetadataStorage( 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch temp_dir_.path(), base::MessageLoopProxy::current().get())); 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch cache_.reset(new FileCache(metadata_storage_.get(), 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) temp_dir_.path(), 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::MessageLoopProxy::current().get(), 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) fake_free_disk_space_getter_.get())); 3890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) resource_metadata_.reset(new ResourceMetadata( 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) metadata_storage_.get(), cache_.get(), 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoopProxy::current())); 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(metadata_storage_->Initialize()); 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_TRUE(cache_->Initialize()); 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, resource_metadata_->Initialize()); 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::ScopedTempDir temp_dir_; 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<ResourceMetadataStorage, 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_util::DestroyHelperForTests> metadata_storage_; 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<FileCache, test_util::DestroyHelperForTests> cache_; 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<ResourceMetadata, test_util::DestroyHelperForTests> 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) resource_metadata_; 5690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<FakeFreeDiskSpaceGetter> fake_free_disk_space_getter_; 5790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(RemoveStaleCacheFilesTest, RemoveStaleCacheFiles) { 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath dummy_file; 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &dummy_file)); 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string md5_metadata("abcdef0123456789"), md5_cache("ABCDEF9876543210"); 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Create a stale cache file. 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ResourceEntry entry; 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string local_id; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) entry.mutable_file_specific_info()->set_md5(md5_metadata); 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) entry.set_parent_local_id(util::kDriveGrandRootLocalId); 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) entry.set_title("File.txt"); 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry(entry, &local_id)); 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cache_->Store(local_id, md5_cache, dummy_file, 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FileCache::FILE_OPERATION_COPY)); 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Remove stale cache files. 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) RemoveStaleCacheFiles(cache_.get(), resource_metadata_.get()); 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Verify that the cache is deleted. 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) resource_metadata_->GetResourceEntryById(local_id, &entry)); 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(entry.file_specific_info().cache_state().is_present()); 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(RemoveStaleCacheFilesTest, DirtyCacheFiles) { 867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::FilePath dummy_file; 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &dummy_file)); 887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Dirty entry. 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string md5_metadata("abcdef0123456789"); 917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ResourceEntry entry; 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string local_id; 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) entry.mutable_file_specific_info()->set_md5(md5_metadata); 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) entry.set_parent_local_id(util::kDriveGrandRootLocalId); 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) entry.set_title("file.txt"); 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, resource_metadata_->AddEntry(entry, &local_id)); 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cache_->Store(local_id, std::string(), dummy_file, 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FileCache::FILE_OPERATION_COPY)); 1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Remove stale cache files. 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch RemoveStaleCacheFiles(cache_.get(), resource_metadata_.get()); 1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Dirty cache should not be removed even though its MD5 doesn't match. 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) resource_metadata_->GetResourceEntryById(local_id, &entry)); 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(entry.file_specific_info().cache_state().is_present()); 1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 11290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace internal 11390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace drive 114