blob: 6b2999fbaef82ed9c48ec7bbdc455fad05ee0c84 [file] [log] [blame]
Ben Chan1e5a0cb2012-03-22 00:41:52 -07001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Ben Chan8dcede82011-07-25 20:56:13 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ben Chand30e7432011-11-28 13:43:17 -08005// Unit tests for cros_disks::MountManager. See mount-manager.h for details
6// on MountManager.
7
Ben Chan5ccd9fe2013-11-13 18:28:27 -08008#include "cros-disks/mount_manager.h"
Ben Chan8dcede82011-07-25 20:56:13 -07009
10#include <sys/mount.h>
11#include <sys/unistd.h>
12
Ben Chan632c9f82011-10-11 12:22:16 -070013#include <algorithm>
Ben Chan8dcede82011-07-25 20:56:13 -070014#include <string>
Sergei Datsenko7e7c7642021-01-08 19:15:34 +110015#include <unordered_set>
Sergei Datsenko0ba12032021-01-07 08:51:14 +110016#include <utility>
Ben Chan8dcede82011-07-25 20:56:13 -070017#include <vector>
18
Qijiang Fan713061e2021-03-08 15:45:12 +090019#include <base/check.h>
Simon Glass2b1da092020-05-21 12:24:16 -060020#include <brillo/process/process_reaper.h>
Ben Chan8dcede82011-07-25 20:56:13 -070021#include <gmock/gmock.h>
22#include <gtest/gtest.h>
23
Ben Chanbe2b4a72011-11-08 13:42:23 -080024#include "cros-disks/metrics.h"
Ben Chan8fb742b2014-04-28 23:46:57 -070025#include "cros-disks/mount_entry.h"
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +090026#include "cros-disks/mount_options.h"
Anand K Mistrye9a60fb2019-11-07 16:41:03 +110027#include "cros-disks/mount_point.h"
28#include "cros-disks/mounter.h"
Ben Chan8dcede82011-07-25 20:56:13 -070029#include "cros-disks/platform.h"
30
Ben Chan213c6d92019-04-10 16:21:52 -070031using testing::_;
Sergei Datsenko0ba12032021-01-07 08:51:14 +110032using testing::ByMove;
33using testing::DoAll;
Ben Chan09c90d02012-04-25 22:09:09 -070034using testing::ElementsAre;
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +090035using testing::Invoke;
Ben Chan8dcede82011-07-25 20:56:13 -070036using testing::Return;
Sergei Datsenko0ba12032021-01-07 08:51:14 +110037using testing::SetArgPointee;
Anand K Mistryd0a05232020-01-24 14:04:18 +110038using testing::WithArgs;
Ben Chan8dcede82011-07-25 20:56:13 -070039
Anand K Mistry40cff452019-07-30 10:24:48 +100040namespace cros_disks {
Ben Chan460439f2011-09-13 09:16:28 -070041namespace {
Ben Chan8dcede82011-07-25 20:56:13 -070042
Ben Chanadc5d002014-03-12 15:02:26 -070043const char kMountRootDirectory[] = "/media/removable";
44const char kTestSourcePath[] = "source";
45const char kTestMountPath[] = "/media/removable/test";
46const char kInvalidMountPath[] = "/media/removable/../test/doc";
Tatsuhisa Yamaguchib670bd12016-09-28 23:06:44 +090047const char kMountOptionRemount[] = "remount";
48const char kMountOptionReadOnly[] = "ro";
Anand K Mistrye9a60fb2019-11-07 16:41:03 +110049const char kMountOptionReadWrite[] = "rw";
Ben Chan460439f2011-09-13 09:16:28 -070050
51} // namespace
52
Ben Chan8dcede82011-07-25 20:56:13 -070053// A mock platform class for testing the mount manager base class.
54class MockPlatform : public Platform {
55 public:
Ben Chan40ecb9b2017-03-08 11:26:07 -080056 MockPlatform() = default;
Ben Chan8dcede82011-07-25 20:56:13 -070057
Ben Chan21150af2019-09-11 17:04:07 -070058 MOCK_METHOD(bool, CreateDirectory, (const std::string&), (const, override));
59 MOCK_METHOD(bool,
60 CreateOrReuseEmptyDirectory,
61 (const std::string&),
62 (const, override));
63 MOCK_METHOD(bool,
64 CreateOrReuseEmptyDirectoryWithFallback,
Sergei Datsenko7e7c7642021-01-08 19:15:34 +110065 (std::string*, unsigned, const std::unordered_set<std::string>&),
Ben Chan21150af2019-09-11 17:04:07 -070066 (const, override));
67 MOCK_METHOD(bool,
68 RemoveEmptyDirectory,
69 (const std::string&),
70 (const, override));
71 MOCK_METHOD(bool,
72 SetOwnership,
73 (const std::string&, uid_t, gid_t),
74 (const, override));
75 MOCK_METHOD(bool,
76 SetPermissions,
77 (const std::string&, mode_t),
78 (const, override));
Sergei Datsenko0ba12032021-01-07 08:51:14 +110079 MOCK_METHOD(MountErrorType,
80 Unmount,
81 (const std::string&, int),
82 (const, override));
83 MOCK_METHOD(MountErrorType,
84 Mount,
85 (const std::string& source,
86 const std::string& target,
87 const std::string& filesystem_type,
88 uint64_t flags,
89 const std::string& options),
90 (const, override));
Anand K Mistryd0a05232020-01-24 14:04:18 +110091};
92
Ben Chan8dcede82011-07-25 20:56:13 -070093// A mock mount manager class for testing the mount manager base class.
94class MountManagerUnderTest : public MountManager {
95 public:
Sergei Datsenkoa910bba2019-06-18 13:31:59 +100096 MountManagerUnderTest(Platform* platform,
97 Metrics* metrics,
98 brillo::ProcessReaper* process_reaper)
99 : MountManager(kMountRootDirectory, platform, metrics, process_reaper) {}
Ben Chan8dcede82011-07-25 20:56:13 -0700100
Anand K Mistrye9a60fb2019-11-07 16:41:03 +1100101 ~MountManagerUnderTest() override { UnmountAll(); }
102
Ben Chan21150af2019-09-11 17:04:07 -0700103 MOCK_METHOD(bool, CanMount, (const std::string&), (const, override));
104 MOCK_METHOD(MountSourceType, GetMountSourceType, (), (const, override));
Anand K Mistryd0a05232020-01-24 14:04:18 +1100105 MOCK_METHOD(std::unique_ptr<MountPoint>,
Ben Chan21150af2019-09-11 17:04:07 -0700106 DoMount,
107 (const std::string&,
108 const std::string&,
109 const std::vector<std::string>&,
Anand K Mistryd0a05232020-01-24 14:04:18 +1100110 const base::FilePath&,
Anand K Mistryd0a05232020-01-24 14:04:18 +1100111 MountErrorType*),
Ben Chan21150af2019-09-11 17:04:07 -0700112 (override));
Ben Chan21150af2019-09-11 17:04:07 -0700113 MOCK_METHOD(bool,
114 ShouldReserveMountPathOnError,
115 (MountErrorType),
116 (const, override));
117 MOCK_METHOD(std::string,
118 SuggestMountPath,
119 (const std::string&),
120 (const, override));
Sergei Datsenko7e7c7642021-01-08 19:15:34 +1100121
122 // Adds or updates a mapping |source_path| to its mount state in the cache.
123 void AddMount(const std::string& source_path,
124 std::unique_ptr<MountPoint> mount_point) {
125 DCHECK(mount_point);
126 DCHECK(!FindMountBySource(source_path));
127 mount_states_.insert({source_path, std::move(mount_point)});
128 }
129
130 using MountManager::GetMountErrorOfReservedMountPath;
131 using MountManager::ReserveMountPath;
132 using MountManager::UnreserveMountPath;
133
134 bool IsMountPathInCache(const std::string& path) {
135 return FindMountByMountPath(base::FilePath(path));
136 }
137
138 bool IsMountPathReserved(const std::string& path) {
139 return MountManager::IsMountPathReserved(base::FilePath(path));
140 }
141
142 void AddMountStateCache(const std::string& source,
143 std::unique_ptr<MountPoint> mount_point) {
144 mount_states_.insert({source, std::move(mount_point)});
145 }
146
147 bool RemoveMountPathFromCache(const std::string& path) {
148 MountPoint* mp = FindMountByMountPath(base::FilePath(path));
149 if (!mp)
150 return false;
151 return RemoveMount(mp);
152 }
153
154 std::unordered_set<std::string> GetReservedMountPaths() {
155 std::unordered_set<std::string> result;
156 for (const auto& element : reserved_mount_paths_) {
157 result.insert(element.first.value());
158 }
159 return result;
160 }
161
162 base::Optional<MountEntry> GetMountEntryForTest(const std::string& source) {
163 MountPoint* mp = FindMountBySource(source);
164 if (!mp)
165 return {};
166 return MountEntry(MOUNT_ERROR_NONE, source, GetMountSourceType(),
167 mp->path().value(), mp->is_read_only());
168 }
Ben Chan8dcede82011-07-25 20:56:13 -0700169};
170
171class MountManagerTest : public ::testing::Test {
172 public:
Anand K Mistrye9a60fb2019-11-07 16:41:03 +1100173 MountManagerTest() : manager_(&platform_, &metrics_, &process_reaper_) {
174 ON_CALL(manager_, GetMountSourceType())
175 .WillByDefault(Return(MOUNT_SOURCE_REMOVABLE_DEVICE));
176 }
177
178 std::unique_ptr<MountPoint> MakeMountPoint(const std::string& mount_path) {
Anand K Mistryf1bd0862019-12-20 11:54:55 +1100179 return MountPoint::CreateLeaking(base::FilePath(mount_path));
Anand K Mistrye9a60fb2019-11-07 16:41:03 +1100180 }
Ben Chan8dcede82011-07-25 20:56:13 -0700181
182 protected:
Ben Chanbe2b4a72011-11-08 13:42:23 -0800183 Metrics metrics_;
Ben Chan8dcede82011-07-25 20:56:13 -0700184 MockPlatform platform_;
Sergei Datsenkoa910bba2019-06-18 13:31:59 +1000185 brillo::ProcessReaper process_reaper_;
Ben Chan8dcede82011-07-25 20:56:13 -0700186 MountManagerUnderTest manager_;
Ben Chan213c6d92019-04-10 16:21:52 -0700187 std::string filesystem_type_;
188 std::string mount_path_;
189 std::string source_path_;
190 std::vector<std::string> options_;
Ben Chan8dcede82011-07-25 20:56:13 -0700191};
192
Ben Chan9ed09e32011-11-22 16:24:06 -0800193// Verifies that MountManager::Initialize() returns false when it fails to
194// create the mount root directory.
Ben Chan8dcede82011-07-25 20:56:13 -0700195TEST_F(MountManagerTest, InitializeFailedInCreateDirectory) {
196 EXPECT_CALL(platform_, CreateDirectory(kMountRootDirectory))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700197 .WillOnce(Return(false));
Ben Chande0e3f62017-09-26 06:28:39 -0700198 EXPECT_CALL(platform_, SetOwnership(kMountRootDirectory, getuid(), getgid()))
Ben Chan8dcede82011-07-25 20:56:13 -0700199 .Times(0);
Ben Chande0e3f62017-09-26 06:28:39 -0700200 EXPECT_CALL(platform_, SetPermissions(kMountRootDirectory, _)).Times(0);
Ben Chan8dcede82011-07-25 20:56:13 -0700201
202 EXPECT_FALSE(manager_.Initialize());
203}
204
Ben Chan9ed09e32011-11-22 16:24:06 -0800205// Verifies that MountManager::Initialize() returns false when it fails to
206// set the ownership of the created mount root directory.
Ben Chan8dcede82011-07-25 20:56:13 -0700207TEST_F(MountManagerTest, InitializeFailedInSetOwnership) {
208 EXPECT_CALL(platform_, CreateDirectory(kMountRootDirectory))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700209 .WillOnce(Return(true));
Ben Chande0e3f62017-09-26 06:28:39 -0700210 EXPECT_CALL(platform_, SetOwnership(kMountRootDirectory, getuid(), getgid()))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700211 .WillOnce(Return(false));
Ben Chande0e3f62017-09-26 06:28:39 -0700212 EXPECT_CALL(platform_, SetPermissions(kMountRootDirectory, _)).Times(0);
Ben Chan8dcede82011-07-25 20:56:13 -0700213
214 EXPECT_FALSE(manager_.Initialize());
215}
216
Ben Chan9ed09e32011-11-22 16:24:06 -0800217// Verifies that MountManager::Initialize() returns false when it fails to
218// set the permissions of the created mount root directory.
Ben Chan8dcede82011-07-25 20:56:13 -0700219TEST_F(MountManagerTest, InitializeFailedInSetPermissions) {
220 EXPECT_CALL(platform_, CreateDirectory(kMountRootDirectory))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700221 .WillOnce(Return(true));
Ben Chande0e3f62017-09-26 06:28:39 -0700222 EXPECT_CALL(platform_, SetOwnership(kMountRootDirectory, getuid(), getgid()))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700223 .WillOnce(Return(true));
Ben Chan8dcede82011-07-25 20:56:13 -0700224 EXPECT_CALL(platform_, SetPermissions(kMountRootDirectory, _))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700225 .WillOnce(Return(false));
Ben Chan8dcede82011-07-25 20:56:13 -0700226
227 EXPECT_FALSE(manager_.Initialize());
228}
229
Ben Chan9ed09e32011-11-22 16:24:06 -0800230// Verifies that MountManager::Initialize() returns true when it creates
231// the mount root directory with the specified ownership and permissions.
Ben Chan8dcede82011-07-25 20:56:13 -0700232TEST_F(MountManagerTest, InitializeSucceeded) {
233 EXPECT_CALL(platform_, CreateDirectory(kMountRootDirectory))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700234 .WillOnce(Return(true));
Ben Chande0e3f62017-09-26 06:28:39 -0700235 EXPECT_CALL(platform_, SetOwnership(kMountRootDirectory, getuid(), getgid()))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700236 .WillOnce(Return(true));
Ben Chan8dcede82011-07-25 20:56:13 -0700237 EXPECT_CALL(platform_, SetPermissions(kMountRootDirectory, _))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700238 .WillOnce(Return(true));
Ben Chan8dcede82011-07-25 20:56:13 -0700239
240 EXPECT_TRUE(manager_.Initialize());
241}
242
Ben Chan9ed09e32011-11-22 16:24:06 -0800243// Verifies that MountManager::Mount() returns an error when it is invoked
244// to mount an empty source path.
Ben Chan8dcede82011-07-25 20:56:13 -0700245TEST_F(MountManagerTest, MountFailedWithEmptySourcePath) {
246 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700247 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
Ben Chan8dcede82011-07-25 20:56:13 -0700248 .Times(0);
249 EXPECT_CALL(platform_, RemoveEmptyDirectory(_)).Times(0);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000250 EXPECT_CALL(manager_, DoMount(_, _, _, _, _)).Times(0);
Ben Chan8dcede82011-07-25 20:56:13 -0700251 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
252
Ben Chande0e3f62017-09-26 06:28:39 -0700253 EXPECT_EQ(
254 MOUNT_ERROR_INVALID_ARGUMENT,
255 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700256}
257
Ben Chan9ed09e32011-11-22 16:24:06 -0800258// Verifies that MountManager::Mount() returns an error when it is invoked
Ben Chan44e7ea62014-08-29 18:13:37 -0700259// with a nullptr mount path.
Ben Chan8dcede82011-07-25 20:56:13 -0700260TEST_F(MountManagerTest, MountFailedWithNullMountPath) {
Ben Chanadc5d002014-03-12 15:02:26 -0700261 source_path_ = kTestSourcePath;
Ben Chan8dcede82011-07-25 20:56:13 -0700262
263 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700264 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
Ben Chan8dcede82011-07-25 20:56:13 -0700265 .Times(0);
266 EXPECT_CALL(platform_, RemoveEmptyDirectory(_)).Times(0);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000267 EXPECT_CALL(manager_, DoMount(_, _, _, _, _)).Times(0);
Ben Chan8dcede82011-07-25 20:56:13 -0700268 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
269
Ben Chanfcb2fc02011-11-21 09:44:07 -0800270 EXPECT_EQ(MOUNT_ERROR_INVALID_ARGUMENT,
Ben Chan44e7ea62014-08-29 18:13:37 -0700271 manager_.Mount(source_path_, filesystem_type_, options_, nullptr));
Ben Chan8dcede82011-07-25 20:56:13 -0700272}
273
Ben Chanadc5d002014-03-12 15:02:26 -0700274// Verifies that MountManager::Mount() returns an error when it is invoked
275// with an invalid mount path.
276TEST_F(MountManagerTest, MountFailedWithInvalidMountPath) {
277 source_path_ = kTestSourcePath;
278 mount_path_ = kInvalidMountPath;
279
280 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
281 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
282 .Times(0);
283 EXPECT_CALL(platform_, RemoveEmptyDirectory(_)).Times(0);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000284 EXPECT_CALL(manager_, DoMount(_, _, _, _, _)).Times(0);
Ben Chanadc5d002014-03-12 15:02:26 -0700285 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
286
Ben Chande0e3f62017-09-26 06:28:39 -0700287 EXPECT_EQ(
288 MOUNT_ERROR_INVALID_PATH,
289 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700290}
291
292// Verifies that MountManager::Mount() returns an error when it is invoked
293// without a given mount path and the suggested mount path is invalid.
294TEST_F(MountManagerTest, MountFailedWithInvalidSuggestedMountPath) {
295 source_path_ = kTestSourcePath;
Ben Chan213c6d92019-04-10 16:21:52 -0700296 std::string suggested_mount_path = kInvalidMountPath;
Ben Chanadc5d002014-03-12 15:02:26 -0700297
298 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
299 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
300 .Times(0);
301 EXPECT_CALL(platform_, RemoveEmptyDirectory(_)).Times(0);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000302 EXPECT_CALL(manager_, DoMount(_, _, _, _, _)).Times(0);
Ben Chanadc5d002014-03-12 15:02:26 -0700303 EXPECT_CALL(manager_, SuggestMountPath(_))
304 .WillRepeatedly(Return(suggested_mount_path));
305
Ben Chande0e3f62017-09-26 06:28:39 -0700306 EXPECT_EQ(
307 MOUNT_ERROR_INVALID_PATH,
308 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700309
310 options_.push_back("mountlabel=custom_label");
Ben Chande0e3f62017-09-26 06:28:39 -0700311 EXPECT_EQ(
312 MOUNT_ERROR_INVALID_PATH,
313 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700314}
315
316// Verifies that MountManager::Mount() returns an error when it is invoked
317// with an mount label that yields an invalid mount path.
318TEST_F(MountManagerTest, MountFailedWithInvalidMountLabel) {
319 source_path_ = kTestSourcePath;
Ben Chan213c6d92019-04-10 16:21:52 -0700320 std::string suggested_mount_path = kTestSourcePath;
Ben Chanadc5d002014-03-12 15:02:26 -0700321 options_.push_back("mountlabel=../custom_label");
322
323 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
324 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
325 .Times(0);
326 EXPECT_CALL(platform_, RemoveEmptyDirectory(_)).Times(0);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000327 EXPECT_CALL(manager_, DoMount(_, _, _, _, _)).Times(0);
Ben Chanadc5d002014-03-12 15:02:26 -0700328 EXPECT_CALL(manager_, SuggestMountPath(_))
329 .WillOnce(Return(suggested_mount_path));
330
Ben Chande0e3f62017-09-26 06:28:39 -0700331 EXPECT_EQ(
332 MOUNT_ERROR_INVALID_PATH,
333 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700334}
335
Ben Chan9ed09e32011-11-22 16:24:06 -0800336// Verifies that MountManager::Mount() returns an error when it fails to
337// create the specified mount directory.
Ben Chan8dcede82011-07-25 20:56:13 -0700338TEST_F(MountManagerTest, MountFailedInCreateOrReuseEmptyDirectory) {
Ben Chanadc5d002014-03-12 15:02:26 -0700339 source_path_ = kTestSourcePath;
340 mount_path_ = kTestMountPath;
Ben Chan8dcede82011-07-25 20:56:13 -0700341
342 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700343 .WillOnce(Return(false));
Ben Chanf8692882011-08-21 10:15:30 -0700344 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
Ben Chan8dcede82011-07-25 20:56:13 -0700345 .Times(0);
346 EXPECT_CALL(platform_, RemoveEmptyDirectory(_)).Times(0);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000347 EXPECT_CALL(manager_, DoMount(_, _, _, _, _)).Times(0);
Ben Chan8dcede82011-07-25 20:56:13 -0700348 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
349
Ben Chande0e3f62017-09-26 06:28:39 -0700350 EXPECT_EQ(
351 MOUNT_ERROR_DIRECTORY_CREATION_FAILED,
352 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700353 EXPECT_EQ(kTestMountPath, mount_path_);
Ben Chan8dcede82011-07-25 20:56:13 -0700354 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
355}
356
Ben Chan9ed09e32011-11-22 16:24:06 -0800357// Verifies that MountManager::Mount() returns an error when it fails to
358// create a specified but already reserved mount directory.
Ben Chanf8692882011-08-21 10:15:30 -0700359TEST_F(MountManagerTest, MountFailedInCreateDirectoryDueToReservedMountPath) {
Ben Chanadc5d002014-03-12 15:02:26 -0700360 source_path_ = kTestSourcePath;
361 mount_path_ = kTestMountPath;
Sergei Datsenko7e7c7642021-01-08 19:15:34 +1100362 base::FilePath mount_path(mount_path_);
Ben Chanf8692882011-08-21 10:15:30 -0700363
364 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_)).Times(0);
365 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
366 .Times(0);
367 EXPECT_CALL(platform_, RemoveEmptyDirectory(_)).Times(0);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000368 EXPECT_CALL(manager_, DoMount(_, _, _, _, _)).Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700369 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
370
Sergei Datsenko7e7c7642021-01-08 19:15:34 +1100371 manager_.ReserveMountPath(mount_path, MOUNT_ERROR_UNKNOWN_FILESYSTEM);
Ben Chanf8692882011-08-21 10:15:30 -0700372 EXPECT_TRUE(manager_.IsMountPathReserved(mount_path_));
Ben Chanfcb2fc02011-11-21 09:44:07 -0800373 EXPECT_EQ(MOUNT_ERROR_UNKNOWN_FILESYSTEM,
Sergei Datsenko7e7c7642021-01-08 19:15:34 +1100374 manager_.GetMountErrorOfReservedMountPath(mount_path));
Ben Chande0e3f62017-09-26 06:28:39 -0700375 EXPECT_EQ(
376 MOUNT_ERROR_DIRECTORY_CREATION_FAILED,
377 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700378 EXPECT_EQ(kTestMountPath, mount_path_);
Ben Chanf8692882011-08-21 10:15:30 -0700379 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
380 EXPECT_TRUE(manager_.IsMountPathReserved(mount_path_));
Ben Chanfcb2fc02011-11-21 09:44:07 -0800381 EXPECT_EQ(MOUNT_ERROR_UNKNOWN_FILESYSTEM,
Sergei Datsenko7e7c7642021-01-08 19:15:34 +1100382 manager_.GetMountErrorOfReservedMountPath(mount_path));
Ben Chanf8692882011-08-21 10:15:30 -0700383}
384
Ben Chan9ed09e32011-11-22 16:24:06 -0800385// Verifies that MountManager::Mount() returns an error when it fails to
386// create a mount directory after a number of trials.
Ben Chan8dcede82011-07-25 20:56:13 -0700387TEST_F(MountManagerTest, MountFailedInCreateOrReuseEmptyDirectoryWithFallback) {
Ben Chanadc5d002014-03-12 15:02:26 -0700388 source_path_ = kTestSourcePath;
Ben Chan213c6d92019-04-10 16:21:52 -0700389 std::string suggested_mount_path = kTestMountPath;
Ben Chan8dcede82011-07-25 20:56:13 -0700390
391 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700392 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700393 .WillOnce(Return(false));
Ben Chan8dcede82011-07-25 20:56:13 -0700394 EXPECT_CALL(platform_, RemoveEmptyDirectory(_)).Times(0);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000395 EXPECT_CALL(manager_, DoMount(_, _, _, _, _)).Times(0);
Ben Chan8dcede82011-07-25 20:56:13 -0700396 EXPECT_CALL(manager_, SuggestMountPath(source_path_))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700397 .WillOnce(Return(suggested_mount_path));
Ben Chan8dcede82011-07-25 20:56:13 -0700398
Ben Chande0e3f62017-09-26 06:28:39 -0700399 EXPECT_EQ(
400 MOUNT_ERROR_DIRECTORY_CREATION_FAILED,
401 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700402 EXPECT_EQ("", mount_path_);
403 EXPECT_FALSE(manager_.IsMountPathInCache(suggested_mount_path));
404}
405
Ben Chan9ed09e32011-11-22 16:24:06 -0800406// Verifies that MountManager::Mount() returns no error when it successfully
Tatsuhisa Yamaguchi578b3bf2016-09-30 16:57:18 +0900407// mounts a source path to a specified mount path in read-write mode.
Ben Chan8dcede82011-07-25 20:56:13 -0700408TEST_F(MountManagerTest, MountSucceededWithGivenMountPath) {
Ben Chanadc5d002014-03-12 15:02:26 -0700409 source_path_ = kTestSourcePath;
410 mount_path_ = kTestMountPath;
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100411 base::FilePath mount_path(mount_path_);
Ben Chan8dcede82011-07-25 20:56:13 -0700412
Sergei Datsenko3928f782020-12-31 09:14:04 +1100413 options_.push_back("rw");
Ben Chan8dcede82011-07-25 20:56:13 -0700414 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700415 .WillOnce(Return(true));
Ben Chanf8692882011-08-21 10:15:30 -0700416 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
Ben Chan8dcede82011-07-25 20:56:13 -0700417 .Times(0);
418 EXPECT_CALL(platform_, RemoveEmptyDirectory(mount_path_))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700419 .WillOnce(Return(true));
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100420 auto ptr = std::make_unique<MountPoint>(
421 MountPointData{
422 .mount_path = mount_path,
423 .flags = IsReadOnlyMount(options_) ? MS_RDONLY : 0,
424 },
425 &platform_);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000426 EXPECT_CALL(manager_,
427 DoMount(source_path_, filesystem_type_, options_, mount_path, _))
428 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_NONE),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100429 Return(ByMove(std::move(ptr)))));
Ben Chan8dcede82011-07-25 20:56:13 -0700430 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
431
Ben Chande0e3f62017-09-26 06:28:39 -0700432 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Mount(source_path_, filesystem_type_,
433 options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700434 EXPECT_EQ(kTestMountPath, mount_path_);
Ben Chan8dcede82011-07-25 20:56:13 -0700435 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900436
Anand K Mistrye9a60fb2019-11-07 16:41:03 +1100437 base::Optional<MountEntry> mount_entry;
438 mount_entry = manager_.GetMountEntryForTest(source_path_);
439 EXPECT_TRUE(mount_entry);
440 EXPECT_FALSE(mount_entry->is_read_only);
George Burgess IV3d44fa82016-09-07 23:47:21 -0700441
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100442 EXPECT_CALL(platform_, Unmount(mount_path_, _))
443 .WillOnce(Return(MOUNT_ERROR_NONE));
George Burgess IV3d44fa82016-09-07 23:47:21 -0700444 EXPECT_TRUE(manager_.UnmountAll());
445 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900446}
447
Tatsuhisa Yamaguchi578b3bf2016-09-30 16:57:18 +0900448// Verifies that MountManager::Mount() stores correct mount status in cache when
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900449// read-only option is specified.
450TEST_F(MountManagerTest, MountCachesStatusWithReadOnlyOption) {
451 source_path_ = kTestSourcePath;
452 mount_path_ = kTestMountPath;
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100453 base::FilePath mount_path(mount_path_);
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900454
455 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_))
456 .WillOnce(Return(true));
457 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
458 .Times(0);
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900459 // Add read-only mount option.
Sergei Datsenko3928f782020-12-31 09:14:04 +1100460 options_.push_back("ro");
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100461 auto ptr = std::make_unique<MountPoint>(
462 MountPointData{
463 .mount_path = mount_path,
464 .flags = IsReadOnlyMount(options_) ? MS_RDONLY : 0,
465 },
466 &platform_);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000467 EXPECT_CALL(manager_,
468 DoMount(source_path_, filesystem_type_, options_, mount_path, _))
469 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_NONE),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100470 Return(ByMove(std::move(ptr)))));
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900471 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
472
Ben Chande0e3f62017-09-26 06:28:39 -0700473 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Mount(source_path_, filesystem_type_,
474 options_, &mount_path_));
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900475 EXPECT_EQ(kTestMountPath, mount_path_);
476 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
477
Anand K Mistrye9a60fb2019-11-07 16:41:03 +1100478 base::Optional<MountEntry> mount_entry;
479 mount_entry = manager_.GetMountEntryForTest(source_path_);
480 EXPECT_TRUE(mount_entry);
481 EXPECT_TRUE(mount_entry->is_read_only);
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100482 EXPECT_CALL(platform_, Unmount(mount_path_, _))
483 .WillOnce(Return(MOUNT_ERROR_NONE));
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900484}
485
Tatsuhisa Yamaguchi578b3bf2016-09-30 16:57:18 +0900486// Verifies that MountManager::Mount() stores correct mount status in cache when
487// the mounter requested to mount in read-write mode but fell back to read-only
488// mode.
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900489TEST_F(MountManagerTest, MountSuccededWithReadOnlyFallback) {
490 source_path_ = kTestSourcePath;
491 mount_path_ = kTestMountPath;
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100492 base::FilePath mount_path(mount_path_);
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900493
494 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_))
495 .WillOnce(Return(true));
496 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
497 .Times(0);
Sergei Datsenko3928f782020-12-31 09:14:04 +1100498 options_.push_back("rw");
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900499 // Emulate Mounter added read-only option as a fallback.
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100500 auto ptr = std::make_unique<MountPoint>(
501 MountPointData{
502 .mount_path = mount_path,
503 .flags = MS_RDONLY,
504 },
505 &platform_);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000506 EXPECT_CALL(manager_,
507 DoMount(source_path_, filesystem_type_, options_, mount_path, _))
508 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_NONE),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100509 Return(ByMove(std::move(ptr)))));
510
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900511 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
512
Ben Chande0e3f62017-09-26 06:28:39 -0700513 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Mount(source_path_, filesystem_type_,
514 options_, &mount_path_));
Tatsuhisa Yamaguchi5a6a3032016-08-19 20:03:54 +0900515 EXPECT_EQ(kTestMountPath, mount_path_);
516 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
517
Anand K Mistrye9a60fb2019-11-07 16:41:03 +1100518 base::Optional<MountEntry> mount_entry;
519 mount_entry = manager_.GetMountEntryForTest(source_path_);
520 EXPECT_TRUE(mount_entry);
521 EXPECT_TRUE(mount_entry->is_read_only);
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100522 EXPECT_CALL(platform_, Unmount(mount_path_, _))
523 .WillOnce(Return(MOUNT_ERROR_NONE));
Ben Chan8dcede82011-07-25 20:56:13 -0700524}
525
Ben Chan9ed09e32011-11-22 16:24:06 -0800526// Verifies that MountManager::Mount() returns no error when it successfully
527// mounts a source path with no mount path specified.
Ben Chan8dcede82011-07-25 20:56:13 -0700528TEST_F(MountManagerTest, MountSucceededWithEmptyMountPath) {
Ben Chanadc5d002014-03-12 15:02:26 -0700529 source_path_ = kTestSourcePath;
Ben Chan213c6d92019-04-10 16:21:52 -0700530 std::string suggested_mount_path = kTestMountPath;
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100531 base::FilePath mount_path(suggested_mount_path);
Ben Chan8dcede82011-07-25 20:56:13 -0700532
533 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700534 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700535 .WillOnce(Return(true));
Ben Chan8dcede82011-07-25 20:56:13 -0700536 EXPECT_CALL(platform_, RemoveEmptyDirectory(suggested_mount_path))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700537 .WillOnce(Return(true));
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100538
539 auto ptr = std::make_unique<MountPoint>(
540 MountPointData{
541 .mount_path = mount_path,
542 .flags = IsReadOnlyMount(options_) ? MS_RDONLY : 0,
543 },
544 &platform_);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000545 EXPECT_CALL(manager_,
546 DoMount(source_path_, filesystem_type_, options_, mount_path, _))
547 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_NONE),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100548 Return(ByMove(std::move(ptr)))));
Ben Chan8dcede82011-07-25 20:56:13 -0700549 EXPECT_CALL(manager_, SuggestMountPath(source_path_))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700550 .WillOnce(Return(suggested_mount_path));
Ben Chan8dcede82011-07-25 20:56:13 -0700551
Ben Chande0e3f62017-09-26 06:28:39 -0700552 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Mount(source_path_, filesystem_type_,
553 options_, &mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700554 EXPECT_EQ(suggested_mount_path, mount_path_);
555 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100556 EXPECT_CALL(platform_, Unmount(suggested_mount_path, _))
557 .WillOnce(Return(MOUNT_ERROR_NONE));
Ben Chan8dcede82011-07-25 20:56:13 -0700558 EXPECT_TRUE(manager_.UnmountAll());
Ben Chanf8692882011-08-21 10:15:30 -0700559 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700560}
561
Ben Chan09c90d02012-04-25 22:09:09 -0700562// Verifies that MountManager::Mount() returns no error when it successfully
563// mounts a source path with a given mount label in options.
564TEST_F(MountManagerTest, MountSucceededWithGivenMountLabel) {
Ben Chanadc5d002014-03-12 15:02:26 -0700565 source_path_ = kTestSourcePath;
Ben Chan213c6d92019-04-10 16:21:52 -0700566 std::string suggested_mount_path = kTestMountPath;
567 std::string final_mount_path =
568 std::string(kMountRootDirectory) + "/custom_label";
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100569 base::FilePath mount_path(final_mount_path);
Ben Chan09c90d02012-04-25 22:09:09 -0700570 options_.push_back("mountlabel=custom_label");
Ben Chan213c6d92019-04-10 16:21:52 -0700571 std::vector<std::string> updated_options;
Ben Chan09c90d02012-04-25 22:09:09 -0700572
573 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
574 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
575 .WillOnce(Return(true));
Ben Chan09c90d02012-04-25 22:09:09 -0700576 EXPECT_CALL(platform_, RemoveEmptyDirectory(final_mount_path))
577 .WillOnce(Return(true));
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100578 auto ptr = std::make_unique<MountPoint>(
579 MountPointData{
580 .mount_path = mount_path,
581 .flags = IsReadOnlyMount(options_) ? MS_RDONLY : 0,
582 },
583 &platform_);
584 EXPECT_CALL(manager_,
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000585 DoMount(source_path_, filesystem_type_, _, mount_path, _))
586 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_NONE),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100587 Return(ByMove(std::move(ptr)))));
Ben Chan09c90d02012-04-25 22:09:09 -0700588 EXPECT_CALL(manager_, SuggestMountPath(source_path_))
589 .WillOnce(Return(suggested_mount_path));
590
Ben Chande0e3f62017-09-26 06:28:39 -0700591 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Mount(source_path_, filesystem_type_,
592 options_, &mount_path_));
Ben Chan09c90d02012-04-25 22:09:09 -0700593 EXPECT_EQ(final_mount_path, mount_path_);
594 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100595 EXPECT_CALL(platform_, Unmount(final_mount_path, _))
596 .WillOnce(Return(MOUNT_ERROR_NONE));
Ben Chan09c90d02012-04-25 22:09:09 -0700597 EXPECT_TRUE(manager_.UnmountAll());
598 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
599}
600
Ben Chan9ed09e32011-11-22 16:24:06 -0800601// Verifies that MountManager::Mount() handles the mounting of an already
602// mounted source path properly.
Ben Chan8dcede82011-07-25 20:56:13 -0700603TEST_F(MountManagerTest, MountWithAlreadyMountedSourcePath) {
Ben Chanadc5d002014-03-12 15:02:26 -0700604 source_path_ = kTestSourcePath;
Ben Chan213c6d92019-04-10 16:21:52 -0700605 std::string suggested_mount_path = kTestMountPath;
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100606 base::FilePath mount_path(suggested_mount_path);
Ben Chan8dcede82011-07-25 20:56:13 -0700607
608 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700609 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700610 .WillOnce(Return(true));
Ben Chan8dcede82011-07-25 20:56:13 -0700611 EXPECT_CALL(platform_, RemoveEmptyDirectory(suggested_mount_path))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700612 .WillOnce(Return(true));
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100613 auto ptr = std::make_unique<MountPoint>(
614 MountPointData{
615 .mount_path = mount_path,
616 .flags = IsReadOnlyMount(options_) ? MS_RDONLY : 0,
617 },
618 &platform_);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000619 EXPECT_CALL(manager_,
620 DoMount(source_path_, filesystem_type_, options_, mount_path, _))
621 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_NONE),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100622 Return(ByMove(std::move(ptr)))));
Ben Chan8dcede82011-07-25 20:56:13 -0700623 EXPECT_CALL(manager_, SuggestMountPath(source_path_))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700624 .WillOnce(Return(suggested_mount_path));
Ben Chan8dcede82011-07-25 20:56:13 -0700625
Ben Chande0e3f62017-09-26 06:28:39 -0700626 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Mount(source_path_, filesystem_type_,
627 options_, &mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700628 EXPECT_EQ(suggested_mount_path, mount_path_);
629 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
630
631 // Mount an already-mounted source path without specifying a mount path
632 mount_path_.clear();
Ben Chande0e3f62017-09-26 06:28:39 -0700633 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Mount(source_path_, filesystem_type_,
634 options_, &mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700635 EXPECT_EQ(suggested_mount_path, mount_path_);
636 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
637
638 // Mount an already-mounted source path to the same mount path
639 mount_path_ = suggested_mount_path;
Ben Chande0e3f62017-09-26 06:28:39 -0700640 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Mount(source_path_, filesystem_type_,
641 options_, &mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700642 EXPECT_EQ(suggested_mount_path, mount_path_);
643 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
644
645 // Mount an already-mounted source path to a different mount path
646 mount_path_ = "another-path";
Ben Chande0e3f62017-09-26 06:28:39 -0700647 EXPECT_EQ(
648 MOUNT_ERROR_PATH_ALREADY_MOUNTED,
649 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700650 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
651 EXPECT_TRUE(manager_.IsMountPathInCache(suggested_mount_path));
652
653 EXPECT_TRUE(manager_.UnmountAll());
Ben Chanf8692882011-08-21 10:15:30 -0700654 EXPECT_FALSE(manager_.IsMountPathReserved(suggested_mount_path));
655}
656
Ben Chan9ed09e32011-11-22 16:24:06 -0800657// Verifies that MountManager::Mount() successfully reserves a path for a given
658// type of error. A specific mount path is given in this case.
Ben Chanf8692882011-08-21 10:15:30 -0700659TEST_F(MountManagerTest, MountSucceededWithGivenMountPathInReservedCase) {
Ben Chanadc5d002014-03-12 15:02:26 -0700660 source_path_ = kTestSourcePath;
661 mount_path_ = kTestMountPath;
Ben Chanf8692882011-08-21 10:15:30 -0700662
663 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_))
664 .WillOnce(Return(true));
665 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
666 .Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700667 EXPECT_CALL(platform_, RemoveEmptyDirectory(mount_path_))
668 .WillOnce(Return(true));
Anand K Mistryd0a05232020-01-24 14:04:18 +1100669 EXPECT_CALL(manager_, DoMount(source_path_, filesystem_type_, options_,
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000670 base::FilePath(mount_path_), _))
671 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_UNKNOWN_FILESYSTEM),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100672 Return(ByMove(nullptr))));
Ben Chanf8692882011-08-21 10:15:30 -0700673 EXPECT_CALL(manager_,
Ben Chanfcb2fc02011-11-21 09:44:07 -0800674 ShouldReserveMountPathOnError(MOUNT_ERROR_UNKNOWN_FILESYSTEM))
Ben Chanf8692882011-08-21 10:15:30 -0700675 .WillOnce(Return(true));
676 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
677
Ben Chande0e3f62017-09-26 06:28:39 -0700678 EXPECT_EQ(
679 MOUNT_ERROR_UNKNOWN_FILESYSTEM,
680 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700681 EXPECT_EQ(kTestMountPath, mount_path_);
Ben Chanf8692882011-08-21 10:15:30 -0700682 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
683 EXPECT_TRUE(manager_.IsMountPathReserved(mount_path_));
684 EXPECT_TRUE(manager_.UnmountAll());
685 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
686 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
687}
688
Ben Chan9ed09e32011-11-22 16:24:06 -0800689// Verifies that MountManager::Mount() successfully reserves a path for a given
690// type of error. No specific mount path is given in this case.
Ben Chanf8692882011-08-21 10:15:30 -0700691TEST_F(MountManagerTest, MountSucceededWithEmptyMountPathInReservedCase) {
Ben Chanadc5d002014-03-12 15:02:26 -0700692 source_path_ = kTestSourcePath;
Ben Chan213c6d92019-04-10 16:21:52 -0700693 std::string suggested_mount_path = kTestMountPath;
Ben Chanf8692882011-08-21 10:15:30 -0700694
695 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
696 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
697 .WillOnce(Return(true));
Ben Chanf8692882011-08-21 10:15:30 -0700698 EXPECT_CALL(platform_, RemoveEmptyDirectory(suggested_mount_path))
699 .WillOnce(Return(true));
700 EXPECT_CALL(manager_, DoMount(source_path_, filesystem_type_, options_,
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000701 base::FilePath(suggested_mount_path), _))
702 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_UNKNOWN_FILESYSTEM),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100703 Return(ByMove(nullptr))));
Ben Chanf8692882011-08-21 10:15:30 -0700704 EXPECT_CALL(manager_,
Ben Chanfcb2fc02011-11-21 09:44:07 -0800705 ShouldReserveMountPathOnError(MOUNT_ERROR_UNKNOWN_FILESYSTEM))
Ben Chanf8692882011-08-21 10:15:30 -0700706 .WillOnce(Return(true));
707 EXPECT_CALL(manager_, SuggestMountPath(source_path_))
708 .WillOnce(Return(suggested_mount_path));
709
Ben Chande0e3f62017-09-26 06:28:39 -0700710 EXPECT_EQ(
711 MOUNT_ERROR_UNKNOWN_FILESYSTEM,
712 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanf8692882011-08-21 10:15:30 -0700713 EXPECT_EQ(suggested_mount_path, mount_path_);
714 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
715 EXPECT_TRUE(manager_.IsMountPathReserved(mount_path_));
716 EXPECT_TRUE(manager_.UnmountAll());
717 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
718 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
719}
720
Ben Chan9ed09e32011-11-22 16:24:06 -0800721// Verifies that MountManager::Mount() successfully reserves a path for a given
722// type of error and returns the same error when it tries to mount the same path
723// again.
Ben Chan632c9f82011-10-11 12:22:16 -0700724TEST_F(MountManagerTest, MountSucceededWithAlreadyReservedMountPath) {
Ben Chanadc5d002014-03-12 15:02:26 -0700725 source_path_ = kTestSourcePath;
Ben Chan213c6d92019-04-10 16:21:52 -0700726 std::string suggested_mount_path = kTestMountPath;
Ben Chan632c9f82011-10-11 12:22:16 -0700727
728 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
729 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
730 .WillOnce(Return(true));
Ben Chan632c9f82011-10-11 12:22:16 -0700731 EXPECT_CALL(platform_, RemoveEmptyDirectory(suggested_mount_path))
732 .WillOnce(Return(true));
733 EXPECT_CALL(manager_, DoMount(source_path_, filesystem_type_, options_,
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000734 base::FilePath(suggested_mount_path), _))
735 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_UNKNOWN_FILESYSTEM),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100736 Return(ByMove(nullptr))));
Ben Chan632c9f82011-10-11 12:22:16 -0700737 EXPECT_CALL(manager_,
Ben Chanfcb2fc02011-11-21 09:44:07 -0800738 ShouldReserveMountPathOnError(MOUNT_ERROR_UNKNOWN_FILESYSTEM))
Ben Chan632c9f82011-10-11 12:22:16 -0700739 .WillOnce(Return(true));
740 EXPECT_CALL(manager_, SuggestMountPath(source_path_))
741 .WillOnce(Return(suggested_mount_path));
742
Ben Chande0e3f62017-09-26 06:28:39 -0700743 EXPECT_EQ(
744 MOUNT_ERROR_UNKNOWN_FILESYSTEM,
745 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chan632c9f82011-10-11 12:22:16 -0700746 EXPECT_EQ(suggested_mount_path, mount_path_);
747 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
748 EXPECT_TRUE(manager_.IsMountPathReserved(mount_path_));
749
750 mount_path_ = "";
Ben Chande0e3f62017-09-26 06:28:39 -0700751 EXPECT_EQ(
752 MOUNT_ERROR_UNKNOWN_FILESYSTEM,
753 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chan632c9f82011-10-11 12:22:16 -0700754 EXPECT_EQ(suggested_mount_path, mount_path_);
755 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
756 EXPECT_TRUE(manager_.IsMountPathReserved(mount_path_));
757
758 EXPECT_TRUE(manager_.UnmountAll());
759 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
760 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
761}
762
Ben Chan9ed09e32011-11-22 16:24:06 -0800763// Verifies that MountManager::Mount() successfully reserves a path for a given
764// type of error and returns the same error when it tries to mount the same path
765// again.
Ben Chanf8692882011-08-21 10:15:30 -0700766TEST_F(MountManagerTest, MountFailedWithGivenMountPathInReservedCase) {
Ben Chanadc5d002014-03-12 15:02:26 -0700767 source_path_ = kTestSourcePath;
768 mount_path_ = kTestMountPath;
Ben Chanf8692882011-08-21 10:15:30 -0700769
770 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_))
771 .WillOnce(Return(true));
772 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
773 .Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700774 EXPECT_CALL(platform_, RemoveEmptyDirectory(mount_path_))
775 .WillOnce(Return(true));
Anand K Mistryd0a05232020-01-24 14:04:18 +1100776 EXPECT_CALL(manager_, DoMount(source_path_, filesystem_type_, options_,
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000777 base::FilePath(mount_path_), _))
778 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_UNKNOWN_FILESYSTEM),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100779 Return(ByMove(nullptr))));
Ben Chanf8692882011-08-21 10:15:30 -0700780 EXPECT_CALL(manager_,
Ben Chanfcb2fc02011-11-21 09:44:07 -0800781 ShouldReserveMountPathOnError(MOUNT_ERROR_UNKNOWN_FILESYSTEM))
Ben Chanf8692882011-08-21 10:15:30 -0700782 .WillOnce(Return(false));
783 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
784
Ben Chande0e3f62017-09-26 06:28:39 -0700785 EXPECT_EQ(
786 MOUNT_ERROR_UNKNOWN_FILESYSTEM,
787 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700788 EXPECT_EQ(kTestMountPath, mount_path_);
Ben Chanf8692882011-08-21 10:15:30 -0700789 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
790 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
791}
792
Ben Chan9ed09e32011-11-22 16:24:06 -0800793// Verifies that MountManager::Mount() fails to mount or reserve a path for
794// a type of error that is not enabled for reservation.
Ben Chanf8692882011-08-21 10:15:30 -0700795TEST_F(MountManagerTest, MountFailedWithEmptyMountPathInReservedCase) {
Ben Chanadc5d002014-03-12 15:02:26 -0700796 source_path_ = kTestSourcePath;
Ben Chan213c6d92019-04-10 16:21:52 -0700797 std::string suggested_mount_path = kTestMountPath;
Ben Chanf8692882011-08-21 10:15:30 -0700798
799 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
800 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
801 .WillOnce(Return(true));
Ben Chanf8692882011-08-21 10:15:30 -0700802 EXPECT_CALL(platform_, RemoveEmptyDirectory(suggested_mount_path))
803 .WillOnce(Return(true));
804 EXPECT_CALL(manager_, DoMount(source_path_, filesystem_type_, options_,
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000805 base::FilePath(suggested_mount_path), _))
806 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_UNKNOWN_FILESYSTEM),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100807 Return(ByMove(nullptr))));
Ben Chanf8692882011-08-21 10:15:30 -0700808 EXPECT_CALL(manager_,
Ben Chanfcb2fc02011-11-21 09:44:07 -0800809 ShouldReserveMountPathOnError(MOUNT_ERROR_UNKNOWN_FILESYSTEM))
Ben Chanf8692882011-08-21 10:15:30 -0700810 .WillOnce(Return(false));
811 EXPECT_CALL(manager_, SuggestMountPath(source_path_))
812 .WillOnce(Return(suggested_mount_path));
813
Ben Chande0e3f62017-09-26 06:28:39 -0700814 EXPECT_EQ(
815 MOUNT_ERROR_UNKNOWN_FILESYSTEM,
816 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanf8692882011-08-21 10:15:30 -0700817 EXPECT_EQ("", mount_path_);
818 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
819 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700820}
821
Ben Chan9ed09e32011-11-22 16:24:06 -0800822// Verifies that MountManager::Unmount() returns an error when it is invoked
823// to unmount an empty path.
Ben Chan8dcede82011-07-25 20:56:13 -0700824TEST_F(MountManagerTest, UnmountFailedWithEmptyPath) {
825 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700826 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
Ben Chan8dcede82011-07-25 20:56:13 -0700827 .Times(0);
828 EXPECT_CALL(platform_, RemoveEmptyDirectory(_)).Times(0);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000829 EXPECT_CALL(manager_, DoMount(_, _, _, _, _)).Times(0);
Ben Chan8dcede82011-07-25 20:56:13 -0700830 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
831
François Degros3fe77c52020-02-20 14:44:54 +1100832 EXPECT_EQ(MOUNT_ERROR_PATH_NOT_MOUNTED, manager_.Unmount(mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700833}
834
Ben Chan9ed09e32011-11-22 16:24:06 -0800835// Verifies that MountManager::Unmount() returns an error when it fails to
836// unmount a path that is not mounted.
Ben Chan8dcede82011-07-25 20:56:13 -0700837TEST_F(MountManagerTest, UnmountFailedWithPathNotMounted) {
838 mount_path_ = "nonexistent-path";
839
840 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(_)).Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700841 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
Ben Chan8dcede82011-07-25 20:56:13 -0700842 .Times(0);
843 EXPECT_CALL(platform_, RemoveEmptyDirectory(_)).Times(0);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000844 EXPECT_CALL(manager_, DoMount(_, _, _, _, _)).Times(0);
Ben Chan8dcede82011-07-25 20:56:13 -0700845 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
846
Anand K Mistry5a6d5fa2019-11-05 17:21:48 +1100847 EXPECT_EQ(MOUNT_ERROR_PATH_NOT_MOUNTED, manager_.Unmount(mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700848}
849
Ben Chan9ed09e32011-11-22 16:24:06 -0800850// Verifies that MountManager::Unmount() returns no error when it successfully
851// unmounts a source path.
Ben Chan8dcede82011-07-25 20:56:13 -0700852TEST_F(MountManagerTest, UnmountSucceededWithGivenSourcePath) {
Ben Chanadc5d002014-03-12 15:02:26 -0700853 source_path_ = kTestSourcePath;
854 mount_path_ = kTestMountPath;
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100855 base::FilePath mount_path(mount_path_);
Ben Chan8dcede82011-07-25 20:56:13 -0700856
857 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700858 .WillOnce(Return(true));
Ben Chanf8692882011-08-21 10:15:30 -0700859 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
Ben Chan8dcede82011-07-25 20:56:13 -0700860 .Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700861 EXPECT_CALL(platform_, RemoveEmptyDirectory(mount_path_))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700862 .WillOnce(Return(true));
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100863 auto ptr = std::make_unique<MountPoint>(
864 MountPointData{
865 .mount_path = mount_path,
866 .flags = IsReadOnlyMount(options_) ? MS_RDONLY : 0,
867 },
868 &platform_);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000869 EXPECT_CALL(manager_,
870 DoMount(source_path_, filesystem_type_, options_, mount_path, _))
871 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_NONE),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100872 Return(ByMove(std::move(ptr)))));
Ben Chan8dcede82011-07-25 20:56:13 -0700873 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
874
Ben Chande0e3f62017-09-26 06:28:39 -0700875 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Mount(source_path_, filesystem_type_,
876 options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700877 EXPECT_EQ(kTestMountPath, mount_path_);
Ben Chan8dcede82011-07-25 20:56:13 -0700878 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
879
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100880 EXPECT_CALL(platform_, Unmount(mount_path_, _))
881 .WillOnce(Return(MOUNT_ERROR_NONE));
Anand K Mistry5a6d5fa2019-11-05 17:21:48 +1100882 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Unmount(source_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700883 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
884}
885
Ben Chan9ed09e32011-11-22 16:24:06 -0800886// Verifies that MountManager::Unmount() returns no error when it successfully
887// unmounts a mount path.
Ben Chan8dcede82011-07-25 20:56:13 -0700888TEST_F(MountManagerTest, UnmountSucceededWithGivenMountPath) {
Ben Chanadc5d002014-03-12 15:02:26 -0700889 source_path_ = kTestSourcePath;
890 mount_path_ = kTestMountPath;
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100891 base::FilePath mount_path(mount_path_);
Ben Chan8dcede82011-07-25 20:56:13 -0700892
893 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700894 .WillOnce(Return(true));
Ben Chanf8692882011-08-21 10:15:30 -0700895 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
Ben Chan8dcede82011-07-25 20:56:13 -0700896 .Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700897 EXPECT_CALL(platform_, RemoveEmptyDirectory(mount_path_))
Ben Chan1d5a8e72011-08-01 15:21:39 -0700898 .WillOnce(Return(true));
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100899 auto ptr = std::make_unique<MountPoint>(
900 MountPointData{
901 .mount_path = mount_path,
902 .flags = IsReadOnlyMount(options_) ? MS_RDONLY : 0,
903 },
904 &platform_);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000905 EXPECT_CALL(manager_,
906 DoMount(source_path_, filesystem_type_, options_, mount_path, _))
907 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_NONE),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100908 Return(ByMove(std::move(ptr)))));
Ben Chan8dcede82011-07-25 20:56:13 -0700909 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
910
Ben Chande0e3f62017-09-26 06:28:39 -0700911 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Mount(source_path_, filesystem_type_,
912 options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700913 EXPECT_EQ(kTestMountPath, mount_path_);
Ben Chan8dcede82011-07-25 20:56:13 -0700914 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
915
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100916 EXPECT_CALL(platform_, Unmount(mount_path_, _))
917 .WillOnce(Return(MOUNT_ERROR_NONE));
Anand K Mistry5a6d5fa2019-11-05 17:21:48 +1100918 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Unmount(mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -0700919 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
920}
921
Sergei Datsenko2879b5c2019-09-26 13:47:40 +1000922// Verifies that MountManager::Unmount() removes mount path from cache if
923// it appears to be not mounted.
924TEST_F(MountManagerTest, UnmountRemovesFromCacheIfNotMounted) {
925 source_path_ = kTestSourcePath;
926 mount_path_ = kTestMountPath;
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100927 base::FilePath mount_path(mount_path_);
Sergei Datsenko2879b5c2019-09-26 13:47:40 +1000928
929 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_))
930 .WillOnce(Return(true));
931 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
932 .Times(0);
Sergei Datsenko2879b5c2019-09-26 13:47:40 +1000933 EXPECT_CALL(platform_, RemoveEmptyDirectory(mount_path_))
934 .WillOnce(Return(true));
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100935 auto ptr = std::make_unique<MountPoint>(
936 MountPointData{
937 .mount_path = mount_path,
938 .flags = IsReadOnlyMount(options_) ? MS_RDONLY : 0,
939 },
940 &platform_);
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000941 EXPECT_CALL(manager_,
942 DoMount(source_path_, filesystem_type_, options_, mount_path, _))
943 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_NONE),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100944 Return(ByMove(std::move(ptr)))));
Sergei Datsenko2879b5c2019-09-26 13:47:40 +1000945 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
946
947 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Mount(source_path_, filesystem_type_,
948 options_, &mount_path_));
949 EXPECT_EQ(kTestMountPath, mount_path_);
950 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
951
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100952 EXPECT_CALL(platform_, Unmount(mount_path_, _))
953 .WillOnce(Return(MOUNT_ERROR_PATH_NOT_MOUNTED));
954
Anand K Mistry5a6d5fa2019-11-05 17:21:48 +1100955 EXPECT_EQ(MOUNT_ERROR_PATH_NOT_MOUNTED, manager_.Unmount(mount_path_));
Sergei Datsenko2879b5c2019-09-26 13:47:40 +1000956 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
957}
958
Ben Chan9ed09e32011-11-22 16:24:06 -0800959// Verifies that MountManager::Unmount() returns no error when it is invoked
960// to unmount the source path of a reserved mount path.
Ben Chanf8692882011-08-21 10:15:30 -0700961TEST_F(MountManagerTest, UnmountSucceededWithGivenSourcePathInReservedCase) {
Ben Chanadc5d002014-03-12 15:02:26 -0700962 source_path_ = kTestSourcePath;
963 mount_path_ = kTestMountPath;
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100964 base::FilePath mount_path(mount_path_);
Ben Chanf8692882011-08-21 10:15:30 -0700965
966 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_))
967 .WillOnce(Return(true));
968 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
969 .Times(0);
Ben Chanf8692882011-08-21 10:15:30 -0700970 EXPECT_CALL(platform_, RemoveEmptyDirectory(mount_path_))
971 .WillOnce(Return(true));
Nigel Taoca7a4ef2021-05-14 11:44:25 +1000972 EXPECT_CALL(manager_,
973 DoMount(source_path_, filesystem_type_, options_, mount_path, _))
974 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_UNKNOWN_FILESYSTEM),
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100975 Return(ByMove(nullptr))));
Ben Chanf8692882011-08-21 10:15:30 -0700976 EXPECT_CALL(manager_,
Ben Chanfcb2fc02011-11-21 09:44:07 -0800977 ShouldReserveMountPathOnError(MOUNT_ERROR_UNKNOWN_FILESYSTEM))
Ben Chanf8692882011-08-21 10:15:30 -0700978 .WillOnce(Return(true));
979 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
980
Ben Chande0e3f62017-09-26 06:28:39 -0700981 EXPECT_EQ(
982 MOUNT_ERROR_UNKNOWN_FILESYSTEM,
983 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -0700984 EXPECT_EQ(kTestMountPath, mount_path_);
Ben Chanf8692882011-08-21 10:15:30 -0700985 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
986 EXPECT_TRUE(manager_.IsMountPathReserved(mount_path_));
987
Anand K Mistry5a6d5fa2019-11-05 17:21:48 +1100988 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Unmount(source_path_));
Ben Chanf8692882011-08-21 10:15:30 -0700989 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
990 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
991}
992
Ben Chan9ed09e32011-11-22 16:24:06 -0800993// Verifies that MountManager::Unmount() returns no error when it is invoked
994// to unmount a reserved mount path.
Ben Chanf8692882011-08-21 10:15:30 -0700995TEST_F(MountManagerTest, UnmountSucceededWithGivenMountPathInReservedCase) {
Ben Chanadc5d002014-03-12 15:02:26 -0700996 source_path_ = kTestSourcePath;
997 mount_path_ = kTestMountPath;
Sergei Datsenko0ba12032021-01-07 08:51:14 +1100998 base::FilePath mount_path(mount_path_);
Ben Chanf8692882011-08-21 10:15:30 -0700999
1000 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectory(mount_path_))
1001 .WillOnce(Return(true));
1002 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
1003 .Times(0);
Ben Chanf8692882011-08-21 10:15:30 -07001004 EXPECT_CALL(platform_, RemoveEmptyDirectory(mount_path_))
1005 .WillOnce(Return(true));
Nigel Taoca7a4ef2021-05-14 11:44:25 +10001006 EXPECT_CALL(manager_,
1007 DoMount(source_path_, filesystem_type_, options_, mount_path, _))
1008 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_UNKNOWN_FILESYSTEM),
Sergei Datsenko0ba12032021-01-07 08:51:14 +11001009 Return(ByMove(nullptr))));
Ben Chanf8692882011-08-21 10:15:30 -07001010 EXPECT_CALL(manager_,
Ben Chanfcb2fc02011-11-21 09:44:07 -08001011 ShouldReserveMountPathOnError(MOUNT_ERROR_UNKNOWN_FILESYSTEM))
Ben Chanf8692882011-08-21 10:15:30 -07001012 .WillOnce(Return(true));
1013 EXPECT_CALL(manager_, SuggestMountPath(_)).Times(0);
1014
Ben Chande0e3f62017-09-26 06:28:39 -07001015 EXPECT_EQ(
1016 MOUNT_ERROR_UNKNOWN_FILESYSTEM,
1017 manager_.Mount(source_path_, filesystem_type_, options_, &mount_path_));
Ben Chanadc5d002014-03-12 15:02:26 -07001018 EXPECT_EQ(kTestMountPath, mount_path_);
Ben Chanf8692882011-08-21 10:15:30 -07001019 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
1020 EXPECT_TRUE(manager_.IsMountPathReserved(mount_path_));
1021
Sergei Datsenko0ba12032021-01-07 08:51:14 +11001022 EXPECT_CALL(platform_, Unmount).Times(0);
Anand K Mistry5a6d5fa2019-11-05 17:21:48 +11001023 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.Unmount(mount_path_));
Ben Chanf8692882011-08-21 10:15:30 -07001024 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
1025 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
1026}
1027
Ben Chan9ed09e32011-11-22 16:24:06 -08001028// Verifies that MountManager::IsMountPathInCache() works as expected.
Ben Chan8dcede82011-07-25 20:56:13 -07001029TEST_F(MountManagerTest, IsMountPathInCache) {
Ben Chanadc5d002014-03-12 15:02:26 -07001030 source_path_ = kTestSourcePath;
1031 mount_path_ = kTestMountPath;
Ben Chan8dcede82011-07-25 20:56:13 -07001032
1033 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001034 manager_.AddMountStateCache(source_path_, MakeMountPoint(mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -07001035 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
1036 EXPECT_TRUE(manager_.RemoveMountPathFromCache(mount_path_));
1037 EXPECT_FALSE(manager_.IsMountPathInCache(mount_path_));
1038}
1039
Ben Chan9ed09e32011-11-22 16:24:06 -08001040// Verifies that MountManager::RemoveMountPathFromCache() works as expected.
Ben Chan8dcede82011-07-25 20:56:13 -07001041TEST_F(MountManagerTest, RemoveMountPathFromCache) {
Ben Chanadc5d002014-03-12 15:02:26 -07001042 source_path_ = kTestSourcePath;
1043 mount_path_ = kTestMountPath;
Ben Chan8dcede82011-07-25 20:56:13 -07001044
1045 EXPECT_FALSE(manager_.RemoveMountPathFromCache(mount_path_));
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001046 manager_.AddMountStateCache(source_path_, MakeMountPoint(mount_path_));
Ben Chan8dcede82011-07-25 20:56:13 -07001047 EXPECT_TRUE(manager_.RemoveMountPathFromCache(mount_path_));
1048 EXPECT_FALSE(manager_.RemoveMountPathFromCache(mount_path_));
1049}
1050
Ben Chan9ed09e32011-11-22 16:24:06 -08001051// Verifies that MountManager::GetReservedMountPaths() works as expected.
Ben Chan632c9f82011-10-11 12:22:16 -07001052TEST_F(MountManagerTest, GetReservedMountPaths) {
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001053 std::unordered_set<std::string> reserved_paths;
1054 std::unordered_set<std::string> expected_paths;
1055 base::FilePath path1("path1");
1056 base::FilePath path2("path2");
Ben Chan632c9f82011-10-11 12:22:16 -07001057
1058 reserved_paths = manager_.GetReservedMountPaths();
Ben Chand30e7432011-11-28 13:43:17 -08001059 EXPECT_TRUE(expected_paths == reserved_paths);
Ben Chan632c9f82011-10-11 12:22:16 -07001060
Ben Chanfcb2fc02011-11-21 09:44:07 -08001061 manager_.ReserveMountPath(path1, MOUNT_ERROR_UNKNOWN_FILESYSTEM);
Ben Chan632c9f82011-10-11 12:22:16 -07001062 reserved_paths = manager_.GetReservedMountPaths();
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001063 expected_paths.insert(path1.value());
Ben Chand30e7432011-11-28 13:43:17 -08001064 EXPECT_TRUE(expected_paths == reserved_paths);
Ben Chan632c9f82011-10-11 12:22:16 -07001065
Ben Chanfcb2fc02011-11-21 09:44:07 -08001066 manager_.ReserveMountPath(path2, MOUNT_ERROR_UNKNOWN_FILESYSTEM);
Ben Chan632c9f82011-10-11 12:22:16 -07001067 reserved_paths = manager_.GetReservedMountPaths();
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001068 expected_paths.insert(path2.value());
Ben Chand30e7432011-11-28 13:43:17 -08001069 EXPECT_TRUE(expected_paths == reserved_paths);
Ben Chan632c9f82011-10-11 12:22:16 -07001070
1071 manager_.UnreserveMountPath(path1);
1072 reserved_paths = manager_.GetReservedMountPaths();
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001073 expected_paths.erase(path1.value());
Ben Chand30e7432011-11-28 13:43:17 -08001074 EXPECT_TRUE(expected_paths == reserved_paths);
Ben Chan632c9f82011-10-11 12:22:16 -07001075
1076 manager_.UnreserveMountPath(path2);
1077 reserved_paths = manager_.GetReservedMountPaths();
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001078 expected_paths.erase(path2.value());
Ben Chand30e7432011-11-28 13:43:17 -08001079 EXPECT_TRUE(expected_paths == reserved_paths);
Ben Chan632c9f82011-10-11 12:22:16 -07001080}
1081
Ben Chan9ed09e32011-11-22 16:24:06 -08001082// Verifies that MountManager::ReserveMountPath() and
1083// MountManager::UnreserveMountPath() work as expected.
Ben Chanf8692882011-08-21 10:15:30 -07001084TEST_F(MountManagerTest, ReserveAndUnreserveMountPath) {
Ben Chanadc5d002014-03-12 15:02:26 -07001085 mount_path_ = kTestMountPath;
Ben Chanf8692882011-08-21 10:15:30 -07001086
1087 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001088 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.GetMountErrorOfReservedMountPath(
1089 base::FilePath(mount_path_)));
1090 manager_.ReserveMountPath(base::FilePath(mount_path_),
1091 MOUNT_ERROR_UNKNOWN_FILESYSTEM);
Ben Chanf8692882011-08-21 10:15:30 -07001092 EXPECT_TRUE(manager_.IsMountPathReserved(mount_path_));
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001093 EXPECT_EQ(
1094 MOUNT_ERROR_UNKNOWN_FILESYSTEM,
1095 manager_.GetMountErrorOfReservedMountPath(base::FilePath(mount_path_)));
1096 manager_.UnreserveMountPath(base::FilePath(mount_path_));
Ben Chanf8692882011-08-21 10:15:30 -07001097 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001098 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.GetMountErrorOfReservedMountPath(
1099 base::FilePath(mount_path_)));
Ben Chanf8692882011-08-21 10:15:30 -07001100
1101 // Removing a nonexistent mount path should be ok
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001102 manager_.UnreserveMountPath(base::FilePath(mount_path_));
Ben Chanf8692882011-08-21 10:15:30 -07001103 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
1104
1105 // Adding an existent mount path should be ok
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001106 manager_.ReserveMountPath(base::FilePath(mount_path_),
1107 MOUNT_ERROR_UNSUPPORTED_FILESYSTEM);
Ben Chanf8692882011-08-21 10:15:30 -07001108 EXPECT_TRUE(manager_.IsMountPathReserved(mount_path_));
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001109 EXPECT_EQ(
1110 MOUNT_ERROR_UNSUPPORTED_FILESYSTEM,
1111 manager_.GetMountErrorOfReservedMountPath(base::FilePath(mount_path_)));
1112 manager_.ReserveMountPath(base::FilePath(mount_path_),
1113 MOUNT_ERROR_UNKNOWN_FILESYSTEM);
Ben Chanf8692882011-08-21 10:15:30 -07001114 EXPECT_TRUE(manager_.IsMountPathReserved(mount_path_));
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001115 EXPECT_EQ(
1116 MOUNT_ERROR_UNSUPPORTED_FILESYSTEM,
1117 manager_.GetMountErrorOfReservedMountPath(base::FilePath(mount_path_)));
1118 manager_.UnreserveMountPath(base::FilePath(mount_path_));
Ben Chanf8692882011-08-21 10:15:30 -07001119 EXPECT_FALSE(manager_.IsMountPathReserved(mount_path_));
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001120 EXPECT_EQ(MOUNT_ERROR_NONE, manager_.GetMountErrorOfReservedMountPath(
1121 base::FilePath(mount_path_)));
Ben Chanf8692882011-08-21 10:15:30 -07001122}
1123
Ben Chan8fb742b2014-04-28 23:46:57 -07001124// Verifies that MountManager::GetMountEntries() returns the expected list of
1125// mount entries under different scenarios.
1126TEST_F(MountManagerTest, GetMountEntries) {
Ben Chan7dfb8102017-10-17 15:47:37 -07001127 // No mount entry is returned.
Ben Chan213c6d92019-04-10 16:21:52 -07001128 std::vector<MountEntry> mount_entries = manager_.GetMountEntries();
Ben Chan8fb742b2014-04-28 23:46:57 -07001129 EXPECT_TRUE(mount_entries.empty());
1130
1131 // A normal mount entry is returned.
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001132 manager_.AddMountStateCache(kTestSourcePath, MakeMountPoint(kTestMountPath));
Ben Chan7dfb8102017-10-17 15:47:37 -07001133 mount_entries = manager_.GetMountEntries();
Ben Chan8fb742b2014-04-28 23:46:57 -07001134 ASSERT_EQ(1, mount_entries.size());
Ben Chan0214e302017-10-17 15:39:16 -07001135 EXPECT_EQ(MOUNT_ERROR_NONE, mount_entries[0].error_type);
1136 EXPECT_EQ(kTestSourcePath, mount_entries[0].source_path);
1137 EXPECT_EQ(MOUNT_SOURCE_REMOVABLE_DEVICE, mount_entries[0].source_type);
1138 EXPECT_EQ(kTestMountPath, mount_entries[0].mount_path);
Ben Chan8fb742b2014-04-28 23:46:57 -07001139
1140 // A reserved mount entry is returned.
Sergei Datsenko7e7c7642021-01-08 19:15:34 +11001141 manager_.ReserveMountPath(base::FilePath(kTestMountPath),
1142 MOUNT_ERROR_UNKNOWN_FILESYSTEM);
Ben Chan7dfb8102017-10-17 15:47:37 -07001143 mount_entries = manager_.GetMountEntries();
Ben Chan8fb742b2014-04-28 23:46:57 -07001144 ASSERT_EQ(1, mount_entries.size());
Ben Chan0214e302017-10-17 15:39:16 -07001145 EXPECT_EQ(MOUNT_ERROR_UNKNOWN_FILESYSTEM, mount_entries[0].error_type);
1146 EXPECT_EQ(kTestSourcePath, mount_entries[0].source_path);
1147 EXPECT_EQ(MOUNT_SOURCE_REMOVABLE_DEVICE, mount_entries[0].source_type);
1148 EXPECT_EQ(kTestMountPath, mount_entries[0].mount_path);
Ben Chan8fb742b2014-04-28 23:46:57 -07001149}
1150
Ben Chan9ed09e32011-11-22 16:24:06 -08001151// Verifies that MountManager::IsPathImmediateChildOfParent() correctly
1152// determines if a path is an immediate child of another path.
Ben Chan8dcede82011-07-25 20:56:13 -07001153TEST_F(MountManagerTest, IsPathImmediateChildOfParent) {
Anand K Mistry09f2db12019-11-07 17:06:56 +11001154 EXPECT_TRUE(manager_.IsPathImmediateChildOfParent(
1155 base::FilePath("/media/archive/test.zip"),
1156 base::FilePath("/media/archive")));
1157 EXPECT_TRUE(manager_.IsPathImmediateChildOfParent(
1158 base::FilePath("/media/archive/test.zip/"),
1159 base::FilePath("/media/archive")));
1160 EXPECT_TRUE(manager_.IsPathImmediateChildOfParent(
1161 base::FilePath("/media/archive/test.zip"),
1162 base::FilePath("/media/archive/")));
1163 EXPECT_TRUE(manager_.IsPathImmediateChildOfParent(
1164 base::FilePath("/media/archive/test.zip/"),
1165 base::FilePath("/media/archive/")));
Ben Chan8dcede82011-07-25 20:56:13 -07001166 EXPECT_FALSE(manager_.IsPathImmediateChildOfParent(
Anand K Mistry09f2db12019-11-07 17:06:56 +11001167 base::FilePath("/media/archive/test.zip/doc.zip"),
1168 base::FilePath("/media/archive/")));
1169 EXPECT_FALSE(manager_.IsPathImmediateChildOfParent(
1170 base::FilePath("/media/archive/test.zip"),
1171 base::FilePath("/media/removable")));
1172 EXPECT_FALSE(manager_.IsPathImmediateChildOfParent(
1173 base::FilePath("/tmp/archive/test.zip"),
1174 base::FilePath("/media/removable")));
1175 EXPECT_FALSE(manager_.IsPathImmediateChildOfParent(
1176 base::FilePath("/media"), base::FilePath("/media/removable")));
1177 EXPECT_FALSE(manager_.IsPathImmediateChildOfParent(
1178 base::FilePath("/media/removable"), base::FilePath("/media/removable")));
1179 EXPECT_FALSE(manager_.IsPathImmediateChildOfParent(
1180 base::FilePath("/media/removable/"), base::FilePath("/media/removable")));
1181 EXPECT_FALSE(manager_.IsPathImmediateChildOfParent(
1182 base::FilePath("/media/removable/."),
1183 base::FilePath("/media/removable")));
1184 EXPECT_FALSE(manager_.IsPathImmediateChildOfParent(
1185 base::FilePath("/media/removable/.."),
1186 base::FilePath("/media/removable")));
Ben Chan8dcede82011-07-25 20:56:13 -07001187}
1188
Ben Chanadc5d002014-03-12 15:02:26 -07001189// Verifies that MountManager::IsValidMountPath() correctly determines if a
1190// mount path is an immediate child of the mount root.
1191TEST_F(MountManagerTest, IsValidMountPath) {
Anand K Mistry09f2db12019-11-07 17:06:56 +11001192 EXPECT_TRUE(
1193 manager_.IsValidMountPath(base::FilePath("/media/removable/test")));
1194 EXPECT_TRUE(
1195 manager_.IsValidMountPath(base::FilePath("/media/removable/test/")));
1196 EXPECT_TRUE(
1197 manager_.IsValidMountPath(base::FilePath("/media/removable/test/")));
1198 EXPECT_TRUE(
1199 manager_.IsValidMountPath(base::FilePath("/media/removable//test")));
1200 EXPECT_FALSE(
1201 manager_.IsValidMountPath(base::FilePath("/media/archive/test")));
1202 EXPECT_FALSE(manager_.IsValidMountPath(base::FilePath("/media/removable")));
1203 EXPECT_FALSE(manager_.IsValidMountPath(base::FilePath("/media/removable/")));
1204 EXPECT_FALSE(manager_.IsValidMountPath(base::FilePath("/media/removable/.")));
1205 EXPECT_FALSE(
1206 manager_.IsValidMountPath(base::FilePath("/media/removable/..")));
1207 EXPECT_FALSE(
1208 manager_.IsValidMountPath(base::FilePath("/media/removable/test/doc")));
1209 EXPECT_FALSE(
1210 manager_.IsValidMountPath(base::FilePath("/media/removable/../test")));
1211 EXPECT_FALSE(
1212 manager_.IsValidMountPath(base::FilePath("/media/removable/../test/")));
1213 EXPECT_FALSE(
1214 manager_.IsValidMountPath(base::FilePath("/media/removable/test/..")));
1215 EXPECT_FALSE(
1216 manager_.IsValidMountPath(base::FilePath("/media/removable/test/../")));
Ben Chanadc5d002014-03-12 15:02:26 -07001217}
1218
Tatsuhisa Yamaguchib670bd12016-09-28 23:06:44 +09001219// Verifies that MountManager::Mount() returns an error when the source is
1220// not mounted yet but attempted to remount it.
1221TEST_F(MountManagerTest, RemountFailedNotMounted) {
1222 options_.push_back(kMountOptionRemount);
1223
Nigel Taoca7a4ef2021-05-14 11:44:25 +10001224 EXPECT_CALL(manager_, DoMount(_, _, _, _, _)).Times(0);
Tatsuhisa Yamaguchib670bd12016-09-28 23:06:44 +09001225
1226 // source_path = kTestSourcePath has not been mounted yet.
1227 EXPECT_EQ(MOUNT_ERROR_PATH_NOT_MOUNTED,
1228 manager_.Mount(kTestSourcePath, filesystem_type_, options_,
1229 &mount_path_));
1230}
1231
1232// Verifies that MountManager::Mount() returns no error when it successfully
1233// remounts a source path on a specified mount path.
1234TEST_F(MountManagerTest, RemountSucceededWithGivenSourcePath) {
Anand K Mistrye9a60fb2019-11-07 16:41:03 +11001235 // Mount a device in read-write mode.
Sergei Datsenko0ba12032021-01-07 08:51:14 +11001236 base::FilePath mount_path(kTestMountPath);
Anand K Mistrye9a60fb2019-11-07 16:41:03 +11001237 EXPECT_CALL(manager_, SuggestMountPath(_)).WillOnce(Return(kTestMountPath));
1238 EXPECT_CALL(platform_, CreateOrReuseEmptyDirectoryWithFallback(_, _, _))
1239 .WillOnce(Return(true));
Sergei Datsenko0ba12032021-01-07 08:51:14 +11001240
1241 auto ptr = std::make_unique<MountPoint>(
1242 MountPointData{
1243 .mount_path = mount_path,
1244 .source = kTestSourcePath,
1245 .flags = 0,
1246 },
1247 &platform_);
Anand K Mistrye9a60fb2019-11-07 16:41:03 +11001248 EXPECT_CALL(manager_,
Nigel Taoca7a4ef2021-05-14 11:44:25 +10001249 DoMount(kTestSourcePath, filesystem_type_, _, mount_path, _))
1250 .WillOnce(DoAll(SetArgPointee<4>(MOUNT_ERROR_NONE),
Sergei Datsenko0ba12032021-01-07 08:51:14 +11001251 Return(ByMove(std::move(ptr)))));
Anand K Mistrye9a60fb2019-11-07 16:41:03 +11001252 mount_path_ = "";
1253 EXPECT_EQ(MOUNT_ERROR_NONE,
1254 manager_.Mount(kTestSourcePath, filesystem_type_,
1255 {kMountOptionReadWrite}, &mount_path_));
1256 EXPECT_EQ(kTestMountPath, mount_path_);
1257 base::Optional<MountEntry> mount_entry;
1258 mount_entry = manager_.GetMountEntryForTest(kTestSourcePath);
1259 ASSERT_TRUE(mount_entry);
1260 EXPECT_FALSE(mount_entry->is_read_only);
1261 EXPECT_EQ(kTestMountPath, mount_entry->mount_path);
1262
1263 // Remount with read-only mount option.
Sergei Datsenko0ba12032021-01-07 08:51:14 +11001264 EXPECT_CALL(platform_, Mount(kTestSourcePath, kTestMountPath,
1265 filesystem_type_, MS_RDONLY | MS_REMOUNT, _))
1266 .WillOnce(Return(MOUNT_ERROR_NONE));
Tatsuhisa Yamaguchib670bd12016-09-28 23:06:44 +09001267 mount_path_ = "";
Sergei Datsenko0ba12032021-01-07 08:51:14 +11001268 EXPECT_EQ(MOUNT_ERROR_NONE,
1269 manager_.Mount(kTestSourcePath, filesystem_type_,
1270 {kMountOptionRemount, kMountOptionReadOnly},
1271 &mount_path_));
Tatsuhisa Yamaguchib670bd12016-09-28 23:06:44 +09001272 EXPECT_EQ(kTestMountPath, mount_path_);
1273 EXPECT_TRUE(manager_.IsMountPathInCache(mount_path_));
1274
Anand K Mistrye9a60fb2019-11-07 16:41:03 +11001275 mount_entry = manager_.GetMountEntryForTest(kTestSourcePath);
1276 EXPECT_TRUE(mount_entry);
1277 EXPECT_TRUE(mount_entry->is_read_only);
Tatsuhisa Yamaguchib670bd12016-09-28 23:06:44 +09001278
1279 // Should be unmounted correctly even after remount.
Sergei Datsenko0ba12032021-01-07 08:51:14 +11001280 EXPECT_CALL(platform_, Unmount(kTestMountPath, _))
1281 .WillOnce(Return(MOUNT_ERROR_NONE));
Tatsuhisa Yamaguchib670bd12016-09-28 23:06:44 +09001282 EXPECT_TRUE(manager_.UnmountAll());
1283 EXPECT_FALSE(manager_.IsMountPathInCache(kTestMountPath));
1284 EXPECT_FALSE(manager_.IsMountPathReserved(kTestMountPath));
1285}
1286
Ben Chan8dcede82011-07-25 20:56:13 -07001287} // namespace cros_disks