diff options
Diffstat (limited to 'ipc/ipdl/test/cxx/TestFailedCtor.cpp')
-rw-r--r-- | ipc/ipdl/test/cxx/TestFailedCtor.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/ipc/ipdl/test/cxx/TestFailedCtor.cpp b/ipc/ipdl/test/cxx/TestFailedCtor.cpp new file mode 100644 index 000000000..12ea8fdc1 --- /dev/null +++ b/ipc/ipdl/test/cxx/TestFailedCtor.cpp @@ -0,0 +1,137 @@ +#include "TestFailedCtor.h" + +#include "IPDLUnitTests.h" // fail etc. + +namespace mozilla { +namespace _ipdltest { + +//----------------------------------------------------------------------------- +// parent +void +TestFailedCtorParent::Main() +{ + PTestFailedCtorSubParent* p = CallPTestFailedCtorSubConstructor(); + if (p) + fail("expected ctor to fail"); + + Close(); +} + +PTestFailedCtorSubParent* +TestFailedCtorParent::AllocPTestFailedCtorSubParent() +{ + return new TestFailedCtorSubParent(); +} +bool +TestFailedCtorParent::DeallocPTestFailedCtorSubParent(PTestFailedCtorSubParent* actor) +{ + delete actor; + return true; +} + +PTestFailedCtorSubsubParent* +TestFailedCtorSubParent::AllocPTestFailedCtorSubsubParent() +{ + TestFailedCtorSubsub* a = new TestFailedCtorSubsub(); + if (!mOne) { + return mOne = a; + } else if (!mTwo) { + return mTwo = a; + } else if (!mThree) { + return mThree = a; + } else { + fail("unexpected Alloc()"); + return nullptr; + } +} +bool +TestFailedCtorSubParent::DeallocPTestFailedCtorSubsubParent(PTestFailedCtorSubsubParent* actor) +{ + static_cast<TestFailedCtorSubsub*>(actor)->mDealloced = true; + return true; +} + +void +TestFailedCtorSubParent::ActorDestroy(ActorDestroyReason why) +{ + + if (mOne->mWhy != Deletion) + fail("Subsub one got wrong ActorDestroyReason"); + if (mTwo->mWhy != AncestorDeletion) + fail("Subsub two got wrong ActorDestroyReason"); + if (mThree->mWhy != AncestorDeletion) + fail("Subsub three got wrong ActorDestroyReason"); + + if (FailedConstructor != why) + fail("unexpected destruction!"); +} + +TestFailedCtorSubParent::~TestFailedCtorSubParent() +{ + if (!(mOne->mDealloced && mTwo->mDealloced && mThree->mDealloced)) + fail("Not all subsubs were Dealloc'd"); + delete mOne; + delete mTwo; + delete mThree; +} + + +//----------------------------------------------------------------------------- +// child + +PTestFailedCtorSubChild* +TestFailedCtorChild::AllocPTestFailedCtorSubChild() +{ + return new TestFailedCtorSubChild(); +} + +bool +TestFailedCtorChild::AnswerPTestFailedCtorSubConstructor(PTestFailedCtorSubChild* actor) +{ + PTestFailedCtorSubsubChild* c1 = actor->SendPTestFailedCtorSubsubConstructor(); + PTestFailedCtorSubsubChild::Send__delete__(c1); + + if (!actor->SendPTestFailedCtorSubsubConstructor() || + !actor->SendPTestFailedCtorSubsubConstructor() || + !actor->SendSync()) + fail("setting up test"); + + // This causes our process to die + return false; +} + +bool +TestFailedCtorChild::DeallocPTestFailedCtorSubChild(PTestFailedCtorSubChild* actor) +{ + delete actor; + return true; +} + +void +TestFailedCtorChild::ProcessingError(Result aCode, const char* aReason) +{ + if (OtherPid() != base::GetCurrentProcId()) // thread-mode + _exit(0); +} + +PTestFailedCtorSubsubChild* +TestFailedCtorSubChild::AllocPTestFailedCtorSubsubChild() +{ + return new TestFailedCtorSubsub(); +} + +bool +TestFailedCtorSubChild::DeallocPTestFailedCtorSubsubChild(PTestFailedCtorSubsubChild* actor) +{ + delete actor; + return true; +} + +void +TestFailedCtorSubChild::ActorDestroy(ActorDestroyReason why) +{ +} + + +} // namespace _ipdltest +} // namespace mozilla |