Index: chrome/browser/chromeos/drive/resource_metadata_storage_unittest.cc |
diff --git a/chrome/browser/chromeos/drive/resource_metadata_storage_unittest.cc b/chrome/browser/chromeos/drive/resource_metadata_storage_unittest.cc |
deleted file mode 100644 |
index e6b3860160d60b85e95c21db33c773482b0473d7..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/drive/resource_metadata_storage_unittest.cc |
+++ /dev/null |
@@ -1,633 +0,0 @@ |
-// Copyright 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/chromeos/drive/resource_metadata_storage.h" |
- |
-#include <algorithm> |
- |
-#include "base/files/file_util.h" |
-#include "base/files/scoped_temp_dir.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/strings/string_split.h" |
-#include "base/thread_task_runner_handle.h" |
-#include "components/drive/drive.pb.h" |
-#include "components/drive/drive_test_util.h" |
-#include "content/public/test/test_browser_thread_bundle.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/leveldatabase/src/include/leveldb/db.h" |
-#include "third_party/leveldatabase/src/include/leveldb/write_batch.h" |
- |
-namespace drive { |
-namespace internal { |
- |
-class ResourceMetadataStorageTest : public testing::Test { |
- protected: |
- void SetUp() override { |
- ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
- |
- storage_.reset(new ResourceMetadataStorage( |
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
- ASSERT_TRUE(storage_->Initialize()); |
- } |
- |
- // Overwrites |storage_|'s version. |
- void SetDBVersion(int version) { |
- ResourceMetadataHeader header; |
- ASSERT_EQ(FILE_ERROR_OK, storage_->GetHeader(&header)); |
- header.set_version(version); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutHeader(header)); |
- } |
- |
- bool CheckValidity() { |
- return storage_->CheckValidity(); |
- } |
- |
- leveldb::DB* resource_map() { return storage_->resource_map_.get(); } |
- |
- // Puts a child entry. |
- void PutChild(const std::string& parent_id, |
- const std::string& child_base_name, |
- const std::string& child_id) { |
- storage_->resource_map_->Put( |
- leveldb::WriteOptions(), |
- ResourceMetadataStorage::GetChildEntryKey(parent_id, child_base_name), |
- child_id); |
- } |
- |
- // Removes a child entry. |
- void RemoveChild(const std::string& parent_id, |
- const std::string& child_base_name) { |
- storage_->resource_map_->Delete( |
- leveldb::WriteOptions(), |
- ResourceMetadataStorage::GetChildEntryKey(parent_id, child_base_name)); |
- } |
- |
- content::TestBrowserThreadBundle thread_bundle_; |
- base::ScopedTempDir temp_dir_; |
- scoped_ptr<ResourceMetadataStorage, |
- test_util::DestroyHelperForTests> storage_; |
-}; |
- |
-TEST_F(ResourceMetadataStorageTest, LargestChangestamp) { |
- const int64 kLargestChangestamp = 1234567890; |
- EXPECT_EQ(FILE_ERROR_OK, |
- storage_->SetLargestChangestamp(kLargestChangestamp)); |
- int64 value = 0; |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetLargestChangestamp(&value)); |
- EXPECT_EQ(kLargestChangestamp, value); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, PutEntry) { |
- const std::string key1 = "abcdefg"; |
- const std::string key2 = "abcd"; |
- const std::string key3 = "efgh"; |
- const std::string name2 = "ABCD"; |
- const std::string name3 = "EFGH"; |
- |
- // key1 not found. |
- ResourceEntry result; |
- EXPECT_EQ(FILE_ERROR_NOT_FOUND, storage_->GetEntry(key1, &result)); |
- |
- // Put entry1. |
- ResourceEntry entry1; |
- entry1.set_local_id(key1); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry1)); |
- |
- // key1 found. |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(key1, &result)); |
- |
- // key2 not found. |
- EXPECT_EQ(FILE_ERROR_NOT_FOUND, storage_->GetEntry(key2, &result)); |
- |
- // Put entry2 as a child of entry1. |
- ResourceEntry entry2; |
- entry2.set_local_id(key2); |
- entry2.set_parent_local_id(key1); |
- entry2.set_base_name(name2); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry2)); |
- |
- // key2 found. |
- std::string child_id; |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(key2, &result)); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetChild(key1, name2, &child_id)); |
- EXPECT_EQ(key2, child_id); |
- |
- // Put entry3 as a child of entry2. |
- ResourceEntry entry3; |
- entry3.set_local_id(key3); |
- entry3.set_parent_local_id(key2); |
- entry3.set_base_name(name3); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry3)); |
- |
- // key3 found. |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(key3, &result)); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetChild(key2, name3, &child_id)); |
- EXPECT_EQ(key3, child_id); |
- |
- // Change entry3's parent to entry1. |
- entry3.set_parent_local_id(key1); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry3)); |
- |
- // entry3 is a child of entry1 now. |
- EXPECT_EQ(FILE_ERROR_NOT_FOUND, storage_->GetChild(key2, name3, &child_id)); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetChild(key1, name3, &child_id)); |
- EXPECT_EQ(key3, child_id); |
- |
- // Remove entries. |
- EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key3)); |
- EXPECT_EQ(FILE_ERROR_NOT_FOUND, storage_->GetEntry(key3, &result)); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key2)); |
- EXPECT_EQ(FILE_ERROR_NOT_FOUND, storage_->GetEntry(key2, &result)); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key1)); |
- EXPECT_EQ(FILE_ERROR_NOT_FOUND, storage_->GetEntry(key1, &result)); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, Iterator) { |
- // Prepare data. |
- std::vector<std::string> keys; |
- |
- keys.push_back("entry1"); |
- keys.push_back("entry2"); |
- keys.push_back("entry3"); |
- keys.push_back("entry4"); |
- |
- for (size_t i = 0; i < keys.size(); ++i) { |
- ResourceEntry entry; |
- entry.set_local_id(keys[i]); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
- } |
- |
- // Iterate and check the result. |
- std::map<std::string, ResourceEntry> found_entries; |
- scoped_ptr<ResourceMetadataStorage::Iterator> it = storage_->GetIterator(); |
- ASSERT_TRUE(it); |
- for (; !it->IsAtEnd(); it->Advance()) { |
- const ResourceEntry& entry = it->GetValue(); |
- found_entries[it->GetID()] = entry; |
- } |
- EXPECT_FALSE(it->HasError()); |
- |
- EXPECT_EQ(keys.size(), found_entries.size()); |
- for (size_t i = 0; i < keys.size(); ++i) |
- EXPECT_EQ(1U, found_entries.count(keys[i])); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, GetIdByResourceId) { |
- const std::string local_id = "local_id"; |
- const std::string resource_id = "resource_id"; |
- |
- // Resource ID to local ID mapping is not stored yet. |
- std::string id; |
- EXPECT_EQ(FILE_ERROR_NOT_FOUND, |
- storage_->GetIdByResourceId(resource_id, &id)); |
- |
- // Put an entry with the resource ID. |
- ResourceEntry entry; |
- entry.set_local_id(local_id); |
- entry.set_resource_id(resource_id); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
- |
- // Can get local ID by resource ID. |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id, &id)); |
- EXPECT_EQ(local_id, id); |
- |
- // Resource ID to local ID mapping is removed. |
- EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(local_id)); |
- EXPECT_EQ(FILE_ERROR_NOT_FOUND, |
- storage_->GetIdByResourceId(resource_id, &id)); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, GetChildren) { |
- const std::string parents_id[] = { "mercury", "venus", "mars", "jupiter", |
- "saturn" }; |
- std::vector<base::StringPairs> children_name_id(arraysize(parents_id)); |
- // Skip children_name_id[0/1] here because Mercury and Venus have no moon. |
- children_name_id[2].push_back(std::make_pair("phobos", "mars_i")); |
- children_name_id[2].push_back(std::make_pair("deimos", "mars_ii")); |
- children_name_id[3].push_back(std::make_pair("io", "jupiter_i")); |
- children_name_id[3].push_back(std::make_pair("europa", "jupiter_ii")); |
- children_name_id[3].push_back(std::make_pair("ganymede", "jupiter_iii")); |
- children_name_id[3].push_back(std::make_pair("calisto", "jupiter_iv")); |
- children_name_id[4].push_back(std::make_pair("mimas", "saturn_i")); |
- children_name_id[4].push_back(std::make_pair("enceladus", "saturn_ii")); |
- children_name_id[4].push_back(std::make_pair("tethys", "saturn_iii")); |
- children_name_id[4].push_back(std::make_pair("dione", "saturn_iv")); |
- children_name_id[4].push_back(std::make_pair("rhea", "saturn_v")); |
- children_name_id[4].push_back(std::make_pair("titan", "saturn_vi")); |
- children_name_id[4].push_back(std::make_pair("iapetus", "saturn_vii")); |
- |
- // Put parents. |
- for (size_t i = 0; i < arraysize(parents_id); ++i) { |
- ResourceEntry entry; |
- entry.set_local_id(parents_id[i]); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
- } |
- |
- // Put children. |
- for (size_t i = 0; i < children_name_id.size(); ++i) { |
- for (size_t j = 0; j < children_name_id[i].size(); ++j) { |
- ResourceEntry entry; |
- entry.set_local_id(children_name_id[i][j].second); |
- entry.set_parent_local_id(parents_id[i]); |
- entry.set_base_name(children_name_id[i][j].first); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
- } |
- } |
- |
- // Try to get children. |
- for (size_t i = 0; i < children_name_id.size(); ++i) { |
- std::vector<std::string> children; |
- storage_->GetChildren(parents_id[i], &children); |
- EXPECT_EQ(children_name_id[i].size(), children.size()); |
- for (size_t j = 0; j < children_name_id[i].size(); ++j) { |
- EXPECT_EQ(1, std::count(children.begin(), |
- children.end(), |
- children_name_id[i][j].second)); |
- } |
- } |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, OpenExistingDB) { |
- const std::string parent_id1 = "abcdefg"; |
- const std::string child_name1 = "WXYZABC"; |
- const std::string child_id1 = "qwerty"; |
- |
- ResourceEntry entry1; |
- entry1.set_local_id(parent_id1); |
- ResourceEntry entry2; |
- entry2.set_local_id(child_id1); |
- entry2.set_parent_local_id(parent_id1); |
- entry2.set_base_name(child_name1); |
- |
- // Put some data. |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry1)); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry2)); |
- |
- // Close DB and reopen. |
- storage_.reset(new ResourceMetadataStorage( |
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
- ASSERT_TRUE(storage_->Initialize()); |
- |
- // Can read data. |
- ResourceEntry result; |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(parent_id1, &result)); |
- |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(child_id1, &result)); |
- EXPECT_EQ(parent_id1, result.parent_local_id()); |
- EXPECT_EQ(child_name1, result.base_name()); |
- |
- std::string child_id; |
- EXPECT_EQ(FILE_ERROR_OK, |
- storage_->GetChild(parent_id1, child_name1, &child_id)); |
- EXPECT_EQ(child_id1, child_id); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, IncompatibleDB_M29) { |
- const int64 kLargestChangestamp = 1234567890; |
- const std::string title = "title"; |
- |
- // Construct M29 version DB. |
- SetDBVersion(6); |
- EXPECT_EQ(FILE_ERROR_OK, |
- storage_->SetLargestChangestamp(kLargestChangestamp)); |
- |
- leveldb::WriteBatch batch; |
- |
- // Put a file entry and its cache entry. |
- ResourceEntry entry; |
- std::string serialized_entry; |
- entry.set_title(title); |
- entry.set_resource_id("file:abcd"); |
- EXPECT_TRUE(entry.SerializeToString(&serialized_entry)); |
- batch.Put("file:abcd", serialized_entry); |
- |
- FileCacheEntry cache_entry; |
- EXPECT_TRUE(cache_entry.SerializeToString(&serialized_entry)); |
- batch.Put(std::string("file:abcd") + '\0' + "CACHE", serialized_entry); |
- |
- EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); |
- |
- // Upgrade and reopen. |
- storage_.reset(); |
- EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
- storage_.reset(new ResourceMetadataStorage( |
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
- ASSERT_TRUE(storage_->Initialize()); |
- |
- // Resource-ID-to-local-ID mapping is added. |
- std::string id; |
- EXPECT_EQ(FILE_ERROR_OK, |
- storage_->GetIdByResourceId("abcd", &id)); // "file:" is dropped. |
- |
- // Data is erased, except cache entries. |
- int64 largest_changestamp = 0; |
- EXPECT_EQ(FILE_ERROR_OK, |
- storage_->GetLargestChangestamp(&largest_changestamp)); |
- EXPECT_EQ(0, largest_changestamp); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); |
- EXPECT_TRUE(entry.title().empty()); |
- EXPECT_TRUE(entry.file_specific_info().has_cache_state()); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, IncompatibleDB_M32) { |
- const int64 kLargestChangestamp = 1234567890; |
- const std::string title = "title"; |
- const std::string resource_id = "abcd"; |
- const std::string local_id = "local-abcd"; |
- |
- // Construct M32 version DB. |
- SetDBVersion(11); |
- EXPECT_EQ(FILE_ERROR_OK, |
- storage_->SetLargestChangestamp(kLargestChangestamp)); |
- |
- leveldb::WriteBatch batch; |
- |
- // Put a file entry and its cache and id entry. |
- ResourceEntry entry; |
- std::string serialized_entry; |
- entry.set_title(title); |
- entry.set_local_id(local_id); |
- entry.set_resource_id(resource_id); |
- EXPECT_TRUE(entry.SerializeToString(&serialized_entry)); |
- batch.Put(local_id, serialized_entry); |
- |
- FileCacheEntry cache_entry; |
- EXPECT_TRUE(cache_entry.SerializeToString(&serialized_entry)); |
- batch.Put(local_id + '\0' + "CACHE", serialized_entry); |
- |
- batch.Put('\0' + std::string("ID") + '\0' + resource_id, local_id); |
- |
- EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); |
- |
- // Upgrade and reopen. |
- storage_.reset(); |
- EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
- storage_.reset(new ResourceMetadataStorage( |
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
- ASSERT_TRUE(storage_->Initialize()); |
- |
- // Data is erased, except cache and id mapping entries. |
- std::string id; |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id, &id)); |
- EXPECT_EQ(local_id, id); |
- int64 largest_changestamp = 0; |
- EXPECT_EQ(FILE_ERROR_OK, |
- storage_->GetLargestChangestamp(&largest_changestamp)); |
- EXPECT_EQ(0, largest_changestamp); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); |
- EXPECT_TRUE(entry.title().empty()); |
- EXPECT_TRUE(entry.file_specific_info().has_cache_state()); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, IncompatibleDB_M33) { |
- const int64 kLargestChangestamp = 1234567890; |
- const std::string title = "title"; |
- const std::string resource_id = "abcd"; |
- const std::string local_id = "local-abcd"; |
- const std::string md5 = "md5"; |
- const std::string resource_id2 = "efgh"; |
- const std::string local_id2 = "local-efgh"; |
- const std::string md5_2 = "md5_2"; |
- |
- // Construct M33 version DB. |
- SetDBVersion(12); |
- EXPECT_EQ(FILE_ERROR_OK, |
- storage_->SetLargestChangestamp(kLargestChangestamp)); |
- |
- leveldb::WriteBatch batch; |
- |
- // Put a file entry and its cache and id entry. |
- ResourceEntry entry; |
- std::string serialized_entry; |
- entry.set_title(title); |
- entry.set_local_id(local_id); |
- entry.set_resource_id(resource_id); |
- EXPECT_TRUE(entry.SerializeToString(&serialized_entry)); |
- batch.Put(local_id, serialized_entry); |
- |
- FileCacheEntry cache_entry; |
- cache_entry.set_md5(md5); |
- EXPECT_TRUE(cache_entry.SerializeToString(&serialized_entry)); |
- batch.Put(local_id + '\0' + "CACHE", serialized_entry); |
- |
- batch.Put('\0' + std::string("ID") + '\0' + resource_id, local_id); |
- |
- // Put another cache entry which is not accompanied by a ResourceEntry. |
- cache_entry.set_md5(md5_2); |
- EXPECT_TRUE(cache_entry.SerializeToString(&serialized_entry)); |
- batch.Put(local_id2 + '\0' + "CACHE", serialized_entry); |
- batch.Put('\0' + std::string("ID") + '\0' + resource_id2, local_id2); |
- |
- EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); |
- |
- // Upgrade and reopen. |
- storage_.reset(); |
- EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
- storage_.reset(new ResourceMetadataStorage( |
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
- ASSERT_TRUE(storage_->Initialize()); |
- |
- // No data is lost. |
- int64 largest_changestamp = 0; |
- EXPECT_EQ(FILE_ERROR_OK, |
- storage_->GetLargestChangestamp(&largest_changestamp)); |
- EXPECT_EQ(kLargestChangestamp, largest_changestamp); |
- |
- std::string id; |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id, &id)); |
- EXPECT_EQ(local_id, id); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); |
- EXPECT_EQ(title, entry.title()); |
- EXPECT_EQ(md5, entry.file_specific_info().cache_state().md5()); |
- |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId(resource_id2, &id)); |
- EXPECT_EQ(local_id2, id); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetEntry(id, &entry)); |
- EXPECT_EQ(md5_2, entry.file_specific_info().cache_state().md5()); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, IncompatibleDB_Unknown) { |
- const int64 kLargestChangestamp = 1234567890; |
- const std::string key1 = "abcd"; |
- |
- // Put some data. |
- EXPECT_EQ(FILE_ERROR_OK, |
- storage_->SetLargestChangestamp(kLargestChangestamp)); |
- ResourceEntry entry; |
- entry.set_local_id(key1); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
- |
- // Set newer version, upgrade and reopen DB. |
- SetDBVersion(ResourceMetadataStorage::kDBVersion + 1); |
- storage_.reset(); |
- EXPECT_FALSE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
- storage_.reset(new ResourceMetadataStorage( |
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
- ASSERT_TRUE(storage_->Initialize()); |
- |
- // Data is erased because of the incompatible version. |
- int64 largest_changestamp = 0; |
- EXPECT_EQ(FILE_ERROR_OK, |
- storage_->GetLargestChangestamp(&largest_changestamp)); |
- EXPECT_EQ(0, largest_changestamp); |
- EXPECT_EQ(FILE_ERROR_NOT_FOUND, storage_->GetEntry(key1, &entry)); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, DeleteUnusedIDEntries) { |
- leveldb::WriteBatch batch; |
- |
- // Put an ID entry with a corresponding ResourceEntry. |
- ResourceEntry entry; |
- entry.set_local_id("id1"); |
- entry.set_resource_id("resource_id1"); |
- |
- std::string serialized_entry; |
- EXPECT_TRUE(entry.SerializeToString(&serialized_entry)); |
- batch.Put("id1", serialized_entry); |
- batch.Put('\0' + std::string("ID") + '\0' + "resource_id1", "id1"); |
- |
- // Put an ID entry without any corresponding entries. |
- batch.Put('\0' + std::string("ID") + '\0' + "resource_id2", "id3"); |
- |
- EXPECT_TRUE(resource_map()->Write(leveldb::WriteOptions(), &batch).ok()); |
- |
- // Upgrade and reopen. |
- storage_.reset(); |
- EXPECT_TRUE(ResourceMetadataStorage::UpgradeOldDB(temp_dir_.path())); |
- storage_.reset(new ResourceMetadataStorage( |
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
- ASSERT_TRUE(storage_->Initialize()); |
- |
- // Only the unused entry is deleted. |
- std::string id; |
- EXPECT_EQ(FILE_ERROR_OK, storage_->GetIdByResourceId("resource_id1", &id)); |
- EXPECT_EQ("id1", id); |
- EXPECT_EQ(FILE_ERROR_NOT_FOUND, |
- storage_->GetIdByResourceId("resource_id2", &id)); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, WrongPath) { |
- // Create a file. |
- base::FilePath path; |
- ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &path)); |
- |
- storage_.reset(new ResourceMetadataStorage( |
- path, base::ThreadTaskRunnerHandle::Get().get())); |
- // Cannot initialize DB beacause the path does not point a directory. |
- ASSERT_FALSE(storage_->Initialize()); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, RecoverCacheEntriesFromTrashedResourceMap) { |
- // Put entry with id_foo. |
- ResourceEntry entry; |
- entry.set_local_id("id_foo"); |
- entry.set_base_name("foo"); |
- entry.set_title("foo"); |
- entry.mutable_file_specific_info()->mutable_cache_state()->set_md5("md5_foo"); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
- |
- // Put entry with id_bar as a id_foo's child. |
- entry.set_local_id("id_bar"); |
- entry.set_parent_local_id("id_foo"); |
- entry.set_base_name("bar"); |
- entry.set_title("bar"); |
- entry.mutable_file_specific_info()->mutable_cache_state()->set_md5("md5_bar"); |
- entry.mutable_file_specific_info()->mutable_cache_state()->set_is_dirty(true); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
- |
- // Remove parent-child relationship to make the DB invalid. |
- RemoveChild("id_foo", "bar"); |
- EXPECT_FALSE(CheckValidity()); |
- |
- // Reopen. This should result in trashing the DB. |
- storage_.reset(new ResourceMetadataStorage( |
- temp_dir_.path(), base::ThreadTaskRunnerHandle::Get().get())); |
- ASSERT_TRUE(storage_->Initialize()); |
- |
- // Recover cache entries from the trashed DB. |
- ResourceMetadataStorage::RecoveredCacheInfoMap recovered_cache_info; |
- storage_->RecoverCacheInfoFromTrashedResourceMap(&recovered_cache_info); |
- EXPECT_EQ(2U, recovered_cache_info.size()); |
- EXPECT_FALSE(recovered_cache_info["id_foo"].is_dirty); |
- EXPECT_EQ("md5_foo", recovered_cache_info["id_foo"].md5); |
- EXPECT_EQ("foo", recovered_cache_info["id_foo"].title); |
- EXPECT_TRUE(recovered_cache_info["id_bar"].is_dirty); |
- EXPECT_EQ("md5_bar", recovered_cache_info["id_bar"].md5); |
- EXPECT_EQ("bar", recovered_cache_info["id_bar"].title); |
-} |
- |
-TEST_F(ResourceMetadataStorageTest, CheckValidity) { |
- const std::string key1 = "foo"; |
- const std::string name1 = "hoge"; |
- const std::string key2 = "bar"; |
- const std::string name2 = "fuga"; |
- const std::string key3 = "boo"; |
- const std::string name3 = "piyo"; |
- |
- // Empty storage is valid. |
- EXPECT_TRUE(CheckValidity()); |
- |
- // Put entry with key1. |
- ResourceEntry entry; |
- entry.set_local_id(key1); |
- entry.set_base_name(name1); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
- EXPECT_TRUE(CheckValidity()); |
- |
- // Put entry with key2 under key1. |
- entry.set_local_id(key2); |
- entry.set_parent_local_id(key1); |
- entry.set_base_name(name2); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
- EXPECT_TRUE(CheckValidity()); |
- |
- RemoveChild(key1, name2); |
- EXPECT_FALSE(CheckValidity()); // Missing parent-child relationship. |
- |
- // Add back parent-child relationship between key1 and key2. |
- PutChild(key1, name2, key2); |
- EXPECT_TRUE(CheckValidity()); |
- |
- // Add parent-child relationship between key2 and key3. |
- PutChild(key2, name3, key3); |
- EXPECT_FALSE(CheckValidity()); // key3 is not stored in the storage. |
- |
- // Put entry with key3 under key2. |
- entry.set_local_id(key3); |
- entry.set_parent_local_id(key2); |
- entry.set_base_name(name3); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->PutEntry(entry)); |
- EXPECT_TRUE(CheckValidity()); |
- |
- // Parent-child relationship with wrong name. |
- RemoveChild(key2, name3); |
- EXPECT_FALSE(CheckValidity()); |
- PutChild(key2, name2, key3); |
- EXPECT_FALSE(CheckValidity()); |
- |
- // Fix up the relationship between key2 and key3. |
- RemoveChild(key2, name2); |
- EXPECT_FALSE(CheckValidity()); |
- PutChild(key2, name3, key3); |
- EXPECT_TRUE(CheckValidity()); |
- |
- // Remove key2. |
- RemoveChild(key1, name2); |
- EXPECT_FALSE(CheckValidity()); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key2)); |
- EXPECT_FALSE(CheckValidity()); |
- |
- // Remove key3. |
- RemoveChild(key2, name3); |
- EXPECT_FALSE(CheckValidity()); |
- EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key3)); |
- EXPECT_TRUE(CheckValidity()); |
- |
- // Remove key1. |
- EXPECT_EQ(FILE_ERROR_OK, storage_->RemoveEntry(key1)); |
- EXPECT_TRUE(CheckValidity()); |
-} |
- |
-} // namespace internal |
-} // namespace drive |