Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Unified Diff: chrome/browser/chromeos/drive/resource_metadata_storage_unittest.cc

Issue 1296483003: Move chrome/browser/chromeos/drive/resource* (+deps) into components/drive. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebasing... Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698