summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/cxx/TestSyncWakeup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/ipdl/test/cxx/TestSyncWakeup.cpp')
-rw-r--r--ipc/ipdl/test/cxx/TestSyncWakeup.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/ipc/ipdl/test/cxx/TestSyncWakeup.cpp b/ipc/ipdl/test/cxx/TestSyncWakeup.cpp
new file mode 100644
index 000000000..cce0ca34f
--- /dev/null
+++ b/ipc/ipdl/test/cxx/TestSyncWakeup.cpp
@@ -0,0 +1,134 @@
+#if defined(OS_POSIX)
+#include <unistd.h> // sleep()
+#endif
+
+#include "TestSyncWakeup.h"
+
+#include "IPDLUnitTests.h" // fail etc.
+
+namespace mozilla {
+namespace _ipdltest {
+
+//-----------------------------------------------------------------------------
+// parent
+
+TestSyncWakeupParent::TestSyncWakeupParent()
+{
+ MOZ_COUNT_CTOR(TestSyncWakeupParent);
+}
+
+TestSyncWakeupParent::~TestSyncWakeupParent()
+{
+ MOZ_COUNT_DTOR(TestSyncWakeupParent);
+}
+
+void
+TestSyncWakeupParent::Main()
+{
+ if (!SendStart())
+ fail("sending Start()");
+}
+
+bool
+TestSyncWakeupParent::AnswerStackFrame()
+{
+ if (!CallStackFrame())
+ fail("calling StackFrame()");
+ return true;
+}
+
+bool
+TestSyncWakeupParent::RecvSync1()
+{
+ if (!SendNote1())
+ fail("sending Note1()");
+
+ // XXX ugh ... need to ensure that the async message and sync
+ // reply come in "far enough" apart that this test doesn't pass on
+ // accident
+#if defined(OS_POSIX)
+ // NB: can't use PR_Sleep (i.e. Sleep() on windows) because it's
+ // only spec'd to block the current thread, not the current
+ // process. We need the IO thread to sleep as well.
+ puts(" (sleeping for 5 seconds. sorry!)");
+ sleep(5);
+#endif
+
+ return true;
+}
+
+bool
+TestSyncWakeupParent::RecvSync2()
+{
+ if (!SendNote2())
+ fail("sending Note2()");
+
+#if defined(OS_POSIX)
+ // see above
+ sleep(5);
+ puts(" (sleeping for 5 seconds. sorry!)");
+#endif
+
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// child
+
+TestSyncWakeupChild::TestSyncWakeupChild() : mDone(false)
+{
+ MOZ_COUNT_CTOR(TestSyncWakeupChild);
+}
+
+TestSyncWakeupChild::~TestSyncWakeupChild()
+{
+ MOZ_COUNT_DTOR(TestSyncWakeupChild);
+}
+
+bool
+TestSyncWakeupChild::RecvStart()
+{
+ // First test: the parent fires back an async message while
+ // replying to a sync one
+ if (!SendSync1())
+ fail("sending Sync()");
+
+ // drop back into the event loop to get Note1(), then kick off the
+ // second test
+ return true;
+}
+
+bool
+TestSyncWakeupChild::RecvNote1()
+{
+ // Second test: the parent fires back an async message while
+ // replying to a sync one, with a frame on the RPC stack
+ if (!CallStackFrame())
+ fail("calling StackFrame()");
+
+ if (!mDone)
+ fail("should have received Note2()!");
+
+ Close();
+
+ return true;
+}
+
+bool
+TestSyncWakeupChild::AnswerStackFrame()
+{
+ if (!SendSync2())
+ fail("sending Sync()");
+
+ return true;
+}
+
+bool
+TestSyncWakeupChild::RecvNote2()
+{
+ mDone = true;
+ return true;
+}
+
+} // namespace _ipdltest
+} // namespace mozilla