Chromium Code Reviews| Index: runtime/vm/message_queue_test.cc |
| =================================================================== |
| --- runtime/vm/message_queue_test.cc (revision 3210) |
| +++ runtime/vm/message_queue_test.cc (working copy) |
| @@ -14,15 +14,23 @@ |
| public: |
| explicit MessageQueueTestPeer(MessageQueue* queue) : queue_(queue) {} |
| - bool HasMessage() const { return queue_->head_ != NULL; } |
| + bool HasMessage() const { |
| + // We don't really need to grab the monitor during the unit test, |
| + // but it doesn't hurt. |
| + queue_->monitor_.Enter(); |
|
Anton Muhin
2012/01/13 14:26:53
nit: can you use locker here?
|
| + bool result = (queue_->head_[Message::kNormalPriority] != NULL || |
| + queue_->head_[Message::kOOBPriority] != NULL); |
| + queue_->monitor_.Exit(); |
| + return result; |
| + } |
| private: |
| MessageQueue* queue_; |
| }; |
| -static Dart_Message AllocMsg(const char* str) { |
| - return reinterpret_cast<Dart_Message>(strdup(str)); |
| +static uint8_t* AllocMsg(const char* str) { |
| + return reinterpret_cast<uint8_t*>(strdup(str)); |
| } |
| @@ -34,16 +42,19 @@ |
| Dart_Port port = 1; |
| // Add two messages. |
| - PortMessage* msg1 = new PortMessage(port, 0, AllocMsg("msg1")); |
| + Message* msg1 = |
| + new Message(port, 0, AllocMsg("msg1"), Message::kNormalPriority); |
| queue.Enqueue(msg1); |
| EXPECT(queue_peer.HasMessage()); |
| - PortMessage* msg2 = new PortMessage(port, 0, AllocMsg("msg2")); |
| + Message* msg2 = |
| + new Message(port, 0, AllocMsg("msg2"), Message::kNormalPriority); |
| + |
| queue.Enqueue(msg2); |
| EXPECT(queue_peer.HasMessage()); |
| // Remove two messages. |
| - PortMessage* msg = queue.Dequeue(0); |
| + Message* msg = queue.Dequeue(0); |
| EXPECT(msg != NULL); |
| EXPECT_STREQ("msg1", reinterpret_cast<char*>(msg->data())); |
| EXPECT(queue_peer.HasMessage()); |
| @@ -58,6 +69,41 @@ |
| } |
| +TEST_CASE(MessageQueue_Priorities) { |
| + MessageQueue queue; |
| + MessageQueueTestPeer queue_peer(&queue); |
| + EXPECT(!queue_peer.HasMessage()); |
| + |
| + Dart_Port port = 1; |
| + |
| + // Add two messages. |
| + Message* msg1 = |
| + new Message(port, 0, AllocMsg("msg1"), Message::kNormalPriority); |
| + queue.Enqueue(msg1); |
| + EXPECT(queue_peer.HasMessage()); |
| + |
| + Message* msg2 = |
| + new Message(port, 0, AllocMsg("msg2"), Message::kOOBPriority); |
| + |
| + queue.Enqueue(msg2); |
| + EXPECT(queue_peer.HasMessage()); |
| + |
| + // The higher priority message is delivered first. |
| + Message* msg = queue.Dequeue(0); |
| + EXPECT(msg != NULL); |
| + EXPECT_STREQ("msg2", reinterpret_cast<char*>(msg->data())); |
| + EXPECT(queue_peer.HasMessage()); |
| + |
| + msg = queue.Dequeue(0); |
| + EXPECT(msg != NULL); |
| + EXPECT_STREQ("msg1", reinterpret_cast<char*>(msg->data())); |
| + EXPECT(!queue_peer.HasMessage()); |
| + |
| + delete msg1; |
| + delete msg2; |
| +} |
| + |
| + |
| // A thread which receives an expected sequence of messages. |
| static Monitor* sync = NULL; |
| static MessageQueue* shared_queue = NULL; |
| @@ -85,19 +131,19 @@ |
| } |
| for (int i = 0; i < 3; i++) { |
| - PortMessage* msg = queue->Dequeue(0); |
| + Message* msg = queue->Dequeue(0); |
| EXPECT(msg != NULL); |
| - EXPECT_EQ(i+10, msg->dest_port()); |
| - EXPECT_EQ(i+100, msg->reply_port()); |
| - EXPECT_EQ(i+1000, *(reinterpret_cast<int*>(msg->data()))); |
| + EXPECT_EQ(i + 10, msg->dest_port()); |
| + EXPECT_EQ(i + 100, msg->reply_port()); |
| + EXPECT_EQ(i + 1000, *(reinterpret_cast<int*>(msg->data()))); |
| delete msg; |
| } |
| for (int i = 0; i < 3; i++) { |
| - PortMessage* msg = queue->Dequeue(0); |
| + Message* msg = queue->Dequeue(0); |
| EXPECT(msg != NULL); |
| - EXPECT_EQ(i+20, msg->dest_port()); |
| - EXPECT_EQ(i+200, msg->reply_port()); |
| - EXPECT_EQ(i+2000, *(reinterpret_cast<int*>(msg->data()))); |
| + EXPECT_EQ(i + 20, msg->dest_port()); |
| + EXPECT_EQ(i + 200, msg->reply_port()); |
| + EXPECT_EQ(i + 2000, *(reinterpret_cast<int*>(msg->data()))); |
| delete msg; |
| } |
| shared_queue = NULL; |
| @@ -122,9 +168,10 @@ |
| // Pile up three messages before the other thread runs. |
| for (int i = 0; i < 3; i++) { |
| int* data = reinterpret_cast<int*>(malloc(sizeof(*data))); |
| - *data = i+1000; |
| - PortMessage* msg = |
| - new PortMessage(i+10, i+100, reinterpret_cast<Dart_Message>(data)); |
| + *data = i + 1000; |
| + Message* msg = |
| + new Message(i + 10, i + 100, reinterpret_cast<uint8_t*>(data), |
| + Message::kNormalPriority); |
| shared_queue->Enqueue(msg); |
| } |
| @@ -139,9 +186,10 @@ |
| OS::Sleep(5); |
| for (int i = 0; i < 3; i++) { |
| int* data = reinterpret_cast<int*>(malloc(sizeof(*data))); |
| - *data = i+2000; |
| - PortMessage* msg = |
| - new PortMessage(i+20, i+200, reinterpret_cast<Dart_Message>(data)); |
| + *data = i + 2000; |
| + Message* msg = |
| + new Message(i + 20, i + 200, reinterpret_cast<uint8_t*>(data), |
| + Message::kNormalPriority); |
| shared_queue->Enqueue(msg); |
| } |
| @@ -160,9 +208,11 @@ |
| Dart_Port port2 = 2; |
| // Add two messages. |
| - PortMessage* msg1 = new PortMessage(port1, 0, AllocMsg("msg1")); |
| + Message* msg1 = |
| + new Message(port1, 0, AllocMsg("msg1"), Message::kNormalPriority); |
| queue.Enqueue(msg1); |
| - PortMessage* msg2 = new PortMessage(port2, 0, AllocMsg("msg2")); |
| + Message* msg2 = |
| + new Message(port2, 0, AllocMsg("msg2"), Message::kNormalPriority); |
| queue.Enqueue(msg2); |
| EXPECT(queue_peer.HasMessage()); |
| @@ -180,9 +230,11 @@ |
| Dart_Port port2 = 2; |
| // Add two messages on different ports. |
| - PortMessage* msg1 = new PortMessage(port1, 0, AllocMsg("msg1")); |
| + Message* msg1 = |
| + new Message(port1, 0, AllocMsg("msg1"), Message::kNormalPriority); |
| queue.Enqueue(msg1); |
| - PortMessage* msg2 = new PortMessage(port2, 0, AllocMsg("msg2")); |
| + Message* msg2 = |
| + new Message(port2, 0, AllocMsg("msg2"), Message::kNormalPriority); |
| queue.Enqueue(msg2); |
| EXPECT(queue_peer.HasMessage()); |
| @@ -190,7 +242,7 @@ |
| // One message is left in the queue. |
| EXPECT(queue_peer.HasMessage()); |
| - PortMessage* msg = queue.Dequeue(0); |
| + Message* msg = queue.Dequeue(0); |
| EXPECT(msg != NULL); |
| EXPECT_STREQ("msg2", reinterpret_cast<char*>(msg->data())); |
| @@ -206,9 +258,11 @@ |
| MessageQueueTestPeer queue_peer(&queue); |
| Dart_Port port1 = 1; |
| - PortMessage* msg1 = new PortMessage(port1, 0, AllocMsg("msg1")); |
| + Message* msg1 = |
| + new Message(port1, 0, AllocMsg("msg1"), Message::kNormalPriority); |
| queue.Enqueue(msg1); |
| - PortMessage* msg2 = new PortMessage(port1, 0, AllocMsg("msg2")); |
| + Message* msg2 = |
| + new Message(port1, 0, AllocMsg("msg2"), Message::kNormalPriority); |
| queue.Enqueue(msg2); |
| EXPECT(queue_peer.HasMessage()); |
| @@ -232,5 +286,4 @@ |
| EXPECT(!queue_peer.HasMessage()); |
| } |
| - |
| } // namespace dart |