better gtest runner for bionic

1. option to run each test in a separate forked process: "--isolate".
2. warnings about slow tests: "--warnline".
3. run multiple tests at the same time: "-j N".

Bug: 17589740
Change-Id: Ife5f4cafec43aa051ad7bd9c9b2b7e2e437db0de
diff --git a/tests/dlext_test.cpp b/tests/dlext_test.cpp
index 5b31364..0849b27 100644
--- a/tests/dlext_test.cpp
+++ b/tests/dlext_test.cpp
@@ -31,6 +31,7 @@
 
 #include <pagemap/pagemap.h>
 
+#include "TemporaryFile.h"
 
 #define ASSERT_DL_NOTNULL(ptr) \
     ASSERT_TRUE(ptr != nullptr) << "dlerror: " << dlerror()
@@ -260,21 +261,14 @@
     extinfo_.reserved_addr = start;
     extinfo_.reserved_size = LIBSIZE;
     extinfo_.relro_fd = -1;
-
-    const char* android_data = getenv("ANDROID_DATA");
-    ASSERT_TRUE(android_data != nullptr);
-    snprintf(relro_file_, sizeof(relro_file_), "%s/local/tmp/libdlext_test.relro", android_data);
   }
 
   virtual void TearDown() {
     DlExtTest::TearDown();
-    if (extinfo_.relro_fd != -1) {
-      ASSERT_NOERROR(close(extinfo_.relro_fd));
-    }
   }
 
-  void CreateRelroFile(const char* lib) {
-    int relro_fd = open(relro_file_, O_CREAT | O_RDWR | O_TRUNC, 0644);
+  void CreateRelroFile(const char* lib, const char* relro_file) {
+    int relro_fd = open(relro_file, O_RDWR | O_TRUNC);
     ASSERT_NOERROR(relro_fd);
 
     pid_t pid = fork();
@@ -299,7 +293,7 @@
     ASSERT_EQ(0, WEXITSTATUS(status));
 
     // reopen file for reading so it can be used
-    relro_fd = open(relro_file_, O_RDONLY);
+    relro_fd = open(relro_file, O_RDONLY);
     ASSERT_NOERROR(relro_fd);
     extinfo_.flags |= ANDROID_DLEXT_USE_RELRO;
     extinfo_.relro_fd = relro_fd;
@@ -316,24 +310,31 @@
   void SpawnChildrenAndMeasurePss(const char* lib, bool share_relro, size_t* pss_out);
 
   android_dlextinfo extinfo_;
-  char relro_file_[PATH_MAX];
 };
 
 TEST_F(DlExtRelroSharingTest, ChildWritesGoodData) {
-  ASSERT_NO_FATAL_FAILURE(CreateRelroFile(LIBNAME));
+  TemporaryFile tf; // Use tf to get an unique filename.
+  ASSERT_NOERROR(close(tf.fd));
+
+  ASSERT_NO_FATAL_FAILURE(CreateRelroFile(LIBNAME, tf.filename));
   ASSERT_NO_FATAL_FAILURE(TryUsingRelro(LIBNAME));
+
+  // Use destructor of tf to close and unlink the file.
+  tf.fd = extinfo_.relro_fd;
 }
 
 TEST_F(DlExtRelroSharingTest, ChildWritesNoRelro) {
-  ASSERT_NO_FATAL_FAILURE(CreateRelroFile(LIBNAME_NORELRO));
+  TemporaryFile tf; // // Use tf to get an unique filename.
+  ASSERT_NOERROR(close(tf.fd));
+
+  ASSERT_NO_FATAL_FAILURE(CreateRelroFile(LIBNAME_NORELRO, tf.filename));
   ASSERT_NO_FATAL_FAILURE(TryUsingRelro(LIBNAME_NORELRO));
+
+  // Use destructor of tf to close and unlink the file.
+  tf.fd = extinfo_.relro_fd;
 }
 
 TEST_F(DlExtRelroSharingTest, RelroFileEmpty) {
-  int relro_fd = open(relro_file_, O_CREAT | O_RDWR | O_TRUNC, 0644);
-  ASSERT_NOERROR(relro_fd);
-  ASSERT_NOERROR(close(relro_fd));
-
   ASSERT_NO_FATAL_FAILURE(TryUsingRelro(LIBNAME));
 }
 
@@ -343,11 +344,11 @@
     return;
   }
 
-  ASSERT_NO_FATAL_FAILURE(CreateRelroFile(LIBNAME));
-  int relro_fd = open(relro_file_, O_RDONLY);
-  ASSERT_NOERROR(relro_fd);
-  extinfo_.flags |= ANDROID_DLEXT_USE_RELRO;
-  extinfo_.relro_fd = relro_fd;
+  TemporaryFile tf; // Use tf to get an unique filename.
+  ASSERT_NOERROR(close(tf.fd));
+
+  ASSERT_NO_FATAL_FAILURE(CreateRelroFile(LIBNAME, tf.filename));
+
   int pipefd[2];
   ASSERT_NOERROR(pipe(pipefd));
 
@@ -359,6 +360,9 @@
   // it saves 40%+ for this test.
   size_t expected_size = without_sharing - (without_sharing/10);
   EXPECT_LT(with_sharing, expected_size);
+
+  // Use destructor of tf to close and unlink the file.
+  tf.fd = extinfo_.relro_fd;
 }
 
 void getPss(pid_t pid, size_t* pss_out) {