diff options
author | tonyg@chromium.org <tonyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-03 19:58:09 +0000 |
---|---|---|
committer | tonyg@chromium.org <tonyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-05-03 19:58:09 +0000 |
commit | 715fe2473792264b86294357d7f783a43c7961f1 (patch) | |
tree | 9bf76ab4e838efbd50480474ed4b0ce382d85814 /base/test/test_file_util_posix.cc | |
parent | 17c4ce62ff8cff51f81c0cd79622a095754695bb (diff) | |
download | chromium_src-715fe2473792264b86294357d7f783a43c7961f1.zip chromium_src-715fe2473792264b86294357d7f783a43c7961f1.tar.gz chromium_src-715fe2473792264b86294357d7f783a43c7961f1.tar.bz2 |
Revert 194664 "Delete CopyRecursiveDirNoCache from test_file_util."
Broke the results of the startup_benchmark on linux.
BUG=237858
> Delete CopyRecursiveDirNoCache from test_file_util.
>
> This function was used in only one place and that place was wrong.
>
> The implementation was long and complicated on Windows, and long and
> complicated and copied verbatim from elsewhere with 3 lines different on Posix.
>
> The place it was used was in the proxy launcher when copying the profile. It's
> not clear to me why we wouldn't want the profile files in the filesystem cache
> when running tests. Quite the opposite, we want the tests to run as fast as
> possible.
>
> The only place this should matter is in the startup tests. And the startup
> tests do things to the profile after it gets copied that should page some files
> back in! This adds another step to the startup tests to evict the profile files
> for cold startup tests only.
>
> This is a reland of r192940 which crashed on Mac. The previous perf startup
> test used the profile directory before it was initialized. That patch was in
> turn a reland r191854 which broke the startup test. The previous patch
> replaced the CopyRecursive call with CopyDirectory which does something
> slightly different. This new patch implements a CopyDirectoryContents function
> to do what's required here.
TBR=brettw@chromium.org
Review URL: https://codereview.chromium.org/14799003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@198175 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/test/test_file_util_posix.cc')
-rw-r--r-- | base/test/test_file_util_posix.cc | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/base/test/test_file_util_posix.cc b/base/test/test_file_util_posix.cc index 7c16cb18..731d976 100644 --- a/base/test/test_file_util_posix.cc +++ b/base/test/test_file_util_posix.cc @@ -80,6 +80,83 @@ bool DieFileDie(const base::FilePath& file, bool recurse) { return file_util::Delete(file, recurse); } +// Mostly a verbatim copy of CopyDirectory +bool CopyRecursiveDirNoCache(const base::FilePath& source_dir, + const base::FilePath& dest_dir) { + char top_dir[PATH_MAX]; + if (base::strlcpy(top_dir, source_dir.value().c_str(), + arraysize(top_dir)) >= arraysize(top_dir)) { + return false; + } + + // This function does not properly handle destinations within the source + base::FilePath real_to_path = dest_dir; + if (PathExists(real_to_path)) { + real_to_path = MakeAbsoluteFilePath(real_to_path); + if (real_to_path.empty()) + return false; + } else { + real_to_path = MakeAbsoluteFilePath(real_to_path.DirName()); + if (real_to_path.empty()) + return false; + } + if (real_to_path.value().compare(0, source_dir.value().size(), + source_dir.value()) == 0) + return false; + + bool success = true; + int traverse_type = FileEnumerator::FILES | + FileEnumerator::SHOW_SYM_LINKS | FileEnumerator::DIRECTORIES; + FileEnumerator traversal(source_dir, true, traverse_type); + + // dest_dir may not exist yet, start the loop with dest_dir + FileEnumerator::FindInfo info; + base::FilePath current = source_dir; + if (stat(source_dir.value().c_str(), &info.stat) < 0) { + DLOG(ERROR) << "CopyRecursiveDirNoCache() couldn't stat source directory: " + << source_dir.value() << " errno = " << errno; + success = false; + } + + while (success && !current.empty()) { + // |current| is the source path, including source_dir, so paste + // the suffix after source_dir onto dest_dir to create the target_path. + std::string suffix(¤t.value().c_str()[source_dir.value().size()]); + // Strip the leading '/' (if any). + if (!suffix.empty()) { + DCHECK_EQ('/', suffix[0]); + suffix.erase(0, 1); + } + const base::FilePath target_path = dest_dir.Append(suffix); + + if (S_ISDIR(info.stat.st_mode)) { + if (mkdir(target_path.value().c_str(), info.stat.st_mode & 01777) != 0 && + errno != EEXIST) { + DLOG(ERROR) << "CopyRecursiveDirNoCache() couldn't create directory: " + << target_path.value() << " errno = " << errno; + success = false; + } + } else if (S_ISREG(info.stat.st_mode)) { + if (CopyFile(current, target_path)) { + success = EvictFileFromSystemCache(target_path); + DCHECK(success); + } else { + DLOG(ERROR) << "CopyRecursiveDirNoCache() couldn't create file: " + << target_path.value(); + success = false; + } + } else { + DLOG(WARNING) << "CopyRecursiveDirNoCache() skipping non-regular file: " + << current.value(); + } + + current = traversal.Next(); + traversal.GetFindInfo(&info); + } + + return success; +} + #if !defined(OS_LINUX) && !defined(OS_MACOSX) bool EvictFileFromSystemCache(const base::FilePath& file) { // There doesn't seem to be a POSIX way to cool the disk cache. |