diff -r 000000000000 -r 6474c204b198 ipc/ipdl/test/cxx/TestRaceDeferral.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ipc/ipdl/test/cxx/TestRaceDeferral.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,117 @@ +#include "TestRaceDeferral.h" + +#include "IPDLUnitTests.h" // fail etc. + +using namespace mozilla::ipc; +typedef mozilla::ipc::MessageChannel::Message Message; + +namespace mozilla { +namespace _ipdltest { + +static RacyInterruptPolicy +MediateRace(const Message& parent, const Message& 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 Message& parent, + const Message& 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 Message& parent, + const Message& child) +{ + return MediateRace(parent, child); +} + +} // namespace _ipdltest +} // namespace mozilla