14ee2ad04344446e610172a0e73949212923014dfSebastian Redl// Copyright 2014 The Chromium Authors. All rights reserved.
22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// Use of this source code is governed by a BSD-style license that can be
32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor// found in the LICENSE file.
42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <algorithm>
62cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include <stack>
72cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
82cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/files/file_util.h"
92cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/message_loop/message_loop.h"
10a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#include "base/run_loop.h"
112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "base/thread_task_runner_handle.h"
122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/drive/drive_uploader.h"
132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/drive/fake_drive_service.h"
147faa2ec03a7ef120ac165bb45b6c70a8b20c9f1cSebastian Redl#include "chrome/browser/drive/test_util.h"
1589d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor#include "chrome/browser/sync_file_system/drive_backend/callback_helper.h"
160eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis#include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h"
17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "chrome/browser/sync_file_system/drive_backend/fake_drive_service_helper.h"
18e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/sync_file_system/drive_backend/sync_engine.h"
212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h"
222a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall#include "chrome/browser/sync_file_system/drive_backend/sync_worker.h"
2389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "chrome/browser/sync_file_system/local/canned_syncable_file_system.h"
240b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor#include "chrome/browser/sync_file_system/local/local_file_sync_context.h"
257a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall#include "chrome/browser/sync_file_system/local/local_file_sync_service.h"
262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "chrome/browser/sync_file_system/local/sync_file_system_backend.h"
27a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#include "chrome/browser/sync_file_system/sync_file_system_test_util.h"
286ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl#include "chrome/browser/sync_file_system/syncable_file_system_util.h"
297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner#include "chrome/test/base/testing_profile.h"
306a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#include "content/public/test/test_browser_thread.h"
317c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner#include "content/public/test/test_browser_thread_bundle.h"
3283d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff#include "content/public/test/test_utils.h"
3314f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include "extensions/common/extension.h"
3410e286aa8d39fb51a21412850265d9dae74613eeChris Lattner#include "google_apis/drive/drive_api_parser.h"
353251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor#include "net/url_request/url_request_context_getter.h"
3614f79002e58556798e86168c63e48d533287eda5Douglas Gregor#include "storage/browser/fileapi/file_system_context.h"
37bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor#include "testing/gtest/include/gtest/gtest.h"
382bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor#include "third_party/leveldatabase/src/helpers/memenv/memenv.h"
39ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor#include "third_party/leveldatabase/src/include/leveldb/env.h"
400a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor
4117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor#define FPL(a) FILE_PATH_LITERAL(a)
4217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor
432596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbarnamespace sync_file_system {
442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregornamespace drive_backend {
45fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer
4614f79002e58556798e86168c63e48d533287eda5Douglas Gregortypedef storage::FileSystemOperation::FileEntryList FileEntryList;
4703013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer
48f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregornamespace {
493c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner
50cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregortemplate <typename T>
51f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregorvoid SetValueAndCallClosure(const base::Closure& closure,
522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                            T* arg_out,
538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                            T arg) {
542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  *arg_out = base::internal::CallbackForward(arg);
55ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl  closure.Run();
565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner}
575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnervoid SetSyncStatusAndUrl(const base::Closure& closure,
596e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer                         SyncStatusCode* status_out,
60ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl                         storage::FileSystemURL* url_out,
616e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer                         SyncStatusCode status,
626e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer                         const storage::FileSystemURL& url) {
635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  *status_out = status;
645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  *url_out = url;
656e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer  closure.Run();
66ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl}
67ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl
682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}  // namespace
692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorclass DriveBackendSyncTest : public testing::Test,
7112b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner                             public LocalFileSyncService::Observer,
722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                             public RemoteFileSyncService::Observer {
733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl public:
74a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl  DriveBackendSyncTest()
7589eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis      : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        pending_remote_changes_(0),
772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        pending_local_changes_(0) {}
782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  virtual ~DriveBackendSyncTest() {}
798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  virtual void SetUp() OVERRIDE {
8189eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis    ASSERT_TRUE(base_dir_.CreateUniqueTempDir());
828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default()));
832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    io_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread(
852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        content::BrowserThread::IO);
862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    scoped_refptr<base::SequencedWorkerPool> worker_pool(
872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        content::BrowserThread::GetBlockingPool());
882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    worker_task_runner_ =
892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        worker_pool->GetSequencedTaskRunnerWithShutdownBehavior(
902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor            worker_pool->GetSequenceToken(),
912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor            base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    file_task_runner_ = content::BrowserThread::GetMessageLoopProxyForThread(
932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        content::BrowserThread::FILE);
943397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    scoped_refptr<base::SequencedTaskRunner> drive_task_runner =
952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        worker_pool->GetSequencedTaskRunnerWithShutdownBehavior(
962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor            worker_pool->GetSequenceToken(),
972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor            base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    RegisterSyncableFileSystem();
1008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    local_sync_service_ = LocalFileSyncService::CreateForTesting(
1012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        &profile_, in_memory_env_.get());
1022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    local_sync_service_->AddChangeObserver(this);
1033397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    scoped_ptr<drive::FakeDriveService>
1058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl        drive_service(new drive::FakeDriveService);
1062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    drive_service->Initialize("test@example.com");
1072cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    ASSERT_TRUE(drive::test_util::SetUpTestEntries(drive_service.get()));
1083397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    scoped_ptr<drive::DriveUploaderInterface> uploader(
1108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl        new drive::DriveUploader(drive_service.get(),
1112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                 file_task_runner_.get()));
1122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1133397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    fake_drive_service_helper_.reset(new FakeDriveServiceHelper(
114df1550fc59b51681d37225934fe4e3acac321621Richard Smith        drive_service.get(), uploader.get(),
115df1550fc59b51681d37225934fe4e3acac321621Richard Smith        kSyncRootFolderTitle));
1168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
1172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    remote_sync_service_.reset(
1182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        new SyncEngine(base::ThreadTaskRunnerHandle::Get(),  // ui_task_runner
1193397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                       worker_task_runner_.get(),
120df1550fc59b51681d37225934fe4e3acac321621Richard Smith                       drive_task_runner.get(),
1218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                       base_dir_.path(),
1222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                       NULL,  // task_logger
1232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                       NULL,  // notification_manager
1243397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                       NULL,  // extension_service
1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                       NULL,  // signin_manager
1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                       NULL,  // token_service
1278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                       NULL,  // request_context
1282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                       scoped_ptr<SyncEngine::DriveServiceFactory>(),
1292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                       in_memory_env_.get()));
1303397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    remote_sync_service_->AddServiceObserver(this);
1312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    remote_sync_service_->InitializeForTesting(
1322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        drive_service.PassAs<drive::DriveServiceInterface>(),
1330953e767ff7817f97b3ab20896b229891eeff45bJohn McCall        uploader.Pass(),
1342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        scoped_ptr<SyncWorkerInterface>());
1352cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    remote_sync_service_->SetSyncEnabled(true);
1363397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1372cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    local_sync_service_->SetLocalChangeProcessor(remote_sync_service_.get());
1382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    remote_sync_service_->SetRemoteChangeProcessor(local_sync_service_.get());
1398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  }
1402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  virtual void TearDown() OVERRIDE {
1423397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    typedef std::map<std::string, CannedSyncableFileSystem*>::iterator iterator;
1432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    for (iterator itr = file_systems_.begin();
1448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl         itr != file_systems_.end(); ++itr) {
1452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      itr->second->TearDown();
1462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      delete itr->second;
1473397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    }
1482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    file_systems_.clear();
1497e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor
1507e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor    local_sync_service_->Shutdown();
151c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
1528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    fake_drive_service_helper_.reset();
1532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    local_sync_service_.reset();
1542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    remote_sync_service_.reset();
1553397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    content::RunAllBlockingPoolTasksUntilIdle();
1572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    RevokeSyncableFileSystem();
158e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson  }
1598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
1602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  virtual void OnRemoteChangeQueueUpdated(int64 pending_changes_hint) OVERRIDE {
1612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pending_remote_changes_ = pending_changes_hint;
1623397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  }
1632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  virtual void OnLocalChangeAvailable(int64 pending_changes_hint) OVERRIDE {
1652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    pending_local_changes_ = pending_changes_hint;
1662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  }
1673397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor protected:
169264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  storage::FileSystemURL CreateURL(const std::string& app_id,
170264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola                                   const base::FilePath::StringType& path) {
171a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman    return CreateURL(app_id, base::FilePath(path));
172425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola  }
173ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor
174264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola  storage::FileSystemURL CreateURL(const std::string& app_id,
175f85e193739c953358c865005855253af4f68a497John McCall                                   const base::FilePath& path) {
1762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id);
1772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    return CreateSyncableFileSystemURL(origin, path);
1783397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  }
1792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
1808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  bool GetAppRootFolderID(const std::string& app_id,
1812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                          std::string* folder_id) {
1822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    base::RunLoop run_loop;
1833397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    bool success = false;
1842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    FileTracker tracker;
1852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    PostTaskAndReplyWithResult(
1862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        worker_task_runner_.get(),
1872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        FROM_HERE,
1882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        base::Bind(&MetadataDatabase::FindAppRootTracker,
1892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                   base::Unretained(metadata_database()),
190c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor                   app_id,
19160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl                   &tracker),
19260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl        base::Bind(
19360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl            &SetValueAndCallClosure<bool>, run_loop.QuitClosure(), &success));
19460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    run_loop.Run();
19560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    if (!success)
19660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl      return false;
19760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    *folder_id = tracker.file_id();
19860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl    return true;
1998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  }
2002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  std::string GetFileIDByPath(const std::string& app_id,
2023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                              const base::FilePath::StringType& path) {
203ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    return GetFileIDByPath(app_id, base::FilePath(path));
2048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  }
205ed97649e9574b9d854fa4d6109c9333ae0993554John McCall
206ed97649e9574b9d854fa4d6109c9333ae0993554John McCall  std::string GetFileIDByPath(const std::string& app_id,
2073397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                              const base::FilePath& path) {
2082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    base::RunLoop run_loop;
2099763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    bool success = false;
2109763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis    FileTracker tracker;
2118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    base::FilePath result_path;
2122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    base::FilePath normalized_path = path.NormalizePathSeparators();
2132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    PostTaskAndReplyWithResult(
2143397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl        worker_task_runner_.get(),
215c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor        FROM_HERE,
2168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl        base::Bind(&MetadataDatabase::FindNearestActiveAncestor,
2172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                   base::Unretained(metadata_database()),
2182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                   app_id,
2193397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                   normalized_path,
2202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                   &tracker,
2218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                   &result_path),
2222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        base::Bind(
2232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor            &SetValueAndCallClosure<bool>, run_loop.QuitClosure(), &success));
2243397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    run_loop.Run();
225395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson    EXPECT_TRUE(success);
2268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    EXPECT_EQ(normalized_path, result_path);
227395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson    return tracker.file_id();
228395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson  }
229ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
230ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  SyncStatusCode RegisterApp(const std::string& app_id) {
231ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    GURL origin = extensions::Extension::GetBaseURLFromExtensionId(app_id);
232ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    if (!ContainsKey(file_systems_, app_id)) {
233ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt      CannedSyncableFileSystem* file_system = new CannedSyncableFileSystem(
234ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt          origin, in_memory_env_.get(),
235ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt          io_task_runner_.get(), file_task_runner_.get());
23634b41d939a1328f484511c6002ba2456db879a29Richard Smith      file_system->SetUp(CannedSyncableFileSystem::QUOTA_DISABLED);
23734b41d939a1328f484511c6002ba2456db879a29Richard Smith
23834b41d939a1328f484511c6002ba2456db879a29Richard Smith      SyncStatusCode status = SYNC_STATUS_UNKNOWN;
23934b41d939a1328f484511c6002ba2456db879a29Richard Smith      base::RunLoop run_loop;
24034b41d939a1328f484511c6002ba2456db879a29Richard Smith      local_sync_service_->MaybeInitializeFileSystemContext(
2413397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl          origin, file_system->file_system_context(),
242be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis          base::Bind(&SetValueAndCallClosure<SyncStatusCode>,
2432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                     run_loop.QuitClosure(), &status));
2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      run_loop.Run();
2452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      EXPECT_EQ(SYNC_STATUS_OK, status);
2462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      file_system->backend()->sync_context()->
2483397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl          set_mock_notify_changes_duration_in_sec(0);
2492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
2508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      EXPECT_EQ(base::File::FILE_OK, file_system->OpenFileSystem());
2512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      file_systems_[app_id] = file_system;
2522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    }
2533397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
2542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    SyncStatusCode status = SYNC_STATUS_UNKNOWN;
2558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    base::RunLoop run_loop;
2562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor    remote_sync_service_->RegisterOrigin(
2572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        origin,
2589d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall        base::Bind(&SetValueAndCallClosure<SyncStatusCode>,
2599d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                   run_loop.QuitClosure(), &status));
2609d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    run_loop.Run();
2619d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    return status;
2629d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  }
2639d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
2649d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall  void AddLocalFolder(const std::string& app_id,
2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                      const base::FilePath::StringType& path) {
2663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
26749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    EXPECT_EQ(base::File::FILE_OK,
26849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall              file_systems_[app_id]->CreateDirectory(
26949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                  CreateURL(app_id, path)));
2708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  }
27149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall
27249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  void AddOrUpdateLocalFile(const std::string& app_id,
27349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                            const base::FilePath::StringType& path,
274c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                            const std::string& content) {
275c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    storage::FileSystemURL url(CreateURL(app_id, path));
276c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
277c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    EXPECT_EQ(base::File::FILE_OK, file_systems_[app_id]->CreateFile(url));
278c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    int64 bytes_written = file_systems_[app_id]->WriteString(url, content);
279c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    EXPECT_EQ(static_cast<int64>(content.size()), bytes_written);
280c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    base::RunLoop().RunUntilIdle();
281c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor  }
2823397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
2832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor  void UpdateLocalFile(const std::string& app_id,
284be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis                       const base::FilePath::StringType& path,
28590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis                       const std::string& content) {
28690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
28790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    int64 bytes_written = file_systems_[app_id]->WriteString(
28890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis        CreateURL(app_id, path), content);
28990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    EXPECT_EQ(static_cast<int64>(content.size()), bytes_written);
2903e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith    base::RunLoop().RunUntilIdle();
2913e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith  }
2929763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis
2939763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis  void RemoveLocal(const std::string& app_id,
2948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                   const base::FilePath::StringType& path) {
29590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
29690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    EXPECT_EQ(base::File::FILE_OK,
29790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis              file_systems_[app_id]->Remove(
2983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                  CreateURL(app_id, path),
299ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis                  true /* recursive */));
300ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis    base::RunLoop().RunUntilIdle();
301ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis  }
3028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
30390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  SyncStatusCode ProcessLocalChange() {
30490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    SyncStatusCode status = SYNC_STATUS_UNKNOWN;
30590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    storage::FileSystemURL url;
3063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    base::RunLoop run_loop;
30790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    local_sync_service_->ProcessLocalChange(base::Bind(
30890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis        &SetSyncStatusAndUrl, run_loop.QuitClosure(), &status, &url));
30990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    run_loop.Run();
31090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    return status;
31190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  }
31290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
3133397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  SyncStatusCode ProcessRemoteChange() {
31490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    SyncStatusCode status = SYNC_STATUS_UNKNOWN;
31590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    storage::FileSystemURL url;
31690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    base::RunLoop run_loop;
3174fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth    remote_sync_service_->ProcessRemoteChange(base::Bind(
3188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl        &SetSyncStatusAndUrl, run_loop.QuitClosure(), &status, &url));
31990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    run_loop.Run();
32090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    return status;
32190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  }
3223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
3238dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis  int64 GetLargestChangeID() {
3248dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    scoped_ptr<google_apis::AboutResource> about_resource;
3258dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis    EXPECT_EQ(google_apis::HTTP_SUCCESS,
326f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis              fake_drive_service_helper()->GetAboutResource(&about_resource));
327f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis    if (!about_resource)
328f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis      return 0;
3298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl    return about_resource->largest_change_id();
33090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  }
33190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis
33290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis  void FetchRemoteChanges() {
3333397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl    remote_sync_service_->OnNotificationReceived();
33490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis    WaitForIdleWorker();
3353acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis  }
3363acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis
3373acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis  SyncStatusCode ProcessChangesUntilDone() {
3383acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    int task_limit = 100;
3393acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    SyncStatusCode local_sync_status;
3403acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    SyncStatusCode remote_sync_status;
3413acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis    while (true) {
3428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl      base::RunLoop().RunUntilIdle();
3432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor      WaitForIdleWorker();
3442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor
3457536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor      if (!task_limit--)
3467536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor        return SYNC_STATUS_ABORT;
347cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor
348cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      local_sync_status = ProcessLocalChange();
349cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor      if (local_sync_status != SYNC_STATUS_OK &&
350cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor          local_sync_status != SYNC_STATUS_NO_CHANGE_TO_SYNC &&
3517536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor          local_sync_status != SYNC_STATUS_FILE_BUSY)
3527536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor        return local_sync_status;
3537536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor
354075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara      remote_sync_status = ProcessRemoteChange();
355075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara      if (remote_sync_status != SYNC_STATUS_OK &&
356075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara          remote_sync_status != SYNC_STATUS_NO_CHANGE_TO_SYNC &&
357075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara          remote_sync_status != SYNC_STATUS_FILE_BUSY)
358075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara        return remote_sync_status;
3593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
360465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara      if (local_sync_status == SYNC_STATUS_NO_CHANGE_TO_SYNC &&
3613acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis          remote_sync_status == SYNC_STATUS_NO_CHANGE_TO_SYNC) {
3623acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis        {
3638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl          base::RunLoop run_loop;
3642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor          remote_sync_service_->PromoteDemotedChanges(run_loop.QuitClosure());
3652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor          run_loop.Run();
3663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl        }
3673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall
36831f17ecbef57b5679c017c375db330546b7b5145John McCall        {
3698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl          base::RunLoop run_loop;
3703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall          local_sync_service_->PromoteDemotedChanges(run_loop.QuitClosure());
3713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall          run_loop.Run();
3723397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl        }
373deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor
3748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl        if (pending_remote_changes_ || pending_local_changes_)
375c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall          continue;
376c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
3773397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl        base::RunLoop run_loop;
378c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall        int64 largest_fetched_change_id = -1;
3792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        PostTaskAndReplyWithResult(
380c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall            worker_task_runner_.get(),
381446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff            FROM_HERE,
382446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff            base::Bind(&MetadataDatabase::GetLargestFetchedChangeID,
3838538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                       base::Unretained(metadata_database())),
3842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor            base::Bind(&SetValueAndCallClosure<int64>,
3852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                       run_loop.QuitClosure(),
386d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff                       &largest_fetched_change_id));
3873397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl        run_loop.Run();
3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        if (largest_fetched_change_id != GetLargestChangeID()) {
3898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl          FetchRemoteChanges();
3902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor          continue;
3912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        }
392a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall        break;
393a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      }
394a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    }
395a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl    return SYNC_STATUS_OK;
39689eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis  }
397a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
398a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  // Verifies local and remote files/folders are consistent.
39989eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis  // This function checks:
400a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  //  - Each registered origin has corresponding remote folder.
401a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  //  - Each local file/folder has corresponding remote one.
40251bd803fbdade51d674598ed45da3d54190a656cJohn McCall  //  - Each remote file/folder has corresponding local one.
403a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  // TODO(tzik): Handle conflict case. i.e. allow remote file has different
40451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  // file content if the corresponding local file conflicts to it.
405a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  void VerifyConsistency() {
406a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    std::string sync_root_folder_id;
40751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    google_apis::GDataErrorCode error =
40851bd803fbdade51d674598ed45da3d54190a656cJohn McCall        fake_drive_service_helper_->GetSyncRootFolderID(&sync_root_folder_id);
409a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    if (sync_root_folder_id.empty()) {
410a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      EXPECT_EQ(google_apis::HTTP_NOT_FOUND, error);
411a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      EXPECT_TRUE(file_systems_.empty());
412a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall      return;
41351bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
41451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_EQ(google_apis::HTTP_SUCCESS, error);
41551bd803fbdade51d674598ed45da3d54190a656cJohn McCall
41651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    ScopedVector<google_apis::ResourceEntry> remote_entries;
417ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    EXPECT_EQ(google_apis::HTTP_SUCCESS,
418ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor              fake_drive_service_helper_->ListFilesInFolder(
419ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor                  sync_root_folder_id, &remote_entries));
420ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    std::map<std::string, const google_apis::ResourceEntry*> app_root_by_title;
421ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    for (ScopedVector<google_apis::ResourceEntry>::iterator itr =
422ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor             remote_entries.begin();
423ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor         itr != remote_entries.end();
42451bd803fbdade51d674598ed45da3d54190a656cJohn McCall         ++itr) {
42551bd803fbdade51d674598ed45da3d54190a656cJohn McCall      const google_apis::ResourceEntry& remote_entry = **itr;
42651bd803fbdade51d674598ed45da3d54190a656cJohn McCall      EXPECT_FALSE(ContainsKey(app_root_by_title, remote_entry.title()));
42751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      app_root_by_title[remote_entry.title()] = *itr;
42851bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
42951bd803fbdade51d674598ed45da3d54190a656cJohn McCall
43051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    for (std::map<std::string, CannedSyncableFileSystem*>::const_iterator itr =
43151bd803fbdade51d674598ed45da3d54190a656cJohn McCall             file_systems_.begin();
43251bd803fbdade51d674598ed45da3d54190a656cJohn McCall         itr != file_systems_.end(); ++itr) {
43351bd803fbdade51d674598ed45da3d54190a656cJohn McCall      const std::string& app_id = itr->first;
43451bd803fbdade51d674598ed45da3d54190a656cJohn McCall      SCOPED_TRACE(testing::Message() << "Verifying app: " << app_id);
43551bd803fbdade51d674598ed45da3d54190a656cJohn McCall      CannedSyncableFileSystem* file_system = itr->second;
43651bd803fbdade51d674598ed45da3d54190a656cJohn McCall      ASSERT_TRUE(ContainsKey(app_root_by_title, app_id));
43751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      VerifyConsistencyForFolder(
43851bd803fbdade51d674598ed45da3d54190a656cJohn McCall          app_id, base::FilePath(),
43951bd803fbdade51d674598ed45da3d54190a656cJohn McCall          app_root_by_title[app_id]->resource_id(),
44051bd803fbdade51d674598ed45da3d54190a656cJohn McCall          file_system);
44151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
442b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara  }
44351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
44451bd803fbdade51d674598ed45da3d54190a656cJohn McCall  void VerifyConsistencyForFolder(const std::string& app_id,
44551bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                  const base::FilePath& path,
44651bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                  const std::string& folder_id,
44751bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                  CannedSyncableFileSystem* file_system) {
44851bd803fbdade51d674598ed45da3d54190a656cJohn McCall    SCOPED_TRACE(testing::Message() << "Verifying folder: " << path.value());
44951bd803fbdade51d674598ed45da3d54190a656cJohn McCall
45051bd803fbdade51d674598ed45da3d54190a656cJohn McCall    ScopedVector<google_apis::ResourceEntry> remote_entries;
45151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_EQ(google_apis::HTTP_SUCCESS,
45251bd803fbdade51d674598ed45da3d54190a656cJohn McCall              fake_drive_service_helper_->ListFilesInFolder(
45351bd803fbdade51d674598ed45da3d54190a656cJohn McCall                  folder_id, &remote_entries));
45451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    std::map<std::string, const google_apis::ResourceEntry*>
45551bd803fbdade51d674598ed45da3d54190a656cJohn McCall        remote_entry_by_title;
45651bd803fbdade51d674598ed45da3d54190a656cJohn McCall    for (size_t i = 0; i < remote_entries.size(); ++i) {
45751bd803fbdade51d674598ed45da3d54190a656cJohn McCall      google_apis::ResourceEntry* remote_entry = remote_entries[i];
45851bd803fbdade51d674598ed45da3d54190a656cJohn McCall      EXPECT_FALSE(ContainsKey(remote_entry_by_title, remote_entry->title()))
45951bd803fbdade51d674598ed45da3d54190a656cJohn McCall          << "title: " << remote_entry->title();
46051bd803fbdade51d674598ed45da3d54190a656cJohn McCall      remote_entry_by_title[remote_entry->title()] = remote_entry;
46151bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
46251bd803fbdade51d674598ed45da3d54190a656cJohn McCall
46351bd803fbdade51d674598ed45da3d54190a656cJohn McCall    storage::FileSystemURL url(CreateURL(app_id, path));
46451bd803fbdade51d674598ed45da3d54190a656cJohn McCall    FileEntryList local_entries;
46551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_EQ(base::File::FILE_OK,
46651bd803fbdade51d674598ed45da3d54190a656cJohn McCall              file_system->ReadDirectory(url, &local_entries));
46751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    for (FileEntryList::iterator itr = local_entries.begin();
46851bd803fbdade51d674598ed45da3d54190a656cJohn McCall         itr != local_entries.end();
46951bd803fbdade51d674598ed45da3d54190a656cJohn McCall         ++itr) {
47051bd803fbdade51d674598ed45da3d54190a656cJohn McCall      const storage::DirectoryEntry& local_entry = *itr;
47151bd803fbdade51d674598ed45da3d54190a656cJohn McCall      storage::FileSystemURL entry_url(
47251bd803fbdade51d674598ed45da3d54190a656cJohn McCall          CreateURL(app_id, path.Append(local_entry.name)));
47351bd803fbdade51d674598ed45da3d54190a656cJohn McCall      std::string title =
47451bd803fbdade51d674598ed45da3d54190a656cJohn McCall          storage::VirtualPath::BaseName(entry_url.path()).AsUTF8Unsafe();
475796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara      SCOPED_TRACE(testing::Message() << "Verifying entry: " << title);
476796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara
477dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor      ASSERT_TRUE(ContainsKey(remote_entry_by_title, title));
47851bd803fbdade51d674598ed45da3d54190a656cJohn McCall      const google_apis::ResourceEntry& remote_entry =
47951bd803fbdade51d674598ed45da3d54190a656cJohn McCall          *remote_entry_by_title[title];
48051bd803fbdade51d674598ed45da3d54190a656cJohn McCall      if (local_entry.is_directory) {
48151bd803fbdade51d674598ed45da3d54190a656cJohn McCall        ASSERT_TRUE(remote_entry.is_folder());
48251bd803fbdade51d674598ed45da3d54190a656cJohn McCall        VerifyConsistencyForFolder(app_id, entry_url.path(),
48351bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                   remote_entry.resource_id(),
48451bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                   file_system);
48551bd803fbdade51d674598ed45da3d54190a656cJohn McCall      } else {
48651bd803fbdade51d674598ed45da3d54190a656cJohn McCall        ASSERT_TRUE(remote_entry.is_file());
487ed97649e9574b9d854fa4d6109c9333ae0993554John McCall        VerifyConsistencyForFile(app_id, entry_url.path(),
488ed97649e9574b9d854fa4d6109c9333ae0993554John McCall                                 remote_entry.resource_id(),
489ed97649e9574b9d854fa4d6109c9333ae0993554John McCall                                 file_system);
49051bd803fbdade51d674598ed45da3d54190a656cJohn McCall      }
49151bd803fbdade51d674598ed45da3d54190a656cJohn McCall      remote_entry_by_title.erase(title);
49251bd803fbdade51d674598ed45da3d54190a656cJohn McCall    }
49351bd803fbdade51d674598ed45da3d54190a656cJohn McCall
494cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    EXPECT_TRUE(remote_entry_by_title.empty());
495cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall  }
496cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall
49751bd803fbdade51d674598ed45da3d54190a656cJohn McCall  void VerifyConsistencyForFile(const std::string& app_id,
49851bd803fbdade51d674598ed45da3d54190a656cJohn McCall                                const base::FilePath& path,
499cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall                                const std::string& file_id,
500cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall                                CannedSyncableFileSystem* file_system) {
501cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    storage::FileSystemURL url(CreateURL(app_id, path));
502cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall    std::string file_content;
50351bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_EQ(google_apis::HTTP_SUCCESS,
50451bd803fbdade51d674598ed45da3d54190a656cJohn McCall              fake_drive_service_helper_->ReadFile(file_id, &file_content));
50551bd803fbdade51d674598ed45da3d54190a656cJohn McCall    EXPECT_EQ(base::File::FILE_OK,
506a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall              file_system->VerifyFile(url, file_content));
507ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  }
508ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
509ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  size_t CountApp() {
510ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt    return file_systems_.size();
511ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  }
512ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
51334b41d939a1328f484511c6002ba2456db879a29Richard Smith  size_t CountLocalFile(const std::string& app_id) {
51434b41d939a1328f484511c6002ba2456db879a29Richard Smith    if (!ContainsKey(file_systems_, app_id))
51534b41d939a1328f484511c6002ba2456db879a29Richard Smith      return 0;
51651bd803fbdade51d674598ed45da3d54190a656cJohn McCall
51751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    CannedSyncableFileSystem* file_system = file_systems_[app_id];
518a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    std::stack<base::FilePath> folders;
51951bd803fbdade51d674598ed45da3d54190a656cJohn McCall    folders.push(base::FilePath());  // root folder
52051bd803fbdade51d674598ed45da3d54190a656cJohn McCall
521a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    size_t result = 1;
5229d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    while (!folders.empty()) {
5239d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      storage::FileSystemURL url(CreateURL(app_id, folders.top()));
5249d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      folders.pop();
5259d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
5269d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      FileEntryList entries;
5279d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      EXPECT_EQ(base::File::FILE_OK,
5289d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                file_system->ReadDirectory(url, &entries));
5299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      for (FileEntryList::iterator itr = entries.begin();
5309d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall           itr != entries.end(); ++itr) {
5319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall        ++result;
5329d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall        if (itr->is_directory)
5339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall          folders.push(url.path().Append(itr->name));
5349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall      }
5359d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall    }
5369d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall
53751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    return result;
53851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  }
539a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall
54049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall  void VerifyLocalFile(const std::string& app_id,
54149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                       const base::FilePath::StringType& path,
54249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall                       const std::string& content) {
54349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall    SCOPED_TRACE(testing::Message() << "Verifying local file: "
544c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                    << "app_id = " << app_id
545c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                    << ", path = " << path);
546c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
547c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor    EXPECT_EQ(base::File::FILE_OK,
54851bd803fbdade51d674598ed45da3d54190a656cJohn McCall              file_systems_[app_id]->VerifyFile(
54951bd803fbdade51d674598ed45da3d54190a656cJohn McCall                  CreateURL(app_id, path), content));
550833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  }
551833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall
552833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall  void VerifyLocalFolder(const std::string& app_id,
553833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall                         const base::FilePath::StringType& path) {
55444f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis    SCOPED_TRACE(testing::Message() << "Verifying local file: "
55544f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis                                    << "app_id = " << app_id
556a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall                                    << ", path = " << path);
557075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    ASSERT_TRUE(ContainsKey(file_systems_, app_id));
558075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara    EXPECT_EQ(base::File::FILE_OK,
559075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara              file_systems_[app_id]->DirectoryExists(CreateURL(app_id, path)));
560075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara  }
561465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara
562e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara  size_t CountMetadata() {
5639e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor    size_t count = 0;
564a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    base::RunLoop run_loop;
5653cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall    PostTaskAndReplyWithResult(
5663cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall        worker_task_runner_.get(),
5673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall        FROM_HERE,
5684714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor        base::Bind(&MetadataDatabase::CountFileMetadata,
569e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara                   base::Unretained(metadata_database())),
5702494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor        base::Bind(
57151bd803fbdade51d674598ed45da3d54190a656cJohn McCall            &SetValueAndCallClosure<size_t>, run_loop.QuitClosure(), &count));
572a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    run_loop.Run();
57333500955d731c73717af52088b7fc0e7a85681e7John McCall    return count;
57433500955d731c73717af52088b7fc0e7a85681e7John McCall  }
57533500955d731c73717af52088b7fc0e7a85681e7John McCall
57694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor  size_t CountTracker() {
57733500955d731c73717af52088b7fc0e7a85681e7John McCall    size_t count = 0;
57833500955d731c73717af52088b7fc0e7a85681e7John McCall    base::RunLoop run_loop;
57933500955d731c73717af52088b7fc0e7a85681e7John McCall    PostTaskAndReplyWithResult(
58033500955d731c73717af52088b7fc0e7a85681e7John McCall        worker_task_runner_.get(),
58144f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis        FROM_HERE,
58244f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis        base::Bind(&MetadataDatabase::CountFileTracker,
58333500955d731c73717af52088b7fc0e7a85681e7John McCall                   base::Unretained(metadata_database())),
5847536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor        base::Bind(
5857536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor            &SetValueAndCallClosure<size_t>, run_loop.QuitClosure(), &count));
5867536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    run_loop.Run();
58751bd803fbdade51d674598ed45da3d54190a656cJohn McCall    return count;
58851bd803fbdade51d674598ed45da3d54190a656cJohn McCall  }
589c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall
590c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall  drive::FakeDriveService* fake_drive_service() {
591c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall    return static_cast<drive::FakeDriveService*>(
59254e14c4db764c0636160d26c5bbf491637c83a76John McCall        remote_sync_service_->drive_service_.get());
59354e14c4db764c0636160d26c5bbf491637c83a76John McCall  }
59454e14c4db764c0636160d26c5bbf491637c83a76John McCall
59554e14c4db764c0636160d26c5bbf491637c83a76John McCall  FakeDriveServiceHelper* fake_drive_service_helper() {
596a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    return fake_drive_service_helper_.get();
59751bd803fbdade51d674598ed45da3d54190a656cJohn McCall  }
59851bd803fbdade51d674598ed45da3d54190a656cJohn McCall
599a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall  void WaitForIdleWorker() {
600a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall    base::RunLoop run_loop;
6014dcf151a555ff51e4d643e8e6eeb80f121d11d1bChris Lattner    worker_task_runner_->PostTask(
602a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl        FROM_HERE,
6032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        base::Bind(&SyncWorker::CallOnIdleForTesting,
6042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                   base::Unretained(sync_worker()),
605b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                   RelayCallbackToCurrentThread(
606b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                       FROM_HERE,
60789eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis                       run_loop.QuitClosure())));
608b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    run_loop.Run();
609b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  }
610b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
611b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner private:
612b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  SyncWorker* sync_worker() {
613b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    return static_cast<SyncWorker*>(remote_sync_service_->sync_worker_.get());
614b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  }
615b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
616b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  // MetadataDatabase is normally used on the worker thread.
617b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  // Use this only when there is no task running on the worker.
618b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  MetadataDatabase* metadata_database() {
619b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner    return sync_worker()->context_->metadata_database_.get();
620b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  }
621b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
62289eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis  content::TestBrowserThreadBundle thread_bundle_;
623b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
624b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  base::ScopedTempDir base_dir_;
625b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  scoped_ptr<leveldb::Env> in_memory_env_;
626b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  TestingProfile profile_;
627b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
6280558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  scoped_ptr<SyncEngine> remote_sync_service_;
6290558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  scoped_ptr<LocalFileSyncService> local_sync_service_;
6300558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
63189eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis  int64 pending_remote_changes_;
6328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  int64 pending_local_changes_;
6330558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6340558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  scoped_ptr<FakeDriveServiceHelper> fake_drive_service_helper_;
6350558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  std::map<std::string, CannedSyncableFileSystem*> file_systems_;
6360558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6370558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6380558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
6390558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  scoped_refptr<base::SequencedTaskRunner> worker_task_runner_;
6400558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_;
6410558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6420558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  DISALLOW_COPY_AND_ASSIGN(DriveBackendSyncTest);
6430558df2da807646e65d4fa290f4e92114af1a746Chris Lattner};
6440558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6450558df2da807646e65d4fa290f4e92114af1a746Chris LattnerTEST_F(DriveBackendSyncTest, LocalToRemoteBasicTest) {
6460558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  std::string app_id = "example";
6470558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6480558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  RegisterApp(app_id);
6490558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  AddOrUpdateLocalFile(app_id, FPL("file"), "abcde");
6500558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6510558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
6520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  VerifyConsistency();
6530558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6540558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(1u, CountApp());
6550558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(2u, CountLocalFile(app_id));
6560558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  VerifyLocalFile(app_id, FPL("file"), "abcde");
6570558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6580558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(3u, CountMetadata());
6590558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(3u, CountTracker());
6600558df2da807646e65d4fa290f4e92114af1a746Chris Lattner}
6610558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6620558df2da807646e65d4fa290f4e92114af1a746Chris LattnerTEST_F(DriveBackendSyncTest, RemoteToLocalBasicTest) {
6630558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  std::string app_id = "example";
6640558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  RegisterApp(app_id);
6650558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6660558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  std::string app_root_folder_id;
6670558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_TRUE(GetAppRootFolderID(app_id, &app_root_folder_id));
6680558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6690558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  std::string file_id;
6700558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(google_apis::HTTP_SUCCESS,
6710558df2da807646e65d4fa290f4e92114af1a746Chris Lattner            fake_drive_service_helper()->AddFile(
6720558df2da807646e65d4fa290f4e92114af1a746Chris Lattner                app_root_folder_id, "file", "abcde", &file_id));
6730558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6740558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
6750558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  VerifyConsistency();
6760558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6770558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(1u, CountApp());
6780558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(2u, CountLocalFile(app_id));
6790558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  VerifyLocalFile(app_id, FPL("file"), "abcde");
6800558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6810558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(3u, CountMetadata());
6820558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(3u, CountTracker());
683f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne}
6840558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6850558df2da807646e65d4fa290f4e92114af1a746Chris LattnerTEST_F(DriveBackendSyncTest, LocalFileUpdateTest) {
6860558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  std::string app_id = "example";
6870558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  const base::FilePath::StringType kPath(FPL("file"));
6880558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6890558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  RegisterApp(app_id);
6900558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  AddOrUpdateLocalFile(app_id, kPath, "abcde");
6910558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6920558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
6930558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  VerifyConsistency();
6940558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6950558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  UpdateLocalFile(app_id, kPath, "1234567890");
6960558df2da807646e65d4fa290f4e92114af1a746Chris Lattner
6970558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
698eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VerifyConsistency();
699eb7f96141f754150a92433286fa385910a22f494Sam Weinig
700eb7f96141f754150a92433286fa385910a22f494Sam Weinig  EXPECT_EQ(1u, CountApp());
701eb7f96141f754150a92433286fa385910a22f494Sam Weinig  EXPECT_EQ(2u, CountLocalFile(app_id));
702eb7f96141f754150a92433286fa385910a22f494Sam Weinig  VerifyLocalFile(app_id, FPL("file"), "1234567890");
703eb7f96141f754150a92433286fa385910a22f494Sam Weinig
704eb7f96141f754150a92433286fa385910a22f494Sam Weinig  EXPECT_EQ(3u, CountMetadata());
705eb7f96141f754150a92433286fa385910a22f494Sam Weinig  EXPECT_EQ(3u, CountTracker());
706eb7f96141f754150a92433286fa385910a22f494Sam Weinig}
707b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
708b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorTEST_F(DriveBackendSyncTest, RemoteFileUpdateTest) {
709b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  std::string app_id = "example";
710b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
711b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  RegisterApp(app_id);
712b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  std::string remote_file_id;
713b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  std::string app_root_folder_id;
714b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_TRUE(GetAppRootFolderID(app_id, &app_root_folder_id));
715b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
716b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            fake_drive_service_helper()->AddFile(
717b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                app_root_folder_id, "file", "abcde", &remote_file_id));
718b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
719b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
720b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  VerifyConsistency();
721b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
722b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
723b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            fake_drive_service_helper()->UpdateFile(
724b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                remote_file_id, "1234567890"));
725b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
726b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
727b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  VerifyConsistency();
728b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
729b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(1u, CountApp());
730b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(2u, CountLocalFile(app_id));
731b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  VerifyLocalFile(app_id, FPL("file"), "1234567890");
732e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne
7330558df2da807646e65d4fa290f4e92114af1a746Chris Lattner  EXPECT_EQ(3u, CountMetadata());
734b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(3u, CountTracker());
7351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
736a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl
737b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerTEST_F(DriveBackendSyncTest, LocalFileDeletionTest) {
738b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  std::string app_id = "example";
7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const base::FilePath::StringType path(FPL("file"));
7408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
7418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  RegisterApp(app_id);
7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  AddOrUpdateLocalFile(app_id, path, "abcde");
7433397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
744f29f0a28c4d9599b389bbb6d186e14af753dc5a3Sebastian Redl  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
74551e774d42269e3b22d746184c0b9076fc13b32e6Zhongxing Xu  VerifyConsistency();
74631d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor
747b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  RemoveLocal(app_id, path);
748b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
749b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
750ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor  VerifyConsistency();
751b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
752b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(1u, CountApp());
753b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(1u, CountLocalFile(app_id));
754b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
755b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(2u, CountMetadata());
756b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(2u, CountTracker());
75749b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis}
758b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
759b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerTEST_F(DriveBackendSyncTest, RemoteFileDeletionTest) {
760b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  std::string app_id = "example";
761b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  const base::FilePath::StringType path(FPL("file"));
7627f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
7637f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  RegisterApp(app_id);
7644fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  AddOrUpdateLocalFile(app_id, path, "abcde");
765b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor
7665b4ec636637c9d876102240127cc0dca9280e83aTed Kremenek  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
7676a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor  VerifyConsistency();
768a93e3b5bde9f0a7b59215f19f176f7d69881b81cSebastian Redl
769320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian  std::string file_id = GetFileIDByPath(app_id, path);
770b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
771b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            fake_drive_service_helper()->DeleteResource(file_id));
772b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
773b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
774b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  VerifyConsistency();
775b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
776b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(1u, CountApp());
777b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(1u, CountLocalFile(app_id));
778b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
779b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(2u, CountMetadata());
780b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(2u, CountTracker());
78184bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne}
782cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
783837593fec8389eea3143920d7f2180b079b609e8Douglas GregorTEST_F(DriveBackendSyncTest, RemoteRenameTest) {
78484bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne  std::string app_id = "example";
78584bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne  const base::FilePath::StringType path(FPL("file"));
786ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt
787d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor  RegisterApp(app_id);
788d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor  AddOrUpdateLocalFile(app_id, path, "abcde");
789837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor
790837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
791cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  VerifyConsistency();
792b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
7932f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner  std::string file_id = GetFileIDByPath(app_id, path);
794b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(google_apis::HTTP_SUCCESS,
795b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner            fake_drive_service_helper()->RenameResource(
796b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                file_id, "renamed_file"));
797f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth
7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
799b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  VerifyConsistency();
8002f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner
801b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(1u, CountApp());
802b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(2u, CountLocalFile(app_id));
803b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  VerifyLocalFile(app_id, FPL("renamed_file"), "abcde");
804b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
80561d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor  EXPECT_EQ(3u, CountMetadata());
80661d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor  EXPECT_EQ(3u, CountTracker());
807b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner}
808b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
809b145b1e9de866e79fb386e4a074dc0b41853acf3Chris LattnerTEST_F(DriveBackendSyncTest, RemoteRenameAndRevertTest) {
810b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  std::string app_id = "example";
811b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  const base::FilePath::StringType path(FPL("file"));
812b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
813b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  RegisterApp(app_id);
814b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  AddOrUpdateLocalFile(app_id, path, "abcde");
815b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
816b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
817b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  VerifyConsistency();
818b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
819b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  std::string file_id = GetFileIDByPath(app_id, path);
820b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(google_apis::HTTP_SUCCESS,
821b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner            fake_drive_service_helper()->RenameResource(
822b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                file_id, "renamed_file"));
823b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
824b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  FetchRemoteChanges();
825b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
826b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(google_apis::HTTP_SUCCESS,
827a53d2cbe37e4be0d95b9d3e09f74eafae31fc940John McCall            fake_drive_service_helper()->RenameResource(
828d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff                file_id, base::FilePath(path).AsUTF8Unsafe()));
829b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
830b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  FetchRemoteChanges();
831b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
832b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
833b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  VerifyConsistency();
834b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
835b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(1u, CountApp());
836b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(2u, CountLocalFile(app_id));
837b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  VerifyLocalFile(app_id, FPL("file"), "abcde");
838b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
839b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(3u, CountMetadata());
840b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(3u, CountTracker());
841b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
842b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
843b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorTEST_F(DriveBackendSyncTest, ReorganizeToOtherFolder) {
8440ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  std::string app_id = "example";
8450ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  const base::FilePath::StringType path(FPL("file"));
8460ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8470ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  RegisterApp(app_id);
8480ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  AddLocalFolder(app_id, FPL("folder_src"));
8490ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  AddLocalFolder(app_id, FPL("folder_dest"));
8500ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  AddOrUpdateLocalFile(app_id, FPL("folder_src/file"), "abcde");
8510ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8520ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
8530ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  VerifyConsistency();
8540ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8550ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  std::string file_id = GetFileIDByPath(app_id, FPL("folder_src/file"));
8560ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  std::string src_folder_id = GetFileIDByPath(app_id, FPL("folder_src"));
8570ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  std::string dest_folder_id = GetFileIDByPath(app_id, FPL("folder_dest"));
8580ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
8590ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner            fake_drive_service_helper()->RemoveResourceFromDirectory(
8600ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner                src_folder_id, file_id));
8610ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  EXPECT_EQ(google_apis::HTTP_SUCCESS,
862b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner            fake_drive_service_helper()->AddResourceToDirectory(
863b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner                dest_folder_id, file_id));
8640ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
865b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
8660ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  VerifyConsistency();
8670ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner
8680ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  EXPECT_EQ(1u, CountApp());
8690ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner  EXPECT_EQ(4u, CountLocalFile(app_id));
870b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  VerifyLocalFolder(app_id, FPL("folder_dest"));
871b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  VerifyLocalFile(app_id, FPL("folder_dest/file"), "abcde");
872b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
873b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(5u, CountMetadata());
874b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(5u, CountTracker());
875b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor}
876b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
877b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas GregorTEST_F(DriveBackendSyncTest, ReorganizeToOtherApp) {
878b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  std::string src_app_id = "src_app";
879b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  std::string dest_app_id = "dest_app";
880b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
881b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  RegisterApp(src_app_id);
882b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  RegisterApp(dest_app_id);
883b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
884b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  AddLocalFolder(src_app_id, FPL("folder_src"));
885b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  AddLocalFolder(dest_app_id, FPL("folder_dest"));
886b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  AddOrUpdateLocalFile(src_app_id, FPL("folder_src/file"), "abcde");
887b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
888b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
889b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  VerifyConsistency();
890b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor
891b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  std::string file_id = GetFileIDByPath(src_app_id, FPL("folder_src/file"));
892b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  std::string src_folder_id = GetFileIDByPath(src_app_id, FPL("folder_src"));
893b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  std::string dest_folder_id = GetFileIDByPath(dest_app_id, FPL("folder_dest"));
894b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
895b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor            fake_drive_service_helper()->RemoveResourceFromDirectory(
896b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor                src_folder_id, file_id));
897b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
898a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor            fake_drive_service_helper()->AddResourceToDirectory(
899a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor                dest_folder_id, file_id));
900a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor
9014800a5c79023271408af49797e09be32aca93232Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
902f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth  VerifyConsistency();
9034800a5c79023271408af49797e09be32aca93232Douglas Gregor
9044800a5c79023271408af49797e09be32aca93232Douglas Gregor  EXPECT_EQ(2u, CountApp());
9054800a5c79023271408af49797e09be32aca93232Douglas Gregor  EXPECT_EQ(2u, CountLocalFile(src_app_id));
906b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(3u, CountLocalFile(dest_app_id));
907b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  VerifyLocalFile(dest_app_id, FPL("folder_dest/file"), "abcde");
908b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner
909b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(6u, CountMetadata());
910b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner  EXPECT_EQ(6u, CountTracker());
911e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor}
912e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
9131eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpTEST_F(DriveBackendSyncTest, ReorganizeToUnmanagedArea) {
914e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  std::string app_id = "example";
915e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
916e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  RegisterApp(app_id);
917e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
918e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  AddLocalFolder(app_id, FPL("folder_src"));
919e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("folder_src/file_orphaned"), "abcde");
920e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("folder_src/file_under_sync_root"), "123");
9211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  AddOrUpdateLocalFile(app_id, FPL("folder_src/file_under_drive_root"), "hoge");
922832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor
923e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VerifyConsistency();
925832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor
926e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  std::string file_orphaned_id =
9271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      GetFileIDByPath(app_id, FPL("folder_src/file_orphaned"));
928e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  std::string file_under_sync_root_id =
929e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      GetFileIDByPath(app_id, FPL("folder_src/file_under_sync_root"));
930832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor  std::string file_under_drive_root_id =
931e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor      GetFileIDByPath(app_id, FPL("folder_src/file_under_drive_root"));
932e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  std::string folder_id = GetFileIDByPath(app_id, FPL("folder_src"));
934e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  std::string sync_root_folder_id;
935e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
936e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            fake_drive_service_helper()->GetSyncRootFolderID(
9371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                &sync_root_folder_id));
938e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
939e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
940e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            fake_drive_service_helper()->RemoveResourceFromDirectory(
941e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor                folder_id, file_orphaned_id));
942e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
9431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            fake_drive_service_helper()->RemoveResourceFromDirectory(
944e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor                folder_id, file_under_sync_root_id));
945e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
946b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner            fake_drive_service_helper()->RemoveResourceFromDirectory(
9473397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl                folder_id, file_under_drive_root_id));
948832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor
9498e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  EXPECT_EQ(google_apis::HTTP_SUCCESS,
9502bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor            fake_drive_service_helper()->AddResourceToDirectory(
951b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor                sync_root_folder_id, file_under_sync_root_id));
952e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
953e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            fake_drive_service_helper()->AddResourceToDirectory(
954e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor                fake_drive_service()->GetRootResourceId(),
95577f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl                file_under_drive_root_id));
9568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
9573397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
9583397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  VerifyConsistency();
959e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
960e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  EXPECT_EQ(1u, CountApp());
961e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  EXPECT_EQ(2u, CountLocalFile(app_id));
96277f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl
96377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl  EXPECT_EQ(4u, CountMetadata());
964e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  EXPECT_EQ(4u, CountTracker());
9651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
966e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
9678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlTEST_F(DriveBackendSyncTest, ReorganizeToMultipleParents) {
9688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  std::string app_id = "example";
9698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
970e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  RegisterApp(app_id);
971e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
972832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor  AddLocalFolder(app_id, FPL("parent1"));
97377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl  AddLocalFolder(app_id, FPL("parent2"));
97448d2c3f7c3ca48da05436afdc8426a245294ee65Jonathan D. Turner  AddOrUpdateLocalFile(app_id, FPL("parent1/file"), "abcde");
97548d2c3f7c3ca48da05436afdc8426a245294ee65Jonathan D. Turner
97677f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
9771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VerifyConsistency();
97831d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor
979b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  std::string file_id = GetFileIDByPath(app_id, FPL("parent1/file"));
980b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  std::string parent2_folder_id = GetFileIDByPath(app_id, FPL("parent2"));
981b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
9828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl            fake_drive_service_helper()->AddResourceToDirectory(
983b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor                parent2_folder_id, file_id));
984b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
985b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
986fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer  VerifyConsistency();
9871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
988fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer  EXPECT_EQ(1u, CountApp());
989b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor  EXPECT_EQ(4u, CountLocalFile(app_id));
990aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam  VerifyLocalFolder(app_id, FPL("parent1"));
9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VerifyLocalFolder(app_id, FPL("parent2"));
992e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  VerifyLocalFile(app_id, FPL("parent1/file"), "abcde");
993b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
9948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EXPECT_EQ(5u, CountMetadata());
995ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar  EXPECT_EQ(5u, CountTracker());
99631d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor}
99731d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor
99831d375f056447d4e2418275d4913661d3bfedb3eDouglas GregorTEST_F(DriveBackendSyncTest, ReorganizeAndRevert) {
99931d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor  std::string app_id = "example";
1000b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor
100111a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam  RegisterApp(app_id);
10028e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10038e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  AddLocalFolder(app_id, FPL("folder"));
10048e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  AddLocalFolder(app_id, FPL("folder_temp"));
10058e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  AddOrUpdateLocalFile(app_id, FPL("folder/file"), "abcde");
10068e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10078e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
10088e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  VerifyConsistency();
10098e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis
10108e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  std::string file_id = GetFileIDByPath(app_id, FPL("folder/file"));
10118e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  std::string folder_id = GetFileIDByPath(app_id, FPL("folder"));
10128e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  std::string folder_temp_id = GetFileIDByPath(app_id, FPL("folder_temp"));
10138e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
10148e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis            fake_drive_service_helper()->RemoveResourceFromDirectory(
10158e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                folder_id, file_id));
10168e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis  EXPECT_EQ(google_apis::HTTP_SUCCESS,
10178e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis            fake_drive_service_helper()->AddResourceToDirectory(
10188e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis                folder_temp_id, file_id));
1019f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek
1020f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek  FetchRemoteChanges();
10218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
1022f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1023f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek            fake_drive_service_helper()->RemoveResourceFromDirectory(
1024445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor                folder_temp_id, file_id));
10258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1026f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek            fake_drive_service_helper()->AddResourceToDirectory(
1027f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek                folder_id, file_id));
10282bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor
10292bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor  FetchRemoteChanges();
10302bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor
1031a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
10320a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  VerifyConsistency();
10330a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10340a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  EXPECT_EQ(1u, CountApp());
10350a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  EXPECT_EQ(4u, CountLocalFile(app_id));
10360a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  VerifyLocalFolder(app_id, FPL("folder"));
10370a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  VerifyLocalFile(app_id, FPL("folder/file"), "abcde");
1038eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth
10390a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  EXPECT_EQ(5u, CountMetadata());
10400a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  EXPECT_EQ(5u, CountTracker());
10410a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor}
10420a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10437e7fbd05a5dfdb0addfc8b5af2fcbed8c7b5fb87Peter CollingbourneTEST_F(DriveBackendSyncTest, ConflictTest_ConflictTest_AddFolder_AddFolder) {
10440a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  std::string app_id = "example";
1045dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer
1046dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer  RegisterApp(app_id);
10470a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
10480a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10490a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
10501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
10510a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10520a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  std::string remote_folder_id;
105311a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam  EXPECT_EQ(google_apis::HTTP_CREATED,
1054412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian            fake_drive_service_helper()->AddFolder(
105511a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam                app_root_folder_id,
1056412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian                "conflict_to_pending_remote", &remote_folder_id));
1057f84109ee6aeffb09366bd70c8593ce1b7818b1adFariborz Jahanian
1058c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek  FetchRemoteChanges();
1059c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek
106074da19fc3a52d7e3005eeb7a7833859da84fd12aDouglas Gregor  EXPECT_EQ(google_apis::HTTP_CREATED,
10614c9d8d0eca5ca635d9a30222f690db9140e98325Fariborz Jahanian            fake_drive_service_helper()->AddFolder(
10621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                app_root_folder_id,
10630a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor                "conflict_to_existing_remote", &remote_folder_id));
10640a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10650a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1066b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman  VerifyConsistency();
10670a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
1068da4b7cf09ebfd4e4098b516081fa9dae2f5c99e0Anders Carlsson  EXPECT_EQ(1u, CountApp());
10697da99b05aa9482e76b2954223b5652469004aec2Anders Carlsson  EXPECT_EQ(3u, CountLocalFile(app_id));
10707da99b05aa9482e76b2954223b5652469004aec2Anders Carlsson  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
10710a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
10726f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor
10730a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  EXPECT_EQ(4u, CountMetadata());
10740a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  EXPECT_EQ(4u, CountTracker());
10750a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor}
10760a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
1077ea5ce4705df0743093925585d8edc80e0d8fe3ffChris LattnerTEST_F(DriveBackendSyncTest, ConflictTest_AddFolder_DeleteFolder) {
1078ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner  std::string app_id = "example";
1079972d954bd216c86a961bb7f81c53af85de17c2f0Douglas Gregor
10800a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  RegisterApp(app_id);
10810a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10820a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
10830a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
10840a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10850a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1086a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner  VerifyConsistency();
1087a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner
10880a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  // Test body starts from here.
10890a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
10901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
10910a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
10920a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
10930a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10940a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
10950a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor            fake_drive_service_helper()->DeleteResource(
10960a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
10970a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
10980a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  FetchRemoteChanges();
10990d2d1bcef51993ca3fd957e45fb7ec85e45016e5Chandler Carruth
1100a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1101a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson            fake_drive_service_helper()->DeleteResource(
110215b91764d08e886391c865c4a444d7b51141c284Eli Friedman                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
110315b91764d08e886391c865c4a444d7b51141c284Eli Friedman
1104a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1105b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis  VerifyConsistency();
1106b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis
1107b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis  EXPECT_EQ(1u, CountApp());
11080a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  EXPECT_EQ(2u, CountLocalFile(app_id));
11090a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1110ab8e281b32a3d3b9b18257d26844362bf806ecdcDaniel Dunbar
11110a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  EXPECT_EQ(3u, CountMetadata());
1112b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman  EXPECT_EQ(3u, CountTracker());
111308a53269b1f8241e2e6797e845abbe640fb18253Peter Collingbourne}
11149c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump
111584bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter CollingbourneTEST_F(DriveBackendSyncTest, ConflictTest_AddFolder_AddFile) {
111692f5822df6a0d7571df44b5d279ed4f017fbb0e6Anders Carlsson  std::string app_id = "example";
1117a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor
1118cfe9af250f466e7e38becea4428990448ae07737Roman Divacky  RegisterApp(app_id);
1119f85e193739c953358c865005855253af4f68a497John McCall  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1120f85e193739c953358c865005855253af4f68a497John McCall
11218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
11220a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
11230a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor
112414f79002e58556798e86168c63e48d533287eda5Douglas Gregor  std::string file_id;
11254fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
11264fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor            fake_drive_service_helper()->AddFile(
11274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                app_root_folder_id, "conflict_to_pending_remote", "foo",
11284fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                &file_id));
11294fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
11303397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl            fake_drive_service_helper()->UpdateModificationTime(
11314fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                file_id,
11324fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                base::Time::Now() + base::TimeDelta::FromDays(1)));
11334fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  FetchRemoteChanges();
113574e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner
113674e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner  EXPECT_EQ(google_apis::HTTP_SUCCESS,
11374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor            fake_drive_service_helper()->AddFile(
11384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                app_root_folder_id, "conflict_to_existing_remote", "foo",
11392596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar                &file_id));
11404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
11411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump            fake_drive_service_helper()->UpdateModificationTime(
11421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                file_id,
11435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                base::Time::Now() + base::TimeDelta::FromDays(1)));
11444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11454fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
11464fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  VerifyConsistency();
114774e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner
11484fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(1u, CountApp());
11494fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(3u, CountLocalFile(app_id));
11504fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
11511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
11525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
11534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(4u, CountMetadata());
11544fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(4u, CountTracker());
11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
11565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
11574fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas GregorTEST_F(DriveBackendSyncTest, ConflictTest_AddFolder_DeleteFile) {
11584fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  std::string app_id = "example";
11594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  RegisterApp(app_id);
116174e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
116274e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner
116374e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
116474e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
116574e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner
11664fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
11674fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  VerifyConsistency();
11684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11694fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  // Test body starts from here.
11704fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
11714fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
11723397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
1173a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
11744fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
11754fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11763397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
11774fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor            fake_drive_service_helper()->DeleteResource(
11781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
11794fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
1180e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  FetchRemoteChanges();
11815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
11821e5f83ba515157dc7f263dc91b1d51c7a5754c35Chris Lattner  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1183e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor            fake_drive_service_helper()->DeleteResource(
11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
11854fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
11874fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  VerifyConsistency();
11884fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11894fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(1u, CountApp());
11904fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(3u, CountLocalFile(app_id));
11914fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
11924fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
11934fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(4u, CountMetadata());
11954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(4u, CountTracker());
11964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor}
11974fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
11988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlTEST_F(DriveBackendSyncTest, ConflictTest_DeleteFolder_AddFolder) {
11994fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  std::string app_id = "example";
12004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
12014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  RegisterApp(app_id);
12024fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
12034fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
12044fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
12054fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
12068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
12074fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
12084fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
1209ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar  std::string file_id;
12104fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(google_apis::HTTP_CREATED,
12114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor            fake_drive_service_helper()->AddFolder(
12124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                app_root_folder_id,
121314f79002e58556798e86168c63e48d533287eda5Douglas Gregor                "conflict_to_pending_remote", &file_id));
121414f79002e58556798e86168c63e48d533287eda5Douglas Gregor
121514f79002e58556798e86168c63e48d533287eda5Douglas Gregor  FetchRemoteChanges();
121614f79002e58556798e86168c63e48d533287eda5Douglas Gregor
121714f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(google_apis::HTTP_CREATED,
1218c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor            fake_drive_service_helper()->AddFolder(
121914f79002e58556798e86168c63e48d533287eda5Douglas Gregor                app_root_folder_id,
122014f79002e58556798e86168c63e48d533287eda5Douglas Gregor                "conflict_to_existing_remote", NULL));
12218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
122214f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
122314f79002e58556798e86168c63e48d533287eda5Douglas Gregor  VerifyConsistency();
122414f79002e58556798e86168c63e48d533287eda5Douglas Gregor
122514f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(1u, CountApp());
12262d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor  EXPECT_EQ(3u, CountLocalFile(app_id));
12272d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
12282d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
122914f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1230c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor  EXPECT_EQ(4u, CountMetadata());
123114f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(4u, CountTracker());
123214f79002e58556798e86168c63e48d533287eda5Douglas Gregor}
123314f79002e58556798e86168c63e48d533287eda5Douglas Gregor
123414f79002e58556798e86168c63e48d533287eda5Douglas GregorTEST_F(DriveBackendSyncTest, ConflictTest_DeleteFolder_DeleteFolder) {
1235c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor  std::string app_id = "example";
123614f79002e58556798e86168c63e48d533287eda5Douglas Gregor
123714f79002e58556798e86168c63e48d533287eda5Douglas Gregor  RegisterApp(app_id);
12388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
123914f79002e58556798e86168c63e48d533287eda5Douglas Gregor
124014f79002e58556798e86168c63e48d533287eda5Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
124114f79002e58556798e86168c63e48d533287eda5Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
124214f79002e58556798e86168c63e48d533287eda5Douglas Gregor
124314f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1244c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor  VerifyConsistency();
124514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
124614f79002e58556798e86168c63e48d533287eda5Douglas Gregor  // Test body starts from here.
124714f79002e58556798e86168c63e48d533287eda5Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
124814f79002e58556798e86168c63e48d533287eda5Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1249c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor
125014f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
125114f79002e58556798e86168c63e48d533287eda5Douglas Gregor            fake_drive_service_helper()->DeleteResource(
12528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
125314f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1254c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor  FetchRemoteChanges();
125514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
125614f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1257f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth            fake_drive_service_helper()->DeleteResource(
1258f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1259f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth
126014f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
126114f79002e58556798e86168c63e48d533287eda5Douglas Gregor  VerifyConsistency();
1262f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth
126314f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(1u, CountApp());
126414f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(1u, CountLocalFile(app_id));
126514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
126614f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(2u, CountMetadata());
1267f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor  EXPECT_EQ(2u, CountTracker());
1268c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor}
126914f79002e58556798e86168c63e48d533287eda5Douglas Gregor
127014f79002e58556798e86168c63e48d533287eda5Douglas GregorTEST_F(DriveBackendSyncTest, ConflictTest_DeleteFolder_AddFile) {
1271cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  std::string app_id = "example";
1272cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1273cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  RegisterApp(app_id);
1274cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1275cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1276cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1277b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1278b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1279b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1280b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1281cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1282cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor            fake_drive_service_helper()->AddFile(
1283cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                app_root_folder_id, "conflict_to_pending_remote", "foo", NULL));
1284cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1285cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  FetchRemoteChanges();
1286cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1287cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1288cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor            fake_drive_service_helper()->AddFile(
1289cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                app_root_folder_id, "conflict_to_existing_remote", "bar",
1290cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                NULL));
1291cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1292cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1293cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  VerifyConsistency();
1294cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1295cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(1u, CountApp());
1296cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(3u, CountLocalFile(app_id));
1297cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1298cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1299cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
13005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  EXPECT_EQ(4u, CountMetadata());
1301cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(4u, CountTracker());
1302cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1303cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1304b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas GregorTEST_F(DriveBackendSyncTest, ConflictTest_DeleteFolder_DeleteFile) {
1305cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  std::string app_id = "example";
1306cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1307cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  RegisterApp(app_id);
1308cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
13095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1310cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1311cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1312cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
13135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  VerifyConsistency();
1314cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1315cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  // Test body starts from here.
1316cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1317cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1318b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1319b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1320b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor            fake_drive_service_helper()->DeleteResource(
1321b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
1322b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1323cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  FetchRemoteChanges();
1324cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1325cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1326cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor            fake_drive_service_helper()->DeleteResource(
1327cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1328cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1329cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1330b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  VerifyConsistency();
1331b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1332b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  EXPECT_EQ(1u, CountApp());
1333b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  EXPECT_EQ(1u, CountLocalFile(app_id));
1334b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1335b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  EXPECT_EQ(2u, CountMetadata());
1336b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  EXPECT_EQ(2u, CountTracker());
1337b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor}
1338b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1339b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas GregorTEST_F(DriveBackendSyncTest, ConflictTest_AddFile_AddFolder) {
1340b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  std::string app_id = "example";
1341b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1342b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  RegisterApp(app_id);
1343b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1344b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1345b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1346b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1347b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1348cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  std::string file_id;
1349cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_CREATED,
1350b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor            fake_drive_service_helper()->AddFolder(
1351b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                app_root_folder_id, "conflict_to_pending_remote",
1352b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor                &file_id));
1353cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1354cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor            fake_drive_service_helper()->UpdateModificationTime(
1355cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                file_id,
1356cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                base::Time::Now() - base::TimeDelta::FromDays(1)));
1357cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1358cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  FetchRemoteChanges();
1359cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1360cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_CREATED,
1361832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor            fake_drive_service_helper()->AddFolder(
13625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                app_root_folder_id, "conflict_to_existing_remote",
1363cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                &file_id));
1364cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1365cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor            fake_drive_service_helper()->UpdateModificationTime(
1366cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                file_id,
1367cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                base::Time::Now() - base::TimeDelta::FromDays(1)));
1368cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1369cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
13705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  VerifyConsistency();
1371cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1372cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(1u, CountApp());
1373cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(3u, CountLocalFile(app_id));
1374cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1375cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1376cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1377cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(4u, CountMetadata());
1378cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(4u, CountTracker());
1379cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1380cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1381cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas GregorTEST_F(DriveBackendSyncTest, ConflictTest_AddFile_DeleteFolder) {
1382cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  std::string app_id = "example";
1383cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1384cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  RegisterApp(app_id);
1385cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1386cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1387cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
1388cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1389cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1390cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1391cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  VerifyConsistency();
1392cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1393cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  // Test body starts from here.
1394cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1395cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1396cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1397cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1398cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1399cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1400cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor            fake_drive_service_helper()->DeleteResource(
1401cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
1402cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1403cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  FetchRemoteChanges();
1404cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1405cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1406cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor            fake_drive_service_helper()->DeleteResource(
1407cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1408cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1409cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1410cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  VerifyConsistency();
1411cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1412b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  EXPECT_EQ(1u, CountApp());
1413cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(3u, CountLocalFile(app_id));
1414cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1415cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1416b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor
1417cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(4u, CountMetadata());
1418cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  EXPECT_EQ(4u, CountTracker());
1419cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor}
1420cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1421b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas GregorTEST_F(DriveBackendSyncTest, ConflictTest_AddFile_AddFile) {
1422b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor  std::string app_id = "example";
1423cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1424cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  RegisterApp(app_id);
1425cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
1426cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1427cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
1428cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
1429cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor
143014f79002e58556798e86168c63e48d533287eda5Douglas Gregor  std::string file_id;
143114f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
143214f79002e58556798e86168c63e48d533287eda5Douglas Gregor            fake_drive_service_helper()->AddFile(
143314f79002e58556798e86168c63e48d533287eda5Douglas Gregor                app_root_folder_id, "conflict_to_pending_remote", "foo",
143414f79002e58556798e86168c63e48d533287eda5Douglas Gregor                &file_id));
143514f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
143614f79002e58556798e86168c63e48d533287eda5Douglas Gregor            fake_drive_service_helper()->UpdateModificationTime(
143714f79002e58556798e86168c63e48d533287eda5Douglas Gregor                file_id,
1438a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl                base::Time::Now() + base::TimeDelta::FromDays(1)));
1439e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
1440832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor  FetchRemoteChanges();
14417f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
14427f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1443f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner            fake_drive_service_helper()->AddFile(
14448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                app_root_folder_id, "conflict_to_existing_remote", "bar",
144514f79002e58556798e86168c63e48d533287eda5Douglas Gregor                &file_id));
144614f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1447828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner            fake_drive_service_helper()->UpdateModificationTime(
1448828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner                file_id,
1449828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner                base::Time::Now() + base::TimeDelta::FromDays(1)));
1450f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth
14517f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
145214f79002e58556798e86168c63e48d533287eda5Douglas Gregor  VerifyConsistency();
145314f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1454090d9b53e32bb30d9e74de895bb59b409bd49e00Chris Lattner  EXPECT_EQ(1u, CountApp());
14554cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis  EXPECT_EQ(3u, CountLocalFile(app_id));
14564cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
14574cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
14587f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
1459f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(4u, CountMetadata());
1460f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(4u, CountTracker());
14610fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl}
1462bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor
1463f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas GregorTEST_F(DriveBackendSyncTest, ConflictTest_AddFile_DeleteFile) {
146411a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam  std::string app_id = "example";
14657f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
14667f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  RegisterApp(app_id);
14677f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
146814f79002e58556798e86168c63e48d533287eda5Douglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
146914f79002e58556798e86168c63e48d533287eda5Douglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
147014f79002e58556798e86168c63e48d533287eda5Douglas Gregor
14714cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
14728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  VerifyConsistency();
14734cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
14744cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis  // Test body starts from here.
14758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
147614f79002e58556798e86168c63e48d533287eda5Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1477f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
14787f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
147914f79002e58556798e86168c63e48d533287eda5Douglas Gregor
148014f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1481f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor            fake_drive_service_helper()->DeleteResource(
1482f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
148314f79002e58556798e86168c63e48d533287eda5Douglas Gregor
148414f79002e58556798e86168c63e48d533287eda5Douglas Gregor  FetchRemoteChanges();
148514f79002e58556798e86168c63e48d533287eda5Douglas Gregor
148614f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1487bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor            fake_drive_service_helper()->DeleteResource(
148814f79002e58556798e86168c63e48d533287eda5Douglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
148914f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1490b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1491b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis  VerifyConsistency();
1492b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis
1493b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis  EXPECT_EQ(1u, CountApp());
149414f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(3u, CountLocalFile(app_id));
149514f79002e58556798e86168c63e48d533287eda5Douglas Gregor  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
14961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
14972d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor
1498b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis  EXPECT_EQ(4u, CountMetadata());
1499b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis  EXPECT_EQ(4u, CountTracker());
15002d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor}
1501e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor
1502b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios KyrtzidisTEST_F(DriveBackendSyncTest, ConflictTest_UpdateFile_DeleteFile) {
1503fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer  std::string app_id = "example";
15042c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson
15052c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson  RegisterApp(app_id);
15062c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson
15072c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
15082c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
15092c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson
15102c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1511fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer  VerifyConsistency();
1512aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam
15131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // Test body starts from here.
1514e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
1515ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
151614f79002e58556798e86168c63e48d533287eda5Douglas Gregor
151714f79002e58556798e86168c63e48d533287eda5Douglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
151814f79002e58556798e86168c63e48d533287eda5Douglas Gregor            fake_drive_service_helper()->DeleteResource(
151914f79002e58556798e86168c63e48d533287eda5Douglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
152014f79002e58556798e86168c63e48d533287eda5Douglas Gregor
152114f79002e58556798e86168c63e48d533287eda5Douglas Gregor  FetchRemoteChanges();
152214f79002e58556798e86168c63e48d533287eda5Douglas Gregor
152336c35ba0aca641e60e5dbee8efbc620c08b9bd61Douglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1524e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner            fake_drive_service_helper()->DeleteResource(
152514f79002e58556798e86168c63e48d533287eda5Douglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1526ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar
15275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
152814f79002e58556798e86168c63e48d533287eda5Douglas Gregor  VerifyConsistency();
15298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl
1530c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor  EXPECT_EQ(1u, CountApp());
15315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  EXPECT_EQ(3u, CountLocalFile(app_id));
1532ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
15337f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
1534f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1535f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(4u, CountMetadata());
1536f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(4u, CountTracker());
153714f79002e58556798e86168c63e48d533287eda5Douglas Gregor}
153814f79002e58556798e86168c63e48d533287eda5Douglas Gregor
1539f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler CarruthTEST_F(DriveBackendSyncTest, ConflictTest_DeleteFile_AddFolder) {
15401728762d5a8cfaf8d64385f47b311e84de1ae7a2Chandler Carruth  std::string app_id = "example";
154178df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth
154278df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth  RegisterApp(app_id);
154378df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth
154414f79002e58556798e86168c63e48d533287eda5Douglas Gregor  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1545f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1546f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1547bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor
1548f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1549f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor  VerifyConsistency();
1550f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth
155114f79002e58556798e86168c63e48d533287eda5Douglas Gregor  // Test body starts from here.
155214f79002e58556798e86168c63e48d533287eda5Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
155314f79002e58556798e86168c63e48d533287eda5Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
15547f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
1555bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor  EXPECT_EQ(google_apis::HTTP_CREATED,
15567f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor            fake_drive_service_helper()->AddFolder(
15577f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor                app_root_folder_id, "conflict_to_pending_remote", NULL));
15582eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor
15593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  FetchRemoteChanges();
15607f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
15617f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  EXPECT_EQ(google_apis::HTTP_CREATED,
15627f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor            fake_drive_service_helper()->AddFolder(
15638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl                app_root_folder_id, "conflict_to_existing_remote", NULL));
15647f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
1565f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
15667f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  VerifyConsistency();
15677f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor
15681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EXPECT_EQ(1u, CountApp());
15697f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  EXPECT_EQ(3u, CountLocalFile(app_id));
15708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  VerifyLocalFolder(app_id, FPL("conflict_to_pending_remote"));
15717f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  VerifyLocalFolder(app_id, FPL("conflict_to_existing_remote"));
1572f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
15736e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer  EXPECT_EQ(4u, CountMetadata());
15747f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  EXPECT_EQ(4u, CountTracker());
15754cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis}
15764cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
15774cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios KyrtzidisTEST_F(DriveBackendSyncTest, ConflictTest_DeleteFile_DeleteFolder) {
15784cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis  std::string app_id = "example";
15794cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
15804cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis  RegisterApp(app_id);
15814cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
15824cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis  AddLocalFolder(app_id, FPL("conflict_to_pending_remote"));
15834cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis  AddLocalFolder(app_id, FPL("conflict_to_existing_remote"));
15844cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis
15854cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
15864cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis  VerifyConsistency();
15873397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
15887f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor  // Test body starts from here.
15898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1590f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1591f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1592f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1593f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1594f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1595f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1596f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1597f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1598f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1599f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor            fake_drive_service_helper()->DeleteResource(
1600f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
1601f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1602f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  FetchRemoteChanges();
1603f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1604f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1605f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor            fake_drive_service_helper()->DeleteResource(
1606f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
1607f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1608f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1609f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  VerifyConsistency();
1610f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1611f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(1u, CountApp());
1612f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(1u, CountLocalFile(app_id));
1613f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1614f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(2u, CountMetadata());
1615f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(2u, CountTracker());
1616f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor}
1617f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1618f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas GregorTEST_F(DriveBackendSyncTest, ConflictTest_DeleteFile_AddFile) {
1619f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  std::string app_id = "example";
1620f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1621f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  RegisterApp(app_id);
1622f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1623f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
1624f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
1625f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1626f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1627f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1628f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor
1629f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1630f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor            fake_drive_service_helper()->AddFile(
1631f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                app_root_folder_id, "conflict_to_pending_remote", "hoge",
1632f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor                NULL));
163314f79002e58556798e86168c63e48d533287eda5Douglas Gregor
163414f79002e58556798e86168c63e48d533287eda5Douglas Gregor  FetchRemoteChanges();
16354fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor
16364fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
16374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor            fake_drive_service_helper()->AddFile(
16384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor                app_root_folder_id, "conflict_to_existing_remote", "fuga",
16399c7361006b8cd95333958150dd0c803261807b68Douglas Gregor                NULL));
16409c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16419c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
16429c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  VerifyConsistency();
16439c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16449c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  EXPECT_EQ(1u, CountApp());
16459c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  EXPECT_EQ(3u, CountLocalFile(app_id));
16469c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
16470b1fb988012da21d996c43e36867787a7a07b889Chris Lattner  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
16480b1fb988012da21d996c43e36867787a7a07b889Chris Lattner
16490b1fb988012da21d996c43e36867787a7a07b889Chris Lattner  EXPECT_EQ(4u, CountMetadata());
1650a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl  EXPECT_EQ(4u, CountTracker());
16517c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner}
16527c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
1653c1f9d828c733ec1eba06d01070735d1f36fda733Chris LattnerTEST_F(DriveBackendSyncTest, ConflictTest_DeleteFile_UpdateFile) {
1654c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner  std::string app_id = "example";
1655c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner
16568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  RegisterApp(app_id);
1657c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner
16582eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
16592eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
16602eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1661ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
16621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
16633397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  VerifyConsistency();
16642eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor
16652eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor  // Test body starts from here.
16662eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
16671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1668ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor
16697c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner  EXPECT_EQ(google_apis::HTTP_SUCCESS,
16707c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner            fake_drive_service_helper()->UpdateFile(
16716a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote")),
167220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer                "hoge"));
16739c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  FetchRemoteChanges();
16759c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16769c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  EXPECT_EQ(google_apis::HTTP_SUCCESS,
1677040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor            fake_drive_service_helper()->UpdateFile(
1678040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote")),
16797c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner                "fuga"));
16809c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16819c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
16829c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  VerifyConsistency();
16839c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
16849c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  EXPECT_EQ(1u, CountApp());
16859c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  EXPECT_EQ(3u, CountLocalFile(app_id));
16869c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  VerifyLocalFile(app_id, FPL("conflict_to_pending_remote"), "hoge");
16879c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  VerifyLocalFile(app_id, FPL("conflict_to_existing_remote"), "fuga");
16889c7361006b8cd95333958150dd0c803261807b68Douglas Gregor
1689040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor  EXPECT_EQ(4u, CountMetadata());
1690040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor  EXPECT_EQ(4u, CountTracker());
1691040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor}
1692040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor
1693040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas GregorTEST_F(DriveBackendSyncTest, ConflictTest_DeleteFile_DeleteFile) {
1694040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor  std::string app_id = "example";
1695040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor
1696040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor  RegisterApp(app_id);
1697040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor
16989c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  std::string app_root_folder_id = GetFileIDByPath(app_id, FPL(""));
16999c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_pending_remote"), "foo");
17009c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  AddOrUpdateLocalFile(app_id, FPL("conflict_to_existing_remote"), "bar");
1701040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor
1702040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
1703040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor  VerifyConsistency();
17043397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl
17057c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner  // Test body starts from here.
17063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl  RemoveLocal(app_id, FPL("conflict_to_pending_remote"));
1707ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor  RemoveLocal(app_id, FPL("conflict_to_existing_remote"));
1708ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor
1709ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
1710ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor            fake_drive_service_helper()->DeleteResource(
1711ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_pending_remote"))));
171220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer
17139c7361006b8cd95333958150dd0c803261807b68Douglas Gregor  FetchRemoteChanges();
17147c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
17157c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner  EXPECT_EQ(google_apis::HTTP_NO_CONTENT,
17169c7361006b8cd95333958150dd0c803261807b68Douglas Gregor            fake_drive_service_helper()->DeleteResource(
17179c7361006b8cd95333958150dd0c803261807b68Douglas Gregor                GetFileIDByPath(app_id, FPL("conflict_to_existing_remote"))));
17187c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
17197c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner  EXPECT_EQ(SYNC_STATUS_OK, ProcessChangesUntilDone());
17201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  VerifyConsistency();
17217c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
17227c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner  EXPECT_EQ(1u, CountApp());
17238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EXPECT_EQ(1u, CountLocalFile(app_id));
17247c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
17258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl  EXPECT_EQ(2u, CountMetadata());
17261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  EXPECT_EQ(2u, CountTracker());
17277c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner}
17287c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner
17297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner}  // namespace drive_backend
17307c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner}  // namespace sync_file_system
17317c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner