drive_backend_sync_unittest.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
1// Copyright 2014 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 <algorithm>
6#include <stack>
7
8#include "base/file_util.h"
9#include "base/message_loop/message_loop.h"
10#include "base/run_loop.h"
11#include "chrome/browser/drive/drive_uploader.h"
12#include "chrome/browser/drive/fake_drive_service.h"
13#include "chrome/browser/drive/test_util.h"
14#include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h"
15#include "chrome/browser/sync_file_system/drive_backend/fake_drive_service_helper.h"
16#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
17#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
18#include "chrome/browser/sync_file_system/drive_backend/sync_engine.h"
19#include "chrome/browser/sync_file_system/local/canned_syncable_file_system.h"
20#include "chrome/browser/sync_file_system/local/local_file_sync_context.h"
21#include "chrome/browser/sync_file_system/local/local_file_sync_service.h"
22#include "chrome/browser/sync_file_system/local/sync_file_system_backend.h"
23#include "chrome/browser/sync_file_system/sync_file_system_test_util.h"
24#include "chrome/browser/sync_file_system/syncable_file_system_util.h"
25#include "chrome/test/base/testing_profile.h"
26#include "content/public/test/test_browser_thread.h"
27#include "content/public/test/test_browser_thread_bundle.h"
28#include "extensions/common/extension.h"
29#include "google_apis/drive/drive_api_parser.h"
30#include "testing/gtest/include/gtest/gtest.h"
31#include "third_party/leveldatabase/src/helpers/memenv/memenv.h"
32#include "third_party/leveldatabase/src/include/leveldb/env.h"
33#include "webkit/browser/fileapi/file_system_context.h"
34
35#define FPL(a) FILE_PATH_LITERAL(a)
36
37namespace sync_file_system {
38namespace drive_backend {
39
40typedef fileapi::FileSystemOperation::FileEntryList FileEntryList;
41
42class DriveBackendSyncTest : public testing::Test,
43                             public LocalFileSyncService::Observer,
44                             public RemoteFileSyncService::Observer {
45 public:
46  DriveBackendSyncTest()
47      : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
48        pending_remote_changes_(0),
49        pending_local_changes_(0) {}
50  virtual ~DriveBackendSyncTest() {}
51
52  virtual void SetUp() OVERRIDE {
53    ASSERT_TRUE(base_dir_.CreateUniqueTempDir());
54    in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default()));
55
56    io_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread(
57        content::BrowserThread::IO);
58    file_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread(
59        content::BrowserThread::FILE);
60
61    RegisterSyncableFileSystem();
62    local_sync_service_ = LocalFileSyncService::CreateForTesting(
63        &profile_, in_memory_env_.get());
64    local_sync_service_->AddChangeObserver(this);
65
66    scoped_ptr<drive::FakeDriveService> drive_service(
67        new drive::FakeDriveService());
68    drive_service->Initialize("test@example.com");
69    ASSERT_TRUE(drive::test_util::SetUpTestEntries(drive_service.get()));
70
71    scoped_ptr<drive::DriveUploaderInterface> uploader(
72        new drive::DriveUploader(drive_service.get(),
73                                 file_task_runner_.get()));
74
75    fake_drive_service_helper_.reset(new FakeDriveServiceHelper(
76        drive_service.get(), uploader.get(),
77        kSyncRootFolderTitle));
78
79    remote_sync_service_.reset(new SyncEngine(
80        drive_service.PassAs<drive::DriveServiceInterface>(),
81        uploader.Pass(),
82        file_task_runner_.get(),
83        NULL, NULL, NULL));
84    remote_sync_service_->AddServiceObserver(this);
85    remote_sync_service_->Initialize(base_dir_.path(),
86                                     base::MessageLoopProxy::current(),
87                                     in_memory_env_.get());
88    remote_sync_service_->SetSyncEnabled(true);
89
90    local_sync_service_->SetLocalChangeProcessor(remote_sync_service_.get());
91    remote_sync_service_->SetRemoteChangeProcessor(local_sync_service_.get());
92  }
93
94  virtual void TearDown() OVERRIDE {
95    typedef std::map<std::string, CannedSyncableFileSystem*>::iterator iterator;
96    for (iterator itr = file_systems_.begin();
97         itr != file_systems_.end(); ++itr) {
98      itr->second->TearDown();
99      delete itr->second;
100    }
101    file_systems_.clear();
102
103    fake_drive_service_helper_.reset();
104    remote_sync_service_.reset();
105
106    base::RunLoop().RunUntilIdle();
107    RevokeSyncableFileSystem();
108  }
109
110  virtual void OnRemoteChangeQueueUpdated(int64 pending_changes_hint) OVERRIDE {
111    pending_remote_changes_ = pending_changes_hint;
112  }
113
114  virtual void OnLocalChangeAvailable(int64 pending_changes_hint) OVERRIDE {
115    pending_local_changes_ = pending_changes_hint;
116  }
117
118 protected:
119  fileapi::FileSystemURL CreateURL(const std::string& app_id,
120                                   const base::FilePath::StringType& path) {
121    return CreateURL(app_id, base::FilePath(path));
122  }
123
124  fileapi::FileSystemURL CreateURL(const std::string& app_id,
125                                   const base::FilePath& path) {
126    GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id);
127    return CreateSyncableFileSystemURL(origin, path);
128  }
129
130  bool GetAppRootFolderID(const std::string& app_id,
131                          std::string* folder_id) {
132    FileTracker tracker;
133    if (!metadata_database()->FindAppRootTracker(app_id, &tracker))
134      return false;
135    *folder_id = tracker.file_id();
136    return true;
137  }
138
139  std::string GetFileIDByPath(const std::string& app_id,
140                              const base::FilePath::StringType& path) {
141    return GetFileIDByPath(app_id, base::FilePath(path));
142  }
143
144  std::string GetFileIDByPath(const std::string& app_id,
145                              const base::FilePath& path) {
146    FileTracker tracker;
147    base::FilePath result_path;
148    base::FilePath normalized_path = path.NormalizePathSeparators();
149    EXPECT_TRUE(metadata_database()->FindNearestActiveAncestor(
150        app_id, normalized_path, &tracker, &result_path));
151    EXPECT_EQ(normalized_path, result_path);
152    return tracker.file_id();
153  }
154
155  SyncStatusCode RegisterApp(const std::string& app_id) {
156    GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id);
157    if (!ContainsKey(file_systems_, app_id)) {
158      CannedSyncableFileSystem* file_system = new CannedSyncableFileSystem(
159          origin, in_memory_env_.get(),
160          io_task_runner_.get(), file_task_runner_.get());
161      file_system->SetUp(CannedSyncableFileSystem::QUOTA_DISABLED);
162
163      SyncStatusCode status = SYNC_STATUS_UNKNOWN;
164      local_sync_service_->MaybeInitializeFileSystemContext(
165          origin, file_system->file_system_context(),
166          CreateResultReceiver(&status));
167      base::RunLoop().RunUntilIdle();
168      EXPECT_EQ(SYNC_STATUS_OK, status);
169
170      file_system->backend()->sync_context()->
171          set_mock_notify_changes_duration_in_sec(0);
172
173      EXPECT_EQ(base::File::FILE_OK, file_system->OpenFileSystem());
174      file_systems_[app_id] = file_system;
175    }
176
177    SyncStatusCode status = SYNC_STATUS_UNKNOWN;
178    remote_sync_service_->RegisterOrigin(origin, CreateResultReceiver(&status));
179    base::RunLoop().RunUntilIdle();
180    return status;
181  }
182
183  void AddLocalFolder(const std::string& app_id,
184                      const base::FilePath::StringType& path) {
185    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
186    EXPECT_EQ(base::File::FILE_OK,
187              file_systems_[app_id]->CreateDirectory(
188                  CreateURL(app_id, path)));
189  }
190
191  void AddOrUpdateLocalFile(const std::string& app_id,
192                            const base::FilePath::StringType& path,
193                            const std::string& content) {
194    fileapi::FileSystemURL url(CreateURL(app_id, path));
195    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
196    EXPECT_EQ(base::File::FILE_OK, file_systems_[app_id]->CreateFile(url));
197    int64 bytes_written = file_systems_[app_id]->WriteString(url, content);
198    EXPECT_EQ(static_cast<int64>(content.size()), bytes_written);
199    base::RunLoop().RunUntilIdle();
200  }
201
202  void UpdateLocalFile(const std::string& app_id,
203                       const base::FilePath::StringType& path,
204                       const std::string& content) {
205    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
206    int64 bytes_written = file_systems_[app_id]->WriteString(
207        CreateURL(app_id, path), content);
208    EXPECT_EQ(static_cast<int64>(content.size()), bytes_written);
209    base::RunLoop().RunUntilIdle();
210  }
211
212  void RemoveLocal(const std::string& app_id,
213                   const base::FilePath::StringType& path) {
214    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
215    EXPECT_EQ(base::File::FILE_OK,
216              file_systems_[app_id]->Remove(
217                  CreateURL(app_id, path),
218                  true /* recursive */));
219    base::RunLoop().RunUntilIdle();
220  }
221
222  SyncStatusCode ProcessLocalChange() {
223    SyncStatusCode status = SYNC_STATUS_UNKNOWN;
224    fileapi::FileSystemURL url;
225    local_sync_service_->ProcessLocalChange(
226        CreateResultReceiver(&status, &url));
227    base::RunLoop().RunUntilIdle();
228    return status;
229  }
230
231  SyncStatusCode ProcessRemoteChange() {
232    SyncStatusCode status = SYNC_STATUS_UNKNOWN;
233    fileapi::FileSystemURL url;
234    remote_sync_service_->ProcessRemoteChange(
235        CreateResultReceiver(&status, &url));
236    base::RunLoop().RunUntilIdle();
237    return status;
238  }
239
240  int64 GetLargestChangeID() {
241    scoped_ptr<google_apis::AboutResource> about_resource;
242    EXPECT_EQ(google_apis::HTTP_SUCCESS,
243              fake_drive_service_helper()->GetAboutResource(&about_resource));
244    if (!about_resource)
245      return 0;
246    return about_resource->largest_change_id();
247  }
248
249  void FetchRemoteChanges() {
250    remote_sync_service_->OnNotificationReceived();
251    base::RunLoop().RunUntilIdle();
252  }
253
254  SyncStatusCode ProcessChangesUntilDone() {
255    SyncStatusCode local_sync_status;
256    SyncStatusCode remote_sync_status;
257    while (true) {
258      local_sync_status = ProcessLocalChange();
259      if (local_sync_status != SYNC_STATUS_OK &&
260          local_sync_status != SYNC_STATUS_NO_CHANGE_TO_SYNC &&
261          local_sync_status != SYNC_STATUS_FILE_BUSY)
262        return local_sync_status;
263
264      remote_sync_status = ProcessRemoteChange();
265      if (remote_sync_status != SYNC_STATUS_OK &&
266          remote_sync_status != SYNC_STATUS_NO_CHANGE_TO_SYNC &&
267          remote_sync_status != SYNC_STATUS_FILE_BUSY)
268        return remote_sync_status;
269
270      if (local_sync_status == SYNC_STATUS_NO_CHANGE_TO_SYNC &&
271          remote_sync_status == SYNC_STATUS_NO_CHANGE_TO_SYNC) {
272        remote_sync_service_->PromoteDemotedChanges();
273        local_sync_service_->PromoteDemotedChanges();
274
275        if (pending_remote_changes_ || pending_local_changes_)
276          continue;
277
278        int64 largest_fetched_change_id =
279            metadata_database()->GetLargestFetchedChangeID();
280        if (largest_fetched_change_id != GetLargestChangeID()) {
281          FetchRemoteChanges();
282          continue;
283        }
284        break;
285      }
286    }
287    return SYNC_STATUS_OK;
288  }
289
290  // Verifies local and remote files/folders are consistent.
291  // This function checks:
292  //  - Each registered origin has corresponding remote folder.
293  //  - Each local file/folder has corresponding remote one.
294  //  - Each remote file/folder has corresponding local one.
295  // TODO(tzik): Handle conflict case. i.e. allow remote file has different
296  // file content if the corresponding local file conflicts to it.
297  void VerifyConsistency() {
298    std::string sync_root_folder_id;
299    google_apis::GDataErrorCode error =
300        fake_drive_service_helper_->GetSyncRootFolderID(&sync_root_folder_id);
301    if (sync_root_folder_id.empty()) {
302      EXPECT_EQ(google_apis::HTTP_NOT_FOUND, error);
303      EXPECT_TRUE(file_systems_.empty());
304      return;
305    }
306    EXPECT_EQ(google_apis::HTTP_SUCCESS, error);
307
308    ScopedVector<google_apis::ResourceEntry> remote_entries;
309    EXPECT_EQ(google_apis::HTTP_SUCCESS,
310              fake_drive_service_helper_->ListFilesInFolder(
311                  sync_root_folder_id, &remote_entries));
312    std::map<std::string, const google_apis::ResourceEntry*> app_root_by_title;
313    for (ScopedVector<google_apis::ResourceEntry>::iterator itr =
314             remote_entries.begin();
315         itr != remote_entries.end();
316         ++itr) {
317      const google_apis::ResourceEntry& remote_entry = **itr;
318      EXPECT_FALSE(ContainsKey(app_root_by_title, remote_entry.title()));
319      app_root_by_title[remote_entry.title()] = *itr;
320    }
321
322    for (std::map<std::string, CannedSyncableFileSystem*>::const_iterator itr =
323             file_systems_.begin();
324         itr != file_systems_.end(); ++itr) {
325      const std::string& app_id = itr->first;
326      SCOPED_TRACE(testing::Message() << "Verifying app: " << app_id);
327      CannedSyncableFileSystem* file_system = itr->second;
328      ASSERT_TRUE(ContainsKey(app_root_by_title, app_id));
329      VerifyConsistencyForFolder(
330          app_id, base::FilePath(),
331          app_root_by_title[app_id]->resource_id(),
332          file_system);
333    }
334  }
335
336  void VerifyConsistencyForFolder(const std::string& app_id,
337                                  const base::FilePath& path,
338                                  const std::string& folder_id,
339                                  CannedSyncableFileSystem* file_system) {
340    SCOPED_TRACE(testing::Message() << "Verifying folder: " << path.value());
341
342    ScopedVector<google_apis::ResourceEntry> remote_entries;
343    EXPECT_EQ(google_apis::HTTP_SUCCESS,
344              fake_drive_service_helper_->ListFilesInFolder(
345                  folder_id, &remote_entries));
346    std::map<std::string, const google_apis::ResourceEntry*>
347        remote_entry_by_title;
348    for (size_t i = 0; i < remote_entries.size(); ++i) {
349      google_apis::ResourceEntry* remote_entry = remote_entries[i];
350      EXPECT_FALSE(ContainsKey(remote_entry_by_title, remote_entry->title()))
351          << "title: " << remote_entry->title();
352      remote_entry_by_title[remote_entry->title()] = remote_entry;
353    }
354
355    fileapi::FileSystemURL url(CreateURL(app_id, path));
356    FileEntryList local_entries;
357    EXPECT_EQ(base::File::FILE_OK,
358              file_system->ReadDirectory(url, &local_entries));
359    for (FileEntryList::iterator itr = local_entries.begin();
360         itr != local_entries.end();
361         ++itr) {
362      const fileapi::DirectoryEntry& local_entry = *itr;
363      fileapi::FileSystemURL entry_url(
364          CreateURL(app_id, path.Append(local_entry.name)));
365      std::string title =
366          fileapi::VirtualPath::BaseName(entry_url.path()).AsUTF8Unsafe();
367      SCOPED_TRACE(testing::Message() << "Verifying entry: " << title);
368
369      ASSERT_TRUE(ContainsKey(remote_entry_by_title, title));
370      const google_apis::ResourceEntry& remote_entry =
371          *remote_entry_by_title[title];
372      if (local_entry.is_directory) {
373        ASSERT_TRUE(remote_entry.is_folder());
374        VerifyConsistencyForFolder(app_id, entry_url.path(),
375                                   remote_entry.resource_id(),
376                                   file_system);
377      } else {
378        ASSERT_TRUE(remote_entry.is_file());
379        VerifyConsistencyForFile(app_id, entry_url.path(),
380                                 remote_entry.resource_id(),
381                                 file_system);
382      }
383      remote_entry_by_title.erase(title);
384    }
385
386    EXPECT_TRUE(remote_entry_by_title.empty());
387  }
388
389  void VerifyConsistencyForFile(const std::string& app_id,
390                                const base::FilePath& path,
391                                const std::string& file_id,
392                                CannedSyncableFileSystem* file_system) {
393    fileapi::FileSystemURL url(CreateURL(app_id, path));
394    std::string file_content;
395    EXPECT_EQ(google_apis::HTTP_SUCCESS,
396              fake_drive_service_helper_->ReadFile(file_id, &file_content));
397    EXPECT_EQ(base::File::FILE_OK,
398              file_system->VerifyFile(url, file_content));
399  }
400
401  size_t CountApp() {
402    return file_systems_.size();
403  }
404
405  size_t CountLocalFile(const std::string& app_id) {
406    if (!ContainsKey(file_systems_, app_id))
407      return 0;
408
409    CannedSyncableFileSystem* file_system = file_systems_[app_id];
410    std::stack<base::FilePath> folders;
411    folders.push(base::FilePath());  // root folder
412
413    size_t result = 1;
414    while (!folders.empty()) {
415      fileapi::FileSystemURL url(CreateURL(app_id, folders.top()));
416      folders.pop();
417
418      FileEntryList entries;
419      EXPECT_EQ(base::File::FILE_OK,
420                file_system->ReadDirectory(url, &entries));
421      for (FileEntryList::iterator itr = entries.begin();
422           itr != entries.end(); ++itr) {
423        ++result;
424        if (itr->is_directory)
425          folders.push(url.path().Append(itr->name));
426      }
427    }
428
429    return result;
430  }
431
432  void VerifyLocalFile(const std::string& app_id,
433                       const base::FilePath::StringType& path,
434                       const std::string& content) {
435    SCOPED_TRACE(testing::Message() << "Verifying local file: "
436                                    << "app_id = " << app_id
437                                    << ", path = " << path);
438    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
439    EXPECT_EQ(base::File::FILE_OK,
440              file_systems_[app_id]->VerifyFile(
441                  CreateURL(app_id, path), content));
442  }
443
444  void VerifyLocalFolder(const std::string& app_id,
445                         const base::FilePath::StringType& path) {
446    SCOPED_TRACE(testing::Message() << "Verifying local file: "
447                                    << "app_id = " << app_id
448                                    << ", path = " << path);
449    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
450    EXPECT_EQ(base::File::FILE_OK,
451              file_systems_[app_id]->DirectoryExists(CreateURL(app_id, path)));
452  }
453
454  size_t CountMetadata() {
455    return metadata_database()->CountFileMetadata();
456  }
457
458  size_t CountTracker() {
459    return metadata_database()->CountFileTracker();
460  }
461
462  drive::FakeDriveService* fake_drive_service() {
463    return static_cast<drive::FakeDriveService*>(
464        remote_sync_service_->GetDriveService());
465  }
466
467  FakeDriveServiceHelper* fake_drive_service_helper() {
468    return fake_drive_service_helper_.get();
469  }
470
471  MetadataDatabase* metadata_database() {
472    return remote_sync_service_->GetMetadataDatabase();
473  }
474
475 private:
476  content::TestBrowserThreadBundle thread_bundle_;
477  ScopedEnableSyncFSV2 enable_syncfs_v2_;
478
479  base::ScopedTempDir base_dir_;
480  scoped_ptr<leveldb::Env> in_memory_env_;
481  TestingProfile profile_;
482
483  scoped_ptr<SyncEngine> remote_sync_service_;
484  scoped_ptr<LocalFileSyncService> local_sync_service_;
485
486  int64 pending_remote_changes_;
487  int64 pending_local_changes_;
488
489  scoped_ptr<FakeDriveServiceHelper> fake_drive_service_helper_;
490  std::map<std::string, CannedSyncableFileSystem*> file_systems_;
491
492
493  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
494  scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
495
496  DISALLOW_COPY_AND_ASSIGN(DriveBackendSyncTest);
497};
498
499TEST_F(DriveBackendSyncTest, LocalToRemoteBasicTest) {
500  std::string app_id = "example";
501
502  RegisterApp(app_id);
503  AddOrUpdateLocalFile(app_id, FPL("file"), "abcde");
504
505  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
506  VerifyConsistency();
507
508  EXPECT_EQ(1u, CountApp());
509  EXPECT_EQ(2u, CountLocalFile(app_id));
510  VerifyLocalFile(app_id, FPL("file"), "abcde");
511
512  EXPECT_EQ(3u, CountMetadata());
513  EXPECT_EQ(3u, CountTracker());
514}
515
516TEST_F(DriveBackendSyncTest, RemoteToLocalBasicTest) {
517  std::string app_id = "example";
518  RegisterApp(app_id);
519
520  std::string app_root_folder_id;
521  EXPECT_TRUE(GetAppRootFolderID(app_id, &app_root_folder_id));
522
523  std::string file_id;
524  EXPECT_EQ(google_apis::HTTP_SUCCESS,
525            fake_drive_service_helper()->AddFile(
526                app_root_folder_id, "file", "abcde", &file_id));
527
528  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
529  VerifyConsistency();
530
531  EXPECT_EQ(1u, CountApp());
532  EXPECT_EQ(2u, CountLocalFile(app_id));
533  VerifyLocalFile(app_id, FPL("file"), "abcde");
534
535  EXPECT_EQ(3u, CountMetadata());
536  EXPECT_EQ(3u, CountTracker());
537}
538
539TEST_F(DriveBackendSyncTest, LocalFileUpdateTest) {
540  std::string app_id = "example";
541  const base::FilePath::StringType kPath(FPL("file"));
542
543  RegisterApp(app_id);
544  AddOrUpdateLocalFile(app_id, kPath, "abcde");
545
546  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
547  VerifyConsistency();
548
549  UpdateLocalFile(app_id, kPath, "1234567890");
550
551  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
552  VerifyConsistency();
553
554  EXPECT_EQ(1u, CountApp());
555  EXPECT_EQ(2u, CountLocalFile(app_id));
556  VerifyLocalFile(app_id, FPL("file"), "1234567890");
557
558  EXPECT_EQ(3u, CountMetadata());
559  EXPECT_EQ(3u, CountTracker());
560}
561
562TEST_F(DriveBackendSyncTest, RemoteFileUpdateTest) {
563  std::string app_id = "example";
564
565  RegisterApp(app_id);
566  std::string remote_file_id;
567  std::string app_root_folder_id;
568  EXPECT_TRUE(GetAppRootFolderID(app_id, &app_root_folder_id));
569  EXPECT_EQ(google_apis::HTTP_SUCCESS,
570            fake_drive_service_helper()->AddFile(
571                app_root_folder_id, "file", "abcde", &remote_file_id));
572
573  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
574  VerifyConsistency();
575
576  EXPECT_EQ(google_apis::HTTP_SUCCESS,
577            fake_drive_service_helper()->UpdateFile(
578                remote_file_id, "1234567890"));
579
580  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
581  VerifyConsistency();
582
583  EXPECT_EQ(1u, CountApp());
584  EXPECT_EQ(2u, CountLocalFile(app_id));
585  VerifyLocalFile(app_id, FPL("file"), "1234567890");
586
587  EXPECT_EQ(3u, CountMetadata());
588  EXPECT_EQ(3u, CountTracker());
589}
590
591TEST_F(DriveBackendSyncTest, LocalFileDeletionTest) {
592  std::string app_id = "example";
593  const base::FilePath::StringType path(FPL("file"));
594
595  RegisterApp(app_id);
596  AddOrUpdateLocalFile(app_id, path, "abcde");
597
598  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
599  VerifyConsistency();
600
601  RemoveLocal(app_id, path);
602
603  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
604  VerifyConsistency();
605
606  EXPECT_EQ(1u, CountApp());
607  EXPECT_EQ(1u, CountLocalFile(app_id));
608
609  EXPECT_EQ(2u, CountMetadata());
610  EXPECT_EQ(2u, CountTracker());
611}
612
613TEST_F(DriveBackendSyncTest, RemoteFileDeletionTest) {
614  std::string app_id = "example";
615  const base::FilePath::StringType path(FPL("file"));
616
617  RegisterApp(app_id);
618  AddOrUpdateLocalFile(app_id, path, "abcde");
619
620  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
621  VerifyConsistency();
622
623  std::string file_id = GetFileIDByPath(app_id, path);
624  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
625            fake_drive_service_helper()->DeleteResource(file_id));
626
627  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
628  VerifyConsistency();
629
630  EXPECT_EQ(1u, CountApp());
631  EXPECT_EQ(1u, CountLocalFile(app_id));
632
633  EXPECT_EQ(2u, CountMetadata());
634  EXPECT_EQ(2u, CountTracker());
635}
636
637TEST_F(DriveBackendSyncTest, RemoteRenameTest) {
638  std::string app_id = "example";
639  const base::FilePath::StringType path(FPL("file"));
640
641  RegisterApp(app_id);
642  AddOrUpdateLocalFile(app_id, path, "abcde");
643
644  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
645  VerifyConsistency();
646
647  std::string file_id = GetFileIDByPath(app_id, path);
648  EXPECT_EQ(google_apis::HTTP_SUCCESS,
649            fake_drive_service_helper()->RenameResource(
650                file_id, "renamed_file"));
651
652  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
653  VerifyConsistency();
654
655  EXPECT_EQ(1u, CountApp());
656  EXPECT_EQ(2u, CountLocalFile(app_id));
657  VerifyLocalFile(app_id, FPL("renamed_file"), "abcde");
658
659  EXPECT_EQ(3u, CountMetadata());
660  EXPECT_EQ(3u, CountTracker());
661}
662
663TEST_F(DriveBackendSyncTest, RemoteRenameAndRevertTest) {
664  std::string app_id = "example";
665  const base::FilePath::StringType path(FPL("file"));
666
667  RegisterApp(app_id);
668  AddOrUpdateLocalFile(app_id, path, "abcde");
669
670  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
671  VerifyConsistency();
672
673  std::string file_id = GetFileIDByPath(app_id, path);
674  EXPECT_EQ(google_apis::HTTP_SUCCESS,
675            fake_drive_service_helper()->RenameResource(
676                file_id, "renamed_file"));
677
678  FetchRemoteChanges();
679
680  EXPECT_EQ(google_apis::HTTP_SUCCESS,
681            fake_drive_service_helper()->RenameResource(
682                file_id, base::FilePath(path).AsUTF8Unsafe()));
683
684  FetchRemoteChanges();
685
686  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
687  VerifyConsistency();
688
689  EXPECT_EQ(1u, CountApp());
690  EXPECT_EQ(2u, CountLocalFile(app_id));
691  VerifyLocalFile(app_id, FPL("file"), "abcde");
692
693  EXPECT_EQ(3u, CountMetadata());
694  EXPECT_EQ(3u, CountTracker());
695}
696
697TEST_F(DriveBackendSyncTest, ReorganizeToOtherFolder) {
698  std::string app_id = "example";
699  const base::FilePath::StringType path(FPL("file"));
700
701  RegisterApp(app_id);
702  AddLocalFolder(app_id, FPL("folder_src"));
703  AddLocalFolder(app_id, FPL("folder_dest"));
704  AddOrUpdateLocalFile(app_id, FPL("folder_src/file"), "abcde");
705
706  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
707  VerifyConsistency();
708
709  std::string file_id = GetFileIDByPath(app_id, FPL("folder_src/file"));
710  std::string src_folder_id = GetFileIDByPath(app_id, FPL("folder_src"));
711  std::string dest_folder_id = GetFileIDByPath(app_id, FPL("folder_dest"));
712  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
713            fake_drive_service_helper()->RemoveResourceFromDirectory(
714                src_folder_id, file_id));
715  EXPECT_EQ(google_apis::HTTP_SUCCESS,
716            fake_drive_service_helper()->AddResourceToDirectory(
717                dest_folder_id, file_id));
718
719  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
720  VerifyConsistency();
721
722  EXPECT_EQ(1u, CountApp());
723  EXPECT_EQ(4u, CountLocalFile(app_id));
724  VerifyLocalFolder(app_id, FPL("folder_dest"));
725  VerifyLocalFile(app_id, FPL("folder_dest/file"), "abcde");
726
727  EXPECT_EQ(5u, CountMetadata());
728  EXPECT_EQ(5u, CountTracker());
729}
730
731TEST_F(DriveBackendSyncTest, ReorganizeToOtherApp) {
732  std::string src_app_id = "src_app";
733  std::string dest_app_id = "dest_app";
734
735  RegisterApp(src_app_id);
736  RegisterApp(dest_app_id);
737
738  AddLocalFolder(src_app_id, FPL("folder_src"));
739  AddLocalFolder(dest_app_id, FPL("folder_dest"));
740  AddOrUpdateLocalFile(src_app_id, FPL("folder_src/file"), "abcde");
741
742  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
743  VerifyConsistency();
744
745  std::string file_id = GetFileIDByPath(src_app_id, FPL("folder_src/file"));
746  std::string src_folder_id = GetFileIDByPath(src_app_id, FPL("folder_src"));
747  std::string dest_folder_id = GetFileIDByPath(dest_app_id, FPL("folder_dest"));
748  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
749            fake_drive_service_helper()->RemoveResourceFromDirectory(
750                src_folder_id, file_id));
751  EXPECT_EQ(google_apis::HTTP_SUCCESS,
752            fake_drive_service_helper()->AddResourceToDirectory(
753                dest_folder_id, file_id));
754
755  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
756  VerifyConsistency();
757
758  EXPECT_EQ(2u, CountApp());
759  EXPECT_EQ(2u, CountLocalFile(src_app_id));
760  EXPECT_EQ(3u, CountLocalFile(dest_app_id));
761  VerifyLocalFile(dest_app_id, FPL("folder_dest/file"), "abcde");
762
763  EXPECT_EQ(6u, CountMetadata());
764  EXPECT_EQ(6u, CountTracker());
765}
766
767TEST_F(DriveBackendSyncTest, ReorganizeToUnmanagedArea) {
768  std::string app_id = "example";
769
770  RegisterApp(app_id);
771
772  AddLocalFolder(app_id, FPL("folder_src"));
773  AddOrUpdateLocalFile(app_id, FPL("folder_src/file_orphaned"), "abcde");
774  AddOrUpdateLocalFile(app_id, FPL("folder_src/file_under_sync_root"), "123");
775  AddOrUpdateLocalFile(app_id, FPL("folder_src/file_under_drive_root"), "hoge");
776
777  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
778  VerifyConsistency();
779
780  std::string file_orphaned_id =
781      GetFileIDByPath(app_id, FPL("folder_src/file_orphaned"));
782  std::string file_under_sync_root_id =
783      GetFileIDByPath(app_id, FPL("folder_src/file_under_sync_root"));
784  std::string file_under_drive_root_id =
785      GetFileIDByPath(app_id, FPL("folder_src/file_under_drive_root"));
786
787  std::string folder_id = GetFileIDByPath(app_id, FPL("folder_src"));
788  std::string sync_root_folder_id;
789  EXPECT_EQ(google_apis::HTTP_SUCCESS,
790            fake_drive_service_helper()->GetSyncRootFolderID(
791                &sync_root_folder_id));
792
793  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
794            fake_drive_service_helper()->RemoveResourceFromDirectory(
795                folder_id, file_orphaned_id));
796  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
797            fake_drive_service_helper()->RemoveResourceFromDirectory(
798                folder_id, file_under_sync_root_id));
799  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
800            fake_drive_service_helper()->RemoveResourceFromDirectory(
801                folder_id, file_under_drive_root_id));
802
803  EXPECT_EQ(google_apis::HTTP_SUCCESS,
804            fake_drive_service_helper()->AddResourceToDirectory(
805                sync_root_folder_id, file_under_sync_root_id));
806  EXPECT_EQ(google_apis::HTTP_SUCCESS,
807            fake_drive_service_helper()->AddResourceToDirectory(
808                fake_drive_service()->GetRootResourceId(),
809                file_under_drive_root_id));
810
811  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
812  VerifyConsistency();
813
814  EXPECT_EQ(1u, CountApp());
815  EXPECT_EQ(2u, CountLocalFile(app_id));
816
817  EXPECT_EQ(4u, CountMetadata());
818  EXPECT_EQ(4u, CountTracker());
819}
820
821TEST_F(DriveBackendSyncTest, ReorganizeToMultipleParents) {
822  std::string app_id = "example";
823
824  RegisterApp(app_id);
825
826  AddLocalFolder(app_id, FPL("parent1"));
827  AddLocalFolder(app_id, FPL("parent2"));
828  AddOrUpdateLocalFile(app_id, FPL("parent1/file"), "abcde");
829
830  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
831  VerifyConsistency();
832
833  std::string file_id = GetFileIDByPath(app_id, FPL("parent1/file"));
834  std::string parent2_folder_id = GetFileIDByPath(app_id, FPL("parent2"));
835  EXPECT_EQ(google_apis::HTTP_SUCCESS,
836            fake_drive_service_helper()->AddResourceToDirectory(
837                parent2_folder_id, file_id));
838
839  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
840  VerifyConsistency();
841
842  EXPECT_EQ(1u, CountApp());
843  EXPECT_EQ(4u, CountLocalFile(app_id));
844  VerifyLocalFolder(app_id, FPL("parent1"));
845  VerifyLocalFolder(app_id, FPL("parent2"));
846  VerifyLocalFile(app_id, FPL("parent1/file"), "abcde");
847
848  EXPECT_EQ(5u, CountMetadata());
849  EXPECT_EQ(5u, CountTracker());
850}
851
852TEST_F(DriveBackendSyncTest, ReorganizeAndRevert) {
853  std::string app_id = "example";
854
855  RegisterApp(app_id);
856
857  AddLocalFolder(app_id, FPL("folder"));
858  AddLocalFolder(app_id, FPL("folder_temp"));
859  AddOrUpdateLocalFile(app_id, FPL("folder/file"), "abcde");
860
861  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
862  VerifyConsistency();
863
864  std::string file_id = GetFileIDByPath(app_id, FPL("folder/file"));
865  std::string folder_id = GetFileIDByPath(app_id, FPL("folder"));
866  std::string folder_temp_id = GetFileIDByPath(app_id, FPL("folder_temp"));
867  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
868            fake_drive_service_helper()->RemoveResourceFromDirectory(
869                folder_id, file_id));
870  EXPECT_EQ(google_apis::HTTP_SUCCESS,
871            fake_drive_service_helper()->AddResourceToDirectory(
872                folder_temp_id, file_id));
873
874  FetchRemoteChanges();
875
876  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
877            fake_drive_service_helper()->RemoveResourceFromDirectory(
878                folder_temp_id, file_id));
879  EXPECT_EQ(google_apis::HTTP_SUCCESS,
880            fake_drive_service_helper()->AddResourceToDirectory(
881                folder_id, file_id));
882
883  FetchRemoteChanges();
884
885  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
886  VerifyConsistency();
887
888  EXPECT_EQ(1u, CountApp());
889  EXPECT_EQ(4u, CountLocalFile(app_id));
890  VerifyLocalFolder(app_id, FPL("folder"));
891  VerifyLocalFile(app_id, FPL("folder/file"), "abcde");
892
893  EXPECT_EQ(5u, CountMetadata());
894  EXPECT_EQ(5u, CountTracker());
895}
896
897TEST_F(DriveBackendSyncTest, ConflictTest_AddFolder_AddFolder) {
898  std::string app_id = "example";
899
900  RegisterApp(app_id);
901  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
902
903  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
904  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
905
906  std::string remote_folder_id;
907  EXPECT_EQ(google_apis::HTTP_CREATED,
908            fake_drive_service_helper()->AddFolder(
909                app_root_folder_id,
910                "conflict_to_pending_remote", &remote_folder_id));
911
912  FetchRemoteChanges();
913
914  EXPECT_EQ(google_apis::HTTP_CREATED,
915            fake_drive_service_helper()->AddFolder(
916                app_root_folder_id,
917                "conflict_to_existing_remote", &remote_folder_id));
918
919  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
920  VerifyConsistency();
921
922  EXPECT_EQ(1u, CountApp());
923  EXPECT_EQ(3u, CountLocalFile(app_id));
924  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
925  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
926
927  EXPECT_EQ(4u, CountMetadata());
928  EXPECT_EQ(4u, CountTracker());
929}
930
931TEST_F(DriveBackendSyncTest, ConflictTest_AddFolder_DeleteFolder) {
932  std::string app_id = "example";
933
934  RegisterApp(app_id);
935
936  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
937  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
938
939  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
940  VerifyConsistency();
941
942  // Test body starts from here.
943  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
944  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
945  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
946  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
947
948  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
949            fake_drive_service_helper()->DeleteResource(
950                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
951
952  FetchRemoteChanges();
953
954  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
955            fake_drive_service_helper()->DeleteResource(
956                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
957
958  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
959  VerifyConsistency();
960
961  EXPECT_EQ(1u, CountApp());
962  EXPECT_EQ(2u, CountLocalFile(app_id));
963  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
964
965  EXPECT_EQ(3u, CountMetadata());
966  EXPECT_EQ(3u, CountTracker());
967}
968
969TEST_F(DriveBackendSyncTest, ConflictTest_AddFolder_AddFile) {
970  std::string app_id = "example";
971
972  RegisterApp(app_id);
973  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
974
975  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
976  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
977
978  std::string file_id;
979  EXPECT_EQ(google_apis::HTTP_SUCCESS,
980            fake_drive_service_helper()->AddFile(
981                app_root_folder_id, "conflict_to_pending_remote", "foo",
982                &file_id));
983  EXPECT_EQ(google_apis::HTTP_SUCCESS,
984            fake_drive_service_helper()->UpdateModificationTime(
985                file_id,
986                base::Time::Now() + base::TimeDelta::FromDays(1)));
987
988  FetchRemoteChanges();
989
990  EXPECT_EQ(google_apis::HTTP_SUCCESS,
991            fake_drive_service_helper()->AddFile(
992                app_root_folder_id, "conflict_to_existing_remote", "foo",
993                &file_id));
994  EXPECT_EQ(google_apis::HTTP_SUCCESS,
995            fake_drive_service_helper()->UpdateModificationTime(
996                file_id,
997                base::Time::Now() + base::TimeDelta::FromDays(1)));
998
999  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1000  VerifyConsistency();
1001
1002  EXPECT_EQ(1u, CountApp());
1003  EXPECT_EQ(3u, CountLocalFile(app_id));
1004  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1005  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1006
1007  EXPECT_EQ(4u, CountMetadata());
1008  EXPECT_EQ(4u, CountTracker());
1009}
1010
1011TEST_F(DriveBackendSyncTest, ConflictTest_AddFolder_DeleteFile) {
1012  std::string app_id = "example";
1013
1014  RegisterApp(app_id);
1015  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1016
1017  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1018  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1019
1020  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1021  VerifyConsistency();
1022
1023  // Test body starts from here.
1024  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1025  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1026
1027  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1028  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1029
1030  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1031            fake_drive_service_helper()->DeleteResource(
1032                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
1033
1034  FetchRemoteChanges();
1035
1036  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1037            fake_drive_service_helper()->DeleteResource(
1038                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1039
1040  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1041  VerifyConsistency();
1042
1043  EXPECT_EQ(1u, CountApp());
1044  EXPECT_EQ(3u, CountLocalFile(app_id));
1045  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1046  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1047
1048  EXPECT_EQ(4u, CountMetadata());
1049  EXPECT_EQ(4u, CountTracker());
1050}
1051
1052TEST_F(DriveBackendSyncTest, ConflictTest_DeleteFolder_AddFolder) {
1053  std::string app_id = "example";
1054
1055  RegisterApp(app_id);
1056  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1057  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1058  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1059
1060  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1061  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1062
1063  std::string file_id;
1064  EXPECT_EQ(google_apis::HTTP_CREATED,
1065            fake_drive_service_helper()->AddFolder(
1066                app_root_folder_id,
1067                "conflict_to_pending_remote", &file_id));
1068
1069  FetchRemoteChanges();
1070
1071  EXPECT_EQ(google_apis::HTTP_CREATED,
1072            fake_drive_service_helper()->AddFolder(
1073                app_root_folder_id,
1074                "conflict_to_existing_remote", NULL));
1075
1076  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1077  VerifyConsistency();
1078
1079  EXPECT_EQ(1u, CountApp());
1080  EXPECT_EQ(3u, CountLocalFile(app_id));
1081  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1082  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1083
1084  EXPECT_EQ(4u, CountMetadata());
1085  EXPECT_EQ(4u, CountTracker());
1086}
1087
1088TEST_F(DriveBackendSyncTest, ConflictTest_DeleteFolder_DeleteFolder) {
1089  std::string app_id = "example";
1090
1091  RegisterApp(app_id);
1092  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1093
1094  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1095  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1096
1097  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1098  VerifyConsistency();
1099
1100  // Test body starts from here.
1101  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1102  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1103
1104  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1105            fake_drive_service_helper()->DeleteResource(
1106                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
1107
1108  FetchRemoteChanges();
1109
1110  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1111            fake_drive_service_helper()->DeleteResource(
1112                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1113
1114  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1115  VerifyConsistency();
1116
1117  EXPECT_EQ(1u, CountApp());
1118  EXPECT_EQ(1u, CountLocalFile(app_id));
1119
1120  EXPECT_EQ(2u, CountMetadata());
1121  EXPECT_EQ(2u, CountTracker());
1122}
1123
1124TEST_F(DriveBackendSyncTest, ConflictTest_DeleteFolder_AddFile) {
1125  std::string app_id = "example";
1126
1127  RegisterApp(app_id);
1128  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1129
1130  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1131  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1132  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1133  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1134
1135  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1136            fake_drive_service_helper()->AddFile(
1137                app_root_folder_id, "conflict_to_pending_remote", "foo", NULL));
1138
1139  FetchRemoteChanges();
1140
1141  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1142            fake_drive_service_helper()->AddFile(
1143                app_root_folder_id, "conflict_to_existing_remote", "bar",
1144                NULL));
1145
1146  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1147  VerifyConsistency();
1148
1149  EXPECT_EQ(1u, CountApp());
1150  EXPECT_EQ(3u, CountLocalFile(app_id));
1151  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1152  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1153
1154  EXPECT_EQ(4u, CountMetadata());
1155  EXPECT_EQ(4u, CountTracker());
1156}
1157
1158TEST_F(DriveBackendSyncTest, ConflictTest_DeleteFolder_DeleteFile) {
1159  std::string app_id = "example";
1160
1161  RegisterApp(app_id);
1162  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1163  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1164  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1165
1166  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1167  VerifyConsistency();
1168
1169  // Test body starts from here.
1170  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1171  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1172
1173  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1174            fake_drive_service_helper()->DeleteResource(
1175                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
1176
1177  FetchRemoteChanges();
1178
1179  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1180            fake_drive_service_helper()->DeleteResource(
1181                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1182
1183  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1184  VerifyConsistency();
1185
1186  EXPECT_EQ(1u, CountApp());
1187  EXPECT_EQ(1u, CountLocalFile(app_id));
1188
1189  EXPECT_EQ(2u, CountMetadata());
1190  EXPECT_EQ(2u, CountTracker());
1191}
1192
1193TEST_F(DriveBackendSyncTest, ConflictTest_AddFile_AddFolder) {
1194  std::string app_id = "example";
1195
1196  RegisterApp(app_id);
1197  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1198
1199  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1200  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1201
1202  std::string file_id;
1203  EXPECT_EQ(google_apis::HTTP_CREATED,
1204            fake_drive_service_helper()->AddFolder(
1205                app_root_folder_id, "conflict_to_pending_remote",
1206                &file_id));
1207  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1208            fake_drive_service_helper()->UpdateModificationTime(
1209                file_id,
1210                base::Time::Now() - base::TimeDelta::FromDays(1)));
1211
1212  FetchRemoteChanges();
1213
1214  EXPECT_EQ(google_apis::HTTP_CREATED,
1215            fake_drive_service_helper()->AddFolder(
1216                app_root_folder_id, "conflict_to_existing_remote",
1217                &file_id));
1218  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1219            fake_drive_service_helper()->UpdateModificationTime(
1220                file_id,
1221                base::Time::Now() - base::TimeDelta::FromDays(1)));
1222
1223  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1224  VerifyConsistency();
1225
1226  EXPECT_EQ(1u, CountApp());
1227  EXPECT_EQ(3u, CountLocalFile(app_id));
1228  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1229  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1230
1231  EXPECT_EQ(4u, CountMetadata());
1232  EXPECT_EQ(4u, CountTracker());
1233}
1234
1235TEST_F(DriveBackendSyncTest, ConflictTest_AddFile_DeleteFolder) {
1236  std::string app_id = "example";
1237
1238  RegisterApp(app_id);
1239  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1240
1241  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1242  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1243
1244  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1245  VerifyConsistency();
1246
1247  // Test body starts from here.
1248  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1249  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1250  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1251  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1252
1253  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1254            fake_drive_service_helper()->DeleteResource(
1255                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
1256
1257  FetchRemoteChanges();
1258
1259  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1260            fake_drive_service_helper()->DeleteResource(
1261                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1262
1263  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1264  VerifyConsistency();
1265
1266  EXPECT_EQ(1u, CountApp());
1267  EXPECT_EQ(3u, CountLocalFile(app_id));
1268  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1269  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1270
1271  EXPECT_EQ(4u, CountMetadata());
1272  EXPECT_EQ(4u, CountTracker());
1273}
1274
1275TEST_F(DriveBackendSyncTest, ConflictTest_AddFile_AddFile) {
1276  std::string app_id = "example";
1277
1278  RegisterApp(app_id);
1279
1280  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1281  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
1282  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
1283
1284  std::string file_id;
1285  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1286            fake_drive_service_helper()->AddFile(
1287                app_root_folder_id, "conflict_to_pending_remote", "foo",
1288                &file_id));
1289  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1290            fake_drive_service_helper()->UpdateModificationTime(
1291                file_id,
1292                base::Time::Now() + base::TimeDelta::FromDays(1)));
1293
1294  FetchRemoteChanges();
1295
1296  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1297            fake_drive_service_helper()->AddFile(
1298                app_root_folder_id, "conflict_to_existing_remote", "bar",
1299                &file_id));
1300  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1301            fake_drive_service_helper()->UpdateModificationTime(
1302                file_id,
1303                base::Time::Now() + base::TimeDelta::FromDays(1)));
1304
1305  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1306  VerifyConsistency();
1307
1308  EXPECT_EQ(1u, CountApp());
1309  EXPECT_EQ(3u, CountLocalFile(app_id));
1310  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1311  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1312
1313  EXPECT_EQ(4u, CountMetadata());
1314  EXPECT_EQ(4u, CountTracker());
1315}
1316
1317TEST_F(DriveBackendSyncTest, ConflictTest_AddFile_DeleteFile) {
1318  std::string app_id = "example";
1319
1320  RegisterApp(app_id);
1321
1322  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1323  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1324
1325  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1326  VerifyConsistency();
1327
1328  // Test body starts from here.
1329  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1330  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1331  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
1332  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
1333
1334  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1335            fake_drive_service_helper()->DeleteResource(
1336                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
1337
1338  FetchRemoteChanges();
1339
1340  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1341            fake_drive_service_helper()->DeleteResource(
1342                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1343
1344  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1345  VerifyConsistency();
1346
1347  EXPECT_EQ(1u, CountApp());
1348  EXPECT_EQ(3u, CountLocalFile(app_id));
1349  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
1350  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
1351
1352  EXPECT_EQ(4u, CountMetadata());
1353  EXPECT_EQ(4u, CountTracker());
1354}
1355
1356TEST_F(DriveBackendSyncTest, ConflictTest_UpdateFile_DeleteFile) {
1357  std::string app_id = "example";
1358
1359  RegisterApp(app_id);
1360
1361  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1362  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1363
1364  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1365  VerifyConsistency();
1366
1367  // Test body starts from here.
1368  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
1369  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
1370
1371  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1372            fake_drive_service_helper()->DeleteResource(
1373                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
1374
1375  FetchRemoteChanges();
1376
1377  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1378            fake_drive_service_helper()->DeleteResource(
1379                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1380
1381  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1382  VerifyConsistency();
1383
1384  EXPECT_EQ(1u, CountApp());
1385  EXPECT_EQ(3u, CountLocalFile(app_id));
1386  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
1387  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
1388
1389  EXPECT_EQ(4u, CountMetadata());
1390  EXPECT_EQ(4u, CountTracker());
1391}
1392
1393TEST_F(DriveBackendSyncTest, ConflictTest_DeleteFile_AddFolder) {
1394  std::string app_id = "example";
1395
1396  RegisterApp(app_id);
1397
1398  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1399  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1400  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1401
1402  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1403  VerifyConsistency();
1404
1405  // Test body starts from here.
1406  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1407  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1408
1409  EXPECT_EQ(google_apis::HTTP_CREATED,
1410            fake_drive_service_helper()->AddFolder(
1411                app_root_folder_id, "conflict_to_pending_remote", NULL));
1412
1413  FetchRemoteChanges();
1414
1415  EXPECT_EQ(google_apis::HTTP_CREATED,
1416            fake_drive_service_helper()->AddFolder(
1417                app_root_folder_id, "conflict_to_existing_remote", NULL));
1418
1419  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1420  VerifyConsistency();
1421
1422  EXPECT_EQ(1u, CountApp());
1423  EXPECT_EQ(3u, CountLocalFile(app_id));
1424  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1425  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1426
1427  EXPECT_EQ(4u, CountMetadata());
1428  EXPECT_EQ(4u, CountTracker());
1429}
1430
1431TEST_F(DriveBackendSyncTest, ConflictTest_DeleteFile_DeleteFolder) {
1432  std::string app_id = "example";
1433
1434  RegisterApp(app_id);
1435
1436  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1437  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1438
1439  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1440  VerifyConsistency();
1441
1442  // Test body starts from here.
1443  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1444  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1445
1446  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1447  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1448
1449  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1450  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1451
1452  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1453            fake_drive_service_helper()->DeleteResource(
1454                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
1455
1456  FetchRemoteChanges();
1457
1458  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1459            fake_drive_service_helper()->DeleteResource(
1460                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1461
1462  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1463  VerifyConsistency();
1464
1465  EXPECT_EQ(1u, CountApp());
1466  EXPECT_EQ(1u, CountLocalFile(app_id));
1467
1468  EXPECT_EQ(2u, CountMetadata());
1469  EXPECT_EQ(2u, CountTracker());
1470}
1471
1472TEST_F(DriveBackendSyncTest, ConflictTest_DeleteFile_AddFile) {
1473  std::string app_id = "example";
1474
1475  RegisterApp(app_id);
1476
1477  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1478  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1479  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1480  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1481  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1482
1483  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1484            fake_drive_service_helper()->AddFile(
1485                app_root_folder_id, "conflict_to_pending_remote", "hoge",
1486                NULL));
1487
1488  FetchRemoteChanges();
1489
1490  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1491            fake_drive_service_helper()->AddFile(
1492                app_root_folder_id, "conflict_to_existing_remote", "fuga",
1493                NULL));
1494
1495  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1496  VerifyConsistency();
1497
1498  EXPECT_EQ(1u, CountApp());
1499  EXPECT_EQ(3u, CountLocalFile(app_id));
1500  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
1501  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
1502
1503  EXPECT_EQ(4u, CountMetadata());
1504  EXPECT_EQ(4u, CountTracker());
1505}
1506
1507TEST_F(DriveBackendSyncTest, ConflictTest_DeleteFile_UpdateFile) {
1508  std::string app_id = "example";
1509
1510  RegisterApp(app_id);
1511
1512  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1513  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1514  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1515
1516  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1517  VerifyConsistency();
1518
1519  // Test body starts from here.
1520  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1521  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1522
1523  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1524            fake_drive_service_helper()->UpdateFile(
1525                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote")),
1526                "hoge"));
1527
1528  FetchRemoteChanges();
1529
1530  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1531            fake_drive_service_helper()->UpdateFile(
1532                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote")),
1533                "fuga"));
1534
1535  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1536  VerifyConsistency();
1537
1538  EXPECT_EQ(1u, CountApp());
1539  EXPECT_EQ(3u, CountLocalFile(app_id));
1540  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
1541  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
1542
1543  EXPECT_EQ(4u, CountMetadata());
1544  EXPECT_EQ(4u, CountTracker());
1545}
1546
1547TEST_F(DriveBackendSyncTest, ConflictTest_DeleteFile_DeleteFile) {
1548  std::string app_id = "example";
1549
1550  RegisterApp(app_id);
1551
1552  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1553  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1554  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1555
1556  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1557  VerifyConsistency();
1558
1559  // Test body starts from here.
1560  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1561  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1562
1563  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1564            fake_drive_service_helper()->DeleteResource(
1565                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
1566
1567  FetchRemoteChanges();
1568
1569  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1570            fake_drive_service_helper()->DeleteResource(
1571                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1572
1573  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1574  VerifyConsistency();
1575
1576  EXPECT_EQ(1u, CountApp());
1577  EXPECT_EQ(1u, CountLocalFile(app_id));
1578
1579  EXPECT_EQ(2u, CountMetadata());
1580  EXPECT_EQ(2u, CountTracker());
1581}
1582
1583}  // namespace drive_backend
1584}  // namespace sync_file_system
1585