From 091f7a070d58e1f8de6bbfdc5b60e1cef84e58c3 Mon Sep 17 00:00:00 2001 From: Wei Li Date: Mon, 9 Nov 2015 12:09:55 -0800 Subject: Merge to XFA: Add path service to retrieve test data directory at run time so tests can be run from any directory. Previously the tests which read test files assume the current directory is under pdfium. Running from any other directory will break the build. R=thestig@chromium.org Review URL: https://codereview.chromium.org/1408003014 . (cherry picked from commit c0e93a9a942fe7d99800502a61d2fbb58cf9276f) Conflicts: core/src/fpdfapi/fpdf_parser/fpdf_parser_parser_embeddertest.cpp fpdfsdk/src/fpdfdoc_embeddertest.cpp testing/embedder_test.cpp testing/embedder_test.h Review URL: https://codereview.chromium.org/1411403012 . --- testing/utils/path_service.cpp | 101 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 testing/utils/path_service.cpp (limited to 'testing/utils/path_service.cpp') 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 +#elif defined(__APPLE__) +#include +#else // Linux +#include +#include +#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; +} -- cgit v1.2.3