list_changes_task_unittest.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright 2013 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/list_changes_task.h" 6 7#include "base/files/scoped_temp_dir.h" 8#include "base/format_macros.h" 9#include "base/run_loop.h" 10#include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h" 11#include "chrome/browser/sync_file_system/drive_backend/fake_drive_service_helper.h" 12#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" 13#include "chrome/browser/sync_file_system/drive_backend/register_app_task.h" 14#include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h" 15#include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.h" 16#include "chrome/browser/sync_file_system/sync_file_system_test_util.h" 17#include "content/public/test/test_browser_thread_bundle.h" 18#include "google_apis/drive/drive_api_parser.h" 19#include "testing/gtest/include/gtest/gtest.h" 20#include "third_party/leveldatabase/src/helpers/memenv/memenv.h" 21#include "third_party/leveldatabase/src/include/leveldb/env.h" 22 23namespace sync_file_system { 24namespace drive_backend { 25 26namespace { 27 28const char kAppID[] = "app_id"; 29const char kUnregisteredAppID[] = "app_id unregistered"; 30 31} // namespace 32 33class ListChangesTaskTest : public testing::Test, 34 public SyncEngineContext { 35 public: 36 ListChangesTaskTest() {} 37 virtual ~ListChangesTaskTest() {} 38 39 virtual void SetUp() OVERRIDE { 40 ASSERT_TRUE(database_dir_.CreateUniqueTempDir()); 41 in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default())); 42 43 fake_drive_service_.reset(new drive::FakeDriveService); 44 ASSERT_TRUE(fake_drive_service_->LoadAccountMetadataForWapi( 45 "sync_file_system/account_metadata.json")); 46 ASSERT_TRUE(fake_drive_service_->LoadResourceListForWapi( 47 "gdata/empty_feed.json")); 48 49 drive_uploader_.reset(new drive::DriveUploader( 50 fake_drive_service_.get(), base::MessageLoopProxy::current())); 51 52 fake_drive_service_helper_.reset(new FakeDriveServiceHelper( 53 fake_drive_service_.get(), drive_uploader_.get(), 54 kSyncRootFolderTitle)); 55 56 SetUpRemoteFolders(); 57 InitializeMetadataDatabase(); 58 RegisterApp(kAppID); 59 } 60 61 virtual void TearDown() OVERRIDE { 62 metadata_database_.reset(); 63 base::RunLoop().RunUntilIdle(); 64 } 65 66 virtual drive::DriveServiceInterface* GetDriveService() OVERRIDE { 67 return fake_drive_service_.get(); 68 } 69 70 virtual drive::DriveUploader* GetDriveUploader() OVERRIDE { 71 return NULL; 72 } 73 74 virtual MetadataDatabase* GetMetadataDatabase() OVERRIDE { 75 return metadata_database_.get(); 76 } 77 78 virtual RemoteChangeProcessor* GetRemoteChangeProcessor() OVERRIDE { 79 return NULL; 80 } 81 82 virtual base::SequencedTaskRunner* GetBlockingTaskRunner() OVERRIDE { 83 return base::MessageLoopProxy::current(); 84 } 85 86 protected: 87 SyncStatusCode RunTask(SyncTask* sync_task) { 88 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 89 sync_task->Run(CreateResultReceiver(&status)); 90 base::RunLoop().RunUntilIdle(); 91 return status; 92 } 93 94 size_t CountDirtyTracker() { 95 return metadata_database_->dirty_trackers_.size(); 96 } 97 98 FakeDriveServiceHelper* fake_drive_service_helper() { 99 return fake_drive_service_helper_.get(); 100 } 101 102 void SetUpChangesInFolder(const std::string& folder_id) { 103 std::string new_file_id; 104 ASSERT_EQ(google_apis::HTTP_SUCCESS, 105 fake_drive_service_helper()->AddFile( 106 folder_id, "new file", "file contents", &new_file_id)); 107 std::string same_name_file_id; 108 ASSERT_EQ(google_apis::HTTP_SUCCESS, 109 fake_drive_service_helper()->AddFile( 110 folder_id, "new file", "file contents", 111 &same_name_file_id)); 112 113 std::string new_folder_id; 114 ASSERT_EQ(google_apis::HTTP_CREATED, 115 fake_drive_service_helper()->AddFolder( 116 folder_id, "new folder", &new_folder_id)); 117 118 std::string modified_file_id; 119 ASSERT_EQ(google_apis::HTTP_SUCCESS, 120 fake_drive_service_helper()->AddFile( 121 folder_id, "modified file", "file content", 122 &modified_file_id)); 123 ASSERT_EQ(google_apis::HTTP_SUCCESS, 124 fake_drive_service_helper()->UpdateFile( 125 modified_file_id, "modified file content")); 126 127 128 std::string deleted_file_id; 129 ASSERT_EQ(google_apis::HTTP_SUCCESS, 130 fake_drive_service_helper()->AddFile( 131 folder_id, "trashed file", "file content", 132 &deleted_file_id)); 133 ASSERT_EQ(google_apis::HTTP_NO_CONTENT, 134 fake_drive_service_helper()->DeleteResource(deleted_file_id)); 135 } 136 137 std::string root_resource_id() { 138 return fake_drive_service_->GetRootResourceId(); 139 } 140 141 std::string app_root_folder_id() { 142 return app_root_folder_id_; 143 } 144 145 std::string unregistered_app_root_folder_id() { 146 return unregistered_app_root_folder_id_; 147 } 148 149 private: 150 void SetUpRemoteFolders() { 151 ASSERT_EQ(google_apis::HTTP_CREATED, 152 fake_drive_service_helper_->AddOrphanedFolder( 153 kSyncRootFolderTitle, &sync_root_folder_id_)); 154 ASSERT_EQ(google_apis::HTTP_CREATED, 155 fake_drive_service_helper_->AddFolder( 156 sync_root_folder_id_, kAppID, &app_root_folder_id_)); 157 ASSERT_EQ(google_apis::HTTP_CREATED, 158 fake_drive_service_helper_->AddFolder( 159 sync_root_folder_id_, kUnregisteredAppID, 160 &unregistered_app_root_folder_id_)); 161 } 162 163 void InitializeMetadataDatabase() { 164 SyncEngineInitializer initializer(this, 165 base::MessageLoopProxy::current(), 166 fake_drive_service_.get(), 167 database_dir_.path(), 168 in_memory_env_.get()); 169 EXPECT_EQ(SYNC_STATUS_OK, RunTask(&initializer)); 170 metadata_database_ = initializer.PassMetadataDatabase(); 171 } 172 173 void RegisterApp(const std::string& app_id) { 174 RegisterAppTask register_app(this, app_id); 175 EXPECT_EQ(SYNC_STATUS_OK, RunTask(®ister_app)); 176 } 177 178 scoped_ptr<leveldb::Env> in_memory_env_; 179 180 std::string sync_root_folder_id_; 181 std::string app_root_folder_id_; 182 std::string unregistered_app_root_folder_id_; 183 184 content::TestBrowserThreadBundle browser_threads_; 185 base::ScopedTempDir database_dir_; 186 187 scoped_ptr<drive::FakeDriveService> fake_drive_service_; 188 scoped_ptr<drive::DriveUploader> drive_uploader_; 189 scoped_ptr<FakeDriveServiceHelper> fake_drive_service_helper_; 190 191 scoped_ptr<MetadataDatabase> metadata_database_; 192 193 DISALLOW_COPY_AND_ASSIGN(ListChangesTaskTest); 194}; 195 196TEST_F(ListChangesTaskTest, NoChange) { 197 size_t num_dirty_trackers = CountDirtyTracker(); 198 199 ListChangesTask list_changes(this); 200 EXPECT_EQ(SYNC_STATUS_NO_CHANGE_TO_SYNC, RunTask(&list_changes)); 201 202 EXPECT_EQ(num_dirty_trackers, CountDirtyTracker()); 203} 204 205TEST_F(ListChangesTaskTest, UnrelatedChange) { 206 size_t num_dirty_trackers = CountDirtyTracker(); 207 208 SetUpChangesInFolder(root_resource_id()); 209 SetUpChangesInFolder(unregistered_app_root_folder_id()); 210 211 ListChangesTask list_changes(this); 212 EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes)); 213 214 EXPECT_EQ(num_dirty_trackers, CountDirtyTracker()); 215} 216 217TEST_F(ListChangesTaskTest, UnderTrackedFolder) { 218 size_t num_dirty_trackers = CountDirtyTracker(); 219 220 SetUpChangesInFolder(app_root_folder_id()); 221 222 ListChangesTask list_changes(this); 223 EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes)); 224 225 EXPECT_EQ(num_dirty_trackers + 4, CountDirtyTracker()); 226} 227 228} // namespace drive_backend 229} // namespace sync_file_system 230