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 "base/strings/stringprintf.h"
11 #include "chrome/browser/google_apis/drive_api_parser.h"
12 #include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h"
13 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
14 #include "chrome/browser/sync_file_system/drive_backend/register_app_task.h"
15 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h"
16 #include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.h"
17 #include "chrome/browser/sync_file_system/drive_backend_v1/fake_drive_service_helper.h"
18 #include "chrome/browser/sync_file_system/sync_file_system_test_util.h"
19 #include "content/public/test/test_browser_thread_bundle.h"
20 #include "testing/gtest/include/gtest/gtest.h"
22 namespace sync_file_system {
23 namespace drive_backend {
27 const char kAppID[] = "app_id";
28 const char kUnregisteredAppID[] = "app_id unregistered";
32 class ListChangesTaskTest : public testing::Test,
33 public SyncEngineContext {
35 ListChangesTaskTest() {}
36 virtual ~ListChangesTaskTest() {}
38 virtual void SetUp() OVERRIDE {
39 ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
41 fake_drive_service_.reset(new drive::FakeDriveService);
42 ASSERT_TRUE(fake_drive_service_->LoadAccountMetadataForWapi(
43 "sync_file_system/account_metadata.json"));
44 ASSERT_TRUE(fake_drive_service_->LoadResourceListForWapi(
45 "gdata/empty_feed.json"));
47 drive_uploader_.reset(new drive::DriveUploader(
48 fake_drive_service_.get(), base::MessageLoopProxy::current()));
50 fake_drive_service_helper_.reset(new FakeDriveServiceHelper(
51 fake_drive_service_.get(), drive_uploader_.get()));
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 MetadataDatabase* GetMetadataDatabase() OVERRIDE {
68 return metadata_database_.get();
71 int64 GetRemoteLargestChangeID() {
72 scoped_ptr<google_apis::AboutResource> about_resource;
73 EXPECT_EQ(google_apis::HTTP_SUCCESS,
74 fake_drive_service_helper_->GetAboutResource(&about_resource));
75 return about_resource->largest_change_id();
79 SyncStatusCode RunTask(SyncTask* sync_task) {
80 SyncStatusCode status = SYNC_STATUS_UNKNOWN;
81 sync_task->Run(CreateResultReceiver(&status));
82 base::RunLoop().RunUntilIdle();
86 size_t CountDirtyTracker() {
87 return metadata_database_->dirty_trackers_.size();
90 FakeDriveServiceHelper* fake_drive_service_helper() {
91 return fake_drive_service_helper_.get();
94 drive::FakeDriveService* fake_drive_service() {
95 return fake_drive_service_.get();
98 void SetUpChangesInFolder(const std::string& folder_id) {
99 std::string new_file_id;
100 ASSERT_EQ(google_apis::HTTP_SUCCESS,
101 fake_drive_service_helper()->AddFile(
102 folder_id, "new file", "file contents", &new_file_id));
103 std::string same_name_file_id;
104 ASSERT_EQ(google_apis::HTTP_SUCCESS,
105 fake_drive_service_helper()->AddFile(
106 folder_id, "new file", "file contents",
107 &same_name_file_id));
109 std::string new_folder_id;
110 ASSERT_EQ(google_apis::HTTP_CREATED,
111 fake_drive_service_helper()->AddFolder(
112 folder_id, "new folder", &new_folder_id));
114 std::string modified_file_id;
115 ASSERT_EQ(google_apis::HTTP_SUCCESS,
116 fake_drive_service_helper()->AddFile(
117 folder_id, "modified file", "file content",
119 ASSERT_EQ(google_apis::HTTP_SUCCESS,
120 fake_drive_service_helper()->UpdateFile(
121 modified_file_id, "modified file content"));
124 std::string trashed_file_id;
125 ASSERT_EQ(google_apis::HTTP_SUCCESS,
126 fake_drive_service_helper()->AddFile(
127 folder_id, "trashed file", "file content",
129 ASSERT_EQ(google_apis::HTTP_SUCCESS,
130 fake_drive_service_helper()->RemoveResource(trashed_file_id));
133 std::string root_resource_id() {
134 return fake_drive_service_->GetRootResourceId();
137 std::string sync_root_folder_id() {
138 return sync_root_folder_id_;
141 std::string app_root_folder_id() {
142 return app_root_folder_id_;
145 std::string unregistered_app_root_folder_id() {
146 return unregistered_app_root_folder_id_;
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_));
163 void InitializeMetadataDatabase() {
164 SyncEngineInitializer initializer(base::MessageLoopProxy::current(),
165 fake_drive_service_.get(),
166 database_dir_.path());
167 EXPECT_EQ(SYNC_STATUS_OK, RunTask(&initializer));
168 metadata_database_ = initializer.PassMetadataDatabase();
171 void RegisterApp(const std::string& app_id) {
172 RegisterAppTask register_app(this, app_id);
173 EXPECT_EQ(SYNC_STATUS_OK, RunTask(®ister_app));
176 std::string GenerateFileID() {
177 return base::StringPrintf("file_id_%" PRId64, next_file_id_++);
180 std::string sync_root_folder_id_;
181 std::string app_root_folder_id_;
182 std::string unregistered_app_root_folder_id_;
185 int64 next_tracker_id_;
187 content::TestBrowserThreadBundle browser_threads_;
188 base::ScopedTempDir database_dir_;
190 scoped_ptr<drive::FakeDriveService> fake_drive_service_;
191 scoped_ptr<drive::DriveUploader> drive_uploader_;
192 scoped_ptr<FakeDriveServiceHelper> fake_drive_service_helper_;
194 scoped_ptr<MetadataDatabase> metadata_database_;
196 DISALLOW_COPY_AND_ASSIGN(ListChangesTaskTest);
199 TEST_F(ListChangesTaskTest, NoChange) {
200 size_t num_dirty_trackers = CountDirtyTracker();
202 ListChangesTask list_changes(this);
203 EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes));
205 EXPECT_EQ(num_dirty_trackers, CountDirtyTracker());
208 TEST_F(ListChangesTaskTest, UnrelatedChange) {
209 size_t num_dirty_trackers = CountDirtyTracker();
211 SetUpChangesInFolder(root_resource_id());
212 SetUpChangesInFolder(unregistered_app_root_folder_id());
214 ListChangesTask list_changes(this);
215 EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes));
217 EXPECT_EQ(num_dirty_trackers, CountDirtyTracker());
220 TEST_F(ListChangesTaskTest, UnderTrackedFolder) {
221 size_t num_dirty_trackers = CountDirtyTracker();
223 SetUpChangesInFolder(app_root_folder_id());
225 ListChangesTask list_changes(this);
226 EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes));
228 EXPECT_EQ(num_dirty_trackers + 4, CountDirtyTracker());
231 } // namespace drive_backend
232 } // namespace sync_file_system