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