native_support service: SynchronousInterfacePtr conversion in tests.

R=vardhan@google.com

Review URL: https://codereview.chromium.org/1919503003 .
diff --git a/services/native_support/BUILD.gn b/services/native_support/BUILD.gn
index 276a086..b19b82f 100644
--- a/services/native_support/BUILD.gn
+++ b/services/native_support/BUILD.gn
@@ -52,7 +52,10 @@
     "//mojo/services/files/cpp:files_impl",
     "//mojo/services/files/interfaces",
     "//mojo/services/native_support/interfaces",
+    "//mojo/services/native_support/interfaces:interfaces_sync",
   ]
 
-  data_deps = [ ":native_support($default_toolchain)" ]
+  data_deps = [
+    ":native_support($default_toolchain)",
+  ]
 }
diff --git a/services/native_support/process_controller_impl_unittest.cc b/services/native_support/process_controller_impl_unittest.cc
index d29f34f..8046ae7 100644
--- a/services/native_support/process_controller_impl_unittest.cc
+++ b/services/native_support/process_controller_impl_unittest.cc
@@ -10,11 +10,14 @@
 
 #include "base/message_loop/message_loop.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
+#include "mojo/public/cpp/bindings/synchronous_interface_ptr.h"
 #include "mojo/services/files/cpp/input_stream_file.h"
 #include "mojo/services/files/cpp/output_stream_file.h"
 #include "mojo/services/files/interfaces/types.mojom.h"
 #include "services/native_support/process_test_base.h"
 
