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#include "base/stl_util.h"
6#include "chrome/browser/chromeos/file_manager/drive_test_util.h"
7#include "chrome/browser/extensions/extension_apitest.h"
8#include "chromeos/dbus/cros_disks_client.h"
9#include "chromeos/disks/mock_disk_mount_manager.h"
10
11using ::testing::_;
12using ::testing::ReturnRef;
13
14using chromeos::disks::DiskMountManager;
15
16namespace {
17
18struct TestDiskInfo {
19  const char* system_path;
20  const char* file_path;
21  const char* device_label;
22  const char* drive_label;
23  const char* vendor_id;
24  const char* vendor_name;
25  const char* product_id;
26  const char* product_name;
27  const char* fs_uuid;
28  const char* system_path_prefix;
29  chromeos::DeviceType device_type;
30  uint64 size_in_bytes;
31  bool is_parent;
32  bool is_read_only;
33  bool has_media;
34  bool on_boot_device;
35  bool on_removable_device;
36  bool is_hidden;
37};
38
39struct TestMountPoint {
40  std::string source_path;
41  std::string mount_path;
42  chromeos::MountType mount_type;
43  chromeos::disks::MountCondition mount_condition;
44
45  // -1 if there is no disk info.
46  int disk_info_index;
47};
48
49TestDiskInfo kTestDisks[] = {
50  {
51    "system_path1",
52    "file_path1",
53    "device_label1",
54    "drive_label1",
55    "0123",
56    "vendor1",
57    "abcd",
58    "product1",
59    "FFFF-FFFF",
60    "system_path_prefix1",
61    chromeos::DEVICE_TYPE_USB,
62    1073741824,
63    false,
64    false,
65    false,
66    false,
67    false
68  },
69  {
70    "system_path2",
71    "file_path2",
72    "device_label2",
73    "drive_label2",
74    "4567",
75    "vendor2",
76    "cdef",
77    "product2",
78    "0FFF-FFFF",
79    "system_path_prefix2",
80    chromeos::DEVICE_TYPE_MOBILE,
81    47723,
82    true,
83    true,
84    true,
85    true,
86    false
87  },
88  {
89    "system_path3",
90    "file_path3",
91    "device_label3",
92    "drive_label3",
93    "89ab",
94    "vendor3",
95    "ef01",
96    "product3",
97    "00FF-FFFF",
98    "system_path_prefix3",
99    chromeos::DEVICE_TYPE_OPTICAL_DISC,
100    0,
101    true,
102    false,
103    false,
104    true,
105    false
106  }
107};
108
109}  // namespace
110
111class FileManagerPrivateApiTest : public ExtensionApiTest {
112 public:
113  FileManagerPrivateApiTest()
114      : disk_mount_manager_mock_(NULL) {
115    InitMountPoints();
116  }
117
118  virtual ~FileManagerPrivateApiTest() {
119    DCHECK(!disk_mount_manager_mock_);
120    STLDeleteValues(&volumes_);
121  }
122
123  // ExtensionApiTest override
124  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
125    ExtensionApiTest::SetUpInProcessBrowserTestFixture();
126
127    disk_mount_manager_mock_ = new chromeos::disks::MockDiskMountManager;
128    chromeos::disks::DiskMountManager::InitializeForTesting(
129        disk_mount_manager_mock_);
130    disk_mount_manager_mock_->SetupDefaultReplies();
131
132    // OVERRIDE mock functions.
133    ON_CALL(*disk_mount_manager_mock_, FindDiskBySourcePath(_)).WillByDefault(
134        Invoke(this, &FileManagerPrivateApiTest::FindVolumeBySourcePath));
135    EXPECT_CALL(*disk_mount_manager_mock_, disks())
136        .WillRepeatedly(ReturnRef(volumes_));
137    EXPECT_CALL(*disk_mount_manager_mock_, mount_points())
138        .WillRepeatedly(ReturnRef(mount_points_));
139  }
140
141  // ExtensionApiTest override
142  virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
143    chromeos::disks::DiskMountManager::Shutdown();
144    disk_mount_manager_mock_ = NULL;
145
146    ExtensionApiTest::TearDownInProcessBrowserTestFixture();
147  }
148
149 private:
150  void InitMountPoints() {
151    const TestMountPoint kTestMountPoints[] = {
152      {
153        "device_path1",
154        chromeos::CrosDisksClient::GetRemovableDiskMountPoint().AppendASCII(
155            "mount_path1").AsUTF8Unsafe(),
156        chromeos::MOUNT_TYPE_DEVICE,
157        chromeos::disks::MOUNT_CONDITION_NONE,
158        0
159      },
160      {
161        "device_path2",
162        chromeos::CrosDisksClient::GetRemovableDiskMountPoint().AppendASCII(
163            "mount_path2").AsUTF8Unsafe(),
164        chromeos::MOUNT_TYPE_DEVICE,
165        chromeos::disks::MOUNT_CONDITION_NONE,
166        1
167      },
168      {
169        "device_path3",
170        chromeos::CrosDisksClient::GetRemovableDiskMountPoint().AppendASCII(
171            "mount_path3").AsUTF8Unsafe(),
172        chromeos::MOUNT_TYPE_DEVICE,
173        chromeos::disks::MOUNT_CONDITION_NONE,
174        2
175      },
176      {
177        // Set source path inside another mounted volume.
178        chromeos::CrosDisksClient::GetRemovableDiskMountPoint().AppendASCII(
179            "mount_path3/archive.zip").AsUTF8Unsafe(),
180        chromeos::CrosDisksClient::GetArchiveMountPoint().AppendASCII(
181            "archive_mount_path").AsUTF8Unsafe(),
182        chromeos::MOUNT_TYPE_ARCHIVE,
183        chromeos::disks::MOUNT_CONDITION_NONE,
184        -1
185      }
186    };
187
188    for (size_t i = 0; i < arraysize(kTestMountPoints); i++) {
189      mount_points_.insert(DiskMountManager::MountPointMap::value_type(
190          kTestMountPoints[i].mount_path,
191          DiskMountManager::MountPointInfo(kTestMountPoints[i].source_path,
192                                           kTestMountPoints[i].mount_path,
193                                           kTestMountPoints[i].mount_type,
194                                           kTestMountPoints[i].mount_condition)
195      ));
196      int disk_info_index = kTestMountPoints[i].disk_info_index;
197      if (kTestMountPoints[i].disk_info_index >= 0) {
198        EXPECT_GT(arraysize(kTestDisks), static_cast<size_t>(disk_info_index));
199        if (static_cast<size_t>(disk_info_index) >= arraysize(kTestDisks))
200          return;
201
202        volumes_.insert(DiskMountManager::DiskMap::value_type(
203            kTestMountPoints[i].source_path,
204            new DiskMountManager::Disk(
205                kTestMountPoints[i].source_path,
206                kTestMountPoints[i].mount_path,
207                kTestDisks[disk_info_index].system_path,
208                kTestDisks[disk_info_index].file_path,
209                kTestDisks[disk_info_index].device_label,
210                kTestDisks[disk_info_index].drive_label,
211                kTestDisks[disk_info_index].vendor_id,
212                kTestDisks[disk_info_index].vendor_name,
213                kTestDisks[disk_info_index].product_id,
214                kTestDisks[disk_info_index].product_name,
215                kTestDisks[disk_info_index].fs_uuid,
216                kTestDisks[disk_info_index].system_path_prefix,
217                kTestDisks[disk_info_index].device_type,
218                kTestDisks[disk_info_index].size_in_bytes,
219                kTestDisks[disk_info_index].is_parent,
220                kTestDisks[disk_info_index].is_read_only,
221                kTestDisks[disk_info_index].has_media,
222                kTestDisks[disk_info_index].on_boot_device,
223                kTestDisks[disk_info_index].on_removable_device,
224                kTestDisks[disk_info_index].is_hidden
225            )
226        ));
227      }
228    }
229  }
230
231  const DiskMountManager::Disk* FindVolumeBySourcePath(
232      const std::string& source_path) {
233    DiskMountManager::DiskMap::const_iterator volume_it =
234        volumes_.find(source_path);
235    return (volume_it == volumes_.end()) ? NULL : volume_it->second;
236  }
237
238 protected:
239  chromeos::disks::MockDiskMountManager* disk_mount_manager_mock_;
240  DiskMountManager::DiskMap volumes_;
241  DiskMountManager::MountPointMap mount_points_;
242};
243
244IN_PROC_BROWSER_TEST_F(FileManagerPrivateApiTest, Mount) {
245  file_manager::test_util::WaitUntilDriveMountPointIsAdded(
246      browser()->profile());
247
248  // We will call fileManagerPrivate.unmountVolume once. To test that method, we
249  // check that UnmountPath is really called with the same value.
250  EXPECT_CALL(*disk_mount_manager_mock_, UnmountPath(_, _, _))
251      .Times(0);
252  EXPECT_CALL(*disk_mount_manager_mock_,
253              UnmountPath(
254                  chromeos::CrosDisksClient::GetArchiveMountPoint().AppendASCII(
255                      "archive_mount_path").AsUTF8Unsafe(),
256                  chromeos::UNMOUNT_OPTIONS_NONE, _)).Times(1);
257
258  ASSERT_TRUE(RunComponentExtensionTest("file_browser/mount_test"))
259      << message_;
260}
261