diff options
Diffstat (limited to 'ipc/ipdl/test/cxx/TestRPC.cpp')
-rw-r--r-- | ipc/ipdl/test/cxx/TestRPC.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/ipc/ipdl/test/cxx/TestRPC.cpp b/ipc/ipdl/test/cxx/TestRPC.cpp new file mode 100644 index 000000000..2dfc51d33 --- /dev/null +++ b/ipc/ipdl/test/cxx/TestRPC.cpp @@ -0,0 +1,152 @@ +#include "TestRPC.h" + +#include "IPDLUnitTests.h" // fail etc. +#if defined(OS_POSIX) +#include <unistd.h> +#else +#include <windows.h> +#endif + +namespace mozilla { +namespace _ipdltest { + +//----------------------------------------------------------------------------- +// parent + +TestRPCParent::TestRPCParent() + : reentered_(false), + resolved_first_cpow_(false) +{ + MOZ_COUNT_CTOR(TestRPCParent); +} + +TestRPCParent::~TestRPCParent() +{ + MOZ_COUNT_DTOR(TestRPCParent); +} + +void +TestRPCParent::Main() +{ + if (!SendStart()) + fail("sending Start"); +} + +bool +TestRPCParent::RecvTest1_Start(uint32_t* aResult) +{ + uint32_t result; + if (!SendTest1_InnerQuery(&result)) + fail("SendTest1_InnerQuery"); + if (result != 300) + fail("Wrong result (expected 300)"); + + *aResult = 100; + return true; +} + +bool +TestRPCParent::RecvTest1_InnerEvent(uint32_t* aResult) +{ + uint32_t result; + if (!SendTest1_NoReenter(&result)) + fail("SendTest1_NoReenter"); + if (result != 400) + fail("Wrong result (expected 400)"); + + *aResult = 200; + return true; +} + +bool +TestRPCParent::RecvTest2_Start() +{ + // Send a CPOW. During this time, we must NOT process the RPC message, as + // we could start receiving CPOW replies out-of-order. + if (!SendTest2_FirstUrgent()) + fail("SendTest2_FirstUrgent"); + + MOZ_ASSERT(!reentered_); + resolved_first_cpow_ = true; + return true; +} + +bool +TestRPCParent::RecvTest2_OutOfOrder() +{ + // Send a CPOW. If this RPC call was initiated while waiting for the first + // CPOW to resolve, replies will be processed out of order, and we'll crash. + if (!SendTest2_SecondUrgent()) + fail("SendTest2_SecondUrgent"); + + reentered_ = true; + return true; +} + +//----------------------------------------------------------------------------- +// child + + +TestRPCChild::TestRPCChild() +{ + MOZ_COUNT_CTOR(TestRPCChild); +} + +TestRPCChild::~TestRPCChild() +{ + MOZ_COUNT_DTOR(TestRPCChild); +} + +bool +TestRPCChild::RecvStart() +{ + uint32_t result; + if (!SendTest1_Start(&result)) + fail("SendTest1_Start"); + if (result != 100) + fail("Wrong result (expected 100)"); + + if (!SendTest2_Start()) + fail("SendTest2_Start"); + + if (!SendTest2_OutOfOrder()) + fail("SendTest2_OutOfOrder"); + + Close(); + return true; +} + +bool +TestRPCChild::RecvTest1_InnerQuery(uint32_t* aResult) +{ + uint32_t result; + if (!SendTest1_InnerEvent(&result)) + fail("SendTest1_InnerEvent"); + if (result != 200) + fail("Wrong result (expected 200)"); + + *aResult = 300; + return true; +} + +bool +TestRPCChild::RecvTest1_NoReenter(uint32_t* aResult) +{ + *aResult = 400; + return true; +} + +bool +TestRPCChild::RecvTest2_FirstUrgent() +{ + return true; +} + +bool +TestRPCChild::RecvTest2_SecondUrgent() +{ + return true; +} + +} // namespace _ipdltest +} // namespace mozilla |