summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/cxx/TestRaceDeferral.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/ipdl/test/cxx/TestRaceDeferral.cpp')
-rw-r--r--ipc/ipdl/test/cxx/TestRaceDeferral.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/ipc/ipdl/test/cxx/TestRaceDeferral.cpp b/ipc/ipdl/test/cxx/TestRaceDeferral.cpp
new file mode 100644
index 000000000..b62d0e2f3
--- /dev/null
+++ b/ipc/ipdl/test/cxx/TestRaceDeferral.cpp
@@ -0,0 +1,118 @@
+#include "TestRaceDeferral.h"
+
+#include "IPDLUnitTests.h" // fail etc.
+
+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 (PTestRaceDeferral::Msg_Win__ID == parent.type()) ?
+ RIPParentWins : RIPChildWins;
+}
+
+//-----------------------------------------------------------------------------
+// parent
+
+TestRaceDeferralParent::TestRaceDeferralParent()
+ : mProcessedLose(false)
+{
+ MOZ_COUNT_CTOR(TestRaceDeferralParent);
+}
+
+TestRaceDeferralParent::~TestRaceDeferralParent()
+{
+ MOZ_COUNT_DTOR(TestRaceDeferralParent);
+
+ if (!mProcessedLose)
+ fail("never processed Lose");
+}
+
+void
+TestRaceDeferralParent::Main()
+{
+ Test1();
+
+ Close();
+}
+
+void
+TestRaceDeferralParent::Test1()
+{
+ if (!SendStartRace())
+ fail("sending StartRace");
+
+ if (!CallWin())
+ fail("calling Win");
+ if (mProcessedLose)
+ fail("Lose didn't lose");
+
+ if (!CallRpc())
+ fail("calling Rpc");
+ if (!mProcessedLose)
+ fail("didn't resolve Rpc vs. Lose 'race' correctly");
+}
+
+bool
+TestRaceDeferralParent::AnswerLose()
+{
+ if (mProcessedLose)
+ fail("processed Lose twice");
+ mProcessedLose = true;
+ return true;
+}
+
+RacyInterruptPolicy
+TestRaceDeferralParent::MediateInterruptRace(const MessageInfo& parent,
+ const MessageInfo& child)
+{
+ return MediateRace(parent, child);
+}
+
+//-----------------------------------------------------------------------------
+// child
+
+TestRaceDeferralChild::TestRaceDeferralChild()
+{
+ MOZ_COUNT_CTOR(TestRaceDeferralChild);
+}
+
+TestRaceDeferralChild::~TestRaceDeferralChild()
+{
+ MOZ_COUNT_DTOR(TestRaceDeferralChild);
+}
+
+bool
+TestRaceDeferralChild::RecvStartRace()
+{
+ if (!CallLose())
+ fail("calling Lose");
+ return true;
+}
+
+bool
+TestRaceDeferralChild::AnswerWin()
+{
+ return true;
+}
+
+bool
+TestRaceDeferralChild::AnswerRpc()
+{
+ return true;
+}
+
+RacyInterruptPolicy
+TestRaceDeferralChild::MediateInterruptRace(const MessageInfo& parent,
+ const MessageInfo& child)
+{
+ return MediateRace(parent, child);
+}
+
+} // namespace _ipdltest
+} // namespace mozilla