- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync_file_system / drive_backend / list_changes_task_unittest.cc
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 "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"
21
22 namespace sync_file_system {
23 namespace drive_backend {
24
25 namespace {
26
27 const char kAppID[] = "app_id";
28 const char kUnregisteredAppID[] = "app_id unregistered";
29
30 }  // namespace
31
32 class ListChangesTaskTest : public testing::Test,
33                             public SyncEngineContext {
34  public:
35   ListChangesTaskTest() {}
36   virtual ~ListChangesTaskTest() {}
37
38   virtual void SetUp() OVERRIDE {
39     ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
40
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"));
46
47     drive_uploader_.reset(new drive::DriveUploader(
48         fake_drive_service_.get(), base::MessageLoopProxy::current()));
49
50     fake_drive_service_helper_.reset(new FakeDriveServiceHelper(
51         fake_drive_service_.get(), drive_uploader_.get()));
52
53     SetUpRemoteFolders();
54     InitializeMetadataDatabase();
55     RegisterApp(kAppID);
56   }
57
58   virtual void TearDown() OVERRIDE {
59     metadata_database_.reset();
60     base::RunLoop().RunUntilIdle();
61   }
62
63   virtual drive::DriveServiceInterface* GetDriveService() OVERRIDE {
64     return fake_drive_service_.get();
65   }
66
67   virtual MetadataDatabase* GetMetadataDatabase() OVERRIDE {
68     return metadata_database_.get();
69   }
70
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();
76   }
77
78  protected:
79   SyncStatusCode RunTask(SyncTask* sync_task) {
80     SyncStatusCode status = SYNC_STATUS_UNKNOWN;
81     sync_task->Run(CreateResultReceiver(&status));
82     base::RunLoop().RunUntilIdle();
83     return status;
84   }
85
86   size_t CountDirtyTracker() {
87     return metadata_database_->dirty_trackers_.size();
88   }
89
90   FakeDriveServiceHelper* fake_drive_service_helper() {
91     return fake_drive_service_helper_.get();
92   }
93
94   drive::FakeDriveService* fake_drive_service() {
95     return fake_drive_service_.get();
96   }
97
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));
108
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));
113
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",
118                   &modified_file_id));
119     ASSERT_EQ(google_apis::HTTP_SUCCESS,
120               fake_drive_service_helper()->UpdateFile(
121                   modified_file_id, "modified file content"));
122
123
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",
128                   &trashed_file_id));
129     ASSERT_EQ(google_apis::HTTP_SUCCESS,
130               fake_drive_service_helper()->RemoveResource(trashed_file_id));
131   }
132
133   std::string root_resource_id() {
134     return fake_drive_service_->GetRootResourceId();
135   }
136
137   std::string sync_root_folder_id() {
138     return sync_root_folder_id_;
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(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();
169   }
170
171   void RegisterApp(const std::string& app_id) {
172     RegisterAppTask register_app(this, app_id);
173     EXPECT_EQ(SYNC_STATUS_OK, RunTask(&register_app));
174   }
175
176   std::string GenerateFileID() {
177     return base::StringPrintf("file_id_%" PRId64, next_file_id_++);
178   }
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   int64 next_file_id_;
185   int64 next_tracker_id_;
186
187   content::TestBrowserThreadBundle browser_threads_;
188   base::ScopedTempDir database_dir_;
189
190   scoped_ptr<drive::FakeDriveService> fake_drive_service_;
191   scoped_ptr<drive::DriveUploader> drive_uploader_;
192   scoped_ptr<FakeDriveServiceHelper> fake_drive_service_helper_;
193
194   scoped_ptr<MetadataDatabase> metadata_database_;
195
196   DISALLOW_COPY_AND_ASSIGN(ListChangesTaskTest);
197 };
198
199 TEST_F(ListChangesTaskTest, NoChange) {
200   size_t num_dirty_trackers = CountDirtyTracker();
201
202   ListChangesTask list_changes(this);
203   EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes));
204
205   EXPECT_EQ(num_dirty_trackers, CountDirtyTracker());
206 }
207
208 TEST_F(ListChangesTaskTest, UnrelatedChange) {
209   size_t num_dirty_trackers = CountDirtyTracker();
210
211   SetUpChangesInFolder(root_resource_id());
212   SetUpChangesInFolder(unregistered_app_root_folder_id());
213
214   ListChangesTask list_changes(this);
215   EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes));
216
217   EXPECT_EQ(num_dirty_trackers, CountDirtyTracker());
218 }
219
220 TEST_F(ListChangesTaskTest, UnderTrackedFolder) {
221   size_t num_dirty_trackers = CountDirtyTracker();
222
223   SetUpChangesInFolder(app_root_folder_id());
224
225   ListChangesTask list_changes(this);
226   EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes));
227
228   EXPECT_EQ(num_dirty_trackers + 4, CountDirtyTracker());
229 }
230
231 }  // namespace drive_backend
232 }  // namespace sync_file_system