blob: 4d3df10aa52e77123ec4ae933aa0901c824dca33 [file] [log] [blame]
Mike Frysinger38ae98d2012-04-11 12:03:44 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Ben Chan29be9152011-07-25 14:39:48 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cros-disks/platform.h"
6
Ben Chan8dcede82011-07-25 20:56:13 -07007#include <sys/types.h>
8#include <unistd.h>
9
Ben Chancd8fda42014-09-05 08:21:06 -070010#include <base/files/file_util.h>
Ben Chan97f99ff2013-02-14 14:59:33 -080011#include <base/files/scoped_temp_dir.h>
Ben Chan29be9152011-07-25 14:39:48 -070012#include <gtest/gtest.h>
13
Ben Chan29be9152011-07-25 14:39:48 -070014namespace cros_disks {
15
16class PlatformTest : public ::testing::Test {
Ben Chan8dcede82011-07-25 20:56:13 -070017 public:
18 // Returns true if |path| is owned by |user_id| and |group_id|.
Ben Chan213c6d92019-04-10 16:21:52 -070019 static bool CheckOwnership(const std::string& path,
Ben Chande0e3f62017-09-26 06:28:39 -070020 uid_t user_id,
21 gid_t group_id) {
Ben Chan8dcede82011-07-25 20:56:13 -070022 struct stat buffer;
23 if (stat(path.c_str(), &buffer) != 0)
24 return false;
25 return buffer.st_uid == user_id && buffer.st_gid == group_id;
26 }
27
28 // Returns true if |path| has its permissions set to |mode|.
Ben Chan213c6d92019-04-10 16:21:52 -070029 static bool CheckPermissions(const std::string& path, mode_t mode) {
Ben Chan8dcede82011-07-25 20:56:13 -070030 struct stat buffer;
31 if (stat(path.c_str(), &buffer) != 0)
32 return false;
33 return (buffer.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) == mode;
34 }
35
Ben Chan29be9152011-07-25 14:39:48 -070036 protected:
37 Platform platform_;
38};
39
Ben Chanadc5d002014-03-12 15:02:26 -070040TEST_F(PlatformTest, GetRealPath) {
41 base::ScopedTempDir temp_dir;
42 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Ben Chan213c6d92019-04-10 16:21:52 -070043 base::FilePath subdir_path;
Ben Chanadc5d002014-03-12 15:02:26 -070044 ASSERT_TRUE(
Eric Caruso23d6fe02018-01-22 15:44:59 -080045 base::CreateTemporaryDirInDir(temp_dir.GetPath(), "test", &subdir_path));
Ben Chan213c6d92019-04-10 16:21:52 -070046 base::FilePath file_path;
Ben Chanadc5d002014-03-12 15:02:26 -070047 ASSERT_TRUE(base::CreateTemporaryFileInDir(subdir_path, &file_path));
Ben Chan213c6d92019-04-10 16:21:52 -070048 base::FilePath file_symlink = temp_dir.GetPath().Append("file_symlink");
Ben Chanadc5d002014-03-12 15:02:26 -070049 ASSERT_TRUE(base::CreateSymbolicLink(file_path, file_symlink));
Ben Chan213c6d92019-04-10 16:21:52 -070050 base::FilePath subdir_symlink = temp_dir.GetPath().Append("subdir_symlink");
Ben Chanadc5d002014-03-12 15:02:26 -070051 ASSERT_TRUE(base::CreateSymbolicLink(subdir_path, subdir_symlink));
52
Ben Chan213c6d92019-04-10 16:21:52 -070053 std::string real_path;
Ben Chanadc5d002014-03-12 15:02:26 -070054 EXPECT_FALSE(platform_.GetRealPath("", &real_path));
55 EXPECT_FALSE(platform_.GetRealPath("/nonexistent", &real_path));
56
Eric Caruso23d6fe02018-01-22 15:44:59 -080057 EXPECT_TRUE(platform_.GetRealPath(temp_dir.GetPath().value(), &real_path));
58 EXPECT_EQ(temp_dir.GetPath().value(), real_path);
Ben Chanadc5d002014-03-12 15:02:26 -070059
60 EXPECT_TRUE(platform_.GetRealPath(file_path.value(), &real_path));
61 EXPECT_EQ(file_path.value(), real_path);
62
63 EXPECT_TRUE(platform_.GetRealPath(file_symlink.value(), &real_path));
64 EXPECT_EQ(file_path.value(), real_path);
65
66 EXPECT_TRUE(platform_.GetRealPath(subdir_symlink.value(), &real_path));
67 EXPECT_EQ(subdir_path.value(), real_path);
68
Ben Chan213c6d92019-04-10 16:21:52 -070069 base::FilePath relative_path = subdir_path.Append("..");
Ben Chanadc5d002014-03-12 15:02:26 -070070 EXPECT_TRUE(platform_.GetRealPath(relative_path.value(), &real_path));
Eric Caruso23d6fe02018-01-22 15:44:59 -080071 EXPECT_EQ(temp_dir.GetPath().value(), real_path);
Ben Chanadc5d002014-03-12 15:02:26 -070072
73 relative_path = subdir_path.Append("..")
74 .Append(subdir_path.BaseName())
75 .Append(file_path.BaseName());
76 EXPECT_TRUE(platform_.GetRealPath(relative_path.value(), &real_path));
77 EXPECT_EQ(file_path.value(), real_path);
78
79 relative_path = subdir_path.Append("..")
80 .Append(subdir_symlink.BaseName())
81 .Append(file_path.BaseName());
82 EXPECT_TRUE(platform_.GetRealPath(relative_path.value(), &real_path));
83 EXPECT_EQ(file_path.value(), real_path);
84}
85
Ben Chan8dcede82011-07-25 20:56:13 -070086TEST_F(PlatformTest, CreateDirectory) {
Ben Chan97f99ff2013-02-14 14:59:33 -080087 base::ScopedTempDir temp_dir;
Ben Chan8dcede82011-07-25 20:56:13 -070088 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
89
90 // Nonexistent directory
Ben Chan213c6d92019-04-10 16:21:52 -070091 base::FilePath new_dir = temp_dir.GetPath().Append("test");
92 std::string path = new_dir.value();
Ben Chan8dcede82011-07-25 20:56:13 -070093 EXPECT_TRUE(platform_.CreateDirectory(path));
94
95 // Existent but empty directory
96 EXPECT_TRUE(platform_.CreateDirectory(path));
97
98 // Existent and non-empty directory
Ben Chan213c6d92019-04-10 16:21:52 -070099 base::FilePath temp_file;
Ben Chan97e20d42014-02-05 18:38:07 -0800100 ASSERT_TRUE(base::CreateTemporaryFileInDir(new_dir, &temp_file));
Ben Chan8dcede82011-07-25 20:56:13 -0700101 EXPECT_TRUE(platform_.CreateDirectory(path));
102}
103
Ben Chan29be9152011-07-25 14:39:48 -0700104TEST_F(PlatformTest, CreateOrReuseEmptyDirectory) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800105 base::ScopedTempDir temp_dir;
Ben Chan29be9152011-07-25 14:39:48 -0700106 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
107
108 // Nonexistent directory
Ben Chan213c6d92019-04-10 16:21:52 -0700109 base::FilePath new_dir = temp_dir.GetPath().Append("test");
110 std::string path = new_dir.value();
Ben Chan29be9152011-07-25 14:39:48 -0700111 EXPECT_TRUE(platform_.CreateOrReuseEmptyDirectory(path));
112
113 // Existent but empty directory
114 EXPECT_TRUE(platform_.CreateOrReuseEmptyDirectory(path));
115
116 // Existent and non-empty directory
Ben Chan213c6d92019-04-10 16:21:52 -0700117 base::FilePath temp_file;
Ben Chan97e20d42014-02-05 18:38:07 -0800118 ASSERT_TRUE(base::CreateTemporaryFileInDir(new_dir, &temp_file));
Ben Chan29be9152011-07-25 14:39:48 -0700119 EXPECT_FALSE(platform_.CreateOrReuseEmptyDirectory(path));
120}
121
122TEST_F(PlatformTest, CreateOrReuseEmptyDirectoryWithFallback) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800123 base::ScopedTempDir temp_dir;
Ben Chan29be9152011-07-25 14:39:48 -0700124 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Sergei Datsenko7e7c7642021-01-08 19:15:34 +1100125 std::unordered_set<std::string> reserved_paths;
Ben Chan29be9152011-07-25 14:39:48 -0700126
127 // Nonexistent directory
Ben Chan213c6d92019-04-10 16:21:52 -0700128 base::FilePath new_dir = temp_dir.GetPath().Append("test1");
129 std::string path = new_dir.value();
Ben Chanf8692882011-08-21 10:15:30 -0700130 EXPECT_TRUE(platform_.CreateOrReuseEmptyDirectoryWithFallback(
131 &path, 10, reserved_paths));
Ben Chan29be9152011-07-25 14:39:48 -0700132 EXPECT_EQ(new_dir.value(), path);
133
134 // Existent but empty directory
135 path = new_dir.value();
Ben Chanf8692882011-08-21 10:15:30 -0700136 EXPECT_TRUE(platform_.CreateOrReuseEmptyDirectoryWithFallback(
137 &path, 10, reserved_paths));
Ben Chan29be9152011-07-25 14:39:48 -0700138 EXPECT_EQ(new_dir.value(), path);
139
140 // Existent and non-empty directory
Ben Chan213c6d92019-04-10 16:21:52 -0700141 base::FilePath temp_file;
Ben Chan97e20d42014-02-05 18:38:07 -0800142 ASSERT_TRUE(base::CreateTemporaryFileInDir(new_dir, &temp_file));
Ben Chan29be9152011-07-25 14:39:48 -0700143 path = new_dir.value();
Ben Chanf8692882011-08-21 10:15:30 -0700144 EXPECT_FALSE(platform_.CreateOrReuseEmptyDirectoryWithFallback(
145 &path, 0, reserved_paths));
146 EXPECT_TRUE(platform_.CreateOrReuseEmptyDirectoryWithFallback(
147 &path, 1, reserved_paths));
Ben Chan213c6d92019-04-10 16:21:52 -0700148 base::FilePath new_dir1 = temp_dir.GetPath().Append("test1 (1)");
Ben Chan29be9152011-07-25 14:39:48 -0700149 EXPECT_EQ(new_dir1.value(), path);
150
Ben Chan97e20d42014-02-05 18:38:07 -0800151 ASSERT_TRUE(base::CreateTemporaryFileInDir(new_dir1, &temp_file));
Ben Chan29be9152011-07-25 14:39:48 -0700152 path = new_dir.value();
Ben Chanf8692882011-08-21 10:15:30 -0700153 EXPECT_FALSE(platform_.CreateOrReuseEmptyDirectoryWithFallback(
154 &path, 0, reserved_paths));
155 EXPECT_FALSE(platform_.CreateOrReuseEmptyDirectoryWithFallback(
156 &path, 1, reserved_paths));
157 EXPECT_TRUE(platform_.CreateOrReuseEmptyDirectoryWithFallback(
158 &path, 2, reserved_paths));
Ben Chan213c6d92019-04-10 16:21:52 -0700159 base::FilePath new_dir2 = temp_dir.GetPath().Append("test1 (2)");
Ben Chan29be9152011-07-25 14:39:48 -0700160 EXPECT_EQ(new_dir2.value(), path);
161}
162
Ben Chanf8692882011-08-21 10:15:30 -0700163TEST_F(PlatformTest, CreateOrReuseEmptyDirectoryWithFallbackAndReservedPaths) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800164 base::ScopedTempDir temp_dir;
Ben Chanf8692882011-08-21 10:15:30 -0700165 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Sergei Datsenko7e7c7642021-01-08 19:15:34 +1100166 std::unordered_set<std::string> reserved_paths;
Ben Chanf8692882011-08-21 10:15:30 -0700167
Ben Chan213c6d92019-04-10 16:21:52 -0700168 base::FilePath new_dir = temp_dir.GetPath().Append("test");
169 std::string path = new_dir.value();
Ben Chanf8692882011-08-21 10:15:30 -0700170 reserved_paths.insert(path);
171 EXPECT_FALSE(platform_.CreateOrReuseEmptyDirectoryWithFallback(
172 &path, 0, reserved_paths));
173 EXPECT_EQ(new_dir.value(), path);
174
Eric Caruso23d6fe02018-01-22 15:44:59 -0800175 reserved_paths.insert(temp_dir.GetPath().Append("test 1").value());
176 reserved_paths.insert(temp_dir.GetPath().Append("test 2").value());
Ben Chanf8692882011-08-21 10:15:30 -0700177 EXPECT_FALSE(platform_.CreateOrReuseEmptyDirectoryWithFallback(
178 &path, 2, reserved_paths));
179 EXPECT_EQ(new_dir.value(), path);
180
Ben Chan213c6d92019-04-10 16:21:52 -0700181 base::FilePath expected_dir = temp_dir.GetPath().Append("test 3");
Ben Chanf8692882011-08-21 10:15:30 -0700182 EXPECT_TRUE(platform_.CreateOrReuseEmptyDirectoryWithFallback(
183 &path, 3, reserved_paths));
184 EXPECT_EQ(expected_dir.value(), path);
185}
186
Sergei Datsenkobcd8e462018-04-20 15:44:56 +1000187TEST_F(PlatformTest, CreateTemporaryDirInDir) {
188 base::ScopedTempDir temp_dir;
189 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Ben Chan213c6d92019-04-10 16:21:52 -0700190 std::string dir = temp_dir.GetPath().value();
Sergei Datsenkobcd8e462018-04-20 15:44:56 +1000191
Ben Chan213c6d92019-04-10 16:21:52 -0700192 std::string path;
Sergei Datsenkobcd8e462018-04-20 15:44:56 +1000193 EXPECT_TRUE(platform_.CreateTemporaryDirInDir(dir, "foo", &path));
Ben Chan213c6d92019-04-10 16:21:52 -0700194 EXPECT_TRUE(base::DirectoryExists(base::FilePath(path)));
195 EXPECT_EQ(dir, base::FilePath(path).DirName().value());
196 base::FilePath foo1 = base::FilePath(path).BaseName();
Sergei Datsenkobcd8e462018-04-20 15:44:56 +1000197 EXPECT_EQ("foo", foo1.value().substr(0, 3));
198
199 EXPECT_TRUE(platform_.CreateTemporaryDirInDir(dir, "foo", &path));
Ben Chan213c6d92019-04-10 16:21:52 -0700200 EXPECT_TRUE(base::DirectoryExists(base::FilePath(path)));
201 EXPECT_EQ(dir, base::FilePath(path).DirName().value());
202 base::FilePath foo2 = base::FilePath(path).BaseName();
Sergei Datsenkobcd8e462018-04-20 15:44:56 +1000203 EXPECT_EQ("foo", foo2.value().substr(0, 3));
204
205 EXPECT_NE(foo1.value(), foo2.value());
206}
207
Ben Chanec4eaab2012-02-05 23:26:58 -0800208TEST_F(PlatformTest, GetDirectoryFallbackName) {
209 EXPECT_EQ("test 1", platform_.GetDirectoryFallbackName("test", 1));
210 EXPECT_EQ("test1 (1)", platform_.GetDirectoryFallbackName("test1", 1));
211}
212
Ben Chan1d5a8e72011-08-01 15:21:39 -0700213TEST_F(PlatformTest, GetGroupIdOfRoot) {
214 gid_t group_id;
215 EXPECT_TRUE(platform_.GetGroupId("root", &group_id));
216 EXPECT_EQ(0, group_id);
Ben Chan29be9152011-07-25 14:39:48 -0700217}
218
Ben Chan1d5a8e72011-08-01 15:21:39 -0700219TEST_F(PlatformTest, GetGroupIdOfNonExistentGroup) {
220 gid_t group_id;
221 EXPECT_FALSE(platform_.GetGroupId("nonexistent-group", &group_id));
222}
223
224TEST_F(PlatformTest, GetUserAndGroupIdOfRoot) {
225 uid_t user_id;
226 gid_t group_id;
227 EXPECT_TRUE(platform_.GetUserAndGroupId("root", &user_id, &group_id));
228 EXPECT_EQ(0, user_id);
229 EXPECT_EQ(0, group_id);
230}
231
232TEST_F(PlatformTest, GetUserAndGroupIdOfNonExistentUser) {
233 uid_t user_id;
234 gid_t group_id;
Ben Chande0e3f62017-09-26 06:28:39 -0700235 EXPECT_FALSE(
236 platform_.GetUserAndGroupId("nonexistent-user", &user_id, &group_id));
Ben Chan29be9152011-07-25 14:39:48 -0700237}
238
Ben Chanb1ac5a82011-08-02 17:53:55 -0700239TEST_F(PlatformTest, GetOwnershipOfDirectory) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800240 base::ScopedTempDir temp_dir;
Ben Chanb1ac5a82011-08-02 17:53:55 -0700241 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Ben Chan213c6d92019-04-10 16:21:52 -0700242 std::string path = temp_dir.GetPath().value();
Ben Chanb1ac5a82011-08-02 17:53:55 -0700243
244 uid_t user_id;
245 gid_t group_id;
246 EXPECT_TRUE(platform_.GetOwnership(path, &user_id, &group_id));
247 EXPECT_EQ(getuid(), user_id);
248 EXPECT_EQ(getgid(), group_id);
249}
250
251TEST_F(PlatformTest, GetOwnershipOfFile) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800252 base::ScopedTempDir temp_dir;
Ben Chanb1ac5a82011-08-02 17:53:55 -0700253 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Ben Chan213c6d92019-04-10 16:21:52 -0700254 base::FilePath temp_file;
Eric Caruso23d6fe02018-01-22 15:44:59 -0800255 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.GetPath(), &temp_file));
Ben Chan213c6d92019-04-10 16:21:52 -0700256 std::string path = temp_file.value();
Ben Chanb1ac5a82011-08-02 17:53:55 -0700257
258 uid_t user_id;
259 gid_t group_id;
260 EXPECT_TRUE(platform_.GetOwnership(path, &user_id, &group_id));
261 EXPECT_EQ(getuid(), user_id);
262 EXPECT_EQ(getgid(), group_id);
263}
264
265TEST_F(PlatformTest, GetOwnershipOfSymbolicLink) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800266 base::ScopedTempDir temp_dir;
Ben Chanb1ac5a82011-08-02 17:53:55 -0700267 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Ben Chan213c6d92019-04-10 16:21:52 -0700268 base::FilePath temp_file;
Eric Caruso23d6fe02018-01-22 15:44:59 -0800269 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.GetPath(), &temp_file));
Ben Chan213c6d92019-04-10 16:21:52 -0700270 std::string file_path = temp_file.value();
271 std::string symlink_path = file_path + "-symlink";
272 base::FilePath temp_symlink(symlink_path);
Ben Chan97e20d42014-02-05 18:38:07 -0800273 ASSERT_TRUE(base::CreateSymbolicLink(temp_file, temp_symlink));
Ben Chanb1ac5a82011-08-02 17:53:55 -0700274
275 uid_t user_id;
276 gid_t group_id;
277 EXPECT_TRUE(platform_.GetOwnership(symlink_path, &user_id, &group_id));
278 EXPECT_EQ(getuid(), user_id);
279 EXPECT_EQ(getgid(), group_id);
280}
281
282TEST_F(PlatformTest, GetOwnershipOfNonexistentPath) {
283 uid_t user_id;
284 gid_t group_id;
Ben Chande0e3f62017-09-26 06:28:39 -0700285 EXPECT_FALSE(
286 platform_.GetOwnership("/nonexistent-path", &user_id, &group_id));
Ben Chanb1ac5a82011-08-02 17:53:55 -0700287}
288
289TEST_F(PlatformTest, GetPermissionsOfDirectory) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800290 base::ScopedTempDir temp_dir;
Ben Chanb1ac5a82011-08-02 17:53:55 -0700291 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Ben Chan213c6d92019-04-10 16:21:52 -0700292 std::string path = temp_dir.GetPath().value();
Ben Chanb1ac5a82011-08-02 17:53:55 -0700293
294 mode_t mode = 0;
295 EXPECT_TRUE(platform_.GetPermissions(path, &mode));
296 mode_t expected_mode = (mode & ~S_IRWXG & ~S_IRWXO) | S_IRWXU;
297 EXPECT_TRUE(platform_.SetPermissions(path, expected_mode));
298 EXPECT_TRUE(platform_.GetPermissions(path, &mode));
299 EXPECT_EQ(expected_mode, mode);
300
301 mode = 0;
302 expected_mode |= S_IRWXG;
303 EXPECT_TRUE(platform_.SetPermissions(path, expected_mode));
304 EXPECT_TRUE(platform_.GetPermissions(path, &mode));
305 EXPECT_EQ(expected_mode, mode);
306}
307
308TEST_F(PlatformTest, GetPermissionsOfFile) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800309 base::ScopedTempDir temp_dir;
Ben Chanb1ac5a82011-08-02 17:53:55 -0700310 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Ben Chan213c6d92019-04-10 16:21:52 -0700311 base::FilePath temp_file;
Eric Caruso23d6fe02018-01-22 15:44:59 -0800312 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.GetPath(), &temp_file));
Ben Chan213c6d92019-04-10 16:21:52 -0700313 std::string path = temp_file.value();
Ben Chanb1ac5a82011-08-02 17:53:55 -0700314
315 mode_t mode = 0;
316 EXPECT_TRUE(platform_.GetPermissions(path, &mode));
317 mode_t expected_mode = (mode & ~S_IRWXG & ~S_IRWXO) | S_IRWXU;
318 EXPECT_TRUE(platform_.SetPermissions(path, expected_mode));
319 EXPECT_TRUE(platform_.GetPermissions(path, &mode));
320 EXPECT_EQ(expected_mode, mode);
321
322 mode = 0;
323 expected_mode |= S_IRWXG;
324 EXPECT_TRUE(platform_.SetPermissions(path, expected_mode));
325 EXPECT_TRUE(platform_.GetPermissions(path, &mode));
326 EXPECT_EQ(expected_mode, mode);
327}
328
329TEST_F(PlatformTest, GetPermissionsOfSymbolicLink) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800330 base::ScopedTempDir temp_dir;
Ben Chanb1ac5a82011-08-02 17:53:55 -0700331 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Ben Chan213c6d92019-04-10 16:21:52 -0700332 base::FilePath temp_file;
Eric Caruso23d6fe02018-01-22 15:44:59 -0800333 ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir.GetPath(), &temp_file));
Ben Chan213c6d92019-04-10 16:21:52 -0700334 std::string file_path = temp_file.value();
335 std::string symlink_path = file_path + "-symlink";
336 base::FilePath temp_symlink(symlink_path);
Ben Chan97e20d42014-02-05 18:38:07 -0800337 ASSERT_TRUE(base::CreateSymbolicLink(temp_file, temp_symlink));
Ben Chanb1ac5a82011-08-02 17:53:55 -0700338
339 mode_t mode = 0;
340 EXPECT_TRUE(platform_.GetPermissions(file_path, &mode));
341 mode_t expected_mode = (mode & ~S_IRWXG & ~S_IRWXO) | S_IRWXU;
342 EXPECT_TRUE(platform_.SetPermissions(file_path, expected_mode));
343 EXPECT_TRUE(platform_.GetPermissions(symlink_path, &mode));
344 EXPECT_EQ(expected_mode, mode);
345
346 mode = 0;
347 expected_mode |= S_IRWXG;
348 EXPECT_TRUE(platform_.SetPermissions(file_path, expected_mode));
349 EXPECT_TRUE(platform_.GetPermissions(symlink_path, &mode));
350 EXPECT_EQ(expected_mode, mode);
351}
352
353TEST_F(PlatformTest, GetPermissionsOfNonexistentPath) {
354 mode_t mode;
355 EXPECT_FALSE(platform_.GetPermissions("/nonexistent-path", &mode));
356}
357
Ben Chan29be9152011-07-25 14:39:48 -0700358TEST_F(PlatformTest, RemoveEmptyDirectory) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800359 base::ScopedTempDir temp_dir;
Ben Chan29be9152011-07-25 14:39:48 -0700360 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
361
362 // Nonexistent directory
Ben Chan213c6d92019-04-10 16:21:52 -0700363 base::FilePath new_dir = temp_dir.GetPath().Append("test");
364 std::string path = new_dir.value();
Ben Chan29be9152011-07-25 14:39:48 -0700365 EXPECT_FALSE(platform_.RemoveEmptyDirectory(path));
366
367 // Existent but empty directory
368 EXPECT_TRUE(platform_.CreateOrReuseEmptyDirectory(path));
369 EXPECT_TRUE(platform_.RemoveEmptyDirectory(path));
370
371 // Existent and non-empty directory
372 EXPECT_TRUE(platform_.CreateOrReuseEmptyDirectory(path));
Ben Chan213c6d92019-04-10 16:21:52 -0700373 base::FilePath temp_file;
Ben Chan97e20d42014-02-05 18:38:07 -0800374 ASSERT_TRUE(base::CreateTemporaryFileInDir(new_dir, &temp_file));
Ben Chan29be9152011-07-25 14:39:48 -0700375 EXPECT_FALSE(platform_.RemoveEmptyDirectory(path));
376}
377
Ben Chan93dec932011-08-03 12:57:49 -0700378TEST_F(PlatformTest, SetMountUserToRoot) {
379 EXPECT_TRUE(platform_.SetMountUser("root"));
380 EXPECT_EQ(0, platform_.mount_user_id());
381 EXPECT_EQ(0, platform_.mount_group_id());
Ben Chan98f8ae02011-10-04 16:34:34 -0700382 EXPECT_EQ("root", platform_.mount_user());
Ben Chan93dec932011-08-03 12:57:49 -0700383}
384
385TEST_F(PlatformTest, SetMountUserToNonexistentUser) {
386 uid_t user_id = platform_.mount_user_id();
387 gid_t group_id = platform_.mount_group_id();
Ben Chan213c6d92019-04-10 16:21:52 -0700388 std::string user = platform_.mount_user();
Ben Chan93dec932011-08-03 12:57:49 -0700389 EXPECT_FALSE(platform_.SetMountUser("nonexistent-user"));
390 EXPECT_EQ(user_id, platform_.mount_user_id());
391 EXPECT_EQ(group_id, platform_.mount_group_id());
Ben Chan98f8ae02011-10-04 16:34:34 -0700392 EXPECT_EQ(user, platform_.mount_user());
Ben Chan93dec932011-08-03 12:57:49 -0700393}
394
Ben Chan8dcede82011-07-25 20:56:13 -0700395TEST_F(PlatformTest, SetOwnershipOfNonExistentPath) {
396 EXPECT_FALSE(platform_.SetOwnership("/nonexistent-path", getuid(), getgid()));
397}
398
399TEST_F(PlatformTest, SetOwnershipOfExistentPath) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800400 base::ScopedTempDir temp_dir;
Ben Chan8dcede82011-07-25 20:56:13 -0700401 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Ben Chan213c6d92019-04-10 16:21:52 -0700402 std::string path = temp_dir.GetPath().value();
Ben Chan8dcede82011-07-25 20:56:13 -0700403
404 EXPECT_TRUE(platform_.SetOwnership(path, getuid(), getgid()));
405 EXPECT_TRUE(CheckOwnership(path, getuid(), getgid()));
406}
407
408TEST_F(PlatformTest, SetPermissionsOfNonExistentPath) {
409 EXPECT_FALSE(platform_.SetPermissions("/nonexistent-path", S_IRWXU));
410}
411
412TEST_F(PlatformTest, SetPermissionsOfExistentPath) {
Ben Chan97f99ff2013-02-14 14:59:33 -0800413 base::ScopedTempDir temp_dir;
Ben Chan8dcede82011-07-25 20:56:13 -0700414 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
Ben Chan213c6d92019-04-10 16:21:52 -0700415 std::string path = temp_dir.GetPath().value();
Ben Chan8dcede82011-07-25 20:56:13 -0700416
417 mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
418 EXPECT_TRUE(platform_.SetPermissions(path, mode));
419 EXPECT_TRUE(CheckPermissions(path, mode));
420
421 mode = S_IRWXU | S_IRGRP | S_IXGRP;
422 EXPECT_TRUE(platform_.SetPermissions(path, mode));
423 EXPECT_TRUE(CheckPermissions(path, mode));
424
425 mode = S_IRWXU;
426 EXPECT_TRUE(platform_.SetPermissions(path, mode));
427 EXPECT_TRUE(CheckPermissions(path, mode));
428}
429
Ben Chan29be9152011-07-25 14:39:48 -0700430} // namespace cros_disks