michael@0: #ifndef mozilla__ipdltest_TestStackHooks_h michael@0: #define mozilla__ipdltest_TestStackHooks_h 1 michael@0: michael@0: #include "mozilla/_ipdltest/IPDLUnitTests.h" michael@0: michael@0: #include "mozilla/_ipdltest/PTestStackHooksParent.h" michael@0: #include "mozilla/_ipdltest/PTestStackHooksChild.h" michael@0: michael@0: namespace mozilla { michael@0: namespace _ipdltest { michael@0: michael@0: michael@0: class TestStackHooksParent : michael@0: public PTestStackHooksParent michael@0: { michael@0: public: michael@0: TestStackHooksParent(); michael@0: virtual ~TestStackHooksParent(); michael@0: michael@0: static bool RunTestInProcesses() { return true; } michael@0: static bool RunTestInThreads() { return true; } michael@0: michael@0: void Main(); michael@0: michael@0: protected: michael@0: virtual bool RecvAsync() MOZ_OVERRIDE { michael@0: if (!mOnStack) michael@0: fail("not on C++ stack?!"); michael@0: return true; michael@0: } michael@0: michael@0: virtual bool RecvSync() MOZ_OVERRIDE { michael@0: if (!mOnStack) michael@0: fail("not on C++ stack?!"); michael@0: return true; michael@0: } michael@0: michael@0: virtual bool AnswerRpc() MOZ_OVERRIDE { michael@0: if (!mOnStack) michael@0: fail("not on C++ stack?!"); michael@0: return true; michael@0: } michael@0: michael@0: virtual bool AnswerStackFrame() MOZ_OVERRIDE; michael@0: michael@0: virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE michael@0: { michael@0: if (NormalShutdown != why) michael@0: fail("unexpected destruction!"); michael@0: passed("ok"); michael@0: QuitParent(); michael@0: } michael@0: michael@0: virtual void EnteredCxxStack() MOZ_OVERRIDE { michael@0: mOnStack = true; michael@0: } michael@0: virtual void ExitedCxxStack() MOZ_OVERRIDE { michael@0: mOnStack = false; michael@0: } michael@0: michael@0: virtual void EnteredCall() MOZ_OVERRIDE { michael@0: ++mIncallDepth; michael@0: } michael@0: virtual void ExitedCall() MOZ_OVERRIDE { michael@0: --mIncallDepth; michael@0: } michael@0: michael@0: private: michael@0: bool mOnStack; michael@0: int mIncallDepth; michael@0: }; michael@0: michael@0: michael@0: class TestStackHooksChild : michael@0: public PTestStackHooksChild michael@0: { michael@0: public: michael@0: TestStackHooksChild(); michael@0: virtual ~TestStackHooksChild(); michael@0: michael@0: void RunTests(); michael@0: michael@0: protected: michael@0: virtual bool RecvStart() MOZ_OVERRIDE; michael@0: michael@0: virtual bool AnswerStackFrame() MOZ_OVERRIDE; michael@0: michael@0: virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE michael@0: { michael@0: if (NormalShutdown != why) michael@0: fail("unexpected destruction!"); michael@0: michael@0: if (mEntered != mExited) michael@0: fail("unbalanced enter/exit notifications"); michael@0: michael@0: if (mOnStack) michael@0: fail("computing mOnStack went awry; should have failed above assertion"); michael@0: michael@0: QuitChild(); michael@0: } michael@0: michael@0: virtual void EnteredCxxStack() MOZ_OVERRIDE { michael@0: ++mEntered; michael@0: mOnStack = true; michael@0: } michael@0: virtual void ExitedCxxStack() MOZ_OVERRIDE { michael@0: ++mExited; michael@0: mOnStack = false; michael@0: } michael@0: michael@0: virtual void EnteredCall() MOZ_OVERRIDE { michael@0: ++mIncallDepth; michael@0: } michael@0: virtual void ExitedCall() MOZ_OVERRIDE { michael@0: --mIncallDepth; michael@0: } michael@0: michael@0: private: michael@0: bool mOnStack; michael@0: int mEntered; michael@0: int mExited; michael@0: int mIncallDepth; michael@0: }; michael@0: michael@0: michael@0: } // namespace _ipdltest michael@0: } // namespace mozilla michael@0: michael@0: michael@0: #endif // ifndef mozilla__ipdltest_TestStackHooks_h