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