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