Index: util/test/paths.cc |
diff --git a/util/test/paths.cc b/util/test/paths.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..5634b62dd10696dd7c0a1e1ed4ef5f1d25208076 |
--- /dev/null |
+++ b/util/test/paths.cc |
@@ -0,0 +1,101 @@ |
+// Copyright 2015 The Crashpad Authors. All rights reserved. |
+// |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// you may not use this file except in compliance with the License. |
+// You may obtain a copy of the License at |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// Unless required by applicable law or agreed to in writing, software |
+// distributed under the License is distributed on an "AS IS" BASIS, |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// See the License for the specific language governing permissions and |
+// limitations under the License. |
+ |
+#include "util/test/paths.h" |
+ |
+#include <stdlib.h> |
+#include <sys/stat.h> |
+ |
+#include "base/logging.h" |
+#include "build/build_config.h" |
+ |
+namespace crashpad { |
+namespace test { |
+ |
+namespace { |
+ |
+bool IsTestDataRoot(const base::FilePath& candidate) { |
+ const base::FilePath marker_path = |
+ candidate.Append(FILE_PATH_LITERAL("util")) |
+ .Append(FILE_PATH_LITERAL("test")) |
+ .Append(FILE_PATH_LITERAL("paths_test_data_root.txt")); |
+ |
+#if !defined(OS_WIN) |
+ struct stat stat_buf; |
+ int rv = stat(marker_path.value().c_str(), &stat_buf); |
+#else |
+ struct _stat stat_buf; |
+ int rv = _wstat(marker_path.value().c_str(), &stat_buf); |
+#endif |
+ |
+ return rv == 0; |
+} |
+ |
+base::FilePath TestDataRootInternal() { |
+#if !defined(OS_WIN) |
+ const char* environment_value = getenv("CRASHPAD_TEST_DATA_ROOT"); |
+#else // defined(OS_WIN) |
+ const wchar_t* environment_value = _wgetenv(L"CRASHPAD_TEST_DATA_ROOT"); |
+#endif |
+ |
+ if (environment_value) { |
+ // It was specified explicitly, so use it even if it seems incorrect. |
+ if (!IsTestDataRoot(base::FilePath(environment_value))) { |
+ LOG(WARNING) << "CRASHPAD_TEST_DATA_ROOT seems invalid, honoring anyway"; |
+ } |
+ |
+ return base::FilePath(environment_value); |
+ } |
+ |
+ // In a standalone build, the test executable is usually at |
+ // out/{Debug,Release} relative to the Crashpad root. |
+ const base::FilePath executable = Paths::Executable(); |
+ base::FilePath candidate = |
+ base::FilePath(executable.DirName() |
+ .Append(base::FilePath::kParentDirectory) |
+ .Append(base::FilePath::kParentDirectory)); |
+ if (IsTestDataRoot(candidate)) { |
+ return candidate; |
+ } |
+ |
+ // In an in-Chromium build, the test executable is usually at |
+ // out/{Debug,Release} relative to the Chromium root, and the Crashpad root is |
+ // at third_party/crashpad/crashpad relative to the Chromium root. |
+ candidate = candidate.Append(FILE_PATH_LITERAL("third_party")) |
+ .Append(FILE_PATH_LITERAL("crashpad")) |
+ .Append(FILE_PATH_LITERAL("crashpad")); |
+ if (IsTestDataRoot(candidate)) { |
+ return candidate; |
+ } |
+ |
+ // If nothing else worked, use the current directory, issuing a warning if it |
+ // doesn’t seem right. |
+ if (!IsTestDataRoot(base::FilePath(base::FilePath::kCurrentDirectory))) { |
+ LOG(WARNING) << "could not locate a valid test data root"; |
+ } |
+ |
+ return base::FilePath(base::FilePath::kCurrentDirectory); |
+} |
+ |
+} // namespace |
+ |
+// static |
+base::FilePath Paths::TestDataRoot() { |
+ static base::FilePath* test_data_root = |
+ new base::FilePath(TestDataRootInternal()); |
+ return *test_data_root; |
+} |
+ |
+} // namespace test |
+} // namespace crashpad |