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#ifndef CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_TEST_UTILS_H_ 6#define CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_TEST_UTILS_H_ 7 8#include "base/files/file_util.h" 9#include "base/files/scoped_temp_dir.h" 10#include "base/message_loop/message_loop.h" 11#include "base/run_loop.h" 12#include "chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h" 13#include "chrome/browser/extensions/api/image_writer_private/operation_manager.h" 14#include "content/public/test/test_browser_thread_bundle.h" 15#include "content/public/test/test_utils.h" 16#include "testing/gmock/include/gmock/gmock.h" 17#include "testing/gtest/include/gtest/gtest.h" 18 19#if defined(OS_CHROMEOS) 20#include "chromeos/disks/disk_mount_manager.h" 21#include "chromeos/disks/mock_disk_mount_manager.h" 22#endif 23 24namespace extensions { 25namespace image_writer { 26 27const char kDummyExtensionId[] = "DummyExtension"; 28 29// Default file size to use in tests. Currently 32kB. 30const int kTestFileSize = 32 * 1024; 31// Pattern to use in the image file. 32const int kImagePattern = 0x55555555; // 01010101 33// Pattern to use in the device file. 34const int kDevicePattern = 0xAAAAAAAA; // 10101010 35 36// A mock around the operation manager for tracking callbacks. Note that there 37// are non-virtual methods on this class that should not be called in tests. 38class MockOperationManager : public OperationManager { 39 public: 40 MockOperationManager(); 41 explicit MockOperationManager(content::BrowserContext* context); 42 virtual ~MockOperationManager(); 43 44 MOCK_METHOD3(OnProgress, void(const ExtensionId& extension_id, 45 image_writer_api::Stage stage, 46 int progress)); 47 // Callback for completion events. 48 MOCK_METHOD1(OnComplete, void(const std::string& extension_id)); 49 50 // Callback for error events. 51 MOCK_METHOD4(OnError, void(const ExtensionId& extension_id, 52 image_writer_api::Stage stage, 53 int progress, 54 const std::string& error_message)); 55}; 56 57#if defined(OS_CHROMEOS) 58// A fake for the DiskMountManager that will successfully call the unmount 59// callback. 60class FakeDiskMountManager : public chromeos::disks::MockDiskMountManager { 61 public: 62 FakeDiskMountManager(); 63 virtual ~FakeDiskMountManager(); 64 65 virtual void UnmountDeviceRecursively( 66 const std::string& device_path, 67 const UnmountDeviceRecursivelyCallbackType& callback) OVERRIDE; 68 69 private: 70 DiskMap disks_; 71}; 72#endif 73 74class FakeImageWriterClient : public ImageWriterUtilityClient { 75 public: 76 FakeImageWriterClient(); 77 78 virtual void Write(const ProgressCallback& progress_callback, 79 const SuccessCallback& success_callback, 80 const ErrorCallback& error_callback, 81 const base::FilePath& source, 82 const base::FilePath& target) OVERRIDE; 83 84 virtual void Verify(const ProgressCallback& progress_callback, 85 const SuccessCallback& success_callback, 86 const ErrorCallback& error_callback, 87 const base::FilePath& source, 88 const base::FilePath& target) OVERRIDE; 89 90 virtual void Cancel(const CancelCallback& cancel_callback) OVERRIDE; 91 92 virtual void Shutdown() OVERRIDE; 93 94 // Sets a callback for when a Write call is made. 95 void SetWriteCallback(const base::Closure& write_callback); 96 // Sets a callback for when a Verify call is made. 97 void SetVerifyCallback(const base::Closure& verify_callback); 98 99 // Triggers the progress callback. 100 void Progress(int64 progress); 101 // Triggers the success callback. 102 void Success(); 103 // Triggers the error callback. 104 void Error(const std::string& message); 105 // Triggers the cancel callback. 106 void Cancel(); 107 108 private: 109 virtual ~FakeImageWriterClient(); 110 111 ProgressCallback progress_callback_; 112 SuccessCallback success_callback_; 113 ErrorCallback error_callback_; 114 CancelCallback cancel_callback_; 115 116 base::Closure write_callback_; 117 base::Closure verify_callback_; 118}; 119 120class ImageWriterTestUtils { 121 public: 122 ImageWriterTestUtils(); 123 virtual ~ImageWriterTestUtils(); 124 125 // Verifies that the data in image_path was written to the file at 126 // device_path. This is different from base::ContentsEqual because the device 127 // may be larger than the image. 128 bool ImageWrittenToDevice(); 129 130 // Fills |file| with |length| bytes of |pattern|, overwriting any existing 131 // data. 132 bool FillFile(const base::FilePath& file, 133 const int pattern, 134 const int length); 135 136 // Set up the test utils, creating temporary folders and such. 137 // Note that browser tests should use the alternate form and pass "true" as an 138 // argument. 139 virtual void SetUp(); 140 // Set up the test utils, creating temporary folders and such. If 141 // |is_browser_test| is true then it will use alternate initialization 142 // appropriate for a browser test. This should be run in 143 // |SetUpInProcessBrowserTestFixture|. 144 virtual void SetUp(bool is_browser_test); 145 146 virtual void TearDown(); 147 148 const base::FilePath& GetTempDir(); 149 const base::FilePath& GetImagePath(); 150 const base::FilePath& GetDevicePath(); 151 152#if !defined(OS_CHROMEOS) 153 FakeImageWriterClient* GetUtilityClient(); 154#endif 155 156 protected: 157 base::ScopedTempDir temp_dir_; 158 base::FilePath test_image_path_; 159 base::FilePath test_device_path_; 160 161#if !defined(OS_CHROMEOS) 162 scoped_refptr<FakeImageWriterClient> client_; 163#endif 164}; 165 166// Base class for unit tests that manages creating image and device files. 167class ImageWriterUnitTestBase : public testing::Test { 168 protected: 169 ImageWriterUnitTestBase(); 170 virtual ~ImageWriterUnitTestBase(); 171 172 virtual void SetUp() OVERRIDE; 173 virtual void TearDown() OVERRIDE; 174 175 ImageWriterTestUtils test_utils_; 176 177 private: 178 content::TestBrowserThreadBundle thread_bundle_; 179}; 180 181} // namespace image_writer 182} // namespace extensions 183 184#endif // CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_TEST_UTILS_H_ 185