Chromium Code Reviews| Index: testing/utils/path_service.cpp |
| diff --git a/testing/utils/path_service.cpp b/testing/utils/path_service.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..89208c055fe1b473961d90e12011b7fcc3a67633 |
| --- /dev/null |
| +++ b/testing/utils/path_service.cpp |
| @@ -0,0 +1,105 @@ |
| +// Copyright 2015 PDFium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "testing/utils/path_service.h" |
| + |
| +#ifdef _WIN32 |
| +#include <Windows.h> |
| +#elif defined(__APPLE__) |
| +#include <mach-o/dyld.h> |
| +#else // Linux |
| +#include <linux/limits.h> |
| +#include <unistd.h> |
| +#endif // _WIN32 |
| + |
| +#include "core/include/fxcrt/fx_system.h" |
| + |
| +// static |
| +bool PathService::EndsWithSeparator(const std::string& path) { |
| + if (path.size() > 1 && path[path.size() - 1] == PATH_SEPARATOR) |
|
Lei Zhang
2015/11/07 01:48:51
if (foo)
return true;
return false;
--> return
Wei Li
2015/11/07 02:36:12
Done.
|
| + return true; |
| + return false; |
| +} |
| + |
| +// static |
| +bool PathService::GetExecutableDir(std::string* path) { |
| +// Get the current executable file path. |
| +#ifdef _WIN32 |
| + char path_buffer[MAX_PATH]; |
| + path_buffer[0] = 0; |
| + |
| + if (GetModuleFileNameA(NULL, path_buffer, MAX_PATH) == 0) |
| + return false; |
| + *path = std::string(path_buffer); |
| +#elif defined(__APPLE__) |
| + FXSYS_assert(path); |
| + unsigned int path_length = 0; |
| + _NSGetExecutablePath(NULL, &path_length); |
| + if (path_length == 0) |
| + return false; |
| + |
| + path->reserve(path_length); |
| + path->resize(path_length - 1); |
| + if (_NSGetExecutablePath(&((*path)[0]), &path_length)) |
| + return false; |
| +#else // Linux |
| + static const char kProcSelfExe[] = "/proc/self/exe"; |
| + char buf[PATH_MAX]; |
| + ssize_t count = ::readlink(kProcSelfExe, buf, PATH_MAX); |
| + if (count <= 0) |
| + return false; |
| + |
| + *path = std::string(buf, count); |
| +#endif // _WIN32 |
| + |
| + // Get the directory path. |
| + std::size_t pos = path->size() - 1; |
| + if (EndsWithSeparator(*path)) |
| + pos--; |
| + std::size_t found = path->find_last_of(PATH_SEPARATOR, pos); |
| + if (found == std::string::npos) |
| + return false; |
| + path->resize(found); |
| + return true; |
| +} |
| + |
| +// static |
| +bool PathService::GetSourceDir(std::string* path) { |
| + if (!GetExecutableDir(path)) |
| + return false; |
| + |
| + if (!EndsWithSeparator(*path)) |
| + path->push_back(PATH_SEPARATOR); |
| + // Assume executables always run from out/<Debug|Release>/, the source |
|
Lei Zhang
2015/11/07 01:48:51
BTW, did some of the code in this file come from C
Wei Li
2015/11/07 02:36:12
Chromium's path service is much more complex. We m
Lei Zhang
2015/11/07 02:43:30
There could be other assumptions, like looking for
|
| + // directory is two levels above the executable directory. |
| + path->append(".."); |
| + path->push_back(PATH_SEPARATOR); |
| + path->append(".."); |
| + return true; |
| +} |
| + |
| +// static |
| +bool PathService::GetTestDataDir(std::string* path) { |
| + if (!GetSourceDir(path)) |
| + return false; |
| + |
| + if (!EndsWithSeparator(*path)) |
| + path->push_back(PATH_SEPARATOR); |
| + path->append("testing"); |
| + path->push_back(PATH_SEPARATOR); |
| + path->append("resources"); |
| + return true; |
| +} |
| + |
| +// static |
| +bool PathService::GetTestFilePath(const std::string& file_name, |
| + std::string* path) { |
| + if (!GetTestDataDir(path)) |
| + return false; |
| + |
| + if (!EndsWithSeparator(*path)) |
| + path->push_back(PATH_SEPARATOR); |
| + path->append(file_name); |
| + return true; |
| +} |