mirror of
https://github.com/google/googletest.git
synced 2025-12-06 16:57:00 +08:00
Move CapturedStream iOS temporary directory logic into TempDir()
We can drop `EndsWithPathSeparator()` because `TempDir()` provides this as an API contract. We prefer `$TEST_TMPDIR` when set for consistency with other platforms.
This commit is contained in:
parent
4969d0ad54
commit
4ef9218150
@ -1054,16 +1054,6 @@ GTestLog::~GTestLog() {
|
|||||||
// this class (creat, dup, dup2, and close)
|
// this class (creat, dup, dup2, and close)
|
||||||
GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
|
GTEST_DISABLE_MSC_DEPRECATED_PUSH_()
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
#if defined(GTEST_OS_LINUX_ANDROID) || defined(GTEST_OS_IOS)
|
|
||||||
bool EndsWithPathSeparator(const std::string& path) {
|
|
||||||
return !path.empty() && path.back() == GTEST_PATH_SEP_[0];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
// Object that captures an output stream (stdout/stderr).
|
// Object that captures an output stream (stdout/stderr).
|
||||||
class CapturedStream {
|
class CapturedStream {
|
||||||
public:
|
public:
|
||||||
@ -1088,46 +1078,8 @@ class CapturedStream {
|
|||||||
// directory, so we create the temporary file in a temporary directory.
|
// directory, so we create the temporary file in a temporary directory.
|
||||||
std::string name_template;
|
std::string name_template;
|
||||||
|
|
||||||
#ifdef GTEST_OS_LINUX_ANDROID
|
#if defined(GTEST_OS_LINUX_ANDROID) || defined(GTEST_OS_IOS)
|
||||||
// Note: Android applications are expected to call the framework's
|
|
||||||
// Context.getExternalStorageDirectory() method through JNI to get
|
|
||||||
// the location of the world-writable SD Card directory. However,
|
|
||||||
// this requires a Context handle, which cannot be retrieved
|
|
||||||
// globally from native code. Doing so also precludes running the
|
|
||||||
// code as part of a regular standalone executable, which doesn't
|
|
||||||
// run in a Dalvik process (e.g. when running it through 'adb shell').
|
|
||||||
//
|
|
||||||
// The location /data/local/tmp is directly accessible from native code.
|
|
||||||
// '/sdcard' and other variants cannot be relied on, as they are not
|
|
||||||
// guaranteed to be mounted, or may have a delay in mounting.
|
|
||||||
//
|
|
||||||
// However, prefer using the TMPDIR environment variable if set, as newer
|
|
||||||
// devices may have /data/local/tmp read-only.
|
|
||||||
name_template = TempDir();
|
name_template = TempDir();
|
||||||
if (!EndsWithPathSeparator(name_template))
|
|
||||||
name_template.push_back(GTEST_PATH_SEP_[0]);
|
|
||||||
|
|
||||||
#elif defined(GTEST_OS_IOS)
|
|
||||||
char user_temp_dir[PATH_MAX + 1];
|
|
||||||
|
|
||||||
// Documented alternative to NSTemporaryDirectory() (for obtaining creating
|
|
||||||
// a temporary directory) at
|
|
||||||
// https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecureCodingGuide/Articles/RaceConditions.html#//apple_ref/doc/uid/TP40002585-SW10
|
|
||||||
//
|
|
||||||
// _CS_DARWIN_USER_TEMP_DIR (as well as _CS_DARWIN_USER_CACHE_DIR) is not
|
|
||||||
// documented in the confstr() man page at
|
|
||||||
// https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/confstr.3.html#//apple_ref/doc/man/3/confstr
|
|
||||||
// but are still available, according to the WebKit patches at
|
|
||||||
// https://trac.webkit.org/changeset/262004/webkit
|
|
||||||
// https://trac.webkit.org/changeset/263705/webkit
|
|
||||||
//
|
|
||||||
// The confstr() implementation falls back to getenv("TMPDIR"). See
|
|
||||||
// https://opensource.apple.com/source/Libc/Libc-1439.100.3/gen/confstr.c.auto.html
|
|
||||||
::confstr(_CS_DARWIN_USER_TEMP_DIR, user_temp_dir, sizeof(user_temp_dir));
|
|
||||||
|
|
||||||
name_template = user_temp_dir;
|
|
||||||
if (!EndsWithPathSeparator(name_template))
|
|
||||||
name_template.push_back(GTEST_PATH_SEP_[0]);
|
|
||||||
#else
|
#else
|
||||||
name_template = "/tmp/";
|
name_template = "/tmp/";
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -33,6 +33,7 @@
|
|||||||
#include "gtest/gtest.h"
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <limits.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -7051,7 +7052,44 @@ std::string TempDir() {
|
|||||||
#elif defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_WINDOWS_MOBILE)
|
#elif defined(GTEST_OS_WINDOWS) || defined(GTEST_OS_WINDOWS_MOBILE)
|
||||||
return GetDirFromEnv({"TEST_TMPDIR", "TEMP"}, "\\temp\\", '\\');
|
return GetDirFromEnv({"TEST_TMPDIR", "TEMP"}, "\\temp\\", '\\');
|
||||||
#elif defined(GTEST_OS_LINUX_ANDROID)
|
#elif defined(GTEST_OS_LINUX_ANDROID)
|
||||||
|
// Note: Android applications are expected to call the framework's
|
||||||
|
// Context.getExternalStorageDirectory() method through JNI to get
|
||||||
|
// the location of the world-writable SD Card directory. However,
|
||||||
|
// this requires a Context handle, which cannot be retrieved
|
||||||
|
// globally from native code. Doing so also precludes running the
|
||||||
|
// code as part of a regular standalone executable, which doesn't
|
||||||
|
// run in a Dalvik process (e.g. when running it through 'adb shell').
|
||||||
|
//
|
||||||
|
// The location /data/local/tmp is directly accessible from native code.
|
||||||
|
// '/sdcard' and other variants cannot be relied on, as they are not
|
||||||
|
// guaranteed to be mounted, or may have a delay in mounting.
|
||||||
|
//
|
||||||
|
// However, prefer using the TMPDIR environment variable if set, as newer
|
||||||
|
// devices may have /data/local/tmp read-only.
|
||||||
return GetDirFromEnv({"TEST_TMPDIR", "TMPDIR"}, "/data/local/tmp/", '/');
|
return GetDirFromEnv({"TEST_TMPDIR", "TMPDIR"}, "/data/local/tmp/", '/');
|
||||||
|
#elif defined(GTEST_OS_IOS)
|
||||||
|
char user_temp_dir[PATH_MAX + 1];
|
||||||
|
|
||||||
|
// Documented alternative to NSTemporaryDirectory() (for obtaining creating
|
||||||
|
// a temporary directory) at
|
||||||
|
// https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecureCodingGuide/Articles/RaceConditions.html#//apple_ref/doc/uid/TP40002585-SW10
|
||||||
|
//
|
||||||
|
// _CS_DARWIN_USER_TEMP_DIR (as well as _CS_DARWIN_USER_CACHE_DIR) is not
|
||||||
|
// documented in the confstr() man page at
|
||||||
|
// https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/confstr.3.html#//apple_ref/doc/man/3/confstr
|
||||||
|
// but are still available, according to the WebKit patches at
|
||||||
|
// https://trac.webkit.org/changeset/262004/webkit
|
||||||
|
// https://trac.webkit.org/changeset/263705/webkit
|
||||||
|
//
|
||||||
|
// The confstr() implementation falls back to getenv("TMPDIR"). See
|
||||||
|
// https://opensource.apple.com/source/Libc/Libc-1439.100.3/gen/confstr.c.auto.html
|
||||||
|
::confstr(_CS_DARWIN_USER_TEMP_DIR, user_temp_dir, sizeof(user_temp_dir));
|
||||||
|
|
||||||
|
std::string temp_dir = user_temp_dir;
|
||||||
|
if (path.empty() || path.back() != GTEST_PATH_SEP_[0])
|
||||||
|
temp_dir.push_back(GTEST_PATH_SEP_[0]);
|
||||||
|
|
||||||
|
return GetDirFromEnv({"TEST_TMPDIR"}, temp_dir.c_str(), '/');
|
||||||
#else
|
#else
|
||||||
return GetDirFromEnv({"TEST_TMPDIR", "TMPDIR"}, "/tmp/", '/');
|
return GetDirFromEnv({"TEST_TMPDIR", "TMPDIR"}, "/tmp/", '/');
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user