xref: /aosp_15_r20/external/libchrome/base/files/file_util_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
6*635a8641SAndroid Build Coastguard Worker #include <stdint.h>
7*635a8641SAndroid Build Coastguard Worker #include <stdio.h>
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker #include <algorithm>
10*635a8641SAndroid Build Coastguard Worker #include <fstream>
11*635a8641SAndroid Build Coastguard Worker #include <initializer_list>
12*635a8641SAndroid Build Coastguard Worker #include <memory>
13*635a8641SAndroid Build Coastguard Worker #include <set>
14*635a8641SAndroid Build Coastguard Worker #include <utility>
15*635a8641SAndroid Build Coastguard Worker #include <vector>
16*635a8641SAndroid Build Coastguard Worker 
17*635a8641SAndroid Build Coastguard Worker #include "base/base_paths.h"
18*635a8641SAndroid Build Coastguard Worker #include "base/bind.h"
19*635a8641SAndroid Build Coastguard Worker #include "base/bind_helpers.h"
20*635a8641SAndroid Build Coastguard Worker #include "base/callback_helpers.h"
21*635a8641SAndroid Build Coastguard Worker #include "base/command_line.h"
22*635a8641SAndroid Build Coastguard Worker #include "base/environment.h"
23*635a8641SAndroid Build Coastguard Worker #include "base/files/file.h"
24*635a8641SAndroid Build Coastguard Worker #include "base/files/file_enumerator.h"
25*635a8641SAndroid Build Coastguard Worker #include "base/files/file_path.h"
26*635a8641SAndroid Build Coastguard Worker #include "base/files/file_util.h"
27*635a8641SAndroid Build Coastguard Worker #include "base/files/scoped_file.h"
28*635a8641SAndroid Build Coastguard Worker #include "base/files/scoped_temp_dir.h"
29*635a8641SAndroid Build Coastguard Worker #include "base/guid.h"
30*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
31*635a8641SAndroid Build Coastguard Worker #include "base/path_service.h"
32*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
33*635a8641SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
34*635a8641SAndroid Build Coastguard Worker #include "base/test/multiprocess_test.h"
35*635a8641SAndroid Build Coastguard Worker #include "base/test/scoped_environment_variable_override.h"
36*635a8641SAndroid Build Coastguard Worker #include "base/test/test_file_util.h"
37*635a8641SAndroid Build Coastguard Worker #include "base/test/test_timeouts.h"
38*635a8641SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
39*635a8641SAndroid Build Coastguard Worker #include "base/threading/thread.h"
40*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
41*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
42*635a8641SAndroid Build Coastguard Worker #include "testing/multiprocess_func_list.h"
43*635a8641SAndroid Build Coastguard Worker #include "testing/platform_test.h"
44*635a8641SAndroid Build Coastguard Worker 
45*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
46*635a8641SAndroid Build Coastguard Worker #include <shellapi.h>
47*635a8641SAndroid Build Coastguard Worker #include <shlobj.h>
48*635a8641SAndroid Build Coastguard Worker #include <tchar.h>
49*635a8641SAndroid Build Coastguard Worker #include <windows.h>
50*635a8641SAndroid Build Coastguard Worker #include <winioctl.h>
51*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_number_conversions.h"
52*635a8641SAndroid Build Coastguard Worker #include "base/win/scoped_handle.h"
53*635a8641SAndroid Build Coastguard Worker #include "base/win/win_util.h"
54*635a8641SAndroid Build Coastguard Worker #endif
55*635a8641SAndroid Build Coastguard Worker 
56*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX) || defined(OS_FUCHSIA)
57*635a8641SAndroid Build Coastguard Worker #include <errno.h>
58*635a8641SAndroid Build Coastguard Worker #include <fcntl.h>
59*635a8641SAndroid Build Coastguard Worker #include <sys/ioctl.h>
60*635a8641SAndroid Build Coastguard Worker #include <sys/stat.h>
61*635a8641SAndroid Build Coastguard Worker #include <sys/types.h>
62*635a8641SAndroid Build Coastguard Worker #include <unistd.h>
63*635a8641SAndroid Build Coastguard Worker #endif
64*635a8641SAndroid Build Coastguard Worker 
65*635a8641SAndroid Build Coastguard Worker #if defined(OS_LINUX)
66*635a8641SAndroid Build Coastguard Worker #include <linux/fs.h>
67*635a8641SAndroid Build Coastguard Worker #endif
68*635a8641SAndroid Build Coastguard Worker 
69*635a8641SAndroid Build Coastguard Worker #if defined(OS_ANDROID)
70*635a8641SAndroid Build Coastguard Worker #include "base/android/content_uri_utils.h"
71*635a8641SAndroid Build Coastguard Worker #endif
72*635a8641SAndroid Build Coastguard Worker 
73*635a8641SAndroid Build Coastguard Worker // This macro helps avoid wrapped lines in the test structs.
74*635a8641SAndroid Build Coastguard Worker #define FPL(x) FILE_PATH_LITERAL(x)
75*635a8641SAndroid Build Coastguard Worker 
76*635a8641SAndroid Build Coastguard Worker namespace base {
77*635a8641SAndroid Build Coastguard Worker 
78*635a8641SAndroid Build Coastguard Worker namespace {
79*635a8641SAndroid Build Coastguard Worker 
80*635a8641SAndroid Build Coastguard Worker const size_t kLargeFileSize = (1 << 16) + 3;
81*635a8641SAndroid Build Coastguard Worker 
82*635a8641SAndroid Build Coastguard Worker // To test that NormalizeFilePath() deals with NTFS reparse points correctly,
83*635a8641SAndroid Build Coastguard Worker // we need functions to create and delete reparse points.
84*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
85*635a8641SAndroid Build Coastguard Worker typedef struct _REPARSE_DATA_BUFFER {
86*635a8641SAndroid Build Coastguard Worker   ULONG  ReparseTag;
87*635a8641SAndroid Build Coastguard Worker   USHORT  ReparseDataLength;
88*635a8641SAndroid Build Coastguard Worker   USHORT  Reserved;
89*635a8641SAndroid Build Coastguard Worker   union {
90*635a8641SAndroid Build Coastguard Worker     struct {
91*635a8641SAndroid Build Coastguard Worker       USHORT SubstituteNameOffset;
92*635a8641SAndroid Build Coastguard Worker       USHORT SubstituteNameLength;
93*635a8641SAndroid Build Coastguard Worker       USHORT PrintNameOffset;
94*635a8641SAndroid Build Coastguard Worker       USHORT PrintNameLength;
95*635a8641SAndroid Build Coastguard Worker       ULONG Flags;
96*635a8641SAndroid Build Coastguard Worker       WCHAR PathBuffer[1];
97*635a8641SAndroid Build Coastguard Worker     } SymbolicLinkReparseBuffer;
98*635a8641SAndroid Build Coastguard Worker     struct {
99*635a8641SAndroid Build Coastguard Worker       USHORT SubstituteNameOffset;
100*635a8641SAndroid Build Coastguard Worker       USHORT SubstituteNameLength;
101*635a8641SAndroid Build Coastguard Worker       USHORT PrintNameOffset;
102*635a8641SAndroid Build Coastguard Worker       USHORT PrintNameLength;
103*635a8641SAndroid Build Coastguard Worker       WCHAR PathBuffer[1];
104*635a8641SAndroid Build Coastguard Worker     } MountPointReparseBuffer;
105*635a8641SAndroid Build Coastguard Worker     struct {
106*635a8641SAndroid Build Coastguard Worker       UCHAR DataBuffer[1];
107*635a8641SAndroid Build Coastguard Worker     } GenericReparseBuffer;
108*635a8641SAndroid Build Coastguard Worker   };
109*635a8641SAndroid Build Coastguard Worker } REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
110*635a8641SAndroid Build Coastguard Worker 
111*635a8641SAndroid Build Coastguard Worker // Sets a reparse point. |source| will now point to |target|. Returns true if
112*635a8641SAndroid Build Coastguard Worker // the call succeeds, false otherwise.
SetReparsePoint(HANDLE source,const FilePath & target_path)113*635a8641SAndroid Build Coastguard Worker bool SetReparsePoint(HANDLE source, const FilePath& target_path) {
114*635a8641SAndroid Build Coastguard Worker   std::wstring kPathPrefix = L"\\??\\";
115*635a8641SAndroid Build Coastguard Worker   std::wstring target_str;
116*635a8641SAndroid Build Coastguard Worker   // The juction will not work if the target path does not start with \??\ .
117*635a8641SAndroid Build Coastguard Worker   if (kPathPrefix != target_path.value().substr(0, kPathPrefix.size()))
118*635a8641SAndroid Build Coastguard Worker     target_str += kPathPrefix;
119*635a8641SAndroid Build Coastguard Worker   target_str += target_path.value();
120*635a8641SAndroid Build Coastguard Worker   const wchar_t* target = target_str.c_str();
121*635a8641SAndroid Build Coastguard Worker   USHORT size_target = static_cast<USHORT>(wcslen(target)) * sizeof(target[0]);
122*635a8641SAndroid Build Coastguard Worker   char buffer[2000] = {0};
123*635a8641SAndroid Build Coastguard Worker   DWORD returned;
124*635a8641SAndroid Build Coastguard Worker 
125*635a8641SAndroid Build Coastguard Worker   REPARSE_DATA_BUFFER* data = reinterpret_cast<REPARSE_DATA_BUFFER*>(buffer);
126*635a8641SAndroid Build Coastguard Worker 
127*635a8641SAndroid Build Coastguard Worker   data->ReparseTag = 0xa0000003;
128*635a8641SAndroid Build Coastguard Worker   memcpy(data->MountPointReparseBuffer.PathBuffer, target, size_target + 2);
129*635a8641SAndroid Build Coastguard Worker 
130*635a8641SAndroid Build Coastguard Worker   data->MountPointReparseBuffer.SubstituteNameLength = size_target;
131*635a8641SAndroid Build Coastguard Worker   data->MountPointReparseBuffer.PrintNameOffset = size_target + 2;
132*635a8641SAndroid Build Coastguard Worker   data->ReparseDataLength = size_target + 4 + 8;
133*635a8641SAndroid Build Coastguard Worker 
134*635a8641SAndroid Build Coastguard Worker   int data_size = data->ReparseDataLength + 8;
135*635a8641SAndroid Build Coastguard Worker 
136*635a8641SAndroid Build Coastguard Worker   if (!DeviceIoControl(source, FSCTL_SET_REPARSE_POINT, &buffer, data_size,
137*635a8641SAndroid Build Coastguard Worker                        NULL, 0, &returned, NULL)) {
138*635a8641SAndroid Build Coastguard Worker     return false;
139*635a8641SAndroid Build Coastguard Worker   }
140*635a8641SAndroid Build Coastguard Worker   return true;
141*635a8641SAndroid Build Coastguard Worker }
142*635a8641SAndroid Build Coastguard Worker 
143*635a8641SAndroid Build Coastguard Worker // Delete the reparse point referenced by |source|. Returns true if the call
144*635a8641SAndroid Build Coastguard Worker // succeeds, false otherwise.
DeleteReparsePoint(HANDLE source)145*635a8641SAndroid Build Coastguard Worker bool DeleteReparsePoint(HANDLE source) {
146*635a8641SAndroid Build Coastguard Worker   DWORD returned;
147*635a8641SAndroid Build Coastguard Worker   REPARSE_DATA_BUFFER data = {0};
148*635a8641SAndroid Build Coastguard Worker   data.ReparseTag = 0xa0000003;
149*635a8641SAndroid Build Coastguard Worker   if (!DeviceIoControl(source, FSCTL_DELETE_REPARSE_POINT, &data, 8, NULL, 0,
150*635a8641SAndroid Build Coastguard Worker                        &returned, NULL)) {
151*635a8641SAndroid Build Coastguard Worker     return false;
152*635a8641SAndroid Build Coastguard Worker   }
153*635a8641SAndroid Build Coastguard Worker   return true;
154*635a8641SAndroid Build Coastguard Worker }
155*635a8641SAndroid Build Coastguard Worker 
156*635a8641SAndroid Build Coastguard Worker // Manages a reparse point for a test.
157*635a8641SAndroid Build Coastguard Worker class ReparsePoint {
158*635a8641SAndroid Build Coastguard Worker  public:
159*635a8641SAndroid Build Coastguard Worker   // Creates a reparse point from |source| (an empty directory) to |target|.
ReparsePoint(const FilePath & source,const FilePath & target)160*635a8641SAndroid Build Coastguard Worker   ReparsePoint(const FilePath& source, const FilePath& target) {
161*635a8641SAndroid Build Coastguard Worker     dir_.Set(
162*635a8641SAndroid Build Coastguard Worker       ::CreateFile(source.value().c_str(),
163*635a8641SAndroid Build Coastguard Worker                    GENERIC_READ | GENERIC_WRITE,
164*635a8641SAndroid Build Coastguard Worker                    FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
165*635a8641SAndroid Build Coastguard Worker                    NULL,
166*635a8641SAndroid Build Coastguard Worker                    OPEN_EXISTING,
167*635a8641SAndroid Build Coastguard Worker                    FILE_FLAG_BACKUP_SEMANTICS,  // Needed to open a directory.
168*635a8641SAndroid Build Coastguard Worker                    NULL));
169*635a8641SAndroid Build Coastguard Worker     created_ = dir_.IsValid() && SetReparsePoint(dir_.Get(), target);
170*635a8641SAndroid Build Coastguard Worker   }
171*635a8641SAndroid Build Coastguard Worker 
~ReparsePoint()172*635a8641SAndroid Build Coastguard Worker   ~ReparsePoint() {
173*635a8641SAndroid Build Coastguard Worker     if (created_)
174*635a8641SAndroid Build Coastguard Worker       DeleteReparsePoint(dir_.Get());
175*635a8641SAndroid Build Coastguard Worker   }
176*635a8641SAndroid Build Coastguard Worker 
IsValid()177*635a8641SAndroid Build Coastguard Worker   bool IsValid() { return created_; }
178*635a8641SAndroid Build Coastguard Worker 
179*635a8641SAndroid Build Coastguard Worker  private:
180*635a8641SAndroid Build Coastguard Worker   win::ScopedHandle dir_;
181*635a8641SAndroid Build Coastguard Worker   bool created_;
182*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(ReparsePoint);
183*635a8641SAndroid Build Coastguard Worker };
184*635a8641SAndroid Build Coastguard Worker 
185*635a8641SAndroid Build Coastguard Worker #endif
186*635a8641SAndroid Build Coastguard Worker 
187*635a8641SAndroid Build Coastguard Worker // Fuchsia doesn't support file permissions.
188*635a8641SAndroid Build Coastguard Worker #if !defined(OS_FUCHSIA)
189*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX)
190*635a8641SAndroid Build Coastguard Worker // Provide a simple way to change the permissions bits on |path| in tests.
191*635a8641SAndroid Build Coastguard Worker // ASSERT failures will return, but not stop the test.  Caller should wrap
192*635a8641SAndroid 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)193*635a8641SAndroid Build Coastguard Worker void ChangePosixFilePermissions(const FilePath& path,
194*635a8641SAndroid Build Coastguard Worker                                 int mode_bits_to_set,
195*635a8641SAndroid Build Coastguard Worker                                 int mode_bits_to_clear) {
196*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(mode_bits_to_set & mode_bits_to_clear)
197*635a8641SAndroid Build Coastguard Worker       << "Can't set and clear the same bits.";
198*635a8641SAndroid Build Coastguard Worker 
199*635a8641SAndroid Build Coastguard Worker   int mode = 0;
200*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(path, &mode));
201*635a8641SAndroid Build Coastguard Worker   mode |= mode_bits_to_set;
202*635a8641SAndroid Build Coastguard Worker   mode &= ~mode_bits_to_clear;
203*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetPosixFilePermissions(path, mode));
204*635a8641SAndroid Build Coastguard Worker }
205*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_POSIX)
206*635a8641SAndroid Build Coastguard Worker 
207*635a8641SAndroid Build Coastguard Worker // Sets the source file to read-only.
SetReadOnly(const FilePath & path,bool read_only)208*635a8641SAndroid Build Coastguard Worker void SetReadOnly(const FilePath& path, bool read_only) {
209*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
210*635a8641SAndroid Build Coastguard Worker   // On Windows, it involves setting/removing the 'readonly' bit.
211*635a8641SAndroid Build Coastguard Worker   DWORD attrs = GetFileAttributes(path.value().c_str());
212*635a8641SAndroid Build Coastguard Worker   ASSERT_NE(INVALID_FILE_ATTRIBUTES, attrs);
213*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetFileAttributes(
214*635a8641SAndroid Build Coastguard Worker       path.value().c_str(), read_only ? (attrs | FILE_ATTRIBUTE_READONLY)
215*635a8641SAndroid Build Coastguard Worker                                       : (attrs & ~FILE_ATTRIBUTE_READONLY)));
216*635a8641SAndroid Build Coastguard Worker 
217*635a8641SAndroid Build Coastguard Worker   DWORD expected =
218*635a8641SAndroid Build Coastguard Worker       read_only
219*635a8641SAndroid Build Coastguard Worker           ? ((attrs & (FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_DIRECTORY)) |
220*635a8641SAndroid Build Coastguard Worker              FILE_ATTRIBUTE_READONLY)
221*635a8641SAndroid Build Coastguard Worker           : (attrs & (FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_DIRECTORY));
222*635a8641SAndroid Build Coastguard Worker 
223*635a8641SAndroid Build Coastguard Worker   // Ignore FILE_ATTRIBUTE_NOT_CONTENT_INDEXED if present.
224*635a8641SAndroid Build Coastguard Worker   attrs = GetFileAttributes(path.value().c_str()) &
225*635a8641SAndroid Build Coastguard Worker           ~FILE_ATTRIBUTE_NOT_CONTENT_INDEXED;
226*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(expected, attrs);
227*635a8641SAndroid Build Coastguard Worker #else
228*635a8641SAndroid Build Coastguard Worker   // On all other platforms, it involves removing/setting the write bit.
229*635a8641SAndroid Build Coastguard Worker   mode_t mode = read_only ? S_IRUSR : (S_IRUSR | S_IWUSR);
230*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SetPosixFilePermissions(
231*635a8641SAndroid Build Coastguard Worker       path, DirectoryExists(path) ? (mode | S_IXUSR) : mode));
232*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_WIN)
233*635a8641SAndroid Build Coastguard Worker }
234*635a8641SAndroid Build Coastguard Worker 
IsReadOnly(const FilePath & path)235*635a8641SAndroid Build Coastguard Worker bool IsReadOnly(const FilePath& path) {
236*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
237*635a8641SAndroid Build Coastguard Worker   DWORD attrs = GetFileAttributes(path.value().c_str());
238*635a8641SAndroid Build Coastguard Worker   EXPECT_NE(INVALID_FILE_ATTRIBUTES, attrs);
239*635a8641SAndroid Build Coastguard Worker   return attrs & FILE_ATTRIBUTE_READONLY;
240*635a8641SAndroid Build Coastguard Worker #else
241*635a8641SAndroid Build Coastguard Worker   int mode = 0;
242*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(GetPosixFilePermissions(path, &mode));
243*635a8641SAndroid Build Coastguard Worker   return !(mode & S_IWUSR);
244*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_WIN)
245*635a8641SAndroid Build Coastguard Worker }
246*635a8641SAndroid Build Coastguard Worker 
247*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_FUCHSIA)
248*635a8641SAndroid Build Coastguard Worker 
249*635a8641SAndroid Build Coastguard Worker const wchar_t bogus_content[] = L"I'm cannon fodder.";
250*635a8641SAndroid Build Coastguard Worker 
251*635a8641SAndroid Build Coastguard Worker const int FILES_AND_DIRECTORIES =
252*635a8641SAndroid Build Coastguard Worker     FileEnumerator::FILES | FileEnumerator::DIRECTORIES;
253*635a8641SAndroid Build Coastguard Worker 
254*635a8641SAndroid Build Coastguard Worker // file_util winds up using autoreleased objects on the Mac, so this needs
255*635a8641SAndroid Build Coastguard Worker // to be a PlatformTest
256*635a8641SAndroid Build Coastguard Worker class FileUtilTest : public PlatformTest {
257*635a8641SAndroid Build Coastguard Worker  protected:
SetUp()258*635a8641SAndroid Build Coastguard Worker   void SetUp() override {
259*635a8641SAndroid Build Coastguard Worker     PlatformTest::SetUp();
260*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
261*635a8641SAndroid Build Coastguard Worker   }
262*635a8641SAndroid Build Coastguard Worker 
263*635a8641SAndroid Build Coastguard Worker   ScopedTempDir temp_dir_;
264*635a8641SAndroid Build Coastguard Worker };
265*635a8641SAndroid Build Coastguard Worker 
266*635a8641SAndroid Build Coastguard Worker // Collects all the results from the given file enumerator, and provides an
267*635a8641SAndroid Build Coastguard Worker // interface to query whether a given file is present.
268*635a8641SAndroid Build Coastguard Worker class FindResultCollector {
269*635a8641SAndroid Build Coastguard Worker  public:
FindResultCollector(FileEnumerator * enumerator)270*635a8641SAndroid Build Coastguard Worker   explicit FindResultCollector(FileEnumerator* enumerator) {
271*635a8641SAndroid Build Coastguard Worker     FilePath cur_file;
272*635a8641SAndroid Build Coastguard Worker     while (!(cur_file = enumerator->Next()).value().empty()) {
273*635a8641SAndroid Build Coastguard Worker       FilePath::StringType path = cur_file.value();
274*635a8641SAndroid Build Coastguard Worker       // The file should not be returned twice.
275*635a8641SAndroid Build Coastguard Worker       EXPECT_TRUE(files_.end() == files_.find(path))
276*635a8641SAndroid Build Coastguard Worker           << "Same file returned twice";
277*635a8641SAndroid Build Coastguard Worker 
278*635a8641SAndroid Build Coastguard Worker       // Save for later.
279*635a8641SAndroid Build Coastguard Worker       files_.insert(path);
280*635a8641SAndroid Build Coastguard Worker     }
281*635a8641SAndroid Build Coastguard Worker   }
282*635a8641SAndroid Build Coastguard Worker 
283*635a8641SAndroid Build Coastguard Worker   // Returns true if the enumerator found the file.
HasFile(const FilePath & file) const284*635a8641SAndroid Build Coastguard Worker   bool HasFile(const FilePath& file) const {
285*635a8641SAndroid Build Coastguard Worker     return files_.find(file.value()) != files_.end();
286*635a8641SAndroid Build Coastguard Worker   }
287*635a8641SAndroid Build Coastguard Worker 
size()288*635a8641SAndroid Build Coastguard Worker   int size() {
289*635a8641SAndroid Build Coastguard Worker     return static_cast<int>(files_.size());
290*635a8641SAndroid Build Coastguard Worker   }
291*635a8641SAndroid Build Coastguard Worker 
292*635a8641SAndroid Build Coastguard Worker  private:
293*635a8641SAndroid Build Coastguard Worker   std::set<FilePath::StringType> files_;
294*635a8641SAndroid Build Coastguard Worker };
295*635a8641SAndroid Build Coastguard Worker 
296*635a8641SAndroid Build Coastguard Worker // Simple function to dump some text into a new file.
CreateTextFile(const FilePath & filename,const std::wstring & contents)297*635a8641SAndroid Build Coastguard Worker void CreateTextFile(const FilePath& filename,
298*635a8641SAndroid Build Coastguard Worker                     const std::wstring& contents) {
299*635a8641SAndroid Build Coastguard Worker   std::wofstream file;
300*635a8641SAndroid Build Coastguard Worker   file.open(filename.value().c_str());
301*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(file.is_open());
302*635a8641SAndroid Build Coastguard Worker   file << contents;
303*635a8641SAndroid Build Coastguard Worker   file.close();
304*635a8641SAndroid Build Coastguard Worker }
305*635a8641SAndroid Build Coastguard Worker 
306*635a8641SAndroid Build Coastguard Worker // Simple function to take out some text from a file.
ReadTextFile(const FilePath & filename)307*635a8641SAndroid Build Coastguard Worker std::wstring ReadTextFile(const FilePath& filename) {
308*635a8641SAndroid Build Coastguard Worker   wchar_t contents[64];
309*635a8641SAndroid Build Coastguard Worker   std::wifstream file;
310*635a8641SAndroid Build Coastguard Worker   file.open(filename.value().c_str());
311*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(file.is_open());
312*635a8641SAndroid Build Coastguard Worker   file.getline(contents, arraysize(contents));
313*635a8641SAndroid Build Coastguard Worker   file.close();
314*635a8641SAndroid Build Coastguard Worker   return std::wstring(contents);
315*635a8641SAndroid Build Coastguard Worker }
316*635a8641SAndroid Build Coastguard Worker 
317*635a8641SAndroid Build Coastguard Worker // Sets |is_inheritable| to indicate whether or not |stream| is set up to be
318*635a8641SAndroid Build Coastguard Worker // inerhited into child processes (i.e., HANDLE_FLAG_INHERIT is set on the
319*635a8641SAndroid Build Coastguard Worker // underlying handle on Windows, or FD_CLOEXEC is not set on the underlying file
320*635a8641SAndroid Build Coastguard Worker // descriptor on POSIX). Calls to this function must be wrapped with
321*635a8641SAndroid Build Coastguard Worker // ASSERT_NO_FATAL_FAILURE to properly abort tests in case of fatal failure.
GetIsInheritable(FILE * stream,bool * is_inheritable)322*635a8641SAndroid Build Coastguard Worker void GetIsInheritable(FILE* stream, bool* is_inheritable) {
323*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
324*635a8641SAndroid Build Coastguard Worker   HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(stream)));
325*635a8641SAndroid Build Coastguard Worker   ASSERT_NE(INVALID_HANDLE_VALUE, handle);
326*635a8641SAndroid Build Coastguard Worker 
327*635a8641SAndroid Build Coastguard Worker   DWORD info = 0;
328*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(TRUE, ::GetHandleInformation(handle, &info));
329*635a8641SAndroid Build Coastguard Worker   *is_inheritable = ((info & HANDLE_FLAG_INHERIT) != 0);
330*635a8641SAndroid Build Coastguard Worker #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
331*635a8641SAndroid Build Coastguard Worker   int fd = fileno(stream);
332*635a8641SAndroid Build Coastguard Worker   ASSERT_NE(-1, fd);
333*635a8641SAndroid Build Coastguard Worker   int flags = fcntl(fd, F_GETFD, 0);
334*635a8641SAndroid Build Coastguard Worker   ASSERT_NE(-1, flags);
335*635a8641SAndroid Build Coastguard Worker   *is_inheritable = ((flags & FD_CLOEXEC) == 0);
336*635a8641SAndroid Build Coastguard Worker #else
337*635a8641SAndroid Build Coastguard Worker #error Not implemented
338*635a8641SAndroid Build Coastguard Worker #endif
339*635a8641SAndroid Build Coastguard Worker }
340*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,FileAndDirectorySize)341*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, FileAndDirectorySize) {
342*635a8641SAndroid Build Coastguard Worker   // Create three files of 20, 30 and 3 chars (utf8). ComputeDirectorySize
343*635a8641SAndroid Build Coastguard Worker   // should return 53 bytes.
344*635a8641SAndroid Build Coastguard Worker   FilePath file_01 = temp_dir_.GetPath().Append(FPL("The file 01.txt"));
345*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_01, L"12345678901234567890");
346*635a8641SAndroid Build Coastguard Worker   int64_t size_f1 = 0;
347*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetFileSize(file_01, &size_f1));
348*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(20ll, size_f1);
349*635a8641SAndroid Build Coastguard Worker 
350*635a8641SAndroid Build Coastguard Worker   FilePath subdir_path = temp_dir_.GetPath().Append(FPL("Level2"));
351*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_path);
352*635a8641SAndroid Build Coastguard Worker 
353*635a8641SAndroid Build Coastguard Worker   FilePath file_02 = subdir_path.Append(FPL("The file 02.txt"));
354*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_02, L"123456789012345678901234567890");
355*635a8641SAndroid Build Coastguard Worker   int64_t size_f2 = 0;
356*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetFileSize(file_02, &size_f2));
357*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(30ll, size_f2);
358*635a8641SAndroid Build Coastguard Worker 
359*635a8641SAndroid Build Coastguard Worker   FilePath subsubdir_path = subdir_path.Append(FPL("Level3"));
360*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subsubdir_path);
361*635a8641SAndroid Build Coastguard Worker 
362*635a8641SAndroid Build Coastguard Worker   FilePath file_03 = subsubdir_path.Append(FPL("The file 03.txt"));
363*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_03, L"123");
364*635a8641SAndroid Build Coastguard Worker 
365*635a8641SAndroid Build Coastguard Worker   int64_t computed_size = ComputeDirectorySize(temp_dir_.GetPath());
366*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(size_f1 + size_f2 + 3, computed_size);
367*635a8641SAndroid Build Coastguard Worker }
368*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,NormalizeFilePathBasic)369*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, NormalizeFilePathBasic) {
370*635a8641SAndroid Build Coastguard Worker   // Create a directory under the test dir.  Because we create it,
371*635a8641SAndroid Build Coastguard Worker   // we know it is not a link.
372*635a8641SAndroid Build Coastguard Worker   FilePath file_a_path = temp_dir_.GetPath().Append(FPL("file_a"));
373*635a8641SAndroid Build Coastguard Worker   FilePath dir_path = temp_dir_.GetPath().Append(FPL("dir"));
374*635a8641SAndroid Build Coastguard Worker   FilePath file_b_path = dir_path.Append(FPL("file_b"));
375*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_path);
376*635a8641SAndroid Build Coastguard Worker 
377*635a8641SAndroid Build Coastguard Worker   FilePath normalized_file_a_path, normalized_file_b_path;
378*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(file_a_path));
379*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(NormalizeFilePath(file_a_path, &normalized_file_a_path))
380*635a8641SAndroid Build Coastguard Worker     << "NormalizeFilePath() should fail on nonexistent paths.";
381*635a8641SAndroid Build Coastguard Worker 
382*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_a_path, bogus_content);
383*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_a_path));
384*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(NormalizeFilePath(file_a_path, &normalized_file_a_path));
385*635a8641SAndroid Build Coastguard Worker 
386*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_b_path, bogus_content);
387*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_b_path));
388*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(NormalizeFilePath(file_b_path, &normalized_file_b_path));
389*635a8641SAndroid Build Coastguard Worker 
390*635a8641SAndroid Build Coastguard Worker   // Beacuse this test created |dir_path|, we know it is not a link
391*635a8641SAndroid Build Coastguard Worker   // or junction.  So, the real path of the directory holding file a
392*635a8641SAndroid Build Coastguard Worker   // must be the parent of the path holding file b.
393*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(normalized_file_a_path.DirName()
394*635a8641SAndroid Build Coastguard Worker       .IsParent(normalized_file_b_path.DirName()));
395*635a8641SAndroid Build Coastguard Worker }
396*635a8641SAndroid Build Coastguard Worker 
397*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
398*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,NormalizeFilePathReparsePoints)399*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, NormalizeFilePathReparsePoints) {
400*635a8641SAndroid Build Coastguard Worker   // Build the following directory structure:
401*635a8641SAndroid Build Coastguard Worker   //
402*635a8641SAndroid Build Coastguard Worker   // temp_dir
403*635a8641SAndroid Build Coastguard Worker   // |-> base_a
404*635a8641SAndroid Build Coastguard Worker   // |   |-> sub_a
405*635a8641SAndroid Build Coastguard Worker   // |       |-> file.txt
406*635a8641SAndroid Build Coastguard Worker   // |       |-> long_name___... (Very long name.)
407*635a8641SAndroid Build Coastguard Worker   // |           |-> sub_long
408*635a8641SAndroid Build Coastguard Worker   // |              |-> deep.txt
409*635a8641SAndroid Build Coastguard Worker   // |-> base_b
410*635a8641SAndroid Build Coastguard Worker   //     |-> to_sub_a (reparse point to temp_dir\base_a\sub_a)
411*635a8641SAndroid Build Coastguard Worker   //     |-> to_base_b (reparse point to temp_dir\base_b)
412*635a8641SAndroid Build Coastguard Worker   //     |-> to_sub_long (reparse point to temp_dir\sub_a\long_name_\sub_long)
413*635a8641SAndroid Build Coastguard Worker 
414*635a8641SAndroid Build Coastguard Worker   FilePath base_a = temp_dir_.GetPath().Append(FPL("base_a"));
415*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
416*635a8641SAndroid Build Coastguard Worker   // TEMP can have a lower case drive letter.
417*635a8641SAndroid Build Coastguard Worker   string16 temp_base_a = base_a.value();
418*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(temp_base_a.empty());
419*635a8641SAndroid Build Coastguard Worker   *temp_base_a.begin() = ToUpperASCII(*temp_base_a.begin());
420*635a8641SAndroid Build Coastguard Worker   base_a = FilePath(temp_base_a);
421*635a8641SAndroid Build Coastguard Worker #endif
422*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(base_a));
423*635a8641SAndroid Build Coastguard Worker 
424*635a8641SAndroid Build Coastguard Worker   FilePath sub_a = base_a.Append(FPL("sub_a"));
425*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(sub_a));
426*635a8641SAndroid Build Coastguard Worker 
427*635a8641SAndroid Build Coastguard Worker   FilePath file_txt = sub_a.Append(FPL("file.txt"));
428*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_txt, bogus_content);
429*635a8641SAndroid Build Coastguard Worker 
430*635a8641SAndroid Build Coastguard Worker   // Want a directory whose name is long enough to make the path to the file
431*635a8641SAndroid Build Coastguard Worker   // inside just under MAX_PATH chars.  This will be used to test that when
432*635a8641SAndroid Build Coastguard Worker   // a junction expands to a path over MAX_PATH chars in length,
433*635a8641SAndroid Build Coastguard Worker   // NormalizeFilePath() fails without crashing.
434*635a8641SAndroid Build Coastguard Worker   FilePath sub_long_rel(FPL("sub_long"));
435*635a8641SAndroid Build Coastguard Worker   FilePath deep_txt(FPL("deep.txt"));
436*635a8641SAndroid Build Coastguard Worker 
437*635a8641SAndroid Build Coastguard Worker   int target_length = MAX_PATH;
438*635a8641SAndroid Build Coastguard Worker   target_length -= (sub_a.value().length() + 1);  // +1 for the sepperator '\'.
439*635a8641SAndroid Build Coastguard Worker   target_length -= (sub_long_rel.Append(deep_txt).value().length() + 1);
440*635a8641SAndroid Build Coastguard Worker   // Without making the path a bit shorter, CreateDirectory() fails.
441*635a8641SAndroid Build Coastguard Worker   // the resulting path is still long enough to hit the failing case in
442*635a8641SAndroid Build Coastguard Worker   // NormalizePath().
443*635a8641SAndroid Build Coastguard Worker   const int kCreateDirLimit = 4;
444*635a8641SAndroid Build Coastguard Worker   target_length -= kCreateDirLimit;
445*635a8641SAndroid Build Coastguard Worker   FilePath::StringType long_name_str = FPL("long_name_");
446*635a8641SAndroid Build Coastguard Worker   long_name_str.resize(target_length, '_');
447*635a8641SAndroid Build Coastguard Worker 
448*635a8641SAndroid Build Coastguard Worker   FilePath long_name = sub_a.Append(FilePath(long_name_str));
449*635a8641SAndroid Build Coastguard Worker   FilePath deep_file = long_name.Append(sub_long_rel).Append(deep_txt);
450*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<size_t>(MAX_PATH - kCreateDirLimit),
451*635a8641SAndroid Build Coastguard Worker             deep_file.value().length());
452*635a8641SAndroid Build Coastguard Worker 
453*635a8641SAndroid Build Coastguard Worker   FilePath sub_long = deep_file.DirName();
454*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(sub_long));
455*635a8641SAndroid Build Coastguard Worker   CreateTextFile(deep_file, bogus_content);
456*635a8641SAndroid Build Coastguard Worker 
457*635a8641SAndroid Build Coastguard Worker   FilePath base_b = temp_dir_.GetPath().Append(FPL("base_b"));
458*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(base_b));
459*635a8641SAndroid Build Coastguard Worker 
460*635a8641SAndroid Build Coastguard Worker   FilePath to_sub_a = base_b.Append(FPL("to_sub_a"));
461*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(to_sub_a));
462*635a8641SAndroid Build Coastguard Worker   FilePath normalized_path;
463*635a8641SAndroid Build Coastguard Worker   {
464*635a8641SAndroid Build Coastguard Worker     ReparsePoint reparse_to_sub_a(to_sub_a, sub_a);
465*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(reparse_to_sub_a.IsValid());
466*635a8641SAndroid Build Coastguard Worker 
467*635a8641SAndroid Build Coastguard Worker     FilePath to_base_b = base_b.Append(FPL("to_base_b"));
468*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(CreateDirectory(to_base_b));
469*635a8641SAndroid Build Coastguard Worker     ReparsePoint reparse_to_base_b(to_base_b, base_b);
470*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(reparse_to_base_b.IsValid());
471*635a8641SAndroid Build Coastguard Worker 
472*635a8641SAndroid Build Coastguard Worker     FilePath to_sub_long = base_b.Append(FPL("to_sub_long"));
473*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(CreateDirectory(to_sub_long));
474*635a8641SAndroid Build Coastguard Worker     ReparsePoint reparse_to_sub_long(to_sub_long, sub_long);
475*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(reparse_to_sub_long.IsValid());
476*635a8641SAndroid Build Coastguard Worker 
477*635a8641SAndroid Build Coastguard Worker     // Normalize a junction free path: base_a\sub_a\file.txt .
478*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(NormalizeFilePath(file_txt, &normalized_path));
479*635a8641SAndroid Build Coastguard Worker     ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
480*635a8641SAndroid Build Coastguard Worker 
481*635a8641SAndroid Build Coastguard Worker     // Check that the path base_b\to_sub_a\file.txt can be normalized to exclude
482*635a8641SAndroid Build Coastguard Worker     // the junction to_sub_a.
483*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
484*635a8641SAndroid Build Coastguard Worker                                              &normalized_path));
485*635a8641SAndroid Build Coastguard Worker     ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
486*635a8641SAndroid Build Coastguard Worker 
487*635a8641SAndroid Build Coastguard Worker     // Check that the path base_b\to_base_b\to_base_b\to_sub_a\file.txt can be
488*635a8641SAndroid Build Coastguard Worker     // normalized to exclude junctions to_base_b and to_sub_a .
489*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(NormalizeFilePath(base_b.Append(FPL("to_base_b"))
490*635a8641SAndroid Build Coastguard Worker                                                    .Append(FPL("to_base_b"))
491*635a8641SAndroid Build Coastguard Worker                                                    .Append(FPL("to_sub_a"))
492*635a8641SAndroid Build Coastguard Worker                                                    .Append(FPL("file.txt")),
493*635a8641SAndroid Build Coastguard Worker                                              &normalized_path));
494*635a8641SAndroid Build Coastguard Worker     ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
495*635a8641SAndroid Build Coastguard Worker 
496*635a8641SAndroid Build Coastguard Worker     // A long enough path will cause NormalizeFilePath() to fail.  Make a long
497*635a8641SAndroid Build Coastguard Worker     // path using to_base_b many times, and check that paths long enough to fail
498*635a8641SAndroid Build Coastguard Worker     // do not cause a crash.
499*635a8641SAndroid Build Coastguard Worker     FilePath long_path = base_b;
500*635a8641SAndroid Build Coastguard Worker     const int kLengthLimit = MAX_PATH + 200;
501*635a8641SAndroid Build Coastguard Worker     while (long_path.value().length() <= kLengthLimit) {
502*635a8641SAndroid Build Coastguard Worker       long_path = long_path.Append(FPL("to_base_b"));
503*635a8641SAndroid Build Coastguard Worker     }
504*635a8641SAndroid Build Coastguard Worker     long_path = long_path.Append(FPL("to_sub_a"))
505*635a8641SAndroid Build Coastguard Worker                          .Append(FPL("file.txt"));
506*635a8641SAndroid Build Coastguard Worker 
507*635a8641SAndroid Build Coastguard Worker     ASSERT_FALSE(NormalizeFilePath(long_path, &normalized_path));
508*635a8641SAndroid Build Coastguard Worker 
509*635a8641SAndroid Build Coastguard Worker     // Normalizing the junction to deep.txt should fail, because the expanded
510*635a8641SAndroid Build Coastguard Worker     // path to deep.txt is longer than MAX_PATH.
511*635a8641SAndroid Build Coastguard Worker     ASSERT_FALSE(NormalizeFilePath(to_sub_long.Append(deep_txt),
512*635a8641SAndroid Build Coastguard Worker                                               &normalized_path));
513*635a8641SAndroid Build Coastguard Worker 
514*635a8641SAndroid Build Coastguard Worker     // Delete the reparse points, and see that NormalizeFilePath() fails
515*635a8641SAndroid Build Coastguard Worker     // to traverse them.
516*635a8641SAndroid Build Coastguard Worker   }
517*635a8641SAndroid Build Coastguard Worker 
518*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
519*635a8641SAndroid Build Coastguard Worker                                             &normalized_path));
520*635a8641SAndroid Build Coastguard Worker }
521*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,DevicePathToDriveLetter)522*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DevicePathToDriveLetter) {
523*635a8641SAndroid Build Coastguard Worker   // Get a drive letter.
524*635a8641SAndroid Build Coastguard Worker   string16 real_drive_letter =
525*635a8641SAndroid Build Coastguard Worker       ToUpperASCII(temp_dir_.GetPath().value().substr(0, 2));
526*635a8641SAndroid Build Coastguard Worker   if (!isalpha(real_drive_letter[0]) || ':' != real_drive_letter[1]) {
527*635a8641SAndroid Build Coastguard Worker     LOG(ERROR) << "Can't get a drive letter to test with.";
528*635a8641SAndroid Build Coastguard Worker     return;
529*635a8641SAndroid Build Coastguard Worker   }
530*635a8641SAndroid Build Coastguard Worker 
531*635a8641SAndroid Build Coastguard Worker   // Get the NT style path to that drive.
532*635a8641SAndroid Build Coastguard Worker   wchar_t device_path[MAX_PATH] = {'\0'};
533*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(
534*635a8641SAndroid Build Coastguard Worker       ::QueryDosDevice(real_drive_letter.c_str(), device_path, MAX_PATH));
535*635a8641SAndroid Build Coastguard Worker   FilePath actual_device_path(device_path);
536*635a8641SAndroid Build Coastguard Worker   FilePath win32_path;
537*635a8641SAndroid Build Coastguard Worker 
538*635a8641SAndroid Build Coastguard Worker   // Run DevicePathToDriveLetterPath() on the NT style path we got from
539*635a8641SAndroid Build Coastguard Worker   // QueryDosDevice().  Expect the drive letter we started with.
540*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(DevicePathToDriveLetterPath(actual_device_path, &win32_path));
541*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(real_drive_letter, win32_path.value());
542*635a8641SAndroid Build Coastguard Worker 
543*635a8641SAndroid Build Coastguard Worker   // Add some directories to the path.  Expect those extra path componenets
544*635a8641SAndroid Build Coastguard Worker   // to be preserved.
545*635a8641SAndroid Build Coastguard Worker   FilePath kRelativePath(FPL("dir1\\dir2\\file.txt"));
546*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(DevicePathToDriveLetterPath(
547*635a8641SAndroid Build Coastguard Worker       actual_device_path.Append(kRelativePath),
548*635a8641SAndroid Build Coastguard Worker       &win32_path));
549*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FilePath(real_drive_letter + L"\\").Append(kRelativePath).value(),
550*635a8641SAndroid Build Coastguard Worker             win32_path.value());
551*635a8641SAndroid Build Coastguard Worker 
552*635a8641SAndroid Build Coastguard Worker   // Deform the real path so that it is invalid by removing the last four
553*635a8641SAndroid Build Coastguard Worker   // characters.  The way windows names devices that are hard disks
554*635a8641SAndroid Build Coastguard Worker   // (\Device\HardDiskVolume${NUMBER}) guarantees that the string is longer
555*635a8641SAndroid Build Coastguard Worker   // than three characters.  The only way the truncated string could be a
556*635a8641SAndroid Build Coastguard Worker   // real drive is if more than 10^3 disks are mounted:
557*635a8641SAndroid Build Coastguard Worker   // \Device\HardDiskVolume10000 would be truncated to \Device\HardDiskVolume1
558*635a8641SAndroid Build Coastguard Worker   // Check that DevicePathToDriveLetterPath fails.
559*635a8641SAndroid Build Coastguard Worker   int path_length = actual_device_path.value().length();
560*635a8641SAndroid Build Coastguard Worker   int new_length = path_length - 4;
561*635a8641SAndroid Build Coastguard Worker   ASSERT_LT(0, new_length);
562*635a8641SAndroid Build Coastguard Worker   FilePath prefix_of_real_device_path(
563*635a8641SAndroid Build Coastguard Worker       actual_device_path.value().substr(0, new_length));
564*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(DevicePathToDriveLetterPath(prefix_of_real_device_path,
565*635a8641SAndroid Build Coastguard Worker                                            &win32_path));
566*635a8641SAndroid Build Coastguard Worker 
567*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(DevicePathToDriveLetterPath(
568*635a8641SAndroid Build Coastguard Worker       prefix_of_real_device_path.Append(kRelativePath),
569*635a8641SAndroid Build Coastguard Worker       &win32_path));
570*635a8641SAndroid Build Coastguard Worker 
571*635a8641SAndroid Build Coastguard Worker   // Deform the real path so that it is invalid by adding some characters. For
572*635a8641SAndroid Build Coastguard Worker   // example, if C: maps to \Device\HardDiskVolume8, then we simulate a
573*635a8641SAndroid Build Coastguard Worker   // request for the drive letter whose native path is
574*635a8641SAndroid Build Coastguard Worker   // \Device\HardDiskVolume812345 .  We assume such a device does not exist,
575*635a8641SAndroid Build Coastguard Worker   // because drives are numbered in order and mounting 112345 hard disks will
576*635a8641SAndroid Build Coastguard Worker   // never happen.
577*635a8641SAndroid Build Coastguard Worker   const FilePath::StringType kExtraChars = FPL("12345");
578*635a8641SAndroid Build Coastguard Worker 
579*635a8641SAndroid Build Coastguard Worker   FilePath real_device_path_plus_numbers(
580*635a8641SAndroid Build Coastguard Worker       actual_device_path.value() + kExtraChars);
581*635a8641SAndroid Build Coastguard Worker 
582*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(DevicePathToDriveLetterPath(
583*635a8641SAndroid Build Coastguard Worker       real_device_path_plus_numbers,
584*635a8641SAndroid Build Coastguard Worker       &win32_path));
585*635a8641SAndroid Build Coastguard Worker 
586*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(DevicePathToDriveLetterPath(
587*635a8641SAndroid Build Coastguard Worker       real_device_path_plus_numbers.Append(kRelativePath),
588*635a8641SAndroid Build Coastguard Worker       &win32_path));
589*635a8641SAndroid Build Coastguard Worker }
590*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CreateTemporaryFileInDirLongPathTest)591*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateTemporaryFileInDirLongPathTest) {
592*635a8641SAndroid Build Coastguard Worker   // Test that CreateTemporaryFileInDir() creates a path and returns a long path
593*635a8641SAndroid Build Coastguard Worker   // if it is available. This test requires that:
594*635a8641SAndroid Build Coastguard Worker   // - the filesystem at |temp_dir_| supports long filenames.
595*635a8641SAndroid Build Coastguard Worker   // - the account has FILE_LIST_DIRECTORY permission for all ancestor
596*635a8641SAndroid Build Coastguard Worker   //   directories of |temp_dir_|.
597*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType kLongDirName[] = FPL("A long path");
598*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType kTestSubDirName[] = FPL("test");
599*635a8641SAndroid Build Coastguard Worker   FilePath long_test_dir = temp_dir_.GetPath().Append(kLongDirName);
600*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(long_test_dir));
601*635a8641SAndroid Build Coastguard Worker 
602*635a8641SAndroid Build Coastguard Worker   // kLongDirName is not a 8.3 component. So GetShortName() should give us a
603*635a8641SAndroid Build Coastguard Worker   // different short name.
604*635a8641SAndroid Build Coastguard Worker   WCHAR path_buffer[MAX_PATH];
605*635a8641SAndroid Build Coastguard Worker   DWORD path_buffer_length = GetShortPathName(long_test_dir.value().c_str(),
606*635a8641SAndroid Build Coastguard Worker                                               path_buffer, MAX_PATH);
607*635a8641SAndroid Build Coastguard Worker   ASSERT_LT(path_buffer_length, DWORD(MAX_PATH));
608*635a8641SAndroid Build Coastguard Worker   ASSERT_NE(DWORD(0), path_buffer_length);
609*635a8641SAndroid Build Coastguard Worker   FilePath short_test_dir(path_buffer);
610*635a8641SAndroid Build Coastguard Worker   ASSERT_STRNE(kLongDirName, short_test_dir.BaseName().value().c_str());
611*635a8641SAndroid Build Coastguard Worker 
612*635a8641SAndroid Build Coastguard Worker   FilePath temp_file;
613*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateTemporaryFileInDir(short_test_dir, &temp_file));
614*635a8641SAndroid Build Coastguard Worker   EXPECT_STREQ(kLongDirName, temp_file.DirName().BaseName().value().c_str());
615*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(temp_file));
616*635a8641SAndroid Build Coastguard Worker 
617*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory of |long_test_dir| and make |long_test_dir|
618*635a8641SAndroid Build Coastguard Worker   // unreadable. We should still be able to create a temp file in the
619*635a8641SAndroid Build Coastguard Worker   // subdirectory, but we won't be able to determine the long path for it. This
620*635a8641SAndroid Build Coastguard Worker   // mimics the environment that some users run where their user profiles reside
621*635a8641SAndroid Build Coastguard Worker   // in a location where the don't have full access to the higher level
622*635a8641SAndroid Build Coastguard Worker   // directories. (Note that this assumption is true for NTFS, but not for some
623*635a8641SAndroid Build Coastguard Worker   // network file systems. E.g. AFS).
624*635a8641SAndroid Build Coastguard Worker   FilePath access_test_dir = long_test_dir.Append(kTestSubDirName);
625*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(access_test_dir));
626*635a8641SAndroid Build Coastguard Worker   FilePermissionRestorer long_test_dir_restorer(long_test_dir);
627*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(MakeFileUnreadable(long_test_dir));
628*635a8641SAndroid Build Coastguard Worker 
629*635a8641SAndroid Build Coastguard Worker   // Use the short form of the directory to create a temporary filename.
630*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateTemporaryFileInDir(
631*635a8641SAndroid Build Coastguard Worker       short_test_dir.Append(kTestSubDirName), &temp_file));
632*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(temp_file));
633*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(short_test_dir.IsParent(temp_file.DirName()));
634*635a8641SAndroid Build Coastguard Worker 
635*635a8641SAndroid Build Coastguard Worker   // Check that the long path can't be determined for |temp_file|.
636*635a8641SAndroid Build Coastguard Worker   path_buffer_length = GetLongPathName(temp_file.value().c_str(),
637*635a8641SAndroid Build Coastguard Worker                                        path_buffer, MAX_PATH);
638*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(DWORD(0), path_buffer_length);
639*635a8641SAndroid Build Coastguard Worker }
640*635a8641SAndroid Build Coastguard Worker 
641*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_WIN)
642*635a8641SAndroid Build Coastguard Worker 
643*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX)
644*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CreateAndReadSymlinks)645*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateAndReadSymlinks) {
646*635a8641SAndroid Build Coastguard Worker   FilePath link_from = temp_dir_.GetPath().Append(FPL("from_file"));
647*635a8641SAndroid Build Coastguard Worker   FilePath link_to = temp_dir_.GetPath().Append(FPL("to_file"));
648*635a8641SAndroid Build Coastguard Worker   CreateTextFile(link_to, bogus_content);
649*635a8641SAndroid Build Coastguard Worker 
650*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
651*635a8641SAndroid Build Coastguard Worker     << "Failed to create file symlink.";
652*635a8641SAndroid Build Coastguard Worker 
653*635a8641SAndroid Build Coastguard Worker   // If we created the link properly, we should be able to read the contents
654*635a8641SAndroid Build Coastguard Worker   // through it.
655*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(bogus_content, ReadTextFile(link_from));
656*635a8641SAndroid Build Coastguard Worker 
657*635a8641SAndroid Build Coastguard Worker   FilePath result;
658*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ReadSymbolicLink(link_from, &result));
659*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(link_to.value(), result.value());
660*635a8641SAndroid Build Coastguard Worker 
661*635a8641SAndroid Build Coastguard Worker   // Link to a directory.
662*635a8641SAndroid Build Coastguard Worker   link_from = temp_dir_.GetPath().Append(FPL("from_dir"));
663*635a8641SAndroid Build Coastguard Worker   link_to = temp_dir_.GetPath().Append(FPL("to_dir"));
664*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(link_to));
665*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
666*635a8641SAndroid Build Coastguard Worker     << "Failed to create directory symlink.";
667*635a8641SAndroid Build Coastguard Worker 
668*635a8641SAndroid Build Coastguard Worker   // Test failures.
669*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(CreateSymbolicLink(link_to, link_to));
670*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadSymbolicLink(link_to, &result));
671*635a8641SAndroid Build Coastguard Worker   FilePath missing = temp_dir_.GetPath().Append(FPL("missing"));
672*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadSymbolicLink(missing, &result));
673*635a8641SAndroid Build Coastguard Worker }
674*635a8641SAndroid Build Coastguard Worker 
675*635a8641SAndroid Build Coastguard Worker // The following test of NormalizeFilePath() require that we create a symlink.
676*635a8641SAndroid Build Coastguard Worker // This can not be done on Windows before Vista.  On Vista, creating a symlink
677*635a8641SAndroid Build Coastguard Worker // requires privilege "SeCreateSymbolicLinkPrivilege".
678*635a8641SAndroid Build Coastguard Worker // TODO(skerner): Investigate the possibility of giving base_unittests the
679*635a8641SAndroid Build Coastguard Worker // privileges required to create a symlink.
TEST_F(FileUtilTest,NormalizeFilePathSymlinks)680*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, NormalizeFilePathSymlinks) {
681*635a8641SAndroid Build Coastguard Worker   // Link one file to another.
682*635a8641SAndroid Build Coastguard Worker   FilePath link_from = temp_dir_.GetPath().Append(FPL("from_file"));
683*635a8641SAndroid Build Coastguard Worker   FilePath link_to = temp_dir_.GetPath().Append(FPL("to_file"));
684*635a8641SAndroid Build Coastguard Worker   CreateTextFile(link_to, bogus_content);
685*635a8641SAndroid Build Coastguard Worker 
686*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
687*635a8641SAndroid Build Coastguard Worker     << "Failed to create file symlink.";
688*635a8641SAndroid Build Coastguard Worker 
689*635a8641SAndroid Build Coastguard Worker   // Check that NormalizeFilePath sees the link.
690*635a8641SAndroid Build Coastguard Worker   FilePath normalized_path;
691*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(NormalizeFilePath(link_from, &normalized_path));
692*635a8641SAndroid Build Coastguard Worker   EXPECT_NE(link_from, link_to);
693*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(link_to.BaseName().value(), normalized_path.BaseName().value());
694*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(link_to.BaseName().value(), normalized_path.BaseName().value());
695*635a8641SAndroid Build Coastguard Worker 
696*635a8641SAndroid Build Coastguard Worker   // Link to a directory.
697*635a8641SAndroid Build Coastguard Worker   link_from = temp_dir_.GetPath().Append(FPL("from_dir"));
698*635a8641SAndroid Build Coastguard Worker   link_to = temp_dir_.GetPath().Append(FPL("to_dir"));
699*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(link_to));
700*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
701*635a8641SAndroid Build Coastguard Worker     << "Failed to create directory symlink.";
702*635a8641SAndroid Build Coastguard Worker 
703*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(NormalizeFilePath(link_from, &normalized_path))
704*635a8641SAndroid Build Coastguard Worker     << "Links to directories should return false.";
705*635a8641SAndroid Build Coastguard Worker 
706*635a8641SAndroid Build Coastguard Worker   // Test that a loop in the links causes NormalizeFilePath() to return false.
707*635a8641SAndroid Build Coastguard Worker   link_from = temp_dir_.GetPath().Append(FPL("link_a"));
708*635a8641SAndroid Build Coastguard Worker   link_to = temp_dir_.GetPath().Append(FPL("link_b"));
709*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(link_to, link_from))
710*635a8641SAndroid Build Coastguard Worker     << "Failed to create loop symlink a.";
711*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(link_from, link_to))
712*635a8641SAndroid Build Coastguard Worker     << "Failed to create loop symlink b.";
713*635a8641SAndroid Build Coastguard Worker 
714*635a8641SAndroid Build Coastguard Worker   // Infinite loop!
715*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(NormalizeFilePath(link_from, &normalized_path));
716*635a8641SAndroid Build Coastguard Worker }
717*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,DeleteSymlinkToExistentFile)718*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteSymlinkToExistentFile) {
719*635a8641SAndroid Build Coastguard Worker   // Create a file.
720*635a8641SAndroid Build Coastguard Worker   FilePath file_name = temp_dir_.GetPath().Append(FPL("Test DeleteFile 2.txt"));
721*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name, bogus_content);
722*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name));
723*635a8641SAndroid Build Coastguard Worker 
724*635a8641SAndroid Build Coastguard Worker   // Create a symlink to the file.
725*635a8641SAndroid Build Coastguard Worker   FilePath file_link = temp_dir_.GetPath().Append("file_link_2");
726*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(file_name, file_link))
727*635a8641SAndroid Build Coastguard Worker       << "Failed to create symlink.";
728*635a8641SAndroid Build Coastguard Worker 
729*635a8641SAndroid Build Coastguard Worker   // Delete the symbolic link.
730*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(file_link, false));
731*635a8641SAndroid Build Coastguard Worker 
732*635a8641SAndroid Build Coastguard Worker   // Make sure original file is not deleted.
733*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_link));
734*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name));
735*635a8641SAndroid Build Coastguard Worker }
736*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,DeleteSymlinkToNonExistentFile)737*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteSymlinkToNonExistentFile) {
738*635a8641SAndroid Build Coastguard Worker   // Create a non-existent file path.
739*635a8641SAndroid Build Coastguard Worker   FilePath non_existent =
740*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FPL("Test DeleteFile 3.txt"));
741*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(non_existent));
742*635a8641SAndroid Build Coastguard Worker 
743*635a8641SAndroid Build Coastguard Worker   // Create a symlink to the non-existent file.
744*635a8641SAndroid Build Coastguard Worker   FilePath file_link = temp_dir_.GetPath().Append("file_link_3");
745*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(non_existent, file_link))
746*635a8641SAndroid Build Coastguard Worker       << "Failed to create symlink.";
747*635a8641SAndroid Build Coastguard Worker 
748*635a8641SAndroid Build Coastguard Worker   // Make sure the symbolic link is exist.
749*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(IsLink(file_link));
750*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_link));
751*635a8641SAndroid Build Coastguard Worker 
752*635a8641SAndroid Build Coastguard Worker   // Delete the symbolic link.
753*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(file_link, false));
754*635a8641SAndroid Build Coastguard Worker 
755*635a8641SAndroid Build Coastguard Worker   // Make sure the symbolic link is deleted.
756*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(IsLink(file_link));
757*635a8641SAndroid Build Coastguard Worker }
758*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyFileFollowsSymlinks)759*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileFollowsSymlinks) {
760*635a8641SAndroid Build Coastguard Worker   FilePath link_from = temp_dir_.GetPath().Append(FPL("from_file"));
761*635a8641SAndroid Build Coastguard Worker   FilePath link_to = temp_dir_.GetPath().Append(FPL("to_file"));
762*635a8641SAndroid Build Coastguard Worker   CreateTextFile(link_to, bogus_content);
763*635a8641SAndroid Build Coastguard Worker 
764*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(link_to, link_from));
765*635a8641SAndroid Build Coastguard Worker 
766*635a8641SAndroid Build Coastguard Worker   // If we created the link properly, we should be able to read the contents
767*635a8641SAndroid Build Coastguard Worker   // through it.
768*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(bogus_content, ReadTextFile(link_from));
769*635a8641SAndroid Build Coastguard Worker 
770*635a8641SAndroid Build Coastguard Worker   FilePath result;
771*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ReadSymbolicLink(link_from, &result));
772*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(link_to.value(), result.value());
773*635a8641SAndroid Build Coastguard Worker 
774*635a8641SAndroid Build Coastguard Worker   // Create another file and copy it to |link_from|.
775*635a8641SAndroid Build Coastguard Worker   FilePath src_file = temp_dir_.GetPath().Append(FPL("src.txt"));
776*635a8641SAndroid Build Coastguard Worker   const std::wstring file_contents(L"Gooooooooooooooooooooogle");
777*635a8641SAndroid Build Coastguard Worker   CreateTextFile(src_file, file_contents);
778*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyFile(src_file, link_from));
779*635a8641SAndroid Build Coastguard Worker 
780*635a8641SAndroid Build Coastguard Worker   // Make sure |link_from| is still a symlink, and |link_to| has been written to
781*635a8641SAndroid Build Coastguard Worker   // by CopyFile().
782*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(IsLink(link_from));
783*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(file_contents, ReadTextFile(link_from));
784*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(file_contents, ReadTextFile(link_to));
785*635a8641SAndroid Build Coastguard Worker }
786*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,ChangeFilePermissionsAndRead)787*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ChangeFilePermissionsAndRead) {
788*635a8641SAndroid Build Coastguard Worker   // Create a file path.
789*635a8641SAndroid Build Coastguard Worker   FilePath file_name =
790*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FPL("Test Readable File.txt"));
791*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name));
792*635a8641SAndroid Build Coastguard Worker 
793*635a8641SAndroid Build Coastguard Worker   static constexpr char kData[] = "hello";
794*635a8641SAndroid Build Coastguard Worker   static constexpr int kDataSize = sizeof(kData) - 1;
795*635a8641SAndroid Build Coastguard Worker   char buffer[kDataSize];
796*635a8641SAndroid Build Coastguard Worker 
797*635a8641SAndroid Build Coastguard Worker   // Write file.
798*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(kDataSize, WriteFile(file_name, kData, kDataSize));
799*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name));
800*635a8641SAndroid Build Coastguard Worker 
801*635a8641SAndroid Build Coastguard Worker   // Make sure the file is readable.
802*635a8641SAndroid Build Coastguard Worker   int32_t mode = 0;
803*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
804*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(mode & FILE_PERMISSION_READ_BY_USER);
805*635a8641SAndroid Build Coastguard Worker 
806*635a8641SAndroid Build Coastguard Worker   // Get rid of the read permission.
807*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SetPosixFilePermissions(file_name, 0u));
808*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
809*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(mode & FILE_PERMISSION_READ_BY_USER);
810*635a8641SAndroid Build Coastguard Worker   // Make sure the file can't be read.
811*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-1, ReadFile(file_name, buffer, kDataSize));
812*635a8641SAndroid Build Coastguard Worker 
813*635a8641SAndroid Build Coastguard Worker   // Give the read permission.
814*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SetPosixFilePermissions(file_name, FILE_PERMISSION_READ_BY_USER));
815*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
816*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(mode & FILE_PERMISSION_READ_BY_USER);
817*635a8641SAndroid Build Coastguard Worker   // Make sure the file can be read.
818*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(kDataSize, ReadFile(file_name, buffer, kDataSize));
819*635a8641SAndroid Build Coastguard Worker 
820*635a8641SAndroid Build Coastguard Worker   // Delete the file.
821*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(file_name, false));
822*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name));
823*635a8641SAndroid Build Coastguard Worker }
824*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,ChangeFilePermissionsAndWrite)825*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ChangeFilePermissionsAndWrite) {
826*635a8641SAndroid Build Coastguard Worker   // Create a file path.
827*635a8641SAndroid Build Coastguard Worker   FilePath file_name =
828*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FPL("Test Readable File.txt"));
829*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name));
830*635a8641SAndroid Build Coastguard Worker 
831*635a8641SAndroid Build Coastguard Worker   const std::string kData("hello");
832*635a8641SAndroid Build Coastguard Worker 
833*635a8641SAndroid Build Coastguard Worker   // Write file.
834*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kData.length()),
835*635a8641SAndroid Build Coastguard Worker             WriteFile(file_name, kData.data(), kData.length()));
836*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name));
837*635a8641SAndroid Build Coastguard Worker 
838*635a8641SAndroid Build Coastguard Worker   // Make sure the file is writable.
839*635a8641SAndroid Build Coastguard Worker   int mode = 0;
840*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
841*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(mode & FILE_PERMISSION_WRITE_BY_USER);
842*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathIsWritable(file_name));
843*635a8641SAndroid Build Coastguard Worker 
844*635a8641SAndroid Build Coastguard Worker   // Get rid of the write permission.
845*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SetPosixFilePermissions(file_name, 0u));
846*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
847*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(mode & FILE_PERMISSION_WRITE_BY_USER);
848*635a8641SAndroid Build Coastguard Worker   // Make sure the file can't be write.
849*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-1, WriteFile(file_name, kData.data(), kData.length()));
850*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathIsWritable(file_name));
851*635a8641SAndroid Build Coastguard Worker 
852*635a8641SAndroid Build Coastguard Worker   // Give read permission.
853*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SetPosixFilePermissions(file_name,
854*635a8641SAndroid Build Coastguard Worker                                       FILE_PERMISSION_WRITE_BY_USER));
855*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(GetPosixFilePermissions(file_name, &mode));
856*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(mode & FILE_PERMISSION_WRITE_BY_USER);
857*635a8641SAndroid Build Coastguard Worker   // Make sure the file can be write.
858*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kData.length()),
859*635a8641SAndroid Build Coastguard Worker             WriteFile(file_name, kData.data(), kData.length()));
860*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathIsWritable(file_name));
861*635a8641SAndroid Build Coastguard Worker 
862*635a8641SAndroid Build Coastguard Worker   // Delete the file.
863*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(file_name, false));
864*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name));
865*635a8641SAndroid Build Coastguard Worker }
866*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,ChangeDirectoryPermissionsAndEnumerate)867*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ChangeDirectoryPermissionsAndEnumerate) {
868*635a8641SAndroid Build Coastguard Worker   // Create a directory path.
869*635a8641SAndroid Build Coastguard Worker   FilePath subdir_path = temp_dir_.GetPath().Append(FPL("PermissionTest1"));
870*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_path);
871*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_path));
872*635a8641SAndroid Build Coastguard Worker 
873*635a8641SAndroid Build Coastguard Worker   // Create a dummy file to enumerate.
874*635a8641SAndroid Build Coastguard Worker   FilePath file_name = subdir_path.Append(FPL("Test Readable File.txt"));
875*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name));
876*635a8641SAndroid Build Coastguard Worker   const std::string kData("hello");
877*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kData.length()),
878*635a8641SAndroid Build Coastguard Worker             WriteFile(file_name, kData.data(), kData.length()));
879*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name));
880*635a8641SAndroid Build Coastguard Worker 
881*635a8641SAndroid Build Coastguard Worker   // Make sure the directory has the all permissions.
882*635a8641SAndroid Build Coastguard Worker   int mode = 0;
883*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(GetPosixFilePermissions(subdir_path, &mode));
884*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FILE_PERMISSION_USER_MASK, mode & FILE_PERMISSION_USER_MASK);
885*635a8641SAndroid Build Coastguard Worker 
886*635a8641SAndroid Build Coastguard Worker   // Get rid of the permissions from the directory.
887*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SetPosixFilePermissions(subdir_path, 0u));
888*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(GetPosixFilePermissions(subdir_path, &mode));
889*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(mode & FILE_PERMISSION_USER_MASK);
890*635a8641SAndroid Build Coastguard Worker 
891*635a8641SAndroid Build Coastguard Worker   // Make sure the file in the directory can't be enumerated.
892*635a8641SAndroid Build Coastguard Worker   FileEnumerator f1(subdir_path, true, FileEnumerator::FILES);
893*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(subdir_path));
894*635a8641SAndroid Build Coastguard Worker   FindResultCollector c1(&f1);
895*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, c1.size());
896*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(GetPosixFilePermissions(file_name, &mode));
897*635a8641SAndroid Build Coastguard Worker 
898*635a8641SAndroid Build Coastguard Worker   // Give the permissions to the directory.
899*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SetPosixFilePermissions(subdir_path, FILE_PERMISSION_USER_MASK));
900*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(GetPosixFilePermissions(subdir_path, &mode));
901*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FILE_PERMISSION_USER_MASK, mode & FILE_PERMISSION_USER_MASK);
902*635a8641SAndroid Build Coastguard Worker 
903*635a8641SAndroid Build Coastguard Worker   // Make sure the file in the directory can be enumerated.
904*635a8641SAndroid Build Coastguard Worker   FileEnumerator f2(subdir_path, true, FileEnumerator::FILES);
905*635a8641SAndroid Build Coastguard Worker   FindResultCollector c2(&f2);
906*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c2.HasFile(file_name));
907*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1, c2.size());
908*635a8641SAndroid Build Coastguard Worker 
909*635a8641SAndroid Build Coastguard Worker   // Delete the file.
910*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(subdir_path, true));
911*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(subdir_path));
912*635a8641SAndroid Build Coastguard Worker }
913*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,ExecutableExistsInPath)914*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ExecutableExistsInPath) {
915*635a8641SAndroid Build Coastguard Worker   // Create two directories that we will put in our PATH
916*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType kDir1[] = FPL("dir1");
917*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType kDir2[] = FPL("dir2");
918*635a8641SAndroid Build Coastguard Worker 
919*635a8641SAndroid Build Coastguard Worker   FilePath dir1 = temp_dir_.GetPath().Append(kDir1);
920*635a8641SAndroid Build Coastguard Worker   FilePath dir2 = temp_dir_.GetPath().Append(kDir2);
921*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir1));
922*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir2));
923*635a8641SAndroid Build Coastguard Worker 
924*635a8641SAndroid Build Coastguard Worker   test::ScopedEnvironmentVariableOverride scoped_env(
925*635a8641SAndroid Build Coastguard Worker       "PATH", dir1.value() + ":" + dir2.value());
926*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(scoped_env.IsOverridden());
927*635a8641SAndroid Build Coastguard Worker 
928*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType kRegularFileName[] = FPL("regular_file");
929*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType kExeFileName[] = FPL("exe");
930*635a8641SAndroid Build Coastguard Worker   const FilePath::CharType kDneFileName[] = FPL("does_not_exist");
931*635a8641SAndroid Build Coastguard Worker 
932*635a8641SAndroid Build Coastguard Worker   const FilePath kExePath = dir1.Append(kExeFileName);
933*635a8641SAndroid Build Coastguard Worker   const FilePath kRegularFilePath = dir2.Append(kRegularFileName);
934*635a8641SAndroid Build Coastguard Worker 
935*635a8641SAndroid Build Coastguard Worker   // Write file.
936*635a8641SAndroid Build Coastguard Worker   const std::string kData("hello");
937*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<int>(kData.length()),
938*635a8641SAndroid Build Coastguard Worker             WriteFile(kExePath, kData.data(), kData.length()));
939*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(kExePath));
940*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<int>(kData.length()),
941*635a8641SAndroid Build Coastguard Worker             WriteFile(kRegularFilePath, kData.data(), kData.length()));
942*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(kRegularFilePath));
943*635a8641SAndroid Build Coastguard Worker 
944*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetPosixFilePermissions(dir1.Append(kExeFileName),
945*635a8641SAndroid Build Coastguard Worker                                       FILE_PERMISSION_EXECUTE_BY_USER));
946*635a8641SAndroid Build Coastguard Worker 
947*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ExecutableExistsInPath(scoped_env.GetEnv(), kExeFileName));
948*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ExecutableExistsInPath(scoped_env.GetEnv(), kRegularFileName));
949*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ExecutableExistsInPath(scoped_env.GetEnv(), kDneFileName));
950*635a8641SAndroid Build Coastguard Worker }
951*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryPermissions)952*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryPermissions) {
953*635a8641SAndroid Build Coastguard Worker   // Create a directory.
954*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
955*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
956*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
957*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
958*635a8641SAndroid Build Coastguard Worker 
959*635a8641SAndroid Build Coastguard Worker   // Create some regular files under the directory with various permissions.
960*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
961*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
962*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Mordecai");
963*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
964*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetPosixFilePermissions(file_name_from, 0755));
965*635a8641SAndroid Build Coastguard Worker 
966*635a8641SAndroid Build Coastguard Worker   FilePath file2_name_from =
967*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Reggy-2.txt"));
968*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file2_name_from, L"Rigby");
969*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file2_name_from));
970*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetPosixFilePermissions(file2_name_from, 0777));
971*635a8641SAndroid Build Coastguard Worker 
972*635a8641SAndroid Build Coastguard Worker   FilePath file3_name_from =
973*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Reggy-3.txt"));
974*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file3_name_from, L"Benson");
975*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file3_name_from));
976*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetPosixFilePermissions(file3_name_from, 0400));
977*635a8641SAndroid Build Coastguard Worker 
978*635a8641SAndroid Build Coastguard Worker   // Copy the directory recursively.
979*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
980*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
981*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
982*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
983*635a8641SAndroid Build Coastguard Worker   FilePath file2_name_to =
984*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Reggy-2.txt"));
985*635a8641SAndroid Build Coastguard Worker   FilePath file3_name_to =
986*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Reggy-3.txt"));
987*635a8641SAndroid Build Coastguard Worker 
988*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(dir_name_to));
989*635a8641SAndroid Build Coastguard Worker 
990*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, true));
991*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_to));
992*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file2_name_to));
993*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file3_name_to));
994*635a8641SAndroid Build Coastguard Worker 
995*635a8641SAndroid Build Coastguard Worker   int mode = 0;
996*635a8641SAndroid Build Coastguard Worker   int expected_mode;
997*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(file_name_to, &mode));
998*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
999*635a8641SAndroid Build Coastguard Worker   expected_mode = 0755;
1000*635a8641SAndroid Build Coastguard Worker #elif defined(OS_CHROMEOS)
1001*635a8641SAndroid Build Coastguard Worker   expected_mode = 0644;
1002*635a8641SAndroid Build Coastguard Worker #else
1003*635a8641SAndroid Build Coastguard Worker   expected_mode = 0600;
1004*635a8641SAndroid Build Coastguard Worker #endif
1005*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(expected_mode, mode);
1006*635a8641SAndroid Build Coastguard Worker 
1007*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(file2_name_to, &mode));
1008*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
1009*635a8641SAndroid Build Coastguard Worker   expected_mode = 0755;
1010*635a8641SAndroid Build Coastguard Worker #elif defined(OS_CHROMEOS)
1011*635a8641SAndroid Build Coastguard Worker   expected_mode = 0644;
1012*635a8641SAndroid Build Coastguard Worker #else
1013*635a8641SAndroid Build Coastguard Worker   expected_mode = 0600;
1014*635a8641SAndroid Build Coastguard Worker #endif
1015*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(expected_mode, mode);
1016*635a8641SAndroid Build Coastguard Worker 
1017*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(file3_name_to, &mode));
1018*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
1019*635a8641SAndroid Build Coastguard Worker   expected_mode = 0600;
1020*635a8641SAndroid Build Coastguard Worker #elif defined(OS_CHROMEOS)
1021*635a8641SAndroid Build Coastguard Worker   expected_mode = 0644;
1022*635a8641SAndroid Build Coastguard Worker #else
1023*635a8641SAndroid Build Coastguard Worker   expected_mode = 0600;
1024*635a8641SAndroid Build Coastguard Worker #endif
1025*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(expected_mode, mode);
1026*635a8641SAndroid Build Coastguard Worker }
1027*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryPermissionsOverExistingFile)1028*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryPermissionsOverExistingFile) {
1029*635a8641SAndroid Build Coastguard Worker   // Create a directory.
1030*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1031*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1032*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
1033*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1034*635a8641SAndroid Build Coastguard Worker 
1035*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
1036*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1037*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
1038*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Mordecai");
1039*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1040*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetPosixFilePermissions(file_name_from, 0644));
1041*635a8641SAndroid Build Coastguard Worker 
1042*635a8641SAndroid Build Coastguard Worker   // Create a directory.
1043*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1044*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1045*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_to);
1046*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
1047*635a8641SAndroid Build Coastguard Worker 
1048*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory with wider permissions.
1049*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
1050*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
1051*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_to, L"Rigby");
1052*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_to));
1053*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetPosixFilePermissions(file_name_to, 0777));
1054*635a8641SAndroid Build Coastguard Worker 
1055*635a8641SAndroid Build Coastguard Worker   // Ensure that when we copy the directory, the file contents are copied
1056*635a8641SAndroid Build Coastguard Worker   // but the permissions on the destination are left alone.
1057*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
1058*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_to));
1059*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(L"Mordecai", ReadTextFile(file_name_to));
1060*635a8641SAndroid Build Coastguard Worker 
1061*635a8641SAndroid Build Coastguard Worker   int mode = 0;
1062*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(file_name_to, &mode));
1063*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0777, mode);
1064*635a8641SAndroid Build Coastguard Worker }
1065*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryExclDoesNotOverwrite)1066*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclDoesNotOverwrite) {
1067*635a8641SAndroid Build Coastguard Worker   // Create source directory.
1068*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1069*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1070*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
1071*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1072*635a8641SAndroid Build Coastguard Worker 
1073*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
1074*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1075*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
1076*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Mordecai");
1077*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1078*635a8641SAndroid Build Coastguard Worker 
1079*635a8641SAndroid Build Coastguard Worker   // Create destination directory.
1080*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1081*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1082*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_to);
1083*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
1084*635a8641SAndroid Build Coastguard Worker 
1085*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory with the same name.
1086*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to = dir_name_to.Append(FILE_PATH_LITERAL("Reggy-1.txt"));
1087*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_to, L"Rigby");
1088*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_to));
1089*635a8641SAndroid Build Coastguard Worker 
1090*635a8641SAndroid Build Coastguard Worker   // Ensure that copying failed and the file was not overwritten.
1091*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
1092*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_to));
1093*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(L"Rigby", ReadTextFile(file_name_to));
1094*635a8641SAndroid Build Coastguard Worker }
1095*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryExclDirectoryOverExistingFile)1096*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverExistingFile) {
1097*635a8641SAndroid Build Coastguard Worker   // Create source directory.
1098*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1099*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1100*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
1101*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1102*635a8641SAndroid Build Coastguard Worker 
1103*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory.
1104*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
1105*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_name_from);
1106*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_name_from));
1107*635a8641SAndroid Build Coastguard Worker 
1108*635a8641SAndroid Build Coastguard Worker   // Create destination directory.
1109*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1110*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1111*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_to);
1112*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
1113*635a8641SAndroid Build Coastguard Worker 
1114*635a8641SAndroid Build Coastguard Worker   // Create a regular file under the directory with the same name.
1115*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to = dir_name_to.Append(FILE_PATH_LITERAL("Subsub"));
1116*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_to, L"Rigby");
1117*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_to));
1118*635a8641SAndroid Build Coastguard Worker 
1119*635a8641SAndroid Build Coastguard Worker   // Ensure that copying failed and the file was not overwritten.
1120*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
1121*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_to));
1122*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(L"Rigby", ReadTextFile(file_name_to));
1123*635a8641SAndroid Build Coastguard Worker }
1124*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryExclDirectoryOverExistingDirectory)1125*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverExistingDirectory) {
1126*635a8641SAndroid Build Coastguard Worker   // Create source directory.
1127*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1128*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1129*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
1130*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1131*635a8641SAndroid Build Coastguard Worker 
1132*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory.
1133*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
1134*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_name_from);
1135*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_name_from));
1136*635a8641SAndroid Build Coastguard Worker 
1137*635a8641SAndroid Build Coastguard Worker   // Create destination directory.
1138*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1139*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1140*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_to);
1141*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
1142*635a8641SAndroid Build Coastguard Worker 
1143*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory under the directory with the same name.
1144*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_to = dir_name_to.Append(FILE_PATH_LITERAL("Subsub"));
1145*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_name_to);
1146*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_name_to));
1147*635a8641SAndroid Build Coastguard Worker 
1148*635a8641SAndroid Build Coastguard Worker   // Ensure that copying failed and the file was not overwritten.
1149*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
1150*635a8641SAndroid Build Coastguard Worker }
1151*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyFileExecutablePermission)1152*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileExecutablePermission) {
1153*635a8641SAndroid Build Coastguard Worker   FilePath src = temp_dir_.GetPath().Append(FPL("src.txt"));
1154*635a8641SAndroid Build Coastguard Worker   const std::wstring file_contents(L"Gooooooooooooooooooooogle");
1155*635a8641SAndroid Build Coastguard Worker   CreateTextFile(src, file_contents);
1156*635a8641SAndroid Build Coastguard Worker 
1157*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetPosixFilePermissions(src, 0755));
1158*635a8641SAndroid Build Coastguard Worker   int mode = 0;
1159*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(src, &mode));
1160*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0755, mode);
1161*635a8641SAndroid Build Coastguard Worker 
1162*635a8641SAndroid Build Coastguard Worker   FilePath dst = temp_dir_.GetPath().Append(FPL("dst.txt"));
1163*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyFile(src, dst));
1164*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(file_contents, ReadTextFile(dst));
1165*635a8641SAndroid Build Coastguard Worker 
1166*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
1167*635a8641SAndroid Build Coastguard Worker   int expected_mode;
1168*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
1169*635a8641SAndroid Build Coastguard Worker   expected_mode = 0755;
1170*635a8641SAndroid Build Coastguard Worker #elif defined(OS_CHROMEOS)
1171*635a8641SAndroid Build Coastguard Worker   expected_mode = 0644;
1172*635a8641SAndroid Build Coastguard Worker #else
1173*635a8641SAndroid Build Coastguard Worker   expected_mode = 0600;
1174*635a8641SAndroid Build Coastguard Worker #endif
1175*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(expected_mode, mode);
1176*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(DeleteFile(dst, false));
1177*635a8641SAndroid Build Coastguard Worker 
1178*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetPosixFilePermissions(src, 0777));
1179*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(src, &mode));
1180*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0777, mode);
1181*635a8641SAndroid Build Coastguard Worker 
1182*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyFile(src, dst));
1183*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(file_contents, ReadTextFile(dst));
1184*635a8641SAndroid Build Coastguard Worker 
1185*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
1186*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
1187*635a8641SAndroid Build Coastguard Worker   expected_mode = 0755;
1188*635a8641SAndroid Build Coastguard Worker #elif defined(OS_CHROMEOS)
1189*635a8641SAndroid Build Coastguard Worker   expected_mode = 0644;
1190*635a8641SAndroid Build Coastguard Worker #else
1191*635a8641SAndroid Build Coastguard Worker   expected_mode = 0600;
1192*635a8641SAndroid Build Coastguard Worker #endif
1193*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(expected_mode, mode);
1194*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(DeleteFile(dst, false));
1195*635a8641SAndroid Build Coastguard Worker 
1196*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetPosixFilePermissions(src, 0400));
1197*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(src, &mode));
1198*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0400, mode);
1199*635a8641SAndroid Build Coastguard Worker 
1200*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyFile(src, dst));
1201*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(file_contents, ReadTextFile(dst));
1202*635a8641SAndroid Build Coastguard Worker 
1203*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
1204*635a8641SAndroid Build Coastguard Worker #if defined(OS_MACOSX)
1205*635a8641SAndroid Build Coastguard Worker   expected_mode = 0600;
1206*635a8641SAndroid Build Coastguard Worker #elif defined(OS_CHROMEOS)
1207*635a8641SAndroid Build Coastguard Worker   expected_mode = 0644;
1208*635a8641SAndroid Build Coastguard Worker #else
1209*635a8641SAndroid Build Coastguard Worker   expected_mode = 0600;
1210*635a8641SAndroid Build Coastguard Worker #endif
1211*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(expected_mode, mode);
1212*635a8641SAndroid Build Coastguard Worker 
1213*635a8641SAndroid Build Coastguard Worker   // This time, do not delete |dst|. Instead set its permissions to 0777.
1214*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(SetPosixFilePermissions(dst, 0777));
1215*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
1216*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0777, mode);
1217*635a8641SAndroid Build Coastguard Worker 
1218*635a8641SAndroid Build Coastguard Worker   // Overwrite it and check the permissions again.
1219*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyFile(src, dst));
1220*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(file_contents, ReadTextFile(dst));
1221*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetPosixFilePermissions(dst, &mode));
1222*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0777, mode);
1223*635a8641SAndroid Build Coastguard Worker }
1224*635a8641SAndroid Build Coastguard Worker 
1225*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_POSIX)
1226*635a8641SAndroid Build Coastguard Worker 
1227*635a8641SAndroid Build Coastguard Worker #if !defined(OS_FUCHSIA)
1228*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyFileACL)1229*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileACL) {
1230*635a8641SAndroid Build Coastguard Worker   // While FileUtilTest.CopyFile asserts the content is correctly copied over,
1231*635a8641SAndroid Build Coastguard Worker   // this test case asserts the access control bits are meeting expectations in
1232*635a8641SAndroid Build Coastguard Worker   // CopyFile().
1233*635a8641SAndroid Build Coastguard Worker   FilePath src = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("src.txt"));
1234*635a8641SAndroid Build Coastguard Worker   const std::wstring file_contents(L"Gooooooooooooooooooooogle");
1235*635a8641SAndroid Build Coastguard Worker   CreateTextFile(src, file_contents);
1236*635a8641SAndroid Build Coastguard Worker 
1237*635a8641SAndroid Build Coastguard Worker   // Set the source file to read-only.
1238*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(IsReadOnly(src));
1239*635a8641SAndroid Build Coastguard Worker   SetReadOnly(src, true);
1240*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(IsReadOnly(src));
1241*635a8641SAndroid Build Coastguard Worker 
1242*635a8641SAndroid Build Coastguard Worker   // Copy the file.
1243*635a8641SAndroid Build Coastguard Worker   FilePath dst = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("dst.txt"));
1244*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyFile(src, dst));
1245*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(file_contents, ReadTextFile(dst));
1246*635a8641SAndroid Build Coastguard Worker 
1247*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(IsReadOnly(dst));
1248*635a8641SAndroid Build Coastguard Worker }
1249*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryACL)1250*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryACL) {
1251*635a8641SAndroid Build Coastguard Worker   // Create source directories.
1252*635a8641SAndroid Build Coastguard Worker   FilePath src = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("src"));
1253*635a8641SAndroid Build Coastguard Worker   FilePath src_subdir = src.Append(FILE_PATH_LITERAL("subdir"));
1254*635a8641SAndroid Build Coastguard Worker   CreateDirectory(src_subdir);
1255*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(src_subdir));
1256*635a8641SAndroid Build Coastguard Worker 
1257*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
1258*635a8641SAndroid Build Coastguard Worker   FilePath src_file = src.Append(FILE_PATH_LITERAL("src.txt"));
1259*635a8641SAndroid Build Coastguard Worker   CreateTextFile(src_file, L"Gooooooooooooooooooooogle");
1260*635a8641SAndroid Build Coastguard Worker   SetReadOnly(src_file, true);
1261*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(IsReadOnly(src_file));
1262*635a8641SAndroid Build Coastguard Worker 
1263*635a8641SAndroid Build Coastguard Worker   // Make directory read-only.
1264*635a8641SAndroid Build Coastguard Worker   SetReadOnly(src_subdir, true);
1265*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(IsReadOnly(src_subdir));
1266*635a8641SAndroid Build Coastguard Worker 
1267*635a8641SAndroid Build Coastguard Worker   // Copy the directory recursively.
1268*635a8641SAndroid Build Coastguard Worker   FilePath dst = temp_dir_.GetPath().Append(FILE_PATH_LITERAL("dst"));
1269*635a8641SAndroid Build Coastguard Worker   FilePath dst_file = dst.Append(FILE_PATH_LITERAL("src.txt"));
1270*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(src, dst, true));
1271*635a8641SAndroid Build Coastguard Worker 
1272*635a8641SAndroid Build Coastguard Worker   FilePath dst_subdir = dst.Append(FILE_PATH_LITERAL("subdir"));
1273*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(IsReadOnly(dst_subdir));
1274*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(IsReadOnly(dst_file));
1275*635a8641SAndroid Build Coastguard Worker 
1276*635a8641SAndroid Build Coastguard Worker   // Give write permissions to allow deletion.
1277*635a8641SAndroid Build Coastguard Worker   SetReadOnly(src_subdir, false);
1278*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(IsReadOnly(src_subdir));
1279*635a8641SAndroid Build Coastguard Worker }
1280*635a8641SAndroid Build Coastguard Worker 
1281*635a8641SAndroid Build Coastguard Worker #endif  // !defined(OS_FUCHSIA)
1282*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,DeleteNonExistent)1283*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteNonExistent) {
1284*635a8641SAndroid Build Coastguard Worker   FilePath non_existent =
1285*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().AppendASCII("bogus_file_dne.foobar");
1286*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(non_existent));
1287*635a8641SAndroid Build Coastguard Worker 
1288*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(non_existent, false));
1289*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(non_existent));
1290*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(non_existent, true));
1291*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(non_existent));
1292*635a8641SAndroid Build Coastguard Worker }
1293*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,DeleteNonExistentWithNonExistentParent)1294*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteNonExistentWithNonExistentParent) {
1295*635a8641SAndroid Build Coastguard Worker   FilePath non_existent = temp_dir_.GetPath().AppendASCII("bogus_topdir");
1296*635a8641SAndroid Build Coastguard Worker   non_existent = non_existent.AppendASCII("bogus_subdir");
1297*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(non_existent));
1298*635a8641SAndroid Build Coastguard Worker 
1299*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(non_existent, false));
1300*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(non_existent));
1301*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(non_existent, true));
1302*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(non_existent));
1303*635a8641SAndroid Build Coastguard Worker }
1304*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,DeleteFile)1305*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteFile) {
1306*635a8641SAndroid Build Coastguard Worker   // Create a file
1307*635a8641SAndroid Build Coastguard Worker   FilePath file_name = temp_dir_.GetPath().Append(FPL("Test DeleteFile 1.txt"));
1308*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name, bogus_content);
1309*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name));
1310*635a8641SAndroid Build Coastguard Worker 
1311*635a8641SAndroid Build Coastguard Worker   // Make sure it's deleted
1312*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(file_name, false));
1313*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name));
1314*635a8641SAndroid Build Coastguard Worker 
1315*635a8641SAndroid Build Coastguard Worker   // Test recursive case, create a new file
1316*635a8641SAndroid Build Coastguard Worker   file_name = temp_dir_.GetPath().Append(FPL("Test DeleteFile 2.txt"));
1317*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name, bogus_content);
1318*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name));
1319*635a8641SAndroid Build Coastguard Worker 
1320*635a8641SAndroid Build Coastguard Worker   // Make sure it's deleted
1321*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(file_name, true));
1322*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name));
1323*635a8641SAndroid Build Coastguard Worker }
1324*635a8641SAndroid Build Coastguard Worker 
1325*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
1326*635a8641SAndroid Build Coastguard Worker // Tests that the Delete function works for wild cards, especially
1327*635a8641SAndroid Build Coastguard Worker // with the recursion flag.  Also coincidentally tests PathExists.
1328*635a8641SAndroid Build Coastguard Worker // TODO(erikkay): see if anyone's actually using this feature of the API
TEST_F(FileUtilTest,DeleteWildCard)1329*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteWildCard) {
1330*635a8641SAndroid Build Coastguard Worker   // Create a file and a directory
1331*635a8641SAndroid Build Coastguard Worker   FilePath file_name =
1332*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FPL("Test DeleteWildCard.txt"));
1333*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name, bogus_content);
1334*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name));
1335*635a8641SAndroid Build Coastguard Worker 
1336*635a8641SAndroid Build Coastguard Worker   FilePath subdir_path = temp_dir_.GetPath().Append(FPL("DeleteWildCardDir"));
1337*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_path);
1338*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_path));
1339*635a8641SAndroid Build Coastguard Worker 
1340*635a8641SAndroid Build Coastguard Worker   // Create the wildcard path
1341*635a8641SAndroid Build Coastguard Worker   FilePath directory_contents = temp_dir_.GetPath();
1342*635a8641SAndroid Build Coastguard Worker   directory_contents = directory_contents.Append(FPL("*"));
1343*635a8641SAndroid Build Coastguard Worker 
1344*635a8641SAndroid Build Coastguard Worker   // Delete non-recursively and check that only the file is deleted
1345*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(directory_contents, false));
1346*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name));
1347*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(subdir_path));
1348*635a8641SAndroid Build Coastguard Worker 
1349*635a8641SAndroid Build Coastguard Worker   // Delete recursively and make sure all contents are deleted
1350*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(directory_contents, true));
1351*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name));
1352*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(subdir_path));
1353*635a8641SAndroid Build Coastguard Worker }
1354*635a8641SAndroid Build Coastguard Worker 
1355*635a8641SAndroid Build Coastguard Worker // TODO(erikkay): see if anyone's actually using this feature of the API
TEST_F(FileUtilTest,DeleteNonExistantWildCard)1356*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteNonExistantWildCard) {
1357*635a8641SAndroid Build Coastguard Worker   // Create a file and a directory
1358*635a8641SAndroid Build Coastguard Worker   FilePath subdir_path =
1359*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FPL("DeleteNonExistantWildCard"));
1360*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_path);
1361*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_path));
1362*635a8641SAndroid Build Coastguard Worker 
1363*635a8641SAndroid Build Coastguard Worker   // Create the wildcard path
1364*635a8641SAndroid Build Coastguard Worker   FilePath directory_contents = subdir_path;
1365*635a8641SAndroid Build Coastguard Worker   directory_contents = directory_contents.Append(FPL("*"));
1366*635a8641SAndroid Build Coastguard Worker 
1367*635a8641SAndroid Build Coastguard Worker   // Delete non-recursively and check nothing got deleted
1368*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(directory_contents, false));
1369*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(subdir_path));
1370*635a8641SAndroid Build Coastguard Worker 
1371*635a8641SAndroid Build Coastguard Worker   // Delete recursively and check nothing got deleted
1372*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(directory_contents, true));
1373*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(subdir_path));
1374*635a8641SAndroid Build Coastguard Worker }
1375*635a8641SAndroid Build Coastguard Worker #endif
1376*635a8641SAndroid Build Coastguard Worker 
1377*635a8641SAndroid Build Coastguard Worker // Tests non-recursive Delete() for a directory.
TEST_F(FileUtilTest,DeleteDirNonRecursive)1378*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteDirNonRecursive) {
1379*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory and put a file and two directories inside.
1380*635a8641SAndroid Build Coastguard Worker   FilePath test_subdir =
1381*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FPL("DeleteDirNonRecursive"));
1382*635a8641SAndroid Build Coastguard Worker   CreateDirectory(test_subdir);
1383*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(test_subdir));
1384*635a8641SAndroid Build Coastguard Worker 
1385*635a8641SAndroid Build Coastguard Worker   FilePath file_name = test_subdir.Append(FPL("Test DeleteDir.txt"));
1386*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name, bogus_content);
1387*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name));
1388*635a8641SAndroid Build Coastguard Worker 
1389*635a8641SAndroid Build Coastguard Worker   FilePath subdir_path1 = test_subdir.Append(FPL("TestSubDir1"));
1390*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_path1);
1391*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_path1));
1392*635a8641SAndroid Build Coastguard Worker 
1393*635a8641SAndroid Build Coastguard Worker   FilePath subdir_path2 = test_subdir.Append(FPL("TestSubDir2"));
1394*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_path2);
1395*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_path2));
1396*635a8641SAndroid Build Coastguard Worker 
1397*635a8641SAndroid Build Coastguard Worker   // Delete non-recursively and check that the empty dir got deleted
1398*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(subdir_path2, false));
1399*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(subdir_path2));
1400*635a8641SAndroid Build Coastguard Worker 
1401*635a8641SAndroid Build Coastguard Worker   // Delete non-recursively and check that nothing got deleted
1402*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(DeleteFile(test_subdir, false));
1403*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(test_subdir));
1404*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name));
1405*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(subdir_path1));
1406*635a8641SAndroid Build Coastguard Worker }
1407*635a8641SAndroid Build Coastguard Worker 
1408*635a8641SAndroid Build Coastguard Worker // Tests recursive Delete() for a directory.
TEST_F(FileUtilTest,DeleteDirRecursive)1409*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteDirRecursive) {
1410*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory and put a file and two directories inside.
1411*635a8641SAndroid Build Coastguard Worker   FilePath test_subdir = temp_dir_.GetPath().Append(FPL("DeleteDirRecursive"));
1412*635a8641SAndroid Build Coastguard Worker   CreateDirectory(test_subdir);
1413*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(test_subdir));
1414*635a8641SAndroid Build Coastguard Worker 
1415*635a8641SAndroid Build Coastguard Worker   FilePath file_name = test_subdir.Append(FPL("Test DeleteDirRecursive.txt"));
1416*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name, bogus_content);
1417*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name));
1418*635a8641SAndroid Build Coastguard Worker 
1419*635a8641SAndroid Build Coastguard Worker   FilePath subdir_path1 = test_subdir.Append(FPL("TestSubDir1"));
1420*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_path1);
1421*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_path1));
1422*635a8641SAndroid Build Coastguard Worker 
1423*635a8641SAndroid Build Coastguard Worker   FilePath subdir_path2 = test_subdir.Append(FPL("TestSubDir2"));
1424*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_path2);
1425*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_path2));
1426*635a8641SAndroid Build Coastguard Worker 
1427*635a8641SAndroid Build Coastguard Worker   // Delete recursively and check that the empty dir got deleted
1428*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(subdir_path2, true));
1429*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(subdir_path2));
1430*635a8641SAndroid Build Coastguard Worker 
1431*635a8641SAndroid Build Coastguard Worker   // Delete recursively and check that everything got deleted
1432*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(test_subdir, true));
1433*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name));
1434*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(subdir_path1));
1435*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(test_subdir));
1436*635a8641SAndroid Build Coastguard Worker }
1437*635a8641SAndroid Build Coastguard Worker 
1438*635a8641SAndroid Build Coastguard Worker // Tests recursive Delete() for a directory.
TEST_F(FileUtilTest,DeleteDirRecursiveWithOpenFile)1439*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DeleteDirRecursiveWithOpenFile) {
1440*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory and put a file and two directories inside.
1441*635a8641SAndroid Build Coastguard Worker   FilePath test_subdir = temp_dir_.GetPath().Append(FPL("DeleteWithOpenFile"));
1442*635a8641SAndroid Build Coastguard Worker   CreateDirectory(test_subdir);
1443*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(test_subdir));
1444*635a8641SAndroid Build Coastguard Worker 
1445*635a8641SAndroid Build Coastguard Worker   FilePath file_name1 = test_subdir.Append(FPL("Undeletebable File1.txt"));
1446*635a8641SAndroid Build Coastguard Worker   File file1(file_name1,
1447*635a8641SAndroid Build Coastguard Worker              File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE);
1448*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name1));
1449*635a8641SAndroid Build Coastguard Worker 
1450*635a8641SAndroid Build Coastguard Worker   FilePath file_name2 = test_subdir.Append(FPL("Deleteable File2.txt"));
1451*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name2, bogus_content);
1452*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name2));
1453*635a8641SAndroid Build Coastguard Worker 
1454*635a8641SAndroid Build Coastguard Worker   FilePath file_name3 = test_subdir.Append(FPL("Undeletebable File3.txt"));
1455*635a8641SAndroid Build Coastguard Worker   File file3(file_name3,
1456*635a8641SAndroid Build Coastguard Worker              File::FLAG_CREATE | File::FLAG_READ | File::FLAG_WRITE);
1457*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name3));
1458*635a8641SAndroid Build Coastguard Worker 
1459*635a8641SAndroid Build Coastguard Worker #if defined(OS_LINUX)
1460*635a8641SAndroid Build Coastguard Worker   // On Windows, holding the file open in sufficient to make it un-deletable.
1461*635a8641SAndroid Build Coastguard Worker   // The POSIX code is verifiable on Linux by creating an "immutable" file but
1462*635a8641SAndroid Build Coastguard Worker   // this is best-effort because it's not supported by all file systems. Both
1463*635a8641SAndroid Build Coastguard Worker   // files will have the same flags so no need to get them individually.
1464*635a8641SAndroid Build Coastguard Worker   int flags;
1465*635a8641SAndroid Build Coastguard Worker   bool file_attrs_supported =
1466*635a8641SAndroid Build Coastguard Worker       ioctl(file1.GetPlatformFile(), FS_IOC_GETFLAGS, &flags) == 0;
1467*635a8641SAndroid Build Coastguard Worker   // Some filesystems (e.g. tmpfs) don't support file attributes.
1468*635a8641SAndroid Build Coastguard Worker   if (file_attrs_supported) {
1469*635a8641SAndroid Build Coastguard Worker     flags |= FS_IMMUTABLE_FL;
1470*635a8641SAndroid Build Coastguard Worker     ioctl(file1.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
1471*635a8641SAndroid Build Coastguard Worker     ioctl(file3.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
1472*635a8641SAndroid Build Coastguard Worker   }
1473*635a8641SAndroid Build Coastguard Worker #endif
1474*635a8641SAndroid Build Coastguard Worker 
1475*635a8641SAndroid Build Coastguard Worker   // Delete recursively and check that at least the second file got deleted.
1476*635a8641SAndroid Build Coastguard Worker   // This ensures that un-deletable files don't impact those that can be.
1477*635a8641SAndroid Build Coastguard Worker   DeleteFile(test_subdir, true);
1478*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name2));
1479*635a8641SAndroid Build Coastguard Worker 
1480*635a8641SAndroid Build Coastguard Worker #if defined(OS_LINUX)
1481*635a8641SAndroid Build Coastguard Worker   // Make sure that the test can clean up after itself.
1482*635a8641SAndroid Build Coastguard Worker   if (file_attrs_supported) {
1483*635a8641SAndroid Build Coastguard Worker     flags &= ~FS_IMMUTABLE_FL;
1484*635a8641SAndroid Build Coastguard Worker     ioctl(file1.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
1485*635a8641SAndroid Build Coastguard Worker     ioctl(file3.GetPlatformFile(), FS_IOC_SETFLAGS, &flags);
1486*635a8641SAndroid Build Coastguard Worker   }
1487*635a8641SAndroid Build Coastguard Worker #endif
1488*635a8641SAndroid Build Coastguard Worker }
1489*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,MoveFileNew)1490*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MoveFileNew) {
1491*635a8641SAndroid Build Coastguard Worker   // Create a file
1492*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1493*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
1494*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1495*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1496*635a8641SAndroid Build Coastguard Worker 
1497*635a8641SAndroid Build Coastguard Worker   // The destination.
1498*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to = temp_dir_.GetPath().Append(
1499*635a8641SAndroid Build Coastguard Worker       FILE_PATH_LITERAL("Move_Test_File_Destination.txt"));
1500*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(file_name_to));
1501*635a8641SAndroid Build Coastguard Worker 
1502*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(Move(file_name_from, file_name_to));
1503*635a8641SAndroid Build Coastguard Worker 
1504*635a8641SAndroid Build Coastguard Worker   // Check everything has been moved.
1505*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name_from));
1506*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1507*635a8641SAndroid Build Coastguard Worker }
1508*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,MoveFileExists)1509*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MoveFileExists) {
1510*635a8641SAndroid Build Coastguard Worker   // Create a file
1511*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1512*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
1513*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1514*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1515*635a8641SAndroid Build Coastguard Worker 
1516*635a8641SAndroid Build Coastguard Worker   // The destination name.
1517*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to = temp_dir_.GetPath().Append(
1518*635a8641SAndroid Build Coastguard Worker       FILE_PATH_LITERAL("Move_Test_File_Destination.txt"));
1519*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_to, L"Old file content");
1520*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_to));
1521*635a8641SAndroid Build Coastguard Worker 
1522*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(Move(file_name_from, file_name_to));
1523*635a8641SAndroid Build Coastguard Worker 
1524*635a8641SAndroid Build Coastguard Worker   // Check everything has been moved.
1525*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name_from));
1526*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1527*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(L"Gooooooooooooooooooooogle" == ReadTextFile(file_name_to));
1528*635a8641SAndroid Build Coastguard Worker }
1529*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,MoveFileDirExists)1530*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MoveFileDirExists) {
1531*635a8641SAndroid Build Coastguard Worker   // Create a file
1532*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1533*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
1534*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1535*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1536*635a8641SAndroid Build Coastguard Worker 
1537*635a8641SAndroid Build Coastguard Worker   // The destination directory
1538*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1539*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
1540*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_to);
1541*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
1542*635a8641SAndroid Build Coastguard Worker 
1543*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(Move(file_name_from, dir_name_to));
1544*635a8641SAndroid Build Coastguard Worker }
1545*635a8641SAndroid Build Coastguard Worker 
1546*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,MoveNew)1547*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MoveNew) {
1548*635a8641SAndroid Build Coastguard Worker   // Create a directory
1549*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1550*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_From_Subdir"));
1551*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
1552*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1553*635a8641SAndroid Build Coastguard Worker 
1554*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory
1555*635a8641SAndroid Build Coastguard Worker   FilePath txt_file_name(FILE_PATH_LITERAL("Move_Test_File.txt"));
1556*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from = dir_name_from.Append(txt_file_name);
1557*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1558*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1559*635a8641SAndroid Build Coastguard Worker 
1560*635a8641SAndroid Build Coastguard Worker   // Move the directory.
1561*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1562*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_To_Subdir"));
1563*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
1564*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
1565*635a8641SAndroid Build Coastguard Worker 
1566*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(dir_name_to));
1567*635a8641SAndroid Build Coastguard Worker 
1568*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(Move(dir_name_from, dir_name_to));
1569*635a8641SAndroid Build Coastguard Worker 
1570*635a8641SAndroid Build Coastguard Worker   // Check everything has been moved.
1571*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(dir_name_from));
1572*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name_from));
1573*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_to));
1574*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1575*635a8641SAndroid Build Coastguard Worker 
1576*635a8641SAndroid Build Coastguard Worker   // Test path traversal.
1577*635a8641SAndroid Build Coastguard Worker   file_name_from = dir_name_to.Append(txt_file_name);
1578*635a8641SAndroid Build Coastguard Worker   file_name_to = dir_name_to.Append(FILE_PATH_LITERAL(".."));
1579*635a8641SAndroid Build Coastguard Worker   file_name_to = file_name_to.Append(txt_file_name);
1580*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(Move(file_name_from, file_name_to));
1581*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_from));
1582*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name_to));
1583*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(internal::MoveUnsafe(file_name_from, file_name_to));
1584*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name_from));
1585*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1586*635a8641SAndroid Build Coastguard Worker }
1587*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,MoveExist)1588*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MoveExist) {
1589*635a8641SAndroid Build Coastguard Worker   // Create a directory
1590*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1591*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Move_From_Subdir"));
1592*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
1593*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1594*635a8641SAndroid Build Coastguard Worker 
1595*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory
1596*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1597*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
1598*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1599*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1600*635a8641SAndroid Build Coastguard Worker 
1601*635a8641SAndroid Build Coastguard Worker   // Move the directory
1602*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_exists =
1603*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
1604*635a8641SAndroid Build Coastguard Worker 
1605*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1606*635a8641SAndroid Build Coastguard Worker       dir_name_exists.Append(FILE_PATH_LITERAL("Move_To_Subdir"));
1607*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
1608*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
1609*635a8641SAndroid Build Coastguard Worker 
1610*635a8641SAndroid Build Coastguard Worker   // Create the destination directory.
1611*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_exists);
1612*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_exists));
1613*635a8641SAndroid Build Coastguard Worker 
1614*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(Move(dir_name_from, dir_name_to));
1615*635a8641SAndroid Build Coastguard Worker 
1616*635a8641SAndroid Build Coastguard Worker   // Check everything has been moved.
1617*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(dir_name_from));
1618*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name_from));
1619*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_to));
1620*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1621*635a8641SAndroid Build Coastguard Worker }
1622*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryRecursivelyNew)1623*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryRecursivelyNew) {
1624*635a8641SAndroid Build Coastguard Worker   // Create a directory.
1625*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1626*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1627*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
1628*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1629*635a8641SAndroid Build Coastguard Worker 
1630*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
1631*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1632*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1633*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1634*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1635*635a8641SAndroid Build Coastguard Worker 
1636*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory.
1637*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_from =
1638*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
1639*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_name_from);
1640*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_name_from));
1641*635a8641SAndroid Build Coastguard Worker 
1642*635a8641SAndroid Build Coastguard Worker   // Create a file under the subdirectory.
1643*635a8641SAndroid Build Coastguard Worker   FilePath file_name2_from =
1644*635a8641SAndroid Build Coastguard Worker       subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1645*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
1646*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name2_from));
1647*635a8641SAndroid Build Coastguard Worker 
1648*635a8641SAndroid Build Coastguard Worker   // Copy the directory recursively.
1649*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1650*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1651*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
1652*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1653*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_to =
1654*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
1655*635a8641SAndroid Build Coastguard Worker   FilePath file_name2_to =
1656*635a8641SAndroid Build Coastguard Worker       subdir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1657*635a8641SAndroid Build Coastguard Worker 
1658*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(dir_name_to));
1659*635a8641SAndroid Build Coastguard Worker 
1660*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, true));
1661*635a8641SAndroid Build Coastguard Worker 
1662*635a8641SAndroid Build Coastguard Worker   // Check everything has been copied.
1663*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_from));
1664*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_from));
1665*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(subdir_name_from));
1666*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name2_from));
1667*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_to));
1668*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1669*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(subdir_name_to));
1670*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name2_to));
1671*635a8641SAndroid Build Coastguard Worker }
1672*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryRecursivelyExists)1673*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryRecursivelyExists) {
1674*635a8641SAndroid Build Coastguard Worker   // Create a directory.
1675*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1676*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1677*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
1678*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1679*635a8641SAndroid Build Coastguard Worker 
1680*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
1681*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1682*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1683*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1684*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1685*635a8641SAndroid Build Coastguard Worker 
1686*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory.
1687*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_from =
1688*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
1689*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_name_from);
1690*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_name_from));
1691*635a8641SAndroid Build Coastguard Worker 
1692*635a8641SAndroid Build Coastguard Worker   // Create a file under the subdirectory.
1693*635a8641SAndroid Build Coastguard Worker   FilePath file_name2_from =
1694*635a8641SAndroid Build Coastguard Worker       subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1695*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
1696*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name2_from));
1697*635a8641SAndroid Build Coastguard Worker 
1698*635a8641SAndroid Build Coastguard Worker   // Copy the directory recursively.
1699*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_exists =
1700*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
1701*635a8641SAndroid Build Coastguard Worker 
1702*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1703*635a8641SAndroid Build Coastguard Worker       dir_name_exists.Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1704*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
1705*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1706*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_to =
1707*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
1708*635a8641SAndroid Build Coastguard Worker   FilePath file_name2_to =
1709*635a8641SAndroid Build Coastguard Worker       subdir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1710*635a8641SAndroid Build Coastguard Worker 
1711*635a8641SAndroid Build Coastguard Worker   // Create the destination directory.
1712*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_exists);
1713*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_exists));
1714*635a8641SAndroid Build Coastguard Worker 
1715*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_exists, true));
1716*635a8641SAndroid Build Coastguard Worker 
1717*635a8641SAndroid Build Coastguard Worker   // Check everything has been copied.
1718*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_from));
1719*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_from));
1720*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(subdir_name_from));
1721*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name2_from));
1722*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_to));
1723*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1724*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(subdir_name_to));
1725*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name2_to));
1726*635a8641SAndroid Build Coastguard Worker }
1727*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryNew)1728*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryNew) {
1729*635a8641SAndroid Build Coastguard Worker   // Create a directory.
1730*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1731*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1732*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
1733*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1734*635a8641SAndroid Build Coastguard Worker 
1735*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
1736*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1737*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1738*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1739*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1740*635a8641SAndroid Build Coastguard Worker 
1741*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory.
1742*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_from =
1743*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
1744*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_name_from);
1745*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_name_from));
1746*635a8641SAndroid Build Coastguard Worker 
1747*635a8641SAndroid Build Coastguard Worker   // Create a file under the subdirectory.
1748*635a8641SAndroid Build Coastguard Worker   FilePath file_name2_from =
1749*635a8641SAndroid Build Coastguard Worker       subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1750*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
1751*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name2_from));
1752*635a8641SAndroid Build Coastguard Worker 
1753*635a8641SAndroid Build Coastguard Worker   // Copy the directory not recursively.
1754*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1755*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1756*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
1757*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1758*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_to =
1759*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
1760*635a8641SAndroid Build Coastguard Worker 
1761*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(dir_name_to));
1762*635a8641SAndroid Build Coastguard Worker 
1763*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
1764*635a8641SAndroid Build Coastguard Worker 
1765*635a8641SAndroid Build Coastguard Worker   // Check everything has been copied.
1766*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_from));
1767*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_from));
1768*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(subdir_name_from));
1769*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name2_from));
1770*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_to));
1771*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1772*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(subdir_name_to));
1773*635a8641SAndroid Build Coastguard Worker }
1774*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryExists)1775*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExists) {
1776*635a8641SAndroid Build Coastguard Worker   // Create a directory.
1777*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1778*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1779*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
1780*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1781*635a8641SAndroid Build Coastguard Worker 
1782*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
1783*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1784*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1785*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1786*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1787*635a8641SAndroid Build Coastguard Worker 
1788*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory.
1789*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_from =
1790*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
1791*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_name_from);
1792*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_name_from));
1793*635a8641SAndroid Build Coastguard Worker 
1794*635a8641SAndroid Build Coastguard Worker   // Create a file under the subdirectory.
1795*635a8641SAndroid Build Coastguard Worker   FilePath file_name2_from =
1796*635a8641SAndroid Build Coastguard Worker       subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1797*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
1798*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name2_from));
1799*635a8641SAndroid Build Coastguard Worker 
1800*635a8641SAndroid Build Coastguard Worker   // Copy the directory not recursively.
1801*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1802*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1803*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
1804*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1805*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_to =
1806*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
1807*635a8641SAndroid Build Coastguard Worker 
1808*635a8641SAndroid Build Coastguard Worker   // Create the destination directory.
1809*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_to);
1810*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
1811*635a8641SAndroid Build Coastguard Worker 
1812*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
1813*635a8641SAndroid Build Coastguard Worker 
1814*635a8641SAndroid Build Coastguard Worker   // Check everything has been copied.
1815*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_from));
1816*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_from));
1817*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(subdir_name_from));
1818*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name2_from));
1819*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_to));
1820*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1821*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(subdir_name_to));
1822*635a8641SAndroid Build Coastguard Worker }
1823*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyFileWithCopyDirectoryRecursiveToNew)1824*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToNew) {
1825*635a8641SAndroid Build Coastguard Worker   // Create a file
1826*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1827*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1828*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1829*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1830*635a8641SAndroid Build Coastguard Worker 
1831*635a8641SAndroid Build Coastguard Worker   // The destination name
1832*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to = temp_dir_.GetPath().Append(
1833*635a8641SAndroid Build Coastguard Worker       FILE_PATH_LITERAL("Copy_Test_File_Destination.txt"));
1834*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(file_name_to));
1835*635a8641SAndroid Build Coastguard Worker 
1836*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(file_name_from, file_name_to, true));
1837*635a8641SAndroid Build Coastguard Worker 
1838*635a8641SAndroid Build Coastguard Worker   // Check the has been copied
1839*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1840*635a8641SAndroid Build Coastguard Worker }
1841*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyFileWithCopyDirectoryRecursiveToExisting)1842*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToExisting) {
1843*635a8641SAndroid Build Coastguard Worker   // Create a file
1844*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1845*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1846*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1847*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1848*635a8641SAndroid Build Coastguard Worker 
1849*635a8641SAndroid Build Coastguard Worker   // The destination name
1850*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to = temp_dir_.GetPath().Append(
1851*635a8641SAndroid Build Coastguard Worker       FILE_PATH_LITERAL("Copy_Test_File_Destination.txt"));
1852*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_to, L"Old file content");
1853*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_to));
1854*635a8641SAndroid Build Coastguard Worker 
1855*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(file_name_from, file_name_to, true));
1856*635a8641SAndroid Build Coastguard Worker 
1857*635a8641SAndroid Build Coastguard Worker   // Check the has been copied
1858*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1859*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(L"Gooooooooooooooooooooogle" == ReadTextFile(file_name_to));
1860*635a8641SAndroid Build Coastguard Worker }
1861*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyFileWithCopyDirectoryRecursiveToExistingDirectory)1862*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToExistingDirectory) {
1863*635a8641SAndroid Build Coastguard Worker   // Create a file
1864*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1865*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1866*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1867*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1868*635a8641SAndroid Build Coastguard Worker 
1869*635a8641SAndroid Build Coastguard Worker   // The destination
1870*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1871*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Destination"));
1872*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_to);
1873*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
1874*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
1875*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1876*635a8641SAndroid Build Coastguard Worker 
1877*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(file_name_from, dir_name_to, true));
1878*635a8641SAndroid Build Coastguard Worker 
1879*635a8641SAndroid Build Coastguard Worker   // Check the has been copied
1880*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1881*635a8641SAndroid Build Coastguard Worker }
1882*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyFileFailureWithCopyDirectoryExcl)1883*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFileFailureWithCopyDirectoryExcl) {
1884*635a8641SAndroid Build Coastguard Worker   // Create a file
1885*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1886*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1887*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1888*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1889*635a8641SAndroid Build Coastguard Worker 
1890*635a8641SAndroid Build Coastguard Worker   // Make a destination file.
1891*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to = temp_dir_.GetPath().Append(
1892*635a8641SAndroid Build Coastguard Worker       FILE_PATH_LITERAL("Copy_Test_File_Destination.txt"));
1893*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_to, L"Old file content");
1894*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_to));
1895*635a8641SAndroid Build Coastguard Worker 
1896*635a8641SAndroid Build Coastguard Worker   // Overwriting the destination should fail.
1897*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(CopyDirectoryExcl(file_name_from, file_name_to, true));
1898*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(L"Old file content", ReadTextFile(file_name_to));
1899*635a8641SAndroid Build Coastguard Worker }
1900*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryWithTrailingSeparators)1901*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryWithTrailingSeparators) {
1902*635a8641SAndroid Build Coastguard Worker   // Create a directory.
1903*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1904*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1905*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
1906*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1907*635a8641SAndroid Build Coastguard Worker 
1908*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
1909*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1910*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1911*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1912*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1913*635a8641SAndroid Build Coastguard Worker 
1914*635a8641SAndroid Build Coastguard Worker   // Copy the directory recursively.
1915*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1916*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1917*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
1918*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1919*635a8641SAndroid Build Coastguard Worker 
1920*635a8641SAndroid Build Coastguard Worker   // Create from path with trailing separators.
1921*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
1922*635a8641SAndroid Build Coastguard Worker   FilePath from_path =
1923*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir\\\\\\"));
1924*635a8641SAndroid Build Coastguard Worker #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
1925*635a8641SAndroid Build Coastguard Worker   FilePath from_path =
1926*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir///"));
1927*635a8641SAndroid Build Coastguard Worker #endif
1928*635a8641SAndroid Build Coastguard Worker 
1929*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(from_path, dir_name_to, true));
1930*635a8641SAndroid Build Coastguard Worker 
1931*635a8641SAndroid Build Coastguard Worker   // Check everything has been copied.
1932*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_from));
1933*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_from));
1934*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_to));
1935*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1936*635a8641SAndroid Build Coastguard Worker }
1937*635a8641SAndroid Build Coastguard Worker 
1938*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX)
TEST_F(FileUtilTest,CopyDirectoryWithNonRegularFiles)1939*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryWithNonRegularFiles) {
1940*635a8641SAndroid Build Coastguard Worker   // Create a directory.
1941*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1942*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1943*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_from));
1944*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1945*635a8641SAndroid Build Coastguard Worker 
1946*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
1947*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1948*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1949*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1950*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
1951*635a8641SAndroid Build Coastguard Worker 
1952*635a8641SAndroid Build Coastguard Worker   // Create a symbolic link under the directory pointing to that file.
1953*635a8641SAndroid Build Coastguard Worker   FilePath symlink_name_from =
1954*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Symlink"));
1955*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(file_name_from, symlink_name_from));
1956*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(symlink_name_from));
1957*635a8641SAndroid Build Coastguard Worker 
1958*635a8641SAndroid Build Coastguard Worker   // Create a fifo under the directory.
1959*635a8641SAndroid Build Coastguard Worker   FilePath fifo_name_from =
1960*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Fifo"));
1961*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(0, mkfifo(fifo_name_from.value().c_str(), 0644));
1962*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(fifo_name_from));
1963*635a8641SAndroid Build Coastguard Worker 
1964*635a8641SAndroid Build Coastguard Worker   // Copy the directory.
1965*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
1966*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1967*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
1968*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1969*635a8641SAndroid Build Coastguard Worker   FilePath symlink_name_to =
1970*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Symlink"));
1971*635a8641SAndroid Build Coastguard Worker   FilePath fifo_name_to =
1972*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Fifo"));
1973*635a8641SAndroid Build Coastguard Worker 
1974*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(dir_name_to));
1975*635a8641SAndroid Build Coastguard Worker 
1976*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CopyDirectory(dir_name_from, dir_name_to, false));
1977*635a8641SAndroid Build Coastguard Worker 
1978*635a8641SAndroid Build Coastguard Worker   // Check that only directories and regular files are copied.
1979*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_from));
1980*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_from));
1981*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(symlink_name_from));
1982*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(fifo_name_from));
1983*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_to));
1984*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
1985*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(symlink_name_to));
1986*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(fifo_name_to));
1987*635a8641SAndroid Build Coastguard Worker }
1988*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryExclFileOverSymlink)1989*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclFileOverSymlink) {
1990*635a8641SAndroid Build Coastguard Worker   // Create a directory.
1991*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
1992*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1993*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_from));
1994*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
1995*635a8641SAndroid Build Coastguard Worker 
1996*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
1997*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
1998*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1999*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2000*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
2001*635a8641SAndroid Build Coastguard Worker 
2002*635a8641SAndroid Build Coastguard Worker   // Create a destination directory with a symlink of the same name.
2003*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
2004*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2005*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_to));
2006*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
2007*635a8641SAndroid Build Coastguard Worker 
2008*635a8641SAndroid Build Coastguard Worker   FilePath symlink_target =
2009*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Symlink_Target.txt"));
2010*635a8641SAndroid Build Coastguard Worker   CreateTextFile(symlink_target, L"asdf");
2011*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(symlink_target));
2012*635a8641SAndroid Build Coastguard Worker 
2013*635a8641SAndroid Build Coastguard Worker   FilePath symlink_name_to =
2014*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2015*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
2016*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(symlink_name_to));
2017*635a8641SAndroid Build Coastguard Worker 
2018*635a8641SAndroid Build Coastguard Worker   // Check that copying fails.
2019*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
2020*635a8641SAndroid Build Coastguard Worker }
2021*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryExclDirectoryOverSymlink)2022*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverSymlink) {
2023*635a8641SAndroid Build Coastguard Worker   // Create a directory.
2024*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
2025*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2026*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_from));
2027*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
2028*635a8641SAndroid Build Coastguard Worker 
2029*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory.
2030*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
2031*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_name_from);
2032*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_name_from));
2033*635a8641SAndroid Build Coastguard Worker 
2034*635a8641SAndroid Build Coastguard Worker   // Create a destination directory with a symlink of the same name.
2035*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
2036*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2037*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_to));
2038*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
2039*635a8641SAndroid Build Coastguard Worker 
2040*635a8641SAndroid Build Coastguard Worker   FilePath symlink_target = dir_name_to.Append(FILE_PATH_LITERAL("Subsub"));
2041*635a8641SAndroid Build Coastguard Worker   CreateTextFile(symlink_target, L"asdf");
2042*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(symlink_target));
2043*635a8641SAndroid Build Coastguard Worker 
2044*635a8641SAndroid Build Coastguard Worker   FilePath symlink_name_to =
2045*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2046*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
2047*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(symlink_name_to));
2048*635a8641SAndroid Build Coastguard Worker 
2049*635a8641SAndroid Build Coastguard Worker   // Check that copying fails.
2050*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
2051*635a8641SAndroid Build Coastguard Worker }
2052*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryExclFileOverDanglingSymlink)2053*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclFileOverDanglingSymlink) {
2054*635a8641SAndroid Build Coastguard Worker   // Create a directory.
2055*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
2056*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2057*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_from));
2058*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
2059*635a8641SAndroid Build Coastguard Worker 
2060*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
2061*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
2062*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2063*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2064*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
2065*635a8641SAndroid Build Coastguard Worker 
2066*635a8641SAndroid Build Coastguard Worker   // Create a destination directory with a dangling symlink of the same name.
2067*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
2068*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2069*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_to));
2070*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
2071*635a8641SAndroid Build Coastguard Worker 
2072*635a8641SAndroid Build Coastguard Worker   FilePath symlink_target =
2073*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Symlink_Target.txt"));
2074*635a8641SAndroid Build Coastguard Worker   CreateTextFile(symlink_target, L"asdf");
2075*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(symlink_target));
2076*635a8641SAndroid Build Coastguard Worker 
2077*635a8641SAndroid Build Coastguard Worker   FilePath symlink_name_to =
2078*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2079*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
2080*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(symlink_name_to));
2081*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(DeleteFile(symlink_target, false));
2082*635a8641SAndroid Build Coastguard Worker 
2083*635a8641SAndroid Build Coastguard Worker   // Check that copying fails and that no file was created for the symlink's
2084*635a8641SAndroid Build Coastguard Worker   // referent.
2085*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
2086*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(symlink_target));
2087*635a8641SAndroid Build Coastguard Worker }
2088*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryExclDirectoryOverDanglingSymlink)2089*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclDirectoryOverDanglingSymlink) {
2090*635a8641SAndroid Build Coastguard Worker   // Create a directory.
2091*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
2092*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2093*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_from));
2094*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
2095*635a8641SAndroid Build Coastguard Worker 
2096*635a8641SAndroid Build Coastguard Worker   // Create a subdirectory.
2097*635a8641SAndroid Build Coastguard Worker   FilePath subdir_name_from = dir_name_from.Append(FILE_PATH_LITERAL("Subsub"));
2098*635a8641SAndroid Build Coastguard Worker   CreateDirectory(subdir_name_from);
2099*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(subdir_name_from));
2100*635a8641SAndroid Build Coastguard Worker 
2101*635a8641SAndroid Build Coastguard Worker   // Create a destination directory with a dangling symlink of the same name.
2102*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
2103*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2104*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_to));
2105*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
2106*635a8641SAndroid Build Coastguard Worker 
2107*635a8641SAndroid Build Coastguard Worker   FilePath symlink_target =
2108*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Symlink_Target.txt"));
2109*635a8641SAndroid Build Coastguard Worker   CreateTextFile(symlink_target, L"asdf");
2110*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(symlink_target));
2111*635a8641SAndroid Build Coastguard Worker 
2112*635a8641SAndroid Build Coastguard Worker   FilePath symlink_name_to =
2113*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2114*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(symlink_target, symlink_name_to));
2115*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(symlink_name_to));
2116*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(DeleteFile(symlink_target, false));
2117*635a8641SAndroid Build Coastguard Worker 
2118*635a8641SAndroid Build Coastguard Worker   // Check that copying fails and that no directory was created for the
2119*635a8641SAndroid Build Coastguard Worker   // symlink's referent.
2120*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
2121*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(symlink_target));
2122*635a8641SAndroid Build Coastguard Worker }
2123*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyDirectoryExclFileOverFifo)2124*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyDirectoryExclFileOverFifo) {
2125*635a8641SAndroid Build Coastguard Worker   // Create a directory.
2126*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
2127*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2128*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_from));
2129*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
2130*635a8641SAndroid Build Coastguard Worker 
2131*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory.
2132*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
2133*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2134*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2135*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
2136*635a8641SAndroid Build Coastguard Worker 
2137*635a8641SAndroid Build Coastguard Worker   // Create a destination directory with a fifo of the same name.
2138*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
2139*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
2140*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_to));
2141*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_to));
2142*635a8641SAndroid Build Coastguard Worker 
2143*635a8641SAndroid Build Coastguard Worker   FilePath fifo_name_to =
2144*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2145*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(0, mkfifo(fifo_name_to.value().c_str(), 0644));
2146*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(fifo_name_to));
2147*635a8641SAndroid Build Coastguard Worker 
2148*635a8641SAndroid Build Coastguard Worker   // Check that copying fails.
2149*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(CopyDirectoryExcl(dir_name_from, dir_name_to, false));
2150*635a8641SAndroid Build Coastguard Worker }
2151*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_POSIX)
2152*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CopyFile)2153*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyFile) {
2154*635a8641SAndroid Build Coastguard Worker   // Create a directory
2155*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from =
2156*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
2157*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dir_name_from));
2158*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(DirectoryExists(dir_name_from));
2159*635a8641SAndroid Build Coastguard Worker 
2160*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory
2161*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
2162*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
2163*635a8641SAndroid Build Coastguard Worker   const std::wstring file_contents(L"Gooooooooooooooooooooogle");
2164*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, file_contents);
2165*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
2166*635a8641SAndroid Build Coastguard Worker 
2167*635a8641SAndroid Build Coastguard Worker   // Copy the file.
2168*635a8641SAndroid Build Coastguard Worker   FilePath dest_file = dir_name_from.Append(FILE_PATH_LITERAL("DestFile.txt"));
2169*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyFile(file_name_from, dest_file));
2170*635a8641SAndroid Build Coastguard Worker 
2171*635a8641SAndroid Build Coastguard Worker   // Try to copy the file to another location using '..' in the path.
2172*635a8641SAndroid Build Coastguard Worker   FilePath dest_file2(dir_name_from);
2173*635a8641SAndroid Build Coastguard Worker   dest_file2 = dest_file2.AppendASCII("..");
2174*635a8641SAndroid Build Coastguard Worker   dest_file2 = dest_file2.AppendASCII("DestFile.txt");
2175*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(CopyFile(file_name_from, dest_file2));
2176*635a8641SAndroid Build Coastguard Worker 
2177*635a8641SAndroid Build Coastguard Worker   FilePath dest_file2_test(dir_name_from);
2178*635a8641SAndroid Build Coastguard Worker   dest_file2_test = dest_file2_test.DirName();
2179*635a8641SAndroid Build Coastguard Worker   dest_file2_test = dest_file2_test.AppendASCII("DestFile.txt");
2180*635a8641SAndroid Build Coastguard Worker 
2181*635a8641SAndroid Build Coastguard Worker   // Check expected copy results.
2182*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_from));
2183*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dest_file));
2184*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(file_contents, ReadTextFile(dest_file));
2185*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(dest_file2_test));
2186*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(dest_file2));
2187*635a8641SAndroid Build Coastguard Worker 
2188*635a8641SAndroid Build Coastguard Worker   // Change |file_name_from| contents.
2189*635a8641SAndroid Build Coastguard Worker   const std::wstring new_file_contents(L"Moogle");
2190*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, new_file_contents);
2191*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
2192*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(new_file_contents, ReadTextFile(file_name_from));
2193*635a8641SAndroid Build Coastguard Worker 
2194*635a8641SAndroid Build Coastguard Worker   // Overwrite |dest_file|.
2195*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CopyFile(file_name_from, dest_file));
2196*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dest_file));
2197*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(new_file_contents, ReadTextFile(dest_file));
2198*635a8641SAndroid Build Coastguard Worker 
2199*635a8641SAndroid Build Coastguard Worker   // Create another directory.
2200*635a8641SAndroid Build Coastguard Worker   FilePath dest_dir = temp_dir_.GetPath().Append(FPL("dest_dir"));
2201*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(dest_dir));
2202*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DirectoryExists(dest_dir));
2203*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(IsDirectoryEmpty(dest_dir));
2204*635a8641SAndroid Build Coastguard Worker 
2205*635a8641SAndroid Build Coastguard Worker   // Make sure CopyFile() cannot overwrite a directory.
2206*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(CopyFile(file_name_from, dest_dir));
2207*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DirectoryExists(dest_dir));
2208*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(IsDirectoryEmpty(dest_dir));
2209*635a8641SAndroid Build Coastguard Worker }
2210*635a8641SAndroid Build Coastguard Worker 
2211*635a8641SAndroid Build Coastguard Worker // file_util winds up using autoreleased objects on the Mac, so this needs
2212*635a8641SAndroid Build Coastguard Worker // to be a PlatformTest.
2213*635a8641SAndroid Build Coastguard Worker typedef PlatformTest ReadOnlyFileUtilTest;
2214*635a8641SAndroid Build Coastguard Worker 
TEST_F(ReadOnlyFileUtilTest,ContentsEqual)2215*635a8641SAndroid Build Coastguard Worker TEST_F(ReadOnlyFileUtilTest, ContentsEqual) {
2216*635a8641SAndroid Build Coastguard Worker   FilePath data_dir;
2217*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
2218*635a8641SAndroid Build Coastguard Worker   data_dir = data_dir.AppendASCII("file_util");
2219*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(data_dir));
2220*635a8641SAndroid Build Coastguard Worker 
2221*635a8641SAndroid Build Coastguard Worker   FilePath original_file =
2222*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("original.txt"));
2223*635a8641SAndroid Build Coastguard Worker   FilePath same_file =
2224*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("same.txt"));
2225*635a8641SAndroid Build Coastguard Worker   FilePath same_length_file =
2226*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("same_length.txt"));
2227*635a8641SAndroid Build Coastguard Worker   FilePath different_file =
2228*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("different.txt"));
2229*635a8641SAndroid Build Coastguard Worker   FilePath different_first_file =
2230*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("different_first.txt"));
2231*635a8641SAndroid Build Coastguard Worker   FilePath different_last_file =
2232*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("different_last.txt"));
2233*635a8641SAndroid Build Coastguard Worker   FilePath empty1_file =
2234*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("empty1.txt"));
2235*635a8641SAndroid Build Coastguard Worker   FilePath empty2_file =
2236*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("empty2.txt"));
2237*635a8641SAndroid Build Coastguard Worker   FilePath shortened_file =
2238*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("shortened.txt"));
2239*635a8641SAndroid Build Coastguard Worker   FilePath binary_file =
2240*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("binary_file.bin"));
2241*635a8641SAndroid Build Coastguard Worker   FilePath binary_file_same =
2242*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("binary_file_same.bin"));
2243*635a8641SAndroid Build Coastguard Worker   FilePath binary_file_diff =
2244*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("binary_file_diff.bin"));
2245*635a8641SAndroid Build Coastguard Worker 
2246*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ContentsEqual(original_file, original_file));
2247*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ContentsEqual(original_file, same_file));
2248*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ContentsEqual(original_file, same_length_file));
2249*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ContentsEqual(original_file, different_file));
2250*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ContentsEqual(FilePath(FILE_PATH_LITERAL("bogusname")),
2251*635a8641SAndroid Build Coastguard Worker                              FilePath(FILE_PATH_LITERAL("bogusname"))));
2252*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ContentsEqual(original_file, different_first_file));
2253*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ContentsEqual(original_file, different_last_file));
2254*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ContentsEqual(empty1_file, empty2_file));
2255*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ContentsEqual(original_file, shortened_file));
2256*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ContentsEqual(shortened_file, original_file));
2257*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ContentsEqual(binary_file, binary_file_same));
2258*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ContentsEqual(binary_file, binary_file_diff));
2259*635a8641SAndroid Build Coastguard Worker }
2260*635a8641SAndroid Build Coastguard Worker 
TEST_F(ReadOnlyFileUtilTest,TextContentsEqual)2261*635a8641SAndroid Build Coastguard Worker TEST_F(ReadOnlyFileUtilTest, TextContentsEqual) {
2262*635a8641SAndroid Build Coastguard Worker   FilePath data_dir;
2263*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
2264*635a8641SAndroid Build Coastguard Worker   data_dir = data_dir.AppendASCII("file_util");
2265*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(data_dir));
2266*635a8641SAndroid Build Coastguard Worker 
2267*635a8641SAndroid Build Coastguard Worker   FilePath original_file =
2268*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("original.txt"));
2269*635a8641SAndroid Build Coastguard Worker   FilePath same_file =
2270*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("same.txt"));
2271*635a8641SAndroid Build Coastguard Worker   FilePath crlf_file =
2272*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("crlf.txt"));
2273*635a8641SAndroid Build Coastguard Worker   FilePath shortened_file =
2274*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("shortened.txt"));
2275*635a8641SAndroid Build Coastguard Worker   FilePath different_file =
2276*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("different.txt"));
2277*635a8641SAndroid Build Coastguard Worker   FilePath different_first_file =
2278*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("different_first.txt"));
2279*635a8641SAndroid Build Coastguard Worker   FilePath different_last_file =
2280*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("different_last.txt"));
2281*635a8641SAndroid Build Coastguard Worker   FilePath first1_file =
2282*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("first1.txt"));
2283*635a8641SAndroid Build Coastguard Worker   FilePath first2_file =
2284*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("first2.txt"));
2285*635a8641SAndroid Build Coastguard Worker   FilePath empty1_file =
2286*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("empty1.txt"));
2287*635a8641SAndroid Build Coastguard Worker   FilePath empty2_file =
2288*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("empty2.txt"));
2289*635a8641SAndroid Build Coastguard Worker   FilePath blank_line_file =
2290*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("blank_line.txt"));
2291*635a8641SAndroid Build Coastguard Worker   FilePath blank_line_crlf_file =
2292*635a8641SAndroid Build Coastguard Worker       data_dir.Append(FILE_PATH_LITERAL("blank_line_crlf.txt"));
2293*635a8641SAndroid Build Coastguard Worker 
2294*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(TextContentsEqual(original_file, same_file));
2295*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(TextContentsEqual(original_file, crlf_file));
2296*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(TextContentsEqual(original_file, shortened_file));
2297*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(TextContentsEqual(original_file, different_file));
2298*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(TextContentsEqual(original_file, different_first_file));
2299*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(TextContentsEqual(original_file, different_last_file));
2300*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(TextContentsEqual(first1_file, first2_file));
2301*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(TextContentsEqual(empty1_file, empty2_file));
2302*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(TextContentsEqual(original_file, empty1_file));
2303*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(TextContentsEqual(blank_line_file, blank_line_crlf_file));
2304*635a8641SAndroid Build Coastguard Worker }
2305*635a8641SAndroid Build Coastguard Worker 
2306*635a8641SAndroid Build Coastguard Worker // We don't need equivalent functionality outside of Windows.
2307*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
TEST_F(FileUtilTest,CopyAndDeleteDirectoryTest)2308*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CopyAndDeleteDirectoryTest) {
2309*635a8641SAndroid Build Coastguard Worker   // Create a directory
2310*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_from = temp_dir_.GetPath().Append(
2311*635a8641SAndroid Build Coastguard Worker       FILE_PATH_LITERAL("CopyAndDelete_From_Subdir"));
2312*635a8641SAndroid Build Coastguard Worker   CreateDirectory(dir_name_from);
2313*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(dir_name_from));
2314*635a8641SAndroid Build Coastguard Worker 
2315*635a8641SAndroid Build Coastguard Worker   // Create a file under the directory
2316*635a8641SAndroid Build Coastguard Worker   FilePath file_name_from =
2317*635a8641SAndroid Build Coastguard Worker       dir_name_from.Append(FILE_PATH_LITERAL("CopyAndDelete_Test_File.txt"));
2318*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
2319*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_name_from));
2320*635a8641SAndroid Build Coastguard Worker 
2321*635a8641SAndroid Build Coastguard Worker   // Move the directory by using CopyAndDeleteDirectory
2322*635a8641SAndroid Build Coastguard Worker   FilePath dir_name_to =
2323*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("CopyAndDelete_To_Subdir"));
2324*635a8641SAndroid Build Coastguard Worker   FilePath file_name_to =
2325*635a8641SAndroid Build Coastguard Worker       dir_name_to.Append(FILE_PATH_LITERAL("CopyAndDelete_Test_File.txt"));
2326*635a8641SAndroid Build Coastguard Worker 
2327*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(dir_name_to));
2328*635a8641SAndroid Build Coastguard Worker 
2329*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(internal::CopyAndDeleteDirectory(dir_name_from,
2330*635a8641SAndroid Build Coastguard Worker                                                      dir_name_to));
2331*635a8641SAndroid Build Coastguard Worker 
2332*635a8641SAndroid Build Coastguard Worker   // Check everything has been moved.
2333*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(dir_name_from));
2334*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(file_name_from));
2335*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(dir_name_to));
2336*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(file_name_to));
2337*635a8641SAndroid Build Coastguard Worker }
2338*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,GetTempDirTest)2339*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetTempDirTest) {
2340*635a8641SAndroid Build Coastguard Worker   static const TCHAR* kTmpKey = _T("TMP");
2341*635a8641SAndroid Build Coastguard Worker   static const TCHAR* kTmpValues[] = {
2342*635a8641SAndroid Build Coastguard Worker     _T(""), _T("C:"), _T("C:\\"), _T("C:\\tmp"), _T("C:\\tmp\\")
2343*635a8641SAndroid Build Coastguard Worker   };
2344*635a8641SAndroid Build Coastguard Worker   // Save the original $TMP.
2345*635a8641SAndroid Build Coastguard Worker   size_t original_tmp_size;
2346*635a8641SAndroid Build Coastguard Worker   TCHAR* original_tmp;
2347*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(0, ::_tdupenv_s(&original_tmp, &original_tmp_size, kTmpKey));
2348*635a8641SAndroid Build Coastguard Worker   // original_tmp may be NULL.
2349*635a8641SAndroid Build Coastguard Worker 
2350*635a8641SAndroid Build Coastguard Worker   for (unsigned int i = 0; i < arraysize(kTmpValues); ++i) {
2351*635a8641SAndroid Build Coastguard Worker     FilePath path;
2352*635a8641SAndroid Build Coastguard Worker     ::_tputenv_s(kTmpKey, kTmpValues[i]);
2353*635a8641SAndroid Build Coastguard Worker     GetTempDir(&path);
2354*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(path.IsAbsolute()) << "$TMP=" << kTmpValues[i] <<
2355*635a8641SAndroid Build Coastguard Worker         " result=" << path.value();
2356*635a8641SAndroid Build Coastguard Worker   }
2357*635a8641SAndroid Build Coastguard Worker 
2358*635a8641SAndroid Build Coastguard Worker   // Restore the original $TMP.
2359*635a8641SAndroid Build Coastguard Worker   if (original_tmp) {
2360*635a8641SAndroid Build Coastguard Worker     ::_tputenv_s(kTmpKey, original_tmp);
2361*635a8641SAndroid Build Coastguard Worker     free(original_tmp);
2362*635a8641SAndroid Build Coastguard Worker   } else {
2363*635a8641SAndroid Build Coastguard Worker     ::_tputenv_s(kTmpKey, _T(""));
2364*635a8641SAndroid Build Coastguard Worker   }
2365*635a8641SAndroid Build Coastguard Worker }
2366*635a8641SAndroid Build Coastguard Worker #endif  // OS_WIN
2367*635a8641SAndroid Build Coastguard Worker 
2368*635a8641SAndroid Build Coastguard Worker // Test that files opened by OpenFile are not set up for inheritance into child
2369*635a8641SAndroid Build Coastguard Worker // procs.
TEST_F(FileUtilTest,OpenFileNoInheritance)2370*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, OpenFileNoInheritance) {
2371*635a8641SAndroid Build Coastguard Worker   FilePath file_path(temp_dir_.GetPath().Append(FPL("a_file")));
2372*635a8641SAndroid Build Coastguard Worker 
2373*635a8641SAndroid Build Coastguard Worker   for (const char* mode : {"wb", "r,ccs=UTF-8"}) {
2374*635a8641SAndroid Build Coastguard Worker     SCOPED_TRACE(mode);
2375*635a8641SAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(CreateTextFile(file_path, L"Geepers"));
2376*635a8641SAndroid Build Coastguard Worker     FILE* file = OpenFile(file_path, mode);
2377*635a8641SAndroid Build Coastguard Worker     ASSERT_NE(nullptr, file);
2378*635a8641SAndroid Build Coastguard Worker     {
2379*635a8641SAndroid Build Coastguard Worker       ScopedClosureRunner file_closer(Bind(IgnoreResult(&CloseFile), file));
2380*635a8641SAndroid Build Coastguard Worker       bool is_inheritable = true;
2381*635a8641SAndroid Build Coastguard Worker       ASSERT_NO_FATAL_FAILURE(GetIsInheritable(file, &is_inheritable));
2382*635a8641SAndroid Build Coastguard Worker       EXPECT_FALSE(is_inheritable);
2383*635a8641SAndroid Build Coastguard Worker     }
2384*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(DeleteFile(file_path, false));
2385*635a8641SAndroid Build Coastguard Worker   }
2386*635a8641SAndroid Build Coastguard Worker }
2387*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CreateTemporaryFileTest)2388*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateTemporaryFileTest) {
2389*635a8641SAndroid Build Coastguard Worker   FilePath temp_files[3];
2390*635a8641SAndroid Build Coastguard Worker   for (int i = 0; i < 3; i++) {
2391*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(CreateTemporaryFile(&(temp_files[i])));
2392*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(PathExists(temp_files[i]));
2393*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(DirectoryExists(temp_files[i]));
2394*635a8641SAndroid Build Coastguard Worker   }
2395*635a8641SAndroid Build Coastguard Worker   for (int i = 0; i < 3; i++)
2396*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(temp_files[i] == temp_files[(i+1)%3]);
2397*635a8641SAndroid Build Coastguard Worker   for (int i = 0; i < 3; i++)
2398*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(DeleteFile(temp_files[i], false));
2399*635a8641SAndroid Build Coastguard Worker }
2400*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CreateAndOpenTemporaryFileTest)2401*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateAndOpenTemporaryFileTest) {
2402*635a8641SAndroid Build Coastguard Worker   FilePath names[3];
2403*635a8641SAndroid Build Coastguard Worker   FILE* fps[3];
2404*635a8641SAndroid Build Coastguard Worker   int i;
2405*635a8641SAndroid Build Coastguard Worker 
2406*635a8641SAndroid Build Coastguard Worker   // Create; make sure they are open and exist.
2407*635a8641SAndroid Build Coastguard Worker   for (i = 0; i < 3; ++i) {
2408*635a8641SAndroid Build Coastguard Worker     fps[i] = CreateAndOpenTemporaryFile(&(names[i]));
2409*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(fps[i]);
2410*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(PathExists(names[i]));
2411*635a8641SAndroid Build Coastguard Worker   }
2412*635a8641SAndroid Build Coastguard Worker 
2413*635a8641SAndroid Build Coastguard Worker   // Make sure all names are unique.
2414*635a8641SAndroid Build Coastguard Worker   for (i = 0; i < 3; ++i) {
2415*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(names[i] == names[(i+1)%3]);
2416*635a8641SAndroid Build Coastguard Worker   }
2417*635a8641SAndroid Build Coastguard Worker 
2418*635a8641SAndroid Build Coastguard Worker   // Close and delete.
2419*635a8641SAndroid Build Coastguard Worker   for (i = 0; i < 3; ++i) {
2420*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(CloseFile(fps[i]));
2421*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(DeleteFile(names[i], false));
2422*635a8641SAndroid Build Coastguard Worker   }
2423*635a8641SAndroid Build Coastguard Worker }
2424*635a8641SAndroid Build Coastguard Worker 
2425*635a8641SAndroid Build Coastguard Worker #if defined(OS_FUCHSIA)
2426*635a8641SAndroid Build Coastguard Worker // TODO(crbug.com/851747): Re-enable when the Fuchsia-side fix for fdopen has
2427*635a8641SAndroid Build Coastguard Worker // been rolled into Chromium.
2428*635a8641SAndroid Build Coastguard Worker #define MAYBE_FileToFILE DISABLED_FileToFILE
2429*635a8641SAndroid Build Coastguard Worker #else
2430*635a8641SAndroid Build Coastguard Worker #define MAYBE_FileToFILE FileToFILE
2431*635a8641SAndroid Build Coastguard Worker #endif
TEST_F(FileUtilTest,MAYBE_FileToFILE)2432*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, MAYBE_FileToFILE) {
2433*635a8641SAndroid Build Coastguard Worker   File file;
2434*635a8641SAndroid Build Coastguard Worker   FILE* stream = FileToFILE(std::move(file), "w");
2435*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(stream);
2436*635a8641SAndroid Build Coastguard Worker 
2437*635a8641SAndroid Build Coastguard Worker   FilePath file_name = temp_dir_.GetPath().Append(FPL("The file.txt"));
2438*635a8641SAndroid Build Coastguard Worker   file = File(file_name, File::FLAG_CREATE | File::FLAG_WRITE);
2439*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(file.IsValid());
2440*635a8641SAndroid Build Coastguard Worker 
2441*635a8641SAndroid Build Coastguard Worker   stream = FileToFILE(std::move(file), "w");
2442*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(stream);
2443*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(file.IsValid());
2444*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CloseFile(stream));
2445*635a8641SAndroid Build Coastguard Worker }
2446*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CreateNewTempDirectoryTest)2447*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateNewTempDirectoryTest) {
2448*635a8641SAndroid Build Coastguard Worker   FilePath temp_dir;
2449*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateNewTempDirectory(FilePath::StringType(), &temp_dir));
2450*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(temp_dir));
2451*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(temp_dir, false));
2452*635a8641SAndroid Build Coastguard Worker }
2453*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CreateNewTemporaryDirInDirTest)2454*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateNewTemporaryDirInDirTest) {
2455*635a8641SAndroid Build Coastguard Worker   FilePath new_dir;
2456*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateTemporaryDirInDir(
2457*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath(), FILE_PATH_LITERAL("CreateNewTemporaryDirInDirTest"),
2458*635a8641SAndroid Build Coastguard Worker       &new_dir));
2459*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(new_dir));
2460*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(temp_dir_.GetPath().IsParent(new_dir));
2461*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(new_dir, false));
2462*635a8641SAndroid Build Coastguard Worker }
2463*635a8641SAndroid Build Coastguard Worker 
2464*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX) || defined(OS_FUCHSIA)
TEST_F(FileUtilTest,GetShmemTempDirTest)2465*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetShmemTempDirTest) {
2466*635a8641SAndroid Build Coastguard Worker   FilePath dir;
2467*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(GetShmemTempDir(false, &dir));
2468*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DirectoryExists(dir));
2469*635a8641SAndroid Build Coastguard Worker }
2470*635a8641SAndroid Build Coastguard Worker #endif
2471*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,GetHomeDirTest)2472*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, GetHomeDirTest) {
2473*635a8641SAndroid Build Coastguard Worker #if !defined(OS_ANDROID)  // Not implemented on Android.
2474*635a8641SAndroid Build Coastguard Worker   // We don't actually know what the home directory is supposed to be without
2475*635a8641SAndroid Build Coastguard Worker   // calling some OS functions which would just duplicate the implementation.
2476*635a8641SAndroid Build Coastguard Worker   // So here we just test that it returns something "reasonable".
2477*635a8641SAndroid Build Coastguard Worker   FilePath home = GetHomeDir();
2478*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(home.empty());
2479*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(home.IsAbsolute());
2480*635a8641SAndroid Build Coastguard Worker #endif
2481*635a8641SAndroid Build Coastguard Worker }
2482*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,CreateDirectoryTest)2483*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, CreateDirectoryTest) {
2484*635a8641SAndroid Build Coastguard Worker   FilePath test_root =
2485*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("create_directory_test"));
2486*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
2487*635a8641SAndroid Build Coastguard Worker   FilePath test_path =
2488*635a8641SAndroid Build Coastguard Worker       test_root.Append(FILE_PATH_LITERAL("dir\\tree\\likely\\doesnt\\exist\\"));
2489*635a8641SAndroid Build Coastguard Worker #elif defined(OS_POSIX) || defined(OS_FUCHSIA)
2490*635a8641SAndroid Build Coastguard Worker   FilePath test_path =
2491*635a8641SAndroid Build Coastguard Worker       test_root.Append(FILE_PATH_LITERAL("dir/tree/likely/doesnt/exist/"));
2492*635a8641SAndroid Build Coastguard Worker #endif
2493*635a8641SAndroid Build Coastguard Worker 
2494*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(test_path));
2495*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CreateDirectory(test_path));
2496*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(test_path));
2497*635a8641SAndroid Build Coastguard Worker   // CreateDirectory returns true if the DirectoryExists returns true.
2498*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CreateDirectory(test_path));
2499*635a8641SAndroid Build Coastguard Worker 
2500*635a8641SAndroid Build Coastguard Worker   // Doesn't work to create it on top of a non-dir
2501*635a8641SAndroid Build Coastguard Worker   test_path = test_path.Append(FILE_PATH_LITERAL("foobar.txt"));
2502*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(test_path));
2503*635a8641SAndroid Build Coastguard Worker   CreateTextFile(test_path, L"test file");
2504*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(test_path));
2505*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(CreateDirectory(test_path));
2506*635a8641SAndroid Build Coastguard Worker 
2507*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(test_root, true));
2508*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(test_root));
2509*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(test_path));
2510*635a8641SAndroid Build Coastguard Worker 
2511*635a8641SAndroid Build Coastguard Worker   // Verify assumptions made by the Windows implementation:
2512*635a8641SAndroid Build Coastguard Worker   // 1. The current directory always exists.
2513*635a8641SAndroid Build Coastguard Worker   // 2. The root directory always exists.
2514*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(DirectoryExists(FilePath(FilePath::kCurrentDirectory)));
2515*635a8641SAndroid Build Coastguard Worker   FilePath top_level = test_root;
2516*635a8641SAndroid Build Coastguard Worker   while (top_level != top_level.DirName()) {
2517*635a8641SAndroid Build Coastguard Worker     top_level = top_level.DirName();
2518*635a8641SAndroid Build Coastguard Worker   }
2519*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(DirectoryExists(top_level));
2520*635a8641SAndroid Build Coastguard Worker 
2521*635a8641SAndroid Build Coastguard Worker   // Given these assumptions hold, it should be safe to
2522*635a8641SAndroid Build Coastguard Worker   // test that "creating" these directories succeeds.
2523*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CreateDirectory(
2524*635a8641SAndroid Build Coastguard Worker       FilePath(FilePath::kCurrentDirectory)));
2525*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CreateDirectory(top_level));
2526*635a8641SAndroid Build Coastguard Worker 
2527*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
2528*635a8641SAndroid Build Coastguard Worker   FilePath invalid_drive(FILE_PATH_LITERAL("o:\\"));
2529*635a8641SAndroid Build Coastguard Worker   FilePath invalid_path =
2530*635a8641SAndroid Build Coastguard Worker       invalid_drive.Append(FILE_PATH_LITERAL("some\\inaccessible\\dir"));
2531*635a8641SAndroid Build Coastguard Worker   if (!PathExists(invalid_drive)) {
2532*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(CreateDirectory(invalid_path));
2533*635a8641SAndroid Build Coastguard Worker   }
2534*635a8641SAndroid Build Coastguard Worker #endif
2535*635a8641SAndroid Build Coastguard Worker }
2536*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,DetectDirectoryTest)2537*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, DetectDirectoryTest) {
2538*635a8641SAndroid Build Coastguard Worker   // Check a directory
2539*635a8641SAndroid Build Coastguard Worker   FilePath test_root =
2540*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("detect_directory_test"));
2541*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(test_root));
2542*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CreateDirectory(test_root));
2543*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(test_root));
2544*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DirectoryExists(test_root));
2545*635a8641SAndroid Build Coastguard Worker   // Check a file
2546*635a8641SAndroid Build Coastguard Worker   FilePath test_path =
2547*635a8641SAndroid Build Coastguard Worker       test_root.Append(FILE_PATH_LITERAL("foobar.txt"));
2548*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(test_path));
2549*635a8641SAndroid Build Coastguard Worker   CreateTextFile(test_path, L"test file");
2550*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(test_path));
2551*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(DirectoryExists(test_path));
2552*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(test_path, false));
2553*635a8641SAndroid Build Coastguard Worker 
2554*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(test_root, true));
2555*635a8641SAndroid Build Coastguard Worker }
2556*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,FileEnumeratorTest)2557*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, FileEnumeratorTest) {
2558*635a8641SAndroid Build Coastguard Worker   // Test an empty directory.
2559*635a8641SAndroid Build Coastguard Worker   FileEnumerator f0(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
2560*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FPL(""), f0.Next().value());
2561*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FPL(""), f0.Next().value());
2562*635a8641SAndroid Build Coastguard Worker 
2563*635a8641SAndroid Build Coastguard Worker   // Test an empty directory, non-recursively, including "..".
2564*635a8641SAndroid Build Coastguard Worker   FileEnumerator f0_dotdot(
2565*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath(), false,
2566*635a8641SAndroid Build Coastguard Worker       FILES_AND_DIRECTORIES | FileEnumerator::INCLUDE_DOT_DOT);
2567*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(temp_dir_.GetPath().Append(FPL("..")).value(),
2568*635a8641SAndroid Build Coastguard Worker             f0_dotdot.Next().value());
2569*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(FPL(""), f0_dotdot.Next().value());
2570*635a8641SAndroid Build Coastguard Worker 
2571*635a8641SAndroid Build Coastguard Worker   // create the directories
2572*635a8641SAndroid Build Coastguard Worker   FilePath dir1 = temp_dir_.GetPath().Append(FPL("dir1"));
2573*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CreateDirectory(dir1));
2574*635a8641SAndroid Build Coastguard Worker   FilePath dir2 = temp_dir_.GetPath().Append(FPL("dir2"));
2575*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CreateDirectory(dir2));
2576*635a8641SAndroid Build Coastguard Worker   FilePath dir2inner = dir2.Append(FPL("inner"));
2577*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(CreateDirectory(dir2inner));
2578*635a8641SAndroid Build Coastguard Worker 
2579*635a8641SAndroid Build Coastguard Worker   // create the files
2580*635a8641SAndroid Build Coastguard Worker   FilePath dir2file = dir2.Append(FPL("dir2file.txt"));
2581*635a8641SAndroid Build Coastguard Worker   CreateTextFile(dir2file, std::wstring());
2582*635a8641SAndroid Build Coastguard Worker   FilePath dir2innerfile = dir2inner.Append(FPL("innerfile.txt"));
2583*635a8641SAndroid Build Coastguard Worker   CreateTextFile(dir2innerfile, std::wstring());
2584*635a8641SAndroid Build Coastguard Worker   FilePath file1 = temp_dir_.GetPath().Append(FPL("file1.txt"));
2585*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file1, std::wstring());
2586*635a8641SAndroid Build Coastguard Worker   FilePath file2_rel = dir2.Append(FilePath::kParentDirectory)
2587*635a8641SAndroid Build Coastguard Worker       .Append(FPL("file2.txt"));
2588*635a8641SAndroid Build Coastguard Worker   CreateTextFile(file2_rel, std::wstring());
2589*635a8641SAndroid Build Coastguard Worker   FilePath file2_abs = temp_dir_.GetPath().Append(FPL("file2.txt"));
2590*635a8641SAndroid Build Coastguard Worker 
2591*635a8641SAndroid Build Coastguard Worker   // Only enumerate files.
2592*635a8641SAndroid Build Coastguard Worker   FileEnumerator f1(temp_dir_.GetPath(), true, FileEnumerator::FILES);
2593*635a8641SAndroid Build Coastguard Worker   FindResultCollector c1(&f1);
2594*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.HasFile(file1));
2595*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.HasFile(file2_abs));
2596*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.HasFile(dir2file));
2597*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c1.HasFile(dir2innerfile));
2598*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(4, c1.size());
2599*635a8641SAndroid Build Coastguard Worker 
2600*635a8641SAndroid Build Coastguard Worker   // Only enumerate directories.
2601*635a8641SAndroid Build Coastguard Worker   FileEnumerator f2(temp_dir_.GetPath(), true, FileEnumerator::DIRECTORIES);
2602*635a8641SAndroid Build Coastguard Worker   FindResultCollector c2(&f2);
2603*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c2.HasFile(dir1));
2604*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c2.HasFile(dir2));
2605*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c2.HasFile(dir2inner));
2606*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, c2.size());
2607*635a8641SAndroid Build Coastguard Worker 
2608*635a8641SAndroid Build Coastguard Worker   // Only enumerate directories non-recursively.
2609*635a8641SAndroid Build Coastguard Worker   FileEnumerator f2_non_recursive(temp_dir_.GetPath(), false,
2610*635a8641SAndroid Build Coastguard Worker                                   FileEnumerator::DIRECTORIES);
2611*635a8641SAndroid Build Coastguard Worker   FindResultCollector c2_non_recursive(&f2_non_recursive);
2612*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c2_non_recursive.HasFile(dir1));
2613*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c2_non_recursive.HasFile(dir2));
2614*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2, c2_non_recursive.size());
2615*635a8641SAndroid Build Coastguard Worker 
2616*635a8641SAndroid Build Coastguard Worker   // Only enumerate directories, non-recursively, including "..".
2617*635a8641SAndroid Build Coastguard Worker   FileEnumerator f2_dotdot(
2618*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath(), false,
2619*635a8641SAndroid Build Coastguard Worker       FileEnumerator::DIRECTORIES | FileEnumerator::INCLUDE_DOT_DOT);
2620*635a8641SAndroid Build Coastguard Worker   FindResultCollector c2_dotdot(&f2_dotdot);
2621*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c2_dotdot.HasFile(dir1));
2622*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c2_dotdot.HasFile(dir2));
2623*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c2_dotdot.HasFile(temp_dir_.GetPath().Append(FPL(".."))));
2624*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(3, c2_dotdot.size());
2625*635a8641SAndroid Build Coastguard Worker 
2626*635a8641SAndroid Build Coastguard Worker   // Enumerate files and directories.
2627*635a8641SAndroid Build Coastguard Worker   FileEnumerator f3(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
2628*635a8641SAndroid Build Coastguard Worker   FindResultCollector c3(&f3);
2629*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c3.HasFile(dir1));
2630*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c3.HasFile(dir2));
2631*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c3.HasFile(file1));
2632*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c3.HasFile(file2_abs));
2633*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c3.HasFile(dir2file));
2634*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c3.HasFile(dir2inner));
2635*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c3.HasFile(dir2innerfile));
2636*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(7, c3.size());
2637*635a8641SAndroid Build Coastguard Worker 
2638*635a8641SAndroid Build Coastguard Worker   // Non-recursive operation.
2639*635a8641SAndroid Build Coastguard Worker   FileEnumerator f4(temp_dir_.GetPath(), false, FILES_AND_DIRECTORIES);
2640*635a8641SAndroid Build Coastguard Worker   FindResultCollector c4(&f4);
2641*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c4.HasFile(dir2));
2642*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c4.HasFile(dir2));
2643*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c4.HasFile(file1));
2644*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c4.HasFile(file2_abs));
2645*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(4, c4.size());
2646*635a8641SAndroid Build Coastguard Worker 
2647*635a8641SAndroid Build Coastguard Worker   // Enumerate with a pattern.
2648*635a8641SAndroid Build Coastguard Worker   FileEnumerator f5(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES,
2649*635a8641SAndroid Build Coastguard Worker                     FPL("dir*"));
2650*635a8641SAndroid Build Coastguard Worker   FindResultCollector c5(&f5);
2651*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c5.HasFile(dir1));
2652*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c5.HasFile(dir2));
2653*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c5.HasFile(dir2file));
2654*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c5.HasFile(dir2inner));
2655*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(c5.HasFile(dir2innerfile));
2656*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(5, c5.size());
2657*635a8641SAndroid Build Coastguard Worker 
2658*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
2659*635a8641SAndroid Build Coastguard Worker   {
2660*635a8641SAndroid Build Coastguard Worker     // Make dir1 point to dir2.
2661*635a8641SAndroid Build Coastguard Worker     ReparsePoint reparse_point(dir1, dir2);
2662*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(reparse_point.IsValid());
2663*635a8641SAndroid Build Coastguard Worker 
2664*635a8641SAndroid Build Coastguard Worker     // There can be a delay for the enumeration code to see the change on
2665*635a8641SAndroid Build Coastguard Worker     // the file system so skip this test for XP.
2666*635a8641SAndroid Build Coastguard Worker     // Enumerate the reparse point.
2667*635a8641SAndroid Build Coastguard Worker     FileEnumerator f6(dir1, true, FILES_AND_DIRECTORIES);
2668*635a8641SAndroid Build Coastguard Worker     FindResultCollector c6(&f6);
2669*635a8641SAndroid Build Coastguard Worker     FilePath inner2 = dir1.Append(FPL("inner"));
2670*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c6.HasFile(inner2));
2671*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c6.HasFile(inner2.Append(FPL("innerfile.txt"))));
2672*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c6.HasFile(dir1.Append(FPL("dir2file.txt"))));
2673*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(3, c6.size());
2674*635a8641SAndroid Build Coastguard Worker 
2675*635a8641SAndroid Build Coastguard Worker     // No changes for non recursive operation.
2676*635a8641SAndroid Build Coastguard Worker     FileEnumerator f7(temp_dir_.GetPath(), false, FILES_AND_DIRECTORIES);
2677*635a8641SAndroid Build Coastguard Worker     FindResultCollector c7(&f7);
2678*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c7.HasFile(dir2));
2679*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c7.HasFile(dir2));
2680*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c7.HasFile(file1));
2681*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c7.HasFile(file2_abs));
2682*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(4, c7.size());
2683*635a8641SAndroid Build Coastguard Worker 
2684*635a8641SAndroid Build Coastguard Worker     // Should not enumerate inside dir1 when using recursion.
2685*635a8641SAndroid Build Coastguard Worker     FileEnumerator f8(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
2686*635a8641SAndroid Build Coastguard Worker     FindResultCollector c8(&f8);
2687*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c8.HasFile(dir1));
2688*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c8.HasFile(dir2));
2689*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c8.HasFile(file1));
2690*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c8.HasFile(file2_abs));
2691*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c8.HasFile(dir2file));
2692*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c8.HasFile(dir2inner));
2693*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(c8.HasFile(dir2innerfile));
2694*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(7, c8.size());
2695*635a8641SAndroid Build Coastguard Worker   }
2696*635a8641SAndroid Build Coastguard Worker #endif
2697*635a8641SAndroid Build Coastguard Worker 
2698*635a8641SAndroid Build Coastguard Worker   // Make sure the destructor closes the find handle while in the middle of a
2699*635a8641SAndroid Build Coastguard Worker   // query to allow TearDown to delete the directory.
2700*635a8641SAndroid Build Coastguard Worker   FileEnumerator f9(temp_dir_.GetPath(), true, FILES_AND_DIRECTORIES);
2701*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(f9.Next().value().empty());  // Should have found something
2702*635a8641SAndroid Build Coastguard Worker                                             // (we don't care what).
2703*635a8641SAndroid Build Coastguard Worker }
2704*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,AppendToFile)2705*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, AppendToFile) {
2706*635a8641SAndroid Build Coastguard Worker   FilePath data_dir =
2707*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("FilePathTest"));
2708*635a8641SAndroid Build Coastguard Worker 
2709*635a8641SAndroid Build Coastguard Worker   // Create a fresh, empty copy of this directory.
2710*635a8641SAndroid Build Coastguard Worker   if (PathExists(data_dir)) {
2711*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(DeleteFile(data_dir, true));
2712*635a8641SAndroid Build Coastguard Worker   }
2713*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(data_dir));
2714*635a8641SAndroid Build Coastguard Worker 
2715*635a8641SAndroid Build Coastguard Worker   // Create a fresh, empty copy of this directory.
2716*635a8641SAndroid Build Coastguard Worker   if (PathExists(data_dir)) {
2717*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(DeleteFile(data_dir, true));
2718*635a8641SAndroid Build Coastguard Worker   }
2719*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(data_dir));
2720*635a8641SAndroid Build Coastguard Worker   FilePath foobar(data_dir.Append(FILE_PATH_LITERAL("foobar.txt")));
2721*635a8641SAndroid Build Coastguard Worker 
2722*635a8641SAndroid Build Coastguard Worker   std::string data("hello");
2723*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(AppendToFile(foobar, data.c_str(), data.size()));
2724*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(data.length()),
2725*635a8641SAndroid Build Coastguard Worker             WriteFile(foobar, data.c_str(), data.length()));
2726*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(AppendToFile(foobar, data.c_str(), data.size()));
2727*635a8641SAndroid Build Coastguard Worker 
2728*635a8641SAndroid Build Coastguard Worker   const std::wstring read_content = ReadTextFile(foobar);
2729*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(L"hellohello", read_content);
2730*635a8641SAndroid Build Coastguard Worker }
2731*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,ReadFile)2732*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFile) {
2733*635a8641SAndroid Build Coastguard Worker   // Create a test file to be read.
2734*635a8641SAndroid Build Coastguard Worker   const std::string kTestData("The quick brown fox jumps over the lazy dog.");
2735*635a8641SAndroid Build Coastguard Worker   FilePath file_path =
2736*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileTest"));
2737*635a8641SAndroid Build Coastguard Worker 
2738*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<int>(kTestData.size()),
2739*635a8641SAndroid Build Coastguard Worker             WriteFile(file_path, kTestData.data(), kTestData.size()));
2740*635a8641SAndroid Build Coastguard Worker 
2741*635a8641SAndroid Build Coastguard Worker   // Make buffers with various size.
2742*635a8641SAndroid Build Coastguard Worker   std::vector<char> small_buffer(kTestData.size() / 2);
2743*635a8641SAndroid Build Coastguard Worker   std::vector<char> exact_buffer(kTestData.size());
2744*635a8641SAndroid Build Coastguard Worker   std::vector<char> large_buffer(kTestData.size() * 2);
2745*635a8641SAndroid Build Coastguard Worker 
2746*635a8641SAndroid Build Coastguard Worker   // Read the file with smaller buffer.
2747*635a8641SAndroid Build Coastguard Worker   int bytes_read_small = ReadFile(
2748*635a8641SAndroid Build Coastguard Worker       file_path, &small_buffer[0], static_cast<int>(small_buffer.size()));
2749*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(small_buffer.size()), bytes_read_small);
2750*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(
2751*635a8641SAndroid Build Coastguard Worker       std::string(kTestData.begin(), kTestData.begin() + small_buffer.size()),
2752*635a8641SAndroid Build Coastguard Worker       std::string(small_buffer.begin(), small_buffer.end()));
2753*635a8641SAndroid Build Coastguard Worker 
2754*635a8641SAndroid Build Coastguard Worker   // Read the file with buffer which have exactly same size.
2755*635a8641SAndroid Build Coastguard Worker   int bytes_read_exact = ReadFile(
2756*635a8641SAndroid Build Coastguard Worker       file_path, &exact_buffer[0], static_cast<int>(exact_buffer.size()));
2757*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kTestData.size()), bytes_read_exact);
2758*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(kTestData, std::string(exact_buffer.begin(), exact_buffer.end()));
2759*635a8641SAndroid Build Coastguard Worker 
2760*635a8641SAndroid Build Coastguard Worker   // Read the file with larger buffer.
2761*635a8641SAndroid Build Coastguard Worker   int bytes_read_large = ReadFile(
2762*635a8641SAndroid Build Coastguard Worker       file_path, &large_buffer[0], static_cast<int>(large_buffer.size()));
2763*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kTestData.size()), bytes_read_large);
2764*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(kTestData, std::string(large_buffer.begin(),
2765*635a8641SAndroid Build Coastguard Worker                                    large_buffer.begin() + kTestData.size()));
2766*635a8641SAndroid Build Coastguard Worker 
2767*635a8641SAndroid Build Coastguard Worker   // Make sure the return value is -1 if the file doesn't exist.
2768*635a8641SAndroid Build Coastguard Worker   FilePath file_path_not_exist =
2769*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileNotExistTest"));
2770*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-1,
2771*635a8641SAndroid Build Coastguard Worker             ReadFile(file_path_not_exist,
2772*635a8641SAndroid Build Coastguard Worker                      &exact_buffer[0],
2773*635a8641SAndroid Build Coastguard Worker                      static_cast<int>(exact_buffer.size())));
2774*635a8641SAndroid Build Coastguard Worker }
2775*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,ReadFileToString)2776*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToString) {
2777*635a8641SAndroid Build Coastguard Worker   const char kTestData[] = "0123";
2778*635a8641SAndroid Build Coastguard Worker   std::string data;
2779*635a8641SAndroid Build Coastguard Worker 
2780*635a8641SAndroid Build Coastguard Worker   FilePath file_path =
2781*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
2782*635a8641SAndroid Build Coastguard Worker   FilePath file_path_dangerous =
2783*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath()
2784*635a8641SAndroid Build Coastguard Worker           .Append(FILE_PATH_LITERAL(".."))
2785*635a8641SAndroid Build Coastguard Worker           .Append(temp_dir_.GetPath().BaseName())
2786*635a8641SAndroid Build Coastguard Worker           .Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
2787*635a8641SAndroid Build Coastguard Worker 
2788*635a8641SAndroid Build Coastguard Worker   // Create test file.
2789*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<int>(strlen(kTestData)),
2790*635a8641SAndroid Build Coastguard Worker             WriteFile(file_path, kTestData, strlen(kTestData)));
2791*635a8641SAndroid Build Coastguard Worker 
2792*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ReadFileToString(file_path, &data));
2793*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(kTestData, data);
2794*635a8641SAndroid Build Coastguard Worker 
2795*635a8641SAndroid Build Coastguard Worker   data = "temp";
2796*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 0));
2797*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, data.length());
2798*635a8641SAndroid Build Coastguard Worker 
2799*635a8641SAndroid Build Coastguard Worker   data = "temp";
2800*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 2));
2801*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("01", data);
2802*635a8641SAndroid Build Coastguard Worker 
2803*635a8641SAndroid Build Coastguard Worker   data = "temp";
2804*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 3));
2805*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("012", data);
2806*635a8641SAndroid Build Coastguard Worker 
2807*635a8641SAndroid Build Coastguard Worker   data = "temp";
2808*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ReadFileToStringWithMaxSize(file_path, &data, 4));
2809*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("0123", data);
2810*635a8641SAndroid Build Coastguard Worker 
2811*635a8641SAndroid Build Coastguard Worker   data = "temp";
2812*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ReadFileToStringWithMaxSize(file_path, &data, 6));
2813*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("0123", data);
2814*635a8641SAndroid Build Coastguard Worker 
2815*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ReadFileToStringWithMaxSize(file_path, nullptr, 6));
2816*635a8641SAndroid Build Coastguard Worker 
2817*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ReadFileToString(file_path, nullptr));
2818*635a8641SAndroid Build Coastguard Worker 
2819*635a8641SAndroid Build Coastguard Worker   data = "temp";
2820*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToString(file_path_dangerous, &data));
2821*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, data.length());
2822*635a8641SAndroid Build Coastguard Worker 
2823*635a8641SAndroid Build Coastguard Worker   // Delete test file.
2824*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(DeleteFile(file_path, false));
2825*635a8641SAndroid Build Coastguard Worker 
2826*635a8641SAndroid Build Coastguard Worker   data = "temp";
2827*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToString(file_path, &data));
2828*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, data.length());
2829*635a8641SAndroid Build Coastguard Worker 
2830*635a8641SAndroid Build Coastguard Worker   data = "temp";
2831*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 6));
2832*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, data.length());
2833*635a8641SAndroid Build Coastguard Worker }
2834*635a8641SAndroid Build Coastguard Worker 
2835*635a8641SAndroid Build Coastguard Worker #if !defined(OS_WIN)
TEST_F(FileUtilTest,ReadFileToStringWithUnknownFileSize)2836*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToStringWithUnknownFileSize) {
2837*635a8641SAndroid Build Coastguard Worker   FilePath file_path("/dev/zero");
2838*635a8641SAndroid Build Coastguard Worker   std::string data = "temp";
2839*635a8641SAndroid Build Coastguard Worker 
2840*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 0));
2841*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, data.length());
2842*635a8641SAndroid Build Coastguard Worker 
2843*635a8641SAndroid Build Coastguard Worker   data = "temp";
2844*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 2));
2845*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(std::string(2, '\0'), data);
2846*635a8641SAndroid Build Coastguard Worker 
2847*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, nullptr, 6));
2848*635a8641SAndroid Build Coastguard Worker 
2849*635a8641SAndroid Build Coastguard Worker   // Read more than buffer size.
2850*635a8641SAndroid Build Coastguard Worker   data = "temp";
2851*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, kLargeFileSize));
2852*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(kLargeFileSize, data.length());
2853*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(std::string(kLargeFileSize, '\0'), data);
2854*635a8641SAndroid Build Coastguard Worker 
2855*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, nullptr, kLargeFileSize));
2856*635a8641SAndroid Build Coastguard Worker }
2857*635a8641SAndroid Build Coastguard Worker #endif  // !defined(OS_WIN)
2858*635a8641SAndroid Build Coastguard Worker 
2859*635a8641SAndroid Build Coastguard Worker #if !defined(OS_WIN) && !defined(OS_NACL) && !defined(OS_FUCHSIA) && \
2860*635a8641SAndroid Build Coastguard Worker     !defined(OS_IOS)
2861*635a8641SAndroid Build Coastguard Worker #define ChildMain WriteToPipeChildMain
2862*635a8641SAndroid Build Coastguard Worker #define ChildMainString "WriteToPipeChildMain"
2863*635a8641SAndroid Build Coastguard Worker 
MULTIPROCESS_TEST_MAIN(ChildMain)2864*635a8641SAndroid Build Coastguard Worker MULTIPROCESS_TEST_MAIN(ChildMain) {
2865*635a8641SAndroid Build Coastguard Worker   const char kTestData[] = "0123";
2866*635a8641SAndroid Build Coastguard Worker   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
2867*635a8641SAndroid Build Coastguard Worker   const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
2868*635a8641SAndroid Build Coastguard Worker 
2869*635a8641SAndroid Build Coastguard Worker   int fd = open(pipe_path.value().c_str(), O_WRONLY);
2870*635a8641SAndroid Build Coastguard Worker   CHECK_NE(-1, fd);
2871*635a8641SAndroid Build Coastguard Worker   size_t written = 0;
2872*635a8641SAndroid Build Coastguard Worker   while (written < strlen(kTestData)) {
2873*635a8641SAndroid Build Coastguard Worker     ssize_t res = write(fd, kTestData + written, strlen(kTestData) - written);
2874*635a8641SAndroid Build Coastguard Worker     if (res == -1)
2875*635a8641SAndroid Build Coastguard Worker       break;
2876*635a8641SAndroid Build Coastguard Worker     written += res;
2877*635a8641SAndroid Build Coastguard Worker   }
2878*635a8641SAndroid Build Coastguard Worker   CHECK_EQ(strlen(kTestData), written);
2879*635a8641SAndroid Build Coastguard Worker   CHECK_EQ(0, close(fd));
2880*635a8641SAndroid Build Coastguard Worker   return 0;
2881*635a8641SAndroid Build Coastguard Worker }
2882*635a8641SAndroid Build Coastguard Worker 
2883*635a8641SAndroid Build Coastguard Worker #define MoreThanBufferSizeChildMain WriteToPipeMoreThanBufferSizeChildMain
2884*635a8641SAndroid Build Coastguard Worker #define MoreThanBufferSizeChildMainString \
2885*635a8641SAndroid Build Coastguard Worker   "WriteToPipeMoreThanBufferSizeChildMain"
2886*635a8641SAndroid Build Coastguard Worker 
MULTIPROCESS_TEST_MAIN(MoreThanBufferSizeChildMain)2887*635a8641SAndroid Build Coastguard Worker MULTIPROCESS_TEST_MAIN(MoreThanBufferSizeChildMain) {
2888*635a8641SAndroid Build Coastguard Worker   std::string data(kLargeFileSize, 'c');
2889*635a8641SAndroid Build Coastguard Worker   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
2890*635a8641SAndroid Build Coastguard Worker   const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
2891*635a8641SAndroid Build Coastguard Worker 
2892*635a8641SAndroid Build Coastguard Worker   int fd = open(pipe_path.value().c_str(), O_WRONLY);
2893*635a8641SAndroid Build Coastguard Worker   CHECK_NE(-1, fd);
2894*635a8641SAndroid Build Coastguard Worker 
2895*635a8641SAndroid Build Coastguard Worker   size_t written = 0;
2896*635a8641SAndroid Build Coastguard Worker   while (written < data.size()) {
2897*635a8641SAndroid Build Coastguard Worker     ssize_t res = write(fd, data.c_str() + written, data.size() - written);
2898*635a8641SAndroid Build Coastguard Worker     if (res == -1) {
2899*635a8641SAndroid Build Coastguard Worker       // We are unable to write because reading process has already read
2900*635a8641SAndroid Build Coastguard Worker       // requested number of bytes and closed pipe.
2901*635a8641SAndroid Build Coastguard Worker       break;
2902*635a8641SAndroid Build Coastguard Worker     }
2903*635a8641SAndroid Build Coastguard Worker     written += res;
2904*635a8641SAndroid Build Coastguard Worker   }
2905*635a8641SAndroid Build Coastguard Worker   CHECK_EQ(0, close(fd));
2906*635a8641SAndroid Build Coastguard Worker   return 0;
2907*635a8641SAndroid Build Coastguard Worker }
2908*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,ReadFileToStringWithNamedPipe)2909*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToStringWithNamedPipe) {
2910*635a8641SAndroid Build Coastguard Worker   FilePath pipe_path =
2911*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("test_pipe"));
2912*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(0, mkfifo(pipe_path.value().c_str(), 0600));
2913*635a8641SAndroid Build Coastguard Worker 
2914*635a8641SAndroid Build Coastguard Worker   base::CommandLine child_command_line(
2915*635a8641SAndroid Build Coastguard Worker       base::GetMultiProcessTestChildBaseCommandLine());
2916*635a8641SAndroid Build Coastguard Worker   child_command_line.AppendSwitchPath("pipe-path", pipe_path);
2917*635a8641SAndroid Build Coastguard Worker 
2918*635a8641SAndroid Build Coastguard Worker   {
2919*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
2920*635a8641SAndroid Build Coastguard Worker         ChildMainString, child_command_line, base::LaunchOptions());
2921*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
2922*635a8641SAndroid Build Coastguard Worker 
2923*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
2924*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 2));
2925*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ("01", data);
2926*635a8641SAndroid Build Coastguard Worker 
2927*635a8641SAndroid Build Coastguard Worker     int rv = -1;
2928*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
2929*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
2930*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
2931*635a8641SAndroid Build Coastguard Worker   }
2932*635a8641SAndroid Build Coastguard Worker   {
2933*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
2934*635a8641SAndroid Build Coastguard Worker         ChildMainString, child_command_line, base::LaunchOptions());
2935*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
2936*635a8641SAndroid Build Coastguard Worker 
2937*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
2938*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
2939*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ("0123", data);
2940*635a8641SAndroid Build Coastguard Worker 
2941*635a8641SAndroid Build Coastguard Worker     int rv = -1;
2942*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
2943*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
2944*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
2945*635a8641SAndroid Build Coastguard Worker   }
2946*635a8641SAndroid Build Coastguard Worker   {
2947*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
2948*635a8641SAndroid Build Coastguard Worker         MoreThanBufferSizeChildMainString, child_command_line,
2949*635a8641SAndroid Build Coastguard Worker         base::LaunchOptions());
2950*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
2951*635a8641SAndroid Build Coastguard Worker 
2952*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
2953*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
2954*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ("cccccc", data);
2955*635a8641SAndroid Build Coastguard Worker 
2956*635a8641SAndroid Build Coastguard Worker     int rv = -1;
2957*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
2958*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
2959*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
2960*635a8641SAndroid Build Coastguard Worker   }
2961*635a8641SAndroid Build Coastguard Worker   {
2962*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
2963*635a8641SAndroid Build Coastguard Worker         MoreThanBufferSizeChildMainString, child_command_line,
2964*635a8641SAndroid Build Coastguard Worker         base::LaunchOptions());
2965*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
2966*635a8641SAndroid Build Coastguard Worker 
2967*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
2968*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(
2969*635a8641SAndroid Build Coastguard Worker         ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize - 1));
2970*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(std::string(kLargeFileSize - 1, 'c'), data);
2971*635a8641SAndroid Build Coastguard Worker 
2972*635a8641SAndroid Build Coastguard Worker     int rv = -1;
2973*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
2974*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
2975*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
2976*635a8641SAndroid Build Coastguard Worker   }
2977*635a8641SAndroid Build Coastguard Worker   {
2978*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
2979*635a8641SAndroid Build Coastguard Worker         MoreThanBufferSizeChildMainString, child_command_line,
2980*635a8641SAndroid Build Coastguard Worker         base::LaunchOptions());
2981*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
2982*635a8641SAndroid Build Coastguard Worker 
2983*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
2984*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize));
2985*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
2986*635a8641SAndroid Build Coastguard Worker 
2987*635a8641SAndroid Build Coastguard Worker     int rv = -1;
2988*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
2989*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
2990*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
2991*635a8641SAndroid Build Coastguard Worker   }
2992*635a8641SAndroid Build Coastguard Worker   {
2993*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
2994*635a8641SAndroid Build Coastguard Worker         MoreThanBufferSizeChildMainString, child_command_line,
2995*635a8641SAndroid Build Coastguard Worker         base::LaunchOptions());
2996*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
2997*635a8641SAndroid Build Coastguard Worker 
2998*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
2999*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(
3000*635a8641SAndroid Build Coastguard Worker         ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize * 5));
3001*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
3002*635a8641SAndroid Build Coastguard Worker 
3003*635a8641SAndroid Build Coastguard Worker     int rv = -1;
3004*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3005*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
3006*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
3007*635a8641SAndroid Build Coastguard Worker   }
3008*635a8641SAndroid Build Coastguard Worker 
3009*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(0, unlink(pipe_path.value().c_str()));
3010*635a8641SAndroid Build Coastguard Worker }
3011*635a8641SAndroid Build Coastguard Worker #endif  // !defined(OS_WIN) && !defined(OS_NACL) && !defined(OS_FUCHSIA) &&
3012*635a8641SAndroid Build Coastguard Worker         // !defined(OS_IOS)
3013*635a8641SAndroid Build Coastguard Worker 
3014*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
3015*635a8641SAndroid Build Coastguard Worker #define ChildMain WriteToPipeChildMain
3016*635a8641SAndroid Build Coastguard Worker #define ChildMainString "WriteToPipeChildMain"
3017*635a8641SAndroid Build Coastguard Worker 
MULTIPROCESS_TEST_MAIN(ChildMain)3018*635a8641SAndroid Build Coastguard Worker MULTIPROCESS_TEST_MAIN(ChildMain) {
3019*635a8641SAndroid Build Coastguard Worker   const char kTestData[] = "0123";
3020*635a8641SAndroid Build Coastguard Worker   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
3021*635a8641SAndroid Build Coastguard Worker   const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
3022*635a8641SAndroid Build Coastguard Worker   std::string switch_string = command_line->GetSwitchValueASCII("sync_event");
3023*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(switch_string.empty());
3024*635a8641SAndroid Build Coastguard Worker   unsigned int switch_uint = 0;
3025*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(StringToUint(switch_string, &switch_uint));
3026*635a8641SAndroid Build Coastguard Worker   win::ScopedHandle sync_event(win::Uint32ToHandle(switch_uint));
3027*635a8641SAndroid Build Coastguard Worker 
3028*635a8641SAndroid Build Coastguard Worker   HANDLE ph = CreateNamedPipe(pipe_path.value().c_str(), PIPE_ACCESS_OUTBOUND,
3029*635a8641SAndroid Build Coastguard Worker                               PIPE_WAIT, 1, 0, 0, 0, NULL);
3030*635a8641SAndroid Build Coastguard Worker   EXPECT_NE(ph, INVALID_HANDLE_VALUE);
3031*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SetEvent(sync_event.Get()));
3032*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ConnectNamedPipe(ph, NULL));
3033*635a8641SAndroid Build Coastguard Worker 
3034*635a8641SAndroid Build Coastguard Worker   DWORD written;
3035*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(::WriteFile(ph, kTestData, strlen(kTestData), &written, NULL));
3036*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(strlen(kTestData), written);
3037*635a8641SAndroid Build Coastguard Worker   CloseHandle(ph);
3038*635a8641SAndroid Build Coastguard Worker   return 0;
3039*635a8641SAndroid Build Coastguard Worker }
3040*635a8641SAndroid Build Coastguard Worker 
3041*635a8641SAndroid Build Coastguard Worker #define MoreThanBufferSizeChildMain WriteToPipeMoreThanBufferSizeChildMain
3042*635a8641SAndroid Build Coastguard Worker #define MoreThanBufferSizeChildMainString \
3043*635a8641SAndroid Build Coastguard Worker   "WriteToPipeMoreThanBufferSizeChildMain"
3044*635a8641SAndroid Build Coastguard Worker 
MULTIPROCESS_TEST_MAIN(MoreThanBufferSizeChildMain)3045*635a8641SAndroid Build Coastguard Worker MULTIPROCESS_TEST_MAIN(MoreThanBufferSizeChildMain) {
3046*635a8641SAndroid Build Coastguard Worker   std::string data(kLargeFileSize, 'c');
3047*635a8641SAndroid Build Coastguard Worker   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
3048*635a8641SAndroid Build Coastguard Worker   const FilePath pipe_path = command_line->GetSwitchValuePath("pipe-path");
3049*635a8641SAndroid Build Coastguard Worker   std::string switch_string = command_line->GetSwitchValueASCII("sync_event");
3050*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(switch_string.empty());
3051*635a8641SAndroid Build Coastguard Worker   unsigned int switch_uint = 0;
3052*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(StringToUint(switch_string, &switch_uint));
3053*635a8641SAndroid Build Coastguard Worker   win::ScopedHandle sync_event(win::Uint32ToHandle(switch_uint));
3054*635a8641SAndroid Build Coastguard Worker 
3055*635a8641SAndroid Build Coastguard Worker   HANDLE ph = CreateNamedPipe(pipe_path.value().c_str(), PIPE_ACCESS_OUTBOUND,
3056*635a8641SAndroid Build Coastguard Worker                               PIPE_WAIT, 1, data.size(), data.size(), 0, NULL);
3057*635a8641SAndroid Build Coastguard Worker   EXPECT_NE(ph, INVALID_HANDLE_VALUE);
3058*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SetEvent(sync_event.Get()));
3059*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ConnectNamedPipe(ph, NULL));
3060*635a8641SAndroid Build Coastguard Worker 
3061*635a8641SAndroid Build Coastguard Worker   DWORD written;
3062*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(::WriteFile(ph, data.c_str(), data.size(), &written, NULL));
3063*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(data.size(), written);
3064*635a8641SAndroid Build Coastguard Worker   CloseHandle(ph);
3065*635a8641SAndroid Build Coastguard Worker   return 0;
3066*635a8641SAndroid Build Coastguard Worker }
3067*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,ReadFileToStringWithNamedPipe)3068*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToStringWithNamedPipe) {
3069*635a8641SAndroid Build Coastguard Worker   FilePath pipe_path(FILE_PATH_LITERAL("\\\\.\\pipe\\test_pipe"));
3070*635a8641SAndroid Build Coastguard Worker   win::ScopedHandle sync_event(CreateEvent(0, false, false, nullptr));
3071*635a8641SAndroid Build Coastguard Worker 
3072*635a8641SAndroid Build Coastguard Worker   base::CommandLine child_command_line(
3073*635a8641SAndroid Build Coastguard Worker       base::GetMultiProcessTestChildBaseCommandLine());
3074*635a8641SAndroid Build Coastguard Worker   child_command_line.AppendSwitchPath("pipe-path", pipe_path);
3075*635a8641SAndroid Build Coastguard Worker   child_command_line.AppendSwitchASCII(
3076*635a8641SAndroid Build Coastguard Worker       "sync_event", UintToString(win::HandleToUint32(sync_event.Get())));
3077*635a8641SAndroid Build Coastguard Worker 
3078*635a8641SAndroid Build Coastguard Worker   base::LaunchOptions options;
3079*635a8641SAndroid Build Coastguard Worker   options.handles_to_inherit.push_back(sync_event.Get());
3080*635a8641SAndroid Build Coastguard Worker 
3081*635a8641SAndroid Build Coastguard Worker   {
3082*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
3083*635a8641SAndroid Build Coastguard Worker         ChildMainString, child_command_line, options);
3084*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
3085*635a8641SAndroid Build Coastguard Worker     // Wait for pipe creation in child process.
3086*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
3087*635a8641SAndroid Build Coastguard Worker 
3088*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
3089*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 2));
3090*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ("01", data);
3091*635a8641SAndroid Build Coastguard Worker 
3092*635a8641SAndroid Build Coastguard Worker     int rv = -1;
3093*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3094*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
3095*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
3096*635a8641SAndroid Build Coastguard Worker   }
3097*635a8641SAndroid Build Coastguard Worker   {
3098*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
3099*635a8641SAndroid Build Coastguard Worker         ChildMainString, child_command_line, options);
3100*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
3101*635a8641SAndroid Build Coastguard Worker     // Wait for pipe creation in child process.
3102*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
3103*635a8641SAndroid Build Coastguard Worker 
3104*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
3105*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
3106*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ("0123", data);
3107*635a8641SAndroid Build Coastguard Worker 
3108*635a8641SAndroid Build Coastguard Worker     int rv = -1;
3109*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3110*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
3111*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
3112*635a8641SAndroid Build Coastguard Worker   }
3113*635a8641SAndroid Build Coastguard Worker   {
3114*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
3115*635a8641SAndroid Build Coastguard Worker         MoreThanBufferSizeChildMainString, child_command_line, options);
3116*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
3117*635a8641SAndroid Build Coastguard Worker     // Wait for pipe creation in child process.
3118*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
3119*635a8641SAndroid Build Coastguard Worker 
3120*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
3121*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(ReadFileToStringWithMaxSize(pipe_path, &data, 6));
3122*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ("cccccc", data);
3123*635a8641SAndroid Build Coastguard Worker 
3124*635a8641SAndroid Build Coastguard Worker     int rv = -1;
3125*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3126*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
3127*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
3128*635a8641SAndroid Build Coastguard Worker   }
3129*635a8641SAndroid Build Coastguard Worker   {
3130*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
3131*635a8641SAndroid Build Coastguard Worker         MoreThanBufferSizeChildMainString, child_command_line, options);
3132*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
3133*635a8641SAndroid Build Coastguard Worker     // Wait for pipe creation in child process.
3134*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
3135*635a8641SAndroid Build Coastguard Worker 
3136*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
3137*635a8641SAndroid Build Coastguard Worker     EXPECT_FALSE(
3138*635a8641SAndroid Build Coastguard Worker         ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize - 1));
3139*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(std::string(kLargeFileSize - 1, 'c'), data);
3140*635a8641SAndroid Build Coastguard Worker 
3141*635a8641SAndroid Build Coastguard Worker     int rv = -1;
3142*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3143*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
3144*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
3145*635a8641SAndroid Build Coastguard Worker   }
3146*635a8641SAndroid Build Coastguard Worker   {
3147*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
3148*635a8641SAndroid Build Coastguard Worker         MoreThanBufferSizeChildMainString, child_command_line, options);
3149*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
3150*635a8641SAndroid Build Coastguard Worker     // Wait for pipe creation in child process.
3151*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
3152*635a8641SAndroid Build Coastguard Worker 
3153*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
3154*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize));
3155*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
3156*635a8641SAndroid Build Coastguard Worker 
3157*635a8641SAndroid Build Coastguard Worker     int rv = -1;
3158*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3159*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
3160*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
3161*635a8641SAndroid Build Coastguard Worker   }
3162*635a8641SAndroid Build Coastguard Worker   {
3163*635a8641SAndroid Build Coastguard Worker     base::Process child_process = base::SpawnMultiProcessTestChild(
3164*635a8641SAndroid Build Coastguard Worker         MoreThanBufferSizeChildMainString, child_command_line, options);
3165*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(child_process.IsValid());
3166*635a8641SAndroid Build Coastguard Worker     // Wait for pipe creation in child process.
3167*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(WAIT_OBJECT_0, WaitForSingleObject(sync_event.Get(), INFINITE));
3168*635a8641SAndroid Build Coastguard Worker 
3169*635a8641SAndroid Build Coastguard Worker     std::string data = "temp";
3170*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(
3171*635a8641SAndroid Build Coastguard Worker         ReadFileToStringWithMaxSize(pipe_path, &data, kLargeFileSize * 5));
3172*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(std::string(kLargeFileSize, 'c'), data);
3173*635a8641SAndroid Build Coastguard Worker 
3174*635a8641SAndroid Build Coastguard Worker     int rv = -1;
3175*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(WaitForMultiprocessTestChildExit(
3176*635a8641SAndroid Build Coastguard Worker         child_process, TestTimeouts::action_timeout(), &rv));
3177*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, rv);
3178*635a8641SAndroid Build Coastguard Worker   }
3179*635a8641SAndroid Build Coastguard Worker }
3180*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_WIN)
3181*635a8641SAndroid Build Coastguard Worker 
3182*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX) && !defined(OS_MACOSX)
TEST_F(FileUtilTest,ReadFileToStringWithProcFileSystem)3183*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToStringWithProcFileSystem) {
3184*635a8641SAndroid Build Coastguard Worker   FilePath file_path("/proc/cpuinfo");
3185*635a8641SAndroid Build Coastguard Worker   std::string data = "temp";
3186*635a8641SAndroid Build Coastguard Worker 
3187*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 0));
3188*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, data.length());
3189*635a8641SAndroid Build Coastguard Worker 
3190*635a8641SAndroid Build Coastguard Worker   data = "temp";
3191*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 2));
3192*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(EqualsCaseInsensitiveASCII("pr", data));
3193*635a8641SAndroid Build Coastguard Worker 
3194*635a8641SAndroid Build Coastguard Worker   data = "temp";
3195*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &data, 4));
3196*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(EqualsCaseInsensitiveASCII("proc", data));
3197*635a8641SAndroid Build Coastguard Worker 
3198*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, nullptr, 4));
3199*635a8641SAndroid Build Coastguard Worker }
3200*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_POSIX) && !defined(OS_MACOSX)
3201*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,ReadFileToStringWithLargeFile)3202*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ReadFileToStringWithLargeFile) {
3203*635a8641SAndroid Build Coastguard Worker   std::string data(kLargeFileSize, 'c');
3204*635a8641SAndroid Build Coastguard Worker 
3205*635a8641SAndroid Build Coastguard Worker   FilePath file_path =
3206*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("ReadFileToStringTest"));
3207*635a8641SAndroid Build Coastguard Worker 
3208*635a8641SAndroid Build Coastguard Worker   // Create test file.
3209*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<int>(kLargeFileSize),
3210*635a8641SAndroid Build Coastguard Worker             WriteFile(file_path, data.c_str(), kLargeFileSize));
3211*635a8641SAndroid Build Coastguard Worker 
3212*635a8641SAndroid Build Coastguard Worker   std::string actual_data = "temp";
3213*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(ReadFileToString(file_path, &actual_data));
3214*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(data, actual_data);
3215*635a8641SAndroid Build Coastguard Worker 
3216*635a8641SAndroid Build Coastguard Worker   actual_data = "temp";
3217*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(ReadFileToStringWithMaxSize(file_path, &actual_data, 0));
3218*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0u, actual_data.length());
3219*635a8641SAndroid Build Coastguard Worker 
3220*635a8641SAndroid Build Coastguard Worker   // Read more than buffer size.
3221*635a8641SAndroid Build Coastguard Worker   actual_data = "temp";
3222*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3223*635a8641SAndroid Build Coastguard Worker       ReadFileToStringWithMaxSize(file_path, &actual_data, kLargeFileSize - 1));
3224*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(std::string(kLargeFileSize - 1, 'c'), actual_data);
3225*635a8641SAndroid Build Coastguard Worker }
3226*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,TouchFile)3227*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, TouchFile) {
3228*635a8641SAndroid Build Coastguard Worker   FilePath data_dir =
3229*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("FilePathTest"));
3230*635a8641SAndroid Build Coastguard Worker 
3231*635a8641SAndroid Build Coastguard Worker   // Create a fresh, empty copy of this directory.
3232*635a8641SAndroid Build Coastguard Worker   if (PathExists(data_dir)) {
3233*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(DeleteFile(data_dir, true));
3234*635a8641SAndroid Build Coastguard Worker   }
3235*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(data_dir));
3236*635a8641SAndroid Build Coastguard Worker 
3237*635a8641SAndroid Build Coastguard Worker   FilePath foobar(data_dir.Append(FILE_PATH_LITERAL("foobar.txt")));
3238*635a8641SAndroid Build Coastguard Worker   std::string data("hello");
3239*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<int>(data.length()),
3240*635a8641SAndroid Build Coastguard Worker             WriteFile(foobar, data.c_str(), data.length()));
3241*635a8641SAndroid Build Coastguard Worker 
3242*635a8641SAndroid Build Coastguard Worker   Time access_time;
3243*635a8641SAndroid Build Coastguard Worker   // This timestamp is divisible by one day (in local timezone),
3244*635a8641SAndroid Build Coastguard Worker   // to make it work on FAT too.
3245*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(Time::FromString("Wed, 16 Nov 1994, 00:00:00",
3246*635a8641SAndroid Build Coastguard Worker                                &access_time));
3247*635a8641SAndroid Build Coastguard Worker 
3248*635a8641SAndroid Build Coastguard Worker   Time modification_time;
3249*635a8641SAndroid Build Coastguard Worker   // Note that this timestamp is divisible by two (seconds) - FAT stores
3250*635a8641SAndroid Build Coastguard Worker   // modification times with 2s resolution.
3251*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(Time::FromString("Tue, 15 Nov 1994, 12:45:26 GMT",
3252*635a8641SAndroid Build Coastguard Worker               &modification_time));
3253*635a8641SAndroid Build Coastguard Worker 
3254*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(TouchFile(foobar, access_time, modification_time));
3255*635a8641SAndroid Build Coastguard Worker   File::Info file_info;
3256*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(GetFileInfo(foobar, &file_info));
3257*635a8641SAndroid Build Coastguard Worker #if !defined(OS_FUCHSIA)
3258*635a8641SAndroid Build Coastguard Worker   // Access time is not supported on Fuchsia, see https://crbug.com/735233.
3259*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(access_time.ToInternalValue(),
3260*635a8641SAndroid Build Coastguard Worker             file_info.last_accessed.ToInternalValue());
3261*635a8641SAndroid Build Coastguard Worker #endif
3262*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(modification_time.ToInternalValue(),
3263*635a8641SAndroid Build Coastguard Worker             file_info.last_modified.ToInternalValue());
3264*635a8641SAndroid Build Coastguard Worker }
3265*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,IsDirectoryEmpty)3266*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, IsDirectoryEmpty) {
3267*635a8641SAndroid Build Coastguard Worker   FilePath empty_dir =
3268*635a8641SAndroid Build Coastguard Worker       temp_dir_.GetPath().Append(FILE_PATH_LITERAL("EmptyDir"));
3269*635a8641SAndroid Build Coastguard Worker 
3270*635a8641SAndroid Build Coastguard Worker   ASSERT_FALSE(PathExists(empty_dir));
3271*635a8641SAndroid Build Coastguard Worker 
3272*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateDirectory(empty_dir));
3273*635a8641SAndroid Build Coastguard Worker 
3274*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(IsDirectoryEmpty(empty_dir));
3275*635a8641SAndroid Build Coastguard Worker 
3276*635a8641SAndroid Build Coastguard Worker   FilePath foo(empty_dir.Append(FILE_PATH_LITERAL("foo.txt")));
3277*635a8641SAndroid Build Coastguard Worker   std::string bar("baz");
3278*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(static_cast<int>(bar.length()),
3279*635a8641SAndroid Build Coastguard Worker             WriteFile(foo, bar.c_str(), bar.length()));
3280*635a8641SAndroid Build Coastguard Worker 
3281*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(IsDirectoryEmpty(empty_dir));
3282*635a8641SAndroid Build Coastguard Worker }
3283*635a8641SAndroid Build Coastguard Worker 
3284*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX) || defined(OS_FUCHSIA)
3285*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,SetNonBlocking)3286*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, SetNonBlocking) {
3287*635a8641SAndroid Build Coastguard Worker   const int kInvalidFd = 99999;
3288*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(SetNonBlocking(kInvalidFd));
3289*635a8641SAndroid Build Coastguard Worker 
3290*635a8641SAndroid Build Coastguard Worker   base::FilePath path;
3291*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &path));
3292*635a8641SAndroid Build Coastguard Worker   path = path.Append(FPL("file_util")).Append(FPL("original.txt"));
3293*635a8641SAndroid Build Coastguard Worker   ScopedFD fd(open(path.value().c_str(), O_RDONLY));
3294*635a8641SAndroid Build Coastguard Worker   ASSERT_GE(fd.get(), 0);
3295*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SetNonBlocking(fd.get()));
3296*635a8641SAndroid Build Coastguard Worker }
3297*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,SetCloseOnExec)3298*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, SetCloseOnExec) {
3299*635a8641SAndroid Build Coastguard Worker   const int kInvalidFd = 99999;
3300*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(SetCloseOnExec(kInvalidFd));
3301*635a8641SAndroid Build Coastguard Worker 
3302*635a8641SAndroid Build Coastguard Worker   base::FilePath path;
3303*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathService::Get(base::DIR_TEST_DATA, &path));
3304*635a8641SAndroid Build Coastguard Worker   path = path.Append(FPL("file_util")).Append(FPL("original.txt"));
3305*635a8641SAndroid Build Coastguard Worker   ScopedFD fd(open(path.value().c_str(), O_RDONLY));
3306*635a8641SAndroid Build Coastguard Worker   ASSERT_GE(fd.get(), 0);
3307*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(SetCloseOnExec(fd.get()));
3308*635a8641SAndroid Build Coastguard Worker }
3309*635a8641SAndroid Build Coastguard Worker 
3310*635a8641SAndroid Build Coastguard Worker #endif
3311*635a8641SAndroid Build Coastguard Worker 
3312*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX)
3313*635a8641SAndroid Build Coastguard Worker 
3314*635a8641SAndroid Build Coastguard Worker // Testing VerifyPathControlledByAdmin() is hard, because there is no
3315*635a8641SAndroid Build Coastguard Worker // way a test can make a file owned by root, or change file paths
3316*635a8641SAndroid Build Coastguard Worker // at the root of the file system.  VerifyPathControlledByAdmin()
3317*635a8641SAndroid Build Coastguard Worker // is implemented as a call to VerifyPathControlledByUser, which gives
3318*635a8641SAndroid Build Coastguard Worker // us the ability to test with paths under the test's temp directory,
3319*635a8641SAndroid Build Coastguard Worker // using a user id we control.
3320*635a8641SAndroid Build Coastguard Worker // Pull tests of VerifyPathControlledByUserTest() into a separate test class
3321*635a8641SAndroid Build Coastguard Worker // with a common SetUp() method.
3322*635a8641SAndroid Build Coastguard Worker class VerifyPathControlledByUserTest : public FileUtilTest {
3323*635a8641SAndroid Build Coastguard Worker  protected:
SetUp()3324*635a8641SAndroid Build Coastguard Worker   void SetUp() override {
3325*635a8641SAndroid Build Coastguard Worker     FileUtilTest::SetUp();
3326*635a8641SAndroid Build Coastguard Worker 
3327*635a8641SAndroid Build Coastguard Worker     // Create a basic structure used by each test.
3328*635a8641SAndroid Build Coastguard Worker     // base_dir_
3329*635a8641SAndroid Build Coastguard Worker     //  |-> sub_dir_
3330*635a8641SAndroid Build Coastguard Worker     //       |-> text_file_
3331*635a8641SAndroid Build Coastguard Worker 
3332*635a8641SAndroid Build Coastguard Worker     base_dir_ = temp_dir_.GetPath().AppendASCII("base_dir");
3333*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(CreateDirectory(base_dir_));
3334*635a8641SAndroid Build Coastguard Worker 
3335*635a8641SAndroid Build Coastguard Worker     sub_dir_ = base_dir_.AppendASCII("sub_dir");
3336*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(CreateDirectory(sub_dir_));
3337*635a8641SAndroid Build Coastguard Worker 
3338*635a8641SAndroid Build Coastguard Worker     text_file_ = sub_dir_.AppendASCII("file.txt");
3339*635a8641SAndroid Build Coastguard Worker     CreateTextFile(text_file_, L"This text file has some text in it.");
3340*635a8641SAndroid Build Coastguard Worker 
3341*635a8641SAndroid Build Coastguard Worker     // Get the user and group files are created with from |base_dir_|.
3342*635a8641SAndroid Build Coastguard Worker     struct stat stat_buf;
3343*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(0, stat(base_dir_.value().c_str(), &stat_buf));
3344*635a8641SAndroid Build Coastguard Worker     uid_ = stat_buf.st_uid;
3345*635a8641SAndroid Build Coastguard Worker     ok_gids_.insert(stat_buf.st_gid);
3346*635a8641SAndroid Build Coastguard Worker     bad_gids_.insert(stat_buf.st_gid + 1);
3347*635a8641SAndroid Build Coastguard Worker 
3348*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(uid_, getuid());  // This process should be the owner.
3349*635a8641SAndroid Build Coastguard Worker 
3350*635a8641SAndroid Build Coastguard Worker     // To ensure that umask settings do not cause the initial state
3351*635a8641SAndroid Build Coastguard Worker     // of permissions to be different from what we expect, explicitly
3352*635a8641SAndroid Build Coastguard Worker     // set permissions on the directories we create.
3353*635a8641SAndroid Build Coastguard Worker     // Make all files and directories non-world-writable.
3354*635a8641SAndroid Build Coastguard Worker 
3355*635a8641SAndroid Build Coastguard Worker     // Users and group can read, write, traverse
3356*635a8641SAndroid Build Coastguard Worker     int enabled_permissions =
3357*635a8641SAndroid Build Coastguard Worker         FILE_PERMISSION_USER_MASK | FILE_PERMISSION_GROUP_MASK;
3358*635a8641SAndroid Build Coastguard Worker     // Other users can't read, write, traverse
3359*635a8641SAndroid Build Coastguard Worker     int disabled_permissions = FILE_PERMISSION_OTHERS_MASK;
3360*635a8641SAndroid Build Coastguard Worker 
3361*635a8641SAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(
3362*635a8641SAndroid Build Coastguard Worker         ChangePosixFilePermissions(
3363*635a8641SAndroid Build Coastguard Worker             base_dir_, enabled_permissions, disabled_permissions));
3364*635a8641SAndroid Build Coastguard Worker     ASSERT_NO_FATAL_FAILURE(
3365*635a8641SAndroid Build Coastguard Worker         ChangePosixFilePermissions(
3366*635a8641SAndroid Build Coastguard Worker             sub_dir_, enabled_permissions, disabled_permissions));
3367*635a8641SAndroid Build Coastguard Worker   }
3368*635a8641SAndroid Build Coastguard Worker 
3369*635a8641SAndroid Build Coastguard Worker   FilePath base_dir_;
3370*635a8641SAndroid Build Coastguard Worker   FilePath sub_dir_;
3371*635a8641SAndroid Build Coastguard Worker   FilePath text_file_;
3372*635a8641SAndroid Build Coastguard Worker   uid_t uid_;
3373*635a8641SAndroid Build Coastguard Worker 
3374*635a8641SAndroid Build Coastguard Worker   std::set<gid_t> ok_gids_;
3375*635a8641SAndroid Build Coastguard Worker   std::set<gid_t> bad_gids_;
3376*635a8641SAndroid Build Coastguard Worker };
3377*635a8641SAndroid Build Coastguard Worker 
TEST_F(VerifyPathControlledByUserTest,BadPaths)3378*635a8641SAndroid Build Coastguard Worker TEST_F(VerifyPathControlledByUserTest, BadPaths) {
3379*635a8641SAndroid Build Coastguard Worker   // File does not exist.
3380*635a8641SAndroid Build Coastguard Worker   FilePath does_not_exist = base_dir_.AppendASCII("does")
3381*635a8641SAndroid Build Coastguard Worker                                      .AppendASCII("not")
3382*635a8641SAndroid Build Coastguard Worker                                      .AppendASCII("exist");
3383*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3384*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, does_not_exist, uid_, ok_gids_));
3385*635a8641SAndroid Build Coastguard Worker 
3386*635a8641SAndroid Build Coastguard Worker   // |base| not a subpath of |path|.
3387*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(VerifyPathControlledByUser(sub_dir_, base_dir_, uid_, ok_gids_));
3388*635a8641SAndroid Build Coastguard Worker 
3389*635a8641SAndroid Build Coastguard Worker   // An empty base path will fail to be a prefix for any path.
3390*635a8641SAndroid Build Coastguard Worker   FilePath empty;
3391*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(VerifyPathControlledByUser(empty, base_dir_, uid_, ok_gids_));
3392*635a8641SAndroid Build Coastguard Worker 
3393*635a8641SAndroid Build Coastguard Worker   // Finding that a bad call fails proves nothing unless a good call succeeds.
3394*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
3395*635a8641SAndroid Build Coastguard Worker }
3396*635a8641SAndroid Build Coastguard Worker 
TEST_F(VerifyPathControlledByUserTest,Symlinks)3397*635a8641SAndroid Build Coastguard Worker TEST_F(VerifyPathControlledByUserTest, Symlinks) {
3398*635a8641SAndroid Build Coastguard Worker   // Symlinks in the path should cause failure.
3399*635a8641SAndroid Build Coastguard Worker 
3400*635a8641SAndroid Build Coastguard Worker   // Symlink to the file at the end of the path.
3401*635a8641SAndroid Build Coastguard Worker   FilePath file_link =  base_dir_.AppendASCII("file_link");
3402*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(text_file_, file_link))
3403*635a8641SAndroid Build Coastguard Worker       << "Failed to create symlink.";
3404*635a8641SAndroid Build Coastguard Worker 
3405*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3406*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, file_link, uid_, ok_gids_));
3407*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3408*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(file_link, file_link, uid_, ok_gids_));
3409*635a8641SAndroid Build Coastguard Worker 
3410*635a8641SAndroid Build Coastguard Worker   // Symlink from one directory to another within the path.
3411*635a8641SAndroid Build Coastguard Worker   FilePath link_to_sub_dir =  base_dir_.AppendASCII("link_to_sub_dir");
3412*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(CreateSymbolicLink(sub_dir_, link_to_sub_dir))
3413*635a8641SAndroid Build Coastguard Worker     << "Failed to create symlink.";
3414*635a8641SAndroid Build Coastguard Worker 
3415*635a8641SAndroid Build Coastguard Worker   FilePath file_path_with_link = link_to_sub_dir.AppendASCII("file.txt");
3416*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(file_path_with_link));
3417*635a8641SAndroid Build Coastguard Worker 
3418*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, file_path_with_link, uid_,
3419*635a8641SAndroid Build Coastguard Worker                                           ok_gids_));
3420*635a8641SAndroid Build Coastguard Worker 
3421*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(VerifyPathControlledByUser(link_to_sub_dir, file_path_with_link,
3422*635a8641SAndroid Build Coastguard Worker                                           uid_, ok_gids_));
3423*635a8641SAndroid Build Coastguard Worker 
3424*635a8641SAndroid Build Coastguard Worker   // Symlinks in parents of base path are allowed.
3425*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(file_path_with_link,
3426*635a8641SAndroid Build Coastguard Worker                                          file_path_with_link, uid_, ok_gids_));
3427*635a8641SAndroid Build Coastguard Worker }
3428*635a8641SAndroid Build Coastguard Worker 
TEST_F(VerifyPathControlledByUserTest,OwnershipChecks)3429*635a8641SAndroid Build Coastguard Worker TEST_F(VerifyPathControlledByUserTest, OwnershipChecks) {
3430*635a8641SAndroid Build Coastguard Worker   // Get a uid that is not the uid of files we create.
3431*635a8641SAndroid Build Coastguard Worker   uid_t bad_uid = uid_ + 1;
3432*635a8641SAndroid Build Coastguard Worker 
3433*635a8641SAndroid Build Coastguard Worker   // Make all files and directories non-world-writable.
3434*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3435*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
3436*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3437*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
3438*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3439*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
3440*635a8641SAndroid Build Coastguard Worker 
3441*635a8641SAndroid Build Coastguard Worker   // We control these paths.
3442*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
3443*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(
3444*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
3445*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
3446*635a8641SAndroid Build Coastguard Worker 
3447*635a8641SAndroid Build Coastguard Worker   // Another user does not control these paths.
3448*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3449*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, sub_dir_, bad_uid, ok_gids_));
3450*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3451*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, bad_uid, ok_gids_));
3452*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3453*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(sub_dir_, text_file_, bad_uid, ok_gids_));
3454*635a8641SAndroid Build Coastguard Worker 
3455*635a8641SAndroid Build Coastguard Worker   // Another group does not control the paths.
3456*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3457*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, bad_gids_));
3458*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3459*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, bad_gids_));
3460*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3461*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(sub_dir_, text_file_, uid_, bad_gids_));
3462*635a8641SAndroid Build Coastguard Worker }
3463*635a8641SAndroid Build Coastguard Worker 
TEST_F(VerifyPathControlledByUserTest,GroupWriteTest)3464*635a8641SAndroid Build Coastguard Worker TEST_F(VerifyPathControlledByUserTest, GroupWriteTest) {
3465*635a8641SAndroid Build Coastguard Worker   // Make all files and directories writable only by their owner.
3466*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3467*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH|S_IWGRP));
3468*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3469*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH|S_IWGRP));
3470*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3471*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(text_file_, 0u, S_IWOTH|S_IWGRP));
3472*635a8641SAndroid Build Coastguard Worker 
3473*635a8641SAndroid Build Coastguard Worker   // Any group is okay because the path is not group-writable.
3474*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
3475*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(
3476*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
3477*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
3478*635a8641SAndroid Build Coastguard Worker 
3479*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, bad_gids_));
3480*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(
3481*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, bad_gids_));
3482*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(
3483*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(sub_dir_, text_file_, uid_, bad_gids_));
3484*635a8641SAndroid Build Coastguard Worker 
3485*635a8641SAndroid Build Coastguard Worker   // No group is okay, because we don't check the group
3486*635a8641SAndroid Build Coastguard Worker   // if no group can write.
3487*635a8641SAndroid Build Coastguard Worker   std::set<gid_t> no_gids;  // Empty set of gids.
3488*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, no_gids));
3489*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, text_file_, uid_, no_gids));
3490*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, no_gids));
3491*635a8641SAndroid Build Coastguard Worker 
3492*635a8641SAndroid Build Coastguard Worker   // Make all files and directories writable by their group.
3493*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(ChangePosixFilePermissions(base_dir_, S_IWGRP, 0u));
3494*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(ChangePosixFilePermissions(sub_dir_, S_IWGRP, 0u));
3495*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(ChangePosixFilePermissions(text_file_, S_IWGRP, 0u));
3496*635a8641SAndroid Build Coastguard Worker 
3497*635a8641SAndroid Build Coastguard Worker   // Now |ok_gids_| works, but |bad_gids_| fails.
3498*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
3499*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(
3500*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
3501*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
3502*635a8641SAndroid Build Coastguard Worker 
3503*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3504*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, bad_gids_));
3505*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3506*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, bad_gids_));
3507*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3508*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(sub_dir_, text_file_, uid_, bad_gids_));
3509*635a8641SAndroid Build Coastguard Worker 
3510*635a8641SAndroid Build Coastguard Worker   // Because any group in the group set is allowed,
3511*635a8641SAndroid Build Coastguard Worker   // the union of good and bad gids passes.
3512*635a8641SAndroid Build Coastguard Worker 
3513*635a8641SAndroid Build Coastguard Worker   std::set<gid_t> multiple_gids;
3514*635a8641SAndroid Build Coastguard Worker   std::set_union(
3515*635a8641SAndroid Build Coastguard Worker       ok_gids_.begin(), ok_gids_.end(),
3516*635a8641SAndroid Build Coastguard Worker       bad_gids_.begin(), bad_gids_.end(),
3517*635a8641SAndroid Build Coastguard Worker       std::inserter(multiple_gids, multiple_gids.begin()));
3518*635a8641SAndroid Build Coastguard Worker 
3519*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(
3520*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, multiple_gids));
3521*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(
3522*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, multiple_gids));
3523*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(
3524*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(sub_dir_, text_file_, uid_, multiple_gids));
3525*635a8641SAndroid Build Coastguard Worker }
3526*635a8641SAndroid Build Coastguard Worker 
TEST_F(VerifyPathControlledByUserTest,WriteBitChecks)3527*635a8641SAndroid Build Coastguard Worker TEST_F(VerifyPathControlledByUserTest, WriteBitChecks) {
3528*635a8641SAndroid Build Coastguard Worker   // Make all files and directories non-world-writable.
3529*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3530*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
3531*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3532*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
3533*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3534*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
3535*635a8641SAndroid Build Coastguard Worker 
3536*635a8641SAndroid Build Coastguard Worker   // Initialy, we control all parts of the path.
3537*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
3538*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(
3539*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
3540*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
3541*635a8641SAndroid Build Coastguard Worker 
3542*635a8641SAndroid Build Coastguard Worker   // Make base_dir_ world-writable.
3543*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3544*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(base_dir_, S_IWOTH, 0u));
3545*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
3546*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3547*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
3548*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
3549*635a8641SAndroid Build Coastguard Worker 
3550*635a8641SAndroid Build Coastguard Worker   // Make sub_dir_ world writable.
3551*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3552*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(sub_dir_, S_IWOTH, 0u));
3553*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
3554*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3555*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
3556*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3557*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
3558*635a8641SAndroid Build Coastguard Worker 
3559*635a8641SAndroid Build Coastguard Worker   // Make text_file_ world writable.
3560*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3561*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(text_file_, S_IWOTH, 0u));
3562*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
3563*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3564*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
3565*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3566*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
3567*635a8641SAndroid Build Coastguard Worker 
3568*635a8641SAndroid Build Coastguard Worker   // Make sub_dir_ non-world writable.
3569*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3570*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(sub_dir_, 0u, S_IWOTH));
3571*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
3572*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3573*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
3574*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3575*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
3576*635a8641SAndroid Build Coastguard Worker 
3577*635a8641SAndroid Build Coastguard Worker   // Make base_dir_ non-world-writable.
3578*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3579*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(base_dir_, 0u, S_IWOTH));
3580*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
3581*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3582*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
3583*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(
3584*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
3585*635a8641SAndroid Build Coastguard Worker 
3586*635a8641SAndroid Build Coastguard Worker   // Back to the initial state: Nothing is writable, so every path
3587*635a8641SAndroid Build Coastguard Worker   // should pass.
3588*635a8641SAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(
3589*635a8641SAndroid Build Coastguard Worker       ChangePosixFilePermissions(text_file_, 0u, S_IWOTH));
3590*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(base_dir_, sub_dir_, uid_, ok_gids_));
3591*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(
3592*635a8641SAndroid Build Coastguard Worker       VerifyPathControlledByUser(base_dir_, text_file_, uid_, ok_gids_));
3593*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(VerifyPathControlledByUser(sub_dir_, text_file_, uid_, ok_gids_));
3594*635a8641SAndroid Build Coastguard Worker }
3595*635a8641SAndroid Build Coastguard Worker 
3596*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_POSIX)
3597*635a8641SAndroid Build Coastguard Worker 
3598*635a8641SAndroid Build Coastguard Worker #if defined(OS_ANDROID)
TEST_F(FileUtilTest,ValidContentUriTest)3599*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, ValidContentUriTest) {
3600*635a8641SAndroid Build Coastguard Worker   // Get the test image path.
3601*635a8641SAndroid Build Coastguard Worker   FilePath data_dir;
3602*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathService::Get(DIR_TEST_DATA, &data_dir));
3603*635a8641SAndroid Build Coastguard Worker   data_dir = data_dir.AppendASCII("file_util");
3604*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(PathExists(data_dir));
3605*635a8641SAndroid Build Coastguard Worker   FilePath image_file = data_dir.Append(FILE_PATH_LITERAL("red.png"));
3606*635a8641SAndroid Build Coastguard Worker   int64_t image_size;
3607*635a8641SAndroid Build Coastguard Worker   GetFileSize(image_file, &image_size);
3608*635a8641SAndroid Build Coastguard Worker   ASSERT_GT(image_size, 0);
3609*635a8641SAndroid Build Coastguard Worker 
3610*635a8641SAndroid Build Coastguard Worker   // Insert the image into MediaStore. MediaStore will do some conversions, and
3611*635a8641SAndroid Build Coastguard Worker   // return the content URI.
3612*635a8641SAndroid Build Coastguard Worker   FilePath path = InsertImageIntoMediaStore(image_file);
3613*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(path.IsContentUri());
3614*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(PathExists(path));
3615*635a8641SAndroid Build Coastguard Worker   // The file size may not equal to the input image as MediaStore may convert
3616*635a8641SAndroid Build Coastguard Worker   // the image.
3617*635a8641SAndroid Build Coastguard Worker   int64_t content_uri_size;
3618*635a8641SAndroid Build Coastguard Worker   GetFileSize(path, &content_uri_size);
3619*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(image_size, content_uri_size);
3620*635a8641SAndroid Build Coastguard Worker 
3621*635a8641SAndroid Build Coastguard Worker   // We should be able to read the file.
3622*635a8641SAndroid Build Coastguard Worker   File file = OpenContentUriForRead(path);
3623*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(file.IsValid());
3624*635a8641SAndroid Build Coastguard Worker   auto buffer = std::make_unique<char[]>(image_size);
3625*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(file.ReadAtCurrentPos(buffer.get(), image_size));
3626*635a8641SAndroid Build Coastguard Worker }
3627*635a8641SAndroid Build Coastguard Worker 
TEST_F(FileUtilTest,NonExistentContentUriTest)3628*635a8641SAndroid Build Coastguard Worker TEST_F(FileUtilTest, NonExistentContentUriTest) {
3629*635a8641SAndroid Build Coastguard Worker   FilePath path("content://foo.bar");
3630*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(path.IsContentUri());
3631*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(PathExists(path));
3632*635a8641SAndroid Build Coastguard Worker   // Size should be smaller than 0.
3633*635a8641SAndroid Build Coastguard Worker   int64_t size;
3634*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(GetFileSize(path, &size));
3635*635a8641SAndroid Build Coastguard Worker 
3636*635a8641SAndroid Build Coastguard Worker   // We should not be able to read the file.
3637*635a8641SAndroid Build Coastguard Worker   File file = OpenContentUriForRead(path);
3638*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(file.IsValid());
3639*635a8641SAndroid Build Coastguard Worker }
3640*635a8641SAndroid Build Coastguard Worker #endif
3641*635a8641SAndroid Build Coastguard Worker 
3642*635a8641SAndroid Build Coastguard Worker // Test that temp files obtained racily are all unique (no interference between
3643*635a8641SAndroid Build Coastguard Worker // threads). Mimics file operations in DoLaunchChildTestProcess() to rule out
3644*635a8641SAndroid Build Coastguard Worker // thread-safety issues @ https://crbug.com/826408#c17.
3645*635a8641SAndroid Build Coastguard Worker #if defined(OS_FUCHSIA)
3646*635a8641SAndroid Build Coastguard Worker // TODO(crbug.com/844416): Too slow to run on infra due to QEMU overloads.
3647*635a8641SAndroid Build Coastguard Worker #define MAYBE_MultiThreadedTempFiles DISABLED_MultiThreadedTempFiles
3648*635a8641SAndroid Build Coastguard Worker #else
3649*635a8641SAndroid Build Coastguard Worker #define MAYBE_MultiThreadedTempFiles MultiThreadedTempFiles
3650*635a8641SAndroid Build Coastguard Worker #endif
TEST(FileUtilMultiThreadedTest,MAYBE_MultiThreadedTempFiles)3651*635a8641SAndroid Build Coastguard Worker TEST(FileUtilMultiThreadedTest, MAYBE_MultiThreadedTempFiles) {
3652*635a8641SAndroid Build Coastguard Worker   constexpr int kNumThreads = 64;
3653*635a8641SAndroid Build Coastguard Worker   constexpr int kNumWritesPerThread = 32;
3654*635a8641SAndroid Build Coastguard Worker 
3655*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<Thread> threads[kNumThreads];
3656*635a8641SAndroid Build Coastguard Worker   for (auto& thread : threads) {
3657*635a8641SAndroid Build Coastguard Worker     thread = std::make_unique<Thread>("test worker");
3658*635a8641SAndroid Build Coastguard Worker     thread->Start();
3659*635a8641SAndroid Build Coastguard Worker   }
3660*635a8641SAndroid Build Coastguard Worker 
3661*635a8641SAndroid Build Coastguard Worker   // Wait until all threads are started for max parallelism.
3662*635a8641SAndroid Build Coastguard Worker   for (auto& thread : threads)
3663*635a8641SAndroid Build Coastguard Worker     thread->WaitUntilThreadStarted();
3664*635a8641SAndroid Build Coastguard Worker 
3665*635a8641SAndroid Build Coastguard Worker   const RepeatingClosure open_write_close_read = BindRepeating([]() {
3666*635a8641SAndroid Build Coastguard Worker     FilePath output_filename;
3667*635a8641SAndroid Build Coastguard Worker     ScopedFILE output_file(CreateAndOpenTemporaryFile(&output_filename));
3668*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(output_file);
3669*635a8641SAndroid Build Coastguard Worker 
3670*635a8641SAndroid Build Coastguard Worker     const std::string content = GenerateGUID();
3671*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
3672*635a8641SAndroid Build Coastguard Worker     HANDLE handle =
3673*635a8641SAndroid Build Coastguard Worker         reinterpret_cast<HANDLE>(_get_osfhandle(_fileno(output_file.get())));
3674*635a8641SAndroid Build Coastguard Worker     DWORD bytes_written = 0;
3675*635a8641SAndroid Build Coastguard Worker     ::WriteFile(handle, content.c_str(), content.length(), &bytes_written,
3676*635a8641SAndroid Build Coastguard Worker                 NULL);
3677*635a8641SAndroid Build Coastguard Worker #else
3678*635a8641SAndroid Build Coastguard Worker     size_t bytes_written =
3679*635a8641SAndroid Build Coastguard Worker         ::write(::fileno(output_file.get()), content.c_str(), content.length());
3680*635a8641SAndroid Build Coastguard Worker #endif
3681*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(content.length(), bytes_written);
3682*635a8641SAndroid Build Coastguard Worker     ::fflush(output_file.get());
3683*635a8641SAndroid Build Coastguard Worker     output_file.reset();
3684*635a8641SAndroid Build Coastguard Worker 
3685*635a8641SAndroid Build Coastguard Worker     std::string output_file_contents;
3686*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(ReadFileToString(output_filename, &output_file_contents))
3687*635a8641SAndroid Build Coastguard Worker         << output_filename;
3688*635a8641SAndroid Build Coastguard Worker 
3689*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(content, output_file_contents);
3690*635a8641SAndroid Build Coastguard Worker 
3691*635a8641SAndroid Build Coastguard Worker     DeleteFile(output_filename, false);
3692*635a8641SAndroid Build Coastguard Worker   });
3693*635a8641SAndroid Build Coastguard Worker 
3694*635a8641SAndroid Build Coastguard Worker   // Post tasks to each thread in a round-robin fashion to ensure as much
3695*635a8641SAndroid Build Coastguard Worker   // parallelism as possible.
3696*635a8641SAndroid Build Coastguard Worker   for (int i = 0; i < kNumWritesPerThread; ++i) {
3697*635a8641SAndroid Build Coastguard Worker     for (auto& thread : threads) {
3698*635a8641SAndroid Build Coastguard Worker       thread->task_runner()->PostTask(FROM_HERE, open_write_close_read);
3699*635a8641SAndroid Build Coastguard Worker     }
3700*635a8641SAndroid Build Coastguard Worker   }
3701*635a8641SAndroid Build Coastguard Worker 
3702*635a8641SAndroid Build Coastguard Worker   for (auto& thread : threads)
3703*635a8641SAndroid Build Coastguard Worker     thread->Stop();
3704*635a8641SAndroid Build Coastguard Worker }
3705*635a8641SAndroid Build Coastguard Worker 
3706*635a8641SAndroid Build Coastguard Worker #if defined(OS_POSIX) || defined(OS_FUCHSIA)
3707*635a8641SAndroid Build Coastguard Worker 
TEST(ScopedFD,ScopedFDDoesClose)3708*635a8641SAndroid Build Coastguard Worker TEST(ScopedFD, ScopedFDDoesClose) {
3709*635a8641SAndroid Build Coastguard Worker   int fds[2];
3710*635a8641SAndroid Build Coastguard Worker   char c = 0;
3711*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(0, pipe(fds));
3712*635a8641SAndroid Build Coastguard Worker   const int write_end = fds[1];
3713*635a8641SAndroid Build Coastguard Worker   ScopedFD read_end_closer(fds[0]);
3714*635a8641SAndroid Build Coastguard Worker   {
3715*635a8641SAndroid Build Coastguard Worker     ScopedFD write_end_closer(fds[1]);
3716*635a8641SAndroid Build Coastguard Worker   }
3717*635a8641SAndroid Build Coastguard Worker   // This is the only thread. This file descriptor should no longer be valid.
3718*635a8641SAndroid Build Coastguard Worker   int ret = close(write_end);
3719*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-1, ret);
3720*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(EBADF, errno);
3721*635a8641SAndroid Build Coastguard Worker   // Make sure read(2) won't block.
3722*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(0, fcntl(fds[0], F_SETFL, O_NONBLOCK));
3723*635a8641SAndroid Build Coastguard Worker   // Reading the pipe should EOF.
3724*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, read(fds[0], &c, 1));
3725*635a8641SAndroid Build Coastguard Worker }
3726*635a8641SAndroid Build Coastguard Worker 
3727*635a8641SAndroid Build Coastguard Worker #if defined(GTEST_HAS_DEATH_TEST)
CloseWithScopedFD(int fd)3728*635a8641SAndroid Build Coastguard Worker void CloseWithScopedFD(int fd) {
3729*635a8641SAndroid Build Coastguard Worker   ScopedFD fd_closer(fd);
3730*635a8641SAndroid Build Coastguard Worker }
3731*635a8641SAndroid Build Coastguard Worker #endif
3732*635a8641SAndroid Build Coastguard Worker 
TEST(ScopedFD,ScopedFDCrashesOnCloseFailure)3733*635a8641SAndroid Build Coastguard Worker TEST(ScopedFD, ScopedFDCrashesOnCloseFailure) {
3734*635a8641SAndroid Build Coastguard Worker   int fds[2];
3735*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(0, pipe(fds));
3736*635a8641SAndroid Build Coastguard Worker   ScopedFD read_end_closer(fds[0]);
3737*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, IGNORE_EINTR(close(fds[1])));
3738*635a8641SAndroid Build Coastguard Worker #if defined(GTEST_HAS_DEATH_TEST)
3739*635a8641SAndroid Build Coastguard Worker   // This is the only thread. This file descriptor should no longer be valid.
3740*635a8641SAndroid Build Coastguard Worker   // Trying to close it should crash. This is important for security.
3741*635a8641SAndroid Build Coastguard Worker   EXPECT_DEATH(CloseWithScopedFD(fds[1]), "");
3742*635a8641SAndroid Build Coastguard Worker #endif
3743*635a8641SAndroid Build Coastguard Worker }
3744*635a8641SAndroid Build Coastguard Worker 
3745*635a8641SAndroid Build Coastguard Worker #endif  // defined(OS_POSIX) || defined(OS_FUCHSIA)
3746*635a8641SAndroid Build Coastguard Worker 
3747*635a8641SAndroid Build Coastguard Worker }  // namespace
3748*635a8641SAndroid Build Coastguard Worker 
3749*635a8641SAndroid Build Coastguard Worker }  // namespace base
3750