| OLD | NEW |
| 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 Loading... |
| 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 results_(NULL) { | 42 results_(NULL) {} |
| 43 } | |
| 44 | 43 |
| 45 ~TestMessageHandler() { | 44 ~TestMessageHandler() { delete[] port_buffer_; } |
| 46 delete[] port_buffer_; | |
| 47 } | |
| 48 | 45 |
| 49 void MessageNotify(Message::Priority priority) { | 46 void MessageNotify(Message::Priority priority) { notify_count_++; } |
| 50 notify_count_++; | |
| 51 } | |
| 52 | 47 |
| 53 MessageStatus HandleMessage(Message* message) { | 48 MessageStatus HandleMessage(Message* message) { |
| 54 // For testing purposes, keep a list of the ports | 49 // For testing purposes, keep a list of the ports |
| 55 // for all messages we receive. | 50 // for all messages we receive. |
| 56 AddPortToBuffer(message->dest_port()); | 51 AddPortToBuffer(message->dest_port()); |
| 57 delete message; | 52 delete message; |
| 58 message_count_++; | 53 message_count_++; |
| 59 MessageStatus status = kOK; | 54 MessageStatus status = kOK; |
| 60 if (results_ != NULL) { | 55 if (results_ != NULL) { |
| 61 status = results_[0]; | 56 status = results_[0]; |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 241 EXPECT_EQ(port2, ports[0]); | 236 EXPECT_EQ(port2, ports[0]); |
| 242 EXPECT_EQ(port3, ports[1]); | 237 EXPECT_EQ(port3, ports[1]); |
| 243 EXPECT_EQ(port1, ports[2]); | 238 EXPECT_EQ(port1, ports[2]); |
| 244 PortMap::ClosePorts(&handler); | 239 PortMap::ClosePorts(&handler); |
| 245 } | 240 } |
| 246 | 241 |
| 247 | 242 |
| 248 UNIT_TEST_CASE(MessageHandler_HandleNextMessage_ProcessOOBAfterError) { | 243 UNIT_TEST_CASE(MessageHandler_HandleNextMessage_ProcessOOBAfterError) { |
| 249 TestMessageHandler handler; | 244 TestMessageHandler handler; |
| 250 MessageHandler::MessageStatus results[] = { | 245 MessageHandler::MessageStatus results[] = { |
| 251 MessageHandler::kError, // oob_message1 | 246 MessageHandler::kError, // oob_message1 |
| 252 MessageHandler::kOK, // oob_message2 | 247 MessageHandler::kOK, // oob_message2 |
| 253 MessageHandler::kOK, // unused | 248 MessageHandler::kOK, // unused |
| 254 }; | 249 }; |
| 255 handler.set_results(results); | 250 handler.set_results(results); |
| 256 MessageHandlerTestPeer handler_peer(&handler); | 251 MessageHandlerTestPeer handler_peer(&handler); |
| 257 Dart_Port port1 = PortMap::CreatePort(&handler); | 252 Dart_Port port1 = PortMap::CreatePort(&handler); |
| 258 Dart_Port port2 = PortMap::CreatePort(&handler); | 253 Dart_Port port2 = PortMap::CreatePort(&handler); |
| 259 Dart_Port port3 = PortMap::CreatePort(&handler); | 254 Dart_Port port3 = PortMap::CreatePort(&handler); |
| 260 Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority); | 255 Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority); |
| 261 handler_peer.PostMessage(message1); | 256 handler_peer.PostMessage(message1); |
| 262 Message* oob_message1 = new Message(port2, NULL, 0, Message::kOOBPriority); | 257 Message* oob_message1 = new Message(port2, NULL, 0, Message::kOOBPriority); |
| 263 handler_peer.PostMessage(oob_message1); | 258 handler_peer.PostMessage(oob_message1); |
| 264 Message* oob_message2 = new Message(port3, NULL, 0, Message::kOOBPriority); | 259 Message* oob_message2 = new Message(port3, NULL, 0, Message::kOOBPriority); |
| 265 handler_peer.PostMessage(oob_message2); | 260 handler_peer.PostMessage(oob_message2); |
| 266 | 261 |
| 267 // When we get an error, we continue processing oob messages but | 262 // When we get an error, we continue processing oob messages but |
| 268 // stop handling normal messages. | 263 // stop handling normal messages. |
| 269 EXPECT_EQ(MessageHandler::kError, handler.HandleNextMessage()); | 264 EXPECT_EQ(MessageHandler::kError, handler.HandleNextMessage()); |
| 270 EXPECT_EQ(2, handler.message_count()); | 265 EXPECT_EQ(2, handler.message_count()); |
| 271 Dart_Port* ports = handler.port_buffer(); | 266 Dart_Port* ports = handler.port_buffer(); |
| 272 EXPECT_EQ(port2, ports[0]); // oob_message1, error | 267 EXPECT_EQ(port2, ports[0]); // oob_message1, error |
| 273 EXPECT_EQ(port3, ports[1]); // oob_message2, ok | 268 EXPECT_EQ(port3, ports[1]); // oob_message2, ok |
| 274 handler_peer.CloseAllPorts(); | 269 handler_peer.CloseAllPorts(); |
| 275 } | 270 } |
| 276 | 271 |
| 277 | 272 |
| 278 UNIT_TEST_CASE(MessageHandler_HandleNextMessage_Shutdown) { | 273 UNIT_TEST_CASE(MessageHandler_HandleNextMessage_Shutdown) { |
| 279 TestMessageHandler handler; | 274 TestMessageHandler handler; |
| 280 MessageHandler::MessageStatus results[] = { | 275 MessageHandler::MessageStatus results[] = { |
| 281 MessageHandler::kOK, // oob_message1 | 276 MessageHandler::kOK, // oob_message1 |
| 282 MessageHandler::kShutdown, // oob_message2 | 277 MessageHandler::kShutdown, // oob_message2 |
| 283 MessageHandler::kOK, // unused | 278 MessageHandler::kOK, // unused |
| 284 MessageHandler::kOK, // unused | 279 MessageHandler::kOK, // unused |
| 285 }; | 280 }; |
| 286 handler.set_results(results); | 281 handler.set_results(results); |
| 287 MessageHandlerTestPeer handler_peer(&handler); | 282 MessageHandlerTestPeer handler_peer(&handler); |
| 288 Dart_Port port1 = PortMap::CreatePort(&handler); | 283 Dart_Port port1 = PortMap::CreatePort(&handler); |
| 289 Dart_Port port2 = PortMap::CreatePort(&handler); | 284 Dart_Port port2 = PortMap::CreatePort(&handler); |
| 290 Dart_Port port3 = PortMap::CreatePort(&handler); | 285 Dart_Port port3 = PortMap::CreatePort(&handler); |
| 291 Dart_Port port4 = PortMap::CreatePort(&handler); | 286 Dart_Port port4 = PortMap::CreatePort(&handler); |
| 292 Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority); | 287 Message* message1 = new Message(port1, NULL, 0, Message::kNormalPriority); |
| 293 handler_peer.PostMessage(message1); | 288 handler_peer.PostMessage(message1); |
| 294 Message* oob_message1 = new Message(port2, NULL, 0, Message::kOOBPriority); | 289 Message* oob_message1 = new Message(port2, NULL, 0, Message::kOOBPriority); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 UNIT_TEST_CASE(MessageHandler_Run) { | 356 UNIT_TEST_CASE(MessageHandler_Run) { |
| 362 ThreadPool pool; | 357 ThreadPool pool; |
| 363 TestMessageHandler handler; | 358 TestMessageHandler handler; |
| 364 MessageHandlerTestPeer handler_peer(&handler); | 359 MessageHandlerTestPeer handler_peer(&handler); |
| 365 int sleep = 0; | 360 int sleep = 0; |
| 366 const int kMaxSleep = 20 * 1000; // 20 seconds. | 361 const int kMaxSleep = 20 * 1000; // 20 seconds. |
| 367 | 362 |
| 368 EXPECT(!handler.HasLivePorts()); | 363 EXPECT(!handler.HasLivePorts()); |
| 369 handler_peer.increment_live_ports(); | 364 handler_peer.increment_live_ports(); |
| 370 | 365 |
| 371 handler.Run(&pool, | 366 handler.Run(&pool, TestStartFunction, TestEndFunction, |
| 372 TestStartFunction, | |
| 373 TestEndFunction, | |
| 374 reinterpret_cast<uword>(&handler)); | 367 reinterpret_cast<uword>(&handler)); |
| 375 Dart_Port port = PortMap::CreatePort(&handler); | 368 Dart_Port port = PortMap::CreatePort(&handler); |
| 376 Message* message = new Message(port, NULL, 0, Message::kNormalPriority); | 369 Message* message = new Message(port, NULL, 0, Message::kNormalPriority); |
| 377 handler_peer.PostMessage(message); | 370 handler_peer.PostMessage(message); |
| 378 | 371 |
| 379 // Wait for the first message to be handled. | 372 // Wait for the first message to be handled. |
| 380 while (sleep < kMaxSleep && handler.message_count() < 1) { | 373 while (sleep < kMaxSleep && handler.message_count() < 1) { |
| 381 OS::Sleep(10); | 374 OS::Sleep(10); |
| 382 sleep += 10; | 375 sleep += 10; |
| 383 } | 376 } |
| (...skipping 24 matching lines...) Expand all Loading... |
| 408 EXPECT_EQ(port, handler_ports[0]); | 401 EXPECT_EQ(port, handler_ports[0]); |
| 409 for (int i = 1; i < 11; i++) { | 402 for (int i = 1; i < 11; i++) { |
| 410 EXPECT_EQ(ports[i - 1], handler_ports[i]); | 403 EXPECT_EQ(ports[i - 1], handler_ports[i]); |
| 411 } | 404 } |
| 412 handler_peer.decrement_live_ports(); | 405 handler_peer.decrement_live_ports(); |
| 413 EXPECT(!handler.HasLivePorts()); | 406 EXPECT(!handler.HasLivePorts()); |
| 414 PortMap::ClosePorts(&handler); | 407 PortMap::ClosePorts(&handler); |
| 415 } | 408 } |
| 416 | 409 |
| 417 } // namespace dart | 410 } // namespace dart |
| OLD | NEW |