1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/directory_loader.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/callback_helpers.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/files/scoped_temp_dir.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/prefs/testing_pref_service.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/run_loop.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/change_list_loader.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/change_list_loader_observer.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_cache.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/job_scheduler.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/resource_metadata.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/test_util.h" 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/drive/event_logger.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/drive/fake_drive_service.h" 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/drive/test_util.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "google_apis/drive/drive_api_parser.h" 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "google_apis/drive/test_util.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace drive { 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace internal { 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace { 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class TestDirectoryLoaderObserver : public ChangeListLoaderObserver { 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) explicit TestDirectoryLoaderObserver(DirectoryLoader* loader) 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : loader_(loader) { 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) loader_->AddObserver(this); 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual ~TestDirectoryLoaderObserver() { 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) loader_->RemoveObserver(this); 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::set<base::FilePath>& changed_directories() const { 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return changed_directories_; 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void clear_changed_directories() { changed_directories_.clear(); } 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // ChageListObserver overrides: 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnDirectoryReloaded( 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath& directory_path) OVERRIDE { 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) changed_directories_.insert(directory_path); 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DirectoryLoader* loader_; 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::set<base::FilePath> changed_directories_; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestDirectoryLoaderObserver); 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid AccumulateReadDirectoryResult(ResourceEntryVector* out_entries, 62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scoped_ptr<ResourceEntryVector> entries) { 63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_TRUE(entries); 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch out_entries->insert(out_entries->end(), entries->begin(), entries->end()); 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class DirectoryLoaderTest : public testing::Test { 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected: 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetUp() OVERRIDE { 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) pref_service_.reset(new TestingPrefServiceSimple); 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) test_util::RegisterDrivePrefs(pref_service_->registry()); 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) logger_.reset(new EventLogger); 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) drive_service_.reset(new FakeDriveService); 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ASSERT_TRUE(test_util::SetUpTestEntries(drive_service_.get())); 80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scheduler_.reset(new JobScheduler(pref_service_.get(), 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) logger_.get(), 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) drive_service_.get(), 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoopProxy::current().get())); 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) metadata_storage_.reset(new ResourceMetadataStorage( 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) temp_dir_.path(), base::MessageLoopProxy::current().get())); 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(metadata_storage_->Initialize()); 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) cache_.reset(new FileCache(metadata_storage_.get(), 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) temp_dir_.path(), 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoopProxy::current().get(), 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL /* free_disk_space_getter */)); 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(cache_->Initialize()); 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) metadata_.reset(new ResourceMetadata( 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) metadata_storage_.get(), cache_.get(), 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoopProxy::current().get())); 98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, metadata_->Initialize()); 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) about_resource_loader_.reset(new AboutResourceLoader(scheduler_.get())); 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) loader_controller_.reset(new LoaderController); 102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) directory_loader_.reset( 103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new DirectoryLoader(logger_.get(), 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::MessageLoopProxy::current().get(), 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) metadata_.get(), 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scheduler_.get(), 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) about_resource_loader_.get(), 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) loader_controller_.get())); 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Adds a new file to the root directory of the service. 11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<google_apis::FileResource> AddNewFile(const std::string& title) { 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) google_apis::GDataErrorCode error = google_apis::GDATA_FILE_ERROR; 11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<google_apis::FileResource> entry; 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) drive_service_->AddNewFile( 116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "text/plain", 117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "content text", 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) drive_service_->GetRootResourceId(), 119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) title, 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) false, // shared_with_me 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error, &entry)); 122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(google_apis::HTTP_CREATED, error); 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return entry.Pass(); 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ScopedTempDir temp_dir_; 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<TestingPrefServiceSimple> pref_service_; 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<EventLogger> logger_; 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<FakeDriveService> drive_service_; 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<JobScheduler> scheduler_; 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<ResourceMetadataStorage, 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) test_util::DestroyHelperForTests> metadata_storage_; 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<FileCache, test_util::DestroyHelperForTests> cache_; 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<ResourceMetadata, test_util::DestroyHelperForTests> metadata_; 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<AboutResourceLoader> about_resource_loader_; 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<LoaderController> loader_controller_; 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<DirectoryLoader> directory_loader_; 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(DirectoryLoaderTest, ReadDirectory_GrandRoot) { 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestDirectoryLoaderObserver observer(directory_loader_.get()); 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Load grand root. 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceEntryVector entries; 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) directory_loader_->ReadDirectory( 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) util::GetDriveGrandRootPath(), 150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Bind(&AccumulateReadDirectoryResult, &entries), 151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch google_apis::test_util::CreateCopyResultCallback(&error)); 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(0U, observer.changed_directories().size()); 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) observer.clear_changed_directories(); 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // My Drive has resource ID. 158a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceEntry entry; 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) metadata_->GetResourceEntryByPath(util::GetDriveMyDriveRootPath(), 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &entry)); 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(drive_service_->GetRootResourceId(), entry.resource_id()); 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(DirectoryLoaderTest, ReadDirectory_MyDrive) { 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestDirectoryLoaderObserver observer(directory_loader_.get()); 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // My Drive does not have resource ID yet. 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceEntry entry; 170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) metadata_->GetResourceEntryByPath(util::GetDriveMyDriveRootPath(), 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &entry)); 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(entry.resource_id().empty()); 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Load My Drive. 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceEntryVector entries; 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) directory_loader_->ReadDirectory( 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) util::GetDriveMyDriveRootPath(), 180a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Bind(&AccumulateReadDirectoryResult, &entries), 181a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch google_apis::test_util::CreateCopyResultCallback(&error)); 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, observer.changed_directories().count( 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) util::GetDriveMyDriveRootPath())); 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // My Drive has resource ID. 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) metadata_->GetResourceEntryByPath(util::GetDriveMyDriveRootPath(), 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &entry)); 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(drive_service_->GetRootResourceId(), entry.resource_id()); 192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(drive_service_->about_resource().largest_change_id(), 193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch entry.directory_specific_info().changestamp()); 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // My Drive's child is present. 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::FilePath file_path = 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) util::GetDriveMyDriveRootPath().AppendASCII("File 1.txt"); 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) metadata_->GetResourceEntryByPath(file_path, &entry)); 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(DirectoryLoaderTest, ReadDirectory_MultipleCalls) { 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestDirectoryLoaderObserver observer(directory_loader_.get()); 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Load grand root. 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceEntryVector entries; 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) directory_loader_->ReadDirectory( 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) util::GetDriveGrandRootPath(), 210a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Bind(&AccumulateReadDirectoryResult, &entries), 211a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch google_apis::test_util::CreateCopyResultCallback(&error)); 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Load grand root again without waiting for the result. 214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FileError error2 = FILE_ERROR_FAILED; 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceEntryVector entries2; 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) directory_loader_->ReadDirectory( 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) util::GetDriveGrandRootPath(), 218a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Bind(&AccumulateReadDirectoryResult, &entries2), 219a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch google_apis::test_util::CreateCopyResultCallback(&error2)); 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 222a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Callback is called for each method call. 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error2); 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(DirectoryLoaderTest, Lock) { 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Lock the loader. 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<base::ScopedClosureRunner> lock = loader_controller_->GetLock(); 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Start loading. 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TestDirectoryLoaderObserver observer(directory_loader_.get()); 233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceEntryVector entries; 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) directory_loader_->ReadDirectory( 236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) util::GetDriveMyDriveRootPath(), 237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::Bind(&AccumulateReadDirectoryResult, &entries), 238a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch google_apis::test_util::CreateCopyResultCallback(&error)); 239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Update is pending due to the lock. 242a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(observer.changed_directories().empty()); 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Unlock the loader, this should resume the pending udpate. 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) lock.reset(); 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(1U, observer.changed_directories().count( 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) util::GetDriveMyDriveRootPath())); 249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 250a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace internal 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace drive 253