| 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);
 | 
|    }
 | 
|  
 | 
| 
 |