158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/sync_engine_initializer.h"
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/bind.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
98bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/run_loop.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/thread_task_runner_handle.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/drive/drive_api_util.h"
12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/drive/drive_uploader.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/drive/fake_drive_service.h"
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/drive_backend_constants.h"
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/drive_backend_test_util.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
18e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "chrome/browser/sync_file_system/drive_backend/sync_engine_context.h"
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h"
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/sync_file_system/sync_file_system_test_util.h"
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/drive_api_parser.h"
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_wapi_parser.h"
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/leveldatabase/src/helpers/memenv/memenv.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "third_party/leveldatabase/src/include/leveldb/env.h"
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace sync_file_system {
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace drive_backend {
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)const int64 kInitialLargestChangeID = 1234;
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class SyncEngineInitializerTest : public testing::Test {
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  struct TrackedFile {
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_ptr<google_apis::FileResource> resource;
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FileMetadata metadata;
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    FileTracker tracker;
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SyncEngineInitializerTest() {}
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~SyncEngineInitializerTest() {}
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default()));
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<drive::DriveServiceInterface>
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        fake_drive_service(new drive::FakeDriveService);
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    sync_context_.reset(new SyncEngineContext(
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        fake_drive_service.Pass(),
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        scoped_ptr<drive::DriveUploaderInterface>(),
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        NULL,
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::ThreadTaskRunnerHandle::Get(),
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::ThreadTaskRunnerHandle::Get()));
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    sync_task_manager_.reset(new SyncTaskManager(
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        base::WeakPtr<SyncTaskManager::Client>(),
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        1 /* maximum_parallel_task */,
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::ThreadTaskRunnerHandle::Get()));
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    sync_task_manager_->Initialize(SYNC_STATUS_OK);
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    sync_task_manager_.reset();
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    metadata_database_.reset();
72e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    sync_context_.reset();
738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::FilePath database_path() {
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return database_dir_.path();
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SyncStatusCode RunInitializer() {
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    SyncEngineInitializer* initializer =
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        new SyncEngineInitializer(sync_context_.get(),
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  database_path(),
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                  in_memory_env_.get());
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    SyncStatusCode status = SYNC_STATUS_UNKNOWN;
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    sync_task_manager_->ScheduleSyncTask(
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        FROM_HERE,
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        scoped_ptr<SyncTask>(initializer),
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        SyncTaskManager::PRIORITY_MED,
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        base::Bind(&SyncEngineInitializerTest::DidRunInitializer,
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                   base::Unretained(this), initializer, &status));
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::RunLoop().RunUntilIdle();
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return status;
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void DidRunInitializer(SyncEngineInitializer* initializer,
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                         SyncStatusCode* status_out,
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                         SyncStatusCode status) {
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    *status_out = status;
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    metadata_database_ = initializer->PassMetadataDatabase();
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SyncStatusCode PopulateDatabase(
10668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const google_apis::FileResource& sync_root,
10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const google_apis::FileResource** app_roots,
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      size_t app_roots_count) {
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    SyncStatusCode status = SYNC_STATUS_UNKNOWN;
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<MetadataDatabase> database = MetadataDatabase::Create(
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        database_path(), in_memory_env_.get(), &status);
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (status != SYNC_STATUS_OK)
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return status;
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // |app_root_list| must not own the resources here. Be sure to call
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // weak_clear later.
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ScopedVector<google_apis::FileResource> app_root_list;
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    for (size_t i = 0; i < app_roots_count; ++i) {
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      app_root_list.push_back(
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          const_cast<google_apis::FileResource*>(app_roots[i]));
12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    status = database->PopulateInitialData(
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        kInitialLargestChangeID, sync_root, app_root_list);
12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    app_root_list.weak_clear();
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return status;
12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> CreateRemoteFolder(
13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::string& parent_folder_id,
13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::string& title) {
13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR;
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_ptr<google_apis::FileResource> entry;
135e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    sync_context_->GetDriveService()->AddNewDirectory(
13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        parent_folder_id, title,
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        drive::DriveServiceInterface::AddNewDirectoryOptions(),
13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        CreateResultReceiver(&error, &entry));
1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(google_apis::HTTP_CREATED, error);
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return entry.Pass();
14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> CreateRemoteSyncRoot() {
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    scoped_ptr<google_apis::FileResource> sync_root(
14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        CreateRemoteFolder(std::string(), kSyncRootFolderTitle));
14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    for (size_t i = 0; i < sync_root->parents().size(); ++i) {
15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR;
151e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      sync_context_->GetDriveService()->RemoveResourceFromDirectory(
152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          sync_root->parents()[i].file_id(),
15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          sync_root->file_id(),
15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)          CreateResultReceiver(&error));
1558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      base::RunLoop().RunUntilIdle();
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(google_apis::HTTP_NO_CONTENT, error);
15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return sync_root.Pass();
16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string GetSyncRootFolderID() {
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int64 sync_root_tracker_id = metadata_database_->GetSyncRootTrackerID();
16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    FileTracker sync_root_tracker;
16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_TRUE(metadata_database_->FindTrackerByTrackerID(
16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        sync_root_tracker_id, &sync_root_tracker));
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return sync_root_tracker.file_id();
16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  size_t CountTrackersForFile(const std::string& file_id) {
171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    TrackerIDSet trackers;
17268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    metadata_database_->FindTrackersByFileID(file_id, &trackers);
173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return trackers.size();
17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool HasActiveTracker(const std::string& file_id) {
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    TrackerIDSet trackers;
17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return metadata_database_->FindTrackersByFileID(file_id, &trackers) &&
17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        trackers.has_active();
18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool HasNoParent(const std::string& file_id) {
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR;
18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_ptr<google_apis::FileResource> entry;
18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    sync_context_->GetDriveService()->GetFileResource(
18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        file_id,
18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        CreateResultReceiver(&error, &entry));
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ(google_apis::HTTP_SUCCESS, error);
19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return entry->parents().empty();
19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  size_t CountFileMetadata() {
194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return metadata_database_->CountFileMetadata();
19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  size_t CountFileTracker() {
198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return metadata_database_->CountFileTracker();
19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  google_apis::GDataErrorCode AddParentFolder(
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::string& new_parent_folder_id,
20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      const std::string& file_id) {
20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR;
205e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    sync_context_->GetDriveService()->AddResourceToDirectory(
20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        new_parent_folder_id, file_id,
20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        CreateResultReceiver(&error));
2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    base::RunLoop().RunUntilIdle();
20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return error;
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::TestBrowserThreadBundle browser_threads_;
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::ScopedTempDir database_dir_;
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<leveldb::Env> in_memory_env_;
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<MetadataDatabase> metadata_database_;
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<SyncTaskManager> sync_task_manager_;
219e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  scoped_ptr<SyncEngineContext> sync_context_;
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SyncEngineInitializerTest);
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(SyncEngineInitializerTest, EmptyDatabase_NoRemoteSyncRoot) {
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK, RunInitializer());
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::string sync_root_folder_id = GetSyncRootFolderID();
22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, CountTrackersForFile(sync_root_folder_id));
22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(HasActiveTracker(sync_root_folder_id));
23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, CountFileMetadata());
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, CountFileTracker());
23468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(SyncEngineInitializerTest, EmptyDatabase_RemoteSyncRootExists) {
23768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> sync_root(
23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      CreateRemoteSyncRoot());
23968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> app_root_1(
24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      CreateRemoteFolder(sync_root->file_id(), "app-root 1"));
24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> app_root_2(
24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      CreateRemoteFolder(sync_root->file_id(), "app-root 2"));
24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK, RunInitializer());
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, CountTrackersForFile(sync_root->file_id()));
24768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, CountTrackersForFile(app_root_1->file_id()));
24868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, CountTrackersForFile(app_root_2->file_id()));
24968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(HasActiveTracker(sync_root->file_id()));
25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(HasActiveTracker(app_root_1->file_id()));
25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(HasActiveTracker(app_root_2->file_id()));
25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(3u, CountFileMetadata());
255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(3u, CountFileTracker());
25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(SyncEngineInitializerTest, DatabaseAlreadyInitialized) {
25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> sync_root(CreateRemoteSyncRoot());
26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> app_root_1(
26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      CreateRemoteFolder(sync_root->file_id(), "app-root 1"));
26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> app_root_2(
26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      CreateRemoteFolder(sync_root->file_id(), "app-root 2"));
26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  const google_apis::FileResource* app_roots[] = {
26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    app_root_1.get(), app_root_2.get()
26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  };
26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK,
26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)            PopulateDatabase(*sync_root, app_roots, arraysize(app_roots)));
27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK, RunInitializer());
27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, CountTrackersForFile(sync_root->file_id()));
27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, CountTrackersForFile(app_root_1->file_id()));
27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, CountTrackersForFile(app_root_2->file_id()));
27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(HasActiveTracker(sync_root->file_id()));
27868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(HasActiveTracker(app_root_1->file_id()));
27968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(HasActiveTracker(app_root_2->file_id()));
28068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
281a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(3u, CountFileMetadata());
282a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(3u, CountFileTracker());
28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(SyncEngineInitializerTest, EmptyDatabase_MultiCandidate) {
28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> sync_root_1(CreateRemoteSyncRoot());
28768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> sync_root_2(CreateRemoteSyncRoot());
28868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
28968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK, RunInitializer());
29068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
29168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, CountTrackersForFile(sync_root_1->file_id()));
29268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, CountTrackersForFile(sync_root_2->file_id()));
29368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
29468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(HasActiveTracker(sync_root_1->file_id()));
29568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(HasActiveTracker(sync_root_2->file_id()));
29668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
297a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, CountFileMetadata());
298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, CountFileTracker());
29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
30068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(SyncEngineInitializerTest, EmptyDatabase_UndetachedRemoteSyncRoot) {
30268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> sync_root(CreateRemoteFolder(
30368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      std::string(), kSyncRootFolderTitle));
30468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK, RunInitializer());
30568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, CountTrackersForFile(sync_root->file_id()));
30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(HasActiveTracker(sync_root->file_id()));
30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(HasNoParent(sync_root->file_id()));
31068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
311a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, CountFileMetadata());
312a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, CountFileTracker());
31368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
31468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
31568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(SyncEngineInitializerTest, EmptyDatabase_MultiparentSyncRoot) {
31668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> folder(CreateRemoteFolder(
31768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      std::string(), "folder"));
31868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> sync_root(CreateRemoteFolder(
31968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      std::string(), kSyncRootFolderTitle));
32068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AddParentFolder(sync_root->file_id(), folder->file_id());
32168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
32268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK, RunInitializer());
32368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
32468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(1u, CountTrackersForFile(sync_root->file_id()));
32568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(HasActiveTracker(sync_root->file_id()));
32668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
32768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(HasNoParent(sync_root->file_id()));
32868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
329a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, CountFileMetadata());
330a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, CountFileTracker());
33168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
33368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(SyncEngineInitializerTest, EmptyDatabase_FakeRemoteSyncRoot) {
33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> folder(CreateRemoteFolder(
33568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      std::string(), "folder"));
33668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  scoped_ptr<google_apis::FileResource> sync_root(CreateRemoteFolder(
33768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      folder->file_id(), kSyncRootFolderTitle));
33868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
33968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(SYNC_STATUS_OK, RunInitializer());
34068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
34168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_EQ(0u, CountTrackersForFile(sync_root->file_id()));
34268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(HasNoParent(sync_root->file_id()));
34368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
344a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, CountFileMetadata());
345a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(1u, CountFileTracker());
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace drive_backend
34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace sync_file_system
350