| OLD | NEW | 
|    1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file |    1 // Copyright (c) 2013, 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 "platform/globals.h" |    5 #include "platform/globals.h" | 
|    6  |    6  | 
|    7 #include "include/dart_tools_api.h" |    7 #include "include/dart_tools_api.h" | 
|    8 #include "vm/dart_api_impl.h" |    8 #include "vm/dart_api_impl.h" | 
|    9 #include "vm/dart_entry.h" |    9 #include "vm/dart_entry.h" | 
|   10 #include "vm/debugger.h" |   10 #include "vm/debugger.h" | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|   22 DEFINE_FLAG(bool, service_testing_flag, false, "Comment"); |   22 DEFINE_FLAG(bool, service_testing_flag, false, "Comment"); | 
|   23  |   23  | 
|   24 class ServiceTestMessageHandler : public MessageHandler { |   24 class ServiceTestMessageHandler : public MessageHandler { | 
|   25  public: |   25  public: | 
|   26   ServiceTestMessageHandler() : _msg(NULL) {} |   26   ServiceTestMessageHandler() : _msg(NULL) {} | 
|   27  |   27  | 
|   28   ~ServiceTestMessageHandler() { |   28   ~ServiceTestMessageHandler() { | 
|   29     free(_msg); |   29     free(_msg); | 
|   30   } |   30   } | 
|   31  |   31  | 
|   32   bool HandleMessage(Message* message) { |   32   MessageStatus HandleMessage(Message* message) { | 
|   33     if (_msg != NULL) { |   33     if (_msg != NULL) { | 
|   34       free(_msg); |   34       free(_msg); | 
|   35     } |   35     } | 
|   36  |   36  | 
|   37     // Parse the message. |   37     // Parse the message. | 
|   38     Thread* thread = Thread::Current(); |   38     Thread* thread = Thread::Current(); | 
|   39     MessageSnapshotReader reader(message->data(), message->len(), thread); |   39     MessageSnapshotReader reader(message->data(), message->len(), thread); | 
|   40     const Object& response_obj = Object::Handle(reader.ReadObject()); |   40     const Object& response_obj = Object::Handle(reader.ReadObject()); | 
|   41     String& response = String::Handle(); |   41     String& response = String::Handle(); | 
|   42     response ^= response_obj.raw(); |   42     response ^= response_obj.raw(); | 
|   43     _msg = strdup(response.ToCString()); |   43     _msg = strdup(response.ToCString()); | 
|   44     return true; |   44     return kOK; | 
|   45   } |   45   } | 
|   46  |   46  | 
|   47   const char* msg() const { return _msg; } |   47   const char* msg() const { return _msg; } | 
|   48  |   48  | 
|   49  private: |   49  private: | 
|   50   char* _msg; |   50   char* _msg; | 
|   51 }; |   51 }; | 
|   52  |   52  | 
|   53  |   53  | 
|   54 static RawArray* Eval(Dart_Handle lib, const char* expr) { |   54 static RawArray* Eval(Dart_Handle lib, const char* expr) { | 
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  184   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  184   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  185   EXPECT_VALID(port); |  185   EXPECT_VALID(port); | 
|  186   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  186   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  187  |  187  | 
|  188   Array& service_msg = Array::Handle(); |  188   Array& service_msg = Array::Handle(); | 
|  189  |  189  | 
|  190   // Request an invalid code object. |  190   // Request an invalid code object. | 
|  191   service_msg = |  191   service_msg = | 
|  192       Eval(lib, "[0, port, '0', 'getObject', ['objectId'], ['code/0']]"); |  192       Eval(lib, "[0, port, '0', 'getObject', ['objectId'], ['code/0']]"); | 
|  193   Service::HandleIsolateMessage(isolate, service_msg); |  193   Service::HandleIsolateMessage(isolate, service_msg); | 
|  194   handler.HandleNextMessage(); |  194   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  195   EXPECT_SUBSTRING("\"error\"", handler.msg()); |  195   EXPECT_SUBSTRING("\"error\"", handler.msg()); | 
|  196  |  196  | 
|  197   // The following test checks that a code object can be found only |  197   // The following test checks that a code object can be found only | 
|  198   // at compile_timestamp()-code.EntryPoint(). |  198   // at compile_timestamp()-code.EntryPoint(). | 
|  199   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |  199   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 
|  200                       "['objectId'], ['code/%" Px64"-%" Px "']]", |  200                       "['objectId'], ['code/%" Px64"-%" Px "']]", | 
|  201                       compile_timestamp, |  201                       compile_timestamp, | 
|  202                       entry); |  202                       entry); | 
|  203   Service::HandleIsolateMessage(isolate, service_msg); |  203   Service::HandleIsolateMessage(isolate, service_msg); | 
|  204   handler.HandleNextMessage(); |  204   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  205   EXPECT_SUBSTRING("\"type\":\"Code\"", handler.msg()); |  205   EXPECT_SUBSTRING("\"type\":\"Code\"", handler.msg()); | 
|  206   { |  206   { | 
|  207     // Only perform a partial match. |  207     // Only perform a partial match. | 
|  208     const intptr_t kBufferSize = 512; |  208     const intptr_t kBufferSize = 512; | 
|  209     char buffer[kBufferSize]; |  209     char buffer[kBufferSize]; | 
|  210     OS::SNPrint(buffer, kBufferSize-1, |  210     OS::SNPrint(buffer, kBufferSize-1, | 
|  211                 "\"fixedId\":true,\"id\":\"code\\/%" Px64 "-%" Px "\",", |  211                 "\"fixedId\":true,\"id\":\"code\\/%" Px64 "-%" Px "\",", | 
|  212                 compile_timestamp, |  212                 compile_timestamp, | 
|  213                 entry); |  213                 entry); | 
|  214     EXPECT_SUBSTRING(buffer, handler.msg()); |  214     EXPECT_SUBSTRING(buffer, handler.msg()); | 
|  215   } |  215   } | 
|  216  |  216  | 
|  217   // Request code object at compile_timestamp-code.EntryPoint() + 16 |  217   // Request code object at compile_timestamp-code.EntryPoint() + 16 | 
|  218   // Expect this to fail because the address is not the entry point. |  218   // Expect this to fail because the address is not the entry point. | 
|  219   uintptr_t address = entry + 16; |  219   uintptr_t address = entry + 16; | 
|  220   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |  220   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 
|  221                       "['objectId'], ['code/%" Px64"-%" Px "']]", |  221                       "['objectId'], ['code/%" Px64"-%" Px "']]", | 
|  222                       compile_timestamp, |  222                       compile_timestamp, | 
|  223                       address); |  223                       address); | 
|  224   Service::HandleIsolateMessage(isolate, service_msg); |  224   Service::HandleIsolateMessage(isolate, service_msg); | 
|  225   handler.HandleNextMessage(); |  225   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  226   EXPECT_SUBSTRING("\"error\"", handler.msg()); |  226   EXPECT_SUBSTRING("\"error\"", handler.msg()); | 
|  227  |  227  | 
|  228   // Request code object at (compile_timestamp - 1)-code.EntryPoint() |  228   // Request code object at (compile_timestamp - 1)-code.EntryPoint() | 
|  229   // Expect this to fail because the timestamp is wrong. |  229   // Expect this to fail because the timestamp is wrong. | 
|  230   address = entry; |  230   address = entry; | 
|  231   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |  231   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 
|  232                       "['objectId'], ['code/%" Px64"-%" Px "']]", |  232                       "['objectId'], ['code/%" Px64"-%" Px "']]", | 
|  233                       compile_timestamp - 1, |  233                       compile_timestamp - 1, | 
|  234                       address); |  234                       address); | 
|  235   Service::HandleIsolateMessage(isolate, service_msg); |  235   Service::HandleIsolateMessage(isolate, service_msg); | 
|  236   handler.HandleNextMessage(); |  236   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  237   EXPECT_SUBSTRING("\"error\"", handler.msg()); |  237   EXPECT_SUBSTRING("\"error\"", handler.msg()); | 
|  238  |  238  | 
|  239   // Request native code at address. Expect the null code object back. |  239   // Request native code at address. Expect the null code object back. | 
|  240   address = last; |  240   address = last; | 
|  241   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |  241   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 
|  242                       "['objectId'], ['code/native-%" Px "']]", |  242                       "['objectId'], ['code/native-%" Px "']]", | 
|  243                       address); |  243                       address); | 
|  244   Service::HandleIsolateMessage(isolate, service_msg); |  244   Service::HandleIsolateMessage(isolate, service_msg); | 
|  245   handler.HandleNextMessage(); |  245   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  246   // TODO(turnidge): It is pretty broken to return an Instance here.  Fix. |  246   // TODO(turnidge): It is pretty broken to return an Instance here.  Fix. | 
|  247   EXPECT_SUBSTRING("\"kind\":\"Null\"", |  247   EXPECT_SUBSTRING("\"kind\":\"Null\"", | 
|  248                    handler.msg()); |  248                    handler.msg()); | 
|  249  |  249  | 
|  250   // Request malformed native code. |  250   // Request malformed native code. | 
|  251   service_msg = EvalF(lib, "[0, port, '0', 'getObject', ['objectId'], " |  251   service_msg = EvalF(lib, "[0, port, '0', 'getObject', ['objectId'], " | 
|  252                       "['code/native%" Px "']]", |  252                       "['code/native%" Px "']]", | 
|  253                       address); |  253                       address); | 
|  254   Service::HandleIsolateMessage(isolate, service_msg); |  254   Service::HandleIsolateMessage(isolate, service_msg); | 
|  255   handler.HandleNextMessage(); |  255   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  256   EXPECT_SUBSTRING("\"error\"", handler.msg()); |  256   EXPECT_SUBSTRING("\"error\"", handler.msg()); | 
|  257 } |  257 } | 
|  258  |  258  | 
|  259  |  259  | 
|  260 TEST_CASE(Service_TokenStream) { |  260 TEST_CASE(Service_TokenStream) { | 
|  261   const char* kScript = |  261   const char* kScript = | 
|  262       "var port;\n"  // Set to our mock port by C++. |  262       "var port;\n"  // Set to our mock port by C++. | 
|  263       "\n" |  263       "\n" | 
|  264       "main() {\n" |  264       "main() {\n" | 
|  265       "}"; |  265       "}"; | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
|  288   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  288   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  289   EXPECT_VALID(port); |  289   EXPECT_VALID(port); | 
|  290   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  290   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  291  |  291  | 
|  292   Array& service_msg = Array::Handle(); |  292   Array& service_msg = Array::Handle(); | 
|  293  |  293  | 
|  294   // Fetch object. |  294   // Fetch object. | 
|  295   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |  295   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 
|  296                       "['objectId'], ['objects/%" Pd "']]", id); |  296                       "['objectId'], ['objects/%" Pd "']]", id); | 
|  297   Service::HandleIsolateMessage(isolate, service_msg); |  297   Service::HandleIsolateMessage(isolate, service_msg); | 
|  298   handler.HandleNextMessage(); |  298   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  299  |  299  | 
|  300   // Check type. |  300   // Check type. | 
|  301   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); |  301   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); | 
|  302   EXPECT_SUBSTRING("\"_vmType\":\"TokenStream\"", handler.msg()); |  302   EXPECT_SUBSTRING("\"_vmType\":\"TokenStream\"", handler.msg()); | 
|  303   // Check for members array. |  303   // Check for members array. | 
|  304   EXPECT_SUBSTRING("\"members\":[", handler.msg()); |  304   EXPECT_SUBSTRING("\"members\":[", handler.msg()); | 
|  305 } |  305 } | 
|  306  |  306  | 
|  307  |  307  | 
|  308 TEST_CASE(Service_PcDescriptors) { |  308 TEST_CASE(Service_PcDescriptors) { | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  350   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  350   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  351   EXPECT_VALID(port); |  351   EXPECT_VALID(port); | 
|  352   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  352   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  353  |  353  | 
|  354   Array& service_msg = Array::Handle(); |  354   Array& service_msg = Array::Handle(); | 
|  355  |  355  | 
|  356   // Fetch object. |  356   // Fetch object. | 
|  357   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |  357   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 
|  358                       "['objectId'], ['objects/%" Pd "']]", id); |  358                       "['objectId'], ['objects/%" Pd "']]", id); | 
|  359   Service::HandleIsolateMessage(isolate, service_msg); |  359   Service::HandleIsolateMessage(isolate, service_msg); | 
|  360   handler.HandleNextMessage(); |  360   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  361   // Check type. |  361   // Check type. | 
|  362   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); |  362   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); | 
|  363   EXPECT_SUBSTRING("\"_vmType\":\"PcDescriptors\"", handler.msg()); |  363   EXPECT_SUBSTRING("\"_vmType\":\"PcDescriptors\"", handler.msg()); | 
|  364   // Check for members array. |  364   // Check for members array. | 
|  365   EXPECT_SUBSTRING("\"members\":[", handler.msg()); |  365   EXPECT_SUBSTRING("\"members\":[", handler.msg()); | 
|  366 } |  366 } | 
|  367  |  367  | 
|  368  |  368  | 
|  369 TEST_CASE(Service_LocalVarDescriptors) { |  369 TEST_CASE(Service_LocalVarDescriptors) { | 
|  370   const char* kScript = |  370   const char* kScript = | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  411   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  411   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  412   EXPECT_VALID(port); |  412   EXPECT_VALID(port); | 
|  413   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  413   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  414  |  414  | 
|  415   Array& service_msg = Array::Handle(); |  415   Array& service_msg = Array::Handle(); | 
|  416  |  416  | 
|  417   // Fetch object. |  417   // Fetch object. | 
|  418   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |  418   service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 
|  419                       "['objectId'], ['objects/%" Pd "']]", id); |  419                       "['objectId'], ['objects/%" Pd "']]", id); | 
|  420   Service::HandleIsolateMessage(isolate, service_msg); |  420   Service::HandleIsolateMessage(isolate, service_msg); | 
|  421   handler.HandleNextMessage(); |  421   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  422   // Check type. |  422   // Check type. | 
|  423   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); |  423   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); | 
|  424   EXPECT_SUBSTRING("\"_vmType\":\"LocalVarDescriptors\"", handler.msg()); |  424   EXPECT_SUBSTRING("\"_vmType\":\"LocalVarDescriptors\"", handler.msg()); | 
|  425   // Check for members array. |  425   // Check for members array. | 
|  426   EXPECT_SUBSTRING("\"members\":[", handler.msg()); |  426   EXPECT_SUBSTRING("\"members\":[", handler.msg()); | 
|  427 } |  427 } | 
|  428  |  428  | 
|  429  |  429  | 
|  430 TEST_CASE(Service_Address) { |  430 TEST_CASE(Service_Address) { | 
|  431   const char* kScript = |  431   const char* kScript = | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
|  456     bool ref = offset % 2 == 0; |  456     bool ref = offset % 2 == 0; | 
|  457     OS::SNPrint(buf, sizeof(buf), |  457     OS::SNPrint(buf, sizeof(buf), | 
|  458                 (ref |  458                 (ref | 
|  459                  ? "[0, port, '0', '_getObjectByAddress', " |  459                  ? "[0, port, '0', '_getObjectByAddress', " | 
|  460                    "['address', 'ref'], ['%" Px "', 'true']]" |  460                    "['address', 'ref'], ['%" Px "', 'true']]" | 
|  461                  : "[0, port, '0', '_getObjectByAddress', " |  461                  : "[0, port, '0', '_getObjectByAddress', " | 
|  462                    "['address'], ['%" Px "']]"), |  462                    "['address'], ['%" Px "']]"), | 
|  463                 addr); |  463                 addr); | 
|  464     service_msg = Eval(lib, buf); |  464     service_msg = Eval(lib, buf); | 
|  465     Service::HandleIsolateMessage(isolate, service_msg); |  465     Service::HandleIsolateMessage(isolate, service_msg); | 
|  466     handler.HandleNextMessage(); |  466     EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  467     EXPECT_SUBSTRING(ref ? "\"type\":\"@Instance\"" : |  467     EXPECT_SUBSTRING(ref ? "\"type\":\"@Instance\"" : | 
|  468                            "\"type\":\"Instance\"", |  468                            "\"type\":\"Instance\"", | 
|  469                      handler.msg()); |  469                      handler.msg()); | 
|  470     EXPECT_SUBSTRING("\"kind\":\"String\"", handler.msg()); |  470     EXPECT_SUBSTRING("\"kind\":\"String\"", handler.msg()); | 
|  471     EXPECT_SUBSTRING("foobar", handler.msg()); |  471     EXPECT_SUBSTRING("foobar", handler.msg()); | 
|  472   } |  472   } | 
|  473   // Expect null when no object is found. |  473   // Expect null when no object is found. | 
|  474   service_msg = Eval(lib, "[0, port, '0', '_getObjectByAddress', " |  474   service_msg = Eval(lib, "[0, port, '0', '_getObjectByAddress', " | 
|  475                      "['address'], ['7']]"); |  475                      "['address'], ['7']]"); | 
|  476   Service::HandleIsolateMessage(isolate, service_msg); |  476   Service::HandleIsolateMessage(isolate, service_msg); | 
|  477   handler.HandleNextMessage(); |  477   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  478   // TODO(turnidge): Should this be a ServiceException instead? |  478   // TODO(turnidge): Should this be a ServiceException instead? | 
|  479   EXPECT_SUBSTRING("{\"type\":\"Sentinel\",\"kind\":\"Free\"," |  479   EXPECT_SUBSTRING("{\"type\":\"Sentinel\",\"kind\":\"Free\"," | 
|  480                    "\"valueAsString\":\"<free>\"", |  480                    "\"valueAsString\":\"<free>\"", | 
|  481                handler.msg()); |  481                handler.msg()); | 
|  482 } |  482 } | 
|  483  |  483  | 
|  484  |  484  | 
|  485 static const char* alpha_callback( |  485 static const char* alpha_callback( | 
|  486     const char* name, |  486     const char* name, | 
|  487     const char** option_keys, |  487     const char** option_keys, | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  525   ServiceTestMessageHandler handler; |  525   ServiceTestMessageHandler handler; | 
|  526   Dart_Port port_id = PortMap::CreatePort(&handler); |  526   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|  527   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  527   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  528   EXPECT_VALID(port); |  528   EXPECT_VALID(port); | 
|  529   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  529   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  530  |  530  | 
|  531  |  531  | 
|  532   Array& service_msg = Array::Handle(); |  532   Array& service_msg = Array::Handle(); | 
|  533   service_msg = Eval(lib, "[0, port, '\"', 'alpha', [], []]"); |  533   service_msg = Eval(lib, "[0, port, '\"', 'alpha', [], []]"); | 
|  534   Service::HandleRootMessage(service_msg); |  534   Service::HandleRootMessage(service_msg); | 
|  535   handler.HandleNextMessage(); |  535   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  536   EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":alpha,\"id\":\"\\\"\"}", |  536   EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":alpha,\"id\":\"\\\"\"}", | 
|  537                handler.msg()); |  537                handler.msg()); | 
|  538   service_msg = Eval(lib, "[0, port, 1, 'beta', [], []]"); |  538   service_msg = Eval(lib, "[0, port, 1, 'beta', [], []]"); | 
|  539   Service::HandleRootMessage(service_msg); |  539   Service::HandleRootMessage(service_msg); | 
|  540   handler.HandleNextMessage(); |  540   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  541   EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":beta,\"id\":1}", |  541   EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":beta,\"id\":1}", | 
|  542                handler.msg()); |  542                handler.msg()); | 
|  543 } |  543 } | 
|  544  |  544  | 
|  545  |  545  | 
|  546 TEST_CASE(Service_EmbedderIsolateHandler) { |  546 TEST_CASE(Service_EmbedderIsolateHandler) { | 
|  547   const char* kScript = |  547   const char* kScript = | 
|  548     "var port;\n"  // Set to our mock port by C++. |  548     "var port;\n"  // Set to our mock port by C++. | 
|  549     "\n" |  549     "\n" | 
|  550     "var x = 7;\n" |  550     "var x = 7;\n" | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
|  565   // Build a mock message handler and wrap it in a dart port. |  565   // Build a mock message handler and wrap it in a dart port. | 
|  566   ServiceTestMessageHandler handler; |  566   ServiceTestMessageHandler handler; | 
|  567   Dart_Port port_id = PortMap::CreatePort(&handler); |  567   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|  568   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  568   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  569   EXPECT_VALID(port); |  569   EXPECT_VALID(port); | 
|  570   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  570   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  571  |  571  | 
|  572   Array& service_msg = Array::Handle(); |  572   Array& service_msg = Array::Handle(); | 
|  573   service_msg = Eval(lib, "[0, port, '0', 'alpha', [], []]"); |  573   service_msg = Eval(lib, "[0, port, '0', 'alpha', [], []]"); | 
|  574   Service::HandleIsolateMessage(isolate, service_msg); |  574   Service::HandleIsolateMessage(isolate, service_msg); | 
|  575   handler.HandleNextMessage(); |  575   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  576   EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":alpha,\"id\":\"0\"}", |  576   EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":alpha,\"id\":\"0\"}", | 
|  577                handler.msg()); |  577                handler.msg()); | 
|  578   service_msg = Eval(lib, "[0, port, '0', 'beta', [], []]"); |  578   service_msg = Eval(lib, "[0, port, '0', 'beta', [], []]"); | 
|  579   Service::HandleIsolateMessage(isolate, service_msg); |  579   Service::HandleIsolateMessage(isolate, service_msg); | 
|  580   handler.HandleNextMessage(); |  580   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  581   EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":beta,\"id\":\"0\"}", |  581   EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":beta,\"id\":\"0\"}", | 
|  582                handler.msg()); |  582                handler.msg()); | 
|  583 } |  583 } | 
|  584  |  584  | 
|  585 // TODO(zra): Remove when tests are ready to enable. |  585 // TODO(zra): Remove when tests are ready to enable. | 
|  586 #if !defined(TARGET_ARCH_ARM64) |  586 #if !defined(TARGET_ARCH_ARM64) | 
|  587  |  587  | 
|  588 TEST_CASE(Service_Profile) { |  588 TEST_CASE(Service_Profile) { | 
|  589   const char* kScript = |  589   const char* kScript = | 
|  590       "var port;\n"  // Set to our mock port by C++. |  590       "var port;\n"  // Set to our mock port by C++. | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
|  604   // Build a mock message handler and wrap it in a dart port. |  604   // Build a mock message handler and wrap it in a dart port. | 
|  605   ServiceTestMessageHandler handler; |  605   ServiceTestMessageHandler handler; | 
|  606   Dart_Port port_id = PortMap::CreatePort(&handler); |  606   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|  607   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  607   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  608   EXPECT_VALID(port); |  608   EXPECT_VALID(port); | 
|  609   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  609   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  610  |  610  | 
|  611   Array& service_msg = Array::Handle(); |  611   Array& service_msg = Array::Handle(); | 
|  612   service_msg = Eval(lib, "[0, port, '0', '_getCpuProfile', [], []]"); |  612   service_msg = Eval(lib, "[0, port, '0', '_getCpuProfile', [], []]"); | 
|  613   Service::HandleIsolateMessage(isolate, service_msg); |  613   Service::HandleIsolateMessage(isolate, service_msg); | 
|  614   handler.HandleNextMessage(); |  614   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  615   // Expect error (tags required). |  615   // Expect error (tags required). | 
|  616   EXPECT_SUBSTRING("\"error\"", handler.msg()); |  616   EXPECT_SUBSTRING("\"error\"", handler.msg()); | 
|  617  |  617  | 
|  618   service_msg = |  618   service_msg = | 
|  619       Eval(lib, "[0, port, '0', '_getCpuProfile', ['tags'], ['None']]"); |  619       Eval(lib, "[0, port, '0', '_getCpuProfile', ['tags'], ['None']]"); | 
|  620   Service::HandleIsolateMessage(isolate, service_msg); |  620   Service::HandleIsolateMessage(isolate, service_msg); | 
|  621   handler.HandleNextMessage(); |  621   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  622   // Expect profile |  622   // Expect profile | 
|  623   EXPECT_SUBSTRING("\"type\":\"_CpuProfile\"", handler.msg()); |  623   EXPECT_SUBSTRING("\"type\":\"_CpuProfile\"", handler.msg()); | 
|  624  |  624  | 
|  625   service_msg = |  625   service_msg = | 
|  626       Eval(lib, "[0, port, '0', '_getCpuProfile', ['tags'], ['Bogus']]"); |  626       Eval(lib, "[0, port, '0', '_getCpuProfile', ['tags'], ['Bogus']]"); | 
|  627   Service::HandleIsolateMessage(isolate, service_msg); |  627   Service::HandleIsolateMessage(isolate, service_msg); | 
|  628   handler.HandleNextMessage(); |  628   EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); | 
|  629   // Expect error. |  629   // Expect error. | 
|  630   EXPECT_SUBSTRING("\"error\"", handler.msg()); |  630   EXPECT_SUBSTRING("\"error\"", handler.msg()); | 
|  631 } |  631 } | 
|  632  |  632  | 
|  633 #endif  // !defined(TARGET_ARCH_ARM64) |  633 #endif  // !defined(TARGET_ARCH_ARM64) | 
|  634  |  634  | 
|  635 }  // namespace dart |  635 }  // namespace dart | 
| OLD | NEW |