blob: e90b52f62d9844f0466d88bbd4df5c8814b511be [file] [log] [blame]
// Copyright 2014 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/sync_file_system/drive_backend/metadata_database_index_on_disk.h"
#include <algorithm>
#include "base/files/scoped_temp_dir.h"
#include "base/strings/string_number_conversions.h"
#include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h"
#include "chrome/browser/sync_file_system/drive_backend/drive_backend_test_util.h"
#include "chrome/browser/sync_file_system/drive_backend/drive_backend_util.h"
#include "chrome/browser/sync_file_system/drive_backend/leveldb_wrapper.h"
#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/leveldatabase/src/helpers/memenv/memenv.h"
#include "third_party/leveldatabase/src/include/leveldb/db.h"
#include "third_party/leveldatabase/src/include/leveldb/env.h"
#include "third_party/leveldatabase/src/include/leveldb/status.h"
namespace sync_file_system {
namespace drive_backend {
namespace {
const int64 kSyncRootTrackerID = 1;
const int64 kAppRootTrackerID = 2;
const int64 kFileTrackerID = 3;
const int64 kPlaceholderTrackerID = 4;
} // namespace
class MetadataDatabaseIndexOnDiskTest : public testing::Test {
public:
~MetadataDatabaseIndexOnDiskTest() override {}
void SetUp() override {
ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default()));
db_ = InitializeLevelDB();
index_ = MetadataDatabaseIndexOnDisk::Create(db_.get());
}
void TearDown() override {
index_.reset();
db_.reset();
in_memory_env_.reset();
}
void CreateTestDatabase(bool build_index, LevelDBWrapper* db) {
if (!db) {
DCHECK(index());
db = index()->GetDBForTesting();
}
DCHECK(db);
scoped_ptr<FileMetadata> sync_root_metadata =
test_util::CreateFolderMetadata("sync_root_folder_id",
"Chrome Syncable FileSystem");
scoped_ptr<FileTracker> sync_root_tracker =
test_util::CreateTracker(*sync_root_metadata, kSyncRootTrackerID,
nullptr);
scoped_ptr<FileMetadata> app_root_metadata =
test_util::CreateFolderMetadata("app_root_folder_id", "app_title");
scoped_ptr<FileTracker> app_root_tracker =
test_util::CreateTracker(*app_root_metadata, kAppRootTrackerID,
sync_root_tracker.get());
app_root_tracker->set_app_id("app_id");
app_root_tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT);
scoped_ptr<FileMetadata> file_metadata =
test_util::CreateFileMetadata("file_id", "file", "file_md5");
scoped_ptr<FileTracker> file_tracker =
test_util::CreateTracker(*file_metadata,
kFileTrackerID,
app_root_tracker.get());
scoped_ptr<FileTracker> placeholder_tracker =
test_util::CreatePlaceholderTracker("unsynced_file_id",
kPlaceholderTrackerID,
app_root_tracker.get());
scoped_ptr<ServiceMetadata> service_metadata =
InitializeServiceMetadata(db);
service_metadata->set_sync_root_tracker_id(kSyncRootTrackerID);
PutServiceMetadataToDB(*service_metadata, db);
if (build_index) {
DCHECK(index());
index()->StoreFileMetadata(sync_root_metadata.Pass());
index()->StoreFileTracker(sync_root_tracker.Pass());
index()->StoreFileMetadata(app_root_metadata.Pass());
index()->StoreFileTracker(app_root_tracker.Pass());
index()->StoreFileMetadata(file_metadata.Pass());
index()->StoreFileTracker(file_tracker.Pass());
index()->StoreFileTracker(placeholder_tracker.Pass());
} else {
PutFileMetadataToDB(*sync_root_metadata, db);
PutFileTrackerToDB(*sync_root_tracker, db);
PutFileMetadataToDB(*app_root_metadata, db);
PutFileTrackerToDB(*app_root_tracker, db);
PutFileMetadataToDB(*file_metadata, db);
PutFileTrackerToDB(*file_tracker, db);
PutFileTrackerToDB(*placeholder_tracker, db);
}
ASSERT_TRUE(db->Commit().ok());
}
MetadataDatabaseIndexOnDisk* index() { return index_.get(); }
void WriteToDB() {
ASSERT_TRUE(db_->Commit().ok());
}
scoped_ptr<LevelDBWrapper> InitializeLevelDB() {
leveldb::DB* db = nullptr;
leveldb::Options options;
options.create_if_missing = true;
options.max_open_files = 0; // Use minimum.
options.env = in_memory_env_.get();
leveldb::Status status =
leveldb::DB::Open(options, database_dir_.path().AsUTF8Unsafe(), &db);
EXPECT_TRUE(status.ok());
return make_scoped_ptr(new LevelDBWrapper(make_scoped_ptr(db)));
}
private:
scoped_ptr<MetadataDatabaseIndexOnDisk> index_;
base::ScopedTempDir database_dir_;
scoped_ptr<leveldb::Env> in_memory_env_;
scoped_ptr<LevelDBWrapper> db_;
};
TEST_F(MetadataDatabaseIndexOnDiskTest, GetEntryTest) {
CreateTestDatabase(false, nullptr);
FileTracker tracker;
EXPECT_FALSE(index()->GetFileTracker(kInvalidTrackerID, nullptr));
ASSERT_TRUE(index()->GetFileTracker(kFileTrackerID, &tracker));
EXPECT_EQ(kFileTrackerID, tracker.tracker_id());
EXPECT_EQ("file_id", tracker.file_id());
FileMetadata metadata;
EXPECT_FALSE(index()->GetFileMetadata(std::string(), nullptr));
ASSERT_TRUE(index()->GetFileMetadata("file_id", &metadata));
EXPECT_EQ("file_id", metadata.file_id());
}
TEST_F(MetadataDatabaseIndexOnDiskTest, SetEntryTest) {
CreateTestDatabase(false, nullptr);
const int64 tracker_id = 10;
scoped_ptr<FileMetadata> metadata =
test_util::CreateFileMetadata("test_file_id", "test_title", "test_md5");
FileTracker root_tracker;
EXPECT_TRUE(index()->GetFileTracker(kSyncRootTrackerID, &root_tracker));
scoped_ptr<FileTracker> tracker =
test_util::CreateTracker(*metadata, tracker_id, &root_tracker);
index()->StoreFileMetadata(metadata.Pass());
index()->StoreFileTracker(tracker.Pass());
EXPECT_TRUE(index()->GetFileMetadata("test_file_id", nullptr));
EXPECT_TRUE(index()->GetFileTracker(tracker_id, nullptr));
WriteToDB();
metadata.reset(new FileMetadata);
ASSERT_TRUE(index()->GetFileMetadata("test_file_id", metadata.get()));
EXPECT_TRUE(metadata->has_details());
EXPECT_EQ("test_title", metadata->details().title());
tracker.reset(new FileTracker);
ASSERT_TRUE(index()->GetFileTracker(tracker_id, tracker.get()));
EXPECT_EQ("test_file_id", tracker->file_id());
// Test if removers work.
index()->RemoveFileMetadata("test_file_id");
index()->RemoveFileTracker(tracker_id);
EXPECT_FALSE(index()->GetFileMetadata("test_file_id", nullptr));
EXPECT_FALSE(index()->GetFileTracker(tracker_id, nullptr));
WriteToDB();
EXPECT_FALSE(index()->GetFileMetadata("test_file_id", nullptr));
EXPECT_FALSE(index()->GetFileTracker(tracker_id, nullptr));
}
TEST_F(MetadataDatabaseIndexOnDiskTest, RemoveUnreachableItemsTest) {
scoped_ptr<LevelDBWrapper> db = InitializeLevelDB();
CreateTestDatabase(false, db.get());
const int kOrphanedFileTrackerID = 13;
scoped_ptr<FileMetadata> orphaned_metadata =
test_util::CreateFileMetadata("orphaned_id", "orphaned", "md5");
scoped_ptr<FileTracker> orphaned_tracker =
test_util::CreateTracker(*orphaned_metadata,
kOrphanedFileTrackerID,
nullptr);
PutFileMetadataToDB(*orphaned_metadata, db.get());
PutFileTrackerToDB(*orphaned_tracker, db.get());
EXPECT_TRUE(db->Commit().ok());
const std::string key =
kFileTrackerKeyPrefix + base::Int64ToString(kOrphanedFileTrackerID);
std::string value;
EXPECT_TRUE(db->Get(key, &value).ok());
// RemoveUnreachableItems() is expected to run on index creation.
scoped_ptr<MetadataDatabaseIndexOnDisk> index_on_disk =
MetadataDatabaseIndexOnDisk::Create(db.get());
EXPECT_TRUE(db->Commit().ok());
EXPECT_TRUE(db->Get(key, &value).IsNotFound());
EXPECT_FALSE(index_on_disk->GetFileTracker(kOrphanedFileTrackerID, nullptr));
EXPECT_TRUE(index_on_disk->GetFileTracker(kSyncRootTrackerID, nullptr));
EXPECT_TRUE(index_on_disk->GetFileTracker(kAppRootTrackerID, nullptr));
EXPECT_TRUE(index_on_disk->GetFileTracker(kFileTrackerID, nullptr));
}
TEST_F(MetadataDatabaseIndexOnDiskTest, BuildIndexTest) {
CreateTestDatabase(false, nullptr);
TrackerIDSet tracker_ids;
// Before building indexes, no references exist.
EXPECT_EQ(kInvalidTrackerID, index()->GetAppRootTracker("app_id"));
tracker_ids = index()->GetFileTrackerIDsByFileID("file_id");
EXPECT_TRUE(tracker_ids.empty());
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kAppRootTrackerID, "file");
EXPECT_TRUE(tracker_ids.empty());
EXPECT_EQ(0U, index()->CountDirtyTracker());
EXPECT_EQ(16, index()->BuildTrackerIndexes());
WriteToDB();
// After building indexes, we should have correct indexes.
EXPECT_EQ(kAppRootTrackerID, index()->GetAppRootTracker("app_id"));
tracker_ids = index()->GetFileTrackerIDsByFileID("file_id");
EXPECT_EQ(1U, tracker_ids.size());
EXPECT_EQ(kFileTrackerID, tracker_ids.active_tracker());
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kAppRootTrackerID, "file");
EXPECT_EQ(1U, tracker_ids.size());
EXPECT_EQ(kFileTrackerID, tracker_ids.active_tracker());
EXPECT_EQ(1U, index()->CountDirtyTracker());
}
TEST_F(MetadataDatabaseIndexOnDiskTest, BuildAndDeleteIndexTest) {
CreateTestDatabase(false, nullptr);
int64 answer = index()->BuildTrackerIndexes();
WriteToDB();
ASSERT_EQ(16, answer);
EXPECT_EQ(answer, index()->DeleteTrackerIndexes());
WriteToDB();
EXPECT_EQ(answer, index()->BuildTrackerIndexes());
WriteToDB();
}
TEST_F(MetadataDatabaseIndexOnDiskTest, AllEntriesTest) {
CreateTestDatabase(true, nullptr);
EXPECT_EQ(3U, index()->CountFileMetadata());
std::vector<std::string> file_ids(index()->GetAllMetadataIDs());
ASSERT_EQ(3U, file_ids.size());
std::sort(file_ids.begin(), file_ids.end());
EXPECT_EQ("app_root_folder_id", file_ids[0]);
EXPECT_EQ("file_id", file_ids[1]);
EXPECT_EQ("sync_root_folder_id", file_ids[2]);
EXPECT_EQ(4U, index()->CountFileTracker());
std::vector<int64> tracker_ids = index()->GetAllTrackerIDs();
ASSERT_EQ(4U, tracker_ids.size());
std::sort(tracker_ids.begin(), tracker_ids.end());
EXPECT_EQ(kSyncRootTrackerID, tracker_ids[0]);
EXPECT_EQ(kAppRootTrackerID, tracker_ids[1]);
EXPECT_EQ(kFileTrackerID, tracker_ids[2]);
EXPECT_EQ(kPlaceholderTrackerID, tracker_ids[3]);
}
TEST_F(MetadataDatabaseIndexOnDiskTest, IndexAppRootIDByAppIDTest) {
CreateTestDatabase(true, nullptr);
std::vector<std::string> app_ids = index()->GetRegisteredAppIDs();
ASSERT_EQ(1U, app_ids.size());
EXPECT_EQ("app_id", app_ids[0]);
EXPECT_EQ(kInvalidTrackerID, index()->GetAppRootTracker(""));
EXPECT_EQ(kAppRootTrackerID, index()->GetAppRootTracker("app_id"));
const int64 kAppRootTrackerID2 = 12;
FileTracker sync_root_tracker;
index()->GetFileTracker(kSyncRootTrackerID, &sync_root_tracker);
scoped_ptr<FileMetadata> app_root_metadata =
test_util::CreateFolderMetadata("app_root_folder_id_2", "app_title_2");
// Testing AddToAppIDIndex
scoped_ptr<FileTracker> app_root_tracker =
test_util::CreateTracker(*app_root_metadata, kAppRootTrackerID2,
&sync_root_tracker);
app_root_tracker->set_app_id("app_id_2");
app_root_tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT);
index()->StoreFileTracker(app_root_tracker.Pass());
WriteToDB();
EXPECT_EQ(kAppRootTrackerID, index()->GetAppRootTracker("app_id"));
EXPECT_EQ(kAppRootTrackerID2, index()->GetAppRootTracker("app_id_2"));
// Testing UpdateInAppIDIndex
app_root_tracker = test_util::CreateTracker(*app_root_metadata,
kAppRootTrackerID2,
&sync_root_tracker);
app_root_tracker->set_app_id("app_id_3");
app_root_tracker->set_active(false);
index()->StoreFileTracker(app_root_tracker.Pass());
WriteToDB();
EXPECT_EQ(kAppRootTrackerID, index()->GetAppRootTracker("app_id"));
EXPECT_EQ(kInvalidTrackerID, index()->GetAppRootTracker("app_id_2"));
EXPECT_EQ(kInvalidTrackerID, index()->GetAppRootTracker("app_id_3"));
app_root_tracker = test_util::CreateTracker(*app_root_metadata,
kAppRootTrackerID2,
&sync_root_tracker);
app_root_tracker->set_app_id("app_id_3");
app_root_tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT);
index()->StoreFileTracker(app_root_tracker.Pass());
WriteToDB();
EXPECT_EQ(kAppRootTrackerID, index()->GetAppRootTracker("app_id"));
EXPECT_EQ(kInvalidTrackerID, index()->GetAppRootTracker("app_id_2"));
EXPECT_EQ(kAppRootTrackerID2, index()->GetAppRootTracker("app_id_3"));
// Testing RemoveFromAppIDIndex
index()->RemoveFileTracker(kAppRootTrackerID2);
WriteToDB();
EXPECT_EQ(kAppRootTrackerID, index()->GetAppRootTracker("app_id"));
EXPECT_EQ(kInvalidTrackerID, index()->GetAppRootTracker("app_id_3"));
}
TEST_F(MetadataDatabaseIndexOnDiskTest, TrackerIDSetByFileIDTest) {
CreateTestDatabase(true, nullptr);
FileTracker app_root_tracker;
EXPECT_TRUE(index()->GetFileTracker(kAppRootTrackerID, &app_root_tracker));
FileMetadata metadata;
EXPECT_TRUE(index()->GetFileMetadata("file_id", &metadata));
// Testing GetFileTrackerIDsByFileID
TrackerIDSet tracker_ids = index()->GetFileTrackerIDsByFileID("file_id");
EXPECT_EQ(1U, tracker_ids.size());
EXPECT_EQ(kFileTrackerID, tracker_ids.active_tracker());
const int64 tracker_id = 21;
// Testing AddToFileIDIndexes
scoped_ptr<FileTracker> file_tracker =
test_util::CreateTracker(metadata, tracker_id, &app_root_tracker);
index()->StoreFileTracker(file_tracker.Pass());
WriteToDB();
tracker_ids = index()->GetFileTrackerIDsByFileID("file_id");
EXPECT_EQ(2U, tracker_ids.size());
EXPECT_EQ(tracker_id, tracker_ids.active_tracker());
std::string multi_file_id = index()->PickMultiTrackerFileID();
EXPECT_EQ("file_id", multi_file_id);
// Testing UpdateInFileIDIndexes
file_tracker =
test_util::CreateTracker(metadata, tracker_id, &app_root_tracker);
file_tracker->set_active(false);
index()->StoreFileTracker(file_tracker.Pass());
WriteToDB();
tracker_ids = index()->GetFileTrackerIDsByFileID("file_id");
EXPECT_EQ(2U, tracker_ids.size());
EXPECT_EQ(kInvalidTrackerID, tracker_ids.active_tracker());
multi_file_id = index()->PickMultiTrackerFileID();
EXPECT_EQ("file_id", multi_file_id);
file_tracker =
test_util::CreateTracker(metadata, tracker_id, &app_root_tracker);
index()->StoreFileTracker(file_tracker.Pass());
WriteToDB();
tracker_ids = index()->GetFileTrackerIDsByFileID("file_id");
EXPECT_EQ(2U, tracker_ids.size());
EXPECT_EQ(tracker_id, tracker_ids.active_tracker());
multi_file_id = index()->PickMultiTrackerFileID();
EXPECT_EQ("file_id", multi_file_id);
// Testing RemoveFromFileIDIndexes
index()->RemoveFileTracker(tracker_id);
WriteToDB();
tracker_ids = index()->GetFileTrackerIDsByFileID("file_id");
EXPECT_EQ(1U, tracker_ids.size());
EXPECT_EQ(kInvalidTrackerID, tracker_ids.active_tracker());
multi_file_id = index()->PickMultiTrackerFileID();
EXPECT_TRUE(multi_file_id.empty()) << multi_file_id;
}
TEST_F(MetadataDatabaseIndexOnDiskTest, TrackerIDSetByParentIDAndTitleTest) {
CreateTestDatabase(true, nullptr);
FileTracker app_root_tracker;
EXPECT_TRUE(index()->GetFileTracker(kAppRootTrackerID, &app_root_tracker));
FileMetadata metadata;
EXPECT_TRUE(index()->GetFileMetadata("file_id", &metadata));
// Testing GetFileTrackerIDsByFileID
TrackerIDSet tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kAppRootTrackerID, "file");
EXPECT_EQ(1U, tracker_ids.size());
EXPECT_EQ(kFileTrackerID, tracker_ids.active_tracker());
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kAppRootTrackerID, "file2");
EXPECT_TRUE(tracker_ids.empty());
const int64 tracker_id = 72;
// Testing AddToFileIDIndexes
scoped_ptr<FileTracker> file_tracker =
test_util::CreateTracker(metadata, tracker_id, &app_root_tracker);
index()->StoreFileTracker(file_tracker.Pass());
WriteToDB();
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kAppRootTrackerID, "file");
EXPECT_EQ(2U, tracker_ids.size());
EXPECT_EQ(tracker_id, tracker_ids.active_tracker());
ParentIDAndTitle multi_backing = index()->PickMultiBackingFilePath();
EXPECT_EQ(kAppRootTrackerID, multi_backing.parent_id);
EXPECT_EQ("file", multi_backing.title);
// Testing UpdateInFileIDIndexes
file_tracker =
test_util::CreateTracker(metadata, tracker_id, &app_root_tracker);
file_tracker->set_active(false);
index()->StoreFileTracker(file_tracker.Pass());
WriteToDB();
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kAppRootTrackerID, "file");
EXPECT_EQ(2U, tracker_ids.size());
EXPECT_EQ(kInvalidTrackerID, tracker_ids.active_tracker());
multi_backing = index()->PickMultiBackingFilePath();
EXPECT_EQ(kAppRootTrackerID, multi_backing.parent_id);
EXPECT_EQ("file", multi_backing.title);
file_tracker =
test_util::CreateTracker(metadata, tracker_id, &app_root_tracker);
index()->StoreFileTracker(file_tracker.Pass());
WriteToDB();
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kAppRootTrackerID, "file");
EXPECT_EQ(2U, tracker_ids.size());
EXPECT_EQ(tracker_id, tracker_ids.active_tracker());
multi_backing = index()->PickMultiBackingFilePath();
EXPECT_EQ(kAppRootTrackerID, multi_backing.parent_id);
EXPECT_EQ("file", multi_backing.title);
// Testing RemoveFromFileIDIndexes
index()->RemoveFileTracker(tracker_id);
WriteToDB();
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kAppRootTrackerID, "file");
EXPECT_EQ(1U, tracker_ids.size());
EXPECT_EQ(kInvalidTrackerID, tracker_ids.active_tracker());
multi_backing = index()->PickMultiBackingFilePath();
EXPECT_EQ(kInvalidTrackerID, multi_backing.parent_id);
EXPECT_TRUE(multi_backing.title.empty()) << multi_backing.title;
}
TEST_F(MetadataDatabaseIndexOnDiskTest,
TrackerIDSetByParentIDAndTitleTest_EmptyTitle) {
CreateTestDatabase(true, nullptr);
const int64 kFolderTrackerID = 23;
const int64 kNewFileTrackerID = 42;
{
FileTracker app_root_tracker;
EXPECT_TRUE(index()->GetFileTracker(kAppRootTrackerID, &app_root_tracker));
scoped_ptr<FileMetadata> folder_metadata =
test_util::CreateFolderMetadata("folder_id", "folder_name");
scoped_ptr<FileTracker> folder_tracker =
test_util::CreateTracker(*folder_metadata, kFolderTrackerID,
&app_root_tracker);
index()->StoreFileMetadata(folder_metadata.Pass());
index()->StoreFileTracker(folder_tracker.Pass());
WriteToDB();
}
FileTracker folder_tracker;
EXPECT_TRUE(index()->GetFileTracker(kFolderTrackerID, &folder_tracker));
scoped_ptr<FileMetadata> metadata =
test_util::CreateFileMetadata("file_id2", std::string(), "md5_2");
// Testing GetFileTrackerIDsByFileID
TrackerIDSet tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kFolderTrackerID, std::string());
EXPECT_TRUE(tracker_ids.empty());
// Testing AddToFileIDIndexes
scoped_ptr<FileTracker> file_tracker =
test_util::CreateTracker(*metadata, kNewFileTrackerID, &folder_tracker);
index()->StoreFileTracker(file_tracker.Pass());
WriteToDB();
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kFolderTrackerID, std::string());
EXPECT_EQ(1U, tracker_ids.size());
EXPECT_EQ(kNewFileTrackerID, tracker_ids.active_tracker());
ParentIDAndTitle multi_backing = index()->PickMultiBackingFilePath();
EXPECT_EQ(kInvalidTrackerID, multi_backing.parent_id);
// Testing UpdateInFileIDIndexes
file_tracker =
test_util::CreateTracker(*metadata, kNewFileTrackerID, &folder_tracker);
index()->StoreFileTracker(file_tracker.Pass());
WriteToDB();
tracker_ids = index()->GetFileTrackerIDsByParentAndTitle(
kFolderTrackerID, std::string());
EXPECT_EQ(1U, tracker_ids.size());
EXPECT_EQ(kNewFileTrackerID, tracker_ids.active_tracker());
multi_backing = index()->PickMultiBackingFilePath();
EXPECT_EQ(kInvalidTrackerID, multi_backing.parent_id);
}
TEST_F(MetadataDatabaseIndexOnDiskTest, TrackerIDSetDetailsTest) {
CreateTestDatabase(true, nullptr);
FileTracker app_root;
EXPECT_TRUE(index()->GetFileTracker(kAppRootTrackerID, &app_root));
const int64 kFileTrackerID2 = 123;
const int64 kFileTrackerID3 = 124;
scoped_ptr<FileMetadata> file_metadata =
test_util::CreateFileMetadata("file_id2", "file_2", "file_md5_2");
scoped_ptr<FileTracker> file_tracker =
test_util::CreateTracker(*file_metadata, kFileTrackerID2, &app_root);
file_tracker->set_active(false);
scoped_ptr<FileTracker> file_tracker2 =
test_util::CreateTracker(*file_metadata, kFileTrackerID3, &app_root);
file_tracker2->set_active(false);
// Add 2 trackers related to one file metadata.
index()->StoreFileMetadata(file_metadata.Pass());
index()->StoreFileTracker(file_tracker.Pass());
index()->StoreFileTracker(file_tracker2.Pass());
TrackerIDSet idset = index()->GetFileTrackerIDsByFileID("file_id2");
EXPECT_EQ(2U, idset.size());
EXPECT_FALSE(idset.has_active());
// Activate one file tracker.
file_tracker.reset(new FileTracker);
index()->GetFileTracker(kFileTrackerID2, file_tracker.get());
file_tracker->set_active(true);
index()->StoreFileTracker(file_tracker.Pass());
idset = index()->GetFileTrackerIDsByFileID("file_id2");
EXPECT_EQ(2U, idset.size());
EXPECT_TRUE(idset.has_active());
EXPECT_EQ(kFileTrackerID2, idset.active_tracker());
}
TEST_F(MetadataDatabaseIndexOnDiskTest, DirtyTrackersTest) {
CreateTestDatabase(true, nullptr);
// Testing public methods
EXPECT_EQ(1U, index()->CountDirtyTracker());
EXPECT_FALSE(index()->HasDemotedDirtyTracker());
EXPECT_EQ(kPlaceholderTrackerID, index()->PickDirtyTracker());
index()->DemoteDirtyTracker(kPlaceholderTrackerID);
WriteToDB();
EXPECT_TRUE(index()->HasDemotedDirtyTracker());
EXPECT_EQ(0U, index()->CountDirtyTracker());
const int64 tracker_id = 13;
scoped_ptr<FileTracker> app_root_tracker(new FileTracker);
index()->GetFileTracker(kAppRootTrackerID, app_root_tracker.get());
// Testing AddDirtyTrackerIndexes
scoped_ptr<FileTracker> tracker =
test_util::CreatePlaceholderTracker("placeholder",
tracker_id,
app_root_tracker.get());
index()->StoreFileTracker(tracker.Pass());
WriteToDB();
EXPECT_EQ(1U, index()->CountDirtyTracker());
EXPECT_EQ(tracker_id, index()->PickDirtyTracker());
// Testing UpdateDirtyTrackerIndexes
tracker = test_util::CreatePlaceholderTracker("placeholder",
tracker_id,
app_root_tracker.get());
tracker->set_dirty(false);
index()->StoreFileTracker(tracker.Pass());
WriteToDB();
EXPECT_EQ(0U, index()->CountDirtyTracker());
EXPECT_EQ(kInvalidTrackerID, index()->PickDirtyTracker());
tracker = test_util::CreatePlaceholderTracker("placeholder",
tracker_id,
app_root_tracker.get());
index()->StoreFileTracker(tracker.Pass());
WriteToDB();
EXPECT_EQ(1U, index()->CountDirtyTracker());
EXPECT_EQ(tracker_id, index()->PickDirtyTracker());
// Testing RemoveFromDirtyTrackerIndexes
index()->RemoveFileTracker(tracker_id);
WriteToDB();
EXPECT_EQ(0U, index()->CountDirtyTracker());
EXPECT_EQ(kInvalidTrackerID, index()->PickDirtyTracker());
// Demoted trackers
EXPECT_TRUE(index()->HasDemotedDirtyTracker());
EXPECT_TRUE(index()->PromoteDemotedDirtyTrackers());
EXPECT_FALSE(index()->HasDemotedDirtyTracker());
}
} // namespace drive_backend
} // namespace sync_file_system