summaryrefslogtreecommitdiffstats
path: root/base/test/test_file_util_posix.cc
diff options
context:
space:
mode:
authortonyg@chromium.org <tonyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-03 19:58:09 +0000
committertonyg@chromium.org <tonyg@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-03 19:58:09 +0000
commit715fe2473792264b86294357d7f783a43c7961f1 (patch)
tree9bf76ab4e838efbd50480474ed4b0ce382d85814 /base/test/test_file_util_posix.cc
parent17c4ce62ff8cff51f81c0cd79622a095754695bb (diff)
downloadchromium_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.cc77
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(&current.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.