13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "build/build_config.h"
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <windows.h>
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <winioctl.h>
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <shellapi.h>
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <shlobj.h>
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <tchar.h>
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <fstream>
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <set>
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/base_paths.h"
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_path.h"
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/file_util.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h"
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/path_service.h"
233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/platform_thread.h"
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/time.h"
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/utf_string_conversions.h"
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h"
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/platform_test.h"
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#if defined(OS_WIN)
303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/win/scoped_handle.h"
313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#endif
323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This macro helps avoid wrapped lines in the test structs.
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define FPL(x) FILE_PATH_LITERAL(x)
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// To test that file_util::Normalize FilePath() deals with NTFS reparse points
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// correctly, we need functions to create and delete reparse points.
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef struct _REPARSE_DATA_BUFFER {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ULONG  ReparseTag;
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  USHORT  ReparseDataLength;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  USHORT  Reserved;
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  union {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    struct {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      USHORT SubstituteNameOffset;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      USHORT SubstituteNameLength;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      USHORT PrintNameOffset;
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      USHORT PrintNameLength;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ULONG Flags;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WCHAR PathBuffer[1];
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } SymbolicLinkReparseBuffer;
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    struct {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      USHORT SubstituteNameOffset;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      USHORT SubstituteNameLength;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      USHORT PrintNameOffset;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      USHORT PrintNameLength;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WCHAR PathBuffer[1];
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } MountPointReparseBuffer;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    struct {
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      UCHAR DataBuffer[1];
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } GenericReparseBuffer;
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Sets a reparse point. |source| will now point to |target|. Returns true if
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the call succeeds, false otherwise.
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool SetReparsePoint(HANDLE source, const FilePath& target_path) {
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring kPathPrefix = L"\\??\\";
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring target_str;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The juction will not work if the target path does not start with \??\ .
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (kPathPrefix != target_path.value().substr(0, kPathPrefix.size()))
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    target_str += kPathPrefix;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  target_str += target_path.value();
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const wchar_t* target = target_str.c_str();
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  USHORT size_target = static_cast<USHORT>(wcslen(target)) * sizeof(target[0]);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  char buffer[2000] = {0};
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DWORD returned;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  REPARSE_DATA_BUFFER* data = reinterpret_cast<REPARSE_DATA_BUFFER*>(buffer);
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data->ReparseTag = 0xa0000003;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  memcpy(data->MountPointReparseBuffer.PathBuffer, target, size_target + 2);
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data->MountPointReparseBuffer.SubstituteNameLength = size_target;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data->MountPointReparseBuffer.PrintNameOffset = size_target + 2;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data->ReparseDataLength = size_target + 4 + 8;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int data_size = data->ReparseDataLength + 8;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!DeviceIoControl(source, FSCTL_SET_REPARSE_POINT, &buffer, data_size,
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       NULL, 0, &returned, NULL)) {
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Delete the reparse point referenced by |source|. Returns true if the call
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// succeeds, false otherwise.
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool DeleteReparsePoint(HANDLE source) {
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DWORD returned;
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  REPARSE_DATA_BUFFER data = {0};
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  data.ReparseTag = 0xa0000003;
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (!DeviceIoControl(source, FSCTL_DELETE_REPARSE_POINT, &data, 8, NULL, 0,
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       &returned, NULL)) {
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return false;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return true;
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst wchar_t bogus_content[] = L"I'm cannon fodder.";
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst file_util::FileEnumerator::FILE_TYPE FILES_AND_DIRECTORIES =
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    static_cast<file_util::FileEnumerator::FILE_TYPE>(
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        file_util::FileEnumerator::FILES |
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        file_util::FileEnumerator::DIRECTORIES);
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// file_util winds up using autoreleased objects on the Mac, so this needs
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// to be a PlatformTest
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass FileUtilTest : public PlatformTest {
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void SetUp() {
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    PlatformTest::SetUp();
1263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ScopedTempDir temp_dir_;
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Collects all the results from the given file enumerator, and provides an
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// interface to query whether a given file is present.
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass FindResultCollector {
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  explicit FindResultCollector(file_util::FileEnumerator& enumerator) {
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    FilePath cur_file;
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    while (!(cur_file = enumerator.Next()).value().empty()) {
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      FilePath::StringType path = cur_file.value();
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      // The file should not be returned twice.
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      EXPECT_TRUE(files_.end() == files_.find(path))
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          << "Same file returned twice";
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      // Save for later.
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      files_.insert(path);
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Returns true if the enumerator found the file.
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool HasFile(const FilePath& file) const {
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return files_.find(file.value()) != files_.end();
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int size() {
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return static_cast<int>(files_.size());
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::set<FilePath::StringType> files_;
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Simple function to dump some text into a new file.
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid CreateTextFile(const FilePath& filename,
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    const std::wstring& contents) {
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::wofstream file;
16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  file.open(filename.value().c_str());
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file.is_open());
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file << contents;
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file.close();
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Simple function to take out some text from a file.
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstd::wstring ReadTextFile(const FilePath& filename) {
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  wchar_t contents[64];
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::wifstream file;
17672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  file.open(filename.value().c_str());
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file.is_open());
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  file.getline(contents, arraysize(contents));
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file.close();
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return std::wstring(contents);
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottuint64 FileTimeAsUint64(const FILETIME& ft) {
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ULARGE_INTEGER u;
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  u.LowPart = ft.dwLowDateTime;
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  u.HighPart = ft.dwHighDateTime;
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  return u.QuadPart;
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst struct append_case {
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const wchar_t* path;
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const wchar_t* ending;
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const wchar_t* result;
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} append_cases[] = {
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"c:\\colon\\backslash", L"path", L"c:\\colon\\backslash\\path"},
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"c:\\colon\\backslash\\", L"path", L"c:\\colon\\backslash\\path"},
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"c:\\colon\\backslash\\\\", L"path", L"c:\\colon\\backslash\\\\path"},
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"c:\\colon\\backslash\\", L"", L"c:\\colon\\backslash\\"},
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"c:\\colon\\backslash", L"", L"c:\\colon\\backslash\\"},
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"", L"path", L"\\path"},
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"", L"", L"\\"},
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX)
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar", L"path", L"/foo/bar/path"},
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar/", L"path", L"/foo/bar/path"},
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar//", L"path", L"/foo/bar//path"},
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar/", L"", L"/foo/bar/"},
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar", L"", L"/foo/bar/"},
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"", L"path", L"/path"},
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"", L"", L"/"},
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This function is deprecated, but still used on Windows.
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, AppendToPath) {
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (unsigned int i = 0; i < arraysize(append_cases); ++i) {
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const append_case& value = append_cases[i];
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    std::wstring result = value.path;
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    file_util::AppendToPath(&result, value.ending);
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(value.result, result);
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef NDEBUG
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::AppendToPath(NULL, L"path");  // asserts in debug mode
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // defined(OS_WIN)
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic const struct filename_case {
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const wchar_t* path;
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const wchar_t* filename;
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} filename_cases[] = {
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"c:\\colon\\backslash", L"backslash"},
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"c:\\colon\\backslash\\", L""},
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"\\\\filename.exe", L"filename.exe"},
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"filename.exe", L"filename.exe"},
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"", L""},
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"\\\\\\", L""},
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"c:/colon/backslash", L"backslash"},
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"c:/colon/backslash/", L""},
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"//////", L""},
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"///filename.exe", L"filename.exe"},
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX)
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar", L"bar"},
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar/", L""},
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/filename.exe", L"filename.exe"},
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"filename.exe", L"filename.exe"},
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"", L""},
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/", L""},
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Test finding the file type from a path name
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic const struct extension_case {
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const wchar_t* path;
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const wchar_t* extension;
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} extension_cases[] = {
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\colon\\backslash\\filename.extension", L"extension"},
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\colon\\backslash\\filename.", L""},
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\colon\\backslash\\filename", L""},
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\colon\\backslash\\", L""},
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\colon\\backslash.\\", L""},
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\colon\\backslash\filename.extension.extension2", L"extension2"},
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX)
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar/filename.extension", L"extension"},
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar/filename.", L""},
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar/filename", L""},
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar/", L""},
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar./", L""},
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar/filename.extension.extension2", L"extension2"},
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L".", L""},
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"..", L""},
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"./foo", L""},
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"./foo.extension", L"extension"},
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo.extension1/bar.extension2", L"extension2"},
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This function has been deprecated on non-Windows.
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, GetFileExtensionFromPath) {
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (unsigned int i = 0; i < arraysize(extension_cases); ++i) {
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const extension_case& ext = extension_cases[i];
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const std::wstring fext = file_util::GetFileExtensionFromPath(ext.path);
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(ext.extension, fext);
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Test finding the directory component of a path
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottstatic const struct dir_case {
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const wchar_t* full_path;
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const wchar_t* directory;
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} dir_cases[] = {
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\WINDOWS\\system32\\gdi32.dll", L"C:\\WINDOWS\\system32"},
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\WINDOWS\\system32\\not_exist_thx_1138", L"C:\\WINDOWS\\system32"},
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\WINDOWS\\system32\\", L"C:\\WINDOWS\\system32"},
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\WINDOWS\\system32\\\\", L"C:\\WINDOWS\\system32"},
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\WINDOWS\\system32", L"C:\\WINDOWS"},
306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\WINDOWS\\system32.\\", L"C:\\WINDOWS\\system32."},
307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"C:\\", L"C:\\"},
308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX)
309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar/gdi32.dll", L"/foo/bar"},
310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar/not_exist_thx_1138", L"/foo/bar"},
311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar/", L"/foo/bar"},
312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar//", L"/foo/bar"},
313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar", L"/foo"},
314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/foo/bar./", L"/foo/bar."},
315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"/", L"/"},
316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L".", L"."},
317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  {L"..", L"."},  // yes, ".." technically lives in "."
318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Flaky, http://crbug.com/46246
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, FLAKY_CountFilesCreatedAfter) {
323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create old file (that we don't want to count)
3243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath old_file_name =
3253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Old File.txt"));
326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(old_file_name, L"Just call me Mr. Creakybits");
327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Age to perfection
329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
3303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::PlatformThread::Sleep(100);
331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX)
332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // We need to wait at least one second here because the precision of
333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // file creation time is one second.
3343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::PlatformThread::Sleep(1500);
335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Establish our cutoff time
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  base::Time now(base::Time::NowFromSystemTime());
3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(0, file_util::CountFilesCreatedAfter(temp_dir_.path(), now));
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a new file (that we do want to count)
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath new_file_name =
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("New File.txt"));
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(new_file_name, L"Waaaaaaaaaaaaaah.");
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // We should see only the new file.
3473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(1, file_util::CountFilesCreatedAfter(temp_dir_.path(), now));
348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Delete new file, we should see no files after cutoff now
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::Delete(new_file_name, false));
3513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(0, file_util::CountFilesCreatedAfter(temp_dir_.path(), now));
352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, FileAndDirectorySize) {
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create three files of 20, 30 and 3 chars (utf8). ComputeDirectorySize
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // should return 53 bytes.
3573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_01 = temp_dir_.path().Append(FPL("The file 01.txt"));
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_01, L"12345678901234567890");
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int64 size_f1 = 0;
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::GetFileSize(file_01, &size_f1));
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(20ll, size_f1);
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath subdir_path = temp_dir_.path().Append(FPL("Level2"));
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(subdir_path);
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath file_02 = subdir_path.Append(FPL("The file 02.txt"));
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_02, L"123456789012345678901234567890");
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int64 size_f2 = 0;
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::GetFileSize(file_02, &size_f2));
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(30ll, size_f2);
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath subsubdir_path = subdir_path.Append(FPL("Level3"));
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(subsubdir_path);
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath file_03 = subsubdir_path.Append(FPL("The file 03.txt"));
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_03, L"123");
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int64 computed_size = file_util::ComputeDirectorySize(temp_dir_.path());
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(size_f1 + size_f2 + 3, computed_size);
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  computed_size =
3823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      file_util::ComputeFilesSize(temp_dir_.path(), FPL("The file*"));
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(size_f1, computed_size);
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  computed_size = file_util::ComputeFilesSize(temp_dir_.path(), FPL("bla*"));
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, computed_size);
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, NormalizeFilePathBasic) {
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a directory under the test dir.  Because we create it,
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // we know it is not a link.
3923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_a_path = temp_dir_.path().Append(FPL("file_a"));
3933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath dir_path = temp_dir_.path().Append(FPL("dir"));
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath file_b_path = dir_path.Append(FPL("file_b"));
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(dir_path);
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath normalized_file_a_path, normalized_file_b_path;
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(file_util::PathExists(file_a_path));
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(file_util::NormalizeFilePath(file_a_path,
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &normalized_file_a_path))
4013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    << "NormalizeFilePath() should fail on nonexistent paths.";
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_a_path, bogus_content);
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(file_a_path));
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::NormalizeFilePath(file_a_path,
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           &normalized_file_a_path));
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_b_path, bogus_content);
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(file_b_path));
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::NormalizeFilePath(file_b_path,
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           &normalized_file_b_path));
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Beacuse this test created |dir_path|, we know it is not a link
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // or junction.  So, the real path of the directory holding file a
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // must be the parent of the path holding file b.
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(normalized_file_a_path.DirName()
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .IsParent(normalized_file_b_path.DirName()));
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, NormalizeFilePathReparsePoints) {
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Build the following directory structure:
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
4253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // temp_dir
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |-> base_a
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |   |-> sub_a
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |       |-> file.txt
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |       |-> long_name___... (Very long name.)
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |           |-> sub_long
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |              |-> deep.txt
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |-> base_b
4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  //     |-> to_sub_a (reparse point to temp_dir\base_a\sub_a)
4343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  //     |-> to_base_b (reparse point to temp_dir\base_b)
4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  //     |-> to_sub_long (reparse point to temp_dir\sub_a\long_name_\sub_long)
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath base_a = temp_dir_.path().Append(FPL("base_a"));
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::CreateDirectory(base_a));
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath sub_a = base_a.Append(FPL("sub_a"));
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::CreateDirectory(sub_a));
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath file_txt = sub_a.Append(FPL("file.txt"));
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_txt, bogus_content);
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Want a directory whose name is long enough to make the path to the file
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // inside just under MAX_PATH chars.  This will be used to test that when
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a junction expands to a path over MAX_PATH chars in length,
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NormalizeFilePath() fails without crashing.
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath sub_long_rel(FPL("sub_long"));
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath deep_txt(FPL("deep.txt"));
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int target_length = MAX_PATH;
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  target_length -= (sub_a.value().length() + 1);  // +1 for the sepperator '\'.
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  target_length -= (sub_long_rel.Append(deep_txt).value().length() + 1);
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Without making the path a bit shorter, CreateDirectory() fails.
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the resulting path is still long enough to hit the failing case in
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NormalizePath().
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int kCreateDirLimit = 4;
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  target_length -= kCreateDirLimit;
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath::StringType long_name_str = FPL("long_name_");
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  long_name_str.resize(target_length, '_');
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath long_name = sub_a.Append(FilePath(long_name_str));
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath deep_file = long_name.Append(sub_long_rel).Append(deep_txt);
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(MAX_PATH - kCreateDirLimit, deep_file.value().length());
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath sub_long = deep_file.DirName();
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::CreateDirectory(sub_long));
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(deep_file, bogus_content);
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath base_b = temp_dir_.path().Append(FPL("base_b"));
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::CreateDirectory(base_b));
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath to_sub_a = base_b.Append(FPL("to_sub_a"));
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::CreateDirectory(to_sub_a));
4773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::win::ScopedHandle reparse_to_sub_a(
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::CreateFile(to_sub_a.value().c_str(),
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   FILE_ALL_ACCESS,
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   NULL,
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   OPEN_EXISTING,
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   FILE_FLAG_BACKUP_SEMANTICS,  // Needed to open a directory.
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   NULL));
4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(reparse_to_sub_a.IsValid());
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(SetReparsePoint(reparse_to_sub_a, sub_a));
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath to_base_b = base_b.Append(FPL("to_base_b"));
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::CreateDirectory(to_base_b));
4903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::win::ScopedHandle reparse_to_base_b(
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::CreateFile(to_base_b.value().c_str(),
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   FILE_ALL_ACCESS,
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   NULL,
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   OPEN_EXISTING,
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   FILE_FLAG_BACKUP_SEMANTICS,  // Needed to open a directory.
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   NULL));
4983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(reparse_to_base_b.IsValid());
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(SetReparsePoint(reparse_to_base_b, base_b));
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath to_sub_long = base_b.Append(FPL("to_sub_long"));
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::CreateDirectory(to_sub_long));
5033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  base::win::ScopedHandle reparse_to_sub_long(
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ::CreateFile(to_sub_long.value().c_str(),
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   FILE_ALL_ACCESS,
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   NULL,
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   OPEN_EXISTING,
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   FILE_FLAG_BACKUP_SEMANTICS,  // Needed to open a directory.
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   NULL));
5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(reparse_to_sub_long.IsValid());
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(SetReparsePoint(reparse_to_sub_long, sub_long));
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Normalize a junction free path: base_a\sub_a\file.txt .
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath normalized_path;
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::NormalizeFilePath(file_txt, &normalized_path));
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check that the path base_b\to_sub_a\file.txt can be normalized to exclude
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the junction to_sub_a.
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           &normalized_path));
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check that the path base_b\to_base_b\to_base_b\to_sub_a\file.txt can be
526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // normalized to exclude junctions to_base_b and to_sub_a .
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::NormalizeFilePath(base_b.Append(FPL("to_base_b"))
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                 .Append(FPL("to_base_b"))
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                 .Append(FPL("to_sub_a"))
530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                 .Append(FPL("file.txt")),
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                           &normalized_path));
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_STREQ(file_txt.value().c_str(), normalized_path.value().c_str());
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A long enough path will cause NormalizeFilePath() to fail.  Make a long
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // path using to_base_b many times, and check that paths long enough to fail
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // do not cause a crash.
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath long_path = base_b;
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const int kLengthLimit = MAX_PATH + 200;
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  while (long_path.value().length() <= kLengthLimit) {
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    long_path = long_path.Append(FPL("to_base_b"));
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  long_path = long_path.Append(FPL("to_sub_a"))
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       .Append(FPL("file.txt"));
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(file_util::NormalizeFilePath(long_path, &normalized_path));
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Normalizing the junction to deep.txt should fail, because the expanded
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // path to deep.txt is longer than MAX_PATH.
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(file_util::NormalizeFilePath(to_sub_long.Append(deep_txt),
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &normalized_path));
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete the reparse points, and see that NormalizeFilePath() fails
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to traverse them.
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(DeleteReparsePoint(reparse_to_sub_a));
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(DeleteReparsePoint(reparse_to_base_b));
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(DeleteReparsePoint(reparse_to_sub_long));
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(file_util::NormalizeFilePath(to_sub_a.Append(FPL("file.txt")),
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                            &normalized_path));
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // defined(OS_WIN)
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_POSIX)
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
566201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochTEST_F(FileUtilTest, CreateAndReadSymlinks) {
567201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  FilePath link_from = temp_dir_.path().Append(FPL("from_file"));
568201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  FilePath link_to = temp_dir_.path().Append(FPL("to_file"));
569201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  CreateTextFile(link_to, bogus_content);
570201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
571201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(file_util::CreateSymbolicLink(link_to, link_from))
572201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    << "Failed to create file symlink.";
573201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
574201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // If we created the link properly, we should be able to read the
575201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // contents through it.
576201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  std::wstring contents = ReadTextFile(link_from);
577201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(contents, bogus_content);
578201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
579201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  FilePath result;
580201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(file_util::ReadSymbolicLink(link_from, &result));
581201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(link_to.value(), result.value());
582201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
583201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Link to a directory.
584201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  link_from = temp_dir_.path().Append(FPL("from_dir"));
585201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  link_to = temp_dir_.path().Append(FPL("to_dir"));
586201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  file_util::CreateDirectory(link_to);
587201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
588201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(file_util::CreateSymbolicLink(link_to, link_from))
589201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    << "Failed to create directory symlink.";
590201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
591201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Test failures.
592201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_FALSE(file_util::CreateSymbolicLink(link_to, link_to));
593201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_FALSE(file_util::ReadSymbolicLink(link_to, &result));
594201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  FilePath missing = temp_dir_.path().Append(FPL("missing"));
595201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_FALSE(file_util::ReadSymbolicLink(missing, &result));
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
598201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
599201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// The following test of NormalizeFilePath() require that we create a symlink.
600201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// This can not be done on Windows before Vista.  On Vista, creating a symlink
601201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// requires privilege "SeCreateSymbolicLinkPrivilege".
602201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// TODO(skerner): Investigate the possibility of giving base_unittests the
603201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// privileges required to create a symlink.
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, NormalizeFilePathSymlinks) {
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath normalized_path;
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Link one file to another.
6083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath link_from = temp_dir_.path().Append(FPL("from_file"));
6093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath link_to = temp_dir_.path().Append(FPL("to_file"));
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(link_to, bogus_content);
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
612201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(file_util::CreateSymbolicLink(link_to, link_from))
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    << "Failed to create file symlink.";
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check that NormalizeFilePath sees the link.
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::NormalizeFilePath(link_from, &normalized_path));
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(link_to != link_from);
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(link_to.BaseName().value(), normalized_path.BaseName().value());
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(link_to.BaseName().value(), normalized_path.BaseName().value());
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Link to a directory.
6223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  link_from = temp_dir_.path().Append(FPL("from_dir"));
6233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  link_to = temp_dir_.path().Append(FPL("to_dir"));
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(link_to);
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
626201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(file_util::CreateSymbolicLink(link_to, link_from))
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    << "Failed to create directory symlink.";
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(file_util::NormalizeFilePath(link_from, &normalized_path))
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    << "Links to directories should return false.";
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test that a loop in the links causes NormalizeFilePath() to return false.
6333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  link_from = temp_dir_.path().Append(FPL("link_a"));
6343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  link_to = temp_dir_.path().Append(FPL("link_b"));
635201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(file_util::CreateSymbolicLink(link_to, link_from))
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    << "Failed to create loop symlink a.";
637201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(file_util::CreateSymbolicLink(link_from, link_to))
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    << "Failed to create loop symlink b.";
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Infinite loop!
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(file_util::NormalizeFilePath(link_from, &normalized_path));
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // defined(OS_POSIX)
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, DeleteNonExistent) {
6463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath non_existent = temp_dir_.path().AppendASCII("bogus_file_dne.foobar");
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(file_util::PathExists(non_existent));
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(non_existent, false));
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(file_util::PathExists(non_existent));
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(non_existent, true));
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(file_util::PathExists(non_existent));
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, DeleteFile) {
656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file
6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_name = temp_dir_.path().Append(FPL("Test DeleteFile 1.txt"));
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_name, bogus_content);
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(file_name));
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure it's deleted
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(file_name, false));
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_util::PathExists(file_name));
664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test recursive case, create a new file
6663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file_name = temp_dir_.path().Append(FPL("Test DeleteFile 2.txt"));
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_name, bogus_content);
668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name));
669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure it's deleted
671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(file_name, true));
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_util::PathExists(file_name));
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that the Delete function works for wild cards, especially
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// with the recursion flag.  Also coincidentally tests PathExists.
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(erikkay): see if anyone's actually using this feature of the API
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, DeleteWildCard) {
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a file and a directory
6813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_name = temp_dir_.path().Append(FPL("Test DeleteWildCard.txt"));
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_name, bogus_content);
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(file_name));
684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath subdir_path = temp_dir_.path().Append(FPL("DeleteWildCardDir"));
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(subdir_path);
687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(subdir_path));
688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create the wildcard path
6903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath directory_contents = temp_dir_.path();
691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  directory_contents = directory_contents.Append(FPL("*"));
692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Delete non-recursively and check that only the file is deleted
694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(directory_contents, false));
695c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(file_name));
696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(subdir_path));
697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Delete recursively and make sure all contents are deleted
699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(directory_contents, true));
700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(file_name));
701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(subdir_path));
702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(erikkay): see if anyone's actually using this feature of the API
705c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, DeleteNonExistantWildCard) {
706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a file and a directory
7073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath subdir_path =
7083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FPL("DeleteNonExistantWildCard"));
709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(subdir_path);
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(subdir_path));
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create the wildcard path
713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath directory_contents = subdir_path;
714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  directory_contents = directory_contents.Append(FPL("*"));
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete non-recursively and check nothing got deleted
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(directory_contents, false));
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::PathExists(subdir_path));
719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete recursively and check nothing got deleted
721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(directory_contents, true));
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::PathExists(subdir_path));
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests non-recursive Delete() for a directory.
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, DeleteDirNonRecursive) {
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a subdirectory and put a file and two directories inside.
7293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath test_subdir = temp_dir_.path().Append(FPL("DeleteDirNonRecursive"));
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(test_subdir);
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(test_subdir));
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath file_name = test_subdir.Append(FPL("Test DeleteDir.txt"));
734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_name, bogus_content);
735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(file_name));
736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath subdir_path1 = test_subdir.Append(FPL("TestSubDir1"));
738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(subdir_path1);
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(subdir_path1));
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath subdir_path2 = test_subdir.Append(FPL("TestSubDir2"));
742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(subdir_path2);
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(subdir_path2));
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete non-recursively and check that the empty dir got deleted
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(subdir_path2, false));
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_util::PathExists(subdir_path2));
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete non-recursively and check that nothing got deleted
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_util::Delete(test_subdir, false));
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::PathExists(test_subdir));
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::PathExists(file_name));
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::PathExists(subdir_path1));
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests recursive Delete() for a directory.
757c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, DeleteDirRecursive) {
758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a subdirectory and put a file and two directories inside.
7593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath test_subdir = temp_dir_.path().Append(FPL("DeleteDirRecursive"));
760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(test_subdir);
761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(test_subdir));
762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath file_name = test_subdir.Append(FPL("Test DeleteDirRecursive.txt"));
764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateTextFile(file_name, bogus_content);
765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(file_name));
766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath subdir_path1 = test_subdir.Append(FPL("TestSubDir1"));
768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(subdir_path1);
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(subdir_path1));
770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath subdir_path2 = test_subdir.Append(FPL("TestSubDir2"));
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  file_util::CreateDirectory(subdir_path2);
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::PathExists(subdir_path2));
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete recursively and check that the empty dir got deleted
776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(subdir_path2, true));
777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_util::PathExists(subdir_path2));
778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Delete recursively and check that everything got deleted
780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(test_subdir, true));
781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_util::PathExists(file_name));
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_util::PathExists(subdir_path1));
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_util::PathExists(test_subdir));
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
786c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, MoveFileNew) {
787c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file
788c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
7893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
790c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
791c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
792c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
7933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The destination.
7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_name_to = temp_dir_.path().Append(
7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      FILE_PATH_LITERAL("Move_Test_File_Destination.txt"));
796c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(file_util::PathExists(file_name_to));
797c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
798c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::Move(file_name_from, file_name_to));
799c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
800c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check everything has been moved.
801c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(file_name_from));
802c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
803c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
804c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
805c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, MoveFileExists) {
806c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file
807c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
8083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
809c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
810c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
811c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
8123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // The destination name.
8133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_name_to = temp_dir_.path().Append(
8143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      FILE_PATH_LITERAL("Move_Test_File_Destination.txt"));
815c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_to, L"Old file content");
816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_to));
817c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
818c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::Move(file_name_from, file_name_to));
819c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
820c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check everything has been moved.
821c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(file_name_from));
822c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
823c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(L"Gooooooooooooooooooooogle" == ReadTextFile(file_name_to));
824c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
825c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
826c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, MoveFileDirExists) {
827c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file
828c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
8293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
830c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
831c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
832c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
833c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The destination directory
834c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_to =
8353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Destination"));
836c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_to);
837c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_to));
838c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
839c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::Move(file_name_from, dir_name_to));
840c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
841c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
842c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
843c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, MoveNew) {
844c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a directory
845c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_from =
8463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Move_From_Subdir"));
847c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_from);
848c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_from));
849c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
850c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the directory
851c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
852c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
853c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
854c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
855c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
8563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Move the directory.
8573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath dir_name_to =
8583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Move_To_Subdir"));
859c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_to =
860c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
861c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
862c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(file_util::PathExists(dir_name_to));
863c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
864c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::Move(dir_name_from, dir_name_to));
865c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
866c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check everything has been moved.
867c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(dir_name_from));
868c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(file_name_from));
869c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dir_name_to));
870c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
871c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
872c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
873c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, MoveExist) {
874c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a directory
875c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_from =
8763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Move_From_Subdir"));
877c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_from);
878c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_from));
879c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
880c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the directory
881c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
882c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
883c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
884c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
885c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
886c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Move the directory
887c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_exists =
8883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Destination"));
889c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
890c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_to =
891c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_exists.Append(FILE_PATH_LITERAL("Move_To_Subdir"));
892c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_to =
893c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("Move_Test_File.txt"));
894c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
895c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create the destination directory.
896c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_exists);
897c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_exists));
898c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
899c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::Move(dir_name_from, dir_name_to));
900c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
901c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check everything has been moved.
902c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(dir_name_from));
903c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(file_name_from));
904c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dir_name_to));
905c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
906c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
907c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
908c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CopyDirectoryRecursivelyNew) {
909c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a directory.
910c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_from =
9113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
912c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_from);
913c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_from));
914c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
915c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the directory.
916c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
917c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
918c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
919c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
920c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
921c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a subdirectory.
922c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath subdir_name_from =
923c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
924c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(subdir_name_from);
925c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(subdir_name_from));
926c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
927c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the subdirectory.
928c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name2_from =
929c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
930c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
931c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name2_from));
932c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
933c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Copy the directory recursively.
934c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_to =
9353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
936c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_to =
937c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
938c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath subdir_name_to =
939c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
940c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name2_to =
941c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      subdir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
942c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
943c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(file_util::PathExists(dir_name_to));
944c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
945c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CopyDirectory(dir_name_from, dir_name_to, true));
946c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
947c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check everything has been copied.
948c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dir_name_from));
949c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_from));
950c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(subdir_name_from));
951c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name2_from));
952c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dir_name_to));
953c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
954c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(subdir_name_to));
955c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name2_to));
956c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
957c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
958c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CopyDirectoryRecursivelyExists) {
959c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a directory.
960c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_from =
9613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
962c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_from);
963c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_from));
964c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
965c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the directory.
966c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
967c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
968c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
969c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
970c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
971c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a subdirectory.
972c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath subdir_name_from =
973c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
974c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(subdir_name_from);
975c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(subdir_name_from));
976c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
977c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the subdirectory.
978c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name2_from =
979c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
980c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
981c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name2_from));
982c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
983c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Copy the directory recursively.
984c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_exists =
9853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Destination"));
986c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
987c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_to =
988c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_exists.Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
989c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_to =
990c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
991c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath subdir_name_to =
992c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
993c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name2_to =
994c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      subdir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
995c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
996c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create the destination directory.
997c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_exists);
998c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_exists));
999c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1000c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CopyDirectory(dir_name_from, dir_name_exists, true));
1001c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1002c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check everything has been copied.
1003c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dir_name_from));
1004c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_from));
1005c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(subdir_name_from));
1006c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name2_from));
1007c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dir_name_to));
1008c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
1009c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(subdir_name_to));
1010c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name2_to));
1011c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1012c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1013c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CopyDirectoryNew) {
1014c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a directory.
1015c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_from =
10163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1017c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_from);
1018c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_from));
1019c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1020c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the directory.
1021c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
1022c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1023c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1024c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
1025c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1026c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a subdirectory.
1027c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath subdir_name_from =
1028c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
1029c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(subdir_name_from);
1030c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(subdir_name_from));
1031c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1032c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the subdirectory.
1033c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name2_from =
1034c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1035c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
1036c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name2_from));
1037c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1038c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Copy the directory not recursively.
1039c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_to =
10403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1041c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_to =
1042c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1043c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath subdir_name_to =
1044c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
1045c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1046c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(file_util::PathExists(dir_name_to));
1047c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1048c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CopyDirectory(dir_name_from, dir_name_to, false));
1049c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1050c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check everything has been copied.
1051c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dir_name_from));
1052c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_from));
1053c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(subdir_name_from));
1054c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name2_from));
1055c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dir_name_to));
1056c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
1057c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(subdir_name_to));
1058c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1059c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1060c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CopyDirectoryExists) {
1061c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a directory.
1062c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_from =
10633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1064c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_from);
1065c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_from));
1066c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1067c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the directory.
1068c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
1069c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1070c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1071c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
1072c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1073c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a subdirectory.
1074c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath subdir_name_from =
1075c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("Subdir"));
1076c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(subdir_name_from);
1077c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(subdir_name_from));
1078c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1079c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the subdirectory.
1080c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name2_from =
1081c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      subdir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1082c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name2_from, L"Gooooooooooooooooooooogle");
1083c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name2_from));
1084c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1085c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Copy the directory not recursively.
1086c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_to =
10873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Copy_To_Subdir"));
1088c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_to =
1089c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1090c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath subdir_name_to =
1091c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("Subdir"));
1092c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1093c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create the destination directory.
1094c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_to);
1095c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_to));
1096c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1097c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CopyDirectory(dir_name_from, dir_name_to, false));
1098c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1099c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check everything has been copied.
1100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dir_name_from));
1101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_from));
1102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(subdir_name_from));
1103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name2_from));
1104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dir_name_to));
1105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
1106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(subdir_name_to));
1107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToNew) {
1110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file
1111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
11123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
1115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The destination name
11173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_name_to = temp_dir_.path().Append(
11183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      FILE_PATH_LITERAL("Copy_Test_File_Destination.txt"));
1119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(file_util::PathExists(file_name_to));
1120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CopyDirectory(file_name_from, file_name_to, true));
1122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check the has been copied
1124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
1125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToExisting) {
1128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file
1129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
11303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
1133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The destination name
11353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_name_to = temp_dir_.path().Append(
11363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      FILE_PATH_LITERAL("Copy_Test_File_Destination.txt"));
1137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_to, L"Old file content");
1138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_to));
1139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CopyDirectory(file_name_from, file_name_to, true));
1141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check the has been copied
1143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
1144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(L"Gooooooooooooooooooooogle" == ReadTextFile(file_name_to));
1145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CopyFileWithCopyDirectoryRecursiveToExistingDirectory) {
1148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file
1149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
11503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
1153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The destination
1155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_to =
11563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Destination"));
1157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_to);
1158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_to));
1159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_to =
1160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CopyDirectory(file_name_from, dir_name_to, true));
1163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check the has been copied
1165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
1166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CopyFile) {
1169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a directory
1170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_from =
11713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("Copy_From_Subdir"));
1172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_from);
1173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_from));
1174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the directory
1176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
1177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("Copy_Test_File.txt"));
1178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const std::wstring file_contents(L"Gooooooooooooooooooooogle");
1179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, file_contents);
1180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
1181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Copy the file.
1183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dest_file = dir_name_from.Append(FILE_PATH_LITERAL("DestFile.txt"));
1184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::CopyFile(file_name_from, dest_file));
1185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Copy the file to another location using '..' in the path.
1187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dest_file2(dir_name_from);
1188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  dest_file2 = dest_file2.AppendASCII("..");
1189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  dest_file2 = dest_file2.AppendASCII("DestFile.txt");
1190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::CopyFile(file_name_from, dest_file2));
1191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dest_file2_test(dir_name_from);
1193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  dest_file2_test = dest_file2_test.DirName();
1194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  dest_file2_test = dest_file2_test.AppendASCII("DestFile.txt");
1195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check everything has been copied.
1197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_from));
1198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dest_file));
1199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const std::wstring read_contents = ReadTextFile(dest_file);
1200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(file_contents, read_contents);
1201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dest_file2_test));
1202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dest_file2));
1203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// TODO(erikkay): implement
1206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
1207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, GetFileCreationLocalTime) {
12083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file_name = temp_dir_.path().Append(L"Test File.txt");
1209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SYSTEMTIME start_time;
1211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GetLocalTime(&start_time);
1212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Sleep(100);
1213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name, L"New file!");
1214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  Sleep(100);
1215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SYSTEMTIME end_time;
1216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  GetLocalTime(&end_time);
1217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SYSTEMTIME file_creation_time;
1219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::GetFileCreationLocalTime(file_name.value(), &file_creation_time);
1220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FILETIME start_filetime;
1222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SystemTimeToFileTime(&start_time, &start_filetime);
1223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FILETIME end_filetime;
1224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SystemTimeToFileTime(&end_time, &end_filetime);
1225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FILETIME file_creation_filetime;
1226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  SystemTimeToFileTime(&file_creation_time, &file_creation_filetime);
1227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(-1, CompareFileTime(&start_filetime, &file_creation_filetime)) <<
1229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "start time: " << FileTimeAsUint64(start_filetime) << ", " <<
1230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "creation time: " << FileTimeAsUint64(file_creation_filetime);
1231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(-1, CompareFileTime(&file_creation_filetime, &end_filetime)) <<
1233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "creation time: " << FileTimeAsUint64(file_creation_filetime) << ", " <<
1234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    "end time: " << FileTimeAsUint64(end_filetime);
1235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(DeleteFile(file_name.value().c_str()));
1237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
1239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// file_util winds up using autoreleased objects on the Mac, so this needs
1241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// to be a PlatformTest.
1242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef PlatformTest ReadOnlyFileUtilTest;
1243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(ReadOnlyFileUtilTest, ContentsEqual) {
1245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath data_dir;
1246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &data_dir));
1247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  data_dir = data_dir.Append(FILE_PATH_LITERAL("base"))
1248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                     .Append(FILE_PATH_LITERAL("data"))
1249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                     .Append(FILE_PATH_LITERAL("file_util_unittest"));
1250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(data_dir));
1251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath original_file =
1253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("original.txt"));
1254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath same_file =
1255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("same.txt"));
1256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath same_length_file =
1257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("same_length.txt"));
1258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath different_file =
1259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("different.txt"));
1260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath different_first_file =
1261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("different_first.txt"));
1262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath different_last_file =
1263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("different_last.txt"));
1264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath empty1_file =
1265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("empty1.txt"));
1266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath empty2_file =
1267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("empty2.txt"));
1268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath shortened_file =
1269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("shortened.txt"));
1270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath binary_file =
1271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("binary_file.bin"));
1272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath binary_file_same =
1273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("binary_file_same.bin"));
1274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath binary_file_diff =
1275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("binary_file_diff.bin"));
1276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::ContentsEqual(original_file, original_file));
1278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::ContentsEqual(original_file, same_file));
1279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContentsEqual(original_file, same_length_file));
1280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContentsEqual(original_file, different_file));
1281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContentsEqual(
1282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      FilePath(FILE_PATH_LITERAL("bogusname")),
1283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      FilePath(FILE_PATH_LITERAL("bogusname"))));
1284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContentsEqual(original_file, different_first_file));
1285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContentsEqual(original_file, different_last_file));
1286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::ContentsEqual(empty1_file, empty2_file));
1287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContentsEqual(original_file, shortened_file));
1288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContentsEqual(shortened_file, original_file));
1289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::ContentsEqual(binary_file, binary_file_same));
1290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContentsEqual(binary_file, binary_file_diff));
1291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(ReadOnlyFileUtilTest, TextContentsEqual) {
1294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath data_dir;
1295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &data_dir));
1296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  data_dir = data_dir.Append(FILE_PATH_LITERAL("base"))
1297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                     .Append(FILE_PATH_LITERAL("data"))
1298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                     .Append(FILE_PATH_LITERAL("file_util_unittest"));
1299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(data_dir));
1300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath original_file =
1302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("original.txt"));
1303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath same_file =
1304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("same.txt"));
1305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath crlf_file =
1306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("crlf.txt"));
1307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath shortened_file =
1308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("shortened.txt"));
1309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath different_file =
1310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("different.txt"));
1311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath different_first_file =
1312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("different_first.txt"));
1313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath different_last_file =
1314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("different_last.txt"));
1315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath first1_file =
1316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("first1.txt"));
1317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath first2_file =
1318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("first2.txt"));
1319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath empty1_file =
1320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("empty1.txt"));
1321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath empty2_file =
1322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("empty2.txt"));
1323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath blank_line_file =
1324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("blank_line.txt"));
1325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath blank_line_crlf_file =
1326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      data_dir.Append(FILE_PATH_LITERAL("blank_line_crlf.txt"));
1327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::TextContentsEqual(original_file, same_file));
1329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::TextContentsEqual(original_file, crlf_file));
1330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::TextContentsEqual(original_file, shortened_file));
1331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::TextContentsEqual(original_file, different_file));
1332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::TextContentsEqual(original_file,
1333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            different_first_file));
1334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::TextContentsEqual(original_file,
1335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            different_last_file));
1336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::TextContentsEqual(first1_file, first2_file));
1337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::TextContentsEqual(empty1_file, empty2_file));
1338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::TextContentsEqual(original_file, empty1_file));
1339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::TextContentsEqual(blank_line_file,
1340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                           blank_line_crlf_file));
1341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// We don't need equivalent functionality outside of Windows.
1344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
1345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, ResolveShortcutTest) {
13463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath target_file = temp_dir_.path().Append(L"Target.txt");
1347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(target_file, L"This is the target.");
1348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath link_file = temp_dir_.path().Append(L"Link.lnk");
1350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  HRESULT result;
1352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  IShellLink *shell = NULL;
1353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  IPersistFile *persist = NULL;
1354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CoInitialize(NULL);
1356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Temporarily create a shortcut for test
1357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  result = CoCreateInstance(CLSID_ShellLink, NULL,
1358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          CLSCTX_INPROC_SERVER, IID_IShellLink,
1359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                          reinterpret_cast<LPVOID*>(&shell));
1360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(SUCCEEDED(result));
1361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  result = shell->QueryInterface(IID_IPersistFile,
1362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                             reinterpret_cast<LPVOID*>(&persist));
1363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(SUCCEEDED(result));
1364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  result = shell->SetPath(target_file.value().c_str());
1365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(SUCCEEDED(result));
1366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  result = shell->SetDescription(L"ResolveShortcutTest");
1367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(SUCCEEDED(result));
1368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  result = persist->Save(link_file.value().c_str(), TRUE);
1369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(SUCCEEDED(result));
1370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (persist)
1371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    persist->Release();
1372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (shell)
1373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    shell->Release();
1374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool is_solved;
1376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  is_solved = file_util::ResolveShortcut(&link_file);
1377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(is_solved);
1378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::wstring contents;
1379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  contents = ReadTextFile(link_file);
1380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(L"This is the target.", contents);
1381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Cleaning
1383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DeleteFile(target_file.value().c_str());
1384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DeleteFile(link_file.value().c_str());
1385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CoUninitialize();
1386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CreateShortcutTest) {
1389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const wchar_t file_contents[] = L"This is another target.";
13903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath target_file = temp_dir_.path().Append(L"Target1.txt");
1391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(target_file, file_contents);
1392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath link_file = temp_dir_.path().Append(L"Link1.lnk");
1394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CoInitialize(NULL);
1396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CreateShortcutLink(target_file.value().c_str(),
1397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            link_file.value().c_str(),
1398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            NULL, NULL, NULL, NULL, 0, NULL));
1399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath resolved_name = link_file;
1400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::ResolveShortcut(&resolved_name));
1401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::wstring read_contents = ReadTextFile(resolved_name);
1402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(file_contents, read_contents);
1403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DeleteFile(target_file.value().c_str());
1405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  DeleteFile(link_file.value().c_str());
1406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CoUninitialize();
1407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CopyAndDeleteDirectoryTest) {
1410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a directory
1411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir_name_from =
14123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("CopyAndDelete_From_Subdir"));
1413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::CreateDirectory(dir_name_from);
1414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(dir_name_from));
1415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a file under the directory
1417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_from =
1418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_from.Append(FILE_PATH_LITERAL("CopyAndDelete_Test_File.txt"));
1419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file_name_from, L"Gooooooooooooooooooooogle");
1420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::PathExists(file_name_from));
1421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Move the directory by using CopyAndDeleteDirectory
14233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath dir_name_to = temp_dir_.path().Append(
1424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      FILE_PATH_LITERAL("CopyAndDelete_To_Subdir"));
1425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file_name_to =
1426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir_name_to.Append(FILE_PATH_LITERAL("CopyAndDelete_Test_File.txt"));
1427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_FALSE(file_util::PathExists(dir_name_to));
1429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CopyAndDeleteDirectory(dir_name_from, dir_name_to));
1431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check everything has been moved.
1433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(dir_name_from));
1434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(file_name_from));
1435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(dir_name_to));
1436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(file_name_to));
1437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, GetTempDirTest) {
1440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const TCHAR* kTmpKey = _T("TMP");
1441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const TCHAR* kTmpValues[] = {
1442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    _T(""), _T("C:"), _T("C:\\"), _T("C:\\tmp"), _T("C:\\tmp\\")
1443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  };
1444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Save the original $TMP.
1445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  size_t original_tmp_size;
1446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TCHAR* original_tmp;
1447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_EQ(0, ::_tdupenv_s(&original_tmp, &original_tmp_size, kTmpKey));
1448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // original_tmp may be NULL.
1449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (unsigned int i = 0; i < arraysize(kTmpValues); ++i) {
1451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    FilePath path;
1452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ::_tputenv_s(kTmpKey, kTmpValues[i]);
1453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    file_util::GetTempDir(&path);
1454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_TRUE(path.IsAbsolute()) << "$TMP=" << kTmpValues[i] <<
1455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        " result=" << path.value();
1456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Restore the original $TMP.
1459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (original_tmp) {
1460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ::_tputenv_s(kTmpKey, original_tmp);
1461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    free(original_tmp);
1462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } else {
1463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ::_tputenv_s(kTmpKey, _T(""));
1464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // OS_WIN
1467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CreateTemporaryFileTest) {
1469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath temp_files[3];
1470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 3; i++) {
1471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(file_util::CreateTemporaryFile(&(temp_files[i])));
1472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_TRUE(file_util::PathExists(temp_files[i]));
1473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_FALSE(file_util::DirectoryExists(temp_files[i]));
1474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 3; i++)
1476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_FALSE(temp_files[i] == temp_files[(i+1)%3]);
1477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < 3; i++)
1478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_TRUE(file_util::Delete(temp_files[i], false));
1479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CreateAndOpenTemporaryFileTest) {
1482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath names[3];
1483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FILE *fps[3];
1484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int i;
1485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create; make sure they are open and exist.
1487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (i = 0; i < 3; ++i) {
1488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    fps[i] = file_util::CreateAndOpenTemporaryFile(&(names[i]));
1489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(fps[i]);
1490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_TRUE(file_util::PathExists(names[i]));
1491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Make sure all names are unique.
1494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (i = 0; i < 3; ++i) {
1495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_FALSE(names[i] == names[(i+1)%3]);
1496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Close and delete.
1499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (i = 0; i < 3; ++i) {
1500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_TRUE(file_util::CloseFile(fps[i]));
1501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_TRUE(file_util::Delete(names[i], false));
1502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CreateNewTempDirectoryTest) {
1506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath temp_dir;
1507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::CreateNewTempDirectory(FilePath::StringType(),
1508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                &temp_dir));
1509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(temp_dir));
1510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::Delete(temp_dir, false));
1511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1513c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, CreateNewTemporaryDirInDirTest) {
1514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath new_dir;
1515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::CreateTemporaryDirInDir(
15163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                  temp_dir_.path(),
1517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  FILE_PATH_LITERAL("CreateNewTemporaryDirInDirTest"),
1518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  &new_dir));
1519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::PathExists(new_dir));
15203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(temp_dir_.path().IsParent(new_dir));
1521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::Delete(new_dir, false));
1522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, GetShmemTempDirTest) {
1525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir;
1526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::GetShmemTempDir(&dir));
1527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::DirectoryExists(dir));
1528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, CreateDirectoryTest) {
1531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath test_root =
15323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("create_directory_test"));
1533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
1534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath test_path =
1535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      test_root.Append(FILE_PATH_LITERAL("dir\\tree\\likely\\doesnt\\exist\\"));
1536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX)
1537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath test_path =
1538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      test_root.Append(FILE_PATH_LITERAL("dir/tree/likely/doesnt/exist/"));
1539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
1540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(test_path));
1542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CreateDirectory(test_path));
1543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(test_path));
1544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // CreateDirectory returns true if the DirectoryExists returns true.
1545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CreateDirectory(test_path));
1546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Doesn't work to create it on top of a non-dir
1548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  test_path = test_path.Append(FILE_PATH_LITERAL("foobar.txt"));
1549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(test_path));
1550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(test_path, L"test file");
1551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(test_path));
1552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::CreateDirectory(test_path));
1553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::Delete(test_root, true));
1555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(test_root));
1556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(test_path));
1557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Verify assumptions made by the Windows implementation:
1559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // 1. The current directory always exists.
1560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // 2. The root directory always exists.
1561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::DirectoryExists(
1562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      FilePath(FilePath::kCurrentDirectory)));
1563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath top_level = test_root;
1564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  while (top_level != top_level.DirName()) {
1565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    top_level = top_level.DirName();
1566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::DirectoryExists(top_level));
1568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Given these assumptions hold, it should be safe to
1570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // test that "creating" these directories succeeds.
1571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CreateDirectory(
1572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      FilePath(FilePath::kCurrentDirectory)));
1573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CreateDirectory(top_level));
1574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
1576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath invalid_drive(FILE_PATH_LITERAL("o:\\"));
1577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath invalid_path =
1578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      invalid_drive.Append(FILE_PATH_LITERAL("some\\inaccessible\\dir"));
1579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (!file_util::PathExists(invalid_drive)) {
1580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_FALSE(file_util::CreateDirectory(invalid_path));
1581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
1583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, DetectDirectoryTest) {
1586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check a directory
1587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath test_root =
15883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("detect_directory_test"));
1589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(test_root));
1590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CreateDirectory(test_root));
1591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(test_root));
1592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::DirectoryExists(test_root));
1593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Check a file
1595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath test_path =
1596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      test_root.Append(FILE_PATH_LITERAL("foobar.txt"));
1597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::PathExists(test_path));
1598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(test_path, L"test file");
1599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::PathExists(test_path));
1600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::DirectoryExists(test_path));
1601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::Delete(test_path, false));
1602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::Delete(test_root, true));
1604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, FileEnumeratorTest) {
1607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test an empty directory.
16083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file_util::FileEnumerator f0(temp_dir_.path(), true, FILES_AND_DIRECTORIES);
1609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(f0.Next().value(), FILE_PATH_LITERAL(""));
1610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(f0.Next().value(), FILE_PATH_LITERAL(""));
1611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test an empty directory, non-recursively, including "..".
16133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file_util::FileEnumerator f0_dotdot(temp_dir_.path(), false,
1614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      static_cast<file_util::FileEnumerator::FILE_TYPE>(
1615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          FILES_AND_DIRECTORIES | file_util::FileEnumerator::INCLUDE_DOT_DOT));
16163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(temp_dir_.path().Append(FILE_PATH_LITERAL("..")).value(),
1617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            f0_dotdot.Next().value());
1618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(FILE_PATH_LITERAL(""),
1619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            f0_dotdot.Next().value());
1620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // create the directories
16223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath dir1 = temp_dir_.path().Append(FILE_PATH_LITERAL("dir1"));
1623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CreateDirectory(dir1));
16243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath dir2 = temp_dir_.path().Append(FILE_PATH_LITERAL("dir2"));
1625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CreateDirectory(dir2));
1626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir2inner = dir2.Append(FILE_PATH_LITERAL("inner"));
1627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::CreateDirectory(dir2inner));
1628c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1629c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // create the files
1630c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir2file = dir2.Append(FILE_PATH_LITERAL("dir2file.txt"));
1631c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(dir2file, L"");
1632c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath dir2innerfile = dir2inner.Append(FILE_PATH_LITERAL("innerfile.txt"));
1633c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(dir2innerfile, L"");
16343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file1 = temp_dir_.path().Append(FILE_PATH_LITERAL("file1.txt"));
1635c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file1, L"");
1636c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath file2_rel =
1637c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      dir2.Append(FilePath::kParentDirectory)
1638c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          .Append(FILE_PATH_LITERAL("file2.txt"));
1639c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CreateTextFile(file2_rel, L"");
16403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath file2_abs = temp_dir_.path().Append(FILE_PATH_LITERAL("file2.txt"));
1641c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1642c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Only enumerate files.
16433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file_util::FileEnumerator f1(temp_dir_.path(), true,
1644c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                               file_util::FileEnumerator::FILES);
1645c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FindResultCollector c1(f1);
1646c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c1.HasFile(file1));
1647c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c1.HasFile(file2_abs));
1648c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c1.HasFile(dir2file));
1649c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c1.HasFile(dir2innerfile));
1650c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(c1.size(), 4);
1651c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1652c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Only enumerate directories.
16533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file_util::FileEnumerator f2(temp_dir_.path(), true,
1654c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                               file_util::FileEnumerator::DIRECTORIES);
1655c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FindResultCollector c2(f2);
1656c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c2.HasFile(dir1));
1657c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c2.HasFile(dir2));
1658c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c2.HasFile(dir2inner));
1659c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(c2.size(), 3);
1660c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1661c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Only enumerate directories non-recursively.
1662c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::FileEnumerator f2_non_recursive(
16633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path(), false, file_util::FileEnumerator::DIRECTORIES);
1664c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FindResultCollector c2_non_recursive(f2_non_recursive);
1665c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c2_non_recursive.HasFile(dir1));
1666c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c2_non_recursive.HasFile(dir2));
1667c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(c2_non_recursive.size(), 2);
1668c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1669c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Only enumerate directories, non-recursively, including "..".
1670c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  file_util::FileEnumerator f2_dotdot(
16713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path(), false,
1672c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      static_cast<file_util::FileEnumerator::FILE_TYPE>(
1673c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          file_util::FileEnumerator::DIRECTORIES |
1674c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott          file_util::FileEnumerator::INCLUDE_DOT_DOT));
1675c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FindResultCollector c2_dotdot(f2_dotdot);
1676c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c2_dotdot.HasFile(dir1));
1677c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c2_dotdot.HasFile(dir2));
16783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_TRUE(c2_dotdot.HasFile(
16793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL(".."))));
1680c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(c2_dotdot.size(), 3);
1681c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1682c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Enumerate files and directories.
16833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file_util::FileEnumerator f3(temp_dir_.path(), true, FILES_AND_DIRECTORIES);
1684c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FindResultCollector c3(f3);
1685c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c3.HasFile(dir1));
1686c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c3.HasFile(dir2));
1687c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c3.HasFile(file1));
1688c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c3.HasFile(file2_abs));
1689c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c3.HasFile(dir2file));
1690c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c3.HasFile(dir2inner));
1691c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c3.HasFile(dir2innerfile));
1692c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(c3.size(), 7);
1693c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1694c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Non-recursive operation.
16953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file_util::FileEnumerator f4(temp_dir_.path(), false, FILES_AND_DIRECTORIES);
1696c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FindResultCollector c4(f4);
1697c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c4.HasFile(dir2));
1698c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c4.HasFile(dir2));
1699c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c4.HasFile(file1));
1700c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c4.HasFile(file2_abs));
1701c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(c4.size(), 4);
1702c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1703c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Enumerate with a pattern.
17043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file_util::FileEnumerator f5(temp_dir_.path(), true, FILES_AND_DIRECTORIES,
1705c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      FILE_PATH_LITERAL("dir*"));
1706c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FindResultCollector c5(f5);
1707c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c5.HasFile(dir1));
1708c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c5.HasFile(dir2));
1709c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c5.HasFile(dir2file));
1710c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c5.HasFile(dir2inner));
1711c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(c5.HasFile(dir2innerfile));
1712c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(c5.size(), 5);
1713c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1714c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Make sure the destructor closes the find handle while in the middle of a
1715c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // query to allow TearDown to delete the directory.
17163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  file_util::FileEnumerator f6(temp_dir_.path(), true, FILES_AND_DIRECTORIES);
1717c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(f6.Next().value().empty());  // Should have found something
1718c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            // (we don't care what).
1719c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1720c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1721c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(FileUtilTest, Contains) {
17223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath data_dir =
17233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("FilePathTest"));
1724c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1725c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Create a fresh, empty copy of this directory.
1726c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (file_util::PathExists(data_dir)) {
1727c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ASSERT_TRUE(file_util::Delete(data_dir, true));
1728c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
1729c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::CreateDirectory(data_dir));
1730c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1731c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath foo(data_dir.Append(FILE_PATH_LITERAL("foo")));
1732c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath bar(foo.Append(FILE_PATH_LITERAL("bar.txt")));
1733c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath baz(data_dir.Append(FILE_PATH_LITERAL("baz.txt")));
1734c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath foobar(data_dir.Append(FILE_PATH_LITERAL("foobar.txt")));
1735c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1736c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Annoyingly, the directories must actually exist in order for realpath(),
1737c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // which Contains() relies on in posix, to work.
1738c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::CreateDirectory(foo));
1739c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::string data("hello");
1740c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::WriteFile(bar, data.c_str(), data.length()));
1741c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::WriteFile(baz, data.c_str(), data.length()));
1742c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ASSERT_TRUE(file_util::WriteFile(foobar, data.c_str(), data.length()));
1743c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1744c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::ContainsPath(foo, bar));
1745c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContainsPath(foo, baz));
1746c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContainsPath(foo, foobar));
1747c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContainsPath(foo, foo));
1748c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
1749c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Platform-specific concerns.
1750c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  FilePath foo_caps(data_dir.Append(FILE_PATH_LITERAL("FOO")));
1751c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#if defined(OS_WIN)
1752c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::ContainsPath(foo,
1753c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      foo_caps.Append(FILE_PATH_LITERAL("bar.txt"))));
1754c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(file_util::ContainsPath(foo,
1755c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      FilePath(foo.value() + FILE_PATH_LITERAL("/bar.txt"))));
1756c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_MACOSX)
1757c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // We can't really do this test on OS X since the case-sensitivity of the
1758c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // filesystem is configurable.
1759c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#elif defined(OS_POSIX)
1760c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_FALSE(file_util::ContainsPath(foo,
1761c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      foo_caps.Append(FILE_PATH_LITERAL("bar.txt"))));
1762c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif
1763c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
1764c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
17653345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickTEST_F(FileUtilTest, TouchFile) {
17663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath data_dir =
17673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      temp_dir_.path().Append(FILE_PATH_LITERAL("FilePathTest"));
1768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a fresh, empty copy of this directory.
1770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (file_util::PathExists(data_dir)) {
1771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ASSERT_TRUE(file_util::Delete(data_dir, true));
1772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
1773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::CreateDirectory(data_dir));
1774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath foobar(data_dir.Append(FILE_PATH_LITERAL("foobar.txt")));
1776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string data("hello");
1777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::WriteFile(foobar, data.c_str(), data.length()));
1778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::Time access_time;
17803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // This timestamp is divisible by one day (in local timezone),
17813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // to make it work on FAT too.
17823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(base::Time::FromString(L"Wed, 16 Nov 1994, 00:00:00",
17833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                     &access_time));
17843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time modification_time;
1786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Note that this timestamp is divisible by two (seconds) - FAT stores
1787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // modification times with 2s resolution.
1788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(base::Time::FromString(L"Tue, 15 Nov 1994, 12:45:26 GMT",
1789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              &modification_time));
17903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
17913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(file_util::TouchFile(foobar, access_time, modification_time));
17923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  base::PlatformFileInfo file_info;
1793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::GetFileInfo(foobar, &file_info));
17943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(file_info.last_accessed.ToInternalValue(),
17953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            access_time.ToInternalValue());
17963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(file_info.last_modified.ToInternalValue(),
17973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick            modification_time.ToInternalValue());
1798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1800c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(FileUtilTest, IsDirectoryEmpty) {
18013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  FilePath empty_dir = temp_dir_.path().Append(FILE_PATH_LITERAL("EmptyDir"));
1802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_FALSE(file_util::PathExists(empty_dir));
1804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::CreateDirectory(empty_dir));
1806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(file_util::IsDirectoryEmpty(empty_dir));
1808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath foo(empty_dir.Append(FILE_PATH_LITERAL("foo.txt")));
1810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string bar("baz");
1811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_util::WriteFile(foo, bar.c_str(), bar.length()));
1812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(file_util::IsDirectoryEmpty(empty_dir));
1814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1816c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace
1817