metadata_database_index_unittest.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/sync_file_system/drive_backend/metadata_database_index.h" 6 7#include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h" 8#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" 9#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h" 10#include "testing/gtest/include/gtest/gtest.h" 11 12namespace sync_file_system { 13namespace drive_backend { 14 15namespace { 16 17const int64 kSyncRootTrackerID = 1; 18const int64 kAppRootTrackerID = 2; 19const int64 kFileTrackerID = 3; 20const int64 kPlaceholderTrackerID = 4; 21 22scoped_ptr<FileMetadata> CreateFolderMetadata(const std::string& file_id, 23 const std::string& title) { 24 FileDetails details; 25 details.set_title(title); 26 details.set_file_kind(FILE_KIND_FOLDER); 27 details.set_missing(false); 28 29 scoped_ptr<FileMetadata> metadata(new FileMetadata); 30 metadata->set_file_id(file_id); 31 *metadata->mutable_details() = details; 32 33 return metadata.Pass(); 34} 35 36scoped_ptr<FileMetadata> CreateFileMetadata(const std::string& file_id, 37 const std::string& title, 38 const std::string& md5) { 39 FileDetails details; 40 details.set_title(title); 41 details.set_file_kind(FILE_KIND_FILE); 42 details.set_missing(false); 43 details.set_md5(md5); 44 45 scoped_ptr<FileMetadata> metadata(new FileMetadata); 46 metadata->set_file_id(file_id); 47 *metadata->mutable_details() = details; 48 49 return metadata.Pass(); 50} 51 52scoped_ptr<FileTracker> CreateTracker(const FileMetadata& metadata, 53 int64 tracker_id, 54 const FileTracker* parent_tracker) { 55 scoped_ptr<FileTracker> tracker(new FileTracker); 56 tracker->set_tracker_id(tracker_id); 57 if (parent_tracker) 58 tracker->set_parent_tracker_id(parent_tracker->tracker_id()); 59 tracker->set_file_id(metadata.file_id()); 60 if (parent_tracker) 61 tracker->set_app_id(parent_tracker->app_id()); 62 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); 63 *tracker->mutable_synced_details() = metadata.details(); 64 tracker->set_dirty(false); 65 tracker->set_active(true); 66 tracker->set_needs_folder_listing(false); 67 return tracker.Pass(); 68} 69 70scoped_ptr<FileTracker> CreatePlaceholderTracker( 71 const std::string& file_id, 72 int64 tracker_id, 73 const FileTracker* parent_tracker) { 74 scoped_ptr<FileTracker> tracker(new FileTracker); 75 tracker->set_tracker_id(tracker_id); 76 if (parent_tracker) 77 tracker->set_parent_tracker_id(parent_tracker->tracker_id()); 78 tracker->set_file_id(file_id); 79 if (parent_tracker) 80 tracker->set_app_id(parent_tracker->app_id()); 81 tracker->set_tracker_kind(TRACKER_KIND_REGULAR); 82 tracker->set_dirty(true); 83 tracker->set_active(false); 84 tracker->set_needs_folder_listing(false); 85 return tracker.Pass(); 86} 87 88scoped_ptr<DatabaseContents> CreateTestDatabaseContents() { 89 scoped_ptr<DatabaseContents> contents(new DatabaseContents); 90 91 scoped_ptr<FileMetadata> sync_root_metadata = 92 CreateFolderMetadata("sync_root_folder_id", 93 "Chrome Syncable FileSystem"); 94 scoped_ptr<FileTracker> sync_root_tracker = 95 CreateTracker(*sync_root_metadata, kSyncRootTrackerID, NULL); 96 97 scoped_ptr<FileMetadata> app_root_metadata = 98 CreateFolderMetadata("app_root_folder_id", "app_id"); 99 scoped_ptr<FileTracker> app_root_tracker = 100 CreateTracker(*app_root_metadata, kAppRootTrackerID, 101 sync_root_tracker.get()); 102 app_root_tracker->set_app_id("app_id"); 103 app_root_tracker->set_tracker_kind(TRACKER_KIND_APP_ROOT); 104 105 scoped_ptr<FileMetadata> file_metadata = 106 CreateFileMetadata("file_id", "file", "file_md5"); 107 scoped_ptr<FileTracker> file_tracker = 108 CreateTracker(*file_metadata, kFileTrackerID, app_root_tracker.get()); 109 110 scoped_ptr<FileTracker> placeholder_tracker = 111 CreatePlaceholderTracker("unsynced_file_id", kPlaceholderTrackerID, 112 app_root_tracker.get()); 113 114 contents->file_metadata.push_back(sync_root_metadata.release()); 115 contents->file_trackers.push_back(sync_root_tracker.release()); 116 contents->file_metadata.push_back(app_root_metadata.release()); 117 contents->file_trackers.push_back(app_root_tracker.release()); 118 contents->file_metadata.push_back(file_metadata.release()); 119 contents->file_trackers.push_back(file_tracker.release()); 120 contents->file_trackers.push_back(placeholder_tracker.release()); 121 return contents.Pass(); 122} 123 124} // namespace 125 126TEST(MetadataDatabaseIndexTest, GetEntryTest) { 127 MetadataDatabaseIndex index(CreateTestDatabaseContents().get()); 128 129 EXPECT_FALSE(index.GetFileMetadata(std::string())); 130 EXPECT_FALSE(index.GetFileTracker(kInvalidTrackerID)); 131 132 const FileTracker* tracker = index.GetFileTracker(kFileTrackerID); 133 ASSERT_TRUE(tracker); 134 EXPECT_EQ(kFileTrackerID, tracker->tracker_id()); 135 EXPECT_EQ("file_id", tracker->file_id()); 136 137 const FileMetadata* metadata = index.GetFileMetadata("file_id"); 138 ASSERT_TRUE(metadata); 139 EXPECT_EQ("file_id", metadata->file_id()); 140} 141 142TEST(MetadataDatabaseIndexTest, IndexLookUpTest) { 143 MetadataDatabaseIndex index(CreateTestDatabaseContents().get()); 144 145 TrackerIDSet trackers = index.GetFileTrackerIDsByFileID("file_id"); 146 EXPECT_EQ(1u, trackers.size()); 147 EXPECT_TRUE(trackers.has_active()); 148 EXPECT_EQ(kFileTrackerID, trackers.active_tracker()); 149 150 int64 app_root_tracker_id = index.GetAppRootTracker("app_id"); 151 EXPECT_EQ(kAppRootTrackerID, app_root_tracker_id); 152 153 trackers = index.GetFileTrackerIDsByParentAndTitle( 154 app_root_tracker_id, "file"); 155 EXPECT_EQ(1u, trackers.size()); 156 EXPECT_TRUE(trackers.has_active()); 157 EXPECT_EQ(kFileTrackerID, trackers.active_tracker()); 158 159 EXPECT_TRUE(index.PickMultiTrackerFileID().empty()); 160 EXPECT_EQ(kInvalidTrackerID, 161 index.PickMultiBackingFilePath().parent_id); 162 EXPECT_EQ(kPlaceholderTrackerID, index.PickDirtyTracker()); 163} 164 165TEST(MetadataDatabaseIndexTest, UpdateTest) { 166 MetadataDatabaseIndex index(CreateTestDatabaseContents().get()); 167 168 index.DemoteDirtyTracker(kPlaceholderTrackerID); 169 EXPECT_EQ(kInvalidTrackerID, index.PickDirtyTracker()); 170 index.PromoteDemotedDirtyTrackers(); 171 EXPECT_EQ(kPlaceholderTrackerID, index.PickDirtyTracker()); 172 173 int64 new_tracker_id = 100; 174 scoped_ptr<FileTracker> new_tracker = 175 CreateTracker(*index.GetFileMetadata("file_id"), 176 new_tracker_id, 177 index.GetFileTracker(kAppRootTrackerID)); 178 new_tracker->set_active(false); 179 index.StoreFileTracker(new_tracker.Pass()); 180 181 EXPECT_EQ("file_id", index.PickMultiTrackerFileID()); 182 EXPECT_EQ(ParentIDAndTitle(kAppRootTrackerID, std::string("file")), 183 index.PickMultiBackingFilePath()); 184 185 index.RemoveFileMetadata("file_id"); 186 index.RemoveFileTracker(kFileTrackerID); 187 188 EXPECT_FALSE(index.GetFileMetadata("file_id")); 189 EXPECT_FALSE(index.GetFileTracker(kFileTrackerID)); 190} 191 192} // namespace drive_backend 193} // namespace sync_file_system 194