list_changes_task_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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 "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h"
13#include "chrome/browser/sync_file_system/drive_backend/fake_drive_service_helper.h"
14#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
15#include "chrome/browser/sync_file_system/drive_backend/register_app_task.h"
16#include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h"
17#include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.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 "google_apis/drive/drive_api_parser.h"
21#include "testing/gtest/include/gtest/gtest.h"
22#include "third_party/leveldatabase/src/helpers/memenv/memenv.h"
23#include "third_party/leveldatabase/src/include/leveldb/env.h"
24
25namespace sync_file_system {
26namespace drive_backend {
27
28namespace {
29
30const char kAppID[] = "app_id";
31const char kUnregisteredAppID[] = "app_id unregistered";
32
33}  // namespace
34
35class ListChangesTaskTest : public testing::Test,
36                            public SyncEngineContext {
37 public:
38  ListChangesTaskTest() {}
39  virtual ~ListChangesTaskTest() {}
40
41  virtual void SetUp() OVERRIDE {
42    ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
43    in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default()));
44
45    fake_drive_service_.reset(new drive::FakeDriveService);
46    ASSERT_TRUE(fake_drive_service_->LoadAccountMetadataForWapi(
47        "sync_file_system/account_metadata.json"));
48    ASSERT_TRUE(fake_drive_service_->LoadResourceListForWapi(
49        "gdata/empty_feed.json"));
50
51    drive_uploader_.reset(new drive::DriveUploader(
52        fake_drive_service_.get(), base::MessageLoopProxy::current()));
53
54    fake_drive_service_helper_.reset(new FakeDriveServiceHelper(
55        fake_drive_service_.get(), drive_uploader_.get(),
56        kSyncRootFolderTitle));
57
58    SetUpRemoteFolders();
59    InitializeMetadataDatabase();
60    RegisterApp(kAppID);
61  }
62
63  virtual void TearDown() OVERRIDE {
64    metadata_database_.reset();
65    base::RunLoop().RunUntilIdle();
66  }
67
68  virtual drive::DriveServiceInterface* GetDriveService() OVERRIDE {
69    return fake_drive_service_.get();
70  }
71
72  virtual drive::DriveUploader* GetDriveUploader() OVERRIDE {
73    return NULL;
74  }
75
76  virtual MetadataDatabase* GetMetadataDatabase() OVERRIDE {
77    return metadata_database_.get();
78  }
79
80  virtual RemoteChangeProcessor* GetRemoteChangeProcessor() OVERRIDE {
81    return NULL;
82  }
83
84  virtual base::SequencedTaskRunner* GetBlockingTaskRunner() OVERRIDE {
85    return base::MessageLoopProxy::current();
86  }
87
88 protected:
89  SyncStatusCode RunTask(SequentialSyncTask* sync_task) {
90    SyncStatusCode status = SYNC_STATUS_UNKNOWN;
91    sync_task->RunSequential(CreateResultReceiver(&status));
92    base::RunLoop().RunUntilIdle();
93    return status;
94  }
95
96  size_t CountDirtyTracker() {
97    return metadata_database_->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 fake_drive_service_->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 private:
152  void SetUpRemoteFolders() {
153    ASSERT_EQ(google_apis::HTTP_CREATED,
154              fake_drive_service_helper_->AddOrphanedFolder(
155                  kSyncRootFolderTitle, &sync_root_folder_id_));
156    ASSERT_EQ(google_apis::HTTP_CREATED,
157              fake_drive_service_helper_->AddFolder(
158                  sync_root_folder_id_, kAppID, &app_root_folder_id_));
159    ASSERT_EQ(google_apis::HTTP_CREATED,
160              fake_drive_service_helper_->AddFolder(
161                  sync_root_folder_id_, kUnregisteredAppID,
162                  &unregistered_app_root_folder_id_));
163  }
164
165  void InitializeMetadataDatabase() {
166    SyncEngineInitializer initializer(this,
167                                      base::MessageLoopProxy::current(),
168                                      fake_drive_service_.get(),
169                                      database_dir_.path(),
170                                      in_memory_env_.get());
171    EXPECT_EQ(SYNC_STATUS_OK, RunTask(&initializer));
172    metadata_database_ = initializer.PassMetadataDatabase();
173  }
174
175  void RegisterApp(const std::string& app_id) {
176    RegisterAppTask register_app(this, app_id);
177    EXPECT_EQ(SYNC_STATUS_OK, RunTask(&register_app));
178  }
179
180  scoped_ptr<leveldb::Env> in_memory_env_;
181
182  std::string sync_root_folder_id_;
183  std::string app_root_folder_id_;
184  std::string unregistered_app_root_folder_id_;
185
186  content::TestBrowserThreadBundle browser_threads_;
187  base::ScopedTempDir database_dir_;
188
189  scoped_ptr<drive::FakeDriveService> fake_drive_service_;
190  scoped_ptr<drive::DriveUploader> drive_uploader_;
191  scoped_ptr<FakeDriveServiceHelper> fake_drive_service_helper_;
192
193  scoped_ptr<MetadataDatabase> metadata_database_;
194
195  DISALLOW_COPY_AND_ASSIGN(ListChangesTaskTest);
196};
197
198TEST_F(ListChangesTaskTest, NoChange) {
199  size_t num_dirty_trackers = CountDirtyTracker();
200
201  ListChangesTask list_changes(this);
202  EXPECT_EQ(SYNC_STATUS_NO_CHANGE_TO_SYNC, RunTask(&list_changes));
203
204  EXPECT_EQ(num_dirty_trackers, CountDirtyTracker());
205}
206
207TEST_F(ListChangesTaskTest, UnrelatedChange) {
208  size_t num_dirty_trackers = CountDirtyTracker();
209
210  SetUpChangesInFolder(root_resource_id());
211  SetUpChangesInFolder(unregistered_app_root_folder_id());
212
213  ListChangesTask list_changes(this);
214  EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes));
215
216  EXPECT_EQ(num_dirty_trackers, CountDirtyTracker());
217}
218
219TEST_F(ListChangesTaskTest, UnderTrackedFolder) {
220  size_t num_dirty_trackers = CountDirtyTracker();
221
222  SetUpChangesInFolder(app_root_folder_id());
223
224  ListChangesTask list_changes(this);
225  EXPECT_EQ(SYNC_STATUS_OK, RunTask(&list_changes));
226
227  EXPECT_EQ(num_dirty_trackers + 4, CountDirtyTracker());
228}
229
230}  // namespace drive_backend
231}  // namespace sync_file_system
232