michael@0: #include "TestStackHooks.h" michael@0: michael@0: #include "IPDLUnitTests.h" // fail etc. michael@0: michael@0: michael@0: michael@0: namespace mozilla { michael@0: namespace _ipdltest { michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: // parent michael@0: michael@0: TestStackHooksParent::TestStackHooksParent() : michael@0: mOnStack(false), mIncallDepth(0) michael@0: { michael@0: MOZ_COUNT_CTOR(TestStackHooksParent); michael@0: } michael@0: michael@0: TestStackHooksParent::~TestStackHooksParent() michael@0: { michael@0: MOZ_COUNT_DTOR(TestStackHooksParent); michael@0: } michael@0: michael@0: void michael@0: TestStackHooksParent::Main() michael@0: { michael@0: if (!SendStart()) michael@0: fail("sending Start()"); michael@0: } michael@0: michael@0: michael@0: bool michael@0: TestStackHooksParent::AnswerStackFrame() michael@0: { michael@0: if (!mOnStack) michael@0: fail("not on C++ stack?!"); michael@0: michael@0: if (!CallStackFrame()) michael@0: fail("calling StackFrame()"); michael@0: michael@0: if (!mOnStack) michael@0: fail("not on C++ stack?!"); michael@0: michael@0: if (1 != mIncallDepth) michael@0: fail("missed EnteredCall or ExitedCall hook"); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: //----------------------------------------------------------------------------- michael@0: // child michael@0: michael@0: TestStackHooksChild::TestStackHooksChild() : michael@0: mOnStack(false), michael@0: mEntered(0), michael@0: mExited(0), michael@0: mIncallDepth(0) michael@0: { michael@0: MOZ_COUNT_CTOR(TestStackHooksChild); michael@0: } michael@0: michael@0: TestStackHooksChild::~TestStackHooksChild() michael@0: { michael@0: MOZ_COUNT_DTOR(TestStackHooksChild); michael@0: } michael@0: michael@0: namespace { michael@0: void RunTestsFn() { michael@0: static_cast(gChildActor)->RunTests(); michael@0: } michael@0: } michael@0: michael@0: bool michael@0: TestStackHooksChild::RecvStart() michael@0: { michael@0: if (!mOnStack) michael@0: fail("missed stack notification"); michael@0: michael@0: if (0 != mIncallDepth) michael@0: fail("EnteredCall/ExitedCall malfunction"); michael@0: michael@0: // kick off tests from a runnable so that we can start with michael@0: // MessageChannel code on the C++ stack michael@0: MessageLoop::current()->PostTask(FROM_HERE, michael@0: NewRunnableFunction(RunTestsFn)); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: bool michael@0: TestStackHooksChild::AnswerStackFrame() michael@0: { michael@0: if (!mOnStack) michael@0: fail("missed stack notification"); michael@0: michael@0: if (1 != mIncallDepth) michael@0: fail("missed EnteredCall or ExitedCall hook"); michael@0: michael@0: if (PTestStackHooks::TEST4_3 == state()) { michael@0: if (!SendAsync()) michael@0: fail("sending Async()"); michael@0: } michael@0: else if (PTestStackHooks::TEST5_3 == state()) { michael@0: if (!SendSync()) michael@0: fail("sending Sync()"); michael@0: } michael@0: else { michael@0: fail("unexpected state"); michael@0: } michael@0: michael@0: if (!mOnStack) michael@0: fail("bad stack exit notification"); michael@0: michael@0: return true; michael@0: } michael@0: michael@0: void michael@0: TestStackHooksChild::RunTests() michael@0: { michael@0: // 1 because of RecvStart() michael@0: if (1 != mEntered) michael@0: fail("missed stack notification"); michael@0: if (mOnStack) michael@0: fail("spurious stack notification"); michael@0: if (0 != mIncallDepth) michael@0: fail("EnteredCall/ExitedCall malfunction"); michael@0: michael@0: if (!SendAsync()) michael@0: fail("sending Async()"); michael@0: if (mOnStack) michael@0: fail("spurious stack notification"); michael@0: if (0 != mIncallDepth) michael@0: fail("EnteredCall/ExitedCall malfunction"); michael@0: if (2 != mEntered) michael@0: fail("missed stack notification"); michael@0: michael@0: if (!SendSync()) michael@0: fail("sending Sync()"); michael@0: if (mOnStack) michael@0: fail("spurious stack notification"); michael@0: if (0 != mIncallDepth) michael@0: fail("EnteredCall/ExitedCall malfunction"); michael@0: if (3 != mEntered) michael@0: fail("missed stack notification"); michael@0: michael@0: if (!CallRpc()) michael@0: fail("calling RPC()"); michael@0: if (mOnStack) michael@0: fail("spurious stack notification"); michael@0: if (0 != mIncallDepth) michael@0: fail("EnteredCall/ExitedCall malfunction"); michael@0: if (4 != mEntered) michael@0: fail("missed stack notification"); michael@0: michael@0: if (!CallStackFrame()) michael@0: fail("calling StackFrame()"); michael@0: if (mOnStack) michael@0: fail("spurious stack notification"); michael@0: if (0 != mIncallDepth) michael@0: fail("EnteredCall/ExitedCall malfunction"); michael@0: if (5 != mEntered) michael@0: fail("missed stack notification"); michael@0: michael@0: Close(); michael@0: } michael@0: michael@0: } // namespace _ipdltest michael@0: } // namespace mozilla