diff options
Diffstat (limited to 'testing/utils')
-rw-r--r-- | testing/utils/path_service.cpp | 101 | ||||
-rw-r--r-- | testing/utils/path_service.h | 37 |
2 files changed, 138 insertions, 0 deletions
diff --git a/testing/utils/path_service.cpp b/testing/utils/path_service.cpp new file mode 100644 index 0000000000..1501a2da68 --- /dev/null +++ b/testing/utils/path_service.cpp @@ -0,0 +1,101 @@ +// 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) { + return path.size() > 1 && path[path.size() - 1] == PATH_SEPARATOR; +} + +// 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); + 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; +} diff --git a/testing/utils/path_service.h b/testing/utils/path_service.h new file mode 100644 index 0000000000..96fd69e889 --- /dev/null +++ b/testing/utils/path_service.h @@ -0,0 +1,37 @@ +// 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. + +#ifndef TESTING_UTILS_PATH_SERVICE_H_ +#define TESTING_UTILS_PATH_SERVICE_H_ + +#include <string> + +#ifdef _WIN32 +#define PATH_SEPARATOR '\\' +#else +#define PATH_SEPARATOR '/' +#endif + +// Get the various file directory and path information. +class PathService { + public: + // Return true when the path ends with a path separator. + static bool EndsWithSeparator(const std::string& path); + + // Retrieve the directory where executables run from. + static bool GetExecutableDir(std::string* path); + + // Retrieve the root directory of the source tree. + // Assume executables always run from out/<Debug|Release>/, the source + // directory is two levels above the executable directory. + static bool GetSourceDir(std::string* path); + + // Retrieve the test data directory where test files are stored. + // Currently, the test dir is under <source_dir>/testing/resources/. + static bool GetTestDataDir(std::string* path); + + // Get the full path for a test file under the test data directory. + static bool GetTestFilePath(const std::string& file_name, std::string* path); +}; +#endif // TESTING_UTILS_PATH_SERVICE_H_ |