Home | History | Annotate | Download | only in image_writer_private
      1 // Copyright 2013 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 #include "chrome/browser/extensions/api/image_writer_private/test_utils.h"
      6 
      7 #if defined(OS_CHROMEOS)
      8 #include "chromeos/dbus/dbus_thread_manager.h"
      9 #include "chromeos/dbus/fake_dbus_thread_manager.h"
     10 #include "chromeos/dbus/fake_image_burner_client.h"
     11 #endif
     12 
     13 namespace extensions {
     14 namespace image_writer {
     15 
     16 #if defined(OS_CHROMEOS)
     17 namespace {
     18 
     19 class ImageWriterFakeImageBurnerClient
     20     : public chromeos::FakeImageBurnerClient {
     21  public:
     22   ImageWriterFakeImageBurnerClient() {}
     23   virtual ~ImageWriterFakeImageBurnerClient() {}
     24 
     25   virtual void SetEventHandlers(
     26       const BurnFinishedHandler& burn_finished_handler,
     27       const BurnProgressUpdateHandler& burn_progress_update_handler) OVERRIDE {
     28     burn_finished_handler_ = burn_finished_handler;
     29     burn_progress_update_handler_ = burn_progress_update_handler;
     30   }
     31 
     32   virtual void BurnImage(const std::string& from_path,
     33                          const std::string& to_path,
     34                          const ErrorCallback& error_callback) OVERRIDE {
     35     base::MessageLoop::current()->PostTask(FROM_HERE,
     36         base::Bind(burn_progress_update_handler_, to_path, 0, 100));
     37     base::MessageLoop::current()->PostTask(FROM_HERE,
     38         base::Bind(burn_progress_update_handler_, to_path, 50, 100));
     39     base::MessageLoop::current()->PostTask(FROM_HERE,
     40         base::Bind(burn_progress_update_handler_, to_path, 100, 100));
     41     base::MessageLoop::current()->PostTask(FROM_HERE,
     42         base::Bind(burn_finished_handler_, to_path, true, ""));
     43   }
     44 
     45  private:
     46   BurnFinishedHandler burn_finished_handler_;
     47   BurnProgressUpdateHandler burn_progress_update_handler_;
     48 };
     49 
     50 } // namespace
     51 #endif
     52 
     53 MockOperationManager::MockOperationManager() : OperationManager(NULL) {}
     54 MockOperationManager::MockOperationManager(content::BrowserContext* context)
     55     : OperationManager(context) {}
     56 MockOperationManager::~MockOperationManager() {}
     57 
     58 #if defined(OS_CHROMEOS)
     59 FakeDiskMountManager::FakeDiskMountManager() {}
     60 FakeDiskMountManager::~FakeDiskMountManager() {}
     61 
     62 void FakeDiskMountManager::UnmountDeviceRecursively(
     63     const std::string& device_path,
     64     const UnmountDeviceRecursivelyCallbackType& callback) {
     65   base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(callback, true));
     66 }
     67 #endif
     68 
     69 FakeImageWriterClient::FakeImageWriterClient() {}
     70 FakeImageWriterClient::~FakeImageWriterClient() {}
     71 
     72 void FakeImageWriterClient::Write(const ProgressCallback& progress_callback,
     73                                   const SuccessCallback& success_callback,
     74                                   const ErrorCallback& error_callback,
     75                                   const base::FilePath& source,
     76                                   const base::FilePath& target) {
     77   progress_callback_ = progress_callback;
     78   success_callback_ = success_callback;
     79   error_callback_ = error_callback;
     80 }
     81 
     82 void FakeImageWriterClient::Verify(const ProgressCallback& progress_callback,
     83                                    const SuccessCallback& success_callback,
     84                                    const ErrorCallback& error_callback,
     85                                    const base::FilePath& source,
     86                                    const base::FilePath& target) {
     87   progress_callback_ = progress_callback;
     88   success_callback_ = success_callback;
     89   error_callback_ = error_callback;
     90 }
     91 
     92 void FakeImageWriterClient::Cancel(const CancelCallback& cancel_callback) {
     93   cancel_callback_ = cancel_callback;
     94 }
     95 
     96 void FakeImageWriterClient::Shutdown() {
     97   // Clear handlers to not hold any reference to the caller.
     98   success_callback_ = base::Closure();
     99   progress_callback_ = base::Callback<void(int64)>();
    100   error_callback_ = base::Callback<void(const std::string&)>();
    101   cancel_callback_ = base::Closure();
    102 }
    103 
    104 void FakeImageWriterClient::Progress(int64 progress) {
    105   progress_callback_.Run(progress);
    106 }
    107 
    108 void FakeImageWriterClient::Success() { success_callback_.Run(); }
    109 
    110 void FakeImageWriterClient::Error(const std::string& message) {
    111   error_callback_.Run(message);
    112 }
    113 
    114 void FakeImageWriterClient::Cancel() { cancel_callback_.Run(); }
    115 
    116 scoped_refptr<FakeImageWriterClient> FakeImageWriterClient::Create() {
    117   return scoped_refptr<FakeImageWriterClient>(new FakeImageWriterClient());
    118 }
    119 
    120 ImageWriterUnitTestBase::ImageWriterUnitTestBase()
    121     : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {}
    122 ImageWriterUnitTestBase::~ImageWriterUnitTestBase() {}
    123 
    124 void ImageWriterUnitTestBase::SetUp() {
    125   testing::Test::SetUp();
    126 
    127   ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
    128   ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(),
    129                                              &test_image_path_));
    130   ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(),
    131                                              &test_device_path_));
    132 
    133   ASSERT_TRUE(FillFile(test_image_path_, kImagePattern, kTestFileSize));
    134   ASSERT_TRUE(FillFile(test_device_path_, kDevicePattern, kTestFileSize));
    135 
    136 #if defined(OS_CHROMEOS)
    137   if (!chromeos::DBusThreadManager::IsInitialized()) {
    138     chromeos::FakeDBusThreadManager* fake_dbus_thread_manager =
    139         new chromeos::FakeDBusThreadManager;
    140     scoped_ptr<chromeos::ImageBurnerClient>
    141         image_burner_fake(new ImageWriterFakeImageBurnerClient());
    142     fake_dbus_thread_manager->SetImageBurnerClient(image_burner_fake.Pass());
    143     chromeos::DBusThreadManager::InitializeForTesting(fake_dbus_thread_manager);
    144   }
    145   FakeDiskMountManager* disk_manager = new FakeDiskMountManager();
    146   chromeos::disks::DiskMountManager::InitializeForTesting(disk_manager);
    147 
    148   // Adds a disk entry for test_device_path_ with the same device and file path.
    149   disk_manager->CreateDiskEntryForMountDevice(
    150       chromeos::disks::DiskMountManager::MountPointInfo(
    151           test_device_path_.value(),
    152           "/dummy/mount",
    153           chromeos::MOUNT_TYPE_DEVICE,
    154           chromeos::disks::MOUNT_CONDITION_NONE),
    155       "device_id",
    156       "device_label",
    157       "Vendor",
    158       "Product",
    159       chromeos::DEVICE_TYPE_USB,
    160       kTestFileSize,
    161       true,
    162       true,
    163       false);
    164   disk_manager->SetupDefaultReplies();
    165 #endif
    166 }
    167 
    168 void ImageWriterUnitTestBase::TearDown() {
    169 #if defined(OS_CHROMEOS)
    170   chromeos::DBusThreadManager::Shutdown();
    171   chromeos::disks::DiskMountManager::Shutdown();
    172 #endif
    173 }
    174 
    175 bool ImageWriterUnitTestBase::ImageWrittenToDevice(
    176     const base::FilePath& image_path,
    177     const base::FilePath& device_path) {
    178   scoped_ptr<char[]> image_buffer(new char[kTestFileSize]);
    179   scoped_ptr<char[]> device_buffer(new char[kTestFileSize]);
    180 
    181   int image_bytes_read =
    182       ReadFile(image_path, image_buffer.get(), kTestFileSize);
    183 
    184   if (image_bytes_read < 0)
    185     return false;
    186 
    187   int device_bytes_read =
    188       ReadFile(device_path, device_buffer.get(), kTestFileSize);
    189 
    190   if (image_bytes_read != device_bytes_read)
    191     return false;
    192 
    193   return memcmp(image_buffer.get(), device_buffer.get(), image_bytes_read) == 0;
    194 }
    195 
    196 bool ImageWriterUnitTestBase::FillFile(const base::FilePath& file,
    197                                        const int pattern,
    198                                        const int length) {
    199   scoped_ptr<char[]> buffer(new char[length]);
    200   memset(buffer.get(), pattern, length);
    201 
    202   return base::WriteFile(file, buffer.get(), length) == length;
    203 }
    204 
    205 }  // namespace image_writer
    206 }  // namespace extensions
    207