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