1 // Copyright 2015 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "testing/utils/path_service.h" 6 7 #ifdef _WIN32 8 #include <Windows.h> 9 #elif defined(__APPLE__) 10 #include <mach-o/dyld.h> 11 #else // Linux 12 #include <linux/limits.h> 13 #include <unistd.h> 14 #endif // _WIN32 15 16 #include <string> 17 18 #include "core/fxcrt/fx_system.h" 19 20 // static 21 bool PathService::EndsWithSeparator(const std::string& path) { 22 return path.size() > 1 && path[path.size() - 1] == PATH_SEPARATOR; 23 } 24 25 // static 26 bool PathService::GetExecutableDir(std::string* path) { 27 // Get the current executable file path. 28 #ifdef _WIN32 29 char path_buffer[MAX_PATH]; 30 path_buffer[0] = 0; 31 32 if (GetModuleFileNameA(NULL, path_buffer, MAX_PATH) == 0) 33 return false; 34 *path = std::string(path_buffer); 35 #elif defined(__APPLE__) 36 ASSERT(path); 37 unsigned int path_length = 0; 38 _NSGetExecutablePath(NULL, &path_length); 39 if (path_length == 0) 40 return false; 41 42 path->reserve(path_length); 43 path->resize(path_length - 1); 44 if (_NSGetExecutablePath(&((*path)[0]), &path_length)) 45 return false; 46 #else // Linux 47 static const char kProcSelfExe[] = "/proc/self/exe"; 48 char buf[PATH_MAX]; 49 ssize_t count = ::readlink(kProcSelfExe, buf, PATH_MAX); 50 if (count <= 0) 51 return false; 52 53 *path = std::string(buf, count); 54 #endif // _WIN32 55 56 // Get the directory path. 57 std::size_t pos = path->size() - 1; 58 if (EndsWithSeparator(*path)) 59 pos--; 60 std::size_t found = path->find_last_of(PATH_SEPARATOR, pos); 61 if (found == std::string::npos) 62 return false; 63 path->resize(found); 64 return true; 65 } 66 67 // static 68 bool PathService::GetSourceDir(std::string* path) { 69 if (!GetExecutableDir(path)) 70 return false; 71 72 if (!EndsWithSeparator(*path)) 73 path->push_back(PATH_SEPARATOR); 74 path->append(".."); 75 path->push_back(PATH_SEPARATOR); 76 #if defined(ANDROID) 77 path->append("chromium_tests_root"); 78 #else // Non-Android 79 path->append(".."); 80 #endif // defined(ANDROID) 81 return true; 82 } 83 84 // static 85 bool PathService::GetTestDataDir(std::string* path) { 86 if (!GetSourceDir(path)) 87 return false; 88 89 if (!EndsWithSeparator(*path)) 90 path->push_back(PATH_SEPARATOR); 91 path->append("testing"); 92 path->push_back(PATH_SEPARATOR); 93 path->append("resources"); 94 return true; 95 } 96 97 // static 98 bool PathService::GetTestFilePath(const std::string& file_name, 99 std::string* path) { 100 if (!GetTestDataDir(path)) 101 return false; 102 103 if (!EndsWithSeparator(*path)) 104 path->push_back(PATH_SEPARATOR); 105 path->append(file_name); 106 return true; 107 } 108