Index: testing/android/native_test_launcher.cc |
diff --git a/testing/android/native_test_launcher.cc b/testing/android/native_test_launcher.cc |
index 61d6c5faefa626631fd029df6790d7a27b3a89b8..e39eb2bdccbb881fa9ed76747c042a7f76a9a691 100644 |
--- a/testing/android/native_test_launcher.cc |
+++ b/testing/android/native_test_launcher.cc |
@@ -13,12 +13,14 @@ |
#include <signal.h> |
#include "base/android/base_jni_registrar.h" |
+#include "base/android/fifo_utils.h" |
#include "base/android/jni_android.h" |
#include "base/android/jni_string.h" |
#include "base/android/scoped_java_ref.h" |
#include "base/at_exit.h" |
#include "base/base_switches.h" |
#include "base/command_line.h" |
+#include "base/file_util.h" |
#include "base/files/file_path.h" |
#include "base/logging.h" |
#include "base/strings/stringprintf.h" |
@@ -27,9 +29,7 @@ |
#include "testing/jni/ChromeNativeTestActivity_jni.h" |
using testing::native_test_util::ArgsToArgv; |
-using testing::native_test_util::CreateFIFO; |
using testing::native_test_util::ParseArgsFromCommandLineFile; |
-using testing::native_test_util::RedirectStream; |
using testing::native_test_util::ScopedMainEntryLogger; |
// The main function of the program to be wrapped as a test apk. |
@@ -78,6 +78,41 @@ void InstallHandlers() { |
} |
} |
+// Writes printf() style string to Android's logger where |priority| is one of |
+// the levels defined in <android/log.h>. |
+void AndroidLog(int priority, const char* format, ...) { |
+ va_list args; |
+ va_start(args, format); |
+ __android_log_vprint(priority, kLogTag, format, args); |
+ va_end(args); |
+} |
+ |
+// Ensures that the fifo at |path| is created by deleting whatever is at |path| |
+// prior to (re)creating the fifo, otherwise logs the error and terminates the |
+// program. |
+void EnsureCreateFIFO(const base::FilePath& path) { |
+ unlink(path.value().c_str()); |
+ if (base::android::CreateFIFO(path, 0666)) |
+ return; |
+ |
+ AndroidLog(ANDROID_LOG_ERROR, "Failed to create fifo %s: %s\n", |
+ path.value().c_str(), strerror(errno)); |
+ exit(EXIT_FAILURE); |
+} |
+ |
+// Ensures that |stream| is redirected to |path|, otherwise logs the error and |
+// terminates the program. |
+void EnsureRedirectStream(FILE* stream, |
+ const base::FilePath& path, |
+ const char* mode) { |
+ if (base::android::RedirectStream(stream, path, mode)) |
+ return; |
+ |
+ AndroidLog(ANDROID_LOG_ERROR, "Failed to redirect stream to file: %s: %s\n", |
+ path.value().c_str(), strerror(errno)); |
+ exit(EXIT_FAILURE); |
+} |
+ |
} // namespace |
// This method is called on a separate java thread so that we won't trigger |
@@ -115,7 +150,7 @@ static void RunTests(JNIEnv* env, |
// A few options, such "--gtest_list_tests", will just use printf directly |
// Always redirect stdout to a known file. |
base::FilePath fifo_path(files_dir.Append(base::FilePath("test.fifo"))); |
- CreateFIFO(fifo_path.value().c_str()); |
+ EnsureCreateFIFO(fifo_path); |
base::FilePath stderr_fifo_path, stdin_fifo_path; |
@@ -123,29 +158,28 @@ static void RunTests(JNIEnv* env, |
// other tests, insert stderr content to the same fifo we use for stdout. |
if (command_line.HasSwitch(kSeparateStderrFifo)) { |
stderr_fifo_path = files_dir.Append(base::FilePath("stderr.fifo")); |
- CreateFIFO(stderr_fifo_path.value().c_str()); |
+ EnsureCreateFIFO(stderr_fifo_path); |
} |
// DumpRenderTree uses stdin to receive input about which test to run. |
if (command_line.HasSwitch(kCreateStdinFifo)) { |
stdin_fifo_path = files_dir.Append(base::FilePath("stdin.fifo")); |
- CreateFIFO(stdin_fifo_path.value().c_str()); |
+ EnsureCreateFIFO(stdin_fifo_path); |
} |
// Only redirect the streams after all fifos have been created. |
- RedirectStream(stdout, fifo_path.value().c_str(), "w"); |
+ EnsureRedirectStream(stdout, fifo_path, "w"); |
if (!stdin_fifo_path.empty()) |
- RedirectStream(stdin, stdin_fifo_path.value().c_str(), "r"); |
+ EnsureRedirectStream(stdin, stdin_fifo_path, "r"); |
if (!stderr_fifo_path.empty()) |
- RedirectStream(stderr, stderr_fifo_path.value().c_str(), "w"); |
+ EnsureRedirectStream(stderr, stderr_fifo_path, "w"); |
else |
dup2(STDOUT_FILENO, STDERR_FILENO); |
if (command_line.HasSwitch(switches::kWaitForDebugger)) { |
- std::string msg = base::StringPrintf("Native test waiting for GDB because " |
- "flag %s was supplied", |
- switches::kWaitForDebugger); |
- __android_log_write(ANDROID_LOG_VERBOSE, kLogTag, msg.c_str()); |
+ AndroidLog(ANDROID_LOG_VERBOSE, |
+ "Native test waiting for GDB because flag %s was supplied", |
+ switches::kWaitForDebugger); |
base::debug::WaitForDebugger(24 * 60 * 60, false); |
} |