| Index: runtime/vm/message_queue_test.cc
|
| ===================================================================
|
| --- runtime/vm/message_queue_test.cc (revision 3557)
|
| +++ 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();
|
| + 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
|
|
|