1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_DRIVE_FAKE_DRIVE_SERVICE_H_ 6 #define CHROME_BROWSER_DRIVE_FAKE_DRIVE_SERVICE_H_ 7 8 #include "base/files/file_path.h" 9 #include "chrome/browser/drive/drive_service_interface.h" 10 11 namespace base { 12 class DictionaryValue; 13 } 14 15 namespace google_apis { 16 class AboutResource; 17 class ChangeResource; 18 class FileResource; 19 } 20 21 namespace drive { 22 23 // This class implements a fake DriveService which acts like a real Drive 24 // service. The fake service works as follows: 25 // 26 // 1) Load JSON files and construct the in-memory resource list. 27 // 2) Return valid responses based on the the in-memory resource list. 28 // 3) Update the in-memory resource list by requests like DeleteResource(). 29 class FakeDriveService : public DriveServiceInterface { 30 public: 31 class ChangeObserver { 32 public: 33 virtual ~ChangeObserver() {} 34 virtual void OnNewChangeAvailable() = 0; 35 }; 36 37 FakeDriveService(); 38 virtual ~FakeDriveService(); 39 40 // Loads the app list for Drive API. Returns true on success. 41 bool LoadAppListForDriveApi(const std::string& relative_path); 42 43 // Adds an app to app list. 44 void AddApp(const std::string& app_id, 45 const std::string& app_name, 46 const std::string& product_id, 47 const std::string& create_url); 48 49 // Removes an app by product id. 50 void RemoveAppByProductId(const std::string& product_id); 51 52 // Returns true if the service knows the given drive app id. 53 bool HasApp(const std::string& app_id) const; 54 55 // Changes the offline state. All functions fail with GDATA_NO_CONNECTION 56 // when offline. By default the offline state is false. 57 void set_offline(bool offline) { offline_ = offline; } 58 59 // GetAllFileList never returns result when this is set to true. 60 // Used to emulate the real server's slowness. 61 void set_never_return_all_file_list(bool value) { 62 never_return_all_file_list_ = value; 63 } 64 65 // Changes the default max results returned from GetAllFileList(). 66 // By default, it's set to 0, which is unlimited. 67 void set_default_max_results(int default_max_results) { 68 default_max_results_ = default_max_results; 69 } 70 71 // Sets the url to the test server to be used as a base for generated share 72 // urls to the share dialog. 73 void set_share_url_base(const GURL& share_url_base) { 74 share_url_base_ = share_url_base; 75 } 76 77 // Changes the quota fields returned from GetAboutResource(). 78 void SetQuotaValue(int64 used, int64 total); 79 80 // Returns the AboutResource. 81 const google_apis::AboutResource& about_resource() const { 82 return *about_resource_; 83 } 84 85 // Returns the number of times the file list is successfully loaded by 86 // GetAllFileList(). 87 int file_list_load_count() const { return file_list_load_count_; } 88 89 // Returns the number of times the resource list is successfully loaded by 90 // GetChangeList(). 91 int change_list_load_count() const { return change_list_load_count_; } 92 93 // Returns the number of times the resource list is successfully loaded by 94 // GetFileListInDirectory(). 95 int directory_load_count() const { return directory_load_count_; } 96 97 // Returns the number of times the about resource is successfully loaded 98 // by GetAboutResource(). 99 int about_resource_load_count() const { 100 return about_resource_load_count_; 101 } 102 103 // Returns the number of times the app list is successfully loaded by 104 // GetAppList(). 105 int app_list_load_count() const { return app_list_load_count_; } 106 107 // Returns the number of times GetAllFileList are blocked due to 108 // set_never_return_all_file_list(). 109 int blocked_file_list_load_count() const { 110 return blocked_file_list_load_count_; 111 } 112 113 // Returns the file path whose request is cancelled just before this method 114 // invocation. 115 const base::FilePath& last_cancelled_file() const { 116 return last_cancelled_file_; 117 } 118 119 // Returns the (fake) URL for the link. 120 static GURL GetFakeLinkUrl(const std::string& resource_id); 121 122 // Sets the printf format for constructing the response of AuthorizeApp(). 123 // The format string must include two %s that are to be filled with 124 // resource_id and app_id. 125 void set_open_url_format(const std::string& url_format) { 126 open_url_format_ = url_format; 127 } 128 129 // DriveServiceInterface Overrides 130 virtual void Initialize(const std::string& account_id) OVERRIDE; 131 virtual void AddObserver(DriveServiceObserver* observer) OVERRIDE; 132 virtual void RemoveObserver(DriveServiceObserver* observer) OVERRIDE; 133 virtual bool CanSendRequest() const OVERRIDE; 134 virtual std::string GetRootResourceId() const OVERRIDE; 135 virtual bool HasAccessToken() const OVERRIDE; 136 virtual void RequestAccessToken( 137 const google_apis::AuthStatusCallback& callback) OVERRIDE; 138 virtual bool HasRefreshToken() const OVERRIDE; 139 virtual void ClearAccessToken() OVERRIDE; 140 virtual void ClearRefreshToken() OVERRIDE; 141 virtual google_apis::CancelCallback GetAllFileList( 142 const google_apis::FileListCallback& callback) OVERRIDE; 143 virtual google_apis::CancelCallback GetFileListInDirectory( 144 const std::string& directory_resource_id, 145 const google_apis::FileListCallback& callback) OVERRIDE; 146 // See the comment for EntryMatchWidthQuery() in .cc file for details about 147 // the supported search query types. 148 virtual google_apis::CancelCallback Search( 149 const std::string& search_query, 150 const google_apis::FileListCallback& callback) OVERRIDE; 151 virtual google_apis::CancelCallback SearchByTitle( 152 const std::string& title, 153 const std::string& directory_resource_id, 154 const google_apis::FileListCallback& callback) OVERRIDE; 155 virtual google_apis::CancelCallback GetChangeList( 156 int64 start_changestamp, 157 const google_apis::ChangeListCallback& callback) OVERRIDE; 158 virtual google_apis::CancelCallback GetRemainingChangeList( 159 const GURL& next_link, 160 const google_apis::ChangeListCallback& callback) OVERRIDE; 161 virtual google_apis::CancelCallback GetRemainingFileList( 162 const GURL& next_link, 163 const google_apis::FileListCallback& callback) OVERRIDE; 164 virtual google_apis::CancelCallback GetFileResource( 165 const std::string& resource_id, 166 const google_apis::FileResourceCallback& callback) OVERRIDE; 167 virtual google_apis::CancelCallback GetShareUrl( 168 const std::string& resource_id, 169 const GURL& embed_origin, 170 const google_apis::GetShareUrlCallback& callback) OVERRIDE; 171 virtual google_apis::CancelCallback GetAboutResource( 172 const google_apis::AboutResourceCallback& callback) OVERRIDE; 173 virtual google_apis::CancelCallback GetAppList( 174 const google_apis::AppListCallback& callback) OVERRIDE; 175 virtual google_apis::CancelCallback DeleteResource( 176 const std::string& resource_id, 177 const std::string& etag, 178 const google_apis::EntryActionCallback& callback) OVERRIDE; 179 virtual google_apis::CancelCallback TrashResource( 180 const std::string& resource_id, 181 const google_apis::EntryActionCallback& callback) OVERRIDE; 182 virtual google_apis::CancelCallback DownloadFile( 183 const base::FilePath& local_cache_path, 184 const std::string& resource_id, 185 const google_apis::DownloadActionCallback& download_action_callback, 186 const google_apis::GetContentCallback& get_content_callback, 187 const google_apis::ProgressCallback& progress_callback) OVERRIDE; 188 virtual google_apis::CancelCallback CopyResource( 189 const std::string& resource_id, 190 const std::string& parent_resource_id, 191 const std::string& new_title, 192 const base::Time& last_modified, 193 const google_apis::FileResourceCallback& callback) OVERRIDE; 194 virtual google_apis::CancelCallback UpdateResource( 195 const std::string& resource_id, 196 const std::string& parent_resource_id, 197 const std::string& new_title, 198 const base::Time& last_modified, 199 const base::Time& last_viewed_by_me, 200 const google_apis::FileResourceCallback& callback) OVERRIDE; 201 virtual google_apis::CancelCallback AddResourceToDirectory( 202 const std::string& parent_resource_id, 203 const std::string& resource_id, 204 const google_apis::EntryActionCallback& callback) OVERRIDE; 205 virtual google_apis::CancelCallback RemoveResourceFromDirectory( 206 const std::string& parent_resource_id, 207 const std::string& resource_id, 208 const google_apis::EntryActionCallback& callback) OVERRIDE; 209 virtual google_apis::CancelCallback AddNewDirectory( 210 const std::string& parent_resource_id, 211 const std::string& directory_title, 212 const AddNewDirectoryOptions& options, 213 const google_apis::FileResourceCallback& callback) OVERRIDE; 214 virtual google_apis::CancelCallback InitiateUploadNewFile( 215 const std::string& content_type, 216 int64 content_length, 217 const std::string& parent_resource_id, 218 const std::string& title, 219 const InitiateUploadNewFileOptions& options, 220 const google_apis::InitiateUploadCallback& callback) OVERRIDE; 221 virtual google_apis::CancelCallback InitiateUploadExistingFile( 222 const std::string& content_type, 223 int64 content_length, 224 const std::string& resource_id, 225 const InitiateUploadExistingFileOptions& options, 226 const google_apis::InitiateUploadCallback& callback) OVERRIDE; 227 virtual google_apis::CancelCallback ResumeUpload( 228 const GURL& upload_url, 229 int64 start_position, 230 int64 end_position, 231 int64 content_length, 232 const std::string& content_type, 233 const base::FilePath& local_file_path, 234 const google_apis::drive::UploadRangeCallback& callback, 235 const google_apis::ProgressCallback& progress_callback) OVERRIDE; 236 virtual google_apis::CancelCallback GetUploadStatus( 237 const GURL& upload_url, 238 int64 content_length, 239 const google_apis::drive::UploadRangeCallback& callback) OVERRIDE; 240 virtual google_apis::CancelCallback AuthorizeApp( 241 const std::string& resource_id, 242 const std::string& app_id, 243 const google_apis::AuthorizeAppCallback& callback) OVERRIDE; 244 virtual google_apis::CancelCallback UninstallApp( 245 const std::string& app_id, 246 const google_apis::EntryActionCallback& callback) OVERRIDE; 247 virtual google_apis::CancelCallback AddPermission( 248 const std::string& resource_id, 249 const std::string& email, 250 google_apis::drive::PermissionRole role, 251 const google_apis::EntryActionCallback& callback) OVERRIDE; 252 253 // Adds a new file with the given parameters. On success, returns 254 // HTTP_CREATED with the parsed entry. 255 // |callback| must not be null. 256 void AddNewFile(const std::string& content_type, 257 const std::string& content_data, 258 const std::string& parent_resource_id, 259 const std::string& title, 260 bool shared_with_me, 261 const google_apis::FileResourceCallback& callback); 262 263 // Adds a new file with the given |resource_id|. If the id already exists, 264 // it's an error. This is used for testing cross profile file sharing that 265 // needs to have matching resource IDs in different fake service instances. 266 // |callback| must not be null. 267 void AddNewFileWithResourceId( 268 const std::string& resource_id, 269 const std::string& content_type, 270 const std::string& content_data, 271 const std::string& parent_resource_id, 272 const std::string& title, 273 bool shared_with_me, 274 const google_apis::FileResourceCallback& callback); 275 276 // Adds a new directory with the given |resource_id|. 277 // |callback| must not be null. 278 google_apis::CancelCallback AddNewDirectoryWithResourceId( 279 const std::string& resource_id, 280 const std::string& parent_resource_id, 281 const std::string& directory_title, 282 const AddNewDirectoryOptions& options, 283 const google_apis::FileResourceCallback& callback); 284 285 // Sets the last modified time for an entry specified by |resource_id|. 286 // On success, returns HTTP_SUCCESS with the parsed entry. 287 // |callback| must not be null. 288 void SetLastModifiedTime( 289 const std::string& resource_id, 290 const base::Time& last_modified_time, 291 const google_apis::FileResourceCallback& callback); 292 293 // Sets the user's permission for an entry specified by |resource_id|. 294 google_apis::GDataErrorCode SetUserPermission( 295 const std::string& resource_id, 296 google_apis::drive::PermissionRole user_permission); 297 298 void AddChangeObserver(ChangeObserver* observer); 299 void RemoveChangeObserver(ChangeObserver* observer); 300 301 private: 302 struct EntryInfo; 303 struct UploadSession; 304 305 // Returns a pointer to the entry that matches |resource_id|, or NULL if 306 // not found. 307 EntryInfo* FindEntryByResourceId(const std::string& resource_id); 308 309 // Returns a new resource ID, which looks like "resource_id_<num>" where 310 // <num> is a monotonically increasing number starting from 1. 311 std::string GetNewResourceId(); 312 313 // Increments |largest_changestamp_| and adds the new changestamp. 314 void AddNewChangestamp(google_apis::ChangeResource* change); 315 316 // Update ETag of |file| based on |largest_changestamp_|. 317 void UpdateETag(google_apis::FileResource* file); 318 319 // Adds a new entry based on the given parameters. 320 // |resource_id| can be empty, in the case, the id is automatically generated. 321 // Returns a pointer to the newly added entry, or NULL if failed. 322 const EntryInfo* AddNewEntry( 323 const std::string& resource_id, 324 const std::string& content_type, 325 const std::string& content_data, 326 const std::string& parent_resource_id, 327 const std::string& title, 328 bool shared_with_me); 329 330 // Core implementation of GetChangeList. 331 // This method returns the slice of the all matched entries, and its range 332 // is between |start_offset| (inclusive) and |start_offset| + |max_results| 333 // (exclusive). 334 // Increments *load_counter by 1 before it returns successfully. 335 void GetChangeListInternal( 336 int64 start_changestamp, 337 const std::string& search_query, 338 const std::string& directory_resource_id, 339 int start_offset, 340 int max_results, 341 int* load_counter, 342 const google_apis::ChangeListCallback& callback); 343 344 // Returns new upload session URL. 345 GURL GetNewUploadSessionUrl(); 346 347 void NotifyObservers(); 348 349 typedef std::map<std::string, EntryInfo*> EntryInfoMap; 350 EntryInfoMap entries_; 351 scoped_ptr<google_apis::AboutResource> about_resource_; 352 scoped_ptr<base::DictionaryValue> app_info_value_; 353 std::map<GURL, UploadSession> upload_sessions_; 354 int64 published_date_seq_; 355 int64 next_upload_sequence_number_; 356 int default_max_results_; 357 int resource_id_count_; 358 int file_list_load_count_; 359 int change_list_load_count_; 360 int directory_load_count_; 361 int about_resource_load_count_; 362 int app_list_load_count_; 363 int blocked_file_list_load_count_; 364 bool offline_; 365 bool never_return_all_file_list_; 366 base::FilePath last_cancelled_file_; 367 GURL share_url_base_; 368 std::string app_json_template_; 369 std::string open_url_format_; 370 371 ObserverList<ChangeObserver> change_observers_; 372 373 base::WeakPtrFactory<FakeDriveService> weak_ptr_factory_; 374 375 DISALLOW_COPY_AND_ASSIGN(FakeDriveService); 376 }; 377 378 } // namespace drive 379 380 #endif // CHROME_BROWSER_DRIVE_FAKE_DRIVE_SERVICE_H_ 381