diff options
Diffstat (limited to 'ipc/ipdl/test/cxx/TestRaceDeadlock.cpp')
-rw-r--r-- | ipc/ipdl/test/cxx/TestRaceDeadlock.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/ipc/ipdl/test/cxx/TestRaceDeadlock.cpp b/ipc/ipdl/test/cxx/TestRaceDeadlock.cpp new file mode 100644 index 0000000000..76defe97a5 --- /dev/null +++ b/ipc/ipdl/test/cxx/TestRaceDeadlock.cpp @@ -0,0 +1,102 @@ +#include "TestRaceDeadlock.h" + +#include "IPDLUnitTests.h" // fail etc. + +// #define TEST_TIMEOUT 5000 + +using namespace mozilla::ipc; +typedef mozilla::ipc::MessageChannel::Message Message; +typedef mozilla::ipc::MessageChannel::MessageInfo MessageInfo; + +namespace mozilla { +namespace _ipdltest { + +static RacyInterruptPolicy MediateRace(const MessageInfo& parent, + const MessageInfo& child) { + return (PTestRaceDeadlock::Msg_Win__ID == parent.type()) ? RIPParentWins + : RIPChildWins; +} + +//----------------------------------------------------------------------------- +// parent + +TestRaceDeadlockParent::TestRaceDeadlockParent() { + MOZ_COUNT_CTOR(TestRaceDeadlockParent); +} + +TestRaceDeadlockParent::~TestRaceDeadlockParent() { + MOZ_COUNT_DTOR(TestRaceDeadlockParent); +} + +void TestRaceDeadlockParent::Main() { + Test1(); + + Close(); +} + +bool TestRaceDeadlockParent::ShouldContinueFromReplyTimeout() { + fail("This test should not hang"); + GetIPCChannel()->CloseWithTimeout(); + return false; +} + +void TestRaceDeadlockParent::Test1() { +#if defined(TEST_TIMEOUT) + SetReplyTimeoutMs(TEST_TIMEOUT); +#endif + if (!SendStartRace()) { + fail("sending StartRace"); + } + if (!CallRpc()) { + fail("calling Rpc"); + } +} + +mozilla::ipc::IPCResult TestRaceDeadlockParent::AnswerLose() { + return IPC_OK(); +} + +RacyInterruptPolicy TestRaceDeadlockParent::MediateInterruptRace( + const MessageInfo& parent, const MessageInfo& child) { + return MediateRace(parent, child); +} + +//----------------------------------------------------------------------------- +// child + +TestRaceDeadlockChild::TestRaceDeadlockChild() { + MOZ_COUNT_CTOR(TestRaceDeadlockChild); +} + +TestRaceDeadlockChild::~TestRaceDeadlockChild() { + MOZ_COUNT_DTOR(TestRaceDeadlockChild); +} + +mozilla::ipc::IPCResult TestRaceDeadlockParent::RecvStartRace() { + if (!CallWin()) { + fail("calling Win"); + } + return IPC_OK(); +} + +mozilla::ipc::IPCResult TestRaceDeadlockChild::RecvStartRace() { + if (!SendStartRace()) { + fail("calling SendStartRace"); + } + if (!CallLose()) { + fail("calling Lose"); + } + return IPC_OK(); +} + +mozilla::ipc::IPCResult TestRaceDeadlockChild::AnswerWin() { return IPC_OK(); } + +mozilla::ipc::IPCResult TestRaceDeadlockChild::AnswerRpc() { return IPC_OK(); } + +RacyInterruptPolicy TestRaceDeadlockChild::MediateInterruptRace( + const MessageInfo& parent, const MessageInfo& child) { + return MediateRace(parent, child); +} + +} // namespace _ipdltest +} // namespace mozilla |