test_utils.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file.
4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_TEST_UTILS_H_
6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_TEST_UTILS_H_
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/file_util.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/message_loop/message_loop.h"
11a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/run_loop.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/image_writer_private/image_writer_utility_client.h"
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/extensions/api/image_writer_private/operation_manager.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/test/test_utils.h"
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS)
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/disks/disk_mount_manager.h"
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/disks/mock_disk_mount_manager.h"
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace extensions {
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace image_writer {
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kDummyExtensionId[] = "DummyExtension";
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Default file size to use in tests.  Currently 32kB.
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kTestFileSize = 32 * 1024;
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Pattern to use in the image file.
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kImagePattern = 0x55555555; // 01010101
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Pattern to use in the device file.
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int kDevicePattern = 0xAAAAAAAA; // 10101010
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// A mock around the operation manager for tracking callbacks.  Note that there
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// are non-virtual methods on this class that should not be called in tests.
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class MockOperationManager : public OperationManager {
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MockOperationManager();
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit MockOperationManager(content::BrowserContext* context);
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~MockOperationManager();
43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_METHOD3(OnProgress, void(const ExtensionId& extension_id,
45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                image_writer_api::Stage stage,
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                int progress));
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Callback for completion events.
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_METHOD1(OnComplete, void(const std::string& extension_id));
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Callback for error events.
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MOCK_METHOD4(OnError, void(const ExtensionId& extension_id,
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             image_writer_api::Stage stage,
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             int progress,
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             const std::string& error_message));
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS)
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// A fake for the DiskMountManager that will successfully call the unmount
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// callback.
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class FakeDiskMountManager : public chromeos::disks::MockDiskMountManager {
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FakeDiskMountManager();
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~FakeDiskMountManager();
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void UnmountDeviceRecursively(
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const std::string& device_path,
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const UnmountDeviceRecursivelyCallbackType& callback) OVERRIDE;
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  /*
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD1(AddObserver, void(chromeos::disks::DiskMountManager::Observer*));
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD1(RemoveObserver,
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void(chromeos::disks::DiskMountManager::Observer*));
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_CONST_METHOD0(disks, const DiskMap&());
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_CONST_METHOD1(FindDiskBySourcePath, const Disk*(const std::string&));
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_CONST_METHOD0(mount_points, const MountPointMap&());
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD0(RequestMountInfoRefresh, void());
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD4(MountPath, void(const std::string&, const std::string&, const
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string&, chromeos::MountType));
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD3(UnmountPath, void(const std::string&, chromeos::UnmountOptions,
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const UnmountPathCallback&));
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  MOCK_METHOD1(FormatMountedDevice, void(const std::string&));
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  */
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DiskMap disks_;
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class FakeImageWriterClient : public ImageWriterUtilityClient {
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FakeImageWriterClient();
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void Write(const ProgressCallback& progress_callback,
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     const SuccessCallback& success_callback,
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     const ErrorCallback& error_callback,
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     const base::FilePath& source,
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                     const base::FilePath& target) OVERRIDE;
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void Verify(const ProgressCallback& progress_callback,
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      const SuccessCallback& success_callback,
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      const ErrorCallback& error_callback,
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      const base::FilePath& source,
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      const base::FilePath& target) OVERRIDE;
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void Cancel(const CancelCallback& cancel_callback) OVERRIDE;
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void Shutdown() OVERRIDE;
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Progress(int64 progress);
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Success();
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Error(const std::string& message);
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Cancel();
112a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static scoped_refptr<FakeImageWriterClient> Create();
113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~FakeImageWriterClient();
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ProgressCallback progress_callback_;
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SuccessCallback success_callback_;
119a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ErrorCallback error_callback_;
120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  CancelCallback cancel_callback_;
121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
122a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Base class for unit tests that manages creating image and device files.
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class ImageWriterUnitTestBase : public testing::Test {
125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ImageWriterUnitTestBase();
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~ImageWriterUnitTestBase();
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void TearDown() OVERRIDE;
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Verifies that the data in image_path was written to the file at
134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // device_path.  This is different from base::ContentsEqual because the device
135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // may be larger than the image.
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  bool ImageWrittenToDevice(const base::FilePath& image_path,
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            const base::FilePath& device_path);
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Fills |file| with |length| bytes of |pattern|, overwriting any existing
1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // data.
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool FillFile(const base::FilePath& file,
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                const int pattern,
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                const int length);
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::ScopedTempDir temp_dir_;
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::FilePath test_image_path_;
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::FilePath test_device_path_;
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace image_writer
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace extensions
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_API_IMAGE_WRITER_PRIVATE_TEST_UTILS_H_
157