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