OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 #include "vm/message_handler.h" |
| 6 #include "vm/unit_test.h" |
| 7 |
| 8 namespace dart { |
| 9 |
| 10 class MessageHandlerTestPeer { |
| 11 public: |
| 12 explicit MessageHandlerTestPeer(MessageHandler* handler) |
| 13 : handler_(handler) {} |
| 14 |
| 15 MessageQueue* queue() { return handler_->queue_; } |
| 16 MessageQueue* oob_queue() { return handler_->oob_queue_; } |
| 17 |
| 18 private: |
| 19 MessageHandler* handler_; |
| 20 }; |
| 21 |
| 22 |
| 23 class TestMessageHandler : public MessageHandler { |
| 24 public: |
| 25 TestMessageHandler() |
| 26 : port_buffer_(strdup("")), |
| 27 notify_count_(0), |
| 28 result_(true) {} |
| 29 |
| 30 ~TestMessageHandler() { |
| 31 free(port_buffer_); |
| 32 } |
| 33 |
| 34 void MessageNotify(Message::Priority priority) { |
| 35 notify_count_++; |
| 36 } |
| 37 |
| 38 bool HandleMessage(Message* message) { |
| 39 // For testing purposes, keep a string with a list of the ports |
| 40 // for all messages we receive. |
| 41 intptr_t len = |
| 42 OS::SNPrint(NULL, 0, "%s %d", port_buffer_, message->dest_port()) + 1; |
| 43 char* buffer = reinterpret_cast<char*>(malloc(len)); |
| 44 OS::SNPrint(buffer, len, "%s %d", port_buffer_, message->dest_port()); |
| 45 free(port_buffer_); |
| 46 port_buffer_ = buffer; |
| 47 delete message; |
| 48 return result_; |
| 49 } |
| 50 |
| 51 |
| 52 bool Start() { |
| 53 intptr_t len = |
| 54 OS::SNPrint(NULL, 0, "%s start", port_buffer_) + 1; |
| 55 char* buffer = reinterpret_cast<char*>(malloc(len)); |
| 56 OS::SNPrint(buffer, len, "%s start", port_buffer_); |
| 57 free(port_buffer_); |
| 58 port_buffer_ = buffer; |
| 59 return true; |
| 60 } |
| 61 |
| 62 |
| 63 const char* port_buffer() const { return port_buffer_; } |
| 64 int notify_count() const { return notify_count_; } |
| 65 |
| 66 void set_result(bool result) { result_ = result; } |
| 67 |
| 68 private: |
| 69 char* port_buffer_; |
| 70 int notify_count_; |
| 71 bool result_; |
| 72 }; |
| 73 |
| 74 |
| 75 bool TestStartFunction(uword data) { |
| 76 return (reinterpret_cast<TestMessageHandler*>(data))->Start(); |
| 77 } |
| 78 |
| 79 |
| 80 UNIT_TEST_CASE(MessageHandler_PostMessage) { |
| 81 TestMessageHandler handler; |
| 82 MessageHandlerTestPeer handler_peer(&handler); |
| 83 EXPECT_EQ(0, handler.notify_count()); |
| 84 |
| 85 // Post a message. |
| 86 Message* message = new Message(0, 0, NULL, Message::kNormalPriority); |
| 87 handler.PostMessage(message); |
| 88 |
| 89 // The notify callback is called. |
| 90 EXPECT_EQ(1, handler.notify_count()); |
| 91 |
| 92 // The message has been added to the correct queue. |
| 93 EXPECT(message == handler_peer.queue()->Dequeue()); |
| 94 EXPECT(NULL == handler_peer.oob_queue()->Dequeue()); |
| 95 delete message; |
| 96 |
| 97 // Post an oob message. |
| 98 message = new Message(0, 0, NULL, Message::kOOBPriority); |
| 99 handler.PostMessage(message); |
| 100 |
| 101 // The notify callback is called. |
| 102 EXPECT_EQ(2, handler.notify_count()); |
| 103 |
| 104 // The message has been added to the correct queue. |
| 105 EXPECT(message == handler_peer.oob_queue()->Dequeue()); |
| 106 EXPECT(NULL == handler_peer.queue()->Dequeue()); |
| 107 delete message; |
| 108 } |
| 109 |
| 110 |
| 111 UNIT_TEST_CASE(MessageHandler_ClosePort) { |
| 112 TestMessageHandler handler; |
| 113 MessageHandlerTestPeer handler_peer(&handler); |
| 114 Message* message1 = new Message(1, 0, NULL, Message::kNormalPriority); |
| 115 handler.PostMessage(message1); |
| 116 Message* message2 = new Message(2, 0, NULL, Message::kNormalPriority); |
| 117 handler.PostMessage(message2); |
| 118 |
| 119 handler.ClosePort(1); |
| 120 |
| 121 // The message on port 1 is dropped from the queue. |
| 122 EXPECT(message2 == handler_peer.queue()->Dequeue()); |
| 123 EXPECT(NULL == handler_peer.queue()->Dequeue()); |
| 124 delete message2; |
| 125 } |
| 126 |
| 127 |
| 128 UNIT_TEST_CASE(MessageHandler_CloseAllPorts) { |
| 129 TestMessageHandler handler; |
| 130 MessageHandlerTestPeer handler_peer(&handler); |
| 131 Message* message1 = new Message(1, 0, NULL, Message::kNormalPriority); |
| 132 handler.PostMessage(message1); |
| 133 Message* message2 = new Message(2, 0, NULL, Message::kNormalPriority); |
| 134 handler.PostMessage(message2); |
| 135 |
| 136 handler.CloseAllPorts(); |
| 137 |
| 138 // All messages are dropped from the queue. |
| 139 EXPECT(NULL == handler_peer.queue()->Dequeue()); |
| 140 } |
| 141 |
| 142 |
| 143 UNIT_TEST_CASE(MessageHandler_HandleNextMessage) { |
| 144 TestMessageHandler handler; |
| 145 MessageHandlerTestPeer handler_peer(&handler); |
| 146 Message* message1 = new Message(1, 0, NULL, Message::kNormalPriority); |
| 147 handler.PostMessage(message1); |
| 148 Message* message2 = new Message(2, 0, NULL, Message::kNormalPriority); |
| 149 handler.PostMessage(message2); |
| 150 Message* oob_message1 = new Message(3, 0, NULL, Message::kOOBPriority); |
| 151 handler.PostMessage(oob_message1); |
| 152 Message* oob_message2 = new Message(4, 0, NULL, Message::kOOBPriority); |
| 153 handler.PostMessage(oob_message2); |
| 154 |
| 155 // We handle both oob messages and a single normal message. |
| 156 EXPECT(handler.HandleNextMessage()); |
| 157 EXPECT_STREQ(" 3 4 1", handler.port_buffer()); |
| 158 handler.CloseAllPorts(); |
| 159 } |
| 160 |
| 161 |
| 162 UNIT_TEST_CASE(MessageHandler_HandleOOBMessages) { |
| 163 TestMessageHandler handler; |
| 164 MessageHandlerTestPeer handler_peer(&handler); |
| 165 Message* message1 = new Message(1, 0, NULL, Message::kNormalPriority); |
| 166 handler.PostMessage(message1); |
| 167 Message* message2 = new Message(2, 0, NULL, Message::kNormalPriority); |
| 168 handler.PostMessage(message2); |
| 169 Message* oob_message1 = new Message(3, 0, NULL, Message::kOOBPriority); |
| 170 handler.PostMessage(oob_message1); |
| 171 Message* oob_message2 = new Message(4, 0, NULL, Message::kOOBPriority); |
| 172 handler.PostMessage(oob_message2); |
| 173 |
| 174 // We handle both oob messages but no normal messages. |
| 175 EXPECT(handler.HandleOOBMessages()); |
| 176 EXPECT_STREQ(" 3 4", handler.port_buffer()); |
| 177 handler.CloseAllPorts(); |
| 178 } |
| 179 |
| 180 |
| 181 UNIT_TEST_CASE(MessageHandler_RunBlocking) { |
| 182 ThreadPool pool; |
| 183 TestMessageHandler handler; |
| 184 Message* message1 = new Message(1, 0, NULL, Message::kNormalPriority); |
| 185 handler.PostMessage(message1); |
| 186 handler.RunBlocking(&pool, |
| 187 TestStartFunction, |
| 188 reinterpret_cast<uword>(&handler)); |
| 189 EXPECT_STREQ(" start 1", handler.port_buffer()); |
| 190 } |
| 191 |
| 192 |
| 193 } // namespace dart |
OLD | NEW |