michael@0: #include "TestRPC.h" michael@0: michael@0: #include "IPDLUnitTests.h" // fail etc. michael@0: #if defined(OS_POSIX) michael@0: #include michael@0: #else michael@0: #include michael@0: #endif michael@0: michael@0: namespace mozilla { michael@0: namespace _ipdltest { michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: // parent michael@0: michael@0: TestRPCParent::TestRPCParent() michael@0: : reentered_(false), michael@0: resolved_first_cpow_(false) michael@0: { michael@0: MOZ_COUNT_CTOR(TestRPCParent); michael@0: } michael@0: michael@0: TestRPCParent::~TestRPCParent() michael@0: { michael@0: MOZ_COUNT_DTOR(TestRPCParent); michael@0: } michael@0: michael@0: void michael@0: TestRPCParent::Main() michael@0: { michael@0: if (!SendStart()) michael@0: fail("sending Start"); michael@0: } michael@0: michael@0: bool michael@0: TestRPCParent::AnswerTest1_Start(uint32_t* aResult) michael@0: { michael@0: uint32_t result; michael@0: if (!CallTest1_InnerQuery(&result)) michael@0: fail("CallTest1_InnerQuery"); michael@0: if (result != 300) michael@0: fail("Wrong result (expected 300)"); michael@0: michael@0: *aResult = 100; michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCParent::AnswerTest1_InnerEvent(uint32_t* aResult) michael@0: { michael@0: uint32_t result; michael@0: if (!CallTest1_NoReenter(&result)) michael@0: fail("CallTest1_NoReenter"); michael@0: if (result != 400) michael@0: fail("Wrong result (expected 400)"); michael@0: michael@0: *aResult = 200; michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCParent::RecvTest2_Start() michael@0: { michael@0: // Send a CPOW. During this time, we must NOT process the RPC message, as michael@0: // we could start receiving CPOW replies out-of-order. michael@0: if (!CallTest2_FirstUrgent()) michael@0: fail("CallTest2_FirstUrgent"); michael@0: michael@0: MOZ_ASSERT(!reentered_); michael@0: resolved_first_cpow_ = true; michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCParent::AnswerTest2_OutOfOrder() michael@0: { michael@0: // Send a CPOW. If this RPC call was initiated while waiting for the first michael@0: // CPOW to resolve, replies will be processed out of order, and we'll crash. michael@0: if (!CallTest2_SecondUrgent()) michael@0: fail("CallTest2_SecondUrgent"); michael@0: michael@0: reentered_ = true; michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCParent::RecvTest3_Start(uint32_t* aResult) michael@0: { michael@0: if (!CallTest3_WakeUp(aResult)) michael@0: fail("CallTest3_WakeUp"); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCParent::AnswerTest3_InnerEvent(uint32_t* aResult) michael@0: { michael@0: *aResult = 200; michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCParent::AnswerTest4_Start(uint32_t* aResult) michael@0: { michael@0: if (!CallTest4_WakeUp(aResult)) michael@0: fail("CallTest4_WakeUp"); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCParent::AnswerTest4_Inner(uint32_t* aResult) michael@0: { michael@0: *aResult = 700; michael@0: return true; michael@0: } michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: // child michael@0: michael@0: michael@0: TestRPCChild::TestRPCChild() michael@0: { michael@0: MOZ_COUNT_CTOR(TestRPCChild); michael@0: } michael@0: michael@0: TestRPCChild::~TestRPCChild() michael@0: { michael@0: MOZ_COUNT_DTOR(TestRPCChild); michael@0: } michael@0: michael@0: bool michael@0: TestRPCChild::RecvStart() michael@0: { michael@0: uint32_t result; michael@0: if (!CallTest1_Start(&result)) michael@0: fail("CallTest1_Start"); michael@0: if (result != 100) michael@0: fail("Wrong result (expected 100)"); michael@0: michael@0: if (!SendTest2_Start()) michael@0: fail("SendTest2_Start"); michael@0: michael@0: if (!CallTest2_OutOfOrder()) michael@0: fail("CallTest2_OutOfOrder"); michael@0: michael@0: result = 0; michael@0: if (!SendTest3_Start(&result)) michael@0: fail("SendTest3_Start"); michael@0: if (result != 200) michael@0: fail("Wrong result (expected 200)"); michael@0: michael@0: // See bug 937216 (RPC calls within interrupts). michael@0: if (!CallTest4_Start(&result)) michael@0: fail("SendTest4_Start"); michael@0: if (result != 700) michael@0: fail("Wrong result (expected 700)"); michael@0: michael@0: Close(); michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCChild::AnswerTest1_InnerQuery(uint32_t* aResult) michael@0: { michael@0: uint32_t result; michael@0: if (!CallTest1_InnerEvent(&result)) michael@0: fail("CallTest1_InnerEvent"); michael@0: if (result != 200) michael@0: fail("Wrong result (expected 200)"); michael@0: michael@0: *aResult = 300; michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCChild::AnswerTest1_NoReenter(uint32_t* aResult) michael@0: { michael@0: *aResult = 400; michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCChild::AnswerTest2_FirstUrgent() michael@0: { michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCChild::AnswerTest2_SecondUrgent() michael@0: { michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCChild::AnswerTest3_WakeUp(uint32_t* aResult) michael@0: { michael@0: if (!CallTest3_InnerEvent(aResult)) michael@0: fail("CallTest3_InnerEvent"); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestRPCChild::AnswerTest4_WakeUp(uint32_t* aResult) michael@0: { michael@0: if (!CallTest4_Inner(aResult)) michael@0: fail("CallTest4_Inner"); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: } // namespace _ipdltest michael@0: } // namespace mozilla