diff options
-rw-r--r-- | libartbase/base/mem_map_test.cc | 30 | ||||
-rw-r--r-- | runtime/common_runtime_test.cc | 37 |
2 files changed, 52 insertions, 15 deletions
diff --git a/libartbase/base/mem_map_test.cc b/libartbase/base/mem_map_test.cc index 5815cf99e7..813d90d0bd 100644 --- a/libartbase/base/mem_map_test.cc +++ b/libartbase/base/mem_map_test.cc @@ -21,8 +21,9 @@ #include <memory> #include <random> -#include "base/common_art_test.h" +#include "common_art_test.h" #include "common_runtime_test.h" // For TEST_DISABLED_FOR_MIPS +#include "logging.h" #include "memory_tool.h" #include "unix_file/fd_file.h" @@ -874,3 +875,30 @@ TEST_F(MemMapTest, Reservation) { } } // namespace art + +namespace { + +class DumpMapsOnFailListener : public testing::EmptyTestEventListener { + void OnTestPartResult(const testing::TestPartResult& result) override { + switch (result.type()) { + case testing::TestPartResult::kFatalFailure: + art::PrintFileToLog("/proc/self/maps", android::base::LogSeverity::ERROR); + break; + + // TODO: Could consider logging on EXPECT failures. + case testing::TestPartResult::kNonFatalFailure: + case testing::TestPartResult::kSuccess: + break; + } + } +}; + +} // namespace + +// Inject our listener into the test runner. +extern "C" +__attribute__((visibility("default"))) __attribute__((used)) +void ArtTestGlobalInit() { + LOG(ERROR) << "Installing listener"; + testing::UnitTest::GetInstance()->listeners().Append(new DumpMapsOnFailListener()); +} diff --git a/runtime/common_runtime_test.cc b/runtime/common_runtime_test.cc index be39631e44..cfc0d283d1 100644 --- a/runtime/common_runtime_test.cc +++ b/runtime/common_runtime_test.cc @@ -59,20 +59,6 @@ #include "thread.h" #include "well_known_classes.h" -int main(int argc, char **argv) { - // Gtests can be very noisy. For example, an executable with multiple tests will trigger native - // bridge warnings. The following line reduces the minimum log severity to ERROR and suppresses - // everything else. In case you want to see all messages, comment out the line. - setenv("ANDROID_LOG_TAGS", "*:e", 1); - - art::Locks::Init(); - art::InitLogging(argv, art::Runtime::Abort); - art::MemMap::Init(); - LOG(INFO) << "Running main() from common_runtime_test.cc..."; - testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} - namespace art { using android::base::StringPrintf; @@ -420,3 +406,26 @@ void CheckJniAbortCatcher::Hook(void* data, const std::string& reason) { } } // namespace art + +// Allow other test code to run global initialization/configuration before +// gtest infra takes over. +extern "C" +__attribute__((visibility("default"))) __attribute__((weak)) +void ArtTestGlobalInit() { + LOG(ERROR) << "ArtTestGlobalInit in common_runtime_test"; +} + +int main(int argc, char **argv) { + // Gtests can be very noisy. For example, an executable with multiple tests will trigger native + // bridge warnings. The following line reduces the minimum log severity to ERROR and suppresses + // everything else. In case you want to see all messages, comment out the line. + setenv("ANDROID_LOG_TAGS", "*:e", 1); + + art::Locks::Init(); + art::InitLogging(argv, art::Runtime::Abort); + art::MemMap::Init(); + LOG(INFO) << "Running main() from common_runtime_test.cc..."; + testing::InitGoogleTest(&argc, argv); + ArtTestGlobalInit(); + return RUN_ALL_TESTS(); +} |