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.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/ipc/ipdl/test/cxx/TestSyncWakeup.cpp b/ipc/ipdl/test/cxx/TestSyncWakeup.cpp
new file mode 100644
index 0000000000..90875b702b
--- /dev/null
+++ b/ipc/ipdl/test/cxx/TestSyncWakeup.cpp
@@ -0,0 +1,106 @@
+#if defined(XP_UNIX)
+# 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()");
+}
+
+mozilla::ipc::IPCResult TestSyncWakeupParent::AnswerStackFrame() {
+ if (!CallStackFrame()) fail("calling StackFrame()");
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult 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(XP_UNIX)
+ // 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 IPC_OK();
+}
+
+mozilla::ipc::IPCResult TestSyncWakeupParent::RecvSync2() {
+ if (!SendNote2()) fail("sending Note2()");
+
+#if defined(XP_UNIX)
+ // see above
+ sleep(5);
+ puts(" (sleeping for 5 seconds. sorry!)");
+#endif
+
+ return IPC_OK();
+}
+
+//-----------------------------------------------------------------------------
+// child
+
+TestSyncWakeupChild::TestSyncWakeupChild() : mDone(false) {
+ MOZ_COUNT_CTOR(TestSyncWakeupChild);
+}
+
+TestSyncWakeupChild::~TestSyncWakeupChild() {
+ MOZ_COUNT_DTOR(TestSyncWakeupChild);
+}
+
+mozilla::ipc::IPCResult 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 IPC_OK();
+}
+
+mozilla::ipc::IPCResult 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 IPC_OK();
+}
+
+mozilla::ipc::IPCResult TestSyncWakeupChild::AnswerStackFrame() {
+ if (!SendSync2()) fail("sending Sync()");
+
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult TestSyncWakeupChild::RecvNote2() {
+ mDone = true;
+ return IPC_OK();
+}
+
+} // namespace _ipdltest
+} // namespace mozilla