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.