diff options
Diffstat (limited to 'testing/utils/path_service.cpp')
-rw-r--r-- | testing/utils/path_service.cpp | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/testing/utils/path_service.cpp b/testing/utils/path_service.cpp index 1030c2bb17..2ded0ed3b1 100644 --- a/testing/utils/path_service.cpp +++ b/testing/utils/path_service.cpp @@ -8,8 +8,10 @@ #include <Windows.h> #elif defined(__APPLE__) #include <mach-o/dyld.h> +#include <sys/stat.h> #else // Linux #include <linux/limits.h> +#include <sys/stat.h> #include <unistd.h> #endif // _WIN32 @@ -17,6 +19,38 @@ #include "core/fxcrt/fx_system.h" +namespace { + +#if defined(__APPLE__) || (defined(ANDROID) && __ANDROID_API__ < 21) +using stat_wrapper_t = struct stat; + +int CallStat(const char* path, stat_wrapper_t* sb) { + return stat(path, sb); +} +#elif !_WIN32 +using stat_wrapper_t = struct stat64; + +int CallStat(const char* path, stat_wrapper_t* sb) { + return stat64(path, sb); +} +#endif + +bool DirectoryExists(const std::string& path) { +#ifdef _WIN32 + DWORD fileattr = GetFileAttributesA(path.c_str()); + if (fileattr != INVALID_FILE_ATTRIBUTES) + return (fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0; + return false; +#else + stat_wrapper_t file_info; + if (CallStat(path.c_str(), &file_info) != 0) + return false; + return S_ISDIR(file_info.st_mode); +#endif +} + +} // namespace + // static bool PathService::EndsWithSeparator(const std::string& path) { return path.size() > 1 && path[path.size() - 1] == PATH_SEPARATOR; @@ -88,10 +122,30 @@ bool PathService::GetTestDataDir(std::string* path) { if (!EndsWithSeparator(*path)) path->push_back(PATH_SEPARATOR); - path->append("testing"); - path->push_back(PATH_SEPARATOR); - path->append("resources"); - return true; + + std::string potential_path = *path; + potential_path.append("testing"); + potential_path.push_back(PATH_SEPARATOR); + potential_path.append("resources"); + if (DirectoryExists(potential_path)) { + *path = potential_path; + return true; + } + + potential_path = *path; + potential_path.append("third_party"); + potential_path.push_back(PATH_SEPARATOR); + potential_path.append("pdfium"); + potential_path.push_back(PATH_SEPARATOR); + potential_path.append("testing"); + potential_path.push_back(PATH_SEPARATOR); + potential_path.append("resources"); + if (DirectoryExists(potential_path)) { + *path = potential_path; + return true; + } + + return false; } // static |