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

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

Issue 1371193005: VM restart + shutdown fixes (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: more code review Created 5 years, 2 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
« no previous file with comments | « runtime/vm/message_handler.cc ('k') | runtime/vm/native_message_handler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 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 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/message_handler.h" 5 #include "vm/message_handler.h"
6 #include "vm/port.h" 6 #include "vm/port.h"
7 #include "vm/unit_test.h" 7 #include "vm/unit_test.h"
8 8
9 namespace dart { 9 namespace dart {
10 10
(...skipping 21 matching lines...) Expand all
32 32
33 class TestMessageHandler : public MessageHandler { 33 class TestMessageHandler : public MessageHandler {
34 public: 34 public:
35 TestMessageHandler() 35 TestMessageHandler()
36 : port_buffer_(NULL), 36 : port_buffer_(NULL),
37 port_buffer_size_(0), 37 port_buffer_size_(0),
38 notify_count_(0), 38 notify_count_(0),
39 message_count_(0), 39 message_count_(0),
40 start_called_(false), 40 start_called_(false),
41 end_called_(false), 41 end_called_(false),
42 result_(true) { 42 results_(NULL) {
43 } 43 }
44 44
45 ~TestMessageHandler() { 45 ~TestMessageHandler() {
46 delete[] port_buffer_; 46 delete[] port_buffer_;
47 } 47 }
48 48
49 void MessageNotify(Message::Priority priority) { 49 void MessageNotify(Message::Priority priority) {
50 notify_count_++; 50 notify_count_++;
51 } 51 }
52 52
53 bool HandleMessage(Message* message) { 53 MessageStatus HandleMessage(Message* message) {
54 // For testing purposes, keep a list of the ports 54 // For testing purposes, keep a list of the ports
55 // for all messages we receive. 55 // for all messages we receive.
56 AddPortToBuffer(message->dest_port()); 56 AddPortToBuffer(message->dest_port());
57 delete message; 57 delete message;
58 message_count_++; 58 message_count_++;
59 return result_; 59 MessageStatus status = kOK;
60 if (results_ != NULL) {
61 status = results_[0];
62 results_++;
63 }
64 return status;
60 } 65 }
61 66
62 bool Start() { 67 MessageStatus Start() {
63 start_called_ = true; 68 start_called_ = true;
64 return true; 69 return kOK;
65 } 70 }
66 71
67 void End() { 72 void End() {
68 end_called_ = true; 73 end_called_ = true;
69 AddPortToBuffer(-2); 74 AddPortToBuffer(-2);
70 } 75 }
71 76
72 Dart_Port* port_buffer() const { return port_buffer_; } 77 Dart_Port* port_buffer() const { return port_buffer_; }
73 int notify_count() const { return notify_count_; } 78 int notify_count() const { return notify_count_; }
74 int message_count() const { return message_count_; } 79 int message_count() const { return message_count_; }
75 bool start_called() const { return start_called_; } 80 bool start_called() const { return start_called_; }
76 bool end_called() const { return end_called_; } 81 bool end_called() const { return end_called_; }
77 82
78 void set_result(bool result) { result_ = result; } 83 void set_results(MessageStatus* results) { results_ = results; }
79 84
80 private: 85 private:
81 void AddPortToBuffer(Dart_Port port) { 86 void AddPortToBuffer(Dart_Port port) {
82 if (port_buffer_ == NULL) { 87 if (port_buffer_ == NULL) {
83 port_buffer_ = new Dart_Port[10]; 88 port_buffer_ = new Dart_Port[10];
84 port_buffer_size_ = 10; 89 port_buffer_size_ = 10;
85 } else if (message_count_ == port_buffer_size_) { 90 } else if (message_count_ == port_buffer_size_) {
86 int new_port_buffer_size_ = 2 * port_buffer_size_; 91 int new_port_buffer_size_ = 2 * port_buffer_size_;
87 Dart_Port* new_port_buffer_ = new Dart_Port[new_port_buffer_size_]; 92 Dart_Port* new_port_buffer_ = new Dart_Port[new_port_buffer_size_];
88 for (int i = 0; i < port_buffer_size_; i++) { 93 for (int i = 0; i < port_buffer_size_; i++) {
89 new_port_buffer_[i] = port_buffer_[i]; 94 new_port_buffer_[i] = port_buffer_[i];
90 } 95 }
91 delete[] port_buffer_; 96 delete[] port_buffer_;
92 port_buffer_ = new_port_buffer_; 97 port_buffer_ = new_port_buffer_;
93 port_buffer_size_ = new_port_buffer_size_; 98 port_buffer_size_ = new_port_buffer_size_;
94 } 99 }
95 port_buffer_[message_count_] = port; 100 port_buffer_[message_count_] = port;
96 } 101 }
97 102
98 Dart_Port* port_buffer_; 103 Dart_Port* port_buffer_;
99 int port_buffer_size_; 104 int port_buffer_size_;
100 int notify_count_; 105 int notify_count_;
101 int message_count_; 106 int message_count_;
102 bool start_called_; 107 bool start_called_;
103 bool end_called_; 108 bool end_called_;
104 bool result_; 109 MessageStatus* results_;
105 110
106 DISALLOW_COPY_AND_ASSIGN(TestMessageHandler); 111 DISALLOW_COPY_AND_ASSIGN(TestMessageHandler);
107 }; 112 };
108 113
109 114
110 bool TestStartFunction(uword data) { 115 MessageHandler::MessageStatus TestStartFunction(uword data) {
111 return (reinterpret_cast<TestMessageHandler*>(data))->Start(); 116 return (reinterpret_cast<TestMessageHandler*>(data))->Start();
112 } 117 }
113 118
114 119
115 void TestEndFunction(uword data) { 120 void TestEndFunction(uword data) {
116 return (reinterpret_cast<TestMessageHandler*>(data))->End(); 121 return (reinterpret_cast<TestMessageHandler*>(data))->End();
117 } 122 }
118 123
119 124
120 UNIT_TEST_CASE(MessageHandler_PostMessage) { 125 UNIT_TEST_CASE(MessageHandler_PostMessage) {
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority); 230 Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority);
226 handler_peer.PostMessage(message1); 231 handler_peer.PostMessage(message1);
227 Message* oob_message1 = new Message(port2, NULL, 0, Message::kOOBPriority); 232 Message* oob_message1 = new Message(port2, NULL, 0, Message::kOOBPriority);
228 handler_peer.PostMessage(oob_message1); 233 handler_peer.PostMessage(oob_message1);
229 Message* message2 = new Message(port2, NULL, 0, Message::kNormalPriority); 234 Message* message2 = new Message(port2, NULL, 0, Message::kNormalPriority);
230 handler_peer.PostMessage(message2); 235 handler_peer.PostMessage(message2);
231 Message* oob_message2 = new Message(port3, NULL, 0, Message::kOOBPriority); 236 Message* oob_message2 = new Message(port3, NULL, 0, Message::kOOBPriority);
232 handler_peer.PostMessage(oob_message2); 237 handler_peer.PostMessage(oob_message2);
233 238
234 // We handle both oob messages and a single normal message. 239 // We handle both oob messages and a single normal message.
235 EXPECT(handler.HandleNextMessage()); 240 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage());
236 EXPECT_EQ(3, handler.message_count()); 241 EXPECT_EQ(3, handler.message_count());
237 Dart_Port* ports = handler.port_buffer(); 242 Dart_Port* ports = handler.port_buffer();
238 EXPECT_EQ(port2, ports[0]); 243 EXPECT_EQ(port2, ports[0]);
239 EXPECT_EQ(port3, ports[1]); 244 EXPECT_EQ(port3, ports[1]);
240 EXPECT_EQ(port1, ports[2]); 245 EXPECT_EQ(port1, ports[2]);
241 PortMap::ClosePorts(&handler); 246 PortMap::ClosePorts(&handler);
242 } 247 }
243 248
244 249
250 UNIT_TEST_CASE(MessageHandler_HandleNextMessage_ProcessOOBAfterError) {
251 TestMessageHandler handler;
252 MessageHandler::MessageStatus results[] = {
253 MessageHandler::kError, // oob_message1
254 MessageHandler::kOK, // oob_message2
255 MessageHandler::kOK, // unused
256 };
257 handler.set_results(results);
258 MessageHandlerTestPeer handler_peer(&handler);
259 Dart_Port port1 = PortMap::CreatePort(&handler);
260 Dart_Port port2 = PortMap::CreatePort(&handler);
261 Dart_Port port3 = PortMap::CreatePort(&handler);
262 Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority);
263 handler_peer.PostMessage(message1);
264 Message* oob_message1 = new Message(port2, NULL, 0, Message::kOOBPriority);
265 handler_peer.PostMessage(oob_message1);
266 Message* oob_message2 = new Message(port3, NULL, 0, Message::kOOBPriority);
267 handler_peer.PostMessage(oob_message2);
268
269 // When we get an error, we continue processing oob messages but
270 // stop handling normal messages.
271 EXPECT_EQ(MessageHandler::kError, handler.HandleNextMessage());
272 EXPECT_EQ(2, handler.message_count());
273 Dart_Port* ports = handler.port_buffer();
274 EXPECT_EQ(port2, ports[0]); // oob_message1, error
275 EXPECT_EQ(port3, ports[1]); // oob_message2, ok
276 handler_peer.CloseAllPorts();
277 }
278
279
280 UNIT_TEST_CASE(MessageHandler_HandleNextMessage_Shutdown) {
281 TestMessageHandler handler;
282 MessageHandler::MessageStatus results[] = {
283 MessageHandler::kOK, // oob_message1
284 MessageHandler::kShutdown, // oob_message2
285 MessageHandler::kOK, // unused
286 MessageHandler::kOK, // unused
287 };
288 handler.set_results(results);
289 MessageHandlerTestPeer handler_peer(&handler);
290 Dart_Port port1 = PortMap::CreatePort(&handler);
291 Dart_Port port2 = PortMap::CreatePort(&handler);
292 Dart_Port port3 = PortMap::CreatePort(&handler);
293 Dart_Port port4 = PortMap::CreatePort(&handler);
294 Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority);
295 handler_peer.PostMessage(message1);
296 Message* oob_message1 = new Message(port2, NULL, 0, Message::kOOBPriority);
297 handler_peer.PostMessage(oob_message1);
298 Message* oob_message2 = new Message(port3, NULL, 0, Message::kOOBPriority);
299 handler_peer.PostMessage(oob_message2);
300 Message* oob_message3 = new Message(port4, NULL, 0, Message::kOOBPriority);
301 handler_peer.PostMessage(oob_message3);
302
303 // When we get a shutdown message, we stop processing all messages.
304 EXPECT_EQ(MessageHandler::kShutdown, handler.HandleNextMessage());
305 EXPECT_EQ(2, handler.message_count());
306 Dart_Port* ports = handler.port_buffer();
307 EXPECT_EQ(port2, ports[0]); // oob_message1, ok
308 EXPECT_EQ(port3, ports[1]); // oob_message2, shutdown
309 {
310 // The oob queue has been cleared. oob_message3 is gone.
311 MessageHandler::AcquiredQueues aq;
312 handler.AcquireQueues(&aq);
313 EXPECT(aq.oob_queue()->Length() == 0);
314 }
315 handler_peer.CloseAllPorts();
316 }
317
318
245 UNIT_TEST_CASE(MessageHandler_HandleOOBMessages) { 319 UNIT_TEST_CASE(MessageHandler_HandleOOBMessages) {
246 TestMessageHandler handler; 320 TestMessageHandler handler;
247 MessageHandlerTestPeer handler_peer(&handler); 321 MessageHandlerTestPeer handler_peer(&handler);
248 Dart_Port port1 = PortMap::CreatePort(&handler); 322 Dart_Port port1 = PortMap::CreatePort(&handler);
249 Dart_Port port2 = PortMap::CreatePort(&handler); 323 Dart_Port port2 = PortMap::CreatePort(&handler);
250 Dart_Port port3 = PortMap::CreatePort(&handler); 324 Dart_Port port3 = PortMap::CreatePort(&handler);
251 Dart_Port port4 = PortMap::CreatePort(&handler); 325 Dart_Port port4 = PortMap::CreatePort(&handler);
252 Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority); 326 Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority);
253 handler_peer.PostMessage(message1); 327 handler_peer.PostMessage(message1);
254 Message* message2 = new Message(port2, NULL, 0, Message::kNormalPriority); 328 Message* message2 = new Message(port2, NULL, 0, Message::kNormalPriority);
255 handler_peer.PostMessage(message2); 329 handler_peer.PostMessage(message2);
256 Message* oob_message1 = new Message(port3, NULL, 0, Message::kOOBPriority); 330 Message* oob_message1 = new Message(port3, NULL, 0, Message::kOOBPriority);
257 handler_peer.PostMessage(oob_message1); 331 handler_peer.PostMessage(oob_message1);
258 Message* oob_message2 = new Message(port4, NULL, 0, Message::kOOBPriority); 332 Message* oob_message2 = new Message(port4, NULL, 0, Message::kOOBPriority);
259 handler_peer.PostMessage(oob_message2); 333 handler_peer.PostMessage(oob_message2);
260 334
261 // We handle both oob messages but no normal messages. 335 // We handle both oob messages but no normal messages.
262 EXPECT(handler.HandleOOBMessages()); 336 EXPECT_EQ(MessageHandler::kOK, handler.HandleOOBMessages());
263 EXPECT_EQ(2, handler.message_count()); 337 EXPECT_EQ(2, handler.message_count());
264 Dart_Port* ports = handler.port_buffer(); 338 Dart_Port* ports = handler.port_buffer();
265 EXPECT_EQ(port3, ports[0]); 339 EXPECT_EQ(port3, ports[0]);
266 EXPECT_EQ(port4, ports[1]); 340 EXPECT_EQ(port4, ports[1]);
267 handler_peer.CloseAllPorts(); 341 handler_peer.CloseAllPorts();
268 } 342 }
269 343
270 344
271 struct ThreadStartInfo { 345 struct ThreadStartInfo {
272 MessageHandler* handler; 346 MessageHandler* handler;
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
337 EXPECT_EQ(port, handler_ports[0]); 411 EXPECT_EQ(port, handler_ports[0]);
338 for (int i = 1; i < 11; i++) { 412 for (int i = 1; i < 11; i++) {
339 EXPECT_EQ(ports[i - 1], handler_ports[i]); 413 EXPECT_EQ(ports[i - 1], handler_ports[i]);
340 } 414 }
341 handler_peer.decrement_live_ports(); 415 handler_peer.decrement_live_ports();
342 EXPECT(!handler.HasLivePorts()); 416 EXPECT(!handler.HasLivePorts());
343 PortMap::ClosePorts(&handler); 417 PortMap::ClosePorts(&handler);
344 } 418 }
345 419
346 } // namespace dart 420 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/message_handler.cc ('k') | runtime/vm/native_message_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698