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.cpp162
1 files changed, 162 insertions, 0 deletions
diff --git a/ipc/ipdl/test/cxx/TestUrgency.cpp b/ipc/ipdl/test/cxx/TestUrgency.cpp
new file mode 100644
index 000000000..b9b05bcea
--- /dev/null
+++ b/ipc/ipdl/test/cxx/TestUrgency.cpp
@@ -0,0 +1,162 @@
+#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");
+}
+
+bool
+TestUrgencyParent::RecvTest1(uint32_t *value)
+{
+ if (!SendReply1(value))
+ fail("sending Reply1");
+ if (*value != 99)
+ fail("bad value");
+ return true;
+}
+
+bool
+TestUrgencyParent::RecvTest2()
+{
+ uint32_t value;
+ inreply_ = true;
+ if (!SendReply2(&value))
+ fail("sending Reply2");
+ inreply_ = false;
+ if (value != 500)
+ fail("bad value");
+ return true;
+}
+
+bool
+TestUrgencyParent::RecvTest3(uint32_t *value)
+{
+ if (inreply_)
+ fail("nested non-urgent on top of urgent rpc");
+ *value = 1000;
+ return true;
+}
+
+bool
+TestUrgencyParent::RecvFinalTest_Begin()
+{
+ return true;
+}
+
+//-----------------------------------------------------------------------------
+// child
+
+enum {
+ kFirstTestBegin = 1,
+ kFirstTestGotReply,
+ kSecondTestBegin,
+ kSecondTestGotReply,
+};
+
+bool
+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 true;
+}
+
+bool
+TestUrgencyChild::RecvReply1(uint32_t *reply)
+{
+ if (test_ != kFirstTestBegin)
+ fail("wrong test # in RecvReply1");
+
+ *reply = 99;
+ test_ = kFirstTestGotReply;
+ return true;
+}
+
+bool
+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 true;
+}
+
+TestUrgencyChild::TestUrgencyChild()
+ : test_(0)
+{
+ MOZ_COUNT_CTOR(TestUrgencyChild);
+}
+
+TestUrgencyChild::~TestUrgencyChild()
+{
+ MOZ_COUNT_DTOR(TestUrgencyChild);
+}
+
+} // namespace _ipdltest
+} // namespace mozilla