+using mojo::SynchronousInterfacePtr;
+
 namespace native_support {
 namespace {
 
@@ -40,23 +43,21 @@
   mojo::files::Error error;
 
   {
-    ProcessControllerPtr process_controller;
+    SynchronousInterfacePtr<ProcessController> process_controller;
     error = mojo::files::Error::INTERNAL;
     const char kPath[] = "/bin/sh";
     mojo::Array<mojo::Array<uint8_t>> argv;
     argv.push_back(ToByteArray(kPath));
     argv.push_back(ToByteArray("-c"));
     argv.push_back(ToByteArray("exit 42"));
-    process()->Spawn(ToByteArray(kPath), argv.Pass(), nullptr, nullptr,
-                     nullptr, nullptr, GetProxy(&process_controller),
-                     Capture(&error));
-    ASSERT_TRUE(process().WaitForIncomingResponse());
+    ASSERT_TRUE(process()->Spawn(
+        ToByteArray(kPath), argv.Pass(), nullptr, nullptr, nullptr, nullptr,
+        GetSynchronousProxy(&process_controller), &error));
     EXPECT_EQ(mojo::files::Error::OK, error);
 
     error = mojo::files::Error::INTERNAL;
     int32_t exit_status = 0;
-    process_controller->Wait(Capture(&error, &exit_status));
-    ASSERT_TRUE(process_controller.WaitForIncomingResponse());
+    ASSERT_TRUE(process_controller->Wait(&error, &exit_status));
     EXPECT_EQ(mojo::files::Error::OK, error);
     EXPECT_EQ(42, exit_status);
   }
@@ -132,7 +133,7 @@
   mojo::files::FilePtr ofile;
   QuitOnReadyFile ofile_impl(GetProxy(&ofile));
 
-  ProcessControllerPtr process_controller;
+  SynchronousInterfacePtr<ProcessController> process_controller;
   mojo::files::Error error = mojo::files::Error::INTERNAL;
   const char kPath[] = "/bin/bash";
   mojo::Array<mojo::Array<uint8_t>> argv;
@@ -140,10 +141,9 @@
   argv.push_back(ToByteArray("-c"));
   argv.push_back(
       ToByteArray("trap 'exit 42' INT; echo ready; read -t30; exit 1"));
-  process()->Spawn(ToByteArray(kPath), argv.Pass(), nullptr, ifile.Pass(),
-                   ofile.Pass(), nullptr, GetProxy(&process_controller),
-                   Capture(&error));
-  ASSERT_TRUE(process().WaitForIncomingResponse());
+  ASSERT_TRUE(process()->Spawn(
+      ToByteArray(kPath), argv.Pass(), nullptr, ifile.Pass(), ofile.Pass(),
+      nullptr, GetSynchronousProxy(&process_controller), &error));
   EXPECT_EQ(mojo::files::Error::OK, error);
 
   // |ofile_impl| will quit the message loop once it sees "ready".
@@ -152,14 +152,12 @@
 
   // Send SIGINT.
   error = mojo::files::Error::INTERNAL;
-  process_controller->Kill(static_cast<int32_t>(SIGINT), Capture(&error));
-  ASSERT_TRUE(process_controller.WaitForIncomingResponse());
+  ASSERT_TRUE(process_controller->Kill(static_cast<int32_t>(SIGINT), &error));
   EXPECT_EQ(mojo::files::Error::OK, error);
 
   error = mojo::files::Error::INTERNAL;
   int32_t exit_status = 0;
-  process_controller->Wait(Capture(&error, &exit_status));
-  ASSERT_TRUE(process_controller.WaitForIncomingResponse());
+  ASSERT_TRUE(process_controller->Wait(&error, &exit_status));
   EXPECT_EQ(mojo::files::Error::OK, error);
   EXPECT_EQ(42, exit_status);
 }
@@ -173,17 +171,16 @@
     mojo::files::FilePtr ofile;
     QuitOnReadyFile ofile_impl(GetProxy(&ofile));
 
-    ProcessControllerPtr process_controller;
+    SynchronousInterfacePtr<ProcessController> process_controller;
     mojo::files::Error error = mojo::files::Error::INTERNAL;
     const char kPath[] = "/bin/bash";
     mojo::Array<mojo::Array<uint8_t>> argv;
     argv.push_back(ToByteArray(kPath));
     argv.push_back(ToByteArray("-c"));
     argv.push_back(ToByteArray("echo ready; read -t30"));
-    process()->Spawn(ToByteArray(kPath), argv.Pass(), nullptr, ifile.Pass(),
-                     ofile.Pass(), nullptr, GetProxy(&process_controller),
-                     Capture(&error));
-    ASSERT_TRUE(process().WaitForIncomingResponse());
+    ASSERT_TRUE(process()->Spawn(
+        ToByteArray(kPath), argv.Pass(), nullptr, ifile.Pass(), ofile.Pass(),
+        nullptr, GetSynchronousProxy(&process_controller), &error));
     EXPECT_EQ(mojo::files::Error::OK, error);
 
     // |ofile_impl| will quit the message loop once it sees "ready".
diff --git a/services/native_support/process_impl_unittest.cc b/services/native_support/process_impl_unittest.cc
index ed49095..30fd035 100644
--- a/services/native_support/process_impl_unittest.cc
+++ b/services/native_support/process_impl_unittest.cc
@@ -14,8 +14,12 @@
 #include "mojo/services/files/cpp/output_stream_file.h"
 #include "mojo/services/files/interfaces/file.mojom.h"
 #include "mojo/services/files/interfaces/types.mojom.h"
+// FIXME
+#include "mojo/services/native_support/interfaces/process.mojom.h"
 #include "services/native_support/process_test_base.h"
 
+using mojo::SynchronousInterfacePtr;
+
 namespace native_support {
 namespace {
 
@@ -33,35 +37,31 @@
   mojo::files::Error error;
 
   {
-    ProcessControllerPtr process_controller;
+    SynchronousInterfacePtr<ProcessController> process_controller;
     error = mojo::files::Error::INTERNAL;
-    process()->Spawn(ToByteArray("/bin/true"), nullptr, nullptr, nullptr,
-                     nullptr, nullptr, GetProxy(&process_controller),
-                     Capture(&error));
-    ASSERT_TRUE(process().WaitForIncomingResponse());
+    ASSERT_TRUE(process()->Spawn(
+        ToByteArray("/bin/true"), nullptr, nullptr, nullptr, nullptr, nullptr,
+        GetSynchronousProxy(&process_controller), &error));
     EXPECT_EQ(mojo::files::Error::OK, error);
 
     error = mojo::files::Error::INTERNAL;
     int32_t exit_status = 42;
-    process_controller->Wait(Capture(&error, &exit_status));
-    ASSERT_TRUE(process_controller.WaitForIncomingResponse());
+    ASSERT_TRUE(process_controller->Wait(&error, &exit_status));
     EXPECT_EQ(mojo::files::Error::OK, error);
     EXPECT_EQ(0, exit_status);
   }
 
   {
-    ProcessControllerPtr process_controller;
+    SynchronousInterfacePtr<ProcessController> process_controller;
     error = mojo::files::Error::INTERNAL;
-    process()->Spawn(ToByteArray("/bin/false"), nullptr, nullptr, nullptr,
-                     nullptr, nullptr, GetProxy(&process_controller),
-                     Capture(&error));
-    ASSERT_TRUE(process().WaitForIncomingResponse());
+    ASSERT_TRUE(process()->Spawn(
+        ToByteArray("/bin/false"), nullptr, nullptr, nullptr, nullptr, nullptr,
+        GetSynchronousProxy(&process_controller), &error));
     EXPECT_EQ(mojo::files::Error::OK, error);
 
     error = mojo::files::Error::INTERNAL;
     int32_t exit_status = 0;
-    process_controller->Wait(Capture(&error, &exit_status));
-    ASSERT_TRUE(process_controller.WaitForIncomingResponse());
+    ASSERT_TRUE(process_controller->Wait(&error, &exit_status));
     EXPECT_EQ(mojo::files::Error::OK, error);
     EXPECT_NE(exit_status, 0);
   }
@@ -113,12 +113,11 @@
   mojo::Array<mojo::Array<uint8_t>> argv;
   argv.push_back(ToByteArray("/bin/echo"));
   argv.push_back(ToByteArray(kOutput));
-  ProcessControllerPtr process_controller;
+  SynchronousInterfacePtr<ProcessController> process_controller;
   mojo::files::Error error = mojo::files::Error::INTERNAL;
-  process()->Spawn(ToByteArray("/bin/echo"), argv.Pass(), nullptr, nullptr,
-                   file.Pass(), nullptr, GetProxy(&process_controller),
-                   Capture(&error));
-  ASSERT_TRUE(process().WaitForIncomingResponse());
+  ASSERT_TRUE(process()->Spawn(
+      ToByteArray("/bin/echo"), argv.Pass(), nullptr, nullptr, file.Pass(),
+      nullptr, GetSynchronousProxy(&process_controller), &error));
   EXPECT_EQ(mojo::files::Error::OK, error);
 
   // Since |file|'s impl is on our thread, we have to spin our message loop.
@@ -128,8 +127,7 @@
 
   error = mojo::files::Error::INTERNAL;
   int32_t exit_status = 0;
-  process_controller->Wait(Capture(&error, &exit_status));
-  ASSERT_TRUE(process_controller.WaitForIncomingResponse());
+  ASSERT_TRUE(process_controller->Wait(&error, &exit_status));
   EXPECT_EQ(mojo::files::Error::OK, error);
   EXPECT_EQ(0, exit_status);
 
diff --git a/services/native_support/process_test_base.cc b/services/native_support/process_test_base.cc
index 1226b4b..9272f69 100644
--- a/services/native_support/process_test_base.cc
+++ b/services/native_support/process_test_base.cc
@@ -5,6 +5,9 @@
 #include "services/native_support/process_test_base.h"
 
 #include "mojo/public/cpp/application/application_impl.h"
+#include "mojo/services/native_support/interfaces/process.mojom.h"
+
+using mojo::SynchronousInterfacePtr;
 
 namespace native_support {
 
@@ -14,7 +17,11 @@
 
 void ProcessTestBase::SetUp() {
   mojo::test::ApplicationTestBase::SetUp();
-  application_impl()->ConnectToService("mojo:native_support", &process_);
+  ProcessPtr process_async;
+  // TODO(vtl): Fix |ConnectToService()|.
+  application_impl()->ConnectToService("mojo:native_support", &process_async);
+  process_ = SynchronousInterfacePtr<Process>::Create(
+      process_async.PassInterfaceHandle());
 }
 
 }  // namespace native_support
diff --git a/services/native_support/process_test_base.h b/services/native_support/process_test_base.h
index 6b7900d..c7454ce 100644
--- a/services/native_support/process_test_base.h
+++ b/services/native_support/process_test_base.h
@@ -9,53 +9,11 @@
 
 #include "base/macros.h"
 #include "mojo/public/cpp/application/application_test_base.h"
-#include "mojo/services/native_support/interfaces/process.mojom.h"
+#include "mojo/public/cpp/bindings/synchronous_interface_ptr.h"
+#include "mojo/services/native_support/interfaces/process.mojom-sync.h"
 
 namespace native_support {
 
-// TODO(vtl): Stuff copied from mojo/public/cpp/bindings/lib/template_util.h.
-typedef char YesType;
-
-struct NoType {
-  YesType dummy[2];
-};
-
-template <typename T>
-struct IsMoveOnlyType {
-  template <typename U>
-  static YesType Test(const typename U::MoveOnlyTypeForCPP03*);
-
-  template <typename U>
-  static NoType Test(...);
-
-  static const bool value =
-      sizeof(Test<T>(0)) == sizeof(YesType) && !std::is_const<T>::value;
-};
-
-template <typename T>
-typename std::enable_if<!IsMoveOnlyType<T>::value, T>::type& Forward(T& t) {
-  return t;
-}
-
-template <typename T>
-typename std::enable_if<IsMoveOnlyType<T>::value, T>::type Forward(T& t) {
-  return t.Pass();
-}
-// TODO(vtl): (End of stuff copied from template_util.h.)
-
-template <typename T1>
-mojo::Callback<void(T1)> Capture(T1* t1) {
-  return [t1](T1 got_t1) { *t1 = Forward(got_t1); };
-}
-
-template <typename T1, typename T2>
-mojo::Callback<void(T1, T2)> Capture(T1* t1, T2* t2) {
-  return [t1, t2](T1 got_t1, T2 got_t2) {
-    *t1 = Forward(got_t1);
-    *t2 = Forward(got_t2);
-  };
-}
-
 class ProcessTestBase : public mojo::test::ApplicationTestBase {
  public:
   ProcessTestBase();
@@ -64,10 +22,10 @@
   void SetUp() override;
 
  protected:
-  ProcessPtr& process() { return process_; }
+  mojo::SynchronousInterfacePtr<Process>& process() { return process_; }
 
  private:
-  ProcessPtr process_;
+  mojo::SynchronousInterfacePtr<Process> process_;
 
   DISALLOW_COPY_AND_ASSIGN(ProcessTestBase);
 };