diff options
Diffstat (limited to 'net/test/python_utils.cc')
-rw-r--r-- | net/test/python_utils.cc | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/net/test/python_utils.cc b/net/test/python_utils.cc index 0c61b48..05f8a98f 100644 --- a/net/test/python_utils.cc +++ b/net/test/python_utils.cc @@ -37,31 +37,68 @@ void AppendToPythonPath(const FilePath& dir) { } } +namespace { + +// Search for |to_try|, rolling up the directory tree from +// |start_dir|. If found, return true and put the path to |to_try| in +// |out_dir|. If not, return false and leave |out_dir| untouched. +bool TryRelativeToDir(const FilePath& start_dir, + const FilePath& to_try, + FilePath* out_dir) { + FilePath dir(start_dir); + while (!file_util::DirectoryExists(dir.Append(to_try))) { + FilePath parent = dir.DirName(); + if (parent == dir) { + // We hit the root directory. + return false; + } + dir = parent; + } + *out_dir = dir; + return true; +} + +} // namespace + bool GetPyProtoPath(FilePath* dir) { // Locate the Python code generated by the protocol buffers compiler. FilePath generated_code_dir; if (!PathService::Get(base::DIR_EXE, &generated_code_dir)) { + LOG(ERROR) << "Can't find " << generated_code_dir.value(); return false; } const FilePath kPyProto(FILE_PATH_LITERAL("pyproto")); #if defined(OS_MACOSX) || defined(OS_CHROMEOS) - // On Mac and Chrome OS, DIR_EXE might be pointing deep into the Release/ - // (or Debug/) directory and we can't depend on how far down it goes. So we - // walk upwards from DIR_EXE until we find a likely looking spot. - while (!file_util::DirectoryExists(generated_code_dir.Append(kPyProto))) { - FilePath parent = generated_code_dir.DirName(); - if (parent == generated_code_dir) { - // We hit the root directory. Maybe we didn't build any targets which - // produced Python protocol buffers. - PathService::Get(base::DIR_EXE, &generated_code_dir); + FilePath source_dir; + if (!PathService::Get(base::DIR_SOURCE_ROOT, &source_dir)) { + LOG(ERROR) << "Can't find " << source_dir.value(); + return false; + } + // On Mac, and possibly Chrome OS, DIR_EXE might be pointing deep + // into the Release/ (or Debug/) directory and we can't depend on + // how far down it goes. So we walk upwards from DIR_EXE until we + // find a likely looking spot. + if (!TryRelativeToDir(generated_code_dir, kPyProto, dir)) { + LOG(WARNING) << "Can't find " << kPyProto.value() + << " next to " << generated_code_dir.value(); + // On Chrome OS, we may have installed the test binaries and support tools + // in a wholly separate location, relative to DIR_SOURCE_ROOT. We'll want + // to do a similar investigation from that point as well. + generated_code_dir = source_dir + .Append(FILE_PATH_LITERAL("out")) + .Append(FILE_PATH_LITERAL("Release")); + if (!TryRelativeToDir(generated_code_dir, kPyProto, dir)) { + LOG(WARNING) << "Can't find " << kPyProto.value() + << " next to " << generated_code_dir.value(); return false; } - generated_code_dir = parent; } + generated_code_dir = *dir; #endif *dir = generated_code_dir.Append(kPyProto); + VLOG(2) << "Found " << kPyProto.value() << " in " << dir->value(); return true; } |