michael@0: #include "TestRaceDeferral.h" michael@0: michael@0: #include "IPDLUnitTests.h" // fail etc. michael@0: michael@0: using namespace mozilla::ipc; michael@0: typedef mozilla::ipc::MessageChannel::Message Message; michael@0: michael@0: namespace mozilla { michael@0: namespace _ipdltest { michael@0: michael@0: static RacyInterruptPolicy michael@0: MediateRace(const Message& parent, const Message& child) michael@0: { michael@0: return (PTestRaceDeferral::Msg_Win__ID == parent.type()) ? michael@0: RIPParentWins : RIPChildWins; michael@0: } michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: // parent michael@0: michael@0: TestRaceDeferralParent::TestRaceDeferralParent() michael@0: : mProcessedLose(false) michael@0: { michael@0: MOZ_COUNT_CTOR(TestRaceDeferralParent); michael@0: } michael@0: michael@0: TestRaceDeferralParent::~TestRaceDeferralParent() michael@0: { michael@0: MOZ_COUNT_DTOR(TestRaceDeferralParent); michael@0: michael@0: if (!mProcessedLose) michael@0: fail("never processed Lose"); michael@0: } michael@0: michael@0: void michael@0: TestRaceDeferralParent::Main() michael@0: { michael@0: Test1(); michael@0: michael@0: Close(); michael@0: } michael@0: michael@0: void michael@0: TestRaceDeferralParent::Test1() michael@0: { michael@0: if (!SendStartRace()) michael@0: fail("sending StartRace"); michael@0: michael@0: if (!CallWin()) michael@0: fail("calling Win"); michael@0: if (mProcessedLose) michael@0: fail("Lose didn't lose"); michael@0: michael@0: if (!CallRpc()) michael@0: fail("calling Rpc"); michael@0: if (!mProcessedLose) michael@0: fail("didn't resolve Rpc vs. Lose 'race' correctly"); michael@0: } michael@0: michael@0: bool michael@0: TestRaceDeferralParent::AnswerLose() michael@0: { michael@0: if (mProcessedLose) michael@0: fail("processed Lose twice"); michael@0: mProcessedLose = true; michael@0: return true; michael@0: } michael@0: michael@0: RacyInterruptPolicy michael@0: TestRaceDeferralParent::MediateInterruptRace(const Message& parent, michael@0: const Message& child) michael@0: { michael@0: return MediateRace(parent, child); michael@0: } michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: // child michael@0: michael@0: TestRaceDeferralChild::TestRaceDeferralChild() michael@0: { michael@0: MOZ_COUNT_CTOR(TestRaceDeferralChild); michael@0: } michael@0: michael@0: TestRaceDeferralChild::~TestRaceDeferralChild() michael@0: { michael@0: MOZ_COUNT_DTOR(TestRaceDeferralChild); michael@0: } michael@0: michael@0: bool michael@0: TestRaceDeferralChild::RecvStartRace() michael@0: { michael@0: if (!CallLose()) michael@0: fail("calling Lose"); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRaceDeferralChild::AnswerWin() michael@0: { michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRaceDeferralChild::AnswerRpc() michael@0: { michael@0: return true; michael@0: } michael@0: michael@0: RacyInterruptPolicy michael@0: TestRaceDeferralChild::MediateInterruptRace(const Message& parent, michael@0: const Message& child) michael@0: { michael@0: return MediateRace(parent, child); michael@0: } michael@0: michael@0: } // namespace _ipdltest michael@0: } // namespace mozilla