summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/cxx/TestUrgency.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/ipdl/test/cxx/TestUrgency.cpp')
-rw-r--r--ipc/ipdl/test/cxx/TestUrgency.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/ipc/ipdl/test/cxx/TestUrgency.cpp b/ipc/ipdl/test/cxx/TestUrgency.cpp
new file mode 100644
index 0000000000..5845f8210d
--- /dev/null
+++ b/ipc/ipdl/test/cxx/TestUrgency.cpp
@@ -0,0 +1,117 @@
+#include "TestUrgency.h"
+
+#include "IPDLUnitTests.h" // fail etc.
+#if defined(OS_POSIX)
+# include <unistd.h>
+#else
+# include <windows.h>
+#endif
+
+namespace mozilla {
+namespace _ipdltest {
+
+#if defined(OS_POSIX)
+static void Sleep(int ms) { sleep(ms / 1000); }
+#endif
+
+//-----------------------------------------------------------------------------
+// parent
+
+TestUrgencyParent::TestUrgencyParent() : inreply_(false) {
+ MOZ_COUNT_CTOR(TestUrgencyParent);
+}
+
+TestUrgencyParent::~TestUrgencyParent() { MOZ_COUNT_DTOR(TestUrgencyParent); }
+
+void TestUrgencyParent::Main() {
+ if (!SendStart()) fail("sending Start");
+}
+
+mozilla::ipc::IPCResult TestUrgencyParent::RecvTest1(uint32_t* value) {
+ if (!SendReply1(value)) fail("sending Reply1");
+ if (*value != 99) fail("bad value");
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult TestUrgencyParent::RecvTest2() {
+ uint32_t value;
+ inreply_ = true;
+ if (!SendReply2(&value)) fail("sending Reply2");
+ inreply_ = false;
+ if (value != 500) fail("bad value");
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult TestUrgencyParent::RecvTest3(uint32_t* value) {
+ if (inreply_) fail("nested non-urgent on top of urgent rpc");
+ *value = 1000;
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult TestUrgencyParent::RecvFinalTest_Begin() {
+ return IPC_OK();
+}
+
+//-----------------------------------------------------------------------------
+// child
+
+enum {
+ kFirstTestBegin = 1,
+ kFirstTestGotReply,
+ kSecondTestBegin,
+ kSecondTestGotReply,
+};
+
+mozilla::ipc::IPCResult TestUrgencyChild::RecvStart() {
+ uint32_t result;
+
+ // Send a synchronous message, expect to get an urgent message while
+ // blocked.
+ test_ = kFirstTestBegin;
+ if (!SendTest1(&result)) fail("calling SendTest1");
+ if (result != 99) fail("bad result in RecvStart");
+ if (test_ != kFirstTestGotReply) fail("never received urgent message");
+
+ // Initiate the next test by sending an asynchronous message, then becoming
+ // blocked. This tests that the urgent message is still delivered properly,
+ // and that the parent does not try to service the sync
+ test_ = kSecondTestBegin;
+ if (!SendTest2()) fail("calling SendTest2");
+ if (!SendTest3(&result)) fail("calling SendTest3");
+ if (test_ != kSecondTestGotReply) fail("never received urgent message #2");
+ if (result != 1000) fail("wrong value from test3");
+
+ if (!SendFinalTest_Begin()) fail("Final test should have succeeded");
+
+ Close();
+
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult TestUrgencyChild::RecvReply1(uint32_t* reply) {
+ if (test_ != kFirstTestBegin) fail("wrong test # in RecvReply1");
+
+ *reply = 99;
+ test_ = kFirstTestGotReply;
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult TestUrgencyChild::RecvReply2(uint32_t* reply) {
+ if (test_ != kSecondTestBegin) fail("wrong test # in RecvReply2");
+
+ // sleep for 5 seconds so the parent process tries to deliver more messages.
+ Sleep(5000);
+
+ *reply = 500;
+ test_ = kSecondTestGotReply;
+ return IPC_OK();
+}
+
+TestUrgencyChild::TestUrgencyChild() : test_(0) {
+ MOZ_COUNT_CTOR(TestUrgencyChild);
+}
+
+TestUrgencyChild::~TestUrgencyChild() { MOZ_COUNT_DTOR(TestUrgencyChild); }
+
+} // namespace _ipdltest
+} // namespace mozilla