blob: 3d2a91f1c15db7a3a65b06c4c3554f298ffee629 [file] [log] [blame]
Ben Chan1e5a0cb2012-03-22 00:41:52 -07001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Ben Chanf51ff002011-04-25 12:41:57 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Chan5ccd9fe2013-11-13 18:28:27 -08005#include "cros-disks/disk_manager.h"
Ben Chan29be9152011-07-25 14:39:48 -07006
Anand K Mistry6b19a972018-09-11 11:14:59 +10007#include <stdlib.h>
Ben Chanf51ff002011-04-25 12:41:57 -07008#include <sys/mount.h>
Anand K Mistry6b19a972018-09-11 11:14:59 +10009#include <time.h>
Ben Chanbdc39742011-05-11 17:51:26 -070010
Ben Chan5e3ca672014-08-25 15:53:58 -070011#include <memory>
12
Sergei Datsenko3cf72cb2019-04-01 11:27:50 +110013#include <base/files/file_path.h>
Ben Chancd8fda42014-09-05 08:21:06 -070014#include <base/files/file_util.h>
Allen Webb57f0c052017-09-20 14:11:21 -070015#include <base/logging.h>
Ben Chanb5d71222012-10-03 12:55:16 -070016#include <base/stl_util.h>
Sergei Datsenkoa910bba2019-06-18 13:31:59 +100017#include <brillo/process_reaper.h>
Ben Chan1e5a0cb2012-03-22 00:41:52 -070018#include <gmock/gmock.h>
Ben Chanbdc39742011-05-11 17:51:26 -070019#include <gtest/gtest.h>
20
Ben Chan5ccd9fe2013-11-13 18:28:27 -080021#include "cros-disks/device_ejector.h"
Ben Chanbdc39742011-05-11 17:51:26 -070022#include "cros-disks/disk.h"
Ben Chan5e398a82019-04-10 16:40:43 -070023#include "cros-disks/disk_monitor.h"
Ben Chan5ccd9fe2013-11-13 18:28:27 -080024#include "cros-disks/exfat_mounter.h"
Ben Chane31d2aa2011-06-15 13:52:59 -070025#include "cros-disks/filesystem.h"
Ben Chanbe2b4a72011-11-08 13:42:23 -080026#include "cros-disks/metrics.h"
Ben Chane31d2aa2011-06-15 13:52:59 -070027#include "cros-disks/mounter.h"
Ben Chan5ccd9fe2013-11-13 18:28:27 -080028#include "cros-disks/ntfs_mounter.h"
Ben Chan29be9152011-07-25 14:39:48 -070029#include "cros-disks/platform.h"
Ben Chanf51ff002011-04-25 12:41:57 -070030
Ben Chan1e5a0cb2012-03-22 00:41:52 -070031using testing::Return;
32using testing::_;
Ben Chan190d3cf2011-07-07 09:38:48 -070033
Ben Chan460439f2011-09-13 09:16:28 -070034namespace {
Ben Chanf51ff002011-04-25 12:41:57 -070035
Ben Chan460439f2011-09-13 09:16:28 -070036const char kMountRootDirectory[] = "/media/removable";
37
38} // namespace
39
40namespace cros_disks {
Ben Chan8dcede82011-07-25 20:56:13 -070041
Ben Chan1e5a0cb2012-03-22 00:41:52 -070042class MockDeviceEjector : public DeviceEjector {
43 public:
Ben Chan445852f2017-10-02 23:00:16 -070044 MockDeviceEjector() : DeviceEjector(nullptr) {}
Ben Chan1e5a0cb2012-03-22 00:41:52 -070045
Sergei Datsenko16821892019-04-05 11:26:38 +110046 MOCK_METHOD1(Eject, bool(const std::string& device_path));
47};
48
49class MockDiskMonitor : public DiskMonitor {
50 public:
51 MockDiskMonitor() = default;
52
53 bool Initialize() override { return true; }
54
55 MOCK_CONST_METHOD0(EnumerateDisks, std::vector<Disk>());
56 MOCK_CONST_METHOD2(GetDiskByDevicePath,
57 bool(const base::FilePath& device_path, Disk* disk));
Ben Chan1e5a0cb2012-03-22 00:41:52 -070058};
59
Ben Chanf51ff002011-04-25 12:41:57 -070060class DiskManagerTest : public ::testing::Test {
Ben Chan29be9152011-07-25 14:39:48 -070061 public:
Ben Chan8dcede82011-07-25 20:56:13 -070062 DiskManagerTest()
Sergei Datsenkoa910bba2019-06-18 13:31:59 +100063 : manager_(kMountRootDirectory,
64 &platform_,
65 &metrics_,
66 &process_reaper_,
67 &monitor_,
68 &ejector_) {}
Ben Chan29be9152011-07-25 14:39:48 -070069
Ben Chane31d2aa2011-06-15 13:52:59 -070070 protected:
Ben Chanbe2b4a72011-11-08 13:42:23 -080071 Metrics metrics_;
Ben Chan29be9152011-07-25 14:39:48 -070072 Platform platform_;
Sergei Datsenkoa910bba2019-06-18 13:31:59 +100073 brillo::ProcessReaper process_reaper_;
Sergei Datsenko16821892019-04-05 11:26:38 +110074 MockDeviceEjector ejector_;
75 MockDiskMonitor monitor_;
Ben Chane31d2aa2011-06-15 13:52:59 -070076 DiskManager manager_;
Ben Chanf51ff002011-04-25 12:41:57 -070077};
78
Ben Chanaf455a02013-01-08 15:29:22 -080079TEST_F(DiskManagerTest, CreateExFATMounter) {
80 Disk disk;
Ben Chanff92fa32017-10-17 16:17:15 -070081 disk.device_file = "/dev/sda1";
Ben Chanaf455a02013-01-08 15:29:22 -080082
83 Filesystem filesystem("exfat");
Ben Chan55c20222017-11-10 13:35:58 -080084 filesystem.mounter_type = ExFATMounter::kMounterType;
Ben Chanaf455a02013-01-08 15:29:22 -080085
Ben Chan213c6d92019-04-10 16:21:52 -070086 std::string target_path = "/media/disk";
87 std::vector<std::string> options = {"rw", "nodev", "noexec", "nosuid"};
Ben Chanaf455a02013-01-08 15:29:22 -080088
Sergei Datsenko3cf72cb2019-04-01 11:27:50 +110089 auto mounter = manager_.CreateMounter(disk, filesystem, target_path, options);
Ben Chan44e7ea62014-08-29 18:13:37 -070090 EXPECT_NE(nullptr, mounter.get());
Ben Chan55c20222017-11-10 13:35:58 -080091 EXPECT_EQ(filesystem.mount_type, mounter->filesystem_type());
Sergei Datsenko3cf72cb2019-04-01 11:27:50 +110092 EXPECT_EQ(disk.device_file, mounter->source());
93 EXPECT_EQ(target_path, mounter->target_path().value());
Jorge Lucangeli Obesa4d01112013-02-11 21:28:16 -080094 EXPECT_EQ("rw,nodev,noexec,nosuid", mounter->mount_options().ToString());
Ben Chanaf455a02013-01-08 15:29:22 -080095}
96
Ben Chanb1ac5a82011-08-02 17:53:55 -070097TEST_F(DiskManagerTest, CreateNTFSMounter) {
98 Disk disk;
Ben Chanff92fa32017-10-17 16:17:15 -070099 disk.device_file = "/dev/sda1";
Ben Chanb1ac5a82011-08-02 17:53:55 -0700100
101 Filesystem filesystem("ntfs");
Ben Chan55c20222017-11-10 13:35:58 -0800102 filesystem.mounter_type = NTFSMounter::kMounterType;
Ben Chanb1ac5a82011-08-02 17:53:55 -0700103
Ben Chan213c6d92019-04-10 16:21:52 -0700104 std::string target_path = "/media/disk";
105 std::vector<std::string> options = {"rw", "nodev", "noexec", "nosuid"};
Ben Chanb1ac5a82011-08-02 17:53:55 -0700106
Sergei Datsenko3cf72cb2019-04-01 11:27:50 +1100107 auto mounter = manager_.CreateMounter(disk, filesystem, target_path, options);
Ben Chan44e7ea62014-08-29 18:13:37 -0700108 EXPECT_NE(nullptr, mounter.get());
Ben Chan55c20222017-11-10 13:35:58 -0800109 EXPECT_EQ(filesystem.mount_type, mounter->filesystem_type());
Sergei Datsenko3cf72cb2019-04-01 11:27:50 +1100110 EXPECT_EQ(disk.device_file, mounter->source());
111 EXPECT_EQ(target_path, mounter->target_path().value());
Jorge Lucangeli Obesa4d01112013-02-11 21:28:16 -0800112 EXPECT_EQ("rw,nodev,noexec,nosuid", mounter->mount_options().ToString());
Ben Chane31d2aa2011-06-15 13:52:59 -0700113}
114
Anand K Mistry6b19a972018-09-11 11:14:59 +1000115TEST_F(DiskManagerTest, CreateVFATSystemMounter) {
Ben Chane31d2aa2011-06-15 13:52:59 -0700116 Disk disk;
Ben Chanff92fa32017-10-17 16:17:15 -0700117 disk.device_file = "/dev/sda1";
Ben Chane31d2aa2011-06-15 13:52:59 -0700118
119 Filesystem filesystem("vfat");
Ben Chan55c20222017-11-10 13:35:58 -0800120 filesystem.extra_mount_options = {"utf8", "shortname=mixed"};
Ben Chane31d2aa2011-06-15 13:52:59 -0700121
Ben Chan213c6d92019-04-10 16:21:52 -0700122 std::string target_path = "/media/disk";
123 std::vector<std::string> options = {"rw", "nodev", "noexec", "nosuid"};
Ben Chane31d2aa2011-06-15 13:52:59 -0700124
Anand K Mistry6b19a972018-09-11 11:14:59 +1000125 // Override the time zone to make this test deterministic.
126 // This test uses AWST (Perth, Australia), which is UTC+8, as the test time
127 // zone. However, the TZ environment variable is the time to be added to local
128 // time to get to UTC, hence the negative.
129 setenv("TZ", "UTC-8", 1);
130
Sergei Datsenko3cf72cb2019-04-01 11:27:50 +1100131 auto mounter = manager_.CreateMounter(disk, filesystem, target_path, options);
Ben Chan44e7ea62014-08-29 18:13:37 -0700132 EXPECT_NE(nullptr, mounter.get());
Ben Chan55c20222017-11-10 13:35:58 -0800133 EXPECT_EQ(filesystem.mount_type, mounter->filesystem_type());
Sergei Datsenko3cf72cb2019-04-01 11:27:50 +1100134 EXPECT_EQ(disk.device_file, mounter->source());
135 EXPECT_EQ(target_path, mounter->target_path().value());
Anand K Mistry6b19a972018-09-11 11:14:59 +1000136 EXPECT_EQ("utf8,shortname=mixed,time_offset=480,rw,nodev,noexec,nosuid",
Ben Chan8dcede82011-07-25 20:56:13 -0700137 mounter->mount_options().ToString());
Ben Chane31d2aa2011-06-15 13:52:59 -0700138}
139
Anand K Mistry6b19a972018-09-11 11:14:59 +1000140TEST_F(DiskManagerTest, CreateExt4SystemMounter) {
141 Disk disk;
142 disk.device_file = "/dev/sda1";
143
Ben Chan213c6d92019-04-10 16:21:52 -0700144 std::string target_path = "/media/disk";
Anand K Mistry6b19a972018-09-11 11:14:59 +1000145 // "mand" is not a whitelisted option, so it should be skipped.
Ben Chan213c6d92019-04-10 16:21:52 -0700146 std::vector<std::string> options = {"rw", "nodev", "noexec", "nosuid",
147 "mand"};
Anand K Mistry6b19a972018-09-11 11:14:59 +1000148
149 Filesystem filesystem("ext4");
Sergei Datsenko3cf72cb2019-04-01 11:27:50 +1100150 auto mounter = manager_.CreateMounter(disk, filesystem, target_path, options);
Anand K Mistry6b19a972018-09-11 11:14:59 +1000151 EXPECT_NE(nullptr, mounter.get());
152 EXPECT_EQ(filesystem.mount_type, mounter->filesystem_type());
Sergei Datsenko3cf72cb2019-04-01 11:27:50 +1100153 EXPECT_EQ(disk.device_file, mounter->source());
154 EXPECT_EQ(target_path, mounter->target_path().value());
Anand K Mistry6b19a972018-09-11 11:14:59 +1000155 EXPECT_EQ("rw,nodev,noexec,nosuid", mounter->mount_options().ToString());
156}
157
Ben Chanb092d752011-07-13 11:44:38 -0700158TEST_F(DiskManagerTest, GetFilesystem) {
Ben Chan44e7ea62014-08-29 18:13:37 -0700159 EXPECT_EQ(nullptr, manager_.GetFilesystem("nonexistent-fs"));
Ben Chanb092d752011-07-13 11:44:38 -0700160
161 Filesystem normal_fs("normal-fs");
Ben Chan55c20222017-11-10 13:35:58 -0800162 EXPECT_EQ(nullptr, manager_.GetFilesystem(normal_fs.type));
Ben Chanb092d752011-07-13 11:44:38 -0700163 manager_.RegisterFilesystem(normal_fs);
Ben Chan55c20222017-11-10 13:35:58 -0800164 EXPECT_NE(nullptr, manager_.GetFilesystem(normal_fs.type));
Ben Chanb092d752011-07-13 11:44:38 -0700165}
166
Ben Chane31d2aa2011-06-15 13:52:59 -0700167TEST_F(DiskManagerTest, RegisterFilesystem) {
Ben Chan213c6d92019-04-10 16:21:52 -0700168 const std::map<std::string, Filesystem>& filesystems = manager_.filesystems_;
Ben Chane31d2aa2011-06-15 13:52:59 -0700169 EXPECT_EQ(0, filesystems.size());
170 EXPECT_TRUE(filesystems.find("nonexistent") == filesystems.end());
171
172 Filesystem fat_fs("fat");
Ben Chan55c20222017-11-10 13:35:58 -0800173 fat_fs.accepts_user_and_group_id = true;
Ben Chane31d2aa2011-06-15 13:52:59 -0700174 manager_.RegisterFilesystem(fat_fs);
175 EXPECT_EQ(1, filesystems.size());
Ben Chan55c20222017-11-10 13:35:58 -0800176 EXPECT_TRUE(filesystems.find(fat_fs.type) != filesystems.end());
Ben Chane31d2aa2011-06-15 13:52:59 -0700177
178 Filesystem vfat_fs("vfat");
Ben Chan55c20222017-11-10 13:35:58 -0800179 vfat_fs.accepts_user_and_group_id = true;
Ben Chane31d2aa2011-06-15 13:52:59 -0700180 manager_.RegisterFilesystem(vfat_fs);
181 EXPECT_EQ(2, filesystems.size());
Ben Chan55c20222017-11-10 13:35:58 -0800182 EXPECT_TRUE(filesystems.find(vfat_fs.type) != filesystems.end());
Ben Chane31d2aa2011-06-15 13:52:59 -0700183}
184
Ben Chan8dcede82011-07-25 20:56:13 -0700185TEST_F(DiskManagerTest, CanMount) {
186 EXPECT_TRUE(manager_.CanMount("/dev/sda1"));
187 EXPECT_TRUE(manager_.CanMount("/devices/block/sda/sda1"));
188 EXPECT_TRUE(manager_.CanMount("/sys/devices/block/sda/sda1"));
189 EXPECT_FALSE(manager_.CanMount("/media/removable/disk1"));
190 EXPECT_FALSE(manager_.CanMount("/media/removable/disk1/"));
191 EXPECT_FALSE(manager_.CanMount("/media/removable/disk 1"));
192 EXPECT_FALSE(manager_.CanMount("/media/archive/test.zip"));
193 EXPECT_FALSE(manager_.CanMount("/media/archive/test.zip/"));
194 EXPECT_FALSE(manager_.CanMount("/media/archive/test 1.zip"));
195 EXPECT_FALSE(manager_.CanMount("/media/removable/disk1/test.zip"));
196 EXPECT_FALSE(manager_.CanMount("/media/removable/disk1/test 1.zip"));
197 EXPECT_FALSE(manager_.CanMount("/media/removable/disk1/dir1/test.zip"));
198 EXPECT_FALSE(manager_.CanMount("/media/removable/test.zip/test1.zip"));
199 EXPECT_FALSE(manager_.CanMount("/home/chronos/user/Downloads/test1.zip"));
Ben Chan16d85862013-05-28 20:30:30 -0700200 EXPECT_FALSE(manager_.CanMount("/home/chronos/user/GCache/test1.zip"));
Ben Chande0e3f62017-09-26 06:28:39 -0700201 EXPECT_FALSE(
202 manager_.CanMount("/home/chronos"
203 "/u-0123456789abcdef0123456789abcdef01234567"
204 "/Downloads/test1.zip"));
205 EXPECT_FALSE(
206 manager_.CanMount("/home/chronos"
207 "/u-0123456789abcdef0123456789abcdef01234567"
208 "/GCache/test1.zip"));
Ben Chan8dcede82011-07-25 20:56:13 -0700209 EXPECT_FALSE(manager_.CanMount(""));
210 EXPECT_FALSE(manager_.CanMount("/tmp"));
211 EXPECT_FALSE(manager_.CanMount("/media/removable"));
212 EXPECT_FALSE(manager_.CanMount("/media/removable/"));
213 EXPECT_FALSE(manager_.CanMount("/media/archive"));
214 EXPECT_FALSE(manager_.CanMount("/media/archive/"));
215 EXPECT_FALSE(manager_.CanMount("/home/chronos/user/Downloads"));
216 EXPECT_FALSE(manager_.CanMount("/home/chronos/user/Downloads/"));
Ben Chanf51ff002011-04-25 12:41:57 -0700217}
218
Ben Chan8dcede82011-07-25 20:56:13 -0700219TEST_F(DiskManagerTest, CanUnmount) {
220 EXPECT_TRUE(manager_.CanUnmount("/dev/sda1"));
221 EXPECT_TRUE(manager_.CanUnmount("/devices/block/sda/sda1"));
222 EXPECT_TRUE(manager_.CanUnmount("/sys/devices/block/sda/sda1"));
223 EXPECT_TRUE(manager_.CanUnmount("/media/removable/disk1"));
224 EXPECT_TRUE(manager_.CanUnmount("/media/removable/disk1/"));
225 EXPECT_TRUE(manager_.CanUnmount("/media/removable/disk 1"));
226 EXPECT_FALSE(manager_.CanUnmount("/media/archive/test.zip"));
227 EXPECT_FALSE(manager_.CanUnmount("/media/archive/test.zip/"));
228 EXPECT_FALSE(manager_.CanUnmount("/media/archive/test 1.zip"));
229 EXPECT_FALSE(manager_.CanUnmount("/media/removable/disk1/test.zip"));
230 EXPECT_FALSE(manager_.CanUnmount("/media/removable/disk1/test 1.zip"));
231 EXPECT_FALSE(manager_.CanUnmount("/media/removable/disk1/dir1/test.zip"));
232 EXPECT_FALSE(manager_.CanUnmount("/media/removable/test.zip/test1.zip"));
233 EXPECT_FALSE(manager_.CanUnmount("/home/chronos/user/Downloads/test1.zip"));
Ben Chan16d85862013-05-28 20:30:30 -0700234 EXPECT_FALSE(manager_.CanUnmount("/home/chronos/user/GCache/test1.zip"));
Ben Chande0e3f62017-09-26 06:28:39 -0700235 EXPECT_FALSE(
236 manager_.CanUnmount("/home/chronos"
237 "/u-0123456789abcdef0123456789abcdef01234567"
238 "/Downloads/test1.zip"));
239 EXPECT_FALSE(
240 manager_.CanUnmount("/home/chronos"
241 "/u-0123456789abcdef0123456789abcdef01234567"
242 "/GCache/test1.zip"));
Ben Chan8dcede82011-07-25 20:56:13 -0700243 EXPECT_FALSE(manager_.CanUnmount(""));
244 EXPECT_FALSE(manager_.CanUnmount("/tmp"));
245 EXPECT_FALSE(manager_.CanUnmount("/media/removable"));
246 EXPECT_FALSE(manager_.CanUnmount("/media/removable/"));
247 EXPECT_FALSE(manager_.CanUnmount("/media/archive"));
248 EXPECT_FALSE(manager_.CanUnmount("/media/archive/"));
249 EXPECT_FALSE(manager_.CanUnmount("/home/chronos/user/Downloads"));
250 EXPECT_FALSE(manager_.CanUnmount("/home/chronos/user/Downloads/"));
251}
252
253TEST_F(DiskManagerTest, DoMountDiskWithNonexistentSourcePath) {
Ben Chan213c6d92019-04-10 16:21:52 -0700254 std::string filesystem_type = "ext3";
255 std::string source_path = "/dev/nonexistent-path";
256 std::string mount_path = "/tmp/cros-disks-test";
257 std::vector<std::string> options;
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900258 MountOptions applied_options;
Ben Chanfcb2fc02011-11-21 09:44:07 -0800259 EXPECT_EQ(MOUNT_ERROR_INVALID_DEVICE_PATH,
Ben Chande0e3f62017-09-26 06:28:39 -0700260 manager_.DoMount(source_path, filesystem_type, options, mount_path,
261 &applied_options));
Ben Chan8dcede82011-07-25 20:56:13 -0700262}
263
264TEST_F(DiskManagerTest, DoUnmountDiskWithInvalidUnmountOptions) {
Ben Chan213c6d92019-04-10 16:21:52 -0700265 std::string source_path = "/dev/nonexistent-path";
266 std::vector<std::string> options = {"invalid-unmount-option"};
Ben Chanfcb2fc02011-11-21 09:44:07 -0800267 EXPECT_EQ(MOUNT_ERROR_INVALID_UNMOUNT_OPTIONS,
Ben Chan8dcede82011-07-25 20:56:13 -0700268 manager_.DoUnmount(source_path, options));
Ben Chanf51ff002011-04-25 12:41:57 -0700269}
270
Ben Chanb5d71222012-10-03 12:55:16 -0700271TEST_F(DiskManagerTest, ScheduleEjectOnUnmount) {
Ben Chan213c6d92019-04-10 16:21:52 -0700272 std::string mount_path = "/media/removable/disk";
Ben Chanb5d71222012-10-03 12:55:16 -0700273 Disk disk;
Ben Chanff92fa32017-10-17 16:17:15 -0700274 disk.device_file = "/dev/sr0";
Ben Chanb5d71222012-10-03 12:55:16 -0700275 EXPECT_FALSE(manager_.ScheduleEjectOnUnmount(mount_path, disk));
Eric Carusoe8f5ba12018-01-10 14:32:03 -0800276 EXPECT_FALSE(
277 base::ContainsKey(manager_.devices_to_eject_on_unmount_, mount_path));
Ben Chanb5d71222012-10-03 12:55:16 -0700278
Ben Chanff92fa32017-10-17 16:17:15 -0700279 disk.media_type = DEVICE_MEDIA_OPTICAL_DISC;
Ben Chanb5d71222012-10-03 12:55:16 -0700280 EXPECT_TRUE(manager_.ScheduleEjectOnUnmount(mount_path, disk));
Eric Carusoe8f5ba12018-01-10 14:32:03 -0800281 EXPECT_TRUE(
282 base::ContainsKey(manager_.devices_to_eject_on_unmount_, mount_path));
Ben Chanb5d71222012-10-03 12:55:16 -0700283
Ben Chanff92fa32017-10-17 16:17:15 -0700284 disk.media_type = DEVICE_MEDIA_DVD;
Ben Chanb5d71222012-10-03 12:55:16 -0700285 manager_.devices_to_eject_on_unmount_.clear();
286 EXPECT_TRUE(manager_.ScheduleEjectOnUnmount(mount_path, disk));
Eric Carusoe8f5ba12018-01-10 14:32:03 -0800287 EXPECT_TRUE(
288 base::ContainsKey(manager_.devices_to_eject_on_unmount_, mount_path));
Ben Chan1e5a0cb2012-03-22 00:41:52 -0700289}
290
Ben Chanb5d71222012-10-03 12:55:16 -0700291TEST_F(DiskManagerTest, EjectDeviceOfMountPath) {
Ben Chan213c6d92019-04-10 16:21:52 -0700292 std::string mount_path = "/media/removable/disk";
Sergei Datsenko16821892019-04-05 11:26:38 +1100293 Disk disk;
294 disk.device_file = "/dev/sr0";
295 manager_.devices_to_eject_on_unmount_[mount_path] = disk;
296 EXPECT_CALL(ejector_, Eject("/dev/sr0")).WillOnce(Return(true));
Ben Chanb5d71222012-10-03 12:55:16 -0700297 EXPECT_TRUE(manager_.EjectDeviceOfMountPath(mount_path));
Eric Carusoe8f5ba12018-01-10 14:32:03 -0800298 EXPECT_FALSE(
299 base::ContainsKey(manager_.devices_to_eject_on_unmount_, mount_path));
Ben Chanb5d71222012-10-03 12:55:16 -0700300}
301
302TEST_F(DiskManagerTest, EjectDeviceOfMountPathWhenEjectFailed) {
Ben Chan213c6d92019-04-10 16:21:52 -0700303 std::string mount_path = "/media/removable/disk";
Sergei Datsenko16821892019-04-05 11:26:38 +1100304 Disk disk;
305 disk.device_file = "/dev/sr0";
306 manager_.devices_to_eject_on_unmount_[mount_path] = disk;
307 EXPECT_CALL(ejector_, Eject(_)).WillOnce(Return(false));
Ben Chanb5d71222012-10-03 12:55:16 -0700308 EXPECT_FALSE(manager_.EjectDeviceOfMountPath(mount_path));
Eric Carusoe8f5ba12018-01-10 14:32:03 -0800309 EXPECT_FALSE(
310 base::ContainsKey(manager_.devices_to_eject_on_unmount_, mount_path));
Ben Chanb5d71222012-10-03 12:55:16 -0700311}
312
313TEST_F(DiskManagerTest, EjectDeviceOfMountPathWhenExplicitlyDisabled) {
Ben Chan213c6d92019-04-10 16:21:52 -0700314 std::string mount_path = "/media/removable/disk";
Sergei Datsenko16821892019-04-05 11:26:38 +1100315 Disk disk;
316 disk.device_file = "/dev/sr0";
317 manager_.devices_to_eject_on_unmount_[mount_path] = disk;
Ben Chanb5d71222012-10-03 12:55:16 -0700318 manager_.eject_device_on_unmount_ = false;
Sergei Datsenko16821892019-04-05 11:26:38 +1100319 EXPECT_CALL(ejector_, Eject(_)).Times(0);
Ben Chanb5d71222012-10-03 12:55:16 -0700320 EXPECT_FALSE(manager_.EjectDeviceOfMountPath(mount_path));
Eric Carusoe8f5ba12018-01-10 14:32:03 -0800321 EXPECT_FALSE(
322 base::ContainsKey(manager_.devices_to_eject_on_unmount_, mount_path));
Ben Chanb5d71222012-10-03 12:55:16 -0700323}
324
325TEST_F(DiskManagerTest, EjectDeviceOfMountPathWhenMountPathExcluded) {
Sergei Datsenko16821892019-04-05 11:26:38 +1100326 EXPECT_CALL(ejector_, Eject(_)).Times(0);
Ben Chanb5d71222012-10-03 12:55:16 -0700327 EXPECT_FALSE(manager_.EjectDeviceOfMountPath("/media/removable/disk"));
Ben Chan1e5a0cb2012-03-22 00:41:52 -0700328}
329
Ben Chanf51ff002011-04-25 12:41:57 -0700330} // namespace cros_disks