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.
5 #include "chrome/browser/sync_file_system/drive_backend/list_changes_task.h"
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"
21 namespace sync_file_system {
22 namespace drive_backend {
26 const char kAppID[] = "app_id";
27 const char kUnregisteredAppID[] = "app_id unregistered";
31 class ListChangesTaskTest : public testing::Test,
32 public SyncEngineContext {
34 ListChangesTaskTest() {}
35 virtual ~ListChangesTaskTest() {}
37 virtual void SetUp() OVERRIDE {
38 ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
40 fake_drive_service_.reset(new drive::FakeDriveService);
41 ASSERT_TRUE(fake_drive_service_->LoadAccountMetadataForWapi(
42 "sync_file_system/account_metadata.json"));
43 ASSERT_TRUE(fake_drive_service_->LoadResourceListForWapi(
44 "gdata/empty_feed.json"));
46 drive_uploader_.reset(new drive::DriveUploader(
47 fake_drive_service_.get(), base::MessageLoopProxy::current()));
49 fake_drive_service_helper_.reset(new FakeDriveServiceHelper(
50 fake_drive_service_.get(), drive_uploader_.get(),
51 kSyncRootFolderTitle));
54 InitializeMetadataDatabase();
58 virtual void TearDown() OVERRIDE {
59 metadata_database_.reset();
60 base::RunLoop().RunUntilIdle();
63 virtual drive::DriveServiceInterface* GetDriveService() OVERRIDE {
64 return fake_drive_service_.get();
67 virtual drive::DriveUploader* GetDriveUploader() OVERRIDE {
71 virtual MetadataDatabase* GetMetadataDatabase() OVERRIDE {
72 return metadata_database_.get();
75 virtual RemoteChangeProcessor* GetRemoteChangeProcessor() OVERRIDE {
79 virtual base::SequencedTaskRunner* GetBlockingTaskRunner() OVERRIDE {
80 return base::MessageLoopProxy::current();
84 SyncStatusCode RunTask(SyncTask* sync_task) {
85 SyncStatusCode status = SYNC_STATUS_UNKNOWN;
86 sync_task->Run(CreateResultReceiver(&status));
87 base::RunLoop().RunUntilIdle();
91 size_t CountDirtyTracker() {
92 return metadata_database_->dirty_trackers_.size();
95 FakeDriveServiceHelper* fake_drive_service_helper() {
96 return fake_drive_service_helper_.get();
99 void SetUpChangesInFolder(const std::string& folder_id) {
100 std::string new_file_id;
101 ASSERT_EQ(google_apis::HTTP_SUCCESS,
102 fake_drive_service_helper()->AddFile(
103 folder_id, "new file", "file contents", &new_file_id));
104 std::string same_name_file_id;
105 ASSERT_EQ(google_apis::HTTP_SUCCESS,
106 fake_drive_service_helper()->AddFile(
107 folder_id, "new file", "file contents",
108 &same_name_file_id));
110 std::string new_folder_id;
111 ASSERT_EQ(google_apis::HTTP_CREATED,
112 fake_drive_service_helper()->AddFolder(
113 folder_id, "new folder", &new_folder_id));
115 std::string modified_file_id;
116 ASSERT_EQ(google_apis::HTTP_SUCCESS,
117 fake_drive_service_helper()->AddFile(
118 folder_id, "modified file", "file content",
120 ASSERT_EQ(google_apis::HTTP_SUCCESS,
121 fake_drive_service_helper()->UpdateFile(
122 modified_file_id, "modified file content"));
125 std::string deleted_file_id;
126 ASSERT_EQ(google_apis::HTTP_SUCCESS,
127 fake_drive_service_helper()->AddFile(
128 folder_id, "trashed file", "file content",
130 ASSERT_EQ(google_apis::HTTP_NO_CONTENT,
131 fake_drive_service_helper()->DeleteResource(deleted_file_id));
134 std::string root_resource_id() {
135 return fake_drive_service_->GetRootResourceId();
138 std::string app_root_folder_id() {
139 return app_root_folder_id_;
142 std::string unregistered_app_root_folder_id() {
143 return unregistered_app_root_folder_id_;
147 void SetUpRemoteFolders() {
148 ASSERT_EQ(google_apis::HTTP_CREATED,
149 fake_drive_service_helper_->AddOrphanedFolder(
150 kSyncRootFolderTitle, &sync_root_folder_id_));
151 ASSERT_EQ(google_apis::HTTP_CREATED,
152 fake_drive_service_helper_->AddFolder(
153 sync_root_folder_id_, kAppID, &app_root_folder_id_));
154 ASSERT_EQ(google_apis::HTTP_CREATED,
155 fake_drive_service_helper_->AddFolder(
156 sync_root_folder_id_, kUnregisteredAppID,
157 &unregistered_app_root_folder_id_));
160 void InitializeMetadataDatabase() {
161 SyncEngineInitializer initializer(this,
162 base::MessageLoopProxy::current(),
163 fake_drive_service_.get(),
164 database_dir_.path());
165 EXPECT_EQ(SYNC_STATUS_OK, RunTask(&initializer));
166 metadata_database_ = initializer.PassMetadataDatabase();
169 void RegisterApp(const std::string& app_id) {
170 RegisterAppTask register_app(this, app_id);
171 EXPECT_EQ(SYNC_STATUS_OK, RunTask(®ister_app));
174 std::string sync_root_folder_id_;
175 std::string app_root_folder_id_;
176 std::string unregistered_app_root_folder_id_;
178 content::TestBrowserThreadBundle browser_threads_;
179 base::ScopedTempDir database_dir_;
181 scoped_ptr<drive::FakeDriveService> fake_drive_service_;
182 scoped_ptr<drive::DriveUploader> drive_uploader_;
183 scoped_ptr<FakeDriveServiceHelper> fake_drive_service_helper_;
185 scoped_ptr<MetadataDatabase> metadata_database_;
187 DISALLOW_COPY_AND_ASSIGN(ListChangesTaskTest);
190 TEST_F(ListChangesTaskTest, NoChange) {
191 size_t num_dirty_trackers = CountDirtyTracker();
193 ListChangesTask list_changes(this);
194 EXPECT_EQ(SYNC_STATUS_NO_CHANGE_TO_SYNC, RunTask(&list_changes));
196 EXPECT_EQ(num_dirty_trackers, CountDirtyTracker());
199 TEST_F(ListChangesTaskTest, UnrelatedChange) {
200 size_t num_dirty_trackers = CountDirtyTracker();
202 SetUpChangesInFolder(root_resource_id());
203 SetUpChangesInFolder(unregistered_app_root_folder_id());
205 ListChangesTask list_changes(this);
206 EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes));
208 EXPECT_EQ(num_dirty_trackers, CountDirtyTracker());
211 TEST_F(ListChangesTaskTest, UnderTrackedFolder) {
212 size_t num_dirty_trackers = CountDirtyTracker();
214 SetUpChangesInFolder(app_root_folder_id());
216 ListChangesTask list_changes(this);
217 EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes));
219 EXPECT_EQ(num_dirty_trackers + 4, CountDirtyTracker());
222 } // namespace drive_backend
223 } // namespace sync_file_system