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