Merge "Add ScopedSilentDeath to libbase"
diff --git a/include/android-base/silent_death_test.h b/include/android-base/silent_death_test.h
index 2aec890..16f99ef 100644
--- a/include/android-base/silent_death_test.h
+++ b/include/android-base/silent_death_test.h
@@ -17,34 +17,70 @@
 #pragma once
 
 #include <signal.h>
-
 #include <gtest/gtest.h>
 
+#include <array>
+#include <memory>
+
 #if !defined(__BIONIC__)
 #define sigaction64 sigaction
 #endif
 
-// Disables debuggerd stack traces to speed up death tests and make them less
-// noisy in logcat.
+// Disables debuggerd stack traces to speed up death tests, make them less
+// noisy in logcat, and avoid expected deaths from showing up in stability metrics.
 //
-// Use `using my_DeathTest = SilentDeathTest;` instead of inheriting from
-// testing::Test yourself.
-class SilentDeathTest : public testing::Test {
- protected:
-  virtual void SetUp() {
-    // Suppress debuggerd stack traces. Too slow.
-    for (int signo : {SIGABRT, SIGBUS, SIGSEGV, SIGSYS}) {
+// When writing new death tests, inherit the test suite from SilentDeathTest
+// defined below. Only use ScopedSilentDeath in a test case/suite if changing the
+// test base from testing::Test to SilentDeathTest adds additional complextity when
+// test suite code is shared between death and non-death tests.
+//
+// For example, use ScopedSilentDeath if you have:
+//   class FooTest : public testing::Test { ... /* shared setup/teardown */ };
+//
+//   using FooDeathTest = FooTest;
+//
+//   TEST_F(FooTest, DoesThis) {
+//     // normal test
+//   }
+//
+//   TEST_F (FooDeathTest, DoesThat) {
+//     ScopedSilentDeath _silentDeath;
+//     // death test
+//   }
+class ScopedSilentDeath {
+ public:
+  ScopedSilentDeath() {
+    for (int signo : SUPPRESSED_SIGNALS) {
       struct sigaction64 action = {.sa_handler = SIG_DFL};
       sigaction64(signo, &action, &previous_);
     }
   }
 
-  virtual void TearDown() {
-    for (int signo : {SIGABRT, SIGBUS, SIGSEGV, SIGSYS}) {
+  ~ScopedSilentDeath() {
+    for (int signo : SUPPRESSED_SIGNALS) {
       sigaction64(signo, &previous_, nullptr);
     }
   }
 
  private:
+  static constexpr std::array<int, 4> SUPPRESSED_SIGNALS = {SIGABRT, SIGBUS, SIGSEGV, SIGSYS};
+
   struct sigaction64 previous_;
 };
+
+// When writing death tests, use `using myDeathTest = SilentDeathTest;` or inherit from
+// SilentDeathTest instead of inheriting from testing::Test yourself.
+//
+// Disables debuggerd stack traces to speed up death tests, make them less
+// noisy in logcat, and avoid expected deaths from showing up in stability metrics.
+class SilentDeathTest : public testing::Test {
+ protected:
+  void SetUp() override {
+    silent_death_ = std::unique_ptr<ScopedSilentDeath>(new ScopedSilentDeath);
+  }
+
+  void TearDown() override { silent_death_.reset(); }
+
+ private:
+  std::unique_ptr<ScopedSilentDeath> silent_death_;
+};