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,17 @@ |
| public: |
| explicit MessageQueueTestPeer(MessageQueue* queue) : queue_(queue) {} |
| - bool HasMessage() const { return queue_->head_ != NULL; } |
| + bool HasMessage() const { |
|
Anton Muhin
2012/01/12 12:58:16
that's a pure paranoia, but technically you're not
turnidge
2012/01/12 19:01:55
Added lock.
|
| + return (queue_->head_[Message::kNormalPriority] != NULL || |
| + queue_->head_[Message::kOOBPriority] != NULL); } |
| 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 +36,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 +63,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,7 +125,7 @@ |
| } |
| 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()); |
| @@ -93,7 +133,7 @@ |
| 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()); |
| @@ -123,8 +163,8 @@ |
| 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)); |
| + Message* msg = new Message(i+10, i+100, reinterpret_cast<uint8_t*>(data), |
|
Anton Muhin
2012/01/12 12:58:16
nit: spaces around +'s
turnidge
2012/01/12 19:01:55
Done.
|
| + Message::kNormalPriority); |
| shared_queue->Enqueue(msg); |
| } |
| @@ -140,8 +180,8 @@ |
| 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)); |
| + Message* msg = new Message(i+20, i+200, reinterpret_cast<uint8_t*>(data), |
| + Message::kNormalPriority); |
| shared_queue->Enqueue(msg); |
| } |
| @@ -160,9 +200,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 +222,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 +234,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 +250,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 +278,4 @@ |
| EXPECT(!queue_peer.HasMessage()); |
| } |
| - |
| } // namespace dart |