| Index: runtime/vm/message_handler_test.cc
|
| diff --git a/runtime/vm/message_handler_test.cc b/runtime/vm/message_handler_test.cc
|
| index 7bfcb9aa557d851cfc658a40d22ac262e16ceb32..ae7edab83da10bad5e7193caf4af248edf392680 100644
|
| --- a/runtime/vm/message_handler_test.cc
|
| +++ b/runtime/vm/message_handler_test.cc
|
| @@ -39,7 +39,7 @@ class TestMessageHandler : public MessageHandler {
|
| message_count_(0),
|
| start_called_(false),
|
| end_called_(false),
|
| - result_(true) {
|
| + results_(NULL) {
|
| }
|
|
|
| ~TestMessageHandler() {
|
| @@ -50,18 +50,23 @@ class TestMessageHandler : public MessageHandler {
|
| notify_count_++;
|
| }
|
|
|
| - bool HandleMessage(Message* message) {
|
| + MessageStatus HandleMessage(Message* message) {
|
| // For testing purposes, keep a list of the ports
|
| // for all messages we receive.
|
| AddPortToBuffer(message->dest_port());
|
| delete message;
|
| message_count_++;
|
| - return result_;
|
| + MessageStatus status = kOK;
|
| + if (results_ != NULL) {
|
| + status = results_[0];
|
| + results_++;
|
| + }
|
| + return status;
|
| }
|
|
|
| - bool Start() {
|
| + MessageStatus Start() {
|
| start_called_ = true;
|
| - return true;
|
| + return kOK;
|
| }
|
|
|
| void End() {
|
| @@ -75,7 +80,7 @@ class TestMessageHandler : public MessageHandler {
|
| bool start_called() const { return start_called_; }
|
| bool end_called() const { return end_called_; }
|
|
|
| - void set_result(bool result) { result_ = result; }
|
| + void set_results(MessageStatus* results) { results_ = results; }
|
|
|
| private:
|
| void AddPortToBuffer(Dart_Port port) {
|
| @@ -101,13 +106,13 @@ class TestMessageHandler : public MessageHandler {
|
| int message_count_;
|
| bool start_called_;
|
| bool end_called_;
|
| - bool result_;
|
| + MessageStatus* results_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(TestMessageHandler);
|
| };
|
|
|
|
|
| -bool TestStartFunction(uword data) {
|
| +MessageHandler::MessageStatus TestStartFunction(uword data) {
|
| return (reinterpret_cast<TestMessageHandler*>(data))->Start();
|
| }
|
|
|
| @@ -232,7 +237,7 @@ UNIT_TEST_CASE(MessageHandler_HandleNextMessage) {
|
| handler_peer.PostMessage(oob_message2);
|
|
|
| // We handle both oob messages and a single normal message.
|
| - EXPECT(handler.HandleNextMessage());
|
| + EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
|
| EXPECT_EQ(3, handler.message_count());
|
| Dart_Port* ports = handler.port_buffer();
|
| EXPECT_EQ(port2, ports[0]);
|
| @@ -242,6 +247,75 @@ UNIT_TEST_CASE(MessageHandler_HandleNextMessage) {
|
| }
|
|
|
|
|
| +UNIT_TEST_CASE(MessageHandler_HandleNextMessage_ProcessOOBAfterError) {
|
| + TestMessageHandler handler;
|
| + MessageHandler::MessageStatus results[] = {
|
| + MessageHandler::kError, // oob_message1
|
| + MessageHandler::kOK, // oob_message2
|
| + MessageHandler::kOK, // unused
|
| + };
|
| + handler.set_results(results);
|
| + MessageHandlerTestPeer handler_peer(&handler);
|
| + Dart_Port port1 = PortMap::CreatePort(&handler);
|
| + Dart_Port port2 = PortMap::CreatePort(&handler);
|
| + Dart_Port port3 = PortMap::CreatePort(&handler);
|
| + Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority);
|
| + handler_peer.PostMessage(message1);
|
| + Message* oob_message1 = new Message(port2, NULL, 0, Message::kOOBPriority);
|
| + handler_peer.PostMessage(oob_message1);
|
| + Message* oob_message2 = new Message(port3, NULL, 0, Message::kOOBPriority);
|
| + handler_peer.PostMessage(oob_message2);
|
| +
|
| + // When we get an error, we continue processing oob messages but
|
| + // stop handling normal messages.
|
| + EXPECT_EQ(MessageHandler::kError, handler.HandleNextMessage());
|
| + EXPECT_EQ(2, handler.message_count());
|
| + Dart_Port* ports = handler.port_buffer();
|
| + EXPECT_EQ(port2, ports[0]); // oob_message1, error
|
| + EXPECT_EQ(port3, ports[1]); // oob_message2, ok
|
| + handler_peer.CloseAllPorts();
|
| +}
|
| +
|
| +
|
| +UNIT_TEST_CASE(MessageHandler_HandleNextMessage_Shutdown) {
|
| + TestMessageHandler handler;
|
| + MessageHandler::MessageStatus results[] = {
|
| + MessageHandler::kOK, // oob_message1
|
| + MessageHandler::kShutdown, // oob_message2
|
| + MessageHandler::kOK, // unused
|
| + MessageHandler::kOK, // unused
|
| + };
|
| + handler.set_results(results);
|
| + MessageHandlerTestPeer handler_peer(&handler);
|
| + Dart_Port port1 = PortMap::CreatePort(&handler);
|
| + Dart_Port port2 = PortMap::CreatePort(&handler);
|
| + Dart_Port port3 = PortMap::CreatePort(&handler);
|
| + Dart_Port port4 = PortMap::CreatePort(&handler);
|
| + Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority);
|
| + handler_peer.PostMessage(message1);
|
| + Message* oob_message1 = new Message(port2, NULL, 0, Message::kOOBPriority);
|
| + handler_peer.PostMessage(oob_message1);
|
| + Message* oob_message2 = new Message(port3, NULL, 0, Message::kOOBPriority);
|
| + handler_peer.PostMessage(oob_message2);
|
| + Message* oob_message3 = new Message(port4, NULL, 0, Message::kOOBPriority);
|
| + handler_peer.PostMessage(oob_message3);
|
| +
|
| + // When we get a shutdown message, we stop processing all messages.
|
| + EXPECT_EQ(MessageHandler::kShutdown, handler.HandleNextMessage());
|
| + EXPECT_EQ(2, handler.message_count());
|
| + Dart_Port* ports = handler.port_buffer();
|
| + EXPECT_EQ(port2, ports[0]); // oob_message1, ok
|
| + EXPECT_EQ(port3, ports[1]); // oob_message2, shutdown
|
| + {
|
| + // The oob queue has been cleared. oob_message3 is gone.
|
| + MessageHandler::AcquiredQueues aq;
|
| + handler.AcquireQueues(&aq);
|
| + EXPECT(aq.oob_queue()->Length() == 0);
|
| + }
|
| + handler_peer.CloseAllPorts();
|
| +}
|
| +
|
| +
|
| UNIT_TEST_CASE(MessageHandler_HandleOOBMessages) {
|
| TestMessageHandler handler;
|
| MessageHandlerTestPeer handler_peer(&handler);
|
| @@ -259,7 +333,7 @@ UNIT_TEST_CASE(MessageHandler_HandleOOBMessages) {
|
| handler_peer.PostMessage(oob_message2);
|
|
|
| // We handle both oob messages but no normal messages.
|
| - EXPECT(handler.HandleOOBMessages());
|
| + EXPECT_EQ(MessageHandler::kOK, handler.HandleOOBMessages());
|
| EXPECT_EQ(2, handler.message_count());
|
| Dart_Port* ports = handler.port_buffer();
|
| EXPECT_EQ(port3, ports[0]);
|
|
|