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