Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(255)

Side by Side Diff: runtime/vm/message_handler_test.cc

Issue 9924015: Use the ThreadPool for all isolates and native ports. Previously, (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698