1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/files/file_util.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker #include <stdio.h>
10*6777b538SAndroid Build Coastguard Worker
11*6777b538SAndroid Build Coastguard Worker #include <algorithm>
12*6777b538SAndroid Build Coastguard Worker #include <fstream>
13*6777b538SAndroid Build Coastguard Worker #include <initializer_list>
14*6777b538SAndroid Build Coastguard Worker #include <memory>
15*6777b538SAndroid Build Coastguard Worker #include <set>
16*6777b538SAndroid Build Coastguard Worker #include <utility>
17*6777b538SAndroid Build Coastguard Worker #include <vector>
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker #include "base/base_paths.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/command_line.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/environment.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/features.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/files/file.h"
24*6777b538SAndroid Build Coastguard Worker #include "base/files/file_enumerator.h"
25*6777b538SAndroid Build Coastguard Worker #include "base/files/file_path.h"
26*6777b538SAndroid Build Coastguard Worker #include "base/files/platform_file.h"
27*6777b538SAndroid Build Coastguard Worker #include "base/files/scoped_file.h"
28*6777b538SAndroid Build Coastguard Worker #include "base/files/scoped_temp_dir.h"
29*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
30*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_helpers.h"
31*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
32*6777b538SAndroid Build Coastguard Worker #include "base/path_service.h"
33*6777b538SAndroid Build Coastguard Worker #include "base/rand_util.h"
34*6777b538SAndroid Build Coastguard Worker #include "base/scoped_environment_variable_override.h"
35*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
36*6777b538SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
37*6777b538SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
38*6777b538SAndroid Build Coastguard Worker #include "base/test/bind.h"
39*6777b538SAndroid Build Coastguard Worker #include "base/test/multiprocess_test.h"
40*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_feature_list.h"
41*6777b538SAndroid Build Coastguard Worker #include "base/test/task_environment.h"
42*6777b538SAndroid Build Coastguard Worker #include "base/test/test_file_util.h"
43*6777b538SAndroid Build Coastguard Worker #include "base/test/test_timeouts.h"
44*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
45*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread.h"
46*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
47*6777b538SAndroid Build Coastguard Worker #include "base/uuid.h"
48*6777b538SAndroid Build Coastguard Worker #include "build/branding_buildflags.h"
49*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
50*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
51*6777b538SAndroid Build Coastguard Worker #include "testing/multiprocess_func_list.h"
52*6777b538SAndroid Build Coastguard Worker #include "testing/platform_test.h"
53*6777b538SAndroid Build Coastguard Worker
54*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
55*6777b538SAndroid Build Coastguard Worker #include <tchar.h>
56*6777b538SAndroid Build Coastguard Worker #include <windows.h>
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker #include <shellapi.h>
59*6777b538SAndroid Build Coastguard Worker #include <shlobj.h>
60*6777b538SAndroid Build Coastguard Worker
61*6777b538SAndroid Build Coastguard Worker #include "base/scoped_native_library.h"
62*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
63*6777b538SAndroid Build Coastguard Worker #include "base/test/file_path_reparse_point_win.h"
64*6777b538SAndroid Build Coastguard Worker #include "base/test/gtest_util.h"
65*6777b538SAndroid Build Coastguard Worker #include "base/win/scoped_handle.h"
66*6777b538SAndroid Build Coastguard Worker #include "base/win/win_util.h"
67*6777b538SAndroid Build Coastguard Worker #endif
68*6777b538SAndroid Build Coastguard Worker
69*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
70*6777b538SAndroid Build Coastguard Worker #include <errno.h>
71*6777b538SAndroid Build Coastguard Worker #include <fcntl.h>
72*6777b538SAndroid Build Coastguard Worker #include <sys/ioctl.h>
73*6777b538SAndroid Build Coastguard Worker #include <sys/types.h>
74*6777b538SAndroid Build Coastguard Worker #include <unistd.h>
75*6777b538SAndroid Build Coastguard Worker #endif
76*6777b538SAndroid Build Coastguard Worker
77*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
78*6777b538SAndroid Build Coastguard Worker #include <sys/socket.h>
79*6777b538SAndroid Build Coastguard Worker #endif
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
82*6777b538SAndroid Build Coastguard Worker #include <linux/fs.h>
83*6777b538SAndroid Build Coastguard Worker #endif
84*6777b538SAndroid Build Coastguard Worker
85*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
86*6777b538SAndroid Build Coastguard Worker #include "base/android/content_uri_utils.h"
87*6777b538SAndroid Build Coastguard Worker #endif
88*6777b538SAndroid Build Coastguard Worker
89*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
90*6777b538SAndroid Build Coastguard Worker #include "base/test/scoped_dev_zero_fuchsia.h"
91*6777b538SAndroid Build Coastguard Worker #endif
92*6777b538SAndroid Build Coastguard Worker
93*6777b538SAndroid Build Coastguard Worker // This macro helps avoid wrapped lines in the test structs.
94*6777b538SAndroid Build Coastguard Worker #define FPL(x) FILE_PATH_LITERAL(x)
95*6777b538SAndroid Build Coastguard Worker
96*6777b538SAndroid Build Coastguard Worker namespace base {
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Worker namespace {
99*6777b538SAndroid Build Coastguard Worker
100*6777b538SAndroid Build Coastguard Worker const size_t kLargeFileSize = (1 << 16) + 3;
101*6777b538SAndroid Build Coastguard Worker
102*6777b538SAndroid Build Coastguard Worker enum class CreateSymbolicLinkResult {
103*6777b538SAndroid Build Coastguard Worker // The symbolic link creation failed because the platform does not support it.
104*6777b538SAndroid Build Coastguard Worker // On Windows, that may be due to the lack of the required privilege.
105*6777b538SAndroid Build Coastguard Worker kUnsupported = -1,
106*6777b538SAndroid Build Coastguard Worker
107*6777b538SAndroid Build Coastguard Worker // The symbolic link creation failed.
108*6777b538SAndroid Build Coastguard Worker kFailed,
109*6777b538SAndroid Build Coastguard Worker
110*6777b538SAndroid Build Coastguard Worker // The symbolic link was created successfully.
111*6777b538SAndroid Build Coastguard Worker kSucceeded,
112*6777b538SAndroid Build Coastguard Worker };
113*6777b538SAndroid Build Coastguard Worker
114*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
115*6777b538SAndroid Build Coastguard Worker // Method that wraps the win32 GetShortPathName API. Returns an empty path on
116*6777b538SAndroid Build Coastguard Worker // error.
MakeShortFilePath(const FilePath & input)117*6777b538SAndroid Build Coastguard Worker FilePath MakeShortFilePath(const FilePath& input) {
118*6777b538SAndroid Build Coastguard Worker DWORD path_short_len = ::GetShortPathName(input.value().c_str(), nullptr, 0);
119*6777b538SAndroid Build Coastguard Worker if (path_short_len == 0UL)
120*6777b538SAndroid Build Coastguard Worker return FilePath();
121*6777b538SAndroid Build Coastguard Worker
122*6777b538SAndroid Build Coastguard Worker std::wstring path_short_str;
123*6777b538SAndroid Build Coastguard Worker path_short_len = ::GetShortPathName(
124*6777b538SAndroid Build Coastguard Worker input.value().c_str(), WriteInto(&path_short_str, path_short_len),
125*6777b538SAndroid Build Coastguard Worker path_short_len);
126*6777b538SAndroid Build Coastguard Worker if (path_short_len == 0UL)
127*6777b538SAndroid Build Coastguard Worker return FilePath();
128*6777b538SAndroid Build Coastguard Worker
129*6777b538SAndroid Build Coastguard Worker return FilePath(path_short_str);
130*6777b538SAndroid Build Coastguard Worker }
131*6777b538SAndroid Build Coastguard Worker
CreateWinSymbolicLink(const FilePath & target,const FilePath & symlink)132*6777b538SAndroid Build Coastguard Worker CreateSymbolicLinkResult CreateWinSymbolicLink(const FilePath& target,
133*6777b538SAndroid Build Coastguard Worker const FilePath& symlink) {
134*6777b538SAndroid Build Coastguard Worker // Determine whether the target is a directory. This is necessary because
135*6777b538SAndroid Build Coastguard Worker // creating a symbolic link requires different flags depending on the type
136*6777b538SAndroid Build Coastguard Worker // of the target (file vs. directory).
137*6777b538SAndroid Build Coastguard Worker DWORD attrs = GetFileAttributes(target.value().c_str());
138*6777b538SAndroid Build Coastguard Worker if (attrs == INVALID_FILE_ATTRIBUTES) {
139*6777b538SAndroid Build Coastguard Worker // Unable to retrieve attributes for the target. It might not exist, or
140*6777b538SAndroid Build Coastguard Worker // there may be a permissions issue. Either way, we cannot proceed.
141*6777b538SAndroid Build Coastguard Worker return CreateSymbolicLinkResult::kFailed;
142*6777b538SAndroid Build Coastguard Worker }
143*6777b538SAndroid Build Coastguard Worker
144*6777b538SAndroid Build Coastguard Worker DWORD flags =
145*6777b538SAndroid Build Coastguard Worker attrs & FILE_ATTRIBUTE_DIRECTORY ? SYMBOLIC_LINK_FLAG_DIRECTORY : 0;
146*6777b538SAndroid Build Coastguard Worker
147*6777b538SAndroid Build Coastguard Worker if (!::CreateSymbolicLink(
148*6777b538SAndroid Build Coastguard Worker symlink.value().c_str(), target.value().c_str(),
149*6777b538SAndroid Build Coastguard Worker flags | SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE)) {
150*6777b538SAndroid Build Coastguard Worker if (::GetLastError() == ERROR_PRIVILEGE_NOT_HELD) {
151*6777b538SAndroid Build Coastguard Worker return CreateSymbolicLinkResult::kUnsupported;
152*6777b538SAndroid Build Coastguard Worker }
153*6777b538SAndroid Build Coastguard Worker return CreateSymbolicLinkResult::kFailed;
154*6777b538SAndroid Build Coastguard Worker }
155*6777b538SAndroid Build Coastguard Worker
156*6777b538SAndroid Build Coastguard Worker return CreateSymbolicLinkResult::kSucceeded;
157*6777b538SAndroid Build Coastguard Worker }
158*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
159*6777b538SAndroid Build Coastguard Worker
160*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_POSIX)
161*6777b538SAndroid Build Coastguard Worker
CreateSymbolicLinkForTesting(const FilePath & target,const FilePath & symlink)162*6777b538SAndroid Build Coastguard Worker CreateSymbolicLinkResult CreateSymbolicLinkForTesting(const FilePath& target,
163*6777b538SAndroid Build Coastguard Worker const FilePath& symlink) {
164*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
165*6777b538SAndroid Build Coastguard Worker return CreateWinSymbolicLink(target, symlink);
166*6777b538SAndroid Build Coastguard Worker #else
167*6777b538SAndroid Build Coastguard Worker if (!CreateSymbolicLink(target, symlink)) {
168*6777b538SAndroid Build Coastguard Worker return CreateSymbolicLinkResult::kFailed;
169*6777b538SAndroid Build Coastguard Worker }
170*6777b538SAndroid Build Coastguard Worker return CreateSymbolicLinkResult::kSucceeded;
171*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
172*6777b538SAndroid Build Coastguard Worker }
173*6777b538SAndroid Build Coastguard Worker
174*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_POSIX)
175*6777b538SAndroid Build Coastguard Worker
176*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_MAC)
177*6777b538SAndroid Build Coastguard Worker // Provide a simple way to change the permissions bits on |path| in tests.
178*6777b538SAndroid Build Coastguard Worker // ASSERT failures will return, but not stop the test. Caller should wrap
179*6777b538SAndroid Build Coastguard Worker // calls to this function in ASSERT_NO_FATAL_FAILURE().
ChangePosixFilePermissions(const FilePath & path,int mode_bits_to_set,int mode_bits_to_clear)180*6777b538SAndroid Build Coastguard Worker void ChangePosixFilePermissions(const FilePath& path,
181*6777b538SAndroid Build Coastguard Worker int mode_bits_to_set,
182*6777b538SAndroid Build Coastguard Worker int mode_bits_to_clear) {
183*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(mode_bits_to_set & mode_bits_to_clear)
184*6777b538SAndroid Build Coastguard Worker << "Can't set and clear the same bits.";
185*6777b538SAndroid Build Coastguard Worker
186*6777b538SAndroid Build Coastguard Worker int mode = 0;
187*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(path, &mode));
188*6777b538SAndroid Build Coastguard Worker mode |= mode_bits_to_set;
189*6777b538SAndroid Build Coastguard Worker mode &= ~mode_bits_to_clear;
190*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetPosixFilePermissions(path, mode));
191*6777b538SAndroid Build Coastguard Worker }
192*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_MAC)
193*6777b538SAndroid Build Coastguard Worker
194*6777b538SAndroid Build Coastguard Worker // Fuchsia doesn't support file permissions.
195*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_FUCHSIA)
196*6777b538SAndroid Build Coastguard Worker // Sets the source file to read-only.
SetReadOnly(const FilePath & path,bool read_only)197*6777b538SAndroid Build Coastguard Worker void SetReadOnly(const FilePath& path, bool read_only) {
198*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
199*6777b538SAndroid Build Coastguard Worker // On Windows, it involves setting/removing the 'readonly' bit.
200*6777b538SAndroid Build Coastguard Worker DWORD attrs = GetFileAttributes(path.value().c_str());
201*6777b538SAndroid Build Coastguard Worker ASSERT_NE(INVALID_FILE_ATTRIBUTES, attrs);
202*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetFileAttributes(
203*6777b538SAndroid Build Coastguard Worker path.value().c_str(), read_only ? (attrs | FILE_ATTRIBUTE_READONLY)
204*6777b538SAndroid Build Coastguard Worker : (attrs & ~FILE_ATTRIBUTE_READONLY)));
205*6777b538SAndroid Build Coastguard Worker
206*6777b538SAndroid Build Coastguard Worker DWORD expected =
207*6777b538SAndroid Build Coastguard Worker read_only
208*6777b538SAndroid Build Coastguard Worker ? ((attrs & (FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_DIRECTORY)) |
209*6777b538SAndroid Build Coastguard Worker FILE_ATTRIBUTE_READONLY)
210*6777b538SAndroid Build Coastguard Worker : (attrs & (FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_DIRECTORY));
211*6777b538SAndroid Build Coastguard Worker
212*6777b538SAndroid Build Coastguard Worker // Ignore FILE_ATTRIBUTE_NOT_CONTENT_INDEXED and FILE_ATTRIBUTE_COMPRESSED
213*6777b538SAndroid Build Coastguard Worker // if present. These flags are set by the operating system, depending on
214*6777b538SAndroid Build Coastguard Worker // local configurations, such as compressing the file system. Not filtering
215*6777b538SAndroid Build Coastguard Worker // out these flags could cause tests to fail even though they should pass.
216*6777b538SAndroid Build Coastguard Worker attrs = GetFileAttributes(path.value().c_str()) &
217*6777b538SAndroid Build Coastguard Worker ~(FILE_ATTRIBUTE_NOT_CONTENT_INDEXED | FILE_ATTRIBUTE_COMPRESSED);
218*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(expected, attrs);
219*6777b538SAndroid Build Coastguard Worker #else
220*6777b538SAndroid Build Coastguard Worker // On all other platforms, it involves removing/setting the write bit.
221*6777b538SAndroid Build Coastguard Worker mode_t mode = read_only ? S_IRUSR : (S_IRUSR | S_IWUSR);
222*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SetPosixFilePermissions(
223*6777b538SAndroid Build Coastguard Worker path, DirectoryExists(path) ? (mode | S_IXUSR) : mode));
224*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
225*6777b538SAndroid Build Coastguard Worker }
226*6777b538SAndroid Build Coastguard Worker
IsReadOnly(const FilePath & path)227*6777b538SAndroid Build Coastguard Worker bool IsReadOnly(const FilePath& path) {
228*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
229*6777b538SAndroid Build Coastguard Worker DWORD attrs = GetFileAttributes(path.value().c_str());
230*6777b538SAndroid Build Coastguard Worker EXPECT_NE(INVALID_FILE_ATTRIBUTES, attrs);
231*6777b538SAndroid Build Coastguard Worker return attrs & FILE_ATTRIBUTE_READONLY;
232*6777b538SAndroid Build Coastguard Worker #else
233*6777b538SAndroid Build Coastguard Worker int mode = 0;
234*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GetPosixFilePermissions(path, &mode));
235*6777b538SAndroid Build Coastguard Worker return !(mode & S_IWUSR);
236*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
237*6777b538SAndroid Build Coastguard Worker }
238*6777b538SAndroid Build Coastguard Worker
239*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_FUCHSIA)
240*6777b538SAndroid Build Coastguard Worker
241*6777b538SAndroid Build Coastguard Worker const wchar_t bogus_content[] = L"I'm cannon fodder.";
242*6777b538SAndroid Build Coastguard Worker
243*6777b538SAndroid Build Coastguard Worker const int FILES_AND_DIRECTORIES =
244*6777b538SAndroid Build Coastguard Worker FileEnumerator::FILES | FileEnumerator::DIRECTORIES;
245*6777b538SAndroid Build Coastguard Worker
246*6777b538SAndroid Build Coastguard Worker // file_util winds up using autoreleased objects on the Mac, so this needs
247*6777b538SAndroid Build Coastguard Worker // to be a PlatformTest
248*6777b538SAndroid Build Coastguard Worker class FileUtilTest : public PlatformTest {
249*6777b538SAndroid Build Coastguard Worker protected:
SetUp()250*6777b538SAndroid Build Coastguard Worker void SetUp() override {
251*6777b538SAndroid Build Coastguard Worker PlatformTest::SetUp();
252*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
253*6777b538SAndroid Build Coastguard Worker }
254*6777b538SAndroid Build Coastguard Worker
255*6777b538SAndroid Build Coastguard Worker ScopedTempDir temp_dir_;
256*6777b538SAndroid Build Coastguard Worker };
257*6777b538SAndroid Build Coastguard Worker
258*6777b538SAndroid Build Coastguard Worker // Collects all the results from the given file enumerator, and provides an
259*6777b538SAndroid Build Coastguard Worker // interface to query whether a given file is present.
260*6777b538SAndroid Build Coastguard Worker class FindResultCollector {
261*6777b538SAndroid Build Coastguard Worker public:
FindResultCollector(FileEnumerator * enumerator)262*6777b538SAndroid Build Coastguard Worker explicit FindResultCollector(FileEnumerator* enumerator) {
263*6777b538SAndroid Build Coastguard Worker FilePath cur_file;
264*6777b538SAndroid Build Coastguard Worker while (!(cur_file = enumerator->Next()).value().empty()) {
265*6777b538SAndroid Build Coastguard Worker FilePath::StringType path = cur_file.value();
266*6777b538SAndroid Build Coastguard Worker // The file should not be returned twice.
267*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(files_.end() == files_.find(path))
268*6777b538SAndroid Build Coastguard Worker << "Same file returned twice";
269*6777b538SAndroid Build Coastguard Worker
270*6777b538SAndroid Build Coastguard Worker // Save for later.
271*6777b538SAndroid Build Coastguard Worker files_.insert(path);
272*6777b538SAndroid Build Coastguard Worker }
273*6777b538SAndroid Build Coastguard Worker }
274*6777b538SAndroid Build Coastguard Worker
275*6777b538SAndroid Build Coastguard Worker // Returns true if the enumerator found the file.
HasFile(const FilePath & file) const276*6777b538SAndroid Build Coastguard Worker bool HasFile(const FilePath& file) const {
277*6777b538SAndroid Build Coastguard Worker return files_.find(file.value()) != files_.end();
278*6777b538SAndroid Build Coastguard Worker }
279*6777b538SAndroid Build Coastguard Worker
size()280*6777b538SAndroid Build Coastguard Worker int size() {
281*6777b538SAndroid Build Coastguard Worker return static_cast<int>(files_.size());
282*6777b538SAndroid Build Coastguard Worker }
283*6777b538SAndroid Build Coastguard Worker
284*6777b538SAndroid Build Coastguard Worker private:
285*6777b538SAndroid Build Coastguard Worker std::set<FilePath::StringType> files_;
286*6777b538SAndroid Build Coastguard Worker };
287*6777b538SAndroid Build Coastguard Worker
288*6777b538SAndroid Build Coastguard Worker // Simple function to dump some text into a new file.
CreateTextFile(const FilePath & filename,const std::wstring & contents)289*6777b538SAndroid Build Coastguard Worker void CreateTextFile(const FilePath& filename,
290*6777b538SAndroid Build Coastguard Worker const std::wstring& contents) {
291*6777b538SAndroid Build Coastguard Worker std::wofstream file;
292*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
293*6777b538SAndroid Build Coastguard Worker file.open(filename.value().c_str());
294*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
295*6777b538SAndroid Build Coastguard Worker file.open(filename.value());
296*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
297*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(file.is_open());
298*6777b538SAndroid Build Coastguard Worker file << contents;
299*6777b538SAndroid Build Coastguard Worker file.close();
300*6777b538SAndroid Build Coastguard Worker }
301*6777b538SAndroid Build Coastguard Worker
302*6777b538SAndroid Build Coastguard Worker // Simple function to take out some text from a file.
ReadTextFile(const FilePath & filename)303*6777b538SAndroid Build Coastguard Worker std::wstring ReadTextFile(const FilePath& filename) {
304*6777b538SAndroid Build Coastguard Worker wchar_t contents[64];
305*6777b538SAndroid Build Coastguard Worker std::wifstream file;
306*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
307*6777b538SAndroid Build Coastguard Worker file.open(filename.value().c_str());
308*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
309*6777b538SAndroid Build Coastguard Worker file.open(filename.value());
310*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
311*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(file.is_open());
312*6777b538SAndroid Build Coastguard Worker file.getline(contents, std::size(contents));
313*6777b538SAndroid Build Coastguard Worker file.close();
314*6777b538SAndroid Build Coastguard Worker return std::wstring(contents);
315*6777b538SAndroid Build Coastguard Worker }
316*6777b538SAndroid Build Coastguard Worker
317*6777b538SAndroid Build Coastguard Worker // Sets |is_inheritable| to indicate whether or not |stream| is set up to be
318*6777b538SAndroid Build Coastguard Worker // inerhited into child processes (i.e., HANDLE_FLAG_INHERIT is set on the
319*6777b538SAndroid Build Coastguard Worker // underlying handle on Windows, or FD_CLOEXEC is not set on the underlying file
320*6777b538SAndroid Build Coastguard Worker // descriptor on POSIX). Calls to this function must be wrapped with
321*6777b538SAndroid Build Coastguard Worker // ASSERT_NO_FATAL_FAILURE to properly abort tests in case of fatal failure.
GetIsInheritable(FILE * stream,bool * is_inheritable)322*6777b538SAndroid Build Coastguard Worker void GetIsInheritable(FILE* stream, bool* is_inheritable) {
323*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
324*6777b538SAndroid Build Coastguard Worker HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(stream)));
325*6777b538SAndroid Build Coastguard Worker ASSERT_NE(INVALID_HANDLE_VALUE, handle);
326*6777b538SAndroid Build Coastguard Worker
327*6777b538SAndroid Build Coastguard Worker DWORD info = 0;
328*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(TRUE, ::GetHandleInformation(handle, &info));
329*6777b538SAndroid Build Coastguard Worker *is_inheritable = ((info & HANDLE_FLAG_INHERIT) != 0);
330*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
331*6777b538SAndroid Build Coastguard Worker int fd = fileno(stream);
332*6777b538SAndroid Build Coastguard Worker ASSERT_NE(-1, fd);
333*6777b538SAndroid Build Coastguard Worker int flags = fcntl(fd, F_GETFD, 0);
334*6777b538SAndroid Build Coastguard Worker ASSERT_NE(-1, flags);
335*6777b538SAndroid Build Coastguard Worker *is_inheritable = ((flags & FD_CLOEXEC) == 0);
336*6777b538SAndroid Build Coastguard Worker #else
337*6777b538SAndroid Build Coastguard Worker #error Not implemented
338*6777b538SAndroid Build Coastguard Worker #endif
339*6777b538SAndroid Build Coastguard Worker }
340*6777b538SAndroid Build Coastguard Worker
341*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX)
342*6777b538SAndroid Build Coastguard Worker class ScopedWorkingDirectory {
343*6777b538SAndroid Build Coastguard Worker public:
ScopedWorkingDirectory(const FilePath & new_working_dir)344*6777b538SAndroid Build Coastguard Worker explicit ScopedWorkingDirectory(const FilePath& new_working_dir) {
345*6777b538SAndroid Build Coastguard Worker CHECK(base::GetCurrentDirectory(&original_working_directory_));
346*6777b538SAndroid Build Coastguard Worker CHECK(base::SetCurrentDirectory(new_working_dir));
347*6777b538SAndroid Build Coastguard Worker }
348*6777b538SAndroid Build Coastguard Worker
~ScopedWorkingDirectory()349*6777b538SAndroid Build Coastguard Worker ~ScopedWorkingDirectory() {
350*6777b538SAndroid Build Coastguard Worker CHECK(base::SetCurrentDirectory(original_working_directory_));
351*6777b538SAndroid Build Coastguard Worker }
352*6777b538SAndroid Build Coastguard Worker
353*6777b538SAndroid Build Coastguard Worker private:
354*6777b538SAndroid Build Coastguard Worker base::FilePath original_working_directory_;
355*6777b538SAndroid Build Coastguard Worker };
356*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,MakeAbsoluteFilePathNoResolveSymbolicLinks)357*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MakeAbsoluteFilePathNoResolveSymbolicLinks) {
358*6777b538SAndroid Build Coastguard Worker FilePath cwd;
359*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetCurrentDirectory(&cwd));
360*6777b538SAndroid Build Coastguard Worker const std::pair<FilePath, std::optional<FilePath>> kExpectedResults[]{
361*6777b538SAndroid Build Coastguard Worker {FilePath(), std::nullopt},
362*6777b538SAndroid Build Coastguard Worker {FilePath("."), cwd},
363*6777b538SAndroid Build Coastguard Worker {FilePath(".."), cwd.DirName()},
364*6777b538SAndroid Build Coastguard Worker {FilePath("a/.."), cwd},
365*6777b538SAndroid Build Coastguard Worker {FilePath("a/b/.."), cwd.Append(FPL("a"))},
366*6777b538SAndroid Build Coastguard Worker {FilePath("/tmp/../.."), FilePath("/")},
367*6777b538SAndroid Build Coastguard Worker {FilePath("/tmp/../"), FilePath("/")},
368*6777b538SAndroid Build Coastguard Worker {FilePath("/tmp/a/b/../c/../.."), FilePath("/tmp")},
369*6777b538SAndroid Build Coastguard Worker {FilePath("/././tmp/./a/./b/../c/./../.."), FilePath("/tmp")},
370*6777b538SAndroid Build Coastguard Worker {FilePath("/.././../tmp"), FilePath("/tmp")},
371*6777b538SAndroid Build Coastguard Worker {FilePath("/..///.////..////tmp"), FilePath("/tmp")},
372*6777b538SAndroid Build Coastguard Worker {FilePath("//..///.////..////tmp"), FilePath("//tmp")},
373*6777b538SAndroid Build Coastguard Worker {FilePath("///..///.////..////tmp"), FilePath("/tmp")},
374*6777b538SAndroid Build Coastguard Worker };
375*6777b538SAndroid Build Coastguard Worker
376*6777b538SAndroid Build Coastguard Worker for (auto& expected_result : kExpectedResults) {
377*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(MakeAbsoluteFilePathNoResolveSymbolicLinks(expected_result.first),
378*6777b538SAndroid Build Coastguard Worker expected_result.second);
379*6777b538SAndroid Build Coastguard Worker }
380*6777b538SAndroid Build Coastguard Worker
381*6777b538SAndroid Build Coastguard Worker // Test that MakeAbsoluteFilePathNoResolveSymbolicLinks() returns an empty
382*6777b538SAndroid Build Coastguard Worker // path if GetCurrentDirectory() fails.
383*6777b538SAndroid Build Coastguard Worker const FilePath temp_dir_path = temp_dir_.GetPath();
384*6777b538SAndroid Build Coastguard Worker ScopedWorkingDirectory scoped_cwd(temp_dir_path);
385*6777b538SAndroid Build Coastguard Worker // Delete the cwd so that GetCurrentDirectory() fails.
386*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(temp_dir_.Delete());
387*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(
388*6777b538SAndroid Build Coastguard Worker MakeAbsoluteFilePathNoResolveSymbolicLinks(FilePath("relative_file_path"))
389*6777b538SAndroid Build Coastguard Worker .has_value());
390*6777b538SAndroid Build Coastguard Worker }
391*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_POSIX)
392*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,FileAndDirectorySize)393*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, FileAndDirectorySize) {
394*6777b538SAndroid Build Coastguard Worker // Create three files of 20, 30 and 3 chars (utf8). ComputeDirectorySize
395*6777b538SAndroid Build Coastguard Worker // should return 53 bytes.
396*6777b538SAndroid Build Coastguard Worker FilePath file_01 = temp_dir_.GetPath().Append(FPL("The file 01.txt"));
397*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_01, L"12345678901234567890");
398*6777b538SAndroid Build Coastguard Worker int64_t size_f1 = 0;
399*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetFileSize(file_01, &size_f1));
400*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(20ll, size_f1);
401*6777b538SAndroid Build Coastguard Worker
402*6777b538SAndroid Build Coastguard Worker FilePath subdir_path = temp_dir_.GetPath().Append(FPL("Level2"));
403*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_path);
404*6777b538SAndroid Build Coastguard Worker
405*6777b538SAndroid Build Coastguard Worker FilePath file_02 = subdir_path.Append(FPL("The file 02.txt"));
406*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_02, L"123456789012345678901234567890");
407*6777b538SAndroid Build Coastguard Worker int64_t size_f2 = 0;
408*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetFileSize(file_02, &size_f2));
409*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(30ll, size_f2);
410*6777b538SAndroid Build Coastguard Worker
411*6777b538SAndroid Build Coastguard Worker FilePath subsubdir_path = subdir_path.Append(FPL("Level3"));
412*6777b538SAndroid Build Coastguard Worker CreateDirectory(subsubdir_path);
413*6777b538SAndroid Build Coastguard Worker
414*6777b538SAndroid Build Coastguard Worker FilePath file_03 = subsubdir_path.Append(FPL("The file 03.txt"));
415*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_03, L"123");
416*6777b538SAndroid Build Coastguard Worker
417*6777b538SAndroid Build Coastguard Worker int64_t computed_size = ComputeDirectorySize(temp_dir_.GetPath());
418*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(size_f1 + size_f2 + 3, computed_size);
419*6777b538SAndroid Build Coastguard Worker }
420*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,NormalizeFilePathBasic)421*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, NormalizeFilePathBasic) {
422*6777b538SAndroid Build Coastguard Worker // Create a directory under the test dir. Because we create it,
423*6777b538SAndroid Build Coastguard Worker // we know it is not a link.
424*6777b538SAndroid Build Coastguard Worker FilePath file_a_path = temp_dir_.GetPath().Append(FPL("file_a"));
425*6777b538SAndroid Build Coastguard Worker FilePath dir_path = temp_dir_.GetPath().Append(FPL("dir"));
426*6777b538SAndroid Build Coastguard Worker FilePath file_b_path = dir_path.Append(FPL("file_b"));
427*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_path);
428*6777b538SAndroid Build Coastguard Worker
429*6777b538SAndroid Build Coastguard Worker FilePath normalized_file_a_path, normalized_file_b_path;
430*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(file_a_path));
431*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(NormalizeFilePath(file_a_path, &normalized_file_a_path))
432*6777b538SAndroid Build Coastguard Worker << "NormalizeFilePath() should fail on nonexistent paths.";
433*6777b538SAndroid Build Coastguard Worker
434*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_a_path, bogus_content);
435*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_a_path));
436*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(NormalizeFilePath(file_a_path, &normalized_file_a_path));
437*6777b538SAndroid Build Coastguard Worker
438*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_b_path, bogus_content);
439*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_b_path));
440*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(NormalizeFilePath(file_b_path, &normalized_file_b_path));
441*6777b538SAndroid Build Coastguard Worker
442*6777b538SAndroid Build Coastguard Worker // Because this test created |dir_path|, we know it is not a link
443*6777b538SAndroid Build Coastguard Worker // or junction. So, the real path of the directory holding file a
444*6777b538SAndroid Build Coastguard Worker // must be the parent of the path holding file b.
445*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(normalized_file_a_path.DirName()
446*6777b538SAndroid Build Coastguard Worker .IsParent(normalized_file_b_path.DirName()));
447*6777b538SAndroid Build Coastguard Worker }
448*6777b538SAndroid Build Coastguard Worker
449*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_POSIX)
450*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,IsLinkCreateSymbolicLinkOnFile)451*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, IsLinkCreateSymbolicLinkOnFile) {
452*6777b538SAndroid Build Coastguard Worker FilePath target_file_path;
453*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateTemporaryFileInDir(temp_dir_.GetPath(), &target_file_path));
454*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(IsLink(target_file_path));
455*6777b538SAndroid Build Coastguard Worker
456*6777b538SAndroid Build Coastguard Worker base::FilePath symlink_path =
457*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("symlink_to_target"));
458*6777b538SAndroid Build Coastguard Worker
459*6777b538SAndroid Build Coastguard Worker CreateSymbolicLinkResult result =
460*6777b538SAndroid Build Coastguard Worker CreateSymbolicLinkForTesting(target_file_path, symlink_path);
461*6777b538SAndroid Build Coastguard Worker if (result == CreateSymbolicLinkResult::kUnsupported) {
462*6777b538SAndroid Build Coastguard Worker GTEST_SKIP();
463*6777b538SAndroid Build Coastguard Worker }
464*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(result, CreateSymbolicLinkResult::kSucceeded);
465*6777b538SAndroid Build Coastguard Worker
466*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsLink(symlink_path));
467*6777b538SAndroid Build Coastguard Worker }
468*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,IsLinkCreateSymbolicLinkOnDirectory)469*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, IsLinkCreateSymbolicLinkOnDirectory) {
470*6777b538SAndroid Build Coastguard Worker FilePath target_path = temp_dir_.GetPath().Append(FPL("target"));
471*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(target_path));
472*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(IsLink(target_path));
473*6777b538SAndroid Build Coastguard Worker
474*6777b538SAndroid Build Coastguard Worker base::FilePath symlink_path =
475*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("symlink_to_target"));
476*6777b538SAndroid Build Coastguard Worker
477*6777b538SAndroid Build Coastguard Worker CreateSymbolicLinkResult result =
478*6777b538SAndroid Build Coastguard Worker CreateSymbolicLinkForTesting(target_path, symlink_path);
479*6777b538SAndroid Build Coastguard Worker if (result == CreateSymbolicLinkResult::kUnsupported) {
480*6777b538SAndroid Build Coastguard Worker GTEST_SKIP();
481*6777b538SAndroid Build Coastguard Worker }
482*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(result, CreateSymbolicLinkResult::kSucceeded);
483*6777b538SAndroid Build Coastguard Worker
484*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsLink(symlink_path));
485*6777b538SAndroid Build Coastguard Worker }
486*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,IsLinkMissingFile)487*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, IsLinkMissingFile) {
488*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(IsLink(FilePath()));
489*6777b538SAndroid Build Coastguard Worker }
490*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,IsLinkWithDeletedTargetFile)491*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, IsLinkWithDeletedTargetFile) {
492*6777b538SAndroid Build Coastguard Worker // Set up a symlink pointing to a temporary file.
493*6777b538SAndroid Build Coastguard Worker FilePath target_file_path;
494*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateTemporaryFileInDir(temp_dir_.GetPath(), &target_file_path));
495*6777b538SAndroid Build Coastguard Worker FilePath symlink_path =
496*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("symlink_to_missing_target"));
497*6777b538SAndroid Build Coastguard Worker
498*6777b538SAndroid Build Coastguard Worker CreateSymbolicLinkResult result =
499*6777b538SAndroid Build Coastguard Worker CreateSymbolicLinkForTesting(target_file_path, symlink_path);
500*6777b538SAndroid Build Coastguard Worker if (result == CreateSymbolicLinkResult::kUnsupported) {
501*6777b538SAndroid Build Coastguard Worker GTEST_SKIP();
502*6777b538SAndroid Build Coastguard Worker }
503*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(result, CreateSymbolicLinkResult::kSucceeded);
504*6777b538SAndroid Build Coastguard Worker
505*6777b538SAndroid Build Coastguard Worker // Verify that the symlink is recognized correctly.
506*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsLink(symlink_path));
507*6777b538SAndroid Build Coastguard Worker
508*6777b538SAndroid Build Coastguard Worker // Delete the target file.
509*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DeleteFile(target_file_path));
510*6777b538SAndroid Build Coastguard Worker
511*6777b538SAndroid Build Coastguard Worker // Verify that IsLink still returns true for the symlink, even though its
512*6777b538SAndroid Build Coastguard Worker // target is missing.
513*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsLink(symlink_path));
514*6777b538SAndroid Build Coastguard Worker }
515*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,IsLinkWithDeletedTargetDirectory)516*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, IsLinkWithDeletedTargetDirectory) {
517*6777b538SAndroid Build Coastguard Worker // Set up a symlink pointing to a temporary file.
518*6777b538SAndroid Build Coastguard Worker FilePath target_path = temp_dir_.GetPath().Append(FPL("target"));
519*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(target_path));
520*6777b538SAndroid Build Coastguard Worker FilePath symlink_path =
521*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("symlink_to_missing_target"));
522*6777b538SAndroid Build Coastguard Worker
523*6777b538SAndroid Build Coastguard Worker CreateSymbolicLinkResult result =
524*6777b538SAndroid Build Coastguard Worker CreateSymbolicLinkForTesting(target_path, symlink_path);
525*6777b538SAndroid Build Coastguard Worker if (result == CreateSymbolicLinkResult::kUnsupported) {
526*6777b538SAndroid Build Coastguard Worker GTEST_SKIP();
527*6777b538SAndroid Build Coastguard Worker }
528*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(result, CreateSymbolicLinkResult::kSucceeded);
529*6777b538SAndroid Build Coastguard Worker
530*6777b538SAndroid Build Coastguard Worker // Verify that the symlink is recognized correctly.
531*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsLink(symlink_path));
532*6777b538SAndroid Build Coastguard Worker
533*6777b538SAndroid Build Coastguard Worker // Delete the target file.
534*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DeleteFile(target_path));
535*6777b538SAndroid Build Coastguard Worker
536*6777b538SAndroid Build Coastguard Worker // Verify that IsLink still returns true for the symlink, even though its
537*6777b538SAndroid Build Coastguard Worker // target is missing.
538*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsLink(symlink_path));
539*6777b538SAndroid Build Coastguard Worker }
540*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,IsLinkWihtoutReparsePointAttributeOnDirectory)541*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, IsLinkWihtoutReparsePointAttributeOnDirectory) {
542*6777b538SAndroid Build Coastguard Worker FilePath target_path = temp_dir_.GetPath().Append(FPL("target"));
543*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(target_path));
544*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(IsLink(target_path));
545*6777b538SAndroid Build Coastguard Worker }
546*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,IsLinkWihtoutReparsePointAttributeOnFile)547*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, IsLinkWihtoutReparsePointAttributeOnFile) {
548*6777b538SAndroid Build Coastguard Worker FilePath target_file_path;
549*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateTemporaryFileInDir(temp_dir_.GetPath(), &target_file_path));
550*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(IsLink(target_file_path));
551*6777b538SAndroid Build Coastguard Worker }
552*6777b538SAndroid Build Coastguard Worker
553*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_POSIX)
554*6777b538SAndroid Build Coastguard Worker
555*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
556*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,NormalizeFileEmptyFile)557*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, NormalizeFileEmptyFile) {
558*6777b538SAndroid Build Coastguard Worker // Create a directory under the test dir. Because we create it,
559*6777b538SAndroid Build Coastguard Worker // we know it is not a link.
560*6777b538SAndroid Build Coastguard Worker const wchar_t empty_content[] = L"";
561*6777b538SAndroid Build Coastguard Worker
562*6777b538SAndroid Build Coastguard Worker FilePath file_a_path = temp_dir_.GetPath().Append(FPL("file_empty_a"));
563*6777b538SAndroid Build Coastguard Worker FilePath dir_path = temp_dir_.GetPath().Append(FPL("dir"));
564*6777b538SAndroid Build Coastguard Worker FilePath file_b_path = dir_path.Append(FPL("file_empty_b"));
565*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_path));
566*6777b538SAndroid Build Coastguard Worker
567*6777b538SAndroid Build Coastguard Worker FilePath normalized_file_a_path, normalized_file_b_path;
568*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(file_a_path));
569*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(NormalizeFilePath(file_a_path, &normalized_file_a_path))
570*6777b538SAndroid Build Coastguard Worker << "NormalizeFilePath() should fail on nonexistent paths.";
571*6777b538SAndroid Build Coastguard Worker
572*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_a_path, empty_content);
573*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_a_path));
574*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(NormalizeFilePath(file_a_path, &normalized_file_a_path));
575*6777b538SAndroid Build Coastguard Worker
576*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_b_path, empty_content);
577*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_b_path));
578*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(NormalizeFilePath(file_b_path, &normalized_file_b_path));
579*6777b538SAndroid Build Coastguard Worker
580*6777b538SAndroid Build Coastguard Worker // Because this test created |dir_path|, we know it is not a link
581*6777b538SAndroid Build Coastguard Worker // or junction. So, the real path of the directory holding file a
582*6777b538SAndroid Build Coastguard Worker // must be the parent of the path holding file b.
583*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(normalized_file_a_path.DirName().IsParent(
584*6777b538SAndroid Build Coastguard Worker normalized_file_b_path.DirName()));
585*6777b538SAndroid Build Coastguard Worker }
586*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,NormalizeFilePathReparsePoints)587*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, NormalizeFilePathReparsePoints) {
588*6777b538SAndroid Build Coastguard Worker // Build the following directory structure:
589*6777b538SAndroid Build Coastguard Worker //
590*6777b538SAndroid Build Coastguard Worker // temp_dir
591*6777b538SAndroid Build Coastguard Worker // |-> base_a
592*6777b538SAndroid Build Coastguard Worker // | |-> sub_a
593*6777b538SAndroid Build Coastguard Worker // | |-> file.txt
594*6777b538SAndroid Build Coastguard Worker // | |-> long_name___... (Very long name.)
595*6777b538SAndroid Build Coastguard Worker // | |-> sub_long
596*6777b538SAndroid Build Coastguard Worker // | |-> deep.txt
597*6777b538SAndroid Build Coastguard Worker // |-> base_b
598*6777b538SAndroid Build Coastguard Worker // |-> to_sub_a (reparse point to temp_dir\base_a\sub_a)
599*6777b538SAndroid Build Coastguard Worker // |-> to_base_b (reparse point to temp_dir\base_b)
600*6777b538SAndroid Build Coastguard Worker // |-> to_sub_long (reparse point to temp_dir\sub_a\long_name_\sub_long)
601*6777b538SAndroid Build Coastguard Worker
602*6777b538SAndroid Build Coastguard Worker FilePath base_a = temp_dir_.GetPath().Append(FPL("base_a"));
603*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
604*6777b538SAndroid Build Coastguard Worker // TEMP can have a lower case drive letter.
605*6777b538SAndroid Build Coastguard Worker std::wstring temp_base_a = base_a.value();
606*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(temp_base_a.empty());
607*6777b538SAndroid Build Coastguard Worker temp_base_a[0] = ToUpperASCII(char16_t{temp_base_a[0]});
608*6777b538SAndroid Build Coastguard Worker base_a = FilePath(temp_base_a);
609*6777b538SAndroid Build Coastguard Worker #endif
610*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(base_a));
611*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
612*6777b538SAndroid Build Coastguard Worker // TEMP might be a short name which is not normalized.
613*6777b538SAndroid Build Coastguard Worker base_a = MakeLongFilePath(base_a);
614*6777b538SAndroid Build Coastguard Worker #endif
615*6777b538SAndroid Build Coastguard Worker
616*6777b538SAndroid Build Coastguard Worker FilePath sub_a = base_a.Append(FPL("sub_a"));
617*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(sub_a));
618*6777b538SAndroid Build Coastguard Worker
619*6777b538SAndroid Build Coastguard Worker FilePath file_txt = sub_a.Append(FPL("file.txt"));
620*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_txt, bogus_content);
621*6777b538SAndroid Build Coastguard Worker
622*6777b538SAndroid Build Coastguard Worker // Want a directory whose name is long enough to make the path to the file
623*6777b538SAndroid Build Coastguard Worker // inside just under MAX_PATH chars. This will be used to test that when
624*6777b538SAndroid Build Coastguard Worker // a junction expands to a path over MAX_PATH chars in length,
625*6777b538SAndroid Build Coastguard Worker // NormalizeFilePath() fails without crashing.
626*6777b538SAndroid Build Coastguard Worker FilePath sub_long_rel(FPL("sub_long"));
627*6777b538SAndroid Build Coastguard Worker FilePath deep_txt(FPL("deep.txt"));
628*6777b538SAndroid Build Coastguard Worker
629*6777b538SAndroid Build Coastguard Worker int target_length = MAX_PATH;
630*6777b538SAndroid Build Coastguard Worker target_length -= (sub_a.value().length() + 1); // +1 for the sepperator '\'.
631*6777b538SAndroid Build Coastguard Worker target_length -= (sub_long_rel.Append(deep_txt).value().length() + 1);
632*6777b538SAndroid Build Coastguard Worker // Without making the path a bit shorter, CreateDirectory() fails.
633*6777b538SAndroid Build Coastguard Worker // the resulting path is still long enough to hit the failing case in
634*6777b538SAndroid Build Coastguard Worker // NormalizePath().
635*6777b538SAndroid Build Coastguard Worker const int kCreateDirLimit = 4;
636*6777b538SAndroid Build Coastguard Worker target_length -= kCreateDirLimit;
637*6777b538SAndroid Build Coastguard Worker FilePath::StringType long_name_str = FPL("long_name_");
638*6777b538SAndroid Build Coastguard Worker long_name_str.resize(target_length, '_');
639*6777b538SAndroid Build Coastguard Worker
640*6777b538SAndroid Build Coastguard Worker FilePath long_name = sub_a.Append(FilePath(long_name_str));
641*6777b538SAndroid Build Coastguard Worker FilePath deep_file = long_name.Append(sub_long_rel).Append(deep_txt);
642*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<size_t>(MAX_PATH - kCreateDirLimit),
643*6777b538SAndroid Build Coastguard Worker deep_file.value().length());
644*6777b538SAndroid Build Coastguard Worker
645*6777b538SAndroid Build Coastguard Worker FilePath sub_long = deep_file.DirName();
646*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(sub_long));
647*6777b538SAndroid Build Coastguard Worker CreateTextFile(deep_file, bogus_content);
648*6777b538SAndroid Build Coastguard Worker
649*6777b538SAndroid Build Coastguard Worker FilePath base_b = temp_dir_.GetPath().Append(FPL("base_b"));
650*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(base_b));
651*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
652*6777b538SAndroid Build Coastguard Worker // TEMP might be a short name which is not normalized.
653*6777b538SAndroid Build Coastguard Worker base_b = MakeLongFilePath(base_b);
654*6777b538SAndroid Build Coastguard Worker #endif
655*6777b538SAndroid Build Coastguard Worker
656*6777b538SAndroid Build Coastguard Worker FilePath to_sub_a = base_b.Append(FPL("to_sub_a"));
657*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(to_sub_a));
658*6777b538SAndroid Build Coastguard Worker FilePath normalized_path;
659*6777b538SAndroid Build Coastguard Worker {
660*6777b538SAndroid Build Coastguard Worker auto reparse_to_sub_a = test::FilePathReparsePoint::Create(to_sub_a, sub_a);
661*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(reparse_to_sub_a.has_value());
662*6777b538SAndroid Build Coastguard Worker
663*6777b538SAndroid Build Coastguard Worker FilePath to_base_b = base_b.Append(FPL("to_base_b"));
664*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(to_base_b));
665*6777b538SAndroid Build Coastguard Worker auto reparse_to_base_b =
666*6777b538SAndroid Build Coastguard Worker test::FilePathReparsePoint::Create(to_base_b, base_b);
667*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(reparse_to_base_b.has_value());
668*6777b538SAndroid Build Coastguard Worker
669*6777b538SAndroid Build Coastguard Worker FilePath to_sub_long = base_b.Append(FPL("to_sub_long"));
670*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(to_sub_long));
671*6777b538SAndroid Build Coastguard Worker auto reparse_to_sub_long =
672*6777b538SAndroid Build Coastguard Worker test::FilePathReparsePoint::Create(to_sub_long, sub_long);
673*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(reparse_to_sub_long.has_value());
674*6777b538SAndroid Build Coastguard Worker
675*6777b538SAndroid Build Coastguard Worker // Normalize a junction free path: base_a\sub_a\file.txt .
676*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(NormalizeFilePath(file_txt, &normalized_path));
677*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(file_txt.value(), normalized_path.value());
678*6777b538SAndroid Build Coastguard Worker
679*6777b538SAndroid Build Coastguard Worker // Check that the path base_b\to_sub_a\file.txt can be normalized to exclude
680*6777b538SAndroid Build Coastguard Worker // the junction to_sub_a.
681*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
682*6777b538SAndroid Build Coastguard Worker &normalized_path));
683*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(file_txt.value(), normalized_path.value());
684*6777b538SAndroid Build Coastguard Worker
685*6777b538SAndroid Build Coastguard Worker // Check that the path base_b\to_base_b\to_base_b\to_sub_a\file.txt can be
686*6777b538SAndroid Build Coastguard Worker // normalized to exclude junctions to_base_b and to_sub_a .
687*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(NormalizeFilePath(base_b.Append(FPL("to_base_b"))
688*6777b538SAndroid Build Coastguard Worker .Append(FPL("to_base_b"))
689*6777b538SAndroid Build Coastguard Worker .Append(FPL("to_sub_a"))
690*6777b538SAndroid Build Coastguard Worker .Append(FPL("file.txt")),
691*6777b538SAndroid Build Coastguard Worker &normalized_path));
692*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(file_txt.value(), normalized_path.value());
693*6777b538SAndroid Build Coastguard Worker
694*6777b538SAndroid Build Coastguard Worker // A long enough path will cause NormalizeFilePath() to fail. Make a long
695*6777b538SAndroid Build Coastguard Worker // path using to_base_b many times, and check that paths long enough to fail
696*6777b538SAndroid Build Coastguard Worker // do not cause a crash.
697*6777b538SAndroid Build Coastguard Worker FilePath long_path = base_b;
698*6777b538SAndroid Build Coastguard Worker const int kLengthLimit = MAX_PATH + 200;
699*6777b538SAndroid Build Coastguard Worker while (long_path.value().length() <= kLengthLimit) {
700*6777b538SAndroid Build Coastguard Worker long_path = long_path.Append(FPL("to_base_b"));
701*6777b538SAndroid Build Coastguard Worker }
702*6777b538SAndroid Build Coastguard Worker long_path = long_path.Append(FPL("to_sub_a"))
703*6777b538SAndroid Build Coastguard Worker .Append(FPL("file.txt"));
704*6777b538SAndroid Build Coastguard Worker
705*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(NormalizeFilePath(long_path, &normalized_path));
706*6777b538SAndroid Build Coastguard Worker
707*6777b538SAndroid Build Coastguard Worker // Normalizing the junction to deep.txt should fail, because the expanded
708*6777b538SAndroid Build Coastguard Worker // path to deep.txt is longer than MAX_PATH.
709*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(NormalizeFilePath(to_sub_long.Append(deep_txt),
710*6777b538SAndroid Build Coastguard Worker &normalized_path));
711*6777b538SAndroid Build Coastguard Worker
712*6777b538SAndroid Build Coastguard Worker // Delete the reparse points, and see that NormalizeFilePath() fails
713*6777b538SAndroid Build Coastguard Worker // to traverse them.
714*6777b538SAndroid Build Coastguard Worker }
715*6777b538SAndroid Build Coastguard Worker
716*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
717*6777b538SAndroid Build Coastguard Worker &normalized_path));
718*6777b538SAndroid Build Coastguard Worker }
719*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,DevicePathToDriveLetter)720*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DevicePathToDriveLetter) {
721*6777b538SAndroid Build Coastguard Worker // Get a drive letter.
722*6777b538SAndroid Build Coastguard Worker std::wstring real_drive_letter = AsWString(
723*6777b538SAndroid Build Coastguard Worker ToUpperASCII(AsStringPiece16(temp_dir_.GetPath().value().substr(0, 2))));
724*6777b538SAndroid Build Coastguard Worker if (!IsAsciiAlpha(real_drive_letter[0]) || ':' != real_drive_letter[1]) {
725*6777b538SAndroid Build Coastguard Worker LOG(ERROR) << "Can't get a drive letter to test with.";
726*6777b538SAndroid Build Coastguard Worker return;
727*6777b538SAndroid Build Coastguard Worker }
728*6777b538SAndroid Build Coastguard Worker
729*6777b538SAndroid Build Coastguard Worker // Get the NT style path to that drive.
730*6777b538SAndroid Build Coastguard Worker wchar_t device_path[MAX_PATH] = {'\0'};
731*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(
732*6777b538SAndroid Build Coastguard Worker ::QueryDosDevice(real_drive_letter.c_str(), device_path, MAX_PATH));
733*6777b538SAndroid Build Coastguard Worker FilePath actual_device_path(device_path);
734*6777b538SAndroid Build Coastguard Worker FilePath win32_path;
735*6777b538SAndroid Build Coastguard Worker
736*6777b538SAndroid Build Coastguard Worker // Run DevicePathToDriveLetterPath() on the NT style path we got from
737*6777b538SAndroid Build Coastguard Worker // QueryDosDevice(). Expect the drive letter we started with.
738*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DevicePathToDriveLetterPath(actual_device_path, &win32_path));
739*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(real_drive_letter, win32_path.value());
740*6777b538SAndroid Build Coastguard Worker
741*6777b538SAndroid Build Coastguard Worker // Add some directories to the path. Expect those extra path componenets
742*6777b538SAndroid Build Coastguard Worker // to be preserved.
743*6777b538SAndroid Build Coastguard Worker FilePath kRelativePath(FPL("dir1\\dir2\\file.txt"));
744*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DevicePathToDriveLetterPath(
745*6777b538SAndroid Build Coastguard Worker actual_device_path.Append(kRelativePath),
746*6777b538SAndroid Build Coastguard Worker &win32_path));
747*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(FilePath(real_drive_letter + FILE_PATH_LITERAL("\\"))
748*6777b538SAndroid Build Coastguard Worker .Append(kRelativePath)
749*6777b538SAndroid Build Coastguard Worker .value(),
750*6777b538SAndroid Build Coastguard Worker win32_path.value());
751*6777b538SAndroid Build Coastguard Worker
752*6777b538SAndroid Build Coastguard Worker // Deform the real path so that it is invalid by removing the last four
753*6777b538SAndroid Build Coastguard Worker // characters. The way windows names devices that are hard disks
754*6777b538SAndroid Build Coastguard Worker // (\Device\HardDiskVolume${NUMBER}) guarantees that the string is longer
755*6777b538SAndroid Build Coastguard Worker // than three characters. The only way the truncated string could be a
756*6777b538SAndroid Build Coastguard Worker // real drive is if more than 10^3 disks are mounted:
757*6777b538SAndroid Build Coastguard Worker // \Device\HardDiskVolume10000 would be truncated to \Device\HardDiskVolume1
758*6777b538SAndroid Build Coastguard Worker // Check that DevicePathToDriveLetterPath fails.
759*6777b538SAndroid Build Coastguard Worker size_t path_length = actual_device_path.value().length();
760*6777b538SAndroid Build Coastguard Worker size_t new_length = path_length - 4;
761*6777b538SAndroid Build Coastguard Worker ASSERT_GT(new_length, 0u);
762*6777b538SAndroid Build Coastguard Worker FilePath prefix_of_real_device_path(
763*6777b538SAndroid Build Coastguard Worker actual_device_path.value().substr(0, new_length));
764*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(DevicePathToDriveLetterPath(prefix_of_real_device_path,
765*6777b538SAndroid Build Coastguard Worker &win32_path));
766*6777b538SAndroid Build Coastguard Worker
767*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(DevicePathToDriveLetterPath(
768*6777b538SAndroid Build Coastguard Worker prefix_of_real_device_path.Append(kRelativePath),
769*6777b538SAndroid Build Coastguard Worker &win32_path));
770*6777b538SAndroid Build Coastguard Worker
771*6777b538SAndroid Build Coastguard Worker // Deform the real path so that it is invalid by adding some characters. For
772*6777b538SAndroid Build Coastguard Worker // example, if C: maps to \Device\HardDiskVolume8, then we simulate a
773*6777b538SAndroid Build Coastguard Worker // request for the drive letter whose native path is
774*6777b538SAndroid Build Coastguard Worker // \Device\HardDiskVolume812345 . We assume such a device does not exist,
775*6777b538SAndroid Build Coastguard Worker // because drives are numbered in order and mounting 112345 hard disks will
776*6777b538SAndroid Build Coastguard Worker // never happen.
777*6777b538SAndroid Build Coastguard Worker const FilePath::StringType kExtraChars = FPL("12345");
778*6777b538SAndroid Build Coastguard Worker
779*6777b538SAndroid Build Coastguard Worker FilePath real_device_path_plus_numbers(
780*6777b538SAndroid Build Coastguard Worker actual_device_path.value() + kExtraChars);
781*6777b538SAndroid Build Coastguard Worker
782*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(DevicePathToDriveLetterPath(
783*6777b538SAndroid Build Coastguard Worker real_device_path_plus_numbers,
784*6777b538SAndroid Build Coastguard Worker &win32_path));
785*6777b538SAndroid Build Coastguard Worker
786*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(DevicePathToDriveLetterPath(
787*6777b538SAndroid Build Coastguard Worker real_device_path_plus_numbers.Append(kRelativePath),
788*6777b538SAndroid Build Coastguard Worker &win32_path));
789*6777b538SAndroid Build Coastguard Worker }
790*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CreateTemporaryFileInDirLongPathTest)791*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateTemporaryFileInDirLongPathTest) {
792*6777b538SAndroid Build Coastguard Worker // Test that CreateTemporaryFileInDir() creates a path and returns a long path
793*6777b538SAndroid Build Coastguard Worker // if it is available. This test requires that:
794*6777b538SAndroid Build Coastguard Worker // - the filesystem at |temp_dir_| supports long filenames.
795*6777b538SAndroid Build Coastguard Worker // - the account has FILE_LIST_DIRECTORY permission for all ancestor
796*6777b538SAndroid Build Coastguard Worker // directories of |temp_dir_|.
797*6777b538SAndroid Build Coastguard Worker constexpr FilePath::CharType kLongDirName[] = FPL("A long path");
798*6777b538SAndroid Build Coastguard Worker constexpr FilePath::CharType kTestSubDirName[] = FPL("test");
799*6777b538SAndroid Build Coastguard Worker FilePath long_test_dir = temp_dir_.GetPath().Append(kLongDirName);
800*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(long_test_dir));
801*6777b538SAndroid Build Coastguard Worker
802*6777b538SAndroid Build Coastguard Worker // kLongDirName is not a 8.3 component. So ::GetShortPathName() should give us
803*6777b538SAndroid Build Coastguard Worker // a different short name.
804*6777b538SAndroid Build Coastguard Worker FilePath short_test_dir = MakeShortFilePath(long_test_dir);
805*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(short_test_dir.empty());
806*6777b538SAndroid Build Coastguard Worker ASSERT_NE(kLongDirName, short_test_dir.BaseName().value());
807*6777b538SAndroid Build Coastguard Worker
808*6777b538SAndroid Build Coastguard Worker FilePath temp_file;
809*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateTemporaryFileInDir(short_test_dir, &temp_file));
810*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kLongDirName, temp_file.DirName().BaseName().value());
811*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(temp_file));
812*6777b538SAndroid Build Coastguard Worker
813*6777b538SAndroid Build Coastguard Worker // Create a subdirectory of |long_test_dir| and make |long_test_dir|
814*6777b538SAndroid Build Coastguard Worker // unreadable. We should still be able to create a temp file in the
815*6777b538SAndroid Build Coastguard Worker // subdirectory, but we won't be able to determine the long path for it. This
816*6777b538SAndroid Build Coastguard Worker // mimics the environment that some users run where their user profiles reside
817*6777b538SAndroid Build Coastguard Worker // in a location where the don't have full access to the higher level
818*6777b538SAndroid Build Coastguard Worker // directories. (Note that this assumption is true for NTFS, but not for some
819*6777b538SAndroid Build Coastguard Worker // network file systems. E.g. AFS).
820*6777b538SAndroid Build Coastguard Worker FilePath access_test_dir = long_test_dir.Append(kTestSubDirName);
821*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(access_test_dir));
822*6777b538SAndroid Build Coastguard Worker FilePermissionRestorer long_test_dir_restorer(long_test_dir);
823*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(MakeFileUnreadable(long_test_dir));
824*6777b538SAndroid Build Coastguard Worker
825*6777b538SAndroid Build Coastguard Worker // Use the short form of the directory to create a temporary filename.
826*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateTemporaryFileInDir(
827*6777b538SAndroid Build Coastguard Worker short_test_dir.Append(kTestSubDirName), &temp_file));
828*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(temp_file));
829*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(short_test_dir.IsParent(temp_file.DirName()));
830*6777b538SAndroid Build Coastguard Worker
831*6777b538SAndroid Build Coastguard Worker // Check that the long path can't be determined for |temp_file|.
832*6777b538SAndroid Build Coastguard Worker // Helper method base::MakeLongFilePath returns an empty path on error.
833*6777b538SAndroid Build Coastguard Worker FilePath temp_file_long = MakeLongFilePath(temp_file);
834*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(temp_file_long.empty());
835*6777b538SAndroid Build Coastguard Worker }
836*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,MakeLongFilePathTest)837*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MakeLongFilePathTest) {
838*6777b538SAndroid Build Coastguard Worker // Tests helper function base::MakeLongFilePath
839*6777b538SAndroid Build Coastguard Worker
840*6777b538SAndroid Build Coastguard Worker // If a username isn't a valid 8.3 short file name (even just a
841*6777b538SAndroid Build Coastguard Worker // lengthy name like "user with long name"), Windows will set the TMP and TEMP
842*6777b538SAndroid Build Coastguard Worker // environment variables to be 8.3 paths. ::GetTempPath (called in
843*6777b538SAndroid Build Coastguard Worker // base::GetTempDir) just uses the value specified by TMP or TEMP, and so can
844*6777b538SAndroid Build Coastguard Worker // return a short path. So from the start need to use MakeLongFilePath
845*6777b538SAndroid Build Coastguard Worker // to normalize the path for such test environments.
846*6777b538SAndroid Build Coastguard Worker FilePath temp_dir_long = MakeLongFilePath(temp_dir_.GetPath());
847*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(temp_dir_long.empty());
848*6777b538SAndroid Build Coastguard Worker
849*6777b538SAndroid Build Coastguard Worker FilePath long_test_dir = temp_dir_long.Append(FPL("A long directory name"));
850*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(long_test_dir));
851*6777b538SAndroid Build Coastguard Worker
852*6777b538SAndroid Build Coastguard Worker // Directory name is not a 8.3 component. So ::GetShortPathName() should give
853*6777b538SAndroid Build Coastguard Worker // us a different short name.
854*6777b538SAndroid Build Coastguard Worker FilePath short_test_dir = MakeShortFilePath(long_test_dir);
855*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(short_test_dir.empty());
856*6777b538SAndroid Build Coastguard Worker
857*6777b538SAndroid Build Coastguard Worker EXPECT_NE(long_test_dir, short_test_dir);
858*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(long_test_dir, MakeLongFilePath(short_test_dir));
859*6777b538SAndroid Build Coastguard Worker
860*6777b538SAndroid Build Coastguard Worker FilePath long_test_file = long_test_dir.Append(FPL("A long file name.1234"));
861*6777b538SAndroid Build Coastguard Worker CreateTextFile(long_test_file, bogus_content);
862*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(long_test_file));
863*6777b538SAndroid Build Coastguard Worker
864*6777b538SAndroid Build Coastguard Worker // File name is not a 8.3 component. So ::GetShortPathName() should give us
865*6777b538SAndroid Build Coastguard Worker // a different short name.
866*6777b538SAndroid Build Coastguard Worker FilePath short_test_file = MakeShortFilePath(long_test_file);
867*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(short_test_file.empty());
868*6777b538SAndroid Build Coastguard Worker
869*6777b538SAndroid Build Coastguard Worker EXPECT_NE(long_test_file, short_test_file);
870*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(long_test_file, MakeLongFilePath(short_test_file));
871*6777b538SAndroid Build Coastguard Worker
872*6777b538SAndroid Build Coastguard Worker // MakeLongFilePath should return empty path if file does not exist.
873*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(short_test_file));
874*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MakeLongFilePath(short_test_file).empty());
875*6777b538SAndroid Build Coastguard Worker
876*6777b538SAndroid Build Coastguard Worker // MakeLongFilePath should return empty path if directory does not exist.
877*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(short_test_dir));
878*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(MakeLongFilePath(short_test_dir).empty());
879*6777b538SAndroid Build Coastguard Worker }
880*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CreateWinHardlinkTest)881*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateWinHardlinkTest) {
882*6777b538SAndroid Build Coastguard Worker // Link to a different file name in a sub-directory of |temp_dir_|.
883*6777b538SAndroid Build Coastguard Worker FilePath test_dir = temp_dir_.GetPath().Append(FPL("test"));
884*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(test_dir));
885*6777b538SAndroid Build Coastguard Worker FilePath temp_file;
886*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateTemporaryFileInDir(temp_dir_.GetPath(), &temp_file));
887*6777b538SAndroid Build Coastguard Worker FilePath link_to_file = test_dir.Append(FPL("linked_name"));
888*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CreateWinHardLink(link_to_file, temp_file));
889*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(link_to_file));
890*6777b538SAndroid Build Coastguard Worker
891*6777b538SAndroid Build Coastguard Worker // Link two directories. This should fail. Verify that failure is returned
892*6777b538SAndroid Build Coastguard Worker // by CreateWinHardLink.
893*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CreateWinHardLink(temp_dir_.GetPath(), test_dir));
894*6777b538SAndroid Build Coastguard Worker }
895*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,PreventExecuteMappingNewFile)896*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, PreventExecuteMappingNewFile) {
897*6777b538SAndroid Build Coastguard Worker base::test::ScopedFeatureList enforcement_feature;
898*6777b538SAndroid Build Coastguard Worker enforcement_feature.InitAndEnableFeature(
899*6777b538SAndroid Build Coastguard Worker features::kEnforceNoExecutableFileHandles);
900*6777b538SAndroid Build Coastguard Worker FilePath file = temp_dir_.GetPath().Append(FPL("afile.txt"));
901*6777b538SAndroid Build Coastguard Worker
902*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(file));
903*6777b538SAndroid Build Coastguard Worker {
904*6777b538SAndroid Build Coastguard Worker File new_file(file, File::FLAG_WRITE | File::FLAG_WIN_NO_EXECUTE |
905*6777b538SAndroid Build Coastguard Worker File::FLAG_CREATE_ALWAYS);
906*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(new_file.IsValid());
907*6777b538SAndroid Build Coastguard Worker }
908*6777b538SAndroid Build Coastguard Worker
909*6777b538SAndroid Build Coastguard Worker {
910*6777b538SAndroid Build Coastguard Worker File open_file(file, File::FLAG_READ | File::FLAG_WIN_EXECUTE |
911*6777b538SAndroid Build Coastguard Worker File::FLAG_OPEN_ALWAYS);
912*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(open_file.IsValid());
913*6777b538SAndroid Build Coastguard Worker }
914*6777b538SAndroid Build Coastguard Worker // Verify the deny ACL did not prevent deleting the file.
915*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(file));
916*6777b538SAndroid Build Coastguard Worker }
917*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,PreventExecuteMappingExisting)918*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, PreventExecuteMappingExisting) {
919*6777b538SAndroid Build Coastguard Worker base::test::ScopedFeatureList enforcement_feature;
920*6777b538SAndroid Build Coastguard Worker enforcement_feature.InitAndEnableFeature(
921*6777b538SAndroid Build Coastguard Worker features::kEnforceNoExecutableFileHandles);
922*6777b538SAndroid Build Coastguard Worker FilePath file = temp_dir_.GetPath().Append(FPL("afile.txt"));
923*6777b538SAndroid Build Coastguard Worker CreateTextFile(file, bogus_content);
924*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file));
925*6777b538SAndroid Build Coastguard Worker {
926*6777b538SAndroid Build Coastguard Worker File open_file(file, File::FLAG_READ | File::FLAG_WIN_EXECUTE |
927*6777b538SAndroid Build Coastguard Worker File::FLAG_OPEN_ALWAYS);
928*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(open_file.IsValid());
929*6777b538SAndroid Build Coastguard Worker }
930*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PreventExecuteMapping(file));
931*6777b538SAndroid Build Coastguard Worker {
932*6777b538SAndroid Build Coastguard Worker File open_file(file, File::FLAG_READ | File::FLAG_WIN_EXECUTE |
933*6777b538SAndroid Build Coastguard Worker File::FLAG_OPEN_ALWAYS);
934*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(open_file.IsValid());
935*6777b538SAndroid Build Coastguard Worker }
936*6777b538SAndroid Build Coastguard Worker // Verify the deny ACL did not prevent deleting the file.
937*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(file));
938*6777b538SAndroid Build Coastguard Worker }
939*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,PreventExecuteMappingOpenFile)940*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, PreventExecuteMappingOpenFile) {
941*6777b538SAndroid Build Coastguard Worker base::test::ScopedFeatureList enforcement_feature;
942*6777b538SAndroid Build Coastguard Worker enforcement_feature.InitAndEnableFeature(
943*6777b538SAndroid Build Coastguard Worker features::kEnforceNoExecutableFileHandles);
944*6777b538SAndroid Build Coastguard Worker FilePath file = temp_dir_.GetPath().Append(FPL("afile.txt"));
945*6777b538SAndroid Build Coastguard Worker CreateTextFile(file, bogus_content);
946*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file));
947*6777b538SAndroid Build Coastguard Worker File open_file(file, File::FLAG_READ | File::FLAG_WRITE |
948*6777b538SAndroid Build Coastguard Worker File::FLAG_WIN_EXECUTE | File::FLAG_OPEN_ALWAYS);
949*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(open_file.IsValid());
950*6777b538SAndroid Build Coastguard Worker // Verify ACE can be set even on an open file.
951*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PreventExecuteMapping(file));
952*6777b538SAndroid Build Coastguard Worker {
953*6777b538SAndroid Build Coastguard Worker File second_open_file(
954*6777b538SAndroid Build Coastguard Worker file, File::FLAG_READ | File::FLAG_WRITE | File::FLAG_OPEN_ALWAYS);
955*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(second_open_file.IsValid());
956*6777b538SAndroid Build Coastguard Worker }
957*6777b538SAndroid Build Coastguard Worker {
958*6777b538SAndroid Build Coastguard Worker File third_open_file(file, File::FLAG_READ | File::FLAG_WIN_EXECUTE |
959*6777b538SAndroid Build Coastguard Worker File::FLAG_OPEN_ALWAYS);
960*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(third_open_file.IsValid());
961*6777b538SAndroid Build Coastguard Worker }
962*6777b538SAndroid Build Coastguard Worker
963*6777b538SAndroid Build Coastguard Worker open_file.Close();
964*6777b538SAndroid Build Coastguard Worker // Verify the deny ACL did not prevent deleting the file.
965*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(file));
966*6777b538SAndroid Build Coastguard Worker }
967*6777b538SAndroid Build Coastguard Worker
TEST(FileUtilDeathTest,DisallowNoExecuteOnUnsafeFile)968*6777b538SAndroid Build Coastguard Worker TEST(FileUtilDeathTest, DisallowNoExecuteOnUnsafeFile) {
969*6777b538SAndroid Build Coastguard Worker base::test::ScopedFeatureList enforcement_feature;
970*6777b538SAndroid Build Coastguard Worker enforcement_feature.InitAndEnableFeature(
971*6777b538SAndroid Build Coastguard Worker features::kEnforceNoExecutableFileHandles);
972*6777b538SAndroid Build Coastguard Worker base::FilePath local_app_data;
973*6777b538SAndroid Build Coastguard Worker // This test places a file in %LOCALAPPDATA% to verify that the checks in
974*6777b538SAndroid Build Coastguard Worker // IsPathSafeToSetAclOn work correctly.
975*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(
976*6777b538SAndroid Build Coastguard Worker base::PathService::Get(base::DIR_LOCAL_APP_DATA, &local_app_data));
977*6777b538SAndroid Build Coastguard Worker
978*6777b538SAndroid Build Coastguard Worker base::FilePath file_path;
979*6777b538SAndroid Build Coastguard Worker EXPECT_DCHECK_DEATH_WITH(
980*6777b538SAndroid Build Coastguard Worker {
981*6777b538SAndroid Build Coastguard Worker {
982*6777b538SAndroid Build Coastguard Worker base::File temp_file =
983*6777b538SAndroid Build Coastguard Worker base::CreateAndOpenTemporaryFileInDir(local_app_data, &file_path);
984*6777b538SAndroid Build Coastguard Worker }
985*6777b538SAndroid Build Coastguard Worker File reopen_file(file_path, File::FLAG_READ | File::FLAG_WRITE |
986*6777b538SAndroid Build Coastguard Worker File::FLAG_WIN_NO_EXECUTE |
987*6777b538SAndroid Build Coastguard Worker File::FLAG_OPEN_ALWAYS |
988*6777b538SAndroid Build Coastguard Worker File::FLAG_DELETE_ON_CLOSE);
989*6777b538SAndroid Build Coastguard Worker },
990*6777b538SAndroid Build Coastguard Worker "Unsafe to deny execute access to path");
991*6777b538SAndroid Build Coastguard Worker }
992*6777b538SAndroid Build Coastguard Worker
MULTIPROCESS_TEST_MAIN(NoExecuteOnSafeFileMain)993*6777b538SAndroid Build Coastguard Worker MULTIPROCESS_TEST_MAIN(NoExecuteOnSafeFileMain) {
994*6777b538SAndroid Build Coastguard Worker base::FilePath temp_file;
995*6777b538SAndroid Build Coastguard Worker CHECK(base::CreateTemporaryFile(&temp_file));
996*6777b538SAndroid Build Coastguard Worker
997*6777b538SAndroid Build Coastguard Worker // A file with FLAG_WIN_NO_EXECUTE created in temp dir should always be
998*6777b538SAndroid Build Coastguard Worker // permitted.
999*6777b538SAndroid Build Coastguard Worker File reopen_file(temp_file, File::FLAG_READ | File::FLAG_WRITE |
1000*6777b538SAndroid Build Coastguard Worker File::FLAG_WIN_NO_EXECUTE |
1001*6777b538SAndroid Build Coastguard Worker File::FLAG_OPEN_ALWAYS |
1002*6777b538SAndroid Build Coastguard Worker File::FLAG_DELETE_ON_CLOSE);
1003*6777b538SAndroid Build Coastguard Worker return 0;
1004*6777b538SAndroid Build Coastguard Worker }
1005*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,NoExecuteOnSafeFile)1006*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, NoExecuteOnSafeFile) {
1007*6777b538SAndroid Build Coastguard Worker FilePath new_dir;
1008*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateTemporaryDirInDir(
1009*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath(), FILE_PATH_LITERAL("NoExecuteOnSafeFileLongPath"),
1010*6777b538SAndroid Build Coastguard Worker &new_dir));
1011*6777b538SAndroid Build Coastguard Worker
1012*6777b538SAndroid Build Coastguard Worker FilePath short_dir = base::MakeShortFilePath(new_dir);
1013*6777b538SAndroid Build Coastguard Worker
1014*6777b538SAndroid Build Coastguard Worker // Verify that the path really is 8.3 now.
1015*6777b538SAndroid Build Coastguard Worker ASSERT_NE(new_dir.value(), short_dir.value());
1016*6777b538SAndroid Build Coastguard Worker
1017*6777b538SAndroid Build Coastguard Worker LaunchOptions options;
1018*6777b538SAndroid Build Coastguard Worker options.environment[L"TMP"] = short_dir.value();
1019*6777b538SAndroid Build Coastguard Worker
1020*6777b538SAndroid Build Coastguard Worker CommandLine child_command_line(GetMultiProcessTestChildBaseCommandLine());
1021*6777b538SAndroid Build Coastguard Worker
1022*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
1023*6777b538SAndroid Build Coastguard Worker "NoExecuteOnSafeFileMain", child_command_line, options);
1024*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
1025*6777b538SAndroid Build Coastguard Worker int rv = -1;
1026*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
1027*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
1028*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
1029*6777b538SAndroid Build Coastguard Worker }
1030*6777b538SAndroid Build Coastguard Worker
1031*6777b538SAndroid Build Coastguard Worker class FileUtilExecuteEnforcementTest
1032*6777b538SAndroid Build Coastguard Worker : public FileUtilTest,
1033*6777b538SAndroid Build Coastguard Worker public ::testing::WithParamInterface<bool> {
1034*6777b538SAndroid Build Coastguard Worker public:
FileUtilExecuteEnforcementTest()1035*6777b538SAndroid Build Coastguard Worker FileUtilExecuteEnforcementTest() {
1036*6777b538SAndroid Build Coastguard Worker if (IsEnforcementEnabled()) {
1037*6777b538SAndroid Build Coastguard Worker enforcement_feature_.InitAndEnableFeature(
1038*6777b538SAndroid Build Coastguard Worker features::kEnforceNoExecutableFileHandles);
1039*6777b538SAndroid Build Coastguard Worker } else {
1040*6777b538SAndroid Build Coastguard Worker enforcement_feature_.InitAndDisableFeature(
1041*6777b538SAndroid Build Coastguard Worker features::kEnforceNoExecutableFileHandles);
1042*6777b538SAndroid Build Coastguard Worker }
1043*6777b538SAndroid Build Coastguard Worker }
1044*6777b538SAndroid Build Coastguard Worker
1045*6777b538SAndroid Build Coastguard Worker protected:
IsEnforcementEnabled()1046*6777b538SAndroid Build Coastguard Worker bool IsEnforcementEnabled() { return GetParam(); }
1047*6777b538SAndroid Build Coastguard Worker
1048*6777b538SAndroid Build Coastguard Worker private:
1049*6777b538SAndroid Build Coastguard Worker base::test::ScopedFeatureList enforcement_feature_;
1050*6777b538SAndroid Build Coastguard Worker };
1051*6777b538SAndroid Build Coastguard Worker
1052*6777b538SAndroid Build Coastguard Worker // This test verifies that if a file has been passed to `PreventExecuteMapping`
1053*6777b538SAndroid Build Coastguard Worker // and enforcement is enabled, then it cannot be mapped as executable into
1054*6777b538SAndroid Build Coastguard Worker // memory.
TEST_P(FileUtilExecuteEnforcementTest,Functional)1055*6777b538SAndroid Build Coastguard Worker TEST_P(FileUtilExecuteEnforcementTest, Functional) {
1056*6777b538SAndroid Build Coastguard Worker FilePath dir_exe;
1057*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathService::Get(DIR_EXE, &dir_exe));
1058*6777b538SAndroid Build Coastguard Worker // This DLL is built as part of base_unittests so is guaranteed to be present.
1059*6777b538SAndroid Build Coastguard Worker FilePath test_dll(dir_exe.Append(FPL("scoped_handle_test_dll.dll")));
1060*6777b538SAndroid Build Coastguard Worker
1061*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(base::PathExists(test_dll));
1062*6777b538SAndroid Build Coastguard Worker
1063*6777b538SAndroid Build Coastguard Worker FilePath dll_copy_path = temp_dir_.GetPath().Append(FPL("test.dll"));
1064*6777b538SAndroid Build Coastguard Worker
1065*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CopyFile(test_dll, dll_copy_path));
1066*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PreventExecuteMapping(dll_copy_path));
1067*6777b538SAndroid Build Coastguard Worker ScopedNativeLibrary module(dll_copy_path);
1068*6777b538SAndroid Build Coastguard Worker
1069*6777b538SAndroid Build Coastguard Worker // If enforcement is enabled, then `PreventExecuteMapping` will have prevented
1070*6777b538SAndroid Build Coastguard Worker // the load, and the module will be invalid.
1071*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(IsEnforcementEnabled(), !module.is_valid());
1072*6777b538SAndroid Build Coastguard Worker }
1073*6777b538SAndroid Build Coastguard Worker
1074*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(EnforcementEnabled,
1075*6777b538SAndroid Build Coastguard Worker FileUtilExecuteEnforcementTest,
1076*6777b538SAndroid Build Coastguard Worker ::testing::Values(true));
1077*6777b538SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(EnforcementDisabled,
1078*6777b538SAndroid Build Coastguard Worker FileUtilExecuteEnforcementTest,
1079*6777b538SAndroid Build Coastguard Worker ::testing::Values(false));
1080*6777b538SAndroid Build Coastguard Worker
1081*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
1082*6777b538SAndroid Build Coastguard Worker
1083*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX)
1084*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CreateAndReadSymlinks)1085*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateAndReadSymlinks) {
1086*6777b538SAndroid Build Coastguard Worker FilePath link_from = temp_dir_.GetPath().Append(FPL("from_file"));
1087*6777b538SAndroid Build Coastguard Worker FilePath link_to = temp_dir_.GetPath().Append(FPL("to_file"));
1088*6777b538SAndroid Build Coastguard Worker CreateTextFile(link_to, bogus_content);
1089*6777b538SAndroid Build Coastguard Worker
1090*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
1091*6777b538SAndroid Build Coastguard Worker << "Failed to create file symlink.";
1092*6777b538SAndroid Build Coastguard Worker
1093*6777b538SAndroid Build Coastguard Worker // If we created the link properly, we should be able to read the contents
1094*6777b538SAndroid Build Coastguard Worker // through it.
1095*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(bogus_content, ReadTextFile(link_from));
1096*6777b538SAndroid Build Coastguard Worker
1097*6777b538SAndroid Build Coastguard Worker FilePath result;
1098*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(ReadSymbolicLink(link_from, &result));
1099*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(link_to.value(), result.value());
1100*6777b538SAndroid Build Coastguard Worker
1101*6777b538SAndroid Build Coastguard Worker // Link to a directory.
1102*6777b538SAndroid Build Coastguard Worker link_from = temp_dir_.GetPath().Append(FPL("from_dir"));
1103*6777b538SAndroid Build Coastguard Worker link_to = temp_dir_.GetPath().Append(FPL("to_dir"));
1104*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(link_to));
1105*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
1106*6777b538SAndroid Build Coastguard Worker << "Failed to create directory symlink.";
1107*6777b538SAndroid Build Coastguard Worker
1108*6777b538SAndroid Build Coastguard Worker // Test failures.
1109*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CreateSymbolicLink(link_to, link_to));
1110*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadSymbolicLink(link_to, &result));
1111*6777b538SAndroid Build Coastguard Worker FilePath missing = temp_dir_.GetPath().Append(FPL("missing"));
1112*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadSymbolicLink(missing, &result));
1113*6777b538SAndroid Build Coastguard Worker }
1114*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CreateAndReadRelativeSymlinks)1115*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateAndReadRelativeSymlinks) {
1116*6777b538SAndroid Build Coastguard Worker FilePath link_from = temp_dir_.GetPath().Append(FPL("from_file"));
1117*6777b538SAndroid Build Coastguard Worker FilePath filename_link_to("to_file");
1118*6777b538SAndroid Build Coastguard Worker FilePath link_to = temp_dir_.GetPath().Append(filename_link_to);
1119*6777b538SAndroid Build Coastguard Worker FilePath link_from_in_subdir =
1120*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("subdir")).Append(FPL("from_file"));
1121*6777b538SAndroid Build Coastguard Worker FilePath link_to_in_subdir = FilePath(FPL("..")).Append(filename_link_to);
1122*6777b538SAndroid Build Coastguard Worker CreateTextFile(link_to, bogus_content);
1123*6777b538SAndroid Build Coastguard Worker
1124*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(link_from_in_subdir.DirName()));
1125*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(link_to_in_subdir, link_from_in_subdir));
1126*6777b538SAndroid Build Coastguard Worker
1127*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(filename_link_to, link_from))
1128*6777b538SAndroid Build Coastguard Worker << "Failed to create file symlink.";
1129*6777b538SAndroid Build Coastguard Worker
1130*6777b538SAndroid Build Coastguard Worker // If we created the link properly, we should be able to read the contents
1131*6777b538SAndroid Build Coastguard Worker // through it.
1132*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(bogus_content, ReadTextFile(link_from));
1133*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(bogus_content, ReadTextFile(link_from_in_subdir));
1134*6777b538SAndroid Build Coastguard Worker
1135*6777b538SAndroid Build Coastguard Worker FilePath result;
1136*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(ReadSymbolicLink(link_from, &result));
1137*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(filename_link_to.value(), result.value());
1138*6777b538SAndroid Build Coastguard Worker
1139*6777b538SAndroid Build Coastguard Worker std::optional<FilePath> absolute_link = ReadSymbolicLinkAbsolute(link_from);
1140*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(absolute_link);
1141*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(link_to.value(), absolute_link->value());
1142*6777b538SAndroid Build Coastguard Worker
1143*6777b538SAndroid Build Coastguard Worker absolute_link = ReadSymbolicLinkAbsolute(link_from_in_subdir);
1144*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(absolute_link);
1145*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(link_to.value(), absolute_link->value());
1146*6777b538SAndroid Build Coastguard Worker
1147*6777b538SAndroid Build Coastguard Worker // Link to a directory.
1148*6777b538SAndroid Build Coastguard Worker link_from = temp_dir_.GetPath().Append(FPL("from_dir"));
1149*6777b538SAndroid Build Coastguard Worker filename_link_to = FilePath("to_dir");
1150*6777b538SAndroid Build Coastguard Worker link_to = temp_dir_.GetPath().Append(filename_link_to);
1151*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(link_to));
1152*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(filename_link_to, link_from))
1153*6777b538SAndroid Build Coastguard Worker << "Failed to create relative directory symlink.";
1154*6777b538SAndroid Build Coastguard Worker
1155*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(ReadSymbolicLink(link_from, &result));
1156*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(filename_link_to.value(), result.value());
1157*6777b538SAndroid Build Coastguard Worker
1158*6777b538SAndroid Build Coastguard Worker absolute_link = ReadSymbolicLinkAbsolute(link_from);
1159*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(absolute_link);
1160*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(link_to.value(), absolute_link->value());
1161*6777b538SAndroid Build Coastguard Worker
1162*6777b538SAndroid Build Coastguard Worker // Test failures.
1163*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CreateSymbolicLink(link_to, link_to));
1164*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadSymbolicLink(link_to, &result));
1165*6777b538SAndroid Build Coastguard Worker }
1166*6777b538SAndroid Build Coastguard Worker
1167*6777b538SAndroid Build Coastguard Worker // The following test of NormalizeFilePath() require that we create a symlink.
1168*6777b538SAndroid Build Coastguard Worker // This can not be done on Windows before Vista. On Vista, creating a symlink
1169*6777b538SAndroid Build Coastguard Worker // requires privilege "SeCreateSymbolicLinkPrivilege".
1170*6777b538SAndroid Build Coastguard Worker // TODO(skerner): Investigate the possibility of giving base_unittests the
1171*6777b538SAndroid Build Coastguard Worker // privileges required to create a symlink.
TEST_F(FileUtilTest,NormalizeFilePathSymlinks)1172*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, NormalizeFilePathSymlinks) {
1173*6777b538SAndroid Build Coastguard Worker // Link one file to another.
1174*6777b538SAndroid Build Coastguard Worker FilePath link_from = temp_dir_.GetPath().Append(FPL("from_file"));
1175*6777b538SAndroid Build Coastguard Worker FilePath link_to = temp_dir_.GetPath().Append(FPL("to_file"));
1176*6777b538SAndroid Build Coastguard Worker CreateTextFile(link_to, bogus_content);
1177*6777b538SAndroid Build Coastguard Worker
1178*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
1179*6777b538SAndroid Build Coastguard Worker << "Failed to create file symlink.";
1180*6777b538SAndroid Build Coastguard Worker
1181*6777b538SAndroid Build Coastguard Worker // Check that NormalizeFilePath sees the link.
1182*6777b538SAndroid Build Coastguard Worker FilePath normalized_path;
1183*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(NormalizeFilePath(link_from, &normalized_path));
1184*6777b538SAndroid Build Coastguard Worker EXPECT_NE(link_from, link_to);
1185*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(link_to.BaseName().value(), normalized_path.BaseName().value());
1186*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(link_to.BaseName().value(), normalized_path.BaseName().value());
1187*6777b538SAndroid Build Coastguard Worker
1188*6777b538SAndroid Build Coastguard Worker // Link to a directory.
1189*6777b538SAndroid Build Coastguard Worker link_from = temp_dir_.GetPath().Append(FPL("from_dir"));
1190*6777b538SAndroid Build Coastguard Worker link_to = temp_dir_.GetPath().Append(FPL("to_dir"));
1191*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(link_to));
1192*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
1193*6777b538SAndroid Build Coastguard Worker << "Failed to create directory symlink.";
1194*6777b538SAndroid Build Coastguard Worker
1195*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(NormalizeFilePath(link_from, &normalized_path))
1196*6777b538SAndroid Build Coastguard Worker << "Links to directories should return false.";
1197*6777b538SAndroid Build Coastguard Worker
1198*6777b538SAndroid Build Coastguard Worker // Test that a loop in the links causes NormalizeFilePath() to return false.
1199*6777b538SAndroid Build Coastguard Worker link_from = temp_dir_.GetPath().Append(FPL("link_a"));
1200*6777b538SAndroid Build Coastguard Worker link_to = temp_dir_.GetPath().Append(FPL("link_b"));
1201*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
1202*6777b538SAndroid Build Coastguard Worker << "Failed to create loop symlink a.";
1203*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(link_from, link_to))
1204*6777b538SAndroid Build Coastguard Worker << "Failed to create loop symlink b.";
1205*6777b538SAndroid Build Coastguard Worker
1206*6777b538SAndroid Build Coastguard Worker // Infinite loop!
1207*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(NormalizeFilePath(link_from, &normalized_path));
1208*6777b538SAndroid Build Coastguard Worker }
1209*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,DeleteSymlinkToExistentFile)1210*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteSymlinkToExistentFile) {
1211*6777b538SAndroid Build Coastguard Worker // Create a file.
1212*6777b538SAndroid Build Coastguard Worker FilePath file_name = temp_dir_.GetPath().Append(FPL("Test DeleteFile 2.txt"));
1213*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name, bogus_content);
1214*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name));
1215*6777b538SAndroid Build Coastguard Worker
1216*6777b538SAndroid Build Coastguard Worker // Create a symlink to the file.
1217*6777b538SAndroid Build Coastguard Worker FilePath file_link = temp_dir_.GetPath().Append("file_link_2");
1218*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(file_name, file_link))
1219*6777b538SAndroid Build Coastguard Worker << "Failed to create symlink.";
1220*6777b538SAndroid Build Coastguard Worker
1221*6777b538SAndroid Build Coastguard Worker // Delete the symbolic link.
1222*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(file_link));
1223*6777b538SAndroid Build Coastguard Worker
1224*6777b538SAndroid Build Coastguard Worker // Make sure original file is not deleted.
1225*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_link));
1226*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name));
1227*6777b538SAndroid Build Coastguard Worker }
1228*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,DeleteSymlinkToNonExistentFile)1229*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteSymlinkToNonExistentFile) {
1230*6777b538SAndroid Build Coastguard Worker // Create a non-existent file path.
1231*6777b538SAndroid Build Coastguard Worker FilePath non_existent =
1232*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("Test DeleteFile 3.txt"));
1233*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(non_existent));
1234*6777b538SAndroid Build Coastguard Worker
1235*6777b538SAndroid Build Coastguard Worker // Create a symlink to the non-existent file.
1236*6777b538SAndroid Build Coastguard Worker FilePath file_link = temp_dir_.GetPath().Append("file_link_3");
1237*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(non_existent, file_link))
1238*6777b538SAndroid Build Coastguard Worker << "Failed to create symlink.";
1239*6777b538SAndroid Build Coastguard Worker
1240*6777b538SAndroid Build Coastguard Worker // Make sure the symbolic link is exist.
1241*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsLink(file_link));
1242*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_link));
1243*6777b538SAndroid Build Coastguard Worker
1244*6777b538SAndroid Build Coastguard Worker // Delete the symbolic link.
1245*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(file_link));
1246*6777b538SAndroid Build Coastguard Worker
1247*6777b538SAndroid Build Coastguard Worker // Make sure the symbolic link is deleted.
1248*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(IsLink(file_link));
1249*6777b538SAndroid Build Coastguard Worker }
1250*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFileFollowsSymlinks)1251*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileFollowsSymlinks) {
1252*6777b538SAndroid Build Coastguard Worker FilePath link_from = temp_dir_.GetPath().Append(FPL("from_file"));
1253*6777b538SAndroid Build Coastguard Worker FilePath link_to = temp_dir_.GetPath().Append(FPL("to_file"));
1254*6777b538SAndroid Build Coastguard Worker CreateTextFile(link_to, bogus_content);
1255*6777b538SAndroid Build Coastguard Worker
1256*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(link_to, link_from));
1257*6777b538SAndroid Build Coastguard Worker
1258*6777b538SAndroid Build Coastguard Worker // If we created the link properly, we should be able to read the contents
1259*6777b538SAndroid Build Coastguard Worker // through it.
1260*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(bogus_content, ReadTextFile(link_from));
1261*6777b538SAndroid Build Coastguard Worker
1262*6777b538SAndroid Build Coastguard Worker FilePath result;
1263*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(ReadSymbolicLink(link_from, &result));
1264*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(link_to.value(), result.value());
1265*6777b538SAndroid Build Coastguard Worker
1266*6777b538SAndroid Build Coastguard Worker // Create another file and copy it to |link_from|.
1267*6777b538SAndroid Build Coastguard Worker FilePath src_file = temp_dir_.GetPath().Append(FPL("src.txt"));
1268*6777b538SAndroid Build Coastguard Worker const std::wstring file_contents(L"Gooooooooooooooooooooogle");
1269*6777b538SAndroid Build Coastguard Worker CreateTextFile(src_file, file_contents);
1270*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CopyFile(src_file, link_from));
1271*6777b538SAndroid Build Coastguard Worker
1272*6777b538SAndroid Build Coastguard Worker // Make sure |link_from| is still a symlink, and |link_to| has been written to
1273*6777b538SAndroid Build Coastguard Worker // by CopyFile().
1274*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsLink(link_from));
1275*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file_contents, ReadTextFile(link_from));
1276*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file_contents, ReadTextFile(link_to));
1277*6777b538SAndroid Build Coastguard Worker }
1278*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ChangeFilePermissionsAndRead)1279*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ChangeFilePermissionsAndRead) {
1280*6777b538SAndroid Build Coastguard Worker // Create a file path.
1281*6777b538SAndroid Build Coastguard Worker FilePath file_name =
1282*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("Test Readable File.txt"));
1283*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name));
1284*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathIsReadable(file_name));
1285*6777b538SAndroid Build Coastguard Worker
1286*6777b538SAndroid Build Coastguard Worker static constexpr char kData[] = "hello";
1287*6777b538SAndroid Build Coastguard Worker static constexpr int kDataSize = sizeof(kData) - 1;
1288*6777b538SAndroid Build Coastguard Worker char buffer[kDataSize];
1289*6777b538SAndroid Build Coastguard Worker
1290*6777b538SAndroid Build Coastguard Worker // Write file.
1291*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(WriteFile(file_name, kData));
1292*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name));
1293*6777b538SAndroid Build Coastguard Worker
1294*6777b538SAndroid Build Coastguard Worker // Make sure the file is readable.
1295*6777b538SAndroid Build Coastguard Worker int32_t mode = 0;
1296*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
1297*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(mode & FILE_PERMISSION_READ_BY_USER);
1298*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathIsReadable(file_name));
1299*6777b538SAndroid Build Coastguard Worker
1300*6777b538SAndroid Build Coastguard Worker // Get rid of the read permission.
1301*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SetPosixFilePermissions(file_name, 0u));
1302*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
1303*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(mode & FILE_PERMISSION_READ_BY_USER);
1304*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathIsReadable(file_name));
1305*6777b538SAndroid Build Coastguard Worker // Make sure the file can't be read.
1306*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadFile(file_name, buffer), std::nullopt);
1307*6777b538SAndroid Build Coastguard Worker
1308*6777b538SAndroid Build Coastguard Worker // Give the read permission.
1309*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SetPosixFilePermissions(file_name, FILE_PERMISSION_READ_BY_USER));
1310*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
1311*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(mode & FILE_PERMISSION_READ_BY_USER);
1312*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathIsReadable(file_name));
1313*6777b538SAndroid Build Coastguard Worker // Make sure the file can be read.
1314*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadFile(file_name, buffer), kDataSize);
1315*6777b538SAndroid Build Coastguard Worker
1316*6777b538SAndroid Build Coastguard Worker // Delete the file.
1317*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(file_name));
1318*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name));
1319*6777b538SAndroid Build Coastguard Worker }
1320*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ChangeFilePermissionsAndWrite)1321*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ChangeFilePermissionsAndWrite) {
1322*6777b538SAndroid Build Coastguard Worker // Create a file path.
1323*6777b538SAndroid Build Coastguard Worker FilePath file_name =
1324*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("Test Readable File.txt"));
1325*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name));
1326*6777b538SAndroid Build Coastguard Worker
1327*6777b538SAndroid Build Coastguard Worker const std::string kData("hello");
1328*6777b538SAndroid Build Coastguard Worker
1329*6777b538SAndroid Build Coastguard Worker // Write file.
1330*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(WriteFile(file_name, kData));
1331*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name));
1332*6777b538SAndroid Build Coastguard Worker
1333*6777b538SAndroid Build Coastguard Worker // Make sure the file is writable.
1334*6777b538SAndroid Build Coastguard Worker int mode = 0;
1335*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
1336*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(mode & FILE_PERMISSION_WRITE_BY_USER);
1337*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathIsWritable(file_name));
1338*6777b538SAndroid Build Coastguard Worker
1339*6777b538SAndroid Build Coastguard Worker // Get rid of the write permission.
1340*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SetPosixFilePermissions(file_name, 0u));
1341*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
1342*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(mode & FILE_PERMISSION_WRITE_BY_USER);
1343*6777b538SAndroid Build Coastguard Worker // Make sure the file can't be write.
1344*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(WriteFile(file_name, kData));
1345*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathIsWritable(file_name));
1346*6777b538SAndroid Build Coastguard Worker
1347*6777b538SAndroid Build Coastguard Worker // Give read permission.
1348*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SetPosixFilePermissions(file_name,
1349*6777b538SAndroid Build Coastguard Worker FILE_PERMISSION_WRITE_BY_USER));
1350*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
1351*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(mode & FILE_PERMISSION_WRITE_BY_USER);
1352*6777b538SAndroid Build Coastguard Worker // Make sure the file can be write.
1353*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(WriteFile(file_name, kData));
1354*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathIsWritable(file_name));
1355*6777b538SAndroid Build Coastguard Worker
1356*6777b538SAndroid Build Coastguard Worker // Delete the file.
1357*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(file_name));
1358*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name));
1359*6777b538SAndroid Build Coastguard Worker }
1360*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ChangeDirectoryPermissionsAndEnumerate)1361*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ChangeDirectoryPermissionsAndEnumerate) {
1362*6777b538SAndroid Build Coastguard Worker // Create a directory path.
1363*6777b538SAndroid Build Coastguard Worker FilePath subdir_path = temp_dir_.GetPath().Append(FPL("PermissionTest1"));
1364*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_path);
1365*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_path));
1366*6777b538SAndroid Build Coastguard Worker
1367*6777b538SAndroid Build Coastguard Worker // Create a dummy file to enumerate.
1368*6777b538SAndroid Build Coastguard Worker FilePath file_name = subdir_path.Append(FPL("Test Readable File.txt"));
1369*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name));
1370*6777b538SAndroid Build Coastguard Worker const std::string kData("hello");
1371*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(WriteFile(file_name, kData));
1372*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name));
1373*6777b538SAndroid Build Coastguard Worker
1374*6777b538SAndroid Build Coastguard Worker // Make sure the directory has the all permissions.
1375*6777b538SAndroid Build Coastguard Worker int mode = 0;
1376*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GetPosixFilePermissions(subdir_path, &mode));
1377*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(FILE_PERMISSION_USER_MASK, mode & FILE_PERMISSION_USER_MASK);
1378*6777b538SAndroid Build Coastguard Worker
1379*6777b538SAndroid Build Coastguard Worker // Get rid of the permissions from the directory.
1380*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SetPosixFilePermissions(subdir_path, 0u));
1381*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GetPosixFilePermissions(subdir_path, &mode));
1382*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(mode & FILE_PERMISSION_USER_MASK);
1383*6777b538SAndroid Build Coastguard Worker
1384*6777b538SAndroid Build Coastguard Worker // Make sure the file in the directory can't be enumerated.
1385*6777b538SAndroid Build Coastguard Worker FileEnumerator f1(subdir_path, true, FileEnumerator::FILES);
1386*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(subdir_path));
1387*6777b538SAndroid Build Coastguard Worker FindResultCollector c1(&f1);
1388*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, c1.size());
1389*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GetPosixFilePermissions(file_name, &mode));
1390*6777b538SAndroid Build Coastguard Worker
1391*6777b538SAndroid Build Coastguard Worker // Give the permissions to the directory.
1392*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SetPosixFilePermissions(subdir_path, FILE_PERMISSION_USER_MASK));
1393*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GetPosixFilePermissions(subdir_path, &mode));
1394*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(FILE_PERMISSION_USER_MASK, mode & FILE_PERMISSION_USER_MASK);
1395*6777b538SAndroid Build Coastguard Worker
1396*6777b538SAndroid Build Coastguard Worker // Make sure the file in the directory can be enumerated.
1397*6777b538SAndroid Build Coastguard Worker FileEnumerator f2(subdir_path, true, FileEnumerator::FILES);
1398*6777b538SAndroid Build Coastguard Worker FindResultCollector c2(&f2);
1399*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c2.HasFile(file_name));
1400*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(1, c2.size());
1401*6777b538SAndroid Build Coastguard Worker
1402*6777b538SAndroid Build Coastguard Worker // Delete the file.
1403*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeletePathRecursively(subdir_path));
1404*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(subdir_path));
1405*6777b538SAndroid Build Coastguard Worker }
1406*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ExecutableExistsInPath)1407*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ExecutableExistsInPath) {
1408*6777b538SAndroid Build Coastguard Worker // Create two directories that we will put in our PATH
1409*6777b538SAndroid Build Coastguard Worker const FilePath::CharType kDir1[] = FPL("dir1");
1410*6777b538SAndroid Build Coastguard Worker const FilePath::CharType kDir2[] = FPL("dir2");
1411*6777b538SAndroid Build Coastguard Worker
1412*6777b538SAndroid Build Coastguard Worker FilePath dir1 = temp_dir_.GetPath().Append(kDir1);
1413*6777b538SAndroid Build Coastguard Worker FilePath dir2 = temp_dir_.GetPath().Append(kDir2);
1414*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir1));
1415*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir2));
1416*6777b538SAndroid Build Coastguard Worker
1417*6777b538SAndroid Build Coastguard Worker ScopedEnvironmentVariableOverride scoped_env(
1418*6777b538SAndroid Build Coastguard Worker "PATH", dir1.value() + ":" + dir2.value());
1419*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(scoped_env.IsOverridden());
1420*6777b538SAndroid Build Coastguard Worker
1421*6777b538SAndroid Build Coastguard Worker const FilePath::CharType kRegularFileName[] = FPL("regular_file");
1422*6777b538SAndroid Build Coastguard Worker const FilePath::CharType kExeFileName[] = FPL("exe");
1423*6777b538SAndroid Build Coastguard Worker const FilePath::CharType kDneFileName[] = FPL("does_not_exist");
1424*6777b538SAndroid Build Coastguard Worker
1425*6777b538SAndroid Build Coastguard Worker const FilePath kExePath = dir1.Append(kExeFileName);
1426*6777b538SAndroid Build Coastguard Worker const FilePath kRegularFilePath = dir2.Append(kRegularFileName);
1427*6777b538SAndroid Build Coastguard Worker
1428*6777b538SAndroid Build Coastguard Worker // Write file.
1429*6777b538SAndroid Build Coastguard Worker const std::string kData("hello");
1430*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WriteFile(kExePath, kData));
1431*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(kExePath));
1432*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WriteFile(kRegularFilePath, kData));
1433*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(kRegularFilePath));
1434*6777b538SAndroid Build Coastguard Worker
1435*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetPosixFilePermissions(dir1.Append(kExeFileName),
1436*6777b538SAndroid Build Coastguard Worker FILE_PERMISSION_EXECUTE_BY_USER));
1437*6777b538SAndroid Build Coastguard Worker
1438*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ExecutableExistsInPath(scoped_env.GetEnv(), kExeFileName));
1439*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ExecutableExistsInPath(scoped_env.GetEnv(), kRegularFileName));
1440*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ExecutableExistsInPath(scoped_env.GetEnv(), kDneFileName));
1441*6777b538SAndroid Build Coastguard Worker }
1442*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryPermissions)1443*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryPermissions) {
1444*6777b538SAndroid Build Coastguard Worker // Create a directory.
1445*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
1446*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1447*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
1448*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
1449*6777b538SAndroid Build Coastguard Worker
1450*6777b538SAndroid Build Coastguard Worker // Create some regular files under the directory with various permissions.
1451*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
1452*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
1453*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Mordecai");
1454*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
1455*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetPosixFilePermissions(file_name_from, 0755));
1456*6777b538SAndroid Build Coastguard Worker
1457*6777b538SAndroid Build Coastguard Worker FilePath file2_name_from =
1458*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Reggy-2.txt"));
1459*6777b538SAndroid Build Coastguard Worker CreateTextFile(file2_name_from, L"Rigby");
1460*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file2_name_from));
1461*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetPosixFilePermissions(file2_name_from, 0777));
1462*6777b538SAndroid Build Coastguard Worker
1463*6777b538SAndroid Build Coastguard Worker FilePath file3_name_from =
1464*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Reggy-3.txt"));
1465*6777b538SAndroid Build Coastguard Worker CreateTextFile(file3_name_from, L"Benson");
1466*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file3_name_from));
1467*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetPosixFilePermissions(file3_name_from, 0400));
1468*6777b538SAndroid Build Coastguard Worker
1469*6777b538SAndroid Build Coastguard Worker // Copy the directory recursively.
1470*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
1471*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1472*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
1473*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
1474*6777b538SAndroid Build Coastguard Worker FilePath file2_name_to =
1475*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Reggy-2.txt"));
1476*6777b538SAndroid Build Coastguard Worker FilePath file3_name_to =
1477*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Reggy-3.txt"));
1478*6777b538SAndroid Build Coastguard Worker
1479*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(dir_name_to));
1480*6777b538SAndroid Build Coastguard Worker
1481*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, true));
1482*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
1483*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file2_name_to));
1484*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file3_name_to));
1485*6777b538SAndroid Build Coastguard Worker
1486*6777b538SAndroid Build Coastguard Worker int mode = 0;
1487*6777b538SAndroid Build Coastguard Worker int expected_mode;
1488*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(file_name_to, &mode));
1489*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
1490*6777b538SAndroid Build Coastguard Worker expected_mode = 0755;
1491*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_CHROMEOS)
1492*6777b538SAndroid Build Coastguard Worker expected_mode = 0644;
1493*6777b538SAndroid Build Coastguard Worker #else
1494*6777b538SAndroid Build Coastguard Worker expected_mode = 0600;
1495*6777b538SAndroid Build Coastguard Worker #endif
1496*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_mode, mode);
1497*6777b538SAndroid Build Coastguard Worker
1498*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(file2_name_to, &mode));
1499*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
1500*6777b538SAndroid Build Coastguard Worker expected_mode = 0755;
1501*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_CHROMEOS)
1502*6777b538SAndroid Build Coastguard Worker expected_mode = 0644;
1503*6777b538SAndroid Build Coastguard Worker #else
1504*6777b538SAndroid Build Coastguard Worker expected_mode = 0600;
1505*6777b538SAndroid Build Coastguard Worker #endif
1506*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_mode, mode);
1507*6777b538SAndroid Build Coastguard Worker
1508*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(file3_name_to, &mode));
1509*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
1510*6777b538SAndroid Build Coastguard Worker expected_mode = 0600;
1511*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_CHROMEOS)
1512*6777b538SAndroid Build Coastguard Worker expected_mode = 0644;
1513*6777b538SAndroid Build Coastguard Worker #else
1514*6777b538SAndroid Build Coastguard Worker expected_mode = 0600;
1515*6777b538SAndroid Build Coastguard Worker #endif
1516*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_mode, mode);
1517*6777b538SAndroid Build Coastguard Worker }
1518*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryPermissionsOverExistingFile)1519*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryPermissionsOverExistingFile) {
1520*6777b538SAndroid Build Coastguard Worker // Create a directory.
1521*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
1522*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1523*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
1524*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
1525*6777b538SAndroid Build Coastguard Worker
1526*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
1527*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
1528*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
1529*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Mordecai");
1530*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
1531*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetPosixFilePermissions(file_name_from, 0644));
1532*6777b538SAndroid Build Coastguard Worker
1533*6777b538SAndroid Build Coastguard Worker // Create a directory.
1534*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
1535*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1536*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_to);
1537*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
1538*6777b538SAndroid Build Coastguard Worker
1539*6777b538SAndroid Build Coastguard Worker // Create a file under the directory with wider permissions.
1540*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
1541*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
1542*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_to, L"Rigby");
1543*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
1544*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetPosixFilePermissions(file_name_to, 0777));
1545*6777b538SAndroid Build Coastguard Worker
1546*6777b538SAndroid Build Coastguard Worker // Ensure that when we copy the directory, the file contents are copied
1547*6777b538SAndroid Build Coastguard Worker // but the permissions on the destination are left alone.
1548*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
1549*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
1550*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(L"Mordecai", ReadTextFile(file_name_to));
1551*6777b538SAndroid Build Coastguard Worker
1552*6777b538SAndroid Build Coastguard Worker int mode = 0;
1553*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(file_name_to, &mode));
1554*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0777, mode);
1555*6777b538SAndroid Build Coastguard Worker }
1556*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryExclDoesNotOverwrite)1557*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclDoesNotOverwrite) {
1558*6777b538SAndroid Build Coastguard Worker // Create source directory.
1559*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
1560*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1561*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
1562*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
1563*6777b538SAndroid Build Coastguard Worker
1564*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
1565*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
1566*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
1567*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Mordecai");
1568*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
1569*6777b538SAndroid Build Coastguard Worker
1570*6777b538SAndroid Build Coastguard Worker // Create destination directory.
1571*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
1572*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1573*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_to);
1574*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
1575*6777b538SAndroid Build Coastguard Worker
1576*6777b538SAndroid Build Coastguard Worker // Create a file under the directory with the same name.
1577*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = dir_name_to.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
1578*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_to, L"Rigby");
1579*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
1580*6777b538SAndroid Build Coastguard Worker
1581*6777b538SAndroid Build Coastguard Worker // Ensure that copying failed and the file was not overwritten.
1582*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
1583*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
1584*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(L"Rigby", ReadTextFile(file_name_to));
1585*6777b538SAndroid Build Coastguard Worker }
1586*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryExclDirectoryOverExistingFile)1587*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverExistingFile) {
1588*6777b538SAndroid Build Coastguard Worker // Create source directory.
1589*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
1590*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1591*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
1592*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
1593*6777b538SAndroid Build Coastguard Worker
1594*6777b538SAndroid Build Coastguard Worker // Create a subdirectory.
1595*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
1596*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_name_from);
1597*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_name_from));
1598*6777b538SAndroid Build Coastguard Worker
1599*6777b538SAndroid Build Coastguard Worker // Create destination directory.
1600*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
1601*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1602*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_to);
1603*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
1604*6777b538SAndroid Build Coastguard Worker
1605*6777b538SAndroid Build Coastguard Worker // Create a regular file under the directory with the same name.
1606*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = dir_name_to.Append(FILE_PATH_LITERAL("Subsub"));
1607*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_to, L"Rigby");
1608*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
1609*6777b538SAndroid Build Coastguard Worker
1610*6777b538SAndroid Build Coastguard Worker // Ensure that copying failed and the file was not overwritten.
1611*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
1612*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
1613*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(L"Rigby", ReadTextFile(file_name_to));
1614*6777b538SAndroid Build Coastguard Worker }
1615*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryExclDirectoryOverExistingDirectory)1616*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverExistingDirectory) {
1617*6777b538SAndroid Build Coastguard Worker // Create source directory.
1618*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
1619*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1620*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
1621*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
1622*6777b538SAndroid Build Coastguard Worker
1623*6777b538SAndroid Build Coastguard Worker // Create a subdirectory.
1624*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
1625*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_name_from);
1626*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_name_from));
1627*6777b538SAndroid Build Coastguard Worker
1628*6777b538SAndroid Build Coastguard Worker // Create destination directory.
1629*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
1630*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1631*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_to);
1632*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
1633*6777b538SAndroid Build Coastguard Worker
1634*6777b538SAndroid Build Coastguard Worker // Create a subdirectory under the directory with the same name.
1635*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_to = dir_name_to.Append(FILE_PATH_LITERAL("Subsub"));
1636*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_name_to);
1637*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_name_to));
1638*6777b538SAndroid Build Coastguard Worker
1639*6777b538SAndroid Build Coastguard Worker // Ensure that copying failed and the file was not overwritten.
1640*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
1641*6777b538SAndroid Build Coastguard Worker }
1642*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFileExecutablePermission)1643*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileExecutablePermission) {
1644*6777b538SAndroid Build Coastguard Worker FilePath src = temp_dir_.GetPath().Append(FPL("src.txt"));
1645*6777b538SAndroid Build Coastguard Worker const std::wstring file_contents(L"Gooooooooooooooooooooogle");
1646*6777b538SAndroid Build Coastguard Worker CreateTextFile(src, file_contents);
1647*6777b538SAndroid Build Coastguard Worker
1648*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetPosixFilePermissions(src, 0755));
1649*6777b538SAndroid Build Coastguard Worker int mode = 0;
1650*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(src, &mode));
1651*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0755, mode);
1652*6777b538SAndroid Build Coastguard Worker
1653*6777b538SAndroid Build Coastguard Worker FilePath dst = temp_dir_.GetPath().Append(FPL("dst.txt"));
1654*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CopyFile(src, dst));
1655*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file_contents, ReadTextFile(dst));
1656*6777b538SAndroid Build Coastguard Worker
1657*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
1658*6777b538SAndroid Build Coastguard Worker int expected_mode;
1659*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
1660*6777b538SAndroid Build Coastguard Worker expected_mode = 0755;
1661*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_CHROMEOS)
1662*6777b538SAndroid Build Coastguard Worker expected_mode = 0644;
1663*6777b538SAndroid Build Coastguard Worker #else
1664*6777b538SAndroid Build Coastguard Worker expected_mode = 0600;
1665*6777b538SAndroid Build Coastguard Worker #endif
1666*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_mode, mode);
1667*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DeleteFile(dst));
1668*6777b538SAndroid Build Coastguard Worker
1669*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetPosixFilePermissions(src, 0777));
1670*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(src, &mode));
1671*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0777, mode);
1672*6777b538SAndroid Build Coastguard Worker
1673*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CopyFile(src, dst));
1674*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file_contents, ReadTextFile(dst));
1675*6777b538SAndroid Build Coastguard Worker
1676*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
1677*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
1678*6777b538SAndroid Build Coastguard Worker expected_mode = 0755;
1679*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_CHROMEOS)
1680*6777b538SAndroid Build Coastguard Worker expected_mode = 0644;
1681*6777b538SAndroid Build Coastguard Worker #else
1682*6777b538SAndroid Build Coastguard Worker expected_mode = 0600;
1683*6777b538SAndroid Build Coastguard Worker #endif
1684*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_mode, mode);
1685*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DeleteFile(dst));
1686*6777b538SAndroid Build Coastguard Worker
1687*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetPosixFilePermissions(src, 0400));
1688*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(src, &mode));
1689*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0400, mode);
1690*6777b538SAndroid Build Coastguard Worker
1691*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CopyFile(src, dst));
1692*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file_contents, ReadTextFile(dst));
1693*6777b538SAndroid Build Coastguard Worker
1694*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
1695*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_APPLE)
1696*6777b538SAndroid Build Coastguard Worker expected_mode = 0600;
1697*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_CHROMEOS)
1698*6777b538SAndroid Build Coastguard Worker expected_mode = 0644;
1699*6777b538SAndroid Build Coastguard Worker #else
1700*6777b538SAndroid Build Coastguard Worker expected_mode = 0600;
1701*6777b538SAndroid Build Coastguard Worker #endif
1702*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_mode, mode);
1703*6777b538SAndroid Build Coastguard Worker
1704*6777b538SAndroid Build Coastguard Worker // This time, do not delete |dst|. Instead set its permissions to 0777.
1705*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(SetPosixFilePermissions(dst, 0777));
1706*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
1707*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0777, mode);
1708*6777b538SAndroid Build Coastguard Worker
1709*6777b538SAndroid Build Coastguard Worker // Overwrite it and check the permissions again.
1710*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CopyFile(src, dst));
1711*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file_contents, ReadTextFile(dst));
1712*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
1713*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0777, mode);
1714*6777b538SAndroid Build Coastguard Worker }
1715*6777b538SAndroid Build Coastguard Worker
1716*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_POSIX)
1717*6777b538SAndroid Build Coastguard Worker
1718*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_FUCHSIA)
1719*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFileACL)1720*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileACL) {
1721*6777b538SAndroid Build Coastguard Worker // While FileUtilTest.CopyFile asserts the content is correctly copied over,
1722*6777b538SAndroid Build Coastguard Worker // this test case asserts the access control bits are meeting expectations in
1723*6777b538SAndroid Build Coastguard Worker // CopyFile().
1724*6777b538SAndroid Build Coastguard Worker FilePath src = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("src.txt"));
1725*6777b538SAndroid Build Coastguard Worker const std::wstring file_contents(L"Gooooooooooooooooooooogle");
1726*6777b538SAndroid Build Coastguard Worker CreateTextFile(src, file_contents);
1727*6777b538SAndroid Build Coastguard Worker
1728*6777b538SAndroid Build Coastguard Worker // Set the source file to read-only.
1729*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(IsReadOnly(src));
1730*6777b538SAndroid Build Coastguard Worker SetReadOnly(src, true);
1731*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(IsReadOnly(src));
1732*6777b538SAndroid Build Coastguard Worker
1733*6777b538SAndroid Build Coastguard Worker // Copy the file.
1734*6777b538SAndroid Build Coastguard Worker FilePath dst = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("dst.txt"));
1735*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CopyFile(src, dst));
1736*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file_contents, ReadTextFile(dst));
1737*6777b538SAndroid Build Coastguard Worker
1738*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(IsReadOnly(dst));
1739*6777b538SAndroid Build Coastguard Worker }
1740*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryACL)1741*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryACL) {
1742*6777b538SAndroid Build Coastguard Worker // Create source directories.
1743*6777b538SAndroid Build Coastguard Worker FilePath src = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("src"));
1744*6777b538SAndroid Build Coastguard Worker FilePath src_subdir = src.Append(FILE_PATH_LITERAL("subdir"));
1745*6777b538SAndroid Build Coastguard Worker CreateDirectory(src_subdir);
1746*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(src_subdir));
1747*6777b538SAndroid Build Coastguard Worker
1748*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
1749*6777b538SAndroid Build Coastguard Worker FilePath src_file = src.Append(FILE_PATH_LITERAL("src.txt"));
1750*6777b538SAndroid Build Coastguard Worker CreateTextFile(src_file, L"Gooooooooooooooooooooogle");
1751*6777b538SAndroid Build Coastguard Worker SetReadOnly(src_file, true);
1752*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(IsReadOnly(src_file));
1753*6777b538SAndroid Build Coastguard Worker
1754*6777b538SAndroid Build Coastguard Worker // Make directory read-only.
1755*6777b538SAndroid Build Coastguard Worker SetReadOnly(src_subdir, true);
1756*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(IsReadOnly(src_subdir));
1757*6777b538SAndroid Build Coastguard Worker
1758*6777b538SAndroid Build Coastguard Worker // Copy the directory recursively.
1759*6777b538SAndroid Build Coastguard Worker FilePath dst = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("dst"));
1760*6777b538SAndroid Build Coastguard Worker FilePath dst_file = dst.Append(FILE_PATH_LITERAL("src.txt"));
1761*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(src, dst, true));
1762*6777b538SAndroid Build Coastguard Worker
1763*6777b538SAndroid Build Coastguard Worker FilePath dst_subdir = dst.Append(FILE_PATH_LITERAL("subdir"));
1764*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(IsReadOnly(dst_subdir));
1765*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(IsReadOnly(dst_file));
1766*6777b538SAndroid Build Coastguard Worker
1767*6777b538SAndroid Build Coastguard Worker // Give write permissions to allow deletion.
1768*6777b538SAndroid Build Coastguard Worker SetReadOnly(src_subdir, false);
1769*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(IsReadOnly(src_subdir));
1770*6777b538SAndroid Build Coastguard Worker }
1771*6777b538SAndroid Build Coastguard Worker
1772*6777b538SAndroid Build Coastguard Worker #endif // !BUILDFLAG(IS_FUCHSIA)
1773*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,DeleteNonExistent)1774*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteNonExistent) {
1775*6777b538SAndroid Build Coastguard Worker FilePath non_existent =
1776*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().AppendASCII("bogus_file_dne.foobar");
1777*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(non_existent));
1778*6777b538SAndroid Build Coastguard Worker
1779*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(non_existent));
1780*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(non_existent));
1781*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeletePathRecursively(non_existent));
1782*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(non_existent));
1783*6777b538SAndroid Build Coastguard Worker }
1784*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,DeleteNonExistentWithNonExistentParent)1785*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteNonExistentWithNonExistentParent) {
1786*6777b538SAndroid Build Coastguard Worker FilePath non_existent = temp_dir_.GetPath().AppendASCII("bogus_topdir");
1787*6777b538SAndroid Build Coastguard Worker non_existent = non_existent.AppendASCII("bogus_subdir");
1788*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(non_existent));
1789*6777b538SAndroid Build Coastguard Worker
1790*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(non_existent));
1791*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(non_existent));
1792*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeletePathRecursively(non_existent));
1793*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(non_existent));
1794*6777b538SAndroid Build Coastguard Worker }
1795*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,DeleteFile)1796*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteFile) {
1797*6777b538SAndroid Build Coastguard Worker // Create a file
1798*6777b538SAndroid Build Coastguard Worker FilePath file_name = temp_dir_.GetPath().Append(FPL("Test DeleteFile 1.txt"));
1799*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name, bogus_content);
1800*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name));
1801*6777b538SAndroid Build Coastguard Worker
1802*6777b538SAndroid Build Coastguard Worker // Make sure it's deleted
1803*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(file_name));
1804*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name));
1805*6777b538SAndroid Build Coastguard Worker
1806*6777b538SAndroid Build Coastguard Worker // Test recursive case, create a new file
1807*6777b538SAndroid Build Coastguard Worker file_name = temp_dir_.GetPath().Append(FPL("Test DeleteFile 2.txt"));
1808*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name, bogus_content);
1809*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name));
1810*6777b538SAndroid Build Coastguard Worker
1811*6777b538SAndroid Build Coastguard Worker // Make sure it's deleted
1812*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeletePathRecursively(file_name));
1813*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name));
1814*6777b538SAndroid Build Coastguard Worker }
1815*6777b538SAndroid Build Coastguard Worker
1816*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
TEST_F(FileUtilTest,DeleteContentUri)1817*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteContentUri) {
1818*6777b538SAndroid Build Coastguard Worker // Get the path to the test file.
1819*6777b538SAndroid Build Coastguard Worker FilePath data_dir;
1820*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
1821*6777b538SAndroid Build Coastguard Worker data_dir = data_dir.Append(FPL("file_util"));
1822*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(data_dir));
1823*6777b538SAndroid Build Coastguard Worker FilePath image_file = data_dir.Append(FPL("red.png"));
1824*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(image_file));
1825*6777b538SAndroid Build Coastguard Worker
1826*6777b538SAndroid Build Coastguard Worker // Make a copy (we don't want to delete the original red.png when deleting the
1827*6777b538SAndroid Build Coastguard Worker // content URI).
1828*6777b538SAndroid Build Coastguard Worker FilePath image_copy = data_dir.Append(FPL("redcopy.png"));
1829*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CopyFile(image_file, image_copy));
1830*6777b538SAndroid Build Coastguard Worker
1831*6777b538SAndroid Build Coastguard Worker // Insert the image into MediaStore and get a content URI.
1832*6777b538SAndroid Build Coastguard Worker FilePath uri_path = InsertImageIntoMediaStore(image_copy);
1833*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(uri_path.IsContentUri());
1834*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(uri_path));
1835*6777b538SAndroid Build Coastguard Worker
1836*6777b538SAndroid Build Coastguard Worker // Try deleting the content URI.
1837*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(uri_path));
1838*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(image_copy));
1839*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(uri_path));
1840*6777b538SAndroid Build Coastguard Worker }
1841*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_ANDROID)
1842*6777b538SAndroid Build Coastguard Worker
1843*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
1844*6777b538SAndroid Build Coastguard Worker // Tests that the Delete function works for wild cards, especially
1845*6777b538SAndroid Build Coastguard Worker // with the recursion flag. Also coincidentally tests PathExists.
1846*6777b538SAndroid Build Coastguard Worker // TODO(erikkay): see if anyone's actually using this feature of the API
TEST_F(FileUtilTest,DeleteWildCard)1847*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteWildCard) {
1848*6777b538SAndroid Build Coastguard Worker // Create a file and a directory
1849*6777b538SAndroid Build Coastguard Worker FilePath file_name =
1850*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("Test DeleteWildCard.txt"));
1851*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name, bogus_content);
1852*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name));
1853*6777b538SAndroid Build Coastguard Worker
1854*6777b538SAndroid Build Coastguard Worker FilePath subdir_path = temp_dir_.GetPath().Append(FPL("DeleteWildCardDir"));
1855*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_path);
1856*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_path));
1857*6777b538SAndroid Build Coastguard Worker
1858*6777b538SAndroid Build Coastguard Worker // Create the wildcard path
1859*6777b538SAndroid Build Coastguard Worker FilePath directory_contents = temp_dir_.GetPath();
1860*6777b538SAndroid Build Coastguard Worker directory_contents = directory_contents.Append(FPL("*"));
1861*6777b538SAndroid Build Coastguard Worker
1862*6777b538SAndroid Build Coastguard Worker // Delete non-recursively and check that only the file is deleted
1863*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(directory_contents));
1864*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name));
1865*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(subdir_path));
1866*6777b538SAndroid Build Coastguard Worker
1867*6777b538SAndroid Build Coastguard Worker // Delete recursively and make sure all contents are deleted
1868*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeletePathRecursively(directory_contents));
1869*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name));
1870*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(subdir_path));
1871*6777b538SAndroid Build Coastguard Worker }
1872*6777b538SAndroid Build Coastguard Worker
1873*6777b538SAndroid Build Coastguard Worker // TODO(erikkay): see if anyone's actually using this feature of the API
TEST_F(FileUtilTest,DeleteNonExistantWildCard)1874*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteNonExistantWildCard) {
1875*6777b538SAndroid Build Coastguard Worker // Create a file and a directory
1876*6777b538SAndroid Build Coastguard Worker FilePath subdir_path =
1877*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("DeleteNonExistantWildCard"));
1878*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_path);
1879*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_path));
1880*6777b538SAndroid Build Coastguard Worker
1881*6777b538SAndroid Build Coastguard Worker // Create the wildcard path
1882*6777b538SAndroid Build Coastguard Worker FilePath directory_contents = subdir_path;
1883*6777b538SAndroid Build Coastguard Worker directory_contents = directory_contents.Append(FPL("*"));
1884*6777b538SAndroid Build Coastguard Worker
1885*6777b538SAndroid Build Coastguard Worker // Delete non-recursively and check nothing got deleted
1886*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(directory_contents));
1887*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(subdir_path));
1888*6777b538SAndroid Build Coastguard Worker
1889*6777b538SAndroid Build Coastguard Worker // Delete recursively and check nothing got deleted
1890*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeletePathRecursively(directory_contents));
1891*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(subdir_path));
1892*6777b538SAndroid Build Coastguard Worker }
1893*6777b538SAndroid Build Coastguard Worker #endif
1894*6777b538SAndroid Build Coastguard Worker
1895*6777b538SAndroid Build Coastguard Worker // Tests non-recursive Delete() for a directory.
TEST_F(FileUtilTest,DeleteDirNonRecursive)1896*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteDirNonRecursive) {
1897*6777b538SAndroid Build Coastguard Worker // Create a subdirectory and put a file and two directories inside.
1898*6777b538SAndroid Build Coastguard Worker FilePath test_subdir =
1899*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("DeleteDirNonRecursive"));
1900*6777b538SAndroid Build Coastguard Worker CreateDirectory(test_subdir);
1901*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(test_subdir));
1902*6777b538SAndroid Build Coastguard Worker
1903*6777b538SAndroid Build Coastguard Worker FilePath file_name = test_subdir.Append(FPL("Test DeleteDir.txt"));
1904*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name, bogus_content);
1905*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name));
1906*6777b538SAndroid Build Coastguard Worker
1907*6777b538SAndroid Build Coastguard Worker FilePath subdir_path1 = test_subdir.Append(FPL("TestSubDir1"));
1908*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_path1);
1909*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_path1));
1910*6777b538SAndroid Build Coastguard Worker
1911*6777b538SAndroid Build Coastguard Worker FilePath subdir_path2 = test_subdir.Append(FPL("TestSubDir2"));
1912*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_path2);
1913*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_path2));
1914*6777b538SAndroid Build Coastguard Worker
1915*6777b538SAndroid Build Coastguard Worker // Delete non-recursively and check that the empty dir got deleted
1916*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(subdir_path2));
1917*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(subdir_path2));
1918*6777b538SAndroid Build Coastguard Worker
1919*6777b538SAndroid Build Coastguard Worker // Delete non-recursively and check that nothing got deleted
1920*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(DeleteFile(test_subdir));
1921*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(test_subdir));
1922*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name));
1923*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(subdir_path1));
1924*6777b538SAndroid Build Coastguard Worker }
1925*6777b538SAndroid Build Coastguard Worker
1926*6777b538SAndroid Build Coastguard Worker // Tests recursive Delete() for a directory.
TEST_F(FileUtilTest,DeleteDirRecursive)1927*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteDirRecursive) {
1928*6777b538SAndroid Build Coastguard Worker // Create a subdirectory and put a file and two directories inside.
1929*6777b538SAndroid Build Coastguard Worker FilePath test_subdir = temp_dir_.GetPath().Append(FPL("DeleteDirRecursive"));
1930*6777b538SAndroid Build Coastguard Worker CreateDirectory(test_subdir);
1931*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(test_subdir));
1932*6777b538SAndroid Build Coastguard Worker
1933*6777b538SAndroid Build Coastguard Worker FilePath file_name = test_subdir.Append(FPL("Test DeleteDirRecursive.txt"));
1934*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name, bogus_content);
1935*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name));
1936*6777b538SAndroid Build Coastguard Worker
1937*6777b538SAndroid Build Coastguard Worker FilePath subdir_path1 = test_subdir.Append(FPL("TestSubDir1"));
1938*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_path1);
1939*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_path1));
1940*6777b538SAndroid Build Coastguard Worker
1941*6777b538SAndroid Build Coastguard Worker FilePath subdir_path2 = test_subdir.Append(FPL("TestSubDir2"));
1942*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_path2);
1943*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_path2));
1944*6777b538SAndroid Build Coastguard Worker
1945*6777b538SAndroid Build Coastguard Worker // Delete recursively and check that the empty dir got deleted
1946*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeletePathRecursively(subdir_path2));
1947*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(subdir_path2));
1948*6777b538SAndroid Build Coastguard Worker
1949*6777b538SAndroid Build Coastguard Worker // Delete recursively and check that everything got deleted
1950*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeletePathRecursively(test_subdir));
1951*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name));
1952*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(subdir_path1));
1953*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(test_subdir));
1954*6777b538SAndroid Build Coastguard Worker }
1955*6777b538SAndroid Build Coastguard Worker
1956*6777b538SAndroid Build Coastguard Worker // Tests recursive Delete() for a directory.
TEST_F(FileUtilTest,DeleteDirRecursiveWithOpenFile)1957*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteDirRecursiveWithOpenFile) {
1958*6777b538SAndroid Build Coastguard Worker // Create a subdirectory and put a file and two directories inside.
1959*6777b538SAndroid Build Coastguard Worker FilePath test_subdir = temp_dir_.GetPath().Append(FPL("DeleteWithOpenFile"));
1960*6777b538SAndroid Build Coastguard Worker CreateDirectory(test_subdir);
1961*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(test_subdir));
1962*6777b538SAndroid Build Coastguard Worker
1963*6777b538SAndroid Build Coastguard Worker FilePath file_name1 = test_subdir.Append(FPL("Undeletebable File1.txt"));
1964*6777b538SAndroid Build Coastguard Worker File file1(file_name1,
1965*6777b538SAndroid Build Coastguard Worker File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE);
1966*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name1));
1967*6777b538SAndroid Build Coastguard Worker
1968*6777b538SAndroid Build Coastguard Worker FilePath file_name2 = test_subdir.Append(FPL("Deleteable File2.txt"));
1969*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name2, bogus_content);
1970*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name2));
1971*6777b538SAndroid Build Coastguard Worker
1972*6777b538SAndroid Build Coastguard Worker FilePath file_name3 = test_subdir.Append(FPL("Undeletebable File3.txt"));
1973*6777b538SAndroid Build Coastguard Worker File file3(file_name3,
1974*6777b538SAndroid Build Coastguard Worker File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE);
1975*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name3));
1976*6777b538SAndroid Build Coastguard Worker
1977*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
1978*6777b538SAndroid Build Coastguard Worker // On Windows, holding the file open in sufficient to make it un-deletable.
1979*6777b538SAndroid Build Coastguard Worker // The POSIX code is verifiable on Linux by creating an "immutable" file but
1980*6777b538SAndroid Build Coastguard Worker // this is best-effort because it's not supported by all file systems. Both
1981*6777b538SAndroid Build Coastguard Worker // files will have the same flags so no need to get them individually.
1982*6777b538SAndroid Build Coastguard Worker int flags;
1983*6777b538SAndroid Build Coastguard Worker bool file_attrs_supported =
1984*6777b538SAndroid Build Coastguard Worker ioctl(file1.GetPlatformFile(), FS_IOC_GETFLAGS, &flags) == 0;
1985*6777b538SAndroid Build Coastguard Worker // Some filesystems (e.g. tmpfs) don't support file attributes.
1986*6777b538SAndroid Build Coastguard Worker if (file_attrs_supported) {
1987*6777b538SAndroid Build Coastguard Worker flags |= FS_IMMUTABLE_FL;
1988*6777b538SAndroid Build Coastguard Worker ioctl(file1.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
1989*6777b538SAndroid Build Coastguard Worker ioctl(file3.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
1990*6777b538SAndroid Build Coastguard Worker }
1991*6777b538SAndroid Build Coastguard Worker #endif
1992*6777b538SAndroid Build Coastguard Worker
1993*6777b538SAndroid Build Coastguard Worker // Delete recursively and check that at least the second file got deleted.
1994*6777b538SAndroid Build Coastguard Worker // This ensures that un-deletable files don't impact those that can be.
1995*6777b538SAndroid Build Coastguard Worker DeletePathRecursively(test_subdir);
1996*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name2));
1997*6777b538SAndroid Build Coastguard Worker
1998*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
1999*6777b538SAndroid Build Coastguard Worker // Make sure that the test can clean up after itself.
2000*6777b538SAndroid Build Coastguard Worker if (file_attrs_supported) {
2001*6777b538SAndroid Build Coastguard Worker flags &= ~FS_IMMUTABLE_FL;
2002*6777b538SAndroid Build Coastguard Worker ioctl(file1.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
2003*6777b538SAndroid Build Coastguard Worker ioctl(file3.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
2004*6777b538SAndroid Build Coastguard Worker }
2005*6777b538SAndroid Build Coastguard Worker #endif
2006*6777b538SAndroid Build Coastguard Worker }
2007*6777b538SAndroid Build Coastguard Worker
2008*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
2009*6777b538SAndroid Build Coastguard Worker // This test will validate that files which would block when read result in a
2010*6777b538SAndroid Build Coastguard Worker // failure on a call to ReadFileToStringNonBlocking. To accomplish this we will
2011*6777b538SAndroid Build Coastguard Worker // use a named pipe because it appears as a file on disk and we can control how
2012*6777b538SAndroid Build Coastguard Worker // much data is available to read. This allows us to simulate a file which would
2013*6777b538SAndroid Build Coastguard Worker // block.
TEST_F(FileUtilTest,TestNonBlockingFileReadLinux)2014*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, TestNonBlockingFileReadLinux) {
2015*6777b538SAndroid Build Coastguard Worker FilePath fifo_path = temp_dir_.GetPath().Append(FPL("fifo"));
2016*6777b538SAndroid Build Coastguard Worker int res = mkfifo(fifo_path.MaybeAsASCII().c_str(),
2017*6777b538SAndroid Build Coastguard Worker S_IWUSR | S_IRUSR | S_IWGRP | S_IWGRP);
2018*6777b538SAndroid Build Coastguard Worker ASSERT_NE(res, -1);
2019*6777b538SAndroid Build Coastguard Worker
2020*6777b538SAndroid Build Coastguard Worker base::ScopedFD fd(open(fifo_path.MaybeAsASCII().c_str(), O_RDWR));
2021*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(fd.is_valid());
2022*6777b538SAndroid Build Coastguard Worker
2023*6777b538SAndroid Build Coastguard Worker std::string result;
2024*6777b538SAndroid Build Coastguard Worker // We will try to read when nothing is available on the fifo, the output
2025*6777b538SAndroid Build Coastguard Worker // string will be unmodified and it will fail with EWOULDBLOCK.
2026*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(ReadFileToStringNonBlocking(fifo_path, &result));
2027*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(errno, EWOULDBLOCK);
2028*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(result.empty());
2029*6777b538SAndroid Build Coastguard Worker
2030*6777b538SAndroid Build Coastguard Worker // Make a single byte available to read on the FIFO.
2031*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(write(fd.get(), "a", 1), 1);
2032*6777b538SAndroid Build Coastguard Worker
2033*6777b538SAndroid Build Coastguard Worker // Now the key part of the test we will call ReadFromFileNonBlocking which
2034*6777b538SAndroid Build Coastguard Worker // should fail, errno will be EWOULDBLOCK and the output string will contain
2035*6777b538SAndroid Build Coastguard Worker // the single 'a' byte.
2036*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(ReadFileToStringNonBlocking(fifo_path, &result));
2037*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(errno, EWOULDBLOCK);
2038*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(result.size(), 1u);
2039*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(result[0], 'a');
2040*6777b538SAndroid Build Coastguard Worker }
2041*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
2042*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,MoveFileNew)2043*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MoveFileNew) {
2044*6777b538SAndroid Build Coastguard Worker // Create a file
2045*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2046*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
2047*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2048*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2049*6777b538SAndroid Build Coastguard Worker
2050*6777b538SAndroid Build Coastguard Worker // The destination.
2051*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = temp_dir_.GetPath().Append(
2052*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("Move_Test_File_Destination.txt"));
2053*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(file_name_to));
2054*6777b538SAndroid Build Coastguard Worker
2055*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(Move(file_name_from, file_name_to));
2056*6777b538SAndroid Build Coastguard Worker
2057*6777b538SAndroid Build Coastguard Worker // Check everything has been moved.
2058*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name_from));
2059*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2060*6777b538SAndroid Build Coastguard Worker }
2061*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,MoveFileExists)2062*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MoveFileExists) {
2063*6777b538SAndroid Build Coastguard Worker // Create a file
2064*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2065*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
2066*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2067*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2068*6777b538SAndroid Build Coastguard Worker
2069*6777b538SAndroid Build Coastguard Worker // The destination name.
2070*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = temp_dir_.GetPath().Append(
2071*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("Move_Test_File_Destination.txt"));
2072*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_to, L"Old file content");
2073*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
2074*6777b538SAndroid Build Coastguard Worker
2075*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(Move(file_name_from, file_name_to));
2076*6777b538SAndroid Build Coastguard Worker
2077*6777b538SAndroid Build Coastguard Worker // Check everything has been moved.
2078*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name_from));
2079*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2080*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(L"Gooooooooooooooooooooogle" == ReadTextFile(file_name_to));
2081*6777b538SAndroid Build Coastguard Worker }
2082*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,MoveFileDirExists)2083*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MoveFileDirExists) {
2084*6777b538SAndroid Build Coastguard Worker // Create a file
2085*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2086*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
2087*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2088*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2089*6777b538SAndroid Build Coastguard Worker
2090*6777b538SAndroid Build Coastguard Worker // The destination directory
2091*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2092*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
2093*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_to);
2094*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
2095*6777b538SAndroid Build Coastguard Worker
2096*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(Move(file_name_from, dir_name_to));
2097*6777b538SAndroid Build Coastguard Worker }
2098*6777b538SAndroid Build Coastguard Worker
2099*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,MoveNew)2100*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MoveNew) {
2101*6777b538SAndroid Build Coastguard Worker // Create a directory
2102*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2103*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_From_Subdir"));
2104*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
2105*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2106*6777b538SAndroid Build Coastguard Worker
2107*6777b538SAndroid Build Coastguard Worker // Create a file under the directory
2108*6777b538SAndroid Build Coastguard Worker FilePath txt_file_name(FILE_PATH_LITERAL("Move_Test_File.txt"));
2109*6777b538SAndroid Build Coastguard Worker FilePath file_name_from = dir_name_from.Append(txt_file_name);
2110*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2111*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2112*6777b538SAndroid Build Coastguard Worker
2113*6777b538SAndroid Build Coastguard Worker // Move the directory.
2114*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2115*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_To_Subdir"));
2116*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
2117*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
2118*6777b538SAndroid Build Coastguard Worker
2119*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(dir_name_to));
2120*6777b538SAndroid Build Coastguard Worker
2121*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(Move(dir_name_from, dir_name_to));
2122*6777b538SAndroid Build Coastguard Worker
2123*6777b538SAndroid Build Coastguard Worker // Check everything has been moved.
2124*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(dir_name_from));
2125*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name_from));
2126*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_to));
2127*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2128*6777b538SAndroid Build Coastguard Worker
2129*6777b538SAndroid Build Coastguard Worker // Test path traversal.
2130*6777b538SAndroid Build Coastguard Worker file_name_from = dir_name_to.Append(txt_file_name);
2131*6777b538SAndroid Build Coastguard Worker file_name_to = dir_name_to.Append(FILE_PATH_LITERAL(".."));
2132*6777b538SAndroid Build Coastguard Worker file_name_to = file_name_to.Append(txt_file_name);
2133*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(Move(file_name_from, file_name_to));
2134*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_from));
2135*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name_to));
2136*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(internal::MoveUnsafe(file_name_from, file_name_to));
2137*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name_from));
2138*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2139*6777b538SAndroid Build Coastguard Worker }
2140*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,MoveExist)2141*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MoveExist) {
2142*6777b538SAndroid Build Coastguard Worker // Create a directory
2143*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2144*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_From_Subdir"));
2145*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
2146*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2147*6777b538SAndroid Build Coastguard Worker
2148*6777b538SAndroid Build Coastguard Worker // Create a file under the directory
2149*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2150*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
2151*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2152*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2153*6777b538SAndroid Build Coastguard Worker
2154*6777b538SAndroid Build Coastguard Worker // Move the directory
2155*6777b538SAndroid Build Coastguard Worker FilePath dir_name_exists =
2156*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
2157*6777b538SAndroid Build Coastguard Worker
2158*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2159*6777b538SAndroid Build Coastguard Worker dir_name_exists.Append(FILE_PATH_LITERAL("Move_To_Subdir"));
2160*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
2161*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
2162*6777b538SAndroid Build Coastguard Worker
2163*6777b538SAndroid Build Coastguard Worker // Create the destination directory.
2164*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_exists);
2165*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_exists));
2166*6777b538SAndroid Build Coastguard Worker
2167*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(Move(dir_name_from, dir_name_to));
2168*6777b538SAndroid Build Coastguard Worker
2169*6777b538SAndroid Build Coastguard Worker // Check everything has been moved.
2170*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(dir_name_from));
2171*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name_from));
2172*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_to));
2173*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2174*6777b538SAndroid Build Coastguard Worker }
2175*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryRecursivelyNew)2176*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryRecursivelyNew) {
2177*6777b538SAndroid Build Coastguard Worker // Create a directory.
2178*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2179*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2180*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
2181*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2182*6777b538SAndroid Build Coastguard Worker
2183*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
2184*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2185*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2186*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2187*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2188*6777b538SAndroid Build Coastguard Worker
2189*6777b538SAndroid Build Coastguard Worker // Create a subdirectory.
2190*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_from =
2191*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
2192*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_name_from);
2193*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_name_from));
2194*6777b538SAndroid Build Coastguard Worker
2195*6777b538SAndroid Build Coastguard Worker // Create a file under the subdirectory.
2196*6777b538SAndroid Build Coastguard Worker FilePath file_name2_from =
2197*6777b538SAndroid Build Coastguard Worker subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2198*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
2199*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name2_from));
2200*6777b538SAndroid Build Coastguard Worker
2201*6777b538SAndroid Build Coastguard Worker // Copy the directory recursively.
2202*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2203*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2204*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
2205*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2206*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_to =
2207*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
2208*6777b538SAndroid Build Coastguard Worker FilePath file_name2_to =
2209*6777b538SAndroid Build Coastguard Worker subdir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2210*6777b538SAndroid Build Coastguard Worker
2211*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(dir_name_to));
2212*6777b538SAndroid Build Coastguard Worker
2213*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, true));
2214*6777b538SAndroid Build Coastguard Worker
2215*6777b538SAndroid Build Coastguard Worker // Check everything has been copied.
2216*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_from));
2217*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_from));
2218*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(subdir_name_from));
2219*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name2_from));
2220*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_to));
2221*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2222*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(subdir_name_to));
2223*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name2_to));
2224*6777b538SAndroid Build Coastguard Worker }
2225*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryRecursivelyExists)2226*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryRecursivelyExists) {
2227*6777b538SAndroid Build Coastguard Worker // Create a directory.
2228*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2229*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2230*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
2231*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2232*6777b538SAndroid Build Coastguard Worker
2233*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
2234*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2235*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2236*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2237*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2238*6777b538SAndroid Build Coastguard Worker
2239*6777b538SAndroid Build Coastguard Worker // Create a subdirectory.
2240*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_from =
2241*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
2242*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_name_from);
2243*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_name_from));
2244*6777b538SAndroid Build Coastguard Worker
2245*6777b538SAndroid Build Coastguard Worker // Create a file under the subdirectory.
2246*6777b538SAndroid Build Coastguard Worker FilePath file_name2_from =
2247*6777b538SAndroid Build Coastguard Worker subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2248*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
2249*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name2_from));
2250*6777b538SAndroid Build Coastguard Worker
2251*6777b538SAndroid Build Coastguard Worker // Copy the directory recursively.
2252*6777b538SAndroid Build Coastguard Worker FilePath dir_name_exists =
2253*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
2254*6777b538SAndroid Build Coastguard Worker
2255*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2256*6777b538SAndroid Build Coastguard Worker dir_name_exists.Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2257*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
2258*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2259*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_to =
2260*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
2261*6777b538SAndroid Build Coastguard Worker FilePath file_name2_to =
2262*6777b538SAndroid Build Coastguard Worker subdir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2263*6777b538SAndroid Build Coastguard Worker
2264*6777b538SAndroid Build Coastguard Worker // Create the destination directory.
2265*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_exists);
2266*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_exists));
2267*6777b538SAndroid Build Coastguard Worker
2268*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_exists, true));
2269*6777b538SAndroid Build Coastguard Worker
2270*6777b538SAndroid Build Coastguard Worker // Check everything has been copied.
2271*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_from));
2272*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_from));
2273*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(subdir_name_from));
2274*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name2_from));
2275*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_to));
2276*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2277*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(subdir_name_to));
2278*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name2_to));
2279*6777b538SAndroid Build Coastguard Worker }
2280*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryNew)2281*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryNew) {
2282*6777b538SAndroid Build Coastguard Worker // Create a directory.
2283*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2284*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2285*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
2286*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2287*6777b538SAndroid Build Coastguard Worker
2288*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
2289*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2290*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2291*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2292*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2293*6777b538SAndroid Build Coastguard Worker
2294*6777b538SAndroid Build Coastguard Worker // Create a subdirectory.
2295*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_from =
2296*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
2297*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_name_from);
2298*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_name_from));
2299*6777b538SAndroid Build Coastguard Worker
2300*6777b538SAndroid Build Coastguard Worker // Create a file under the subdirectory.
2301*6777b538SAndroid Build Coastguard Worker FilePath file_name2_from =
2302*6777b538SAndroid Build Coastguard Worker subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2303*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
2304*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name2_from));
2305*6777b538SAndroid Build Coastguard Worker
2306*6777b538SAndroid Build Coastguard Worker // Copy the directory not recursively.
2307*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2308*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2309*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
2310*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2311*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_to =
2312*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
2313*6777b538SAndroid Build Coastguard Worker
2314*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(dir_name_to));
2315*6777b538SAndroid Build Coastguard Worker
2316*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
2317*6777b538SAndroid Build Coastguard Worker
2318*6777b538SAndroid Build Coastguard Worker // Check everything has been copied.
2319*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_from));
2320*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_from));
2321*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(subdir_name_from));
2322*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name2_from));
2323*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_to));
2324*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2325*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(subdir_name_to));
2326*6777b538SAndroid Build Coastguard Worker }
2327*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryExists)2328*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExists) {
2329*6777b538SAndroid Build Coastguard Worker // Create a directory.
2330*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2331*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2332*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
2333*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2334*6777b538SAndroid Build Coastguard Worker
2335*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
2336*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2337*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2338*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2339*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2340*6777b538SAndroid Build Coastguard Worker
2341*6777b538SAndroid Build Coastguard Worker // Create a subdirectory.
2342*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_from =
2343*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
2344*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_name_from);
2345*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_name_from));
2346*6777b538SAndroid Build Coastguard Worker
2347*6777b538SAndroid Build Coastguard Worker // Create a file under the subdirectory.
2348*6777b538SAndroid Build Coastguard Worker FilePath file_name2_from =
2349*6777b538SAndroid Build Coastguard Worker subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2350*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
2351*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name2_from));
2352*6777b538SAndroid Build Coastguard Worker
2353*6777b538SAndroid Build Coastguard Worker // Copy the directory not recursively.
2354*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2355*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2356*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
2357*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2358*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_to =
2359*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
2360*6777b538SAndroid Build Coastguard Worker
2361*6777b538SAndroid Build Coastguard Worker // Create the destination directory.
2362*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_to);
2363*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
2364*6777b538SAndroid Build Coastguard Worker
2365*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
2366*6777b538SAndroid Build Coastguard Worker
2367*6777b538SAndroid Build Coastguard Worker // Check everything has been copied.
2368*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_from));
2369*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_from));
2370*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(subdir_name_from));
2371*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name2_from));
2372*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_to));
2373*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2374*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(subdir_name_to));
2375*6777b538SAndroid Build Coastguard Worker }
2376*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFileWithCopyDirectoryRecursiveToNew)2377*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToNew) {
2378*6777b538SAndroid Build Coastguard Worker // Create a file
2379*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2380*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2381*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2382*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2383*6777b538SAndroid Build Coastguard Worker
2384*6777b538SAndroid Build Coastguard Worker // The destination name
2385*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = temp_dir_.GetPath().Append(
2386*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("Copy_Test_File_Destination.txt"));
2387*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(file_name_to));
2388*6777b538SAndroid Build Coastguard Worker
2389*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(file_name_from, file_name_to, true));
2390*6777b538SAndroid Build Coastguard Worker
2391*6777b538SAndroid Build Coastguard Worker // Check the has been copied
2392*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2393*6777b538SAndroid Build Coastguard Worker }
2394*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFileWithCopyDirectoryRecursiveToExisting)2395*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToExisting) {
2396*6777b538SAndroid Build Coastguard Worker // Create a file
2397*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2398*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2399*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2400*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2401*6777b538SAndroid Build Coastguard Worker
2402*6777b538SAndroid Build Coastguard Worker // The destination name
2403*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = temp_dir_.GetPath().Append(
2404*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("Copy_Test_File_Destination.txt"));
2405*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_to, L"Old file content");
2406*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
2407*6777b538SAndroid Build Coastguard Worker
2408*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(file_name_from, file_name_to, true));
2409*6777b538SAndroid Build Coastguard Worker
2410*6777b538SAndroid Build Coastguard Worker // Check the has been copied
2411*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2412*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(L"Gooooooooooooooooooooogle" == ReadTextFile(file_name_to));
2413*6777b538SAndroid Build Coastguard Worker }
2414*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFileWithCopyDirectoryRecursiveToExistingDirectory)2415*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToExistingDirectory) {
2416*6777b538SAndroid Build Coastguard Worker // Create a file
2417*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2418*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2419*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2420*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2421*6777b538SAndroid Build Coastguard Worker
2422*6777b538SAndroid Build Coastguard Worker // The destination
2423*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2424*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
2425*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_to);
2426*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
2427*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
2428*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2429*6777b538SAndroid Build Coastguard Worker
2430*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(file_name_from, dir_name_to, true));
2431*6777b538SAndroid Build Coastguard Worker
2432*6777b538SAndroid Build Coastguard Worker // Check the has been copied
2433*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2434*6777b538SAndroid Build Coastguard Worker }
2435*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFileFailureWithCopyDirectoryExcl)2436*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileFailureWithCopyDirectoryExcl) {
2437*6777b538SAndroid Build Coastguard Worker // Create a file
2438*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2439*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2440*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2441*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2442*6777b538SAndroid Build Coastguard Worker
2443*6777b538SAndroid Build Coastguard Worker // Make a destination file.
2444*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = temp_dir_.GetPath().Append(
2445*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("Copy_Test_File_Destination.txt"));
2446*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_to, L"Old file content");
2447*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
2448*6777b538SAndroid Build Coastguard Worker
2449*6777b538SAndroid Build Coastguard Worker // Overwriting the destination should fail.
2450*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CopyDirectoryExcl(file_name_from, file_name_to, true));
2451*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(L"Old file content", ReadTextFile(file_name_to));
2452*6777b538SAndroid Build Coastguard Worker }
2453*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryWithTrailingSeparators)2454*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryWithTrailingSeparators) {
2455*6777b538SAndroid Build Coastguard Worker // Create a directory.
2456*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2457*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2458*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
2459*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2460*6777b538SAndroid Build Coastguard Worker
2461*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
2462*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2463*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2464*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2465*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2466*6777b538SAndroid Build Coastguard Worker
2467*6777b538SAndroid Build Coastguard Worker // Copy the directory recursively.
2468*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2469*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2470*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
2471*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2472*6777b538SAndroid Build Coastguard Worker
2473*6777b538SAndroid Build Coastguard Worker // Create from path with trailing separators.
2474*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
2475*6777b538SAndroid Build Coastguard Worker FilePath from_path =
2476*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir\\\\\\"));
2477*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
2478*6777b538SAndroid Build Coastguard Worker FilePath from_path =
2479*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir///"));
2480*6777b538SAndroid Build Coastguard Worker #endif
2481*6777b538SAndroid Build Coastguard Worker
2482*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(from_path, dir_name_to, true));
2483*6777b538SAndroid Build Coastguard Worker
2484*6777b538SAndroid Build Coastguard Worker // Check everything has been copied.
2485*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_from));
2486*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_from));
2487*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_to));
2488*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2489*6777b538SAndroid Build Coastguard Worker }
2490*6777b538SAndroid Build Coastguard Worker
2491*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX)
TEST_F(FileUtilTest,CopyDirectoryWithNonRegularFiles)2492*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryWithNonRegularFiles) {
2493*6777b538SAndroid Build Coastguard Worker // Create a directory.
2494*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2495*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2496*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_from));
2497*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2498*6777b538SAndroid Build Coastguard Worker
2499*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
2500*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2501*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2502*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2503*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2504*6777b538SAndroid Build Coastguard Worker
2505*6777b538SAndroid Build Coastguard Worker // Create a symbolic link under the directory pointing to that file.
2506*6777b538SAndroid Build Coastguard Worker FilePath symlink_name_from =
2507*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Symlink"));
2508*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(file_name_from, symlink_name_from));
2509*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(symlink_name_from));
2510*6777b538SAndroid Build Coastguard Worker
2511*6777b538SAndroid Build Coastguard Worker // Create a fifo under the directory.
2512*6777b538SAndroid Build Coastguard Worker FilePath fifo_name_from =
2513*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Fifo"));
2514*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, mkfifo(fifo_name_from.value().c_str(), 0644));
2515*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(fifo_name_from));
2516*6777b538SAndroid Build Coastguard Worker
2517*6777b538SAndroid Build Coastguard Worker // Copy the directory.
2518*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2519*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2520*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
2521*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2522*6777b538SAndroid Build Coastguard Worker FilePath symlink_name_to =
2523*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Symlink"));
2524*6777b538SAndroid Build Coastguard Worker FilePath fifo_name_to =
2525*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Fifo"));
2526*6777b538SAndroid Build Coastguard Worker
2527*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(dir_name_to));
2528*6777b538SAndroid Build Coastguard Worker
2529*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
2530*6777b538SAndroid Build Coastguard Worker
2531*6777b538SAndroid Build Coastguard Worker // Check that only directories and regular files are copied.
2532*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_from));
2533*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_from));
2534*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(symlink_name_from));
2535*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(fifo_name_from));
2536*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_to));
2537*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2538*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(symlink_name_to));
2539*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(fifo_name_to));
2540*6777b538SAndroid Build Coastguard Worker }
2541*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryExclFileOverSymlink)2542*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclFileOverSymlink) {
2543*6777b538SAndroid Build Coastguard Worker // Create a directory.
2544*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2545*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2546*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_from));
2547*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2548*6777b538SAndroid Build Coastguard Worker
2549*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
2550*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2551*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2552*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2553*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2554*6777b538SAndroid Build Coastguard Worker
2555*6777b538SAndroid Build Coastguard Worker // Create a destination directory with a symlink of the same name.
2556*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2557*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2558*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_to));
2559*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
2560*6777b538SAndroid Build Coastguard Worker
2561*6777b538SAndroid Build Coastguard Worker FilePath symlink_target =
2562*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Symlink_Target.txt"));
2563*6777b538SAndroid Build Coastguard Worker CreateTextFile(symlink_target, L"asdf");
2564*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(symlink_target));
2565*6777b538SAndroid Build Coastguard Worker
2566*6777b538SAndroid Build Coastguard Worker FilePath symlink_name_to =
2567*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2568*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
2569*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(symlink_name_to));
2570*6777b538SAndroid Build Coastguard Worker
2571*6777b538SAndroid Build Coastguard Worker // Check that copying fails.
2572*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
2573*6777b538SAndroid Build Coastguard Worker }
2574*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryExclDirectoryOverSymlink)2575*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverSymlink) {
2576*6777b538SAndroid Build Coastguard Worker // Create a directory.
2577*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2578*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2579*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_from));
2580*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2581*6777b538SAndroid Build Coastguard Worker
2582*6777b538SAndroid Build Coastguard Worker // Create a subdirectory.
2583*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
2584*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_name_from);
2585*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_name_from));
2586*6777b538SAndroid Build Coastguard Worker
2587*6777b538SAndroid Build Coastguard Worker // Create a destination directory with a symlink of the same name.
2588*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2589*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2590*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_to));
2591*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
2592*6777b538SAndroid Build Coastguard Worker
2593*6777b538SAndroid Build Coastguard Worker FilePath symlink_target = dir_name_to.Append(FILE_PATH_LITERAL("Subsub"));
2594*6777b538SAndroid Build Coastguard Worker CreateTextFile(symlink_target, L"asdf");
2595*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(symlink_target));
2596*6777b538SAndroid Build Coastguard Worker
2597*6777b538SAndroid Build Coastguard Worker FilePath symlink_name_to =
2598*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2599*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
2600*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(symlink_name_to));
2601*6777b538SAndroid Build Coastguard Worker
2602*6777b538SAndroid Build Coastguard Worker // Check that copying fails.
2603*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
2604*6777b538SAndroid Build Coastguard Worker }
2605*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryExclFileOverDanglingSymlink)2606*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclFileOverDanglingSymlink) {
2607*6777b538SAndroid Build Coastguard Worker // Create a directory.
2608*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2609*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2610*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_from));
2611*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2612*6777b538SAndroid Build Coastguard Worker
2613*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
2614*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2615*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2616*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2617*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2618*6777b538SAndroid Build Coastguard Worker
2619*6777b538SAndroid Build Coastguard Worker // Create a destination directory with a dangling symlink of the same name.
2620*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2621*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2622*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_to));
2623*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
2624*6777b538SAndroid Build Coastguard Worker
2625*6777b538SAndroid Build Coastguard Worker FilePath symlink_target =
2626*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Symlink_Target.txt"));
2627*6777b538SAndroid Build Coastguard Worker CreateTextFile(symlink_target, L"asdf");
2628*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(symlink_target));
2629*6777b538SAndroid Build Coastguard Worker
2630*6777b538SAndroid Build Coastguard Worker FilePath symlink_name_to =
2631*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2632*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
2633*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(symlink_name_to));
2634*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DeleteFile(symlink_target));
2635*6777b538SAndroid Build Coastguard Worker
2636*6777b538SAndroid Build Coastguard Worker // Check that copying fails and that no file was created for the symlink's
2637*6777b538SAndroid Build Coastguard Worker // referent.
2638*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
2639*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(symlink_target));
2640*6777b538SAndroid Build Coastguard Worker }
2641*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryExclDirectoryOverDanglingSymlink)2642*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverDanglingSymlink) {
2643*6777b538SAndroid Build Coastguard Worker // Create a directory.
2644*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2645*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2646*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_from));
2647*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2648*6777b538SAndroid Build Coastguard Worker
2649*6777b538SAndroid Build Coastguard Worker // Create a subdirectory.
2650*6777b538SAndroid Build Coastguard Worker FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
2651*6777b538SAndroid Build Coastguard Worker CreateDirectory(subdir_name_from);
2652*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(subdir_name_from));
2653*6777b538SAndroid Build Coastguard Worker
2654*6777b538SAndroid Build Coastguard Worker // Create a destination directory with a dangling symlink of the same name.
2655*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2656*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2657*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_to));
2658*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
2659*6777b538SAndroid Build Coastguard Worker
2660*6777b538SAndroid Build Coastguard Worker FilePath symlink_target =
2661*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Symlink_Target.txt"));
2662*6777b538SAndroid Build Coastguard Worker CreateTextFile(symlink_target, L"asdf");
2663*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(symlink_target));
2664*6777b538SAndroid Build Coastguard Worker
2665*6777b538SAndroid Build Coastguard Worker FilePath symlink_name_to =
2666*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2667*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
2668*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(symlink_name_to));
2669*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DeleteFile(symlink_target));
2670*6777b538SAndroid Build Coastguard Worker
2671*6777b538SAndroid Build Coastguard Worker // Check that copying fails and that no directory was created for the
2672*6777b538SAndroid Build Coastguard Worker // symlink's referent.
2673*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
2674*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(symlink_target));
2675*6777b538SAndroid Build Coastguard Worker }
2676*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyDirectoryExclFileOverFifo)2677*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclFileOverFifo) {
2678*6777b538SAndroid Build Coastguard Worker // Create a directory.
2679*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2680*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2681*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_from));
2682*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2683*6777b538SAndroid Build Coastguard Worker
2684*6777b538SAndroid Build Coastguard Worker // Create a file under the directory.
2685*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2686*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2687*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2688*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2689*6777b538SAndroid Build Coastguard Worker
2690*6777b538SAndroid Build Coastguard Worker // Create a destination directory with a fifo of the same name.
2691*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2692*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2693*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_to));
2694*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_to));
2695*6777b538SAndroid Build Coastguard Worker
2696*6777b538SAndroid Build Coastguard Worker FilePath fifo_name_to =
2697*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2698*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, mkfifo(fifo_name_to.value().c_str(), 0644));
2699*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(fifo_name_to));
2700*6777b538SAndroid Build Coastguard Worker
2701*6777b538SAndroid Build Coastguard Worker // Check that copying fails.
2702*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
2703*6777b538SAndroid Build Coastguard Worker }
2704*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_POSIX)
2705*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFile)2706*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFile) {
2707*6777b538SAndroid Build Coastguard Worker // Create a directory
2708*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from =
2709*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2710*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dir_name_from));
2711*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DirectoryExists(dir_name_from));
2712*6777b538SAndroid Build Coastguard Worker
2713*6777b538SAndroid Build Coastguard Worker // Create a file under the directory
2714*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2715*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2716*6777b538SAndroid Build Coastguard Worker const std::wstring file_contents(L"Gooooooooooooooooooooogle");
2717*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, file_contents);
2718*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2719*6777b538SAndroid Build Coastguard Worker
2720*6777b538SAndroid Build Coastguard Worker // Copy the file.
2721*6777b538SAndroid Build Coastguard Worker FilePath dest_file = dir_name_from.Append(FILE_PATH_LITERAL("DestFile.txt"));
2722*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CopyFile(file_name_from, dest_file));
2723*6777b538SAndroid Build Coastguard Worker
2724*6777b538SAndroid Build Coastguard Worker // Try to copy the file to another location using '..' in the path.
2725*6777b538SAndroid Build Coastguard Worker FilePath dest_file2(dir_name_from);
2726*6777b538SAndroid Build Coastguard Worker dest_file2 = dest_file2.AppendASCII("..");
2727*6777b538SAndroid Build Coastguard Worker dest_file2 = dest_file2.AppendASCII("DestFile.txt");
2728*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(CopyFile(file_name_from, dest_file2));
2729*6777b538SAndroid Build Coastguard Worker
2730*6777b538SAndroid Build Coastguard Worker FilePath dest_file2_test(dir_name_from);
2731*6777b538SAndroid Build Coastguard Worker dest_file2_test = dest_file2_test.DirName();
2732*6777b538SAndroid Build Coastguard Worker dest_file2_test = dest_file2_test.AppendASCII("DestFile.txt");
2733*6777b538SAndroid Build Coastguard Worker
2734*6777b538SAndroid Build Coastguard Worker // Check expected copy results.
2735*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_from));
2736*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dest_file));
2737*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file_contents, ReadTextFile(dest_file));
2738*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(dest_file2_test));
2739*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(dest_file2));
2740*6777b538SAndroid Build Coastguard Worker
2741*6777b538SAndroid Build Coastguard Worker // Change |file_name_from| contents.
2742*6777b538SAndroid Build Coastguard Worker const std::wstring new_file_contents(L"Moogle");
2743*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, new_file_contents);
2744*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2745*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(new_file_contents, ReadTextFile(file_name_from));
2746*6777b538SAndroid Build Coastguard Worker
2747*6777b538SAndroid Build Coastguard Worker // Overwrite |dest_file|.
2748*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CopyFile(file_name_from, dest_file));
2749*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dest_file));
2750*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(new_file_contents, ReadTextFile(dest_file));
2751*6777b538SAndroid Build Coastguard Worker
2752*6777b538SAndroid Build Coastguard Worker // Create another directory.
2753*6777b538SAndroid Build Coastguard Worker FilePath dest_dir = temp_dir_.GetPath().Append(FPL("dest_dir"));
2754*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(dest_dir));
2755*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DirectoryExists(dest_dir));
2756*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsDirectoryEmpty(dest_dir));
2757*6777b538SAndroid Build Coastguard Worker
2758*6777b538SAndroid Build Coastguard Worker // Make sure CopyFile() cannot overwrite a directory.
2759*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(CopyFile(file_name_from, dest_dir));
2760*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DirectoryExists(dest_dir));
2761*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsDirectoryEmpty(dest_dir));
2762*6777b538SAndroid Build Coastguard Worker }
2763*6777b538SAndroid Build Coastguard Worker
2764*6777b538SAndroid Build Coastguard Worker // file_util winds up using autoreleased objects on the Mac, so this needs
2765*6777b538SAndroid Build Coastguard Worker // to be a PlatformTest.
2766*6777b538SAndroid Build Coastguard Worker typedef PlatformTest ReadOnlyFileUtilTest;
2767*6777b538SAndroid Build Coastguard Worker
TEST_F(ReadOnlyFileUtilTest,ContentsEqual)2768*6777b538SAndroid Build Coastguard Worker TEST_F(ReadOnlyFileUtilTest, ContentsEqual) {
2769*6777b538SAndroid Build Coastguard Worker FilePath data_dir;
2770*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
2771*6777b538SAndroid Build Coastguard Worker data_dir = data_dir.AppendASCII("file_util");
2772*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(data_dir));
2773*6777b538SAndroid Build Coastguard Worker
2774*6777b538SAndroid Build Coastguard Worker FilePath original_file =
2775*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("original.txt"));
2776*6777b538SAndroid Build Coastguard Worker FilePath same_file =
2777*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("same.txt"));
2778*6777b538SAndroid Build Coastguard Worker FilePath same_length_file =
2779*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("same_length.txt"));
2780*6777b538SAndroid Build Coastguard Worker FilePath different_file =
2781*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("different.txt"));
2782*6777b538SAndroid Build Coastguard Worker FilePath different_first_file =
2783*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("different_first.txt"));
2784*6777b538SAndroid Build Coastguard Worker FilePath different_last_file =
2785*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("different_last.txt"));
2786*6777b538SAndroid Build Coastguard Worker FilePath empty1_file =
2787*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("empty1.txt"));
2788*6777b538SAndroid Build Coastguard Worker FilePath empty2_file =
2789*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("empty2.txt"));
2790*6777b538SAndroid Build Coastguard Worker FilePath shortened_file =
2791*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("shortened.txt"));
2792*6777b538SAndroid Build Coastguard Worker FilePath binary_file =
2793*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("binary_file.bin"));
2794*6777b538SAndroid Build Coastguard Worker FilePath binary_file_same =
2795*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("binary_file_same.bin"));
2796*6777b538SAndroid Build Coastguard Worker FilePath binary_file_diff =
2797*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("binary_file_diff.bin"));
2798*6777b538SAndroid Build Coastguard Worker
2799*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ContentsEqual(original_file, original_file));
2800*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ContentsEqual(original_file, same_file));
2801*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ContentsEqual(original_file, same_length_file));
2802*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ContentsEqual(original_file, different_file));
2803*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ContentsEqual(FilePath(FILE_PATH_LITERAL("bogusname")),
2804*6777b538SAndroid Build Coastguard Worker FilePath(FILE_PATH_LITERAL("bogusname"))));
2805*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ContentsEqual(original_file, different_first_file));
2806*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ContentsEqual(original_file, different_last_file));
2807*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ContentsEqual(empty1_file, empty2_file));
2808*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ContentsEqual(original_file, shortened_file));
2809*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ContentsEqual(shortened_file, original_file));
2810*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ContentsEqual(binary_file, binary_file_same));
2811*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ContentsEqual(binary_file, binary_file_diff));
2812*6777b538SAndroid Build Coastguard Worker }
2813*6777b538SAndroid Build Coastguard Worker
TEST_F(ReadOnlyFileUtilTest,TextContentsEqual)2814*6777b538SAndroid Build Coastguard Worker TEST_F(ReadOnlyFileUtilTest, TextContentsEqual) {
2815*6777b538SAndroid Build Coastguard Worker FilePath data_dir;
2816*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
2817*6777b538SAndroid Build Coastguard Worker data_dir = data_dir.AppendASCII("file_util");
2818*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(data_dir));
2819*6777b538SAndroid Build Coastguard Worker
2820*6777b538SAndroid Build Coastguard Worker FilePath original_file =
2821*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("original.txt"));
2822*6777b538SAndroid Build Coastguard Worker FilePath same_file =
2823*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("same.txt"));
2824*6777b538SAndroid Build Coastguard Worker FilePath crlf_file =
2825*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("crlf.txt"));
2826*6777b538SAndroid Build Coastguard Worker FilePath shortened_file =
2827*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("shortened.txt"));
2828*6777b538SAndroid Build Coastguard Worker FilePath different_file =
2829*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("different.txt"));
2830*6777b538SAndroid Build Coastguard Worker FilePath different_first_file =
2831*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("different_first.txt"));
2832*6777b538SAndroid Build Coastguard Worker FilePath different_last_file =
2833*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("different_last.txt"));
2834*6777b538SAndroid Build Coastguard Worker FilePath first1_file =
2835*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("first1.txt"));
2836*6777b538SAndroid Build Coastguard Worker FilePath first2_file =
2837*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("first2.txt"));
2838*6777b538SAndroid Build Coastguard Worker FilePath empty1_file =
2839*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("empty1.txt"));
2840*6777b538SAndroid Build Coastguard Worker FilePath empty2_file =
2841*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("empty2.txt"));
2842*6777b538SAndroid Build Coastguard Worker FilePath blank_line_file =
2843*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("blank_line.txt"));
2844*6777b538SAndroid Build Coastguard Worker FilePath blank_line_crlf_file =
2845*6777b538SAndroid Build Coastguard Worker data_dir.Append(FILE_PATH_LITERAL("blank_line_crlf.txt"));
2846*6777b538SAndroid Build Coastguard Worker
2847*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(TextContentsEqual(original_file, same_file));
2848*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(TextContentsEqual(original_file, crlf_file));
2849*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(TextContentsEqual(original_file, shortened_file));
2850*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(TextContentsEqual(original_file, different_file));
2851*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(TextContentsEqual(original_file, different_first_file));
2852*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(TextContentsEqual(original_file, different_last_file));
2853*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(TextContentsEqual(first1_file, first2_file));
2854*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(TextContentsEqual(empty1_file, empty2_file));
2855*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(TextContentsEqual(original_file, empty1_file));
2856*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(TextContentsEqual(blank_line_file, blank_line_crlf_file));
2857*6777b538SAndroid Build Coastguard Worker }
2858*6777b538SAndroid Build Coastguard Worker
2859*6777b538SAndroid Build Coastguard Worker // We don't need equivalent functionality outside of Windows.
2860*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
TEST_F(FileUtilTest,CopyAndDeleteDirectoryTest)2861*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyAndDeleteDirectoryTest) {
2862*6777b538SAndroid Build Coastguard Worker // Create a directory
2863*6777b538SAndroid Build Coastguard Worker FilePath dir_name_from = temp_dir_.GetPath().Append(
2864*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("CopyAndDelete_From_Subdir"));
2865*6777b538SAndroid Build Coastguard Worker CreateDirectory(dir_name_from);
2866*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(dir_name_from));
2867*6777b538SAndroid Build Coastguard Worker
2868*6777b538SAndroid Build Coastguard Worker // Create a file under the directory
2869*6777b538SAndroid Build Coastguard Worker FilePath file_name_from =
2870*6777b538SAndroid Build Coastguard Worker dir_name_from.Append(FILE_PATH_LITERAL("CopyAndDelete_Test_File.txt"));
2871*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2872*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
2873*6777b538SAndroid Build Coastguard Worker
2874*6777b538SAndroid Build Coastguard Worker // Move the directory by using CopyAndDeleteDirectory
2875*6777b538SAndroid Build Coastguard Worker FilePath dir_name_to =
2876*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("CopyAndDelete_To_Subdir"));
2877*6777b538SAndroid Build Coastguard Worker FilePath file_name_to =
2878*6777b538SAndroid Build Coastguard Worker dir_name_to.Append(FILE_PATH_LITERAL("CopyAndDelete_Test_File.txt"));
2879*6777b538SAndroid Build Coastguard Worker
2880*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(dir_name_to));
2881*6777b538SAndroid Build Coastguard Worker
2882*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(internal::CopyAndDeleteDirectory(dir_name_from,
2883*6777b538SAndroid Build Coastguard Worker dir_name_to));
2884*6777b538SAndroid Build Coastguard Worker
2885*6777b538SAndroid Build Coastguard Worker // Check everything has been moved.
2886*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(dir_name_from));
2887*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(file_name_from));
2888*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(dir_name_to));
2889*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(file_name_to));
2890*6777b538SAndroid Build Coastguard Worker }
2891*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,GetTempDirTest)2892*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetTempDirTest) {
2893*6777b538SAndroid Build Coastguard Worker static const TCHAR* kTmpKey = _T("TMP");
2894*6777b538SAndroid Build Coastguard Worker static const TCHAR* kTmpValues[] = {
2895*6777b538SAndroid Build Coastguard Worker _T(""), _T("C:"), _T("C:\\"), _T("C:\\tmp"), _T("C:\\tmp\\")
2896*6777b538SAndroid Build Coastguard Worker };
2897*6777b538SAndroid Build Coastguard Worker // Save the original $TMP.
2898*6777b538SAndroid Build Coastguard Worker size_t original_tmp_size;
2899*6777b538SAndroid Build Coastguard Worker TCHAR* original_tmp;
2900*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, ::_tdupenv_s(&original_tmp, &original_tmp_size, kTmpKey));
2901*6777b538SAndroid Build Coastguard Worker // original_tmp may be NULL.
2902*6777b538SAndroid Build Coastguard Worker
2903*6777b538SAndroid Build Coastguard Worker for (unsigned int i = 0; i < std::size(kTmpValues); ++i) {
2904*6777b538SAndroid Build Coastguard Worker FilePath path;
2905*6777b538SAndroid Build Coastguard Worker ::_tputenv_s(kTmpKey, kTmpValues[i]);
2906*6777b538SAndroid Build Coastguard Worker GetTempDir(&path);
2907*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(path.IsAbsolute()) << "$TMP=" << kTmpValues[i] <<
2908*6777b538SAndroid Build Coastguard Worker " result=" << path.value();
2909*6777b538SAndroid Build Coastguard Worker }
2910*6777b538SAndroid Build Coastguard Worker
2911*6777b538SAndroid Build Coastguard Worker // Restore the original $TMP.
2912*6777b538SAndroid Build Coastguard Worker if (original_tmp) {
2913*6777b538SAndroid Build Coastguard Worker ::_tputenv_s(kTmpKey, original_tmp);
2914*6777b538SAndroid Build Coastguard Worker free(original_tmp);
2915*6777b538SAndroid Build Coastguard Worker } else {
2916*6777b538SAndroid Build Coastguard Worker ::_tputenv_s(kTmpKey, _T(""));
2917*6777b538SAndroid Build Coastguard Worker }
2918*6777b538SAndroid Build Coastguard Worker }
2919*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
2920*6777b538SAndroid Build Coastguard Worker
2921*6777b538SAndroid Build Coastguard Worker // Test that files opened by OpenFile are not set up for inheritance into child
2922*6777b538SAndroid Build Coastguard Worker // procs.
TEST_F(FileUtilTest,OpenFileNoInheritance)2923*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, OpenFileNoInheritance) {
2924*6777b538SAndroid Build Coastguard Worker FilePath file_path(temp_dir_.GetPath().Append(FPL("a_file")));
2925*6777b538SAndroid Build Coastguard Worker
2926*6777b538SAndroid Build Coastguard Worker // Character set handling is leaking according to ASAN. http://crbug.com/883698
2927*6777b538SAndroid Build Coastguard Worker #if defined(ADDRESS_SANITIZER)
2928*6777b538SAndroid Build Coastguard Worker static constexpr const char* modes[] = {"wb", "r"};
2929*6777b538SAndroid Build Coastguard Worker #else
2930*6777b538SAndroid Build Coastguard Worker static constexpr const char* modes[] = {"wb", "r,ccs=UTF-8"};
2931*6777b538SAndroid Build Coastguard Worker #endif
2932*6777b538SAndroid Build Coastguard Worker
2933*6777b538SAndroid Build Coastguard Worker for (const char* mode : modes) {
2934*6777b538SAndroid Build Coastguard Worker SCOPED_TRACE(mode);
2935*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(CreateTextFile(file_path, L"Geepers"));
2936*6777b538SAndroid Build Coastguard Worker FILE* file = OpenFile(file_path, mode);
2937*6777b538SAndroid Build Coastguard Worker ASSERT_NE(nullptr, file);
2938*6777b538SAndroid Build Coastguard Worker {
2939*6777b538SAndroid Build Coastguard Worker ScopedClosureRunner file_closer(BindOnce(IgnoreResult(&CloseFile), file));
2940*6777b538SAndroid Build Coastguard Worker bool is_inheritable = true;
2941*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(GetIsInheritable(file, &is_inheritable));
2942*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(is_inheritable);
2943*6777b538SAndroid Build Coastguard Worker }
2944*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DeleteFile(file_path));
2945*6777b538SAndroid Build Coastguard Worker }
2946*6777b538SAndroid Build Coastguard Worker }
2947*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CreateAndOpenTemporaryFileInDir)2948*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateAndOpenTemporaryFileInDir) {
2949*6777b538SAndroid Build Coastguard Worker // Create a temporary file.
2950*6777b538SAndroid Build Coastguard Worker FilePath path;
2951*6777b538SAndroid Build Coastguard Worker File file = CreateAndOpenTemporaryFileInDir(temp_dir_.GetPath(), &path);
2952*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(file.IsValid());
2953*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(path.empty());
2954*6777b538SAndroid Build Coastguard Worker
2955*6777b538SAndroid Build Coastguard Worker // Try to open another handle to it.
2956*6777b538SAndroid Build Coastguard Worker File file2(path,
2957*6777b538SAndroid Build Coastguard Worker File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WIN_SHARE_DELETE);
2958*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
2959*6777b538SAndroid Build Coastguard Worker // The file cannot be opened again on account of the exclusive access.
2960*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(file2.IsValid());
2961*6777b538SAndroid Build Coastguard Worker #else
2962*6777b538SAndroid Build Coastguard Worker // Exclusive access isn't a thing on non-Windows platforms.
2963*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(file2.IsValid());
2964*6777b538SAndroid Build Coastguard Worker #endif
2965*6777b538SAndroid Build Coastguard Worker }
2966*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CreateTemporaryFileTest)2967*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateTemporaryFileTest) {
2968*6777b538SAndroid Build Coastguard Worker FilePath temp_files[3];
2969*6777b538SAndroid Build Coastguard Worker for (auto& i : temp_files) {
2970*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateTemporaryFile(&i));
2971*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(i));
2972*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(DirectoryExists(i));
2973*6777b538SAndroid Build Coastguard Worker }
2974*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < 3; i++)
2975*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(temp_files[i] == temp_files[(i+1)%3]);
2976*6777b538SAndroid Build Coastguard Worker for (const auto& i : temp_files)
2977*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(i));
2978*6777b538SAndroid Build Coastguard Worker }
2979*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CreateAndOpenTemporaryStreamTest)2980*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateAndOpenTemporaryStreamTest) {
2981*6777b538SAndroid Build Coastguard Worker FilePath names[3];
2982*6777b538SAndroid Build Coastguard Worker ScopedFILE fps[3];
2983*6777b538SAndroid Build Coastguard Worker int i;
2984*6777b538SAndroid Build Coastguard Worker
2985*6777b538SAndroid Build Coastguard Worker // Create; make sure they are open and exist.
2986*6777b538SAndroid Build Coastguard Worker for (i = 0; i < 3; ++i) {
2987*6777b538SAndroid Build Coastguard Worker fps[i] = CreateAndOpenTemporaryStream(&(names[i]));
2988*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(fps[i]);
2989*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(names[i]));
2990*6777b538SAndroid Build Coastguard Worker }
2991*6777b538SAndroid Build Coastguard Worker
2992*6777b538SAndroid Build Coastguard Worker // Make sure all names are unique.
2993*6777b538SAndroid Build Coastguard Worker for (i = 0; i < 3; ++i) {
2994*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(names[i] == names[(i+1)%3]);
2995*6777b538SAndroid Build Coastguard Worker }
2996*6777b538SAndroid Build Coastguard Worker
2997*6777b538SAndroid Build Coastguard Worker // Close and delete.
2998*6777b538SAndroid Build Coastguard Worker for (i = 0; i < 3; ++i) {
2999*6777b538SAndroid Build Coastguard Worker fps[i].reset();
3000*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(names[i]));
3001*6777b538SAndroid Build Coastguard Worker }
3002*6777b538SAndroid Build Coastguard Worker }
3003*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,GetUniquePathTest)3004*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetUniquePathTest) {
3005*6777b538SAndroid Build Coastguard Worker // Create a unique temp directory and use it to generate a unique file path.
3006*6777b538SAndroid Build Coastguard Worker base::ScopedTempDir temp_dir;
3007*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(temp_dir.CreateUniqueTempDir());
3008*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(temp_dir.IsValid());
3009*6777b538SAndroid Build Coastguard Worker FilePath base_name(FILE_PATH_LITERAL("Unique_Base_Name.txt"));
3010*6777b538SAndroid Build Coastguard Worker FilePath base_path = temp_dir.GetPath().Append(base_name);
3011*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(base_path));
3012*6777b538SAndroid Build Coastguard Worker
3013*6777b538SAndroid Build Coastguard Worker // GetUniquePath() should return unchanged path if file does not exist.
3014*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(base_path, GetUniquePath(base_path));
3015*6777b538SAndroid Build Coastguard Worker
3016*6777b538SAndroid Build Coastguard Worker // Create the file.
3017*6777b538SAndroid Build Coastguard Worker {
3018*6777b538SAndroid Build Coastguard Worker File file(base_path,
3019*6777b538SAndroid Build Coastguard Worker File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE);
3020*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(base_path));
3021*6777b538SAndroid Build Coastguard Worker }
3022*6777b538SAndroid Build Coastguard Worker
3023*6777b538SAndroid Build Coastguard Worker static const FilePath::CharType* const kExpectedNames[] = {
3024*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("Unique_Base_Name (1).txt"),
3025*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("Unique_Base_Name (2).txt"),
3026*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("Unique_Base_Name (3).txt"),
3027*6777b538SAndroid Build Coastguard Worker };
3028*6777b538SAndroid Build Coastguard Worker
3029*6777b538SAndroid Build Coastguard Worker // Call GetUniquePath() three times against this existing file name.
3030*6777b538SAndroid Build Coastguard Worker for (const FilePath::CharType* expected_name : kExpectedNames) {
3031*6777b538SAndroid Build Coastguard Worker FilePath expected_path = temp_dir.GetPath().Append(expected_name);
3032*6777b538SAndroid Build Coastguard Worker FilePath path = GetUniquePath(base_path);
3033*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(expected_path, path);
3034*6777b538SAndroid Build Coastguard Worker
3035*6777b538SAndroid Build Coastguard Worker // Verify that a file with this path indeed does not exist on the file
3036*6777b538SAndroid Build Coastguard Worker // system.
3037*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(path));
3038*6777b538SAndroid Build Coastguard Worker
3039*6777b538SAndroid Build Coastguard Worker // Create the file so it exists for the next call to GetUniquePath() in the
3040*6777b538SAndroid Build Coastguard Worker // loop.
3041*6777b538SAndroid Build Coastguard Worker File file(path, File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE);
3042*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(path));
3043*6777b538SAndroid Build Coastguard Worker }
3044*6777b538SAndroid Build Coastguard Worker }
3045*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,FileToFILE)3046*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, FileToFILE) {
3047*6777b538SAndroid Build Coastguard Worker File file;
3048*6777b538SAndroid Build Coastguard Worker FILE* stream = FileToFILE(std::move(file), "w");
3049*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(stream);
3050*6777b538SAndroid Build Coastguard Worker
3051*6777b538SAndroid Build Coastguard Worker FilePath file_name = temp_dir_.GetPath().Append(FPL("The file.txt"));
3052*6777b538SAndroid Build Coastguard Worker file = File(file_name, File::FLAG_CREATE | File::FLAG_WRITE);
3053*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(file.IsValid());
3054*6777b538SAndroid Build Coastguard Worker
3055*6777b538SAndroid Build Coastguard Worker stream = FileToFILE(std::move(file), "w");
3056*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(stream);
3057*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(file.IsValid());
3058*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CloseFile(stream));
3059*6777b538SAndroid Build Coastguard Worker }
3060*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,FILEToFile)3061*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, FILEToFile) {
3062*6777b538SAndroid Build Coastguard Worker ScopedFILE stream;
3063*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(FILEToFile(stream.get()).IsValid());
3064*6777b538SAndroid Build Coastguard Worker
3065*6777b538SAndroid Build Coastguard Worker stream.reset(OpenFile(temp_dir_.GetPath().Append(FPL("hello.txt")), "wb+"));
3066*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(stream);
3067*6777b538SAndroid Build Coastguard Worker File file = FILEToFile(stream.get());
3068*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(file.IsValid());
3069*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(fprintf(stream.get(), "there"), 5);
3070*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(fflush(stream.get()), 0);
3071*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file.GetLength(), 5L);
3072*6777b538SAndroid Build Coastguard Worker }
3073*6777b538SAndroid Build Coastguard Worker
3074*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
TEST_F(FileUtilTest,GetSecureSystemTemp)3075*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetSecureSystemTemp) {
3076*6777b538SAndroid Build Coastguard Worker FilePath secure_system_temp;
3077*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(GetSecureSystemTemp(&secure_system_temp), !!::IsUserAnAdmin());
3078*6777b538SAndroid Build Coastguard Worker if (!::IsUserAnAdmin()) {
3079*6777b538SAndroid Build Coastguard Worker GTEST_SKIP() << "This test must be run by an admin user";
3080*6777b538SAndroid Build Coastguard Worker }
3081*6777b538SAndroid Build Coastguard Worker
3082*6777b538SAndroid Build Coastguard Worker FilePath dir_windows;
3083*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathService::Get(DIR_WINDOWS, &dir_windows));
3084*6777b538SAndroid Build Coastguard Worker FilePath dir_program_files;
3085*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathService::Get(DIR_PROGRAM_FILES, &dir_program_files));
3086*6777b538SAndroid Build Coastguard Worker
3087*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE((dir_windows.AppendASCII("SystemTemp") == secure_system_temp) ||
3088*6777b538SAndroid Build Coastguard Worker (dir_program_files == secure_system_temp));
3089*6777b538SAndroid Build Coastguard Worker }
3090*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
3091*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CreateNewTempDirectoryTest)3092*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateNewTempDirectoryTest) {
3093*6777b538SAndroid Build Coastguard Worker FilePath temp_dir;
3094*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateNewTempDirectory(FilePath::StringType(), &temp_dir));
3095*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(temp_dir));
3096*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(temp_dir));
3097*6777b538SAndroid Build Coastguard Worker }
3098*6777b538SAndroid Build Coastguard Worker
3099*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
TEST_F(FileUtilTest,TempDirectoryParentTest)3100*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, TempDirectoryParentTest) {
3101*6777b538SAndroid Build Coastguard Worker if (!::IsUserAnAdmin()) {
3102*6777b538SAndroid Build Coastguard Worker GTEST_SKIP() << "This test must be run by an admin user";
3103*6777b538SAndroid Build Coastguard Worker }
3104*6777b538SAndroid Build Coastguard Worker FilePath temp_dir;
3105*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateNewTempDirectory(FilePath::StringType(), &temp_dir));
3106*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(temp_dir));
3107*6777b538SAndroid Build Coastguard Worker
3108*6777b538SAndroid Build Coastguard Worker FilePath expected_parent_dir;
3109*6777b538SAndroid Build Coastguard Worker if (!GetSecureSystemTemp(&expected_parent_dir)) {
3110*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathService::Get(DIR_TEMP, &expected_parent_dir));
3111*6777b538SAndroid Build Coastguard Worker }
3112*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(expected_parent_dir.IsParent(temp_dir));
3113*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(temp_dir));
3114*6777b538SAndroid Build Coastguard Worker }
3115*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
3116*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CreateNewTemporaryDirInDirTest)3117*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateNewTemporaryDirInDirTest) {
3118*6777b538SAndroid Build Coastguard Worker FilePath new_dir;
3119*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateTemporaryDirInDir(
3120*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath(), FILE_PATH_LITERAL("CreateNewTemporaryDirInDirTest"),
3121*6777b538SAndroid Build Coastguard Worker &new_dir));
3122*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(new_dir));
3123*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(temp_dir_.GetPath().IsParent(new_dir));
3124*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(new_dir));
3125*6777b538SAndroid Build Coastguard Worker }
3126*6777b538SAndroid Build Coastguard Worker
3127*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
TEST_F(FileUtilTest,GetShmemTempDirTest)3128*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetShmemTempDirTest) {
3129*6777b538SAndroid Build Coastguard Worker FilePath dir;
3130*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(GetShmemTempDir(false, &dir));
3131*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DirectoryExists(dir));
3132*6777b538SAndroid Build Coastguard Worker }
3133*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,AllocateFileRegionTest_ZeroOffset)3134*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, AllocateFileRegionTest_ZeroOffset) {
3135*6777b538SAndroid Build Coastguard Worker const int kTestFileLength = 9;
3136*6777b538SAndroid Build Coastguard Worker char test_data[] = "test_data";
3137*6777b538SAndroid Build Coastguard Worker FilePath file_path = temp_dir_.GetPath().Append(
3138*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("allocate_file_region_test_zero_offset"));
3139*6777b538SAndroid Build Coastguard Worker WriteFile(file_path, test_data, kTestFileLength);
3140*6777b538SAndroid Build Coastguard Worker
3141*6777b538SAndroid Build Coastguard Worker File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ |
3142*6777b538SAndroid Build Coastguard Worker base::File::FLAG_WRITE);
3143*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(file.IsValid());
3144*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(file.GetLength(), kTestFileLength);
3145*6777b538SAndroid Build Coastguard Worker
3146*6777b538SAndroid Build Coastguard Worker const int kExtendedFileLength = 23;
3147*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(AllocateFileRegion(&file, 0, kExtendedFileLength));
3148*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file.GetLength(), kExtendedFileLength);
3149*6777b538SAndroid Build Coastguard Worker
3150*6777b538SAndroid Build Coastguard Worker char data_read[32];
3151*6777b538SAndroid Build Coastguard Worker int bytes_read = file.Read(0, data_read, kExtendedFileLength);
3152*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(bytes_read, kExtendedFileLength);
3153*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kTestFileLength; ++i)
3154*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test_data[i], data_read[i]);
3155*6777b538SAndroid Build Coastguard Worker for (int i = kTestFileLength; i < kExtendedFileLength; ++i)
3156*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, data_read[i]);
3157*6777b538SAndroid Build Coastguard Worker }
3158*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,AllocateFileRegionTest_NonZeroOffset)3159*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, AllocateFileRegionTest_NonZeroOffset) {
3160*6777b538SAndroid Build Coastguard Worker const int kTestFileLength = 9;
3161*6777b538SAndroid Build Coastguard Worker char test_data[] = "test_data";
3162*6777b538SAndroid Build Coastguard Worker FilePath file_path = temp_dir_.GetPath().Append(
3163*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("allocate_file_region_test_non_zero_offset"));
3164*6777b538SAndroid Build Coastguard Worker WriteFile(file_path, test_data, kTestFileLength);
3165*6777b538SAndroid Build Coastguard Worker
3166*6777b538SAndroid Build Coastguard Worker File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ |
3167*6777b538SAndroid Build Coastguard Worker base::File::FLAG_WRITE);
3168*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(file.IsValid());
3169*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(file.GetLength(), kTestFileLength);
3170*6777b538SAndroid Build Coastguard Worker
3171*6777b538SAndroid Build Coastguard Worker const int kExtensionOffset = 5;
3172*6777b538SAndroid Build Coastguard Worker const int kExtensionSize = 10;
3173*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(AllocateFileRegion(&file, kExtensionOffset, kExtensionSize));
3174*6777b538SAndroid Build Coastguard Worker const int kExtendedFileLength = kExtensionOffset + kExtensionSize;
3175*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file.GetLength(), kExtendedFileLength);
3176*6777b538SAndroid Build Coastguard Worker
3177*6777b538SAndroid Build Coastguard Worker char data_read[32];
3178*6777b538SAndroid Build Coastguard Worker int bytes_read = file.Read(0, data_read, kExtendedFileLength);
3179*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(bytes_read, kExtendedFileLength);
3180*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kTestFileLength; ++i)
3181*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(test_data[i], data_read[i]);
3182*6777b538SAndroid Build Coastguard Worker for (int i = kTestFileLength; i < kExtendedFileLength; ++i)
3183*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, data_read[i]);
3184*6777b538SAndroid Build Coastguard Worker }
3185*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,AllocateFileRegionTest_DontTruncate)3186*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, AllocateFileRegionTest_DontTruncate) {
3187*6777b538SAndroid Build Coastguard Worker const int kTestFileLength = 9;
3188*6777b538SAndroid Build Coastguard Worker char test_data[] = "test_data";
3189*6777b538SAndroid Build Coastguard Worker FilePath file_path = temp_dir_.GetPath().Append(
3190*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("allocate_file_region_test_dont_truncate"));
3191*6777b538SAndroid Build Coastguard Worker WriteFile(file_path, test_data, kTestFileLength);
3192*6777b538SAndroid Build Coastguard Worker
3193*6777b538SAndroid Build Coastguard Worker File file(file_path, base::File::FLAG_OPEN | base::File::FLAG_READ |
3194*6777b538SAndroid Build Coastguard Worker base::File::FLAG_WRITE);
3195*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(file.IsValid());
3196*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(file.GetLength(), kTestFileLength);
3197*6777b538SAndroid Build Coastguard Worker
3198*6777b538SAndroid Build Coastguard Worker const int kTruncatedFileLength = 4;
3199*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(AllocateFileRegion(&file, 0, kTruncatedFileLength));
3200*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(file.GetLength(), kTestFileLength);
3201*6777b538SAndroid Build Coastguard Worker }
3202*6777b538SAndroid Build Coastguard Worker #endif
3203*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,GetHomeDirTest)3204*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetHomeDirTest) {
3205*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_ANDROID) // Not implemented on Android.
3206*6777b538SAndroid Build Coastguard Worker // We don't actually know what the home directory is supposed to be without
3207*6777b538SAndroid Build Coastguard Worker // calling some OS functions which would just duplicate the implementation.
3208*6777b538SAndroid Build Coastguard Worker // So here we just test that it returns something "reasonable".
3209*6777b538SAndroid Build Coastguard Worker FilePath home = GetHomeDir();
3210*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(home.empty());
3211*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(home.IsAbsolute());
3212*6777b538SAndroid Build Coastguard Worker #endif
3213*6777b538SAndroid Build Coastguard Worker }
3214*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CreateDirectoryTest)3215*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateDirectoryTest) {
3216*6777b538SAndroid Build Coastguard Worker FilePath test_root =
3217*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("create_directory_test"));
3218*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
3219*6777b538SAndroid Build Coastguard Worker FilePath test_path =
3220*6777b538SAndroid Build Coastguard Worker test_root.Append(FILE_PATH_LITERAL("dir\\tree\\likely\\doesnt\\exist\\"));
3221*6777b538SAndroid Build Coastguard Worker #elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
3222*6777b538SAndroid Build Coastguard Worker FilePath test_path =
3223*6777b538SAndroid Build Coastguard Worker test_root.Append(FILE_PATH_LITERAL("dir/tree/likely/doesnt/exist/"));
3224*6777b538SAndroid Build Coastguard Worker #endif
3225*6777b538SAndroid Build Coastguard Worker
3226*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(test_path));
3227*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CreateDirectory(test_path));
3228*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(test_path));
3229*6777b538SAndroid Build Coastguard Worker // CreateDirectory returns true if the DirectoryExists returns true.
3230*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CreateDirectory(test_path));
3231*6777b538SAndroid Build Coastguard Worker
3232*6777b538SAndroid Build Coastguard Worker // Doesn't work to create it on top of a non-dir
3233*6777b538SAndroid Build Coastguard Worker test_path = test_path.Append(FILE_PATH_LITERAL("foobar.txt"));
3234*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(test_path));
3235*6777b538SAndroid Build Coastguard Worker CreateTextFile(test_path, L"test file");
3236*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(test_path));
3237*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CreateDirectory(test_path));
3238*6777b538SAndroid Build Coastguard Worker
3239*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeletePathRecursively(test_root));
3240*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(test_root));
3241*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(test_path));
3242*6777b538SAndroid Build Coastguard Worker
3243*6777b538SAndroid Build Coastguard Worker // Verify assumptions made by the Windows implementation:
3244*6777b538SAndroid Build Coastguard Worker // 1. The current directory always exists.
3245*6777b538SAndroid Build Coastguard Worker // 2. The root directory always exists.
3246*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DirectoryExists(FilePath(FilePath::kCurrentDirectory)));
3247*6777b538SAndroid Build Coastguard Worker FilePath top_level = test_root;
3248*6777b538SAndroid Build Coastguard Worker while (top_level != top_level.DirName()) {
3249*6777b538SAndroid Build Coastguard Worker top_level = top_level.DirName();
3250*6777b538SAndroid Build Coastguard Worker }
3251*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DirectoryExists(top_level));
3252*6777b538SAndroid Build Coastguard Worker
3253*6777b538SAndroid Build Coastguard Worker // Given these assumptions hold, it should be safe to
3254*6777b538SAndroid Build Coastguard Worker // test that "creating" these directories succeeds.
3255*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CreateDirectory(
3256*6777b538SAndroid Build Coastguard Worker FilePath(FilePath::kCurrentDirectory)));
3257*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CreateDirectory(top_level));
3258*6777b538SAndroid Build Coastguard Worker
3259*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
3260*6777b538SAndroid Build Coastguard Worker FilePath invalid_drive(FILE_PATH_LITERAL("o:\\"));
3261*6777b538SAndroid Build Coastguard Worker FilePath invalid_path =
3262*6777b538SAndroid Build Coastguard Worker invalid_drive.Append(FILE_PATH_LITERAL("some\\inaccessible\\dir"));
3263*6777b538SAndroid Build Coastguard Worker if (!PathExists(invalid_drive)) {
3264*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(CreateDirectory(invalid_path));
3265*6777b538SAndroid Build Coastguard Worker }
3266*6777b538SAndroid Build Coastguard Worker #endif
3267*6777b538SAndroid Build Coastguard Worker }
3268*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,DetectDirectoryTest)3269*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DetectDirectoryTest) {
3270*6777b538SAndroid Build Coastguard Worker // Check a directory
3271*6777b538SAndroid Build Coastguard Worker FilePath test_root =
3272*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("detect_directory_test"));
3273*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(test_root));
3274*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CreateDirectory(test_root));
3275*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(test_root));
3276*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DirectoryExists(test_root));
3277*6777b538SAndroid Build Coastguard Worker // Check a file
3278*6777b538SAndroid Build Coastguard Worker FilePath test_path =
3279*6777b538SAndroid Build Coastguard Worker test_root.Append(FILE_PATH_LITERAL("foobar.txt"));
3280*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(test_path));
3281*6777b538SAndroid Build Coastguard Worker CreateTextFile(test_path, L"test file");
3282*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(test_path));
3283*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(DirectoryExists(test_path));
3284*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(test_path));
3285*6777b538SAndroid Build Coastguard Worker
3286*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeletePathRecursively(test_root));
3287*6777b538SAndroid Build Coastguard Worker }
3288*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,FileEnumeratorTest)3289*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, FileEnumeratorTest) {
3290*6777b538SAndroid Build Coastguard Worker // Test an empty directory.
3291*6777b538SAndroid Build Coastguard Worker FileEnumerator f0(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
3292*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(FPL(""), f0.Next().value());
3293*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(FPL(""), f0.Next().value());
3294*6777b538SAndroid Build Coastguard Worker
3295*6777b538SAndroid Build Coastguard Worker // Test an empty directory, non-recursively, including "..".
3296*6777b538SAndroid Build Coastguard Worker FileEnumerator f0_dotdot(
3297*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath(), false,
3298*6777b538SAndroid Build Coastguard Worker FILES_AND_DIRECTORIES | FileEnumerator::INCLUDE_DOT_DOT);
3299*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(temp_dir_.GetPath().Append(FPL("..")).value(),
3300*6777b538SAndroid Build Coastguard Worker f0_dotdot.Next().value());
3301*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(FPL(""), f0_dotdot.Next().value());
3302*6777b538SAndroid Build Coastguard Worker
3303*6777b538SAndroid Build Coastguard Worker // create the directories
3304*6777b538SAndroid Build Coastguard Worker FilePath dir1 = temp_dir_.GetPath().Append(FPL("dir1"));
3305*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CreateDirectory(dir1));
3306*6777b538SAndroid Build Coastguard Worker FilePath dir2 = temp_dir_.GetPath().Append(FPL("dir2"));
3307*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CreateDirectory(dir2));
3308*6777b538SAndroid Build Coastguard Worker FilePath dir2inner = dir2.Append(FPL("inner"));
3309*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(CreateDirectory(dir2inner));
3310*6777b538SAndroid Build Coastguard Worker
3311*6777b538SAndroid Build Coastguard Worker // create the files
3312*6777b538SAndroid Build Coastguard Worker FilePath dir2file = dir2.Append(FPL("dir2file.txt"));
3313*6777b538SAndroid Build Coastguard Worker CreateTextFile(dir2file, std::wstring());
3314*6777b538SAndroid Build Coastguard Worker FilePath dir2innerfile = dir2inner.Append(FPL("innerfile.txt"));
3315*6777b538SAndroid Build Coastguard Worker CreateTextFile(dir2innerfile, std::wstring());
3316*6777b538SAndroid Build Coastguard Worker FilePath file1 = temp_dir_.GetPath().Append(FPL("file1.txt"));
3317*6777b538SAndroid Build Coastguard Worker CreateTextFile(file1, std::wstring());
3318*6777b538SAndroid Build Coastguard Worker FilePath file2_rel = dir2.Append(FilePath::kParentDirectory)
3319*6777b538SAndroid Build Coastguard Worker .Append(FPL("file2.txt"));
3320*6777b538SAndroid Build Coastguard Worker CreateTextFile(file2_rel, std::wstring());
3321*6777b538SAndroid Build Coastguard Worker FilePath file2_abs = temp_dir_.GetPath().Append(FPL("file2.txt"));
3322*6777b538SAndroid Build Coastguard Worker
3323*6777b538SAndroid Build Coastguard Worker // Only enumerate files.
3324*6777b538SAndroid Build Coastguard Worker FileEnumerator f1(temp_dir_.GetPath(), true, FileEnumerator::FILES);
3325*6777b538SAndroid Build Coastguard Worker FindResultCollector c1(&f1);
3326*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c1.HasFile(file1));
3327*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c1.HasFile(file2_abs));
3328*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c1.HasFile(dir2file));
3329*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c1.HasFile(dir2innerfile));
3330*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(4, c1.size());
3331*6777b538SAndroid Build Coastguard Worker
3332*6777b538SAndroid Build Coastguard Worker // Only enumerate directories.
3333*6777b538SAndroid Build Coastguard Worker FileEnumerator f2(temp_dir_.GetPath(), true, FileEnumerator::DIRECTORIES);
3334*6777b538SAndroid Build Coastguard Worker FindResultCollector c2(&f2);
3335*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c2.HasFile(dir1));
3336*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c2.HasFile(dir2));
3337*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c2.HasFile(dir2inner));
3338*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, c2.size());
3339*6777b538SAndroid Build Coastguard Worker
3340*6777b538SAndroid Build Coastguard Worker // Only enumerate directories non-recursively.
3341*6777b538SAndroid Build Coastguard Worker FileEnumerator f2_non_recursive(temp_dir_.GetPath(), false,
3342*6777b538SAndroid Build Coastguard Worker FileEnumerator::DIRECTORIES);
3343*6777b538SAndroid Build Coastguard Worker FindResultCollector c2_non_recursive(&f2_non_recursive);
3344*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c2_non_recursive.HasFile(dir1));
3345*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c2_non_recursive.HasFile(dir2));
3346*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(2, c2_non_recursive.size());
3347*6777b538SAndroid Build Coastguard Worker
3348*6777b538SAndroid Build Coastguard Worker // Only enumerate directories, non-recursively, including "..".
3349*6777b538SAndroid Build Coastguard Worker FileEnumerator f2_dotdot(
3350*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath(), false,
3351*6777b538SAndroid Build Coastguard Worker FileEnumerator::DIRECTORIES | FileEnumerator::INCLUDE_DOT_DOT);
3352*6777b538SAndroid Build Coastguard Worker FindResultCollector c2_dotdot(&f2_dotdot);
3353*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c2_dotdot.HasFile(dir1));
3354*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c2_dotdot.HasFile(dir2));
3355*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c2_dotdot.HasFile(temp_dir_.GetPath().Append(FPL(".."))));
3356*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, c2_dotdot.size());
3357*6777b538SAndroid Build Coastguard Worker
3358*6777b538SAndroid Build Coastguard Worker // Enumerate files and directories.
3359*6777b538SAndroid Build Coastguard Worker FileEnumerator f3(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
3360*6777b538SAndroid Build Coastguard Worker FindResultCollector c3(&f3);
3361*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c3.HasFile(dir1));
3362*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c3.HasFile(dir2));
3363*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c3.HasFile(file1));
3364*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c3.HasFile(file2_abs));
3365*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c3.HasFile(dir2file));
3366*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c3.HasFile(dir2inner));
3367*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c3.HasFile(dir2innerfile));
3368*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(7, c3.size());
3369*6777b538SAndroid Build Coastguard Worker
3370*6777b538SAndroid Build Coastguard Worker // Non-recursive operation.
3371*6777b538SAndroid Build Coastguard Worker FileEnumerator f4(temp_dir_.GetPath(), false, FILES_AND_DIRECTORIES);
3372*6777b538SAndroid Build Coastguard Worker FindResultCollector c4(&f4);
3373*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c4.HasFile(dir2));
3374*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c4.HasFile(dir2));
3375*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c4.HasFile(file1));
3376*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c4.HasFile(file2_abs));
3377*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(4, c4.size());
3378*6777b538SAndroid Build Coastguard Worker
3379*6777b538SAndroid Build Coastguard Worker // Enumerate with a pattern.
3380*6777b538SAndroid Build Coastguard Worker FileEnumerator f5(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES,
3381*6777b538SAndroid Build Coastguard Worker FPL("dir*"));
3382*6777b538SAndroid Build Coastguard Worker FindResultCollector c5(&f5);
3383*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c5.HasFile(dir1));
3384*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c5.HasFile(dir2));
3385*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c5.HasFile(dir2file));
3386*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c5.HasFile(dir2inner));
3387*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c5.HasFile(dir2innerfile));
3388*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(5, c5.size());
3389*6777b538SAndroid Build Coastguard Worker
3390*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
3391*6777b538SAndroid Build Coastguard Worker {
3392*6777b538SAndroid Build Coastguard Worker // Make dir1 point to dir2.
3393*6777b538SAndroid Build Coastguard Worker auto reparse_point = test::FilePathReparsePoint::Create(dir1, dir2);
3394*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(reparse_point.has_value());
3395*6777b538SAndroid Build Coastguard Worker
3396*6777b538SAndroid Build Coastguard Worker // There can be a delay for the enumeration code to see the change on
3397*6777b538SAndroid Build Coastguard Worker // the file system so skip this test for XP.
3398*6777b538SAndroid Build Coastguard Worker // Enumerate the reparse point.
3399*6777b538SAndroid Build Coastguard Worker FileEnumerator f6(dir1, true, FILES_AND_DIRECTORIES);
3400*6777b538SAndroid Build Coastguard Worker FindResultCollector c6(&f6);
3401*6777b538SAndroid Build Coastguard Worker FilePath inner2 = dir1.Append(FPL("inner"));
3402*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c6.HasFile(inner2));
3403*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c6.HasFile(inner2.Append(FPL("innerfile.txt"))));
3404*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c6.HasFile(dir1.Append(FPL("dir2file.txt"))));
3405*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(3, c6.size());
3406*6777b538SAndroid Build Coastguard Worker
3407*6777b538SAndroid Build Coastguard Worker // No changes for non recursive operation.
3408*6777b538SAndroid Build Coastguard Worker FileEnumerator f7(temp_dir_.GetPath(), false, FILES_AND_DIRECTORIES);
3409*6777b538SAndroid Build Coastguard Worker FindResultCollector c7(&f7);
3410*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c7.HasFile(dir2));
3411*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c7.HasFile(dir2));
3412*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c7.HasFile(file1));
3413*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c7.HasFile(file2_abs));
3414*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(4, c7.size());
3415*6777b538SAndroid Build Coastguard Worker
3416*6777b538SAndroid Build Coastguard Worker // Should not enumerate inside dir1 when using recursion.
3417*6777b538SAndroid Build Coastguard Worker FileEnumerator f8(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
3418*6777b538SAndroid Build Coastguard Worker FindResultCollector c8(&f8);
3419*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c8.HasFile(dir1));
3420*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c8.HasFile(dir2));
3421*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c8.HasFile(file1));
3422*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c8.HasFile(file2_abs));
3423*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c8.HasFile(dir2file));
3424*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c8.HasFile(dir2inner));
3425*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(c8.HasFile(dir2innerfile));
3426*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(7, c8.size());
3427*6777b538SAndroid Build Coastguard Worker }
3428*6777b538SAndroid Build Coastguard Worker #endif
3429*6777b538SAndroid Build Coastguard Worker
3430*6777b538SAndroid Build Coastguard Worker // Make sure the destructor closes the find handle while in the middle of a
3431*6777b538SAndroid Build Coastguard Worker // query to allow TearDown to delete the directory.
3432*6777b538SAndroid Build Coastguard Worker FileEnumerator f9(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
3433*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(f9.Next().value().empty()); // Should have found something
3434*6777b538SAndroid Build Coastguard Worker // (we don't care what).
3435*6777b538SAndroid Build Coastguard Worker }
3436*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,AppendToFile)3437*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, AppendToFile) {
3438*6777b538SAndroid Build Coastguard Worker FilePath data_dir =
3439*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("FilePathTest"));
3440*6777b538SAndroid Build Coastguard Worker
3441*6777b538SAndroid Build Coastguard Worker // Create a fresh, empty copy of this directory.
3442*6777b538SAndroid Build Coastguard Worker if (PathExists(data_dir)) {
3443*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DeletePathRecursively(data_dir));
3444*6777b538SAndroid Build Coastguard Worker }
3445*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(data_dir));
3446*6777b538SAndroid Build Coastguard Worker
3447*6777b538SAndroid Build Coastguard Worker // Create a fresh, empty copy of this directory.
3448*6777b538SAndroid Build Coastguard Worker if (PathExists(data_dir)) {
3449*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DeletePathRecursively(data_dir));
3450*6777b538SAndroid Build Coastguard Worker }
3451*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(data_dir));
3452*6777b538SAndroid Build Coastguard Worker FilePath foobar(data_dir.Append(FILE_PATH_LITERAL("foobar.txt")));
3453*6777b538SAndroid Build Coastguard Worker
3454*6777b538SAndroid Build Coastguard Worker std::string data("hello");
3455*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(AppendToFile(foobar, data));
3456*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(WriteFile(foobar, data));
3457*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(AppendToFile(foobar, data));
3458*6777b538SAndroid Build Coastguard Worker
3459*6777b538SAndroid Build Coastguard Worker const std::wstring read_content = ReadTextFile(foobar);
3460*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(L"hellohello", read_content);
3461*6777b538SAndroid Build Coastguard Worker }
3462*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ReadFile)3463*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFile) {
3464*6777b538SAndroid Build Coastguard Worker // Create a test file to be read.
3465*6777b538SAndroid Build Coastguard Worker const std::string kTestData("The quick brown fox jumps over the lazy dog.");
3466*6777b538SAndroid Build Coastguard Worker FilePath file_path =
3467*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileTest"));
3468*6777b538SAndroid Build Coastguard Worker
3469*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WriteFile(file_path, kTestData));
3470*6777b538SAndroid Build Coastguard Worker
3471*6777b538SAndroid Build Coastguard Worker // Make buffers with various size.
3472*6777b538SAndroid Build Coastguard Worker std::vector<char> small_buffer(kTestData.size() / 2);
3473*6777b538SAndroid Build Coastguard Worker std::vector<char> exact_buffer(kTestData.size());
3474*6777b538SAndroid Build Coastguard Worker std::vector<char> large_buffer(kTestData.size() * 2);
3475*6777b538SAndroid Build Coastguard Worker
3476*6777b538SAndroid Build Coastguard Worker // Read the file with smaller buffer.
3477*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadFile(file_path, small_buffer), small_buffer.size());
3478*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(
3479*6777b538SAndroid Build Coastguard Worker std::string(kTestData.begin(), kTestData.begin() + small_buffer.size()),
3480*6777b538SAndroid Build Coastguard Worker std::string(small_buffer.begin(), small_buffer.end()));
3481*6777b538SAndroid Build Coastguard Worker
3482*6777b538SAndroid Build Coastguard Worker // Read the file with buffer which have exactly same size.
3483*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadFile(file_path, exact_buffer), kTestData.size());
3484*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kTestData, std::string(exact_buffer.begin(), exact_buffer.end()));
3485*6777b538SAndroid Build Coastguard Worker
3486*6777b538SAndroid Build Coastguard Worker // Read the file with larger buffer.
3487*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadFile(file_path, large_buffer), kTestData.size());
3488*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kTestData, std::string(large_buffer.begin(),
3489*6777b538SAndroid Build Coastguard Worker large_buffer.begin() + kTestData.size()));
3490*6777b538SAndroid Build Coastguard Worker
3491*6777b538SAndroid Build Coastguard Worker // Make sure the read fails if the file doesn't exist.
3492*6777b538SAndroid Build Coastguard Worker FilePath file_path_not_exist =
3493*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileNotExistTest"));
3494*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(ReadFile(file_path_not_exist, exact_buffer), std::nullopt);
3495*6777b538SAndroid Build Coastguard Worker }
3496*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ReadFileToBytes)3497*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToBytes) {
3498*6777b538SAndroid Build Coastguard Worker const std::vector<uint8_t> kTestData = {'0', '1', '2', '3'};
3499*6777b538SAndroid Build Coastguard Worker
3500*6777b538SAndroid Build Coastguard Worker FilePath file_path =
3501*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
3502*6777b538SAndroid Build Coastguard Worker FilePath file_path_dangerous =
3503*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath()
3504*6777b538SAndroid Build Coastguard Worker .Append(FILE_PATH_LITERAL(".."))
3505*6777b538SAndroid Build Coastguard Worker .Append(temp_dir_.GetPath().BaseName())
3506*6777b538SAndroid Build Coastguard Worker .Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
3507*6777b538SAndroid Build Coastguard Worker
3508*6777b538SAndroid Build Coastguard Worker // Create test file.
3509*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WriteFile(file_path, kTestData));
3510*6777b538SAndroid Build Coastguard Worker
3511*6777b538SAndroid Build Coastguard Worker std::optional<std::vector<uint8_t>> bytes = ReadFileToBytes(file_path);
3512*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(bytes.has_value());
3513*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kTestData, bytes);
3514*6777b538SAndroid Build Coastguard Worker
3515*6777b538SAndroid Build Coastguard Worker // Write empty file.
3516*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WriteFile(file_path, ""));
3517*6777b538SAndroid Build Coastguard Worker bytes = ReadFileToBytes(file_path);
3518*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(bytes.has_value());
3519*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(bytes->empty());
3520*6777b538SAndroid Build Coastguard Worker
3521*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(ReadFileToBytes(file_path_dangerous));
3522*6777b538SAndroid Build Coastguard Worker }
3523*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ReadFileToString)3524*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToString) {
3525*6777b538SAndroid Build Coastguard Worker const char kTestData[] = "0123";
3526*6777b538SAndroid Build Coastguard Worker std::string data;
3527*6777b538SAndroid Build Coastguard Worker
3528*6777b538SAndroid Build Coastguard Worker FilePath file_path =
3529*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
3530*6777b538SAndroid Build Coastguard Worker FilePath file_path_dangerous =
3531*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath()
3532*6777b538SAndroid Build Coastguard Worker .Append(FILE_PATH_LITERAL(".."))
3533*6777b538SAndroid Build Coastguard Worker .Append(temp_dir_.GetPath().BaseName())
3534*6777b538SAndroid Build Coastguard Worker .Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
3535*6777b538SAndroid Build Coastguard Worker
3536*6777b538SAndroid Build Coastguard Worker // Create test file.
3537*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WriteFile(file_path, kTestData));
3538*6777b538SAndroid Build Coastguard Worker
3539*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToString(file_path, &data));
3540*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kTestData, data);
3541*6777b538SAndroid Build Coastguard Worker
3542*6777b538SAndroid Build Coastguard Worker data = "temp";
3543*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 0));
3544*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, data.length());
3545*6777b538SAndroid Build Coastguard Worker
3546*6777b538SAndroid Build Coastguard Worker data = "temp";
3547*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 2));
3548*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("01", data);
3549*6777b538SAndroid Build Coastguard Worker
3550*6777b538SAndroid Build Coastguard Worker data = "temp";
3551*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 3));
3552*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("012", data);
3553*6777b538SAndroid Build Coastguard Worker
3554*6777b538SAndroid Build Coastguard Worker data = "temp";
3555*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToStringWithMaxSize(file_path, &data, 4));
3556*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("0123", data);
3557*6777b538SAndroid Build Coastguard Worker
3558*6777b538SAndroid Build Coastguard Worker data = "temp";
3559*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToStringWithMaxSize(file_path, &data, 6));
3560*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("0123", data);
3561*6777b538SAndroid Build Coastguard Worker
3562*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToStringWithMaxSize(file_path, nullptr, 6));
3563*6777b538SAndroid Build Coastguard Worker
3564*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToString(file_path, nullptr));
3565*6777b538SAndroid Build Coastguard Worker
3566*6777b538SAndroid Build Coastguard Worker data = "temp";
3567*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToString(file_path_dangerous, &data));
3568*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, data.length());
3569*6777b538SAndroid Build Coastguard Worker
3570*6777b538SAndroid Build Coastguard Worker // Delete test file.
3571*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(DeleteFile(file_path));
3572*6777b538SAndroid Build Coastguard Worker
3573*6777b538SAndroid Build Coastguard Worker data = "temp";
3574*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToString(file_path, &data));
3575*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, data.length());
3576*6777b538SAndroid Build Coastguard Worker
3577*6777b538SAndroid Build Coastguard Worker data = "temp";
3578*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 6));
3579*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, data.length());
3580*6777b538SAndroid Build Coastguard Worker }
3581*6777b538SAndroid Build Coastguard Worker
3582*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_WIN)
TEST_F(FileUtilTest,ReadFileToStringWithUnknownFileSize)3583*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToStringWithUnknownFileSize) {
3584*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
3585*6777b538SAndroid Build Coastguard Worker test::TaskEnvironment task_environment;
3586*6777b538SAndroid Build Coastguard Worker auto dev_zero = ScopedDevZero::Get();
3587*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(dev_zero);
3588*6777b538SAndroid Build Coastguard Worker #endif
3589*6777b538SAndroid Build Coastguard Worker FilePath file_path("/dev/zero");
3590*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3591*6777b538SAndroid Build Coastguard Worker
3592*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 0));
3593*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, data.length());
3594*6777b538SAndroid Build Coastguard Worker
3595*6777b538SAndroid Build Coastguard Worker data = "temp";
3596*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 2));
3597*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string(2, '\0'), data);
3598*6777b538SAndroid Build Coastguard Worker
3599*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, nullptr, 6));
3600*6777b538SAndroid Build Coastguard Worker
3601*6777b538SAndroid Build Coastguard Worker // Read more than buffer size.
3602*6777b538SAndroid Build Coastguard Worker data = "temp";
3603*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, kLargeFileSize));
3604*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(kLargeFileSize, data.length());
3605*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string(kLargeFileSize, '\0'), data);
3606*6777b538SAndroid Build Coastguard Worker
3607*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, nullptr, kLargeFileSize));
3608*6777b538SAndroid Build Coastguard Worker }
3609*6777b538SAndroid Build Coastguard Worker #endif // !BUILDFLAG(IS_WIN)
3610*6777b538SAndroid Build Coastguard Worker
3611*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_FUCHSIA) && \
3612*6777b538SAndroid Build Coastguard Worker !BUILDFLAG(IS_IOS)
3613*6777b538SAndroid Build Coastguard Worker #define ChildMain WriteToPipeChildMain
3614*6777b538SAndroid Build Coastguard Worker #define ChildMainString "WriteToPipeChildMain"
3615*6777b538SAndroid Build Coastguard Worker
MULTIPROCESS_TEST_MAIN(ChildMain)3616*6777b538SAndroid Build Coastguard Worker MULTIPROCESS_TEST_MAIN(ChildMain) {
3617*6777b538SAndroid Build Coastguard Worker const char kTestData[] = "0123";
3618*6777b538SAndroid Build Coastguard Worker CommandLine* command_line = CommandLine::ForCurrentProcess();
3619*6777b538SAndroid Build Coastguard Worker const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
3620*6777b538SAndroid Build Coastguard Worker
3621*6777b538SAndroid Build Coastguard Worker int fd = open(pipe_path.value().c_str(), O_WRONLY);
3622*6777b538SAndroid Build Coastguard Worker CHECK_NE(-1, fd);
3623*6777b538SAndroid Build Coastguard Worker size_t written = 0;
3624*6777b538SAndroid Build Coastguard Worker while (written < strlen(kTestData)) {
3625*6777b538SAndroid Build Coastguard Worker ssize_t res = write(fd, kTestData + written, strlen(kTestData) - written);
3626*6777b538SAndroid Build Coastguard Worker if (res == -1)
3627*6777b538SAndroid Build Coastguard Worker break;
3628*6777b538SAndroid Build Coastguard Worker written += res;
3629*6777b538SAndroid Build Coastguard Worker }
3630*6777b538SAndroid Build Coastguard Worker CHECK_EQ(strlen(kTestData), written);
3631*6777b538SAndroid Build Coastguard Worker CHECK_EQ(0, close(fd));
3632*6777b538SAndroid Build Coastguard Worker return 0;
3633*6777b538SAndroid Build Coastguard Worker }
3634*6777b538SAndroid Build Coastguard Worker
3635*6777b538SAndroid Build Coastguard Worker #define MoreThanBufferSizeChildMain WriteToPipeMoreThanBufferSizeChildMain
3636*6777b538SAndroid Build Coastguard Worker #define MoreThanBufferSizeChildMainString \
3637*6777b538SAndroid Build Coastguard Worker "WriteToPipeMoreThanBufferSizeChildMain"
3638*6777b538SAndroid Build Coastguard Worker
MULTIPROCESS_TEST_MAIN(MoreThanBufferSizeChildMain)3639*6777b538SAndroid Build Coastguard Worker MULTIPROCESS_TEST_MAIN(MoreThanBufferSizeChildMain) {
3640*6777b538SAndroid Build Coastguard Worker std::string data(kLargeFileSize, 'c');
3641*6777b538SAndroid Build Coastguard Worker CommandLine* command_line = CommandLine::ForCurrentProcess();
3642*6777b538SAndroid Build Coastguard Worker const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
3643*6777b538SAndroid Build Coastguard Worker
3644*6777b538SAndroid Build Coastguard Worker int fd = open(pipe_path.value().c_str(), O_WRONLY);
3645*6777b538SAndroid Build Coastguard Worker CHECK_NE(-1, fd);
3646*6777b538SAndroid Build Coastguard Worker
3647*6777b538SAndroid Build Coastguard Worker size_t written = 0;
3648*6777b538SAndroid Build Coastguard Worker while (written < data.size()) {
3649*6777b538SAndroid Build Coastguard Worker ssize_t res = write(fd, data.c_str() + written, data.size() - written);
3650*6777b538SAndroid Build Coastguard Worker if (res == -1) {
3651*6777b538SAndroid Build Coastguard Worker // We are unable to write because reading process has already read
3652*6777b538SAndroid Build Coastguard Worker // requested number of bytes and closed pipe.
3653*6777b538SAndroid Build Coastguard Worker break;
3654*6777b538SAndroid Build Coastguard Worker }
3655*6777b538SAndroid Build Coastguard Worker written += res;
3656*6777b538SAndroid Build Coastguard Worker }
3657*6777b538SAndroid Build Coastguard Worker CHECK_EQ(0, close(fd));
3658*6777b538SAndroid Build Coastguard Worker return 0;
3659*6777b538SAndroid Build Coastguard Worker }
3660*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ReadFileToStringWithNamedPipe)3661*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToStringWithNamedPipe) {
3662*6777b538SAndroid Build Coastguard Worker FilePath pipe_path =
3663*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("test_pipe"));
3664*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, mkfifo(pipe_path.value().c_str(), 0600));
3665*6777b538SAndroid Build Coastguard Worker
3666*6777b538SAndroid Build Coastguard Worker CommandLine child_command_line(GetMultiProcessTestChildBaseCommandLine());
3667*6777b538SAndroid Build Coastguard Worker child_command_line.AppendSwitchPath("pipe-path", pipe_path);
3668*6777b538SAndroid Build Coastguard Worker
3669*6777b538SAndroid Build Coastguard Worker {
3670*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3671*6777b538SAndroid Build Coastguard Worker ChildMainString, child_command_line, LaunchOptions());
3672*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3673*6777b538SAndroid Build Coastguard Worker
3674*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3675*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 2));
3676*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("01", data);
3677*6777b538SAndroid Build Coastguard Worker
3678*6777b538SAndroid Build Coastguard Worker int rv = -1;
3679*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3680*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3681*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3682*6777b538SAndroid Build Coastguard Worker }
3683*6777b538SAndroid Build Coastguard Worker {
3684*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3685*6777b538SAndroid Build Coastguard Worker ChildMainString, child_command_line, LaunchOptions());
3686*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3687*6777b538SAndroid Build Coastguard Worker
3688*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3689*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
3690*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("0123", data);
3691*6777b538SAndroid Build Coastguard Worker
3692*6777b538SAndroid Build Coastguard Worker int rv = -1;
3693*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3694*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3695*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3696*6777b538SAndroid Build Coastguard Worker }
3697*6777b538SAndroid Build Coastguard Worker {
3698*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3699*6777b538SAndroid Build Coastguard Worker MoreThanBufferSizeChildMainString, child_command_line, LaunchOptions());
3700*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3701*6777b538SAndroid Build Coastguard Worker
3702*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3703*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
3704*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("cccccc", data);
3705*6777b538SAndroid Build Coastguard Worker
3706*6777b538SAndroid Build Coastguard Worker int rv = -1;
3707*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3708*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3709*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3710*6777b538SAndroid Build Coastguard Worker }
3711*6777b538SAndroid Build Coastguard Worker {
3712*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3713*6777b538SAndroid Build Coastguard Worker MoreThanBufferSizeChildMainString, child_command_line, LaunchOptions());
3714*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3715*6777b538SAndroid Build Coastguard Worker
3716*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3717*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
3718*6777b538SAndroid Build Coastguard Worker ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize - 1));
3719*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string(kLargeFileSize - 1, 'c'), data);
3720*6777b538SAndroid Build Coastguard Worker
3721*6777b538SAndroid Build Coastguard Worker int rv = -1;
3722*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3723*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3724*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3725*6777b538SAndroid Build Coastguard Worker }
3726*6777b538SAndroid Build Coastguard Worker {
3727*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3728*6777b538SAndroid Build Coastguard Worker MoreThanBufferSizeChildMainString, child_command_line, LaunchOptions());
3729*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3730*6777b538SAndroid Build Coastguard Worker
3731*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3732*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize));
3733*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
3734*6777b538SAndroid Build Coastguard Worker
3735*6777b538SAndroid Build Coastguard Worker int rv = -1;
3736*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3737*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3738*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3739*6777b538SAndroid Build Coastguard Worker }
3740*6777b538SAndroid Build Coastguard Worker {
3741*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3742*6777b538SAndroid Build Coastguard Worker MoreThanBufferSizeChildMainString, child_command_line, LaunchOptions());
3743*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3744*6777b538SAndroid Build Coastguard Worker
3745*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3746*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
3747*6777b538SAndroid Build Coastguard Worker ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize * 5));
3748*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
3749*6777b538SAndroid Build Coastguard Worker
3750*6777b538SAndroid Build Coastguard Worker int rv = -1;
3751*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3752*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3753*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3754*6777b538SAndroid Build Coastguard Worker }
3755*6777b538SAndroid Build Coastguard Worker
3756*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, unlink(pipe_path.value().c_str()));
3757*6777b538SAndroid Build Coastguard Worker }
3758*6777b538SAndroid Build Coastguard Worker #endif // !BUILDFLAG(IS_WIN) && !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_FUCHSIA)
3759*6777b538SAndroid Build Coastguard Worker // && !BUILDFLAG(IS_IOS)
3760*6777b538SAndroid Build Coastguard Worker
3761*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
3762*6777b538SAndroid Build Coastguard Worker #define ChildMain WriteToPipeChildMain
3763*6777b538SAndroid Build Coastguard Worker #define ChildMainString "WriteToPipeChildMain"
3764*6777b538SAndroid Build Coastguard Worker
MULTIPROCESS_TEST_MAIN(ChildMain)3765*6777b538SAndroid Build Coastguard Worker MULTIPROCESS_TEST_MAIN(ChildMain) {
3766*6777b538SAndroid Build Coastguard Worker const char kTestData[] = "0123";
3767*6777b538SAndroid Build Coastguard Worker CommandLine* command_line = CommandLine::ForCurrentProcess();
3768*6777b538SAndroid Build Coastguard Worker const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
3769*6777b538SAndroid Build Coastguard Worker std::string switch_string = command_line->GetSwitchValueASCII("sync_event");
3770*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(switch_string.empty());
3771*6777b538SAndroid Build Coastguard Worker unsigned int switch_uint = 0;
3772*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(StringToUint(switch_string, &switch_uint));
3773*6777b538SAndroid Build Coastguard Worker win::ScopedHandle sync_event(win::Uint32ToHandle(switch_uint));
3774*6777b538SAndroid Build Coastguard Worker
3775*6777b538SAndroid Build Coastguard Worker HANDLE ph = CreateNamedPipe(pipe_path.value().c_str(), PIPE_ACCESS_OUTBOUND,
3776*6777b538SAndroid Build Coastguard Worker PIPE_WAIT, 1, 0, 0, 0, NULL);
3777*6777b538SAndroid Build Coastguard Worker EXPECT_NE(ph, INVALID_HANDLE_VALUE);
3778*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SetEvent(sync_event.get()));
3779*6777b538SAndroid Build Coastguard Worker if (!::ConnectNamedPipe(ph, /*lpOverlapped=*/nullptr)) {
3780*6777b538SAndroid Build Coastguard Worker // ERROR_PIPE_CONNECTED means that the other side has already connected.
3781*6777b538SAndroid Build Coastguard Worker auto error = ::GetLastError();
3782*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(error, DWORD{ERROR_PIPE_CONNECTED});
3783*6777b538SAndroid Build Coastguard Worker }
3784*6777b538SAndroid Build Coastguard Worker
3785*6777b538SAndroid Build Coastguard Worker DWORD written;
3786*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(::WriteFile(ph, kTestData, strlen(kTestData), &written, NULL));
3787*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(strlen(kTestData), written);
3788*6777b538SAndroid Build Coastguard Worker CloseHandle(ph);
3789*6777b538SAndroid Build Coastguard Worker return 0;
3790*6777b538SAndroid Build Coastguard Worker }
3791*6777b538SAndroid Build Coastguard Worker
3792*6777b538SAndroid Build Coastguard Worker #define MoreThanBufferSizeChildMain WriteToPipeMoreThanBufferSizeChildMain
3793*6777b538SAndroid Build Coastguard Worker #define MoreThanBufferSizeChildMainString \
3794*6777b538SAndroid Build Coastguard Worker "WriteToPipeMoreThanBufferSizeChildMain"
3795*6777b538SAndroid Build Coastguard Worker
MULTIPROCESS_TEST_MAIN(MoreThanBufferSizeChildMain)3796*6777b538SAndroid Build Coastguard Worker MULTIPROCESS_TEST_MAIN(MoreThanBufferSizeChildMain) {
3797*6777b538SAndroid Build Coastguard Worker std::string data(kLargeFileSize, 'c');
3798*6777b538SAndroid Build Coastguard Worker CommandLine* command_line = CommandLine::ForCurrentProcess();
3799*6777b538SAndroid Build Coastguard Worker const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
3800*6777b538SAndroid Build Coastguard Worker std::string switch_string = command_line->GetSwitchValueASCII("sync_event");
3801*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(switch_string.empty());
3802*6777b538SAndroid Build Coastguard Worker unsigned int switch_uint = 0;
3803*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(StringToUint(switch_string, &switch_uint));
3804*6777b538SAndroid Build Coastguard Worker win::ScopedHandle sync_event(win::Uint32ToHandle(switch_uint));
3805*6777b538SAndroid Build Coastguard Worker
3806*6777b538SAndroid Build Coastguard Worker HANDLE ph = CreateNamedPipe(pipe_path.value().c_str(), PIPE_ACCESS_OUTBOUND,
3807*6777b538SAndroid Build Coastguard Worker PIPE_WAIT, 1, data.size(), data.size(), 0, NULL);
3808*6777b538SAndroid Build Coastguard Worker EXPECT_NE(ph, INVALID_HANDLE_VALUE);
3809*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SetEvent(sync_event.get()));
3810*6777b538SAndroid Build Coastguard Worker if (!::ConnectNamedPipe(ph, /*lpOverlapped=*/nullptr)) {
3811*6777b538SAndroid Build Coastguard Worker // ERROR_PIPE_CONNECTED means that the other side has already connected.
3812*6777b538SAndroid Build Coastguard Worker auto error = ::GetLastError();
3813*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(error, DWORD{ERROR_PIPE_CONNECTED});
3814*6777b538SAndroid Build Coastguard Worker }
3815*6777b538SAndroid Build Coastguard Worker
3816*6777b538SAndroid Build Coastguard Worker DWORD written;
3817*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(::WriteFile(ph, data.c_str(), data.size(), &written, NULL));
3818*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(data.size(), written);
3819*6777b538SAndroid Build Coastguard Worker CloseHandle(ph);
3820*6777b538SAndroid Build Coastguard Worker return 0;
3821*6777b538SAndroid Build Coastguard Worker }
3822*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ReadFileToStringWithNamedPipe)3823*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToStringWithNamedPipe) {
3824*6777b538SAndroid Build Coastguard Worker FilePath pipe_path(FILE_PATH_LITERAL("\\\\.\\pipe\\test_pipe"));
3825*6777b538SAndroid Build Coastguard Worker win::ScopedHandle sync_event(CreateEvent(0, false, false, nullptr));
3826*6777b538SAndroid Build Coastguard Worker
3827*6777b538SAndroid Build Coastguard Worker CommandLine child_command_line(GetMultiProcessTestChildBaseCommandLine());
3828*6777b538SAndroid Build Coastguard Worker child_command_line.AppendSwitchPath("pipe-path", pipe_path);
3829*6777b538SAndroid Build Coastguard Worker child_command_line.AppendSwitchASCII(
3830*6777b538SAndroid Build Coastguard Worker "sync_event", NumberToString(win::HandleToUint32(sync_event.get())));
3831*6777b538SAndroid Build Coastguard Worker
3832*6777b538SAndroid Build Coastguard Worker LaunchOptions options;
3833*6777b538SAndroid Build Coastguard Worker options.handles_to_inherit.push_back(sync_event.get());
3834*6777b538SAndroid Build Coastguard Worker
3835*6777b538SAndroid Build Coastguard Worker {
3836*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3837*6777b538SAndroid Build Coastguard Worker ChildMainString, child_command_line, options);
3838*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3839*6777b538SAndroid Build Coastguard Worker // Wait for pipe creation in child process.
3840*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.get(), INFINITE));
3841*6777b538SAndroid Build Coastguard Worker
3842*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3843*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 2));
3844*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("01", data);
3845*6777b538SAndroid Build Coastguard Worker
3846*6777b538SAndroid Build Coastguard Worker int rv = -1;
3847*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3848*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3849*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3850*6777b538SAndroid Build Coastguard Worker }
3851*6777b538SAndroid Build Coastguard Worker {
3852*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3853*6777b538SAndroid Build Coastguard Worker ChildMainString, child_command_line, options);
3854*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3855*6777b538SAndroid Build Coastguard Worker // Wait for pipe creation in child process.
3856*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.get(), INFINITE));
3857*6777b538SAndroid Build Coastguard Worker
3858*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3859*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
3860*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("0123", data);
3861*6777b538SAndroid Build Coastguard Worker
3862*6777b538SAndroid Build Coastguard Worker int rv = -1;
3863*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3864*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3865*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3866*6777b538SAndroid Build Coastguard Worker }
3867*6777b538SAndroid Build Coastguard Worker {
3868*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3869*6777b538SAndroid Build Coastguard Worker MoreThanBufferSizeChildMainString, child_command_line, options);
3870*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3871*6777b538SAndroid Build Coastguard Worker // Wait for pipe creation in child process.
3872*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.get(), INFINITE));
3873*6777b538SAndroid Build Coastguard Worker
3874*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3875*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
3876*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("cccccc", data);
3877*6777b538SAndroid Build Coastguard Worker
3878*6777b538SAndroid Build Coastguard Worker int rv = -1;
3879*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3880*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3881*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3882*6777b538SAndroid Build Coastguard Worker }
3883*6777b538SAndroid Build Coastguard Worker {
3884*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3885*6777b538SAndroid Build Coastguard Worker MoreThanBufferSizeChildMainString, child_command_line, options);
3886*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3887*6777b538SAndroid Build Coastguard Worker // Wait for pipe creation in child process.
3888*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.get(), INFINITE));
3889*6777b538SAndroid Build Coastguard Worker
3890*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3891*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
3892*6777b538SAndroid Build Coastguard Worker ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize - 1));
3893*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string(kLargeFileSize - 1, 'c'), data);
3894*6777b538SAndroid Build Coastguard Worker
3895*6777b538SAndroid Build Coastguard Worker int rv = -1;
3896*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3897*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3898*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3899*6777b538SAndroid Build Coastguard Worker }
3900*6777b538SAndroid Build Coastguard Worker {
3901*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3902*6777b538SAndroid Build Coastguard Worker MoreThanBufferSizeChildMainString, child_command_line, options);
3903*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3904*6777b538SAndroid Build Coastguard Worker // Wait for pipe creation in child process.
3905*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.get(), INFINITE));
3906*6777b538SAndroid Build Coastguard Worker
3907*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3908*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize));
3909*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
3910*6777b538SAndroid Build Coastguard Worker
3911*6777b538SAndroid Build Coastguard Worker int rv = -1;
3912*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3913*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3914*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3915*6777b538SAndroid Build Coastguard Worker }
3916*6777b538SAndroid Build Coastguard Worker {
3917*6777b538SAndroid Build Coastguard Worker Process child_process = SpawnMultiProcessTestChild(
3918*6777b538SAndroid Build Coastguard Worker MoreThanBufferSizeChildMainString, child_command_line, options);
3919*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(child_process.IsValid());
3920*6777b538SAndroid Build Coastguard Worker // Wait for pipe creation in child process.
3921*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.get(), INFINITE));
3922*6777b538SAndroid Build Coastguard Worker
3923*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3924*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
3925*6777b538SAndroid Build Coastguard Worker ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize * 5));
3926*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
3927*6777b538SAndroid Build Coastguard Worker
3928*6777b538SAndroid Build Coastguard Worker int rv = -1;
3929*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3930*6777b538SAndroid Build Coastguard Worker child_process, TestTimeouts::action_timeout(), &rv));
3931*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, rv);
3932*6777b538SAndroid Build Coastguard Worker }
3933*6777b538SAndroid Build Coastguard Worker }
3934*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_WIN)
3935*6777b538SAndroid Build Coastguard Worker
3936*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE)
TEST_F(FileUtilTest,ReadFileToStringWithProcFileSystem)3937*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToStringWithProcFileSystem) {
3938*6777b538SAndroid Build Coastguard Worker FilePath file_path("/proc/cpuinfo");
3939*6777b538SAndroid Build Coastguard Worker std::string data = "temp";
3940*6777b538SAndroid Build Coastguard Worker
3941*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 0));
3942*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, data.length());
3943*6777b538SAndroid Build Coastguard Worker
3944*6777b538SAndroid Build Coastguard Worker data = "temp";
3945*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 2));
3946*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(EqualsCaseInsensitiveASCII("pr", data));
3947*6777b538SAndroid Build Coastguard Worker
3948*6777b538SAndroid Build Coastguard Worker data = "temp";
3949*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 4));
3950*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(EqualsCaseInsensitiveASCII("proc", data));
3951*6777b538SAndroid Build Coastguard Worker
3952*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, nullptr, 4));
3953*6777b538SAndroid Build Coastguard Worker }
3954*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_POSIX) && !BUILDFLAG(IS_APPLE)
3955*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ReadFileToStringWithLargeFile)3956*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToStringWithLargeFile) {
3957*6777b538SAndroid Build Coastguard Worker std::string data(kLargeFileSize, 'c');
3958*6777b538SAndroid Build Coastguard Worker
3959*6777b538SAndroid Build Coastguard Worker FilePath file_path =
3960*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
3961*6777b538SAndroid Build Coastguard Worker
3962*6777b538SAndroid Build Coastguard Worker // Create test file.
3963*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WriteFile(file_path, data));
3964*6777b538SAndroid Build Coastguard Worker
3965*6777b538SAndroid Build Coastguard Worker std::string actual_data = "temp";
3966*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToString(file_path, &actual_data));
3967*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(data, actual_data);
3968*6777b538SAndroid Build Coastguard Worker
3969*6777b538SAndroid Build Coastguard Worker actual_data = "temp";
3970*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &actual_data, 0));
3971*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0u, actual_data.length());
3972*6777b538SAndroid Build Coastguard Worker
3973*6777b538SAndroid Build Coastguard Worker // Read more than buffer size.
3974*6777b538SAndroid Build Coastguard Worker actual_data = "temp";
3975*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
3976*6777b538SAndroid Build Coastguard Worker ReadFileToStringWithMaxSize(file_path, &actual_data, kLargeFileSize - 1));
3977*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(std::string(kLargeFileSize - 1, 'c'), actual_data);
3978*6777b538SAndroid Build Coastguard Worker }
3979*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ReadStreamToString)3980*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadStreamToString) {
3981*6777b538SAndroid Build Coastguard Worker ScopedFILE stream(
3982*6777b538SAndroid Build Coastguard Worker OpenFile(temp_dir_.GetPath().Append(FPL("hello.txt")), "wb+"));
3983*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(stream);
3984*6777b538SAndroid Build Coastguard Worker File file = FILEToFile(stream.get());
3985*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(file.IsValid());
3986*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(fprintf(stream.get(), "there"), 5);
3987*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(fflush(stream.get()), 0);
3988*6777b538SAndroid Build Coastguard Worker
3989*6777b538SAndroid Build Coastguard Worker std::string contents;
3990*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadStreamToString(stream.get(), &contents));
3991*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(contents, std::string("there"));
3992*6777b538SAndroid Build Coastguard Worker }
3993*6777b538SAndroid Build Coastguard Worker
3994*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX)
TEST_F(FileUtilTest,ReadStreamToString_ZeroLengthFile)3995*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadStreamToString_ZeroLengthFile) {
3996*6777b538SAndroid Build Coastguard Worker Thread write_thread("write thread");
3997*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(write_thread.Start());
3998*6777b538SAndroid Build Coastguard Worker
3999*6777b538SAndroid Build Coastguard Worker const size_t kSizes[] = {0, 1, 4095, 4096, 4097, 65535, 65536, 65537};
4000*6777b538SAndroid Build Coastguard Worker
4001*6777b538SAndroid Build Coastguard Worker for (size_t size : kSizes) {
4002*6777b538SAndroid Build Coastguard Worker ScopedFD read_fd, write_fd;
4003*6777b538SAndroid Build Coastguard Worker // Pipes have a length of zero when stat()'d.
4004*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreatePipe(&read_fd, &write_fd, false /* non_blocking */));
4005*6777b538SAndroid Build Coastguard Worker
4006*6777b538SAndroid Build Coastguard Worker std::string random_data;
4007*6777b538SAndroid Build Coastguard Worker if (size > 0) {
4008*6777b538SAndroid Build Coastguard Worker random_data = RandBytesAsString(size);
4009*6777b538SAndroid Build Coastguard Worker }
4010*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(size, random_data.size());
4011*6777b538SAndroid Build Coastguard Worker write_thread.task_runner()->PostTask(
4012*6777b538SAndroid Build Coastguard Worker FROM_HERE,
4013*6777b538SAndroid Build Coastguard Worker BindLambdaForTesting([random_data, write_fd = std::move(write_fd)]() {
4014*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WriteFileDescriptor(write_fd.get(), random_data));
4015*6777b538SAndroid Build Coastguard Worker }));
4016*6777b538SAndroid Build Coastguard Worker
4017*6777b538SAndroid Build Coastguard Worker ScopedFILE read_file(fdopen(read_fd.release(), "r"));
4018*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(read_file);
4019*6777b538SAndroid Build Coastguard Worker
4020*6777b538SAndroid Build Coastguard Worker std::string contents;
4021*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadStreamToString(read_file.get(), &contents));
4022*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(contents, random_data);
4023*6777b538SAndroid Build Coastguard Worker }
4024*6777b538SAndroid Build Coastguard Worker }
4025*6777b538SAndroid Build Coastguard Worker #endif
4026*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ReadStreamToStringWithMaxSize)4027*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadStreamToStringWithMaxSize) {
4028*6777b538SAndroid Build Coastguard Worker ScopedFILE stream(
4029*6777b538SAndroid Build Coastguard Worker OpenFile(temp_dir_.GetPath().Append(FPL("hello.txt")), "wb+"));
4030*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(stream);
4031*6777b538SAndroid Build Coastguard Worker File file = FILEToFile(stream.get());
4032*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(file.IsValid());
4033*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(fprintf(stream.get(), "there"), 5);
4034*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(fflush(stream.get()), 0);
4035*6777b538SAndroid Build Coastguard Worker
4036*6777b538SAndroid Build Coastguard Worker std::string contents;
4037*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadStreamToStringWithMaxSize(stream.get(), 2, &contents));
4038*6777b538SAndroid Build Coastguard Worker }
4039*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,ReadStreamToStringNullStream)4040*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadStreamToStringNullStream) {
4041*6777b538SAndroid Build Coastguard Worker std::string contents;
4042*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(ReadStreamToString(nullptr, &contents));
4043*6777b538SAndroid Build Coastguard Worker }
4044*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,TouchFile)4045*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, TouchFile) {
4046*6777b538SAndroid Build Coastguard Worker FilePath data_dir =
4047*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("FilePathTest"));
4048*6777b538SAndroid Build Coastguard Worker
4049*6777b538SAndroid Build Coastguard Worker // Create a fresh, empty copy of this directory.
4050*6777b538SAndroid Build Coastguard Worker if (PathExists(data_dir)) {
4051*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(DeletePathRecursively(data_dir));
4052*6777b538SAndroid Build Coastguard Worker }
4053*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(data_dir));
4054*6777b538SAndroid Build Coastguard Worker
4055*6777b538SAndroid Build Coastguard Worker FilePath foobar(data_dir.Append(FILE_PATH_LITERAL("foobar.txt")));
4056*6777b538SAndroid Build Coastguard Worker std::string data("hello");
4057*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WriteFile(foobar, data));
4058*6777b538SAndroid Build Coastguard Worker
4059*6777b538SAndroid Build Coastguard Worker Time access_time;
4060*6777b538SAndroid Build Coastguard Worker // This timestamp is divisible by one day (in local timezone),
4061*6777b538SAndroid Build Coastguard Worker // to make it work on FAT too.
4062*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(Time::FromString("Wed, 16 Nov 1994, 00:00:00",
4063*6777b538SAndroid Build Coastguard Worker &access_time));
4064*6777b538SAndroid Build Coastguard Worker
4065*6777b538SAndroid Build Coastguard Worker Time modification_time;
4066*6777b538SAndroid Build Coastguard Worker // Note that this timestamp is divisible by two (seconds) - FAT stores
4067*6777b538SAndroid Build Coastguard Worker // modification times with 2s resolution.
4068*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(Time::FromString("Tue, 15 Nov 1994, 12:45:26 GMT",
4069*6777b538SAndroid Build Coastguard Worker &modification_time));
4070*6777b538SAndroid Build Coastguard Worker
4071*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(TouchFile(foobar, access_time, modification_time));
4072*6777b538SAndroid Build Coastguard Worker File::Info file_info;
4073*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(GetFileInfo(foobar, &file_info));
4074*6777b538SAndroid Build Coastguard Worker #if !BUILDFLAG(IS_FUCHSIA)
4075*6777b538SAndroid Build Coastguard Worker // Access time is not supported on Fuchsia, see https://crbug.com/735233.
4076*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(access_time.ToInternalValue(),
4077*6777b538SAndroid Build Coastguard Worker file_info.last_accessed.ToInternalValue());
4078*6777b538SAndroid Build Coastguard Worker #endif
4079*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(modification_time.ToInternalValue(),
4080*6777b538SAndroid Build Coastguard Worker file_info.last_modified.ToInternalValue());
4081*6777b538SAndroid Build Coastguard Worker }
4082*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,WriteFileSpanVariant)4083*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, WriteFileSpanVariant) {
4084*6777b538SAndroid Build Coastguard Worker FilePath empty_file =
4085*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("empty_file"));
4086*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(empty_file));
4087*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(WriteFile(empty_file, base::span<const uint8_t>()));
4088*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(empty_file));
4089*6777b538SAndroid Build Coastguard Worker
4090*6777b538SAndroid Build Coastguard Worker std::string data = "not empty";
4091*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToString(empty_file, &data));
4092*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(data.empty());
4093*6777b538SAndroid Build Coastguard Worker
4094*6777b538SAndroid Build Coastguard Worker FilePath write_span_file =
4095*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("write_span_file"));
4096*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(write_span_file));
4097*6777b538SAndroid Build Coastguard Worker static constexpr uint8_t kInput[] = {'h', 'e', 'l', 'l', 'o'};
4098*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(WriteFile(write_span_file, kInput));
4099*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(write_span_file));
4100*6777b538SAndroid Build Coastguard Worker
4101*6777b538SAndroid Build Coastguard Worker data.clear();
4102*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToString(write_span_file, &data));
4103*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("hello", data);
4104*6777b538SAndroid Build Coastguard Worker }
4105*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,WriteFileStringVariant)4106*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, WriteFileStringVariant) {
4107*6777b538SAndroid Build Coastguard Worker FilePath empty_file =
4108*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("empty_file"));
4109*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(empty_file));
4110*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(WriteFile(empty_file, ""));
4111*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(empty_file));
4112*6777b538SAndroid Build Coastguard Worker
4113*6777b538SAndroid Build Coastguard Worker std::string data = "not empty";
4114*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToString(empty_file, &data));
4115*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(data.empty());
4116*6777b538SAndroid Build Coastguard Worker
4117*6777b538SAndroid Build Coastguard Worker FilePath write_span_file =
4118*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("write_string_file"));
4119*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(write_span_file));
4120*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(WriteFile(write_span_file, "world"));
4121*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(write_span_file));
4122*6777b538SAndroid Build Coastguard Worker
4123*6777b538SAndroid Build Coastguard Worker data.clear();
4124*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToString(write_span_file, &data));
4125*6777b538SAndroid Build Coastguard Worker EXPECT_EQ("world", data);
4126*6777b538SAndroid Build Coastguard Worker }
4127*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,IsDirectoryEmpty)4128*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, IsDirectoryEmpty) {
4129*6777b538SAndroid Build Coastguard Worker FilePath empty_dir =
4130*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FILE_PATH_LITERAL("EmptyDir"));
4131*6777b538SAndroid Build Coastguard Worker
4132*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(PathExists(empty_dir));
4133*6777b538SAndroid Build Coastguard Worker
4134*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(empty_dir));
4135*6777b538SAndroid Build Coastguard Worker
4136*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(IsDirectoryEmpty(empty_dir));
4137*6777b538SAndroid Build Coastguard Worker
4138*6777b538SAndroid Build Coastguard Worker FilePath foo(empty_dir.Append(FILE_PATH_LITERAL("foo.txt")));
4139*6777b538SAndroid Build Coastguard Worker std::string bar("baz");
4140*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(WriteFile(foo, bar));
4141*6777b538SAndroid Build Coastguard Worker
4142*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(IsDirectoryEmpty(empty_dir));
4143*6777b538SAndroid Build Coastguard Worker }
4144*6777b538SAndroid Build Coastguard Worker
4145*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
4146*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,SetNonBlocking)4147*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, SetNonBlocking) {
4148*6777b538SAndroid Build Coastguard Worker const int kBogusFd = 99999;
4149*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(SetNonBlocking(kBogusFd));
4150*6777b538SAndroid Build Coastguard Worker
4151*6777b538SAndroid Build Coastguard Worker FilePath path;
4152*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &path));
4153*6777b538SAndroid Build Coastguard Worker path = path.Append(FPL("file_util")).Append(FPL("original.txt"));
4154*6777b538SAndroid Build Coastguard Worker ScopedFD fd(open(path.value().c_str(), O_RDONLY));
4155*6777b538SAndroid Build Coastguard Worker ASSERT_GE(fd.get(), 0);
4156*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SetNonBlocking(fd.get()));
4157*6777b538SAndroid Build Coastguard Worker }
4158*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,SetCloseOnExec)4159*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, SetCloseOnExec) {
4160*6777b538SAndroid Build Coastguard Worker const int kBogusFd = 99999;
4161*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(SetCloseOnExec(kBogusFd));
4162*6777b538SAndroid Build Coastguard Worker
4163*6777b538SAndroid Build Coastguard Worker FilePath path;
4164*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &path));
4165*6777b538SAndroid Build Coastguard Worker path = path.Append(FPL("file_util")).Append(FPL("original.txt"));
4166*6777b538SAndroid Build Coastguard Worker ScopedFD fd(open(path.value().c_str(), O_RDONLY));
4167*6777b538SAndroid Build Coastguard Worker ASSERT_GE(fd.get(), 0);
4168*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(SetCloseOnExec(fd.get()));
4169*6777b538SAndroid Build Coastguard Worker }
4170*6777b538SAndroid Build Coastguard Worker
4171*6777b538SAndroid Build Coastguard Worker #endif
4172*6777b538SAndroid Build Coastguard Worker
4173*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_MAC)
4174*6777b538SAndroid Build Coastguard Worker
4175*6777b538SAndroid Build Coastguard Worker // Testing VerifyPathControlledByAdmin() is hard, because there is no
4176*6777b538SAndroid Build Coastguard Worker // way a test can make a file owned by root, or change file paths
4177*6777b538SAndroid Build Coastguard Worker // at the root of the file system. VerifyPathControlledByAdmin()
4178*6777b538SAndroid Build Coastguard Worker // is implemented as a call to VerifyPathControlledByUser, which gives
4179*6777b538SAndroid Build Coastguard Worker // us the ability to test with paths under the test's temp directory,
4180*6777b538SAndroid Build Coastguard Worker // using a user id we control.
4181*6777b538SAndroid Build Coastguard Worker // Pull tests of VerifyPathControlledByUserTest() into a separate test class
4182*6777b538SAndroid Build Coastguard Worker // with a common SetUp() method.
4183*6777b538SAndroid Build Coastguard Worker class VerifyPathControlledByUserTest : public FileUtilTest {
4184*6777b538SAndroid Build Coastguard Worker protected:
SetUp()4185*6777b538SAndroid Build Coastguard Worker void SetUp() override {
4186*6777b538SAndroid Build Coastguard Worker FileUtilTest::SetUp();
4187*6777b538SAndroid Build Coastguard Worker
4188*6777b538SAndroid Build Coastguard Worker // Create a basic structure used by each test.
4189*6777b538SAndroid Build Coastguard Worker // base_dir_
4190*6777b538SAndroid Build Coastguard Worker // |-> sub_dir_
4191*6777b538SAndroid Build Coastguard Worker // |-> text_file_
4192*6777b538SAndroid Build Coastguard Worker
4193*6777b538SAndroid Build Coastguard Worker base_dir_ = temp_dir_.GetPath().AppendASCII("base_dir");
4194*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(base_dir_));
4195*6777b538SAndroid Build Coastguard Worker
4196*6777b538SAndroid Build Coastguard Worker sub_dir_ = base_dir_.AppendASCII("sub_dir");
4197*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateDirectory(sub_dir_));
4198*6777b538SAndroid Build Coastguard Worker
4199*6777b538SAndroid Build Coastguard Worker text_file_ = sub_dir_.AppendASCII("file.txt");
4200*6777b538SAndroid Build Coastguard Worker CreateTextFile(text_file_, L"This text file has some text in it.");
4201*6777b538SAndroid Build Coastguard Worker
4202*6777b538SAndroid Build Coastguard Worker // Get the user and group files are created with from |base_dir_|.
4203*6777b538SAndroid Build Coastguard Worker stat_wrapper_t stat_buf;
4204*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, File::Stat(base_dir_.value().c_str(), &stat_buf));
4205*6777b538SAndroid Build Coastguard Worker uid_ = stat_buf.st_uid;
4206*6777b538SAndroid Build Coastguard Worker ok_gids_.insert(stat_buf.st_gid);
4207*6777b538SAndroid Build Coastguard Worker bad_gids_.insert(stat_buf.st_gid + 1);
4208*6777b538SAndroid Build Coastguard Worker
4209*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(uid_, getuid()); // This process should be the owner.
4210*6777b538SAndroid Build Coastguard Worker
4211*6777b538SAndroid Build Coastguard Worker // To ensure that umask settings do not cause the initial state
4212*6777b538SAndroid Build Coastguard Worker // of permissions to be different from what we expect, explicitly
4213*6777b538SAndroid Build Coastguard Worker // set permissions on the directories we create.
4214*6777b538SAndroid Build Coastguard Worker // Make all files and directories non-world-writable.
4215*6777b538SAndroid Build Coastguard Worker
4216*6777b538SAndroid Build Coastguard Worker // Users and group can read, write, traverse
4217*6777b538SAndroid Build Coastguard Worker int enabled_permissions =
4218*6777b538SAndroid Build Coastguard Worker FILE_PERMISSION_USER_MASK | FILE_PERMISSION_GROUP_MASK;
4219*6777b538SAndroid Build Coastguard Worker // Other users can't read, write, traverse
4220*6777b538SAndroid Build Coastguard Worker int disabled_permissions = FILE_PERMISSION_OTHERS_MASK;
4221*6777b538SAndroid Build Coastguard Worker
4222*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4223*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(
4224*6777b538SAndroid Build Coastguard Worker base_dir_, enabled_permissions, disabled_permissions));
4225*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4226*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(
4227*6777b538SAndroid Build Coastguard Worker sub_dir_, enabled_permissions, disabled_permissions));
4228*6777b538SAndroid Build Coastguard Worker }
4229*6777b538SAndroid Build Coastguard Worker
4230*6777b538SAndroid Build Coastguard Worker FilePath base_dir_;
4231*6777b538SAndroid Build Coastguard Worker FilePath sub_dir_;
4232*6777b538SAndroid Build Coastguard Worker FilePath text_file_;
4233*6777b538SAndroid Build Coastguard Worker uid_t uid_;
4234*6777b538SAndroid Build Coastguard Worker
4235*6777b538SAndroid Build Coastguard Worker std::set<gid_t> ok_gids_;
4236*6777b538SAndroid Build Coastguard Worker std::set<gid_t> bad_gids_;
4237*6777b538SAndroid Build Coastguard Worker };
4238*6777b538SAndroid Build Coastguard Worker
TEST_F(VerifyPathControlledByUserTest,BadPaths)4239*6777b538SAndroid Build Coastguard Worker TEST_F(VerifyPathControlledByUserTest, BadPaths) {
4240*6777b538SAndroid Build Coastguard Worker // File does not exist.
4241*6777b538SAndroid Build Coastguard Worker FilePath does_not_exist = base_dir_.AppendASCII("does")
4242*6777b538SAndroid Build Coastguard Worker .AppendASCII("not")
4243*6777b538SAndroid Build Coastguard Worker .AppendASCII("exist");
4244*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4245*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, does_not_exist, uid_, ok_gids_));
4246*6777b538SAndroid Build Coastguard Worker
4247*6777b538SAndroid Build Coastguard Worker // |base| not a subpath of |path|.
4248*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(VerifyPathControlledByUser(sub_dir_, base_dir_, uid_, ok_gids_));
4249*6777b538SAndroid Build Coastguard Worker
4250*6777b538SAndroid Build Coastguard Worker // An empty base path will fail to be a prefix for any path.
4251*6777b538SAndroid Build Coastguard Worker FilePath empty;
4252*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(VerifyPathControlledByUser(empty, base_dir_, uid_, ok_gids_));
4253*6777b538SAndroid Build Coastguard Worker
4254*6777b538SAndroid Build Coastguard Worker // Finding that a bad call fails proves nothing unless a good call succeeds.
4255*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
4256*6777b538SAndroid Build Coastguard Worker }
4257*6777b538SAndroid Build Coastguard Worker
TEST_F(VerifyPathControlledByUserTest,Symlinks)4258*6777b538SAndroid Build Coastguard Worker TEST_F(VerifyPathControlledByUserTest, Symlinks) {
4259*6777b538SAndroid Build Coastguard Worker // Symlinks in the path should cause failure.
4260*6777b538SAndroid Build Coastguard Worker
4261*6777b538SAndroid Build Coastguard Worker // Symlink to the file at the end of the path.
4262*6777b538SAndroid Build Coastguard Worker FilePath file_link = base_dir_.AppendASCII("file_link");
4263*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(text_file_, file_link))
4264*6777b538SAndroid Build Coastguard Worker << "Failed to create symlink.";
4265*6777b538SAndroid Build Coastguard Worker
4266*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4267*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, file_link, uid_, ok_gids_));
4268*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4269*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(file_link, file_link, uid_, ok_gids_));
4270*6777b538SAndroid Build Coastguard Worker
4271*6777b538SAndroid Build Coastguard Worker // Symlink from one directory to another within the path.
4272*6777b538SAndroid Build Coastguard Worker FilePath link_to_sub_dir = base_dir_.AppendASCII("link_to_sub_dir");
4273*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(CreateSymbolicLink(sub_dir_, link_to_sub_dir))
4274*6777b538SAndroid Build Coastguard Worker << "Failed to create symlink.";
4275*6777b538SAndroid Build Coastguard Worker
4276*6777b538SAndroid Build Coastguard Worker FilePath file_path_with_link = link_to_sub_dir.AppendASCII("file.txt");
4277*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_path_with_link));
4278*6777b538SAndroid Build Coastguard Worker
4279*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, file_path_with_link, uid_,
4280*6777b538SAndroid Build Coastguard Worker ok_gids_));
4281*6777b538SAndroid Build Coastguard Worker
4282*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(VerifyPathControlledByUser(link_to_sub_dir, file_path_with_link,
4283*6777b538SAndroid Build Coastguard Worker uid_, ok_gids_));
4284*6777b538SAndroid Build Coastguard Worker
4285*6777b538SAndroid Build Coastguard Worker // Symlinks in parents of base path are allowed.
4286*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(file_path_with_link,
4287*6777b538SAndroid Build Coastguard Worker file_path_with_link, uid_, ok_gids_));
4288*6777b538SAndroid Build Coastguard Worker }
4289*6777b538SAndroid Build Coastguard Worker
TEST_F(VerifyPathControlledByUserTest,OwnershipChecks)4290*6777b538SAndroid Build Coastguard Worker TEST_F(VerifyPathControlledByUserTest, OwnershipChecks) {
4291*6777b538SAndroid Build Coastguard Worker // Get a uid that is not the uid of files we create.
4292*6777b538SAndroid Build Coastguard Worker uid_t bad_uid = uid_ + 1;
4293*6777b538SAndroid Build Coastguard Worker
4294*6777b538SAndroid Build Coastguard Worker // Make all files and directories non-world-writable.
4295*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4296*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
4297*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4298*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
4299*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4300*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
4301*6777b538SAndroid Build Coastguard Worker
4302*6777b538SAndroid Build Coastguard Worker // We control these paths.
4303*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
4304*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4305*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
4306*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
4307*6777b538SAndroid Build Coastguard Worker
4308*6777b538SAndroid Build Coastguard Worker // Another user does not control these paths.
4309*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4310*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, sub_dir_, bad_uid, ok_gids_));
4311*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4312*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, bad_uid, ok_gids_));
4313*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4314*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(sub_dir_, text_file_, bad_uid, ok_gids_));
4315*6777b538SAndroid Build Coastguard Worker
4316*6777b538SAndroid Build Coastguard Worker // Another group does not control the paths.
4317*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4318*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, bad_gids_));
4319*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4320*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, bad_gids_));
4321*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4322*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(sub_dir_, text_file_, uid_, bad_gids_));
4323*6777b538SAndroid Build Coastguard Worker }
4324*6777b538SAndroid Build Coastguard Worker
TEST_F(VerifyPathControlledByUserTest,GroupWriteTest)4325*6777b538SAndroid Build Coastguard Worker TEST_F(VerifyPathControlledByUserTest, GroupWriteTest) {
4326*6777b538SAndroid Build Coastguard Worker // Make all files and directories writable only by their owner.
4327*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4328*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH|S_IWGRP));
4329*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4330*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH|S_IWGRP));
4331*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4332*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(text_file_, 0u, S_IWOTH|S_IWGRP));
4333*6777b538SAndroid Build Coastguard Worker
4334*6777b538SAndroid Build Coastguard Worker // Any group is okay because the path is not group-writable.
4335*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
4336*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4337*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
4338*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
4339*6777b538SAndroid Build Coastguard Worker
4340*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, bad_gids_));
4341*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4342*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, bad_gids_));
4343*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4344*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(sub_dir_, text_file_, uid_, bad_gids_));
4345*6777b538SAndroid Build Coastguard Worker
4346*6777b538SAndroid Build Coastguard Worker // No group is okay, because we don't check the group
4347*6777b538SAndroid Build Coastguard Worker // if no group can write.
4348*6777b538SAndroid Build Coastguard Worker std::set<gid_t> no_gids; // Empty set of gids.
4349*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, no_gids));
4350*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, text_file_, uid_, no_gids));
4351*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, no_gids));
4352*6777b538SAndroid Build Coastguard Worker
4353*6777b538SAndroid Build Coastguard Worker // Make all files and directories writable by their group.
4354*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(ChangePosixFilePermissions(base_dir_, S_IWGRP, 0u));
4355*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(ChangePosixFilePermissions(sub_dir_, S_IWGRP, 0u));
4356*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(ChangePosixFilePermissions(text_file_, S_IWGRP, 0u));
4357*6777b538SAndroid Build Coastguard Worker
4358*6777b538SAndroid Build Coastguard Worker // Now |ok_gids_| works, but |bad_gids_| fails.
4359*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
4360*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4361*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
4362*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
4363*6777b538SAndroid Build Coastguard Worker
4364*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4365*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, bad_gids_));
4366*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4367*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, bad_gids_));
4368*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4369*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(sub_dir_, text_file_, uid_, bad_gids_));
4370*6777b538SAndroid Build Coastguard Worker
4371*6777b538SAndroid Build Coastguard Worker // Because any group in the group set is allowed,
4372*6777b538SAndroid Build Coastguard Worker // the union of good and bad gids passes.
4373*6777b538SAndroid Build Coastguard Worker
4374*6777b538SAndroid Build Coastguard Worker std::set<gid_t> multiple_gids;
4375*6777b538SAndroid Build Coastguard Worker std::set_union(
4376*6777b538SAndroid Build Coastguard Worker ok_gids_.begin(), ok_gids_.end(),
4377*6777b538SAndroid Build Coastguard Worker bad_gids_.begin(), bad_gids_.end(),
4378*6777b538SAndroid Build Coastguard Worker std::inserter(multiple_gids, multiple_gids.begin()));
4379*6777b538SAndroid Build Coastguard Worker
4380*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4381*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, multiple_gids));
4382*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4383*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, multiple_gids));
4384*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4385*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(sub_dir_, text_file_, uid_, multiple_gids));
4386*6777b538SAndroid Build Coastguard Worker }
4387*6777b538SAndroid Build Coastguard Worker
TEST_F(VerifyPathControlledByUserTest,WriteBitChecks)4388*6777b538SAndroid Build Coastguard Worker TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) {
4389*6777b538SAndroid Build Coastguard Worker // Make all files and directories non-world-writable.
4390*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4391*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
4392*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4393*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
4394*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4395*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
4396*6777b538SAndroid Build Coastguard Worker
4397*6777b538SAndroid Build Coastguard Worker // Initialy, we control all parts of the path.
4398*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
4399*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4400*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
4401*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
4402*6777b538SAndroid Build Coastguard Worker
4403*6777b538SAndroid Build Coastguard Worker // Make base_dir_ world-writable.
4404*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4405*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(base_dir_, S_IWOTH, 0u));
4406*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
4407*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4408*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
4409*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
4410*6777b538SAndroid Build Coastguard Worker
4411*6777b538SAndroid Build Coastguard Worker // Make sub_dir_ world writable.
4412*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4413*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(sub_dir_, S_IWOTH, 0u));
4414*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
4415*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4416*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
4417*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4418*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
4419*6777b538SAndroid Build Coastguard Worker
4420*6777b538SAndroid Build Coastguard Worker // Make text_file_ world writable.
4421*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4422*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(text_file_, S_IWOTH, 0u));
4423*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
4424*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4425*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
4426*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4427*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
4428*6777b538SAndroid Build Coastguard Worker
4429*6777b538SAndroid Build Coastguard Worker // Make sub_dir_ non-world writable.
4430*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4431*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
4432*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
4433*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4434*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
4435*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4436*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
4437*6777b538SAndroid Build Coastguard Worker
4438*6777b538SAndroid Build Coastguard Worker // Make base_dir_ non-world-writable.
4439*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4440*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
4441*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
4442*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4443*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
4444*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(
4445*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
4446*6777b538SAndroid Build Coastguard Worker
4447*6777b538SAndroid Build Coastguard Worker // Back to the initial state: Nothing is writable, so every path
4448*6777b538SAndroid Build Coastguard Worker // should pass.
4449*6777b538SAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
4450*6777b538SAndroid Build Coastguard Worker ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
4451*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
4452*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4453*6777b538SAndroid Build Coastguard Worker VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
4454*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
4455*6777b538SAndroid Build Coastguard Worker }
4456*6777b538SAndroid Build Coastguard Worker
4457*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_MAC)
4458*6777b538SAndroid Build Coastguard Worker
4459*6777b538SAndroid Build Coastguard Worker // Flaky test: crbug/1054637
4460*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_ANDROID)
TEST_F(FileUtilTest,DISABLED_ValidContentUriTest)4461*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DISABLED_ValidContentUriTest) {
4462*6777b538SAndroid Build Coastguard Worker // Get the test image path.
4463*6777b538SAndroid Build Coastguard Worker FilePath data_dir;
4464*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
4465*6777b538SAndroid Build Coastguard Worker data_dir = data_dir.AppendASCII("file_util");
4466*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(data_dir));
4467*6777b538SAndroid Build Coastguard Worker FilePath image_file = data_dir.Append(FILE_PATH_LITERAL("red.png"));
4468*6777b538SAndroid Build Coastguard Worker int64_t image_size;
4469*6777b538SAndroid Build Coastguard Worker GetFileSize(image_file, &image_size);
4470*6777b538SAndroid Build Coastguard Worker ASSERT_GT(image_size, 0);
4471*6777b538SAndroid Build Coastguard Worker
4472*6777b538SAndroid Build Coastguard Worker // Insert the image into MediaStore. MediaStore will do some conversions, and
4473*6777b538SAndroid Build Coastguard Worker // return the content URI.
4474*6777b538SAndroid Build Coastguard Worker FilePath path = InsertImageIntoMediaStore(image_file);
4475*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(path.IsContentUri());
4476*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PathExists(path));
4477*6777b538SAndroid Build Coastguard Worker // The file size may not equal to the input image as MediaStore may convert
4478*6777b538SAndroid Build Coastguard Worker // the image.
4479*6777b538SAndroid Build Coastguard Worker int64_t content_uri_size;
4480*6777b538SAndroid Build Coastguard Worker GetFileSize(path, &content_uri_size);
4481*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(image_size, content_uri_size);
4482*6777b538SAndroid Build Coastguard Worker
4483*6777b538SAndroid Build Coastguard Worker // We should be able to read the file.
4484*6777b538SAndroid Build Coastguard Worker File file = OpenContentUriForRead(path);
4485*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(file.IsValid());
4486*6777b538SAndroid Build Coastguard Worker auto buffer = std::make_unique<char[]>(image_size);
4487*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(file.ReadAtCurrentPos(buffer.get(), image_size));
4488*6777b538SAndroid Build Coastguard Worker }
4489*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,NonExistentContentUriTest)4490*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, NonExistentContentUriTest) {
4491*6777b538SAndroid Build Coastguard Worker FilePath path("content://foo.bar");
4492*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(path.IsContentUri());
4493*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PathExists(path));
4494*6777b538SAndroid Build Coastguard Worker // Size should be smaller than 0.
4495*6777b538SAndroid Build Coastguard Worker int64_t size;
4496*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(GetFileSize(path, &size));
4497*6777b538SAndroid Build Coastguard Worker
4498*6777b538SAndroid Build Coastguard Worker // We should not be able to read the file.
4499*6777b538SAndroid Build Coastguard Worker File file = OpenContentUriForRead(path);
4500*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(file.IsValid());
4501*6777b538SAndroid Build Coastguard Worker }
4502*6777b538SAndroid Build Coastguard Worker #endif
4503*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,GetUniquePathNumberNoFile)4504*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetUniquePathNumberNoFile) {
4505*6777b538SAndroid Build Coastguard Worker // This file does not exist.
4506*6777b538SAndroid Build Coastguard Worker const FilePath some_file = temp_dir_.GetPath().Append(FPL("SomeFile.txt"));
4507*6777b538SAndroid Build Coastguard Worker
4508*6777b538SAndroid Build Coastguard Worker // The path is unique as-is.
4509*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(GetUniquePathNumber(some_file), 0);
4510*6777b538SAndroid Build Coastguard Worker }
4511*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,GetUniquePathNumberFileExists)4512*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetUniquePathNumberFileExists) {
4513*6777b538SAndroid Build Coastguard Worker // Create a file with the desired path.
4514*6777b538SAndroid Build Coastguard Worker const FilePath some_file = temp_dir_.GetPath().Append(FPL("SomeFile.txt"));
4515*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(File(some_file, File::FLAG_CREATE | File::FLAG_WRITE).IsValid());
4516*6777b538SAndroid Build Coastguard Worker
4517*6777b538SAndroid Build Coastguard Worker // The file exists, so the number 1 is needed to make it unique.
4518*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(GetUniquePathNumber(some_file), 1);
4519*6777b538SAndroid Build Coastguard Worker }
4520*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,GetUniquePathNumberFilesExist)4521*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetUniquePathNumberFilesExist) {
4522*6777b538SAndroid Build Coastguard Worker // Create a file with the desired path and with it suffixed with " (1)"
4523*6777b538SAndroid Build Coastguard Worker const FilePath some_file = temp_dir_.GetPath().Append(FPL("SomeFile.txt"));
4524*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(File(some_file, File::FLAG_CREATE | File::FLAG_WRITE).IsValid());
4525*6777b538SAndroid Build Coastguard Worker const FilePath some_file_one =
4526*6777b538SAndroid Build Coastguard Worker temp_dir_.GetPath().Append(FPL("SomeFile (1).txt"));
4527*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(
4528*6777b538SAndroid Build Coastguard Worker File(some_file_one, File::FLAG_CREATE | File::FLAG_WRITE).IsValid());
4529*6777b538SAndroid Build Coastguard Worker
4530*6777b538SAndroid Build Coastguard Worker // This time the number 2 is needed to make it unique.
4531*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(GetUniquePathNumber(some_file), 2);
4532*6777b538SAndroid Build Coastguard Worker }
4533*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,GetUniquePathNumberTooManyFiles)4534*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetUniquePathNumberTooManyFiles) {
4535*6777b538SAndroid Build Coastguard Worker // Create a file with the desired path.
4536*6777b538SAndroid Build Coastguard Worker const FilePath some_file = temp_dir_.GetPath().Append(FPL("SomeFile.txt"));
4537*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(File(some_file, File::FLAG_CREATE | File::FLAG_WRITE).IsValid());
4538*6777b538SAndroid Build Coastguard Worker
4539*6777b538SAndroid Build Coastguard Worker // Now create 100 collisions.
4540*6777b538SAndroid Build Coastguard Worker for (int i = 1; i <= kMaxUniqueFiles; ++i) {
4541*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(GetUniquePathNumber(some_file), i);
4542*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(File(temp_dir_.GetPath().AppendASCII(
4543*6777b538SAndroid Build Coastguard Worker StringPrintf("SomeFile (%d).txt", i)),
4544*6777b538SAndroid Build Coastguard Worker File::FLAG_CREATE | File::FLAG_WRITE)
4545*6777b538SAndroid Build Coastguard Worker .IsValid());
4546*6777b538SAndroid Build Coastguard Worker }
4547*6777b538SAndroid Build Coastguard Worker
4548*6777b538SAndroid Build Coastguard Worker // Verify that the limit has been reached.
4549*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(GetUniquePathNumber(some_file), -1);
4550*6777b538SAndroid Build Coastguard Worker }
4551*6777b538SAndroid Build Coastguard Worker
4552*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) && \
4553*6777b538SAndroid Build Coastguard Worker defined(ARCH_CPU_32_BITS)
4554*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/327582285): Re-enable these tests. They may be failing due to
4555*6777b538SAndroid Build Coastguard Worker // prefetching failing under memory pressure.
4556*6777b538SAndroid Build Coastguard Worker #define FLAKY_327582285 1
4557*6777b538SAndroid Build Coastguard Worker #endif
4558*6777b538SAndroid Build Coastguard Worker
4559*6777b538SAndroid Build Coastguard Worker #if defined(FLAKY_327582285)
4560*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileExistingFileNoSize \
4561*6777b538SAndroid Build Coastguard Worker DISABLED_PreReadFileExistingFileNoSize
4562*6777b538SAndroid Build Coastguard Worker #else
4563*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileExistingFileNoSize PreReadFileExistingFileNoSize
4564*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(FileUtilTest,MAYBE_PreReadFileExistingFileNoSize)4565*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MAYBE_PreReadFileExistingFileNoSize) {
4566*6777b538SAndroid Build Coastguard Worker FilePath text_file = temp_dir_.GetPath().Append(FPL("text_file"));
4567*6777b538SAndroid Build Coastguard Worker CreateTextFile(text_file, bogus_content);
4568*6777b538SAndroid Build Coastguard Worker
4569*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4570*6777b538SAndroid Build Coastguard Worker PreReadFile(text_file, /*is_executable=*/false, /*sequential=*/false));
4571*6777b538SAndroid Build Coastguard Worker }
4572*6777b538SAndroid Build Coastguard Worker
4573*6777b538SAndroid Build Coastguard Worker #if defined(FLAKY_327582285)
4574*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileExistingFileExactSize \
4575*6777b538SAndroid Build Coastguard Worker DISABLED_PreReadFileExistingFileExactSize
4576*6777b538SAndroid Build Coastguard Worker #else
4577*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileExistingFileExactSize PreReadFileExistingFileExactSize
4578*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(FileUtilTest,MAYBE_PreReadFileExistingFileExactSize)4579*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MAYBE_PreReadFileExistingFileExactSize) {
4580*6777b538SAndroid Build Coastguard Worker FilePath text_file = temp_dir_.GetPath().Append(FPL("text_file"));
4581*6777b538SAndroid Build Coastguard Worker CreateTextFile(text_file, bogus_content);
4582*6777b538SAndroid Build Coastguard Worker
4583*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PreReadFile(text_file, /*is_executable=*/false,
4584*6777b538SAndroid Build Coastguard Worker /*sequential=*/false, std::size(bogus_content)));
4585*6777b538SAndroid Build Coastguard Worker }
4586*6777b538SAndroid Build Coastguard Worker
4587*6777b538SAndroid Build Coastguard Worker #if defined(FLAKY_327582285)
4588*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileExistingFileOverSized \
4589*6777b538SAndroid Build Coastguard Worker DISABLED_PreReadFileExistingFileOverSized
4590*6777b538SAndroid Build Coastguard Worker #else
4591*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileExistingFileOverSized PreReadFileExistingFileOverSized
4592*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(FileUtilTest,MAYBE_PreReadFileExistingFileOverSized)4593*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MAYBE_PreReadFileExistingFileOverSized) {
4594*6777b538SAndroid Build Coastguard Worker FilePath text_file = temp_dir_.GetPath().Append(FPL("text_file"));
4595*6777b538SAndroid Build Coastguard Worker CreateTextFile(text_file, bogus_content);
4596*6777b538SAndroid Build Coastguard Worker
4597*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PreReadFile(text_file, /*is_executable=*/false,
4598*6777b538SAndroid Build Coastguard Worker /*sequential=*/false, std::size(bogus_content) * 2));
4599*6777b538SAndroid Build Coastguard Worker }
4600*6777b538SAndroid Build Coastguard Worker
4601*6777b538SAndroid Build Coastguard Worker #if defined(FLAKY_327582285)
4602*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileExistingFileUnderSized \
4603*6777b538SAndroid Build Coastguard Worker DISABLED_PreReadFileExistingFileUnderSized
4604*6777b538SAndroid Build Coastguard Worker #else
4605*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileExistingFileUnderSized \
4606*6777b538SAndroid Build Coastguard Worker PreReadFileExistingFileUnderSized
4607*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(FileUtilTest,MAYBE_PreReadFileExistingFileUnderSized)4608*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MAYBE_PreReadFileExistingFileUnderSized) {
4609*6777b538SAndroid Build Coastguard Worker FilePath text_file = temp_dir_.GetPath().Append(FPL("text_file"));
4610*6777b538SAndroid Build Coastguard Worker CreateTextFile(text_file, bogus_content);
4611*6777b538SAndroid Build Coastguard Worker
4612*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PreReadFile(text_file, /*is_executable=*/false,
4613*6777b538SAndroid Build Coastguard Worker /*sequential=*/false, std::size(bogus_content) / 2));
4614*6777b538SAndroid Build Coastguard Worker }
4615*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,PreReadFileExistingFileZeroSize)4616*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, PreReadFileExistingFileZeroSize) {
4617*6777b538SAndroid Build Coastguard Worker FilePath text_file = temp_dir_.GetPath().Append(FPL("text_file"));
4618*6777b538SAndroid Build Coastguard Worker CreateTextFile(text_file, bogus_content);
4619*6777b538SAndroid Build Coastguard Worker
4620*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PreReadFile(text_file, /*is_executable=*/false,
4621*6777b538SAndroid Build Coastguard Worker /*sequential=*/false, /*max_bytes=*/0));
4622*6777b538SAndroid Build Coastguard Worker }
4623*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,PreReadFileExistingEmptyFileNoSize)4624*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, PreReadFileExistingEmptyFileNoSize) {
4625*6777b538SAndroid Build Coastguard Worker FilePath text_file = temp_dir_.GetPath().Append(FPL("text_file"));
4626*6777b538SAndroid Build Coastguard Worker CreateTextFile(text_file, L"");
4627*6777b538SAndroid Build Coastguard Worker // The test just asserts that this doesn't crash. The Windows implementation
4628*6777b538SAndroid Build Coastguard Worker // fails in this case, due to the base::MemoryMappedFile implementation and
4629*6777b538SAndroid Build Coastguard Worker // the limitations of ::MapViewOfFile().
4630*6777b538SAndroid Build Coastguard Worker PreReadFile(text_file, /*is_executable=*/false, /*sequential=*/false);
4631*6777b538SAndroid Build Coastguard Worker }
4632*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,PreReadFileExistingEmptyFileZeroSize)4633*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, PreReadFileExistingEmptyFileZeroSize) {
4634*6777b538SAndroid Build Coastguard Worker FilePath text_file = temp_dir_.GetPath().Append(FPL("text_file"));
4635*6777b538SAndroid Build Coastguard Worker CreateTextFile(text_file, L"");
4636*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(PreReadFile(text_file, /*is_executable=*/false,
4637*6777b538SAndroid Build Coastguard Worker /*sequential=*/false, /*max_bytes=*/0));
4638*6777b538SAndroid Build Coastguard Worker }
4639*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,PreReadFileInexistentFile)4640*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, PreReadFileInexistentFile) {
4641*6777b538SAndroid Build Coastguard Worker FilePath inexistent_file = temp_dir_.GetPath().Append(FPL("inexistent_file"));
4642*6777b538SAndroid Build Coastguard Worker EXPECT_FALSE(PreReadFile(inexistent_file, /*is_executable=*/false,
4643*6777b538SAndroid Build Coastguard Worker /*sequential=*/false));
4644*6777b538SAndroid Build Coastguard Worker }
4645*6777b538SAndroid Build Coastguard Worker
4646*6777b538SAndroid Build Coastguard Worker #if defined(FLAKY_327582285)
4647*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileExecutable DISABLED_PreReadFileExecutable
4648*6777b538SAndroid Build Coastguard Worker #else
4649*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileExecutable PreReadFileExecutable
4650*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(FileUtilTest,MAYBE_PreReadFileExecutable)4651*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MAYBE_PreReadFileExecutable) {
4652*6777b538SAndroid Build Coastguard Worker FilePath exe_data_dir;
4653*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &exe_data_dir));
4654*6777b538SAndroid Build Coastguard Worker exe_data_dir = exe_data_dir.Append(FPL("pe_image_reader"));
4655*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(exe_data_dir));
4656*6777b538SAndroid Build Coastguard Worker
4657*6777b538SAndroid Build Coastguard Worker // Load a sample executable and confirm that it was successfully prefetched.
4658*6777b538SAndroid Build Coastguard Worker // `test_exe` is a Windows binary, which is fine in this case because only the
4659*6777b538SAndroid Build Coastguard Worker // Windows implementation treats binaries differently from other files.
4660*6777b538SAndroid Build Coastguard Worker const FilePath test_exe = exe_data_dir.Append(FPL("signed.exe"));
4661*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4662*6777b538SAndroid Build Coastguard Worker PreReadFile(test_exe, /*is_executable=*/true, /*sequential=*/false));
4663*6777b538SAndroid Build Coastguard Worker }
4664*6777b538SAndroid Build Coastguard Worker
4665*6777b538SAndroid Build Coastguard Worker #if defined(FLAKY_327582285)
4666*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileWithSequentialAccess \
4667*6777b538SAndroid Build Coastguard Worker DISABLED_PreReadFileWithSequentialAccess
4668*6777b538SAndroid Build Coastguard Worker #else
4669*6777b538SAndroid Build Coastguard Worker #define MAYBE_PreReadFileWithSequentialAccess PreReadFileWithSequentialAccess
4670*6777b538SAndroid Build Coastguard Worker #endif
TEST_F(FileUtilTest,MAYBE_PreReadFileWithSequentialAccess)4671*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MAYBE_PreReadFileWithSequentialAccess) {
4672*6777b538SAndroid Build Coastguard Worker FilePath text_file = temp_dir_.GetPath().Append(FPL("text_file"));
4673*6777b538SAndroid Build Coastguard Worker CreateTextFile(text_file, bogus_content);
4674*6777b538SAndroid Build Coastguard Worker
4675*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(
4676*6777b538SAndroid Build Coastguard Worker PreReadFile(text_file, /*is_executable=*/false, /*sequential=*/true));
4677*6777b538SAndroid Build Coastguard Worker }
4678*6777b538SAndroid Build Coastguard Worker
4679*6777b538SAndroid Build Coastguard Worker #undef FLAKY_327582285
4680*6777b538SAndroid Build Coastguard Worker
4681*6777b538SAndroid Build Coastguard Worker // Test that temp files obtained racily are all unique (no interference between
4682*6777b538SAndroid Build Coastguard Worker // threads). Mimics file operations in DoLaunchChildTestProcess() to rule out
4683*6777b538SAndroid Build Coastguard Worker // thread-safety issues @ https://crbug.com/826408#c17.
TEST(FileUtilMultiThreadedTest,MultiThreadedTempFiles)4684*6777b538SAndroid Build Coastguard Worker TEST(FileUtilMultiThreadedTest, MultiThreadedTempFiles) {
4685*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_FUCHSIA)
4686*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/844416): Too slow to run on infra due to QEMU overhead.
4687*6777b538SAndroid Build Coastguard Worker constexpr int kNumThreads = 8;
4688*6777b538SAndroid Build Coastguard Worker #else
4689*6777b538SAndroid Build Coastguard Worker constexpr int kNumThreads = 64;
4690*6777b538SAndroid Build Coastguard Worker #endif
4691*6777b538SAndroid Build Coastguard Worker constexpr int kNumWritesPerThread = 32;
4692*6777b538SAndroid Build Coastguard Worker
4693*6777b538SAndroid Build Coastguard Worker std::unique_ptr<Thread> threads[kNumThreads];
4694*6777b538SAndroid Build Coastguard Worker for (auto& thread : threads) {
4695*6777b538SAndroid Build Coastguard Worker thread = std::make_unique<Thread>("test worker");
4696*6777b538SAndroid Build Coastguard Worker thread->Start();
4697*6777b538SAndroid Build Coastguard Worker }
4698*6777b538SAndroid Build Coastguard Worker
4699*6777b538SAndroid Build Coastguard Worker // Wait until all threads are started for max parallelism.
4700*6777b538SAndroid Build Coastguard Worker for (auto& thread : threads)
4701*6777b538SAndroid Build Coastguard Worker thread->WaitUntilThreadStarted();
4702*6777b538SAndroid Build Coastguard Worker
4703*6777b538SAndroid Build Coastguard Worker const RepeatingClosure open_write_close_read = BindRepeating([]() {
4704*6777b538SAndroid Build Coastguard Worker FilePath output_filename;
4705*6777b538SAndroid Build Coastguard Worker ScopedFILE output_file(CreateAndOpenTemporaryStream(&output_filename));
4706*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(output_file);
4707*6777b538SAndroid Build Coastguard Worker
4708*6777b538SAndroid Build Coastguard Worker const std::string content = Uuid::GenerateRandomV4().AsLowercaseString();
4709*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_WIN)
4710*6777b538SAndroid Build Coastguard Worker HANDLE handle =
4711*6777b538SAndroid Build Coastguard Worker reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(output_file.get())));
4712*6777b538SAndroid Build Coastguard Worker DWORD bytes_written = 0;
4713*6777b538SAndroid Build Coastguard Worker ::WriteFile(handle, content.c_str(), content.length(), &bytes_written,
4714*6777b538SAndroid Build Coastguard Worker NULL);
4715*6777b538SAndroid Build Coastguard Worker #else
4716*6777b538SAndroid Build Coastguard Worker size_t bytes_written =
4717*6777b538SAndroid Build Coastguard Worker ::write(::fileno(output_file.get()), content.c_str(), content.length());
4718*6777b538SAndroid Build Coastguard Worker #endif
4719*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(content.length(), bytes_written);
4720*6777b538SAndroid Build Coastguard Worker ::fflush(output_file.get());
4721*6777b538SAndroid Build Coastguard Worker output_file.reset();
4722*6777b538SAndroid Build Coastguard Worker
4723*6777b538SAndroid Build Coastguard Worker std::string output_file_contents;
4724*6777b538SAndroid Build Coastguard Worker EXPECT_TRUE(ReadFileToString(output_filename, &output_file_contents))
4725*6777b538SAndroid Build Coastguard Worker << output_filename;
4726*6777b538SAndroid Build Coastguard Worker
4727*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(content, output_file_contents);
4728*6777b538SAndroid Build Coastguard Worker
4729*6777b538SAndroid Build Coastguard Worker DeleteFile(output_filename);
4730*6777b538SAndroid Build Coastguard Worker });
4731*6777b538SAndroid Build Coastguard Worker
4732*6777b538SAndroid Build Coastguard Worker // Post tasks to each thread in a round-robin fashion to ensure as much
4733*6777b538SAndroid Build Coastguard Worker // parallelism as possible.
4734*6777b538SAndroid Build Coastguard Worker for (int i = 0; i < kNumWritesPerThread; ++i) {
4735*6777b538SAndroid Build Coastguard Worker for (auto& thread : threads) {
4736*6777b538SAndroid Build Coastguard Worker thread->task_runner()->PostTask(FROM_HERE, open_write_close_read);
4737*6777b538SAndroid Build Coastguard Worker }
4738*6777b538SAndroid Build Coastguard Worker }
4739*6777b538SAndroid Build Coastguard Worker
4740*6777b538SAndroid Build Coastguard Worker for (auto& thread : threads)
4741*6777b538SAndroid Build Coastguard Worker thread->Stop();
4742*6777b538SAndroid Build Coastguard Worker }
4743*6777b538SAndroid Build Coastguard Worker
4744*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
4745*6777b538SAndroid Build Coastguard Worker
TEST(ScopedFD,ScopedFDDoesClose)4746*6777b538SAndroid Build Coastguard Worker TEST(ScopedFD, ScopedFDDoesClose) {
4747*6777b538SAndroid Build Coastguard Worker int fds[2];
4748*6777b538SAndroid Build Coastguard Worker char c = 0;
4749*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, pipe(fds));
4750*6777b538SAndroid Build Coastguard Worker const int write_end = fds[1];
4751*6777b538SAndroid Build Coastguard Worker ScopedFD read_end_closer(fds[0]);
4752*6777b538SAndroid Build Coastguard Worker {
4753*6777b538SAndroid Build Coastguard Worker ScopedFD write_end_closer(fds[1]);
4754*6777b538SAndroid Build Coastguard Worker }
4755*6777b538SAndroid Build Coastguard Worker // This is the only thread. This file descriptor should no longer be valid.
4756*6777b538SAndroid Build Coastguard Worker int ret = close(write_end);
4757*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(-1, ret);
4758*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(EBADF, errno);
4759*6777b538SAndroid Build Coastguard Worker // Make sure read(2) won't block.
4760*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, fcntl(fds[0], F_SETFL, O_NONBLOCK));
4761*6777b538SAndroid Build Coastguard Worker // Reading the pipe should EOF.
4762*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, read(fds[0], &c, 1));
4763*6777b538SAndroid Build Coastguard Worker }
4764*6777b538SAndroid Build Coastguard Worker
4765*6777b538SAndroid Build Coastguard Worker #if defined(GTEST_HAS_DEATH_TEST)
CloseWithScopedFD(int fd)4766*6777b538SAndroid Build Coastguard Worker void CloseWithScopedFD(int fd) {
4767*6777b538SAndroid Build Coastguard Worker ScopedFD fd_closer(fd);
4768*6777b538SAndroid Build Coastguard Worker }
4769*6777b538SAndroid Build Coastguard Worker #endif
4770*6777b538SAndroid Build Coastguard Worker
TEST(ScopedFD,ScopedFDCrashesOnCloseFailure)4771*6777b538SAndroid Build Coastguard Worker TEST(ScopedFD, ScopedFDCrashesOnCloseFailure) {
4772*6777b538SAndroid Build Coastguard Worker int fds[2];
4773*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(0, pipe(fds));
4774*6777b538SAndroid Build Coastguard Worker ScopedFD read_end_closer(fds[0]);
4775*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(0, IGNORE_EINTR(close(fds[1])));
4776*6777b538SAndroid Build Coastguard Worker #if defined(GTEST_HAS_DEATH_TEST)
4777*6777b538SAndroid Build Coastguard Worker // This is the only thread. This file descriptor should no longer be valid.
4778*6777b538SAndroid Build Coastguard Worker // Trying to close it should crash. This is important for security.
4779*6777b538SAndroid Build Coastguard Worker EXPECT_DEATH(CloseWithScopedFD(fds[1]), "");
4780*6777b538SAndroid Build Coastguard Worker #endif
4781*6777b538SAndroid Build Coastguard Worker }
4782*6777b538SAndroid Build Coastguard Worker
4783*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)
4784*6777b538SAndroid Build Coastguard Worker
4785*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
TEST_F(FileUtilTest,CopyFileContentsWithSendfile)4786*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileContentsWithSendfile) {
4787*6777b538SAndroid Build Coastguard Worker // This test validates that sendfile(2) can be used to copy a file contents
4788*6777b538SAndroid Build Coastguard Worker // and that it will honor the file offsets as CopyFileContents does.
4789*6777b538SAndroid Build Coastguard Worker FilePath file_name_from = temp_dir_.GetPath().Append(
4790*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("copy_contents_file_in.txt"));
4791*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = temp_dir_.GetPath().Append(
4792*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("copy_contents_file_out.txt"));
4793*6777b538SAndroid Build Coastguard Worker
4794*6777b538SAndroid Build Coastguard Worker const std::wstring from_contents(L"0123456789ABCDEF");
4795*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, from_contents);
4796*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
4797*6777b538SAndroid Build Coastguard Worker
4798*6777b538SAndroid Build Coastguard Worker const std::wstring to_contents(L"GHIJKL");
4799*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_to, to_contents);
4800*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
4801*6777b538SAndroid Build Coastguard Worker
4802*6777b538SAndroid Build Coastguard Worker File from(file_name_from, File::FLAG_OPEN | File::FLAG_READ);
4803*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(from.IsValid());
4804*6777b538SAndroid Build Coastguard Worker
4805*6777b538SAndroid Build Coastguard Worker File to(file_name_to, File::FLAG_OPEN | File::FLAG_WRITE);
4806*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(to.IsValid());
4807*6777b538SAndroid Build Coastguard Worker
4808*6777b538SAndroid Build Coastguard Worker // See to the 1st byte in each file.
4809*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(from.Seek(File::Whence::FROM_BEGIN, 1), 1);
4810*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(to.Seek(File::Whence::FROM_BEGIN, 1), 1);
4811*6777b538SAndroid Build Coastguard Worker
4812*6777b538SAndroid Build Coastguard Worker bool retry_slow = false;
4813*6777b538SAndroid Build Coastguard Worker
4814*6777b538SAndroid Build Coastguard Worker // Given the test setup there should never be a sendfile(2) failure.
4815*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(internal::CopyFileContentsWithSendfile(from, to, retry_slow));
4816*6777b538SAndroid Build Coastguard Worker from.Close();
4817*6777b538SAndroid Build Coastguard Worker to.Close();
4818*6777b538SAndroid Build Coastguard Worker
4819*6777b538SAndroid Build Coastguard Worker // Expect the output file contents to be: G123456789ABCDEF because both
4820*6777b538SAndroid Build Coastguard Worker // file positions when we copied the file contents were at 1.
4821*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(L"G123456789ABCDEF", ReadTextFile(file_name_to));
4822*6777b538SAndroid Build Coastguard Worker }
4823*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFileContentsWithSendfileEmpty)4824*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileContentsWithSendfileEmpty) {
4825*6777b538SAndroid Build Coastguard Worker FilePath file_name_from = temp_dir_.GetPath().Append(
4826*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("copy_contents_file_in.txt"));
4827*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = temp_dir_.GetPath().Append(
4828*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("copy_contents_file_out.txt"));
4829*6777b538SAndroid Build Coastguard Worker
4830*6777b538SAndroid Build Coastguard Worker const std::wstring from_contents(L"");
4831*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, from_contents);
4832*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
4833*6777b538SAndroid Build Coastguard Worker
4834*6777b538SAndroid Build Coastguard Worker const std::wstring to_contents(L"");
4835*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_to, to_contents);
4836*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_to));
4837*6777b538SAndroid Build Coastguard Worker
4838*6777b538SAndroid Build Coastguard Worker File from(file_name_from, File::FLAG_OPEN | File::FLAG_READ);
4839*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(from.IsValid());
4840*6777b538SAndroid Build Coastguard Worker
4841*6777b538SAndroid Build Coastguard Worker File to(file_name_to, File::FLAG_OPEN | File::FLAG_WRITE);
4842*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(to.IsValid());
4843*6777b538SAndroid Build Coastguard Worker
4844*6777b538SAndroid Build Coastguard Worker bool retry_slow = false;
4845*6777b538SAndroid Build Coastguard Worker
4846*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(internal::CopyFileContentsWithSendfile(from, to, retry_slow));
4847*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(retry_slow);
4848*6777b538SAndroid Build Coastguard Worker
4849*6777b538SAndroid Build Coastguard Worker from.Close();
4850*6777b538SAndroid Build Coastguard Worker to.Close();
4851*6777b538SAndroid Build Coastguard Worker
4852*6777b538SAndroid Build Coastguard Worker EXPECT_EQ(L"", ReadTextFile(file_name_to));
4853*6777b538SAndroid Build Coastguard Worker }
4854*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFileContentsWithSendfilePipe)4855*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileContentsWithSendfilePipe) {
4856*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = temp_dir_.GetPath().Append(
4857*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("copy_contents_file_out.txt"));
4858*6777b538SAndroid Build Coastguard Worker
4859*6777b538SAndroid Build Coastguard Worker File to(file_name_to,
4860*6777b538SAndroid Build Coastguard Worker File::FLAG_OPEN | File::FLAG_WRITE | File::FLAG_CREATE_ALWAYS);
4861*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(to.IsValid());
4862*6777b538SAndroid Build Coastguard Worker
4863*6777b538SAndroid Build Coastguard Worker // This test validates that CopyFileContentsWithSendfile fails with a pipe and
4864*6777b538SAndroid Build Coastguard Worker // retry_slow is set.
4865*6777b538SAndroid Build Coastguard Worker int fd[2];
4866*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(pipe2(fd, O_CLOEXEC), 0);
4867*6777b538SAndroid Build Coastguard Worker
4868*6777b538SAndroid Build Coastguard Worker // For good measure write some data into the pipe.
4869*6777b538SAndroid Build Coastguard Worker const char* buf = "hello world";
4870*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(write(fd[1], buf, sizeof(buf)), static_cast<int>(sizeof(buf)));
4871*6777b538SAndroid Build Coastguard Worker
4872*6777b538SAndroid Build Coastguard Worker // fd[0] refers to the read end of the pipe.
4873*6777b538SAndroid Build Coastguard Worker bool retry_slow = false;
4874*6777b538SAndroid Build Coastguard Worker base::PlatformFile pipe_read_end(fd[0]);
4875*6777b538SAndroid Build Coastguard Worker base::File pipe_read(pipe_read_end);
4876*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(
4877*6777b538SAndroid Build Coastguard Worker internal::CopyFileContentsWithSendfile(pipe_read, to, retry_slow));
4878*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(retry_slow);
4879*6777b538SAndroid Build Coastguard Worker }
4880*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFileContentsWithSendfileSocket)4881*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileContentsWithSendfileSocket) {
4882*6777b538SAndroid Build Coastguard Worker // This test validates that CopyFileContentsWithSendfile fails with a socket
4883*6777b538SAndroid Build Coastguard Worker // and retry_slow is set.
4884*6777b538SAndroid Build Coastguard Worker int sock[2];
4885*6777b538SAndroid Build Coastguard Worker ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sock), 0);
4886*6777b538SAndroid Build Coastguard Worker
4887*6777b538SAndroid Build Coastguard Worker FilePath file_name_from = temp_dir_.GetPath().Append(
4888*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("copy_contents_file_in.txt"));
4889*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = temp_dir_.GetPath().Append(
4890*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("copy_contents_file_out.txt"));
4891*6777b538SAndroid Build Coastguard Worker const std::wstring from_contents(L"0123456789ABCDEF");
4892*6777b538SAndroid Build Coastguard Worker CreateTextFile(file_name_from, from_contents);
4893*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(PathExists(file_name_from));
4894*6777b538SAndroid Build Coastguard Worker
4895*6777b538SAndroid Build Coastguard Worker File from(file_name_from, File::FLAG_OPEN | File::FLAG_READ);
4896*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(from.IsValid());
4897*6777b538SAndroid Build Coastguard Worker
4898*6777b538SAndroid Build Coastguard Worker base::PlatformFile to_file(sock[0]);
4899*6777b538SAndroid Build Coastguard Worker base::File to_sock(to_file);
4900*6777b538SAndroid Build Coastguard Worker
4901*6777b538SAndroid Build Coastguard Worker // Copying from a file to a socket will work.
4902*6777b538SAndroid Build Coastguard Worker bool retry_slow = false;
4903*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(
4904*6777b538SAndroid Build Coastguard Worker internal::CopyFileContentsWithSendfile(from, to_sock, retry_slow));
4905*6777b538SAndroid Build Coastguard Worker
4906*6777b538SAndroid Build Coastguard Worker // But copying for a socket to a file will not.
4907*6777b538SAndroid Build Coastguard Worker base::PlatformFile from_sock_file(sock[1]);
4908*6777b538SAndroid Build Coastguard Worker base::File from_sock(from_sock_file);
4909*6777b538SAndroid Build Coastguard Worker
4910*6777b538SAndroid Build Coastguard Worker File to(file_name_to,
4911*6777b538SAndroid Build Coastguard Worker File::FLAG_OPEN | File::FLAG_WRITE | File::FLAG_CREATE_ALWAYS);
4912*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(to.IsValid());
4913*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(
4914*6777b538SAndroid Build Coastguard Worker internal::CopyFileContentsWithSendfile(from_sock, to, retry_slow));
4915*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(retry_slow);
4916*6777b538SAndroid Build Coastguard Worker }
4917*6777b538SAndroid Build Coastguard Worker
TEST_F(FileUtilTest,CopyFileContentsWithSendfileSeqFile)4918*6777b538SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileContentsWithSendfileSeqFile) {
4919*6777b538SAndroid Build Coastguard Worker // This test verifies the special case where we have a regular file with zero
4920*6777b538SAndroid Build Coastguard Worker // length that might actually have contents (such as a seq_file).
4921*6777b538SAndroid Build Coastguard Worker for (auto* const file : {"/proc/meminfo", "/proc/self/cmdline",
4922*6777b538SAndroid Build Coastguard Worker "/proc/self/environ", "/proc/self/auxv"}) {
4923*6777b538SAndroid Build Coastguard Worker FilePath proc_file_from(file);
4924*6777b538SAndroid Build Coastguard Worker File from(proc_file_from, File::FLAG_OPEN | File::FLAG_READ);
4925*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(from.IsValid()) << "could not open " << file;
4926*6777b538SAndroid Build Coastguard Worker
4927*6777b538SAndroid Build Coastguard Worker FilePath file_name_to = temp_dir_.GetPath().Append(
4928*6777b538SAndroid Build Coastguard Worker FILE_PATH_LITERAL("copy_contents_file_out.txt"));
4929*6777b538SAndroid Build Coastguard Worker File to(file_name_to,
4930*6777b538SAndroid Build Coastguard Worker File::FLAG_OPEN | File::FLAG_WRITE | File::FLAG_CREATE_ALWAYS);
4931*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(to.IsValid());
4932*6777b538SAndroid Build Coastguard Worker
4933*6777b538SAndroid Build Coastguard Worker bool retry_slow = false;
4934*6777b538SAndroid Build Coastguard Worker ASSERT_FALSE(internal::CopyFileContentsWithSendfile(from, to, retry_slow))
4935*6777b538SAndroid Build Coastguard Worker << proc_file_from << " should have failed";
4936*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(retry_slow)
4937*6777b538SAndroid Build Coastguard Worker << "retry slow for " << proc_file_from << " should be set";
4938*6777b538SAndroid Build Coastguard Worker
4939*6777b538SAndroid Build Coastguard Worker // Now let's make sure we can copy it the "slow" way.
4940*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(base::CopyFileContents(from, to));
4941*6777b538SAndroid Build Coastguard Worker ASSERT_GT(to.GetLength(), 0);
4942*6777b538SAndroid Build Coastguard Worker ASSERT_TRUE(base::DeleteFile(file_name_to));
4943*6777b538SAndroid Build Coastguard Worker }
4944*6777b538SAndroid Build Coastguard Worker }
4945*6777b538SAndroid Build Coastguard Worker
4946*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) ||
4947*6777b538SAndroid Build Coastguard Worker // BUILDFLAG(IS_ANDROID)
4948*6777b538SAndroid Build Coastguard Worker
4949*6777b538SAndroid Build Coastguard Worker } // namespace
4950*6777b538SAndroid Build Coastguard Worker
4951*6777b538SAndroid Build Coastguard Worker } // namespace base
4952