aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrzysztof KosiƄski <krzysio@google.com>2023-03-07 09:16:09 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-03-07 09:16:09 +0000
commit81ff5f1ae3126a70fa9b883fa717df74709db4fa (patch)
tree0b7deebea10acd29d1d672ca6f5b5975db6f3b64
parentb2076b085166e9a96ab86d3d0350ded959d9851b (diff)
parentc2f359b2335f3f3b6b8cca59b2e83de3ca4b64e8 (diff)
downloadgoogletest-81ff5f1ae3126a70fa9b883fa717df74709db4fa.tar.gz
Revert "Revert "Fix device death tests."" am: 479381ccf2 am: b946fde85b am: b0ac539bbe am: c2f359b233
Original change: https://android-review.googlesource.com/c/platform/external/googletest/+/2472685 Change-Id: I4b458812c6cdbf72cb1195d621311083b0328243 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--googletest/include/gtest/internal/custom/gtest.h50
1 files changed, 46 insertions, 4 deletions
diff --git a/googletest/include/gtest/internal/custom/gtest.h b/googletest/include/gtest/internal/custom/gtest.h
index 67ce67f1..3d855613 100644
--- a/googletest/include/gtest/internal/custom/gtest.h
+++ b/googletest/include/gtest/internal/custom/gtest.h
@@ -35,13 +35,21 @@
#define GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_
#if GTEST_OS_LINUX_ANDROID
-# define GTEST_CUSTOM_TEMPDIR_FUNCTION_ GetAndroidTempDir
-# include <unistd.h>
+#include <dlfcn.h>
+#include <unistd.h>
+
+#define GTEST_CUSTOM_TEMPDIR_FUNCTION_ GetAndroidTempDir
+#define GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(argc, argv) \
+ internal::InitGoogleTestImpl(argc, argv); \
+ SetAndroidTestLogger()
+
static inline std::string GetAndroidTempDir() {
// Android doesn't have /tmp, and /sdcard is no longer accessible from
// an app context starting from Android O. On Android, /data/local/tmp
// is usually used as the temporary directory, so try that first...
- if (access("/data/local/tmp", R_OK | W_OK | X_OK) == 0) return "/data/local/tmp/";
+ if (access("/data/local/tmp", R_OK | W_OK | X_OK) == 0) {
+ return "/data/local/tmp/";
+ }
// Processes running in an app context can't write to /data/local/tmp,
// so fall back to the current directory...
@@ -54,6 +62,40 @@ static inline std::string GetAndroidTempDir() {
}
return result;
}
-#endif //GTEST_OS_LINUX_ANDROID
+
+static inline void SetAndroidTestLogger() {
+ // By default, Android log messages are only written to the log buffer, where
+ // GTest cannot see them. This breaks death tests, which need to check the
+ // crash message to ensure that the process died for the expected reason.
+ // To fix this, send log messages to both logd and stderr if we are in a death
+ // test child process.
+ struct LogMessage;
+ using LoggerFunction = void (*)(const LogMessage*);
+ using SetLoggerFunction = void (*)(LoggerFunction logger);
+
+ static void* liblog = dlopen("liblog.so", RTLD_NOW);
+ if (liblog == nullptr) {
+ return;
+ }
+
+ static SetLoggerFunction set_logger = reinterpret_cast<SetLoggerFunction>(
+ dlsym(liblog, "__android_log_set_logger"));
+ static LoggerFunction logd_logger = reinterpret_cast<LoggerFunction>(
+ dlsym(liblog, "__android_log_logd_logger"));
+ static LoggerFunction stderr_logger = reinterpret_cast<LoggerFunction>(
+ dlsym(liblog, "__android_log_stderr_logger"));
+ if (set_logger == nullptr || logd_logger == nullptr ||
+ stderr_logger == nullptr) {
+ return;
+ }
+
+ set_logger([](const LogMessage* message) {
+ logd_logger(message);
+ if (::testing::internal::InDeathTestChild()) {
+ stderr_logger(message);
+ }
+ });
+}
+#endif // GTEST_OS_LINUX_ANDROID
#endif // GOOGLETEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_