190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// found in the LICENSE file. 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_OPERATION_TEST_BASE_H_ 690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_OPERATION_TEST_BASE_H_ 790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include <set> 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/drive.pb.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/drive/file_change.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_errors.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/operation_delegate.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/chromeos/drive/test_util.h" 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 1790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass TestingPrefServiceSimple; 2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace base { 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class SequencedTaskRunner; 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace base 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace drive { 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class EventLogger; 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass FakeDriveService; 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class FakeFreeDiskSpaceGetter; 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class JobScheduler; 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace internal { 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class AboutResourceLoader; 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ChangeListLoader; 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class FileCache; 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class LoaderController; 3790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class ResourceMetadata; 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ResourceMetadataStorage; 3990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace internal 4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace file_system { 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// Base fixture class for testing Drive file system operations. It sets up the 4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// basic set of Drive internal classes (ResourceMetadata, Cache, etc) on top of 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// FakeDriveService for testing. 4690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class OperationTestBase : public testing::Test { 4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) protected: 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // OperationDelegate that records all the events. 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) class LoggingDelegate : public OperationDelegate { 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public: 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) typedef base::Callback<bool( 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& local_id, 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const FileOperationCallback& callback)> WaitForSyncCompleteHandler; 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LoggingDelegate(); 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ~LoggingDelegate(); 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // OperationDelegate overrides. 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnFileChangedByOperation( 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const FileChange& changed_files) OVERRIDE; 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnEntryUpdatedByOperation( 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& local_id) OVERRIDE; 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnDriveSyncError(DriveSyncErrorType type, 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& local_id) OVERRIDE; 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool WaitForSyncComplete( 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& local_id, 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const FileOperationCallback& callback) OVERRIDE; 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Gets the set of changed paths. 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const FileChange& get_changed_files() { return changed_files_; } 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Gets the set of updated local IDs. 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::set<std::string>& updated_local_ids() const { 74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return updated_local_ids_; 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Gets the list of drive sync errors. 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::vector<DriveSyncErrorType>& drive_sync_errors() const { 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return drive_sync_errors_; 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Sets the callback used to handle WaitForSyncComplete() method calls. 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void set_wait_for_sync_complete_handler( 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const WaitForSyncCompleteHandler& wait_for_sync_complete_handler) { 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) wait_for_sync_complete_handler_ = wait_for_sync_complete_handler; 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FileChange changed_files_; 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::set<std::string> updated_local_ids_; 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<DriveSyncErrorType> drive_sync_errors_; 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) WaitForSyncCompleteHandler wait_for_sync_complete_handler_; 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) }; 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) OperationTestBase(); 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch explicit OperationTestBase(int test_thread_bundle_options); 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ~OperationTestBase(); 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // testing::Test overrides. 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void SetUp() OVERRIDE; 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Returns the path of the temporary directory for putting test files. 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::FilePath temp_dir() const { return temp_dir_.path(); } 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Synchronously gets the resource entry corresponding to the path from local 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // ResourceMetadta. 10790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) FileError GetLocalResourceEntry(const base::FilePath& path, 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ResourceEntry* entry); 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Synchronously gets the resource entry corresponding to the ID from local 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ResourceMetadta. 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FileError GetLocalResourceEntryById(const std::string& local_id, 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ResourceEntry* entry); 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 115424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Gets the local ID of the entry specified by the path. 116424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) std::string GetLocalId(const base::FilePath& path); 117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Synchronously updates |metadata_| by fetching the change feed from the 119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // |fake_service_|. 120424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) FileError CheckForUpdates(); 121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 12290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Accessors for the components. 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FakeDriveService* fake_service() { 12490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return fake_drive_service_.get(); 12590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EventLogger* logger() { return logger_.get(); } 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LoggingDelegate* delegate() { return &delegate_; } 12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) JobScheduler* scheduler() { return scheduler_.get(); } 12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::SequencedTaskRunner* blocking_task_runner() { 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return blocking_task_runner_.get(); 13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FakeFreeDiskSpaceGetter* fake_free_disk_space_getter() { 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return fake_free_disk_space_getter_.get(); 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) internal::FileCache* cache() { return cache_.get(); } 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) internal::ResourceMetadata* metadata() { return metadata_.get(); } 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) internal::LoaderController* loader_controller() { 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return loader_controller_.get(); 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) internal::ChangeListLoader* change_list_loader() { 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return change_list_loader_.get(); 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 14390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; 1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<TestingPrefServiceSimple> pref_service_; 14890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::ScopedTempDir temp_dir_; 14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) LoggingDelegate delegate_; 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<EventLogger> logger_; 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FakeDriveService> fake_drive_service_; 15390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<JobScheduler> scheduler_; 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<internal::ResourceMetadataStorage, 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch test_util::DestroyHelperForTests> metadata_storage_; 15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<FakeFreeDiskSpaceGetter> fake_free_disk_space_getter_; 15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<internal::FileCache, test_util::DestroyHelperForTests> cache_; 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<internal::ResourceMetadata, test_util::DestroyHelperForTests> 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) metadata_; 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<internal::AboutResourceLoader> about_resource_loader_; 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<internal::LoaderController> loader_controller_; 162424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<internal::ChangeListLoader> change_list_loader_; 16390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace file_system 16690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} // namespace drive 16790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 16890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#endif // CHROME_BROWSER_CHROMEOS_DRIVE_FILE_SYSTEM_OPERATION_TEST_BASE_H_ 169