summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/cxx/TestFailedCtor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/ipdl/test/cxx/TestFailedCtor.cpp')
-rw-r--r--ipc/ipdl/test/cxx/TestFailedCtor.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/ipc/ipdl/test/cxx/TestFailedCtor.cpp b/ipc/ipdl/test/cxx/TestFailedCtor.cpp
new file mode 100644
index 0000000000..2f08d2eeb0
--- /dev/null
+++ b/ipc/ipdl/test/cxx/TestFailedCtor.cpp
@@ -0,0 +1,112 @@
+#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();
+}
+
+mozilla::ipc::IPCResult
+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 IPC_FAIL_NO_REASON(this);
+}
+
+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