You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2011/06/05 11:18:46 UTC

svn commit: r1132280 - in /incubator/mesos/trunk/third_party/libprocess: pid.hpp process.hpp tests.cpp

Author: benh
Date: Sun Jun  5 09:18:46 2011
New Revision: 1132280

URL: http://svn.apache.org/viewvc?rev=1132280&view=rev
Log:
(1) Cleaned up casting of PID<T> to only allow implicit upcasts; (2) Cleaned up spawning to give back the right type; (3) Added a test.

Modified:
    incubator/mesos/trunk/third_party/libprocess/pid.hpp
    incubator/mesos/trunk/third_party/libprocess/process.hpp
    incubator/mesos/trunk/third_party/libprocess/tests.cpp

Modified: incubator/mesos/trunk/third_party/libprocess/pid.hpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/libprocess/pid.hpp?rev=1132280&r1=1132279&r2=1132280&view=diff
==============================================================================
--- incubator/mesos/trunk/third_party/libprocess/pid.hpp (original)
+++ incubator/mesos/trunk/third_party/libprocess/pid.hpp Sun Jun  5 09:18:46 2011
@@ -81,7 +81,21 @@ template <typename T = ProcessBase>
 struct PID : UPID
 {
   PID() : UPID() {}
+
   PID(const T& t) : UPID(static_cast<const ProcessBase&>(t)) {}
+
+  template <typename Base>
+  operator PID<Base> ()
+  {
+    // Only allow upcasts!
+    T* t = NULL;
+    Base* base = t;
+    PID<Base> pid;
+    pid.id = id;
+    pid.ip = ip;
+    pid.port = port;
+    return pid;
+  }
 };
 
 

Modified: incubator/mesos/trunk/third_party/libprocess/process.hpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/libprocess/process.hpp?rev=1132280&r1=1132279&r2=1132280&view=diff
==============================================================================
--- incubator/mesos/trunk/third_party/libprocess/process.hpp (original)
+++ incubator/mesos/trunk/third_party/libprocess/process.hpp Sun Jun  5 09:18:46 2011
@@ -219,13 +219,13 @@ void initialize(bool initialize_google_l
  * @param process process to be spawned
  */
 template <typename T>
-PID<T> spawn(Process<T>* process)
+PID<T> spawn(T* t)
 {
-  if (!ProcessBase::spawn(process)) {
+  if (!ProcessBase::spawn(t)) {
     return PID<T>();
   }
 
-  return process->self();
+  return PID<T>(*t);
 }
 
 

Modified: incubator/mesos/trunk/third_party/libprocess/tests.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/third_party/libprocess/tests.cpp?rev=1132280&r1=1132279&r2=1132280&view=diff
==============================================================================
--- incubator/mesos/trunk/third_party/libprocess/tests.cpp (original)
+++ incubator/mesos/trunk/third_party/libprocess/tests.cpp Sun Jun  5 09:18:46 2011
@@ -28,7 +28,7 @@ TEST(libprocess, spawn)
 
   PID<SpawnMockProcess> pid = process::spawn(&process);
 
-  ASSERT_NE(pid, UPID());
+  ASSERT_FALSE(!pid);
 
   process::wait(pid);
 }
@@ -53,11 +53,11 @@ TEST(libprocess, dispatch)
 
   PID<DispatchMockProcess> pid = process::spawn(&process);
 
-  ASSERT_NE(pid, UPID());
+  ASSERT_FALSE(!pid);
 
   process::dispatch(pid, &DispatchMockProcess::func);
-  process::post(pid, process::TERMINATE);
 
+  process::post(pid, process::TERMINATE);
   process::wait(pid);
 }
 
@@ -82,15 +82,62 @@ TEST(libprocess, install)
 
   PID<InstallMockProcess> pid = process::spawn(&process);
 
-  ASSERT_NE(pid, UPID());
+  ASSERT_FALSE(!pid);
 
   process::post(pid, "func");
-  process::post(pid, process::TERMINATE);
 
+  process::post(pid, process::TERMINATE);
   process::wait(pid);
 }
 
 
+class BaseMockProcess : public Process<BaseMockProcess>
+{
+public:
+  virtual void func() = 0;
+  MOCK_METHOD0(foo, void());
+};
+
+
+class DerivedMockProcess : public BaseMockProcess
+{
+public:
+  DerivedMockProcess() {}
+  MOCK_METHOD0(func, void());
+  virtual void operator () () { serve(); }
+};
+
+
+TEST(libprocess, inheritance)
+{
+  ASSERT_TRUE(GTEST_IS_THREADSAFE);
+
+  DerivedMockProcess process;
+
+  EXPECT_CALL(process, func())
+    .Times(AtMost(1));
+
+  EXPECT_CALL(process, foo())
+    .Times(AtMost(1));
+
+  PID<DerivedMockProcess> pid1 = process::spawn(&process);
+
+  ASSERT_FALSE(!pid1);
+
+  process::dispatch(pid1, &DerivedMockProcess::func);
+
+  PID<BaseMockProcess> pid2(process);
+  PID<BaseMockProcess> pid3 = pid1;
+
+  ASSERT_EQ(pid2, pid3);
+
+  process::dispatch(pid3, &BaseMockProcess::foo);
+
+  process::post(pid1, process::TERMINATE);
+  process::wait(pid1);
+}
+
+
 int main(int argc, char** argv)
 {
   // Initialize Google Mock/Test.