| 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_debugger_api.h" |     7 #include "include/dart_debugger_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 166 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   177   // Build a mock message handler and wrap it in a dart port. |   177   // Build a mock message handler and wrap it in a dart port. | 
|   178   ServiceTestMessageHandler handler; |   178   ServiceTestMessageHandler handler; | 
|   179   Dart_Port port_id = PortMap::CreatePort(&handler); |   179   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|   180   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |   180   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|   181   EXPECT_VALID(port); |   181   EXPECT_VALID(port); | 
|   182   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |   182   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|   183  |   183  | 
|   184   Array& service_msg = Array::Handle(); |   184   Array& service_msg = Array::Handle(); | 
|   185  |   185  | 
|   186   // Get the isolate summary. |   186   // Get the isolate summary. | 
|   187   service_msg = Eval(lib, "[0, port, [], [], []]"); |   187   service_msg = Eval(lib, "[0, port, 'getIsolate', [], []]"); | 
|   188   Service::HandleIsolateMessage(isolate, service_msg); |   188   Service::HandleIsolateMessage(isolate, service_msg); | 
|   189   handler.HandleNextMessage(); |   189   handler.HandleNextMessage(); | 
|   190  |   190  | 
|   191   JSONReader reader(handler.msg()); |   191   JSONReader reader(handler.msg()); | 
|   192  |   192  | 
|   193   const int kBufferSize = 128; |   193   const int kBufferSize = 128; | 
|   194   char buffer[kBufferSize]; |   194   char buffer[kBufferSize]; | 
|   195  |   195  | 
|   196   // Check that the response string is somewhat sane. |   196   // Check that the response string is somewhat sane. | 
|   197  |   197  | 
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   241     arr.SetAt(0, str); |   241     arr.SetAt(0, str); | 
|   242   } |   242   } | 
|   243   intptr_t arr_id = ring->GetIdForObject(arr.raw()); |   243   intptr_t arr_id = ring->GetIdForObject(arr.raw()); | 
|   244   Dart_Handle valid_id = Dart_NewInteger(arr_id); |   244   Dart_Handle valid_id = Dart_NewInteger(arr_id); | 
|   245   EXPECT_VALID(valid_id); |   245   EXPECT_VALID(valid_id); | 
|   246   EXPECT_VALID(Dart_SetField(lib, NewString("validId"), valid_id)); |   246   EXPECT_VALID(Dart_SetField(lib, NewString("validId"), valid_id)); | 
|   247  |   247  | 
|   248   Array& service_msg = Array::Handle(); |   248   Array& service_msg = Array::Handle(); | 
|   249  |   249  | 
|   250   // null |   250   // null | 
|   251   service_msg = Eval(lib, "[0, port, ['objects', 'null'], [], []]"); |   251   service_msg = Eval(lib, "[0, port, 'getObject', " | 
 |   252                      "['objectId'], ['objects/null']]"); | 
|   252   Service::HandleIsolateMessage(isolate, service_msg); |   253   Service::HandleIsolateMessage(isolate, service_msg); | 
|   253   handler.HandleNextMessage(); |   254   handler.HandleNextMessage(); | 
|   254   handler.filterMsg("_vmName"); |   255   handler.filterMsg("_vmName"); | 
|   255   EXPECT_SUBSTRING( |   256   EXPECT_SUBSTRING( | 
|   256       "{\"type\":\"null\",\"id\":\"objects\\/null\"," |   257       "{\"type\":\"null\",\"id\":\"objects\\/null\"," | 
|   257       "\"valueAsString\":\"null\",\"class\":", |   258       "\"valueAsString\":\"null\",\"class\":", | 
|   258       handler.msg()); |   259       handler.msg()); | 
|   259  |   260  | 
|   260   // not initialized |   261   // bool | 
|   261   service_msg = Eval(lib, "[0, port, ['objects', 'not-initialized'], [], []]"); |   262   service_msg = Eval(lib, "[0, port, 'getObject', " | 
 |   263                      "['objectId'], ['objects/bool-true']]"); | 
|   262   Service::HandleIsolateMessage(isolate, service_msg); |   264   Service::HandleIsolateMessage(isolate, service_msg); | 
|   263   handler.HandleNextMessage(); |   265   handler.HandleNextMessage(); | 
|   264   handler.filterMsg("_vmName"); |   266   handler.filterMsg("_vmName"); | 
|   265   EXPECT_STREQ( |  | 
|   266       "{\"type\":\"Sentinel\",\"id\":\"objects\\/not-initialized\"," |  | 
|   267       "\"valueAsString\":\"<not initialized>\"}", |  | 
|   268       handler.msg()); |  | 
|   269  |  | 
|   270   // being initialized |  | 
|   271   service_msg = Eval(lib, |  | 
|   272                      "[0, port, ['objects', 'being-initialized'], [], []]"); |  | 
|   273   Service::HandleIsolateMessage(isolate, service_msg); |  | 
|   274   handler.HandleNextMessage(); |  | 
|   275   handler.filterMsg("_vmName"); |  | 
|   276   EXPECT_STREQ( |  | 
|   277       "{\"type\":\"Sentinel\",\"id\":\"objects\\/being-initialized\"," |  | 
|   278       "\"valueAsString\":\"<being initialized>\"}", |  | 
|   279       handler.msg()); |  | 
|   280  |  | 
|   281   // optimized out |  | 
|   282   service_msg = Eval(lib, "[0, port, ['objects', 'optimized-out'], [], []]"); |  | 
|   283   Service::HandleIsolateMessage(isolate, service_msg); |  | 
|   284   handler.HandleNextMessage(); |  | 
|   285   handler.filterMsg("_vmName"); |  | 
|   286   EXPECT_STREQ( |  | 
|   287       "{\"type\":\"Sentinel\",\"id\":\"objects\\/optimized-out\"," |  | 
|   288       "\"valueAsString\":\"<optimized out>\"}", |  | 
|   289       handler.msg()); |  | 
|   290  |  | 
|   291   // collected |  | 
|   292   service_msg = Eval(lib, "[0, port, ['objects', 'collected'], [], []]"); |  | 
|   293   Service::HandleIsolateMessage(isolate, service_msg); |  | 
|   294   handler.HandleNextMessage(); |  | 
|   295   handler.filterMsg("_vmName"); |  | 
|   296   EXPECT_STREQ( |  | 
|   297       "{\"type\":\"Sentinel\",\"id\":\"objects\\/collected\"," |  | 
|   298       "\"valueAsString\":\"<collected>\"}", |  | 
|   299       handler.msg()); |  | 
|   300  |  | 
|   301   // expired |  | 
|   302   service_msg = Eval(lib, "[0, port, ['objects', 'expired'], [], []]"); |  | 
|   303   Service::HandleIsolateMessage(isolate, service_msg); |  | 
|   304   handler.HandleNextMessage(); |  | 
|   305   handler.filterMsg("_vmName"); |  | 
|   306   EXPECT_STREQ( |  | 
|   307       "{\"type\":\"Sentinel\",\"id\":\"objects\\/expired\"," |  | 
|   308       "\"valueAsString\":\"<expired>\"}", |  | 
|   309       handler.msg()); |  | 
|   310  |  | 
|   311   // bool |  | 
|   312   service_msg = Eval(lib, "[0, port, ['objects', 'bool-true'], [], []]"); |  | 
|   313   Service::HandleIsolateMessage(isolate, service_msg); |  | 
|   314   handler.HandleNextMessage(); |  | 
|   315   handler.filterMsg("_vmName"); |  | 
|   316   handler.filterMsg("size"); |   267   handler.filterMsg("size"); | 
|   317   EXPECT_STREQ( |   268   EXPECT_STREQ( | 
|   318       "{\"type\":\"bool\"," |   269       "{\"type\":\"bool\"," | 
|   319       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/46\"," |   270       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/46\"," | 
|   320       "\"name\":\"bool\"}," |   271       "\"name\":\"bool\"}," | 
|   321       "\"fields\":[],\"id\":\"objects\\/bool-true\"," |   272       "\"fields\":[],\"id\":\"objects\\/bool-true\"," | 
|   322       "\"valueAsString\":\"true\"}", |   273       "\"valueAsString\":\"true\"}", | 
|   323       handler.msg()); |   274       handler.msg()); | 
|   324  |   275  | 
|   325   // int |   276   // int | 
|   326   service_msg = Eval(lib, "[0, port, ['objects', 'int-123'], [], []]"); |   277   service_msg = Eval(lib, "[0, port, 'getObject', " | 
 |   278                      "['objectId'], ['objects/int-123']]"); | 
|   327   Service::HandleIsolateMessage(isolate, service_msg); |   279   Service::HandleIsolateMessage(isolate, service_msg); | 
|   328   handler.HandleNextMessage(); |   280   handler.HandleNextMessage(); | 
|   329   handler.filterMsg("_vmName"); |   281   handler.filterMsg("_vmName"); | 
|   330   EXPECT_STREQ( |   282   EXPECT_STREQ( | 
|   331       "{\"type\":\"int\",\"_vmType\":\"Smi\"," |   283       "{\"type\":\"int\",\"_vmType\":\"Smi\"," | 
|   332       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," |   284       "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," | 
|   333       "\"name\":\"_Smi\",}," |   285       "\"name\":\"_Smi\",}," | 
|   334       "\"fields\":[]," |   286       "\"fields\":[]," | 
|   335       "\"id\":\"objects\\/int-123\"," |   287       "\"id\":\"objects\\/int-123\"," | 
|   336       "\"valueAsString\":\"123\"}", |   288       "\"valueAsString\":\"123\"}", | 
|   337       handler.msg()); |   289       handler.msg()); | 
|   338  |   290  | 
|   339   // object id ring / valid |   291   // object id ring / valid | 
|   340   service_msg = Eval(lib, "[0, port, ['objects', '$validId'], [], []]"); |   292   service_msg = Eval(lib, "[0, port, 'getObject', " | 
 |   293                      "['objectId'], ['objects/$validId']]"); | 
|   341   Service::HandleIsolateMessage(isolate, service_msg); |   294   Service::HandleIsolateMessage(isolate, service_msg); | 
|   342   handler.HandleNextMessage(); |   295   handler.HandleNextMessage(); | 
|   343   handler.filterMsg("_vmName"); |   296   handler.filterMsg("_vmName"); | 
|   344   handler.filterMsg("size"); |   297   handler.filterMsg("size"); | 
|   345   handler.filterMsg("id"); |   298   handler.filterMsg("id"); | 
|   346   EXPECT_STREQ( |   299   EXPECT_STREQ( | 
|   347       "{\"type\":\"List\",\"_vmType\":\"Array\"," |   300       "{\"type\":\"List\",\"_vmType\":\"Array\"," | 
|   348       "\"class\":{\"type\":\"@Class\",\"name\":\"_List\",}," |   301       "\"class\":{\"type\":\"@Class\",\"name\":\"_List\",}," | 
|   349       "\"fields\":[]," |   302       "\"fields\":[]," | 
|   350       "\"length\":1," |   303       "\"length\":1," | 
|   351       "\"elements\":[{" |   304       "\"elements\":[{" | 
|   352           "\"index\":0," |   305           "\"index\":0," | 
|   353           "\"value\":{\"type\":\"@String\"," |   306           "\"value\":{\"type\":\"@String\"," | 
|   354           "\"class\":{\"type\":\"@Class\",\"name\":\"_OneByteString\",}," |   307           "\"class\":{\"type\":\"@Class\",\"name\":\"_OneByteString\",}," | 
|   355           "\"valueAsString\":\"value\"}}]}", |   308           "\"valueAsString\":\"value\"}}]}", | 
|   356       handler.msg()); |   309       handler.msg()); | 
|   357  |   310  | 
|   358   // object id ring / invalid => expired |   311   // object id ring / invalid => expired | 
|   359   service_msg = Eval(lib, "[0, port, ['objects', '99999999'], [], []]"); |   312   service_msg = Eval(lib, "[0, port, 'getObject', " | 
 |   313                      "['objectId'], ['objects/99999999']]"); | 
|   360   Service::HandleIsolateMessage(isolate, service_msg); |   314   Service::HandleIsolateMessage(isolate, service_msg); | 
|   361   handler.HandleNextMessage(); |   315   handler.HandleNextMessage(); | 
|   362   handler.filterMsg("_vmName"); |   316   handler.filterMsg("_vmName"); | 
|   363   EXPECT_STREQ( |   317   EXPECT_STREQ( | 
|   364       "{\"type\":\"Sentinel\",\"id\":\"objects\\/expired\"," |   318       "{\"type\":\"Sentinel\",\"id\":\"objects\\/expired\"," | 
|   365       "\"valueAsString\":\"<expired>\"}", |   319       "\"valueAsString\":\"<expired>\"}", | 
|   366       handler.msg()); |   320       handler.msg()); | 
|   367  |   321  | 
|   368   // Retained by single instance. |   322   // Retained by single instance. | 
|   369   service_msg = Eval( |   323   service_msg = Eval( | 
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   534   // Build a mock message handler and wrap it in a dart port. |   488   // Build a mock message handler and wrap it in a dart port. | 
|   535   ServiceTestMessageHandler handler; |   489   ServiceTestMessageHandler handler; | 
|   536   Dart_Port port_id = PortMap::CreatePort(&handler); |   490   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|   537   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |   491   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|   538   EXPECT_VALID(port); |   492   EXPECT_VALID(port); | 
|   539   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |   493   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|   540  |   494  | 
|   541   Array& service_msg = Array::Handle(); |   495   Array& service_msg = Array::Handle(); | 
|   542  |   496  | 
|   543   // Request library. |   497   // Request library. | 
|   544   service_msg = EvalF(lib, |   498   service_msg = | 
|   545                       "[0, port, ['libraries', '%" Pd "'], [], []]", |   499       EvalF(lib, | 
|   546                       vmlib.index()); |   500             "[0, port, 'getObject', ['objectId'], ['libraries/%" Pd "']]", | 
 |   501             vmlib.index()); | 
|   547   Service::HandleIsolateMessage(isolate, service_msg); |   502   Service::HandleIsolateMessage(isolate, service_msg); | 
|   548   handler.HandleNextMessage(); |   503   handler.HandleNextMessage(); | 
|   549   EXPECT_SUBSTRING("\"type\":\"Library\"", handler.msg()); |   504   EXPECT_SUBSTRING("\"type\":\"Library\"", handler.msg()); | 
|   550   EXPECT_SUBSTRING("\"url\":\"test-lib\"", handler.msg()); |   505   EXPECT_SUBSTRING("\"url\":\"test-lib\"", handler.msg()); | 
|   551 } |   506 } | 
|   552  |   507  | 
|   553  |   508  | 
|   554 TEST_CASE(Service_Classes) { |   509 TEST_CASE(Service_Classes) { | 
|   555   const char* kScript = |   510   const char* kScript = | 
|   556       "var port;\n"  // Set to our mock port by C++. |   511       "var port;\n"  // Set to our mock port by C++. | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
|   587   // Build a mock message handler and wrap it in a dart port. |   542   // Build a mock message handler and wrap it in a dart port. | 
|   588   ServiceTestMessageHandler handler; |   543   ServiceTestMessageHandler handler; | 
|   589   Dart_Port port_id = PortMap::CreatePort(&handler); |   544   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|   590   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |   545   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|   591   EXPECT_VALID(port); |   546   EXPECT_VALID(port); | 
|   592   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |   547   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|   593  |   548  | 
|   594   Array& service_msg = Array::Handle(); |   549   Array& service_msg = Array::Handle(); | 
|   595  |   550  | 
|   596   // Request an invalid class id. |   551   // Request an invalid class id. | 
|   597   service_msg = Eval(lib, "[0, port, ['classes', '999999'], [], []]"); |   552   service_msg = Eval(lib, "[0, port, 'getObject', " | 
 |   553                      "['objectId'], ['classes/999999']]"); | 
|   598   Service::HandleIsolateMessage(isolate, service_msg); |   554   Service::HandleIsolateMessage(isolate, service_msg); | 
|   599   handler.HandleNextMessage(); |   555   handler.HandleNextMessage(); | 
|   600   EXPECT_STREQ( |   556   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|   601     "{\"type\":\"Error\"," |  | 
|   602     "\"message\":\"999999 is not a valid class id.\"," |  | 
|   603     "\"request\":{\"arguments\":[\"classes\",\"999999\"]," |  | 
|   604     "\"option_keys\":[],\"option_values\":[]}}", handler.msg()); |  | 
|   605  |   557  | 
|   606   // Request the class A over the service. |   558   // Request the class A over the service. | 
|   607   service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid); |   559   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
 |   560                       "['objectId'], ['classes/%" Pd "']]", cid); | 
|   608   Service::HandleIsolateMessage(isolate, service_msg); |   561   Service::HandleIsolateMessage(isolate, service_msg); | 
|   609   handler.HandleNextMessage(); |   562   handler.HandleNextMessage(); | 
|   610   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg()); |   563   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg()); | 
|   611   ExpectSubstringF(handler.msg(), |   564   ExpectSubstringF(handler.msg(), | 
|   612                    "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid); |   565                    "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid); | 
|   613   ExpectSubstringF(handler.msg(), "\"allocationStats\":"); |   566   ExpectSubstringF(handler.msg(), "\"allocationStats\":"); | 
|   614   ExpectSubstringF(handler.msg(), "\"tokenPos\":"); |   567   ExpectSubstringF(handler.msg(), "\"tokenPos\":"); | 
|   615   ExpectSubstringF(handler.msg(), "\"endTokenPos\":"); |   568   ExpectSubstringF(handler.msg(), "\"endTokenPos\":"); | 
|   616  |   569  | 
|   617   // Request function 'b' from class A. |   570   // Request function 'b' from class A. | 
|   618   service_msg = EvalF(lib, |   571   service_msg = EvalF(lib, | 
|   619                       "[0, port, ['classes', '%" Pd "', 'functions', 'b']," |   572                       "[0, port, 'getObject', " | 
|   620                       "[], []]", cid); |   573                       "['objectId'], ['classes/%" Pd "/functions/b']]", cid); | 
|   621   Service::HandleIsolateMessage(isolate, service_msg); |   574   Service::HandleIsolateMessage(isolate, service_msg); | 
|   622   handler.HandleNextMessage(); |   575   handler.HandleNextMessage(); | 
|   623   EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg()); |   576   EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg()); | 
|   624   ExpectSubstringF(handler.msg(), |   577   ExpectSubstringF(handler.msg(), | 
|   625                    "\"id\":\"classes\\/%" Pd "\\/functions\\/b\"," |   578                    "\"id\":\"classes\\/%" Pd "\\/functions\\/b\"," | 
|   626                    "\"name\":\"b\",", cid); |   579                    "\"name\":\"b\",", cid); | 
|   627  |   580  | 
|   628   // Request field 0 from class A. |   581   // Request field 0 from class A. | 
|   629   service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'fields', '0']," |   582   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
|   630                       "[], []]", cid); |   583                       "['objectId'], ['classes/%" Pd "/fields/0']]", cid); | 
|   631   Service::HandleIsolateMessage(isolate, service_msg); |   584   Service::HandleIsolateMessage(isolate, service_msg); | 
|   632   handler.HandleNextMessage(); |   585   handler.HandleNextMessage(); | 
|   633   EXPECT_SUBSTRING("\"type\":\"Field\"", handler.msg()); |   586   EXPECT_SUBSTRING("\"type\":\"Field\"", handler.msg()); | 
|   634   ExpectSubstringF(handler.msg(), |   587   ExpectSubstringF(handler.msg(), | 
|   635                    "\"id\":\"classes\\/%" Pd "\\/fields\\/0\"," |   588                    "\"id\":\"classes\\/%" Pd "\\/fields\\/0\"," | 
|   636                    "\"name\":\"a\",", cid); |   589                    "\"name\":\"a\",", cid); | 
|   637  |   590  | 
|   638   // Invalid sub command. |   591   // Invalid sub command. | 
|   639   service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'huh', '0']," |   592   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
|   640                       "[], []]", cid); |   593                       "['objectId'], ['classes/%" Pd "/huh']]", cid); | 
|   641   Service::HandleIsolateMessage(isolate, service_msg); |   594   Service::HandleIsolateMessage(isolate, service_msg); | 
|   642   handler.HandleNextMessage(); |   595   handler.HandleNextMessage(); | 
|   643   ExpectSubstringF(handler.msg(), |   596   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|   644     "{\"type\":\"Error\",\"message\":\"Invalid sub collection huh\"" |  | 
|   645     ",\"request\":" |  | 
|   646     "{\"arguments\":[\"classes\",\"%" Pd "\",\"huh\",\"0\"],\"option_keys\":[]," |  | 
|   647     "\"option_values\":[]}}", cid); |  | 
|   648  |   597  | 
|   649   // Invalid field request. |   598   // Invalid field request. | 
|   650   service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'fields', '9']," |   599   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
|   651                       "[], []]", cid); |   600                       "['objectId'], ['classes/%" Pd "/fields/9']]", cid); | 
|   652   Service::HandleIsolateMessage(isolate, service_msg); |   601   Service::HandleIsolateMessage(isolate, service_msg); | 
|   653   handler.HandleNextMessage(); |   602   handler.HandleNextMessage(); | 
|   654   ExpectSubstringF(handler.msg(), |   603   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|   655     "{\"type\":\"Error\",\"message\":\"Field 9 not found\"," |  | 
|   656     "\"request\":{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\"]," |  | 
|   657     "\"option_keys\":[],\"option_values\":[]}}", cid); |  | 
|   658  |   604  | 
|   659   // Invalid function request. |   605   // Invalid function request. | 
|   660   service_msg = EvalF(lib, |   606   service_msg = EvalF(lib, | 
|   661                       "[0, port, ['classes', '%" Pd "', 'functions', '9']," |   607                       "[0, port, 'getObject', " | 
|   662                       "[], []]", cid); |   608                       "['objectId'], ['classes/%" Pd "/functions/9']]", cid); | 
|   663   Service::HandleIsolateMessage(isolate, service_msg); |   609   Service::HandleIsolateMessage(isolate, service_msg); | 
|   664   handler.HandleNextMessage(); |   610   handler.HandleNextMessage(); | 
|   665   ExpectSubstringF(handler.msg(), |   611   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|   666     "{\"type\":\"Error\",\"message\":\"Function 9 not found\"," |  | 
|   667     "\"request\":{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\"]," |  | 
|   668     "\"option_keys\":[],\"option_values\":[]}}", cid); |  | 
|   669  |  | 
|   670  |   612  | 
|   671   // Invalid field subcommand. |   613   // Invalid field subcommand. | 
|   672   service_msg = EvalF(lib, |   614   service_msg = EvalF(lib, | 
|   673                       "[0, port, ['classes', '%" Pd "', 'fields', '9', 'x']" |   615                       "[0, port, 'getObject', " | 
|   674                       ",[], []]", cid); |   616                       "['objectId'], ['classes/%" Pd "/fields/9']]", cid); | 
|   675   Service::HandleIsolateMessage(isolate, service_msg); |   617   Service::HandleIsolateMessage(isolate, service_msg); | 
|   676   handler.HandleNextMessage(); |   618   handler.HandleNextMessage(); | 
|   677   ExpectSubstringF(handler.msg(), |   619   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|   678     "{\"type\":\"Error\",\"message\":\"Command too long\"," |  | 
|   679     "\"request\":" |  | 
|   680     "{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\",\"x\"]," |  | 
|   681     "\"option_keys\":[],\"option_values\":[]}}", cid); |  | 
|   682  |   620  | 
|   683   // Invalid function command. |   621   // Invalid function command. | 
|   684   service_msg = EvalF(lib, |   622   service_msg = EvalF(lib, | 
|   685                       "[0, port, ['classes', '%" Pd "', 'functions', '0'," |   623                       "[0, port, 'getObject', " | 
|   686                       "'x', 'y'], [], []]", cid); |   624                       "['objectId'], ['classes/%" Pd "/functions/0/x/y']]", | 
 |   625                       cid); | 
|   687   Service::HandleIsolateMessage(isolate, service_msg); |   626   Service::HandleIsolateMessage(isolate, service_msg); | 
|   688   handler.HandleNextMessage(); |   627   handler.HandleNextMessage(); | 
|   689   ExpectSubstringF(handler.msg(), |   628   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|   690     "{\"type\":\"Error\"," |  | 
|   691     "\"message\":\"Command should have 4 or 5 arguments\"," |  | 
|   692     "\"request\":" |  | 
|   693     "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"0\",\"x\",\"y\"]," |  | 
|   694     "\"option_keys\":[],\"option_values\":[]}}", cid); |  | 
|   695  |   629  | 
|   696   // Invalid function subcommand with valid function id. |   630   // Invalid function subcommand with valid function id. | 
|   697   service_msg = EvalF(lib, |   631   service_msg = EvalF(lib, | 
|   698                       "[0, port, ['classes', '%" Pd "', 'functions', 'b'," |   632                       "[0, port, 'getObject', " | 
|   699                       "'x'], [], []]", cid); |   633                       "['objectId'], ['classes/%" Pd "/functions/b/x']]", cid); | 
|   700   Service::HandleIsolateMessage(isolate, service_msg); |   634   Service::HandleIsolateMessage(isolate, service_msg); | 
|   701   handler.HandleNextMessage(); |   635   handler.HandleNextMessage(); | 
|   702   ExpectSubstringF(handler.msg(), |   636   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|   703     "{\"type\":\"Error\",\"message\":\"Invalid sub command x\"," |  | 
|   704     "\"request\":" |  | 
|   705     "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"b\",\"x\"]," |  | 
|   706     "\"option_keys\":[],\"option_values\":[]}}", cid); |  | 
|   707  |   637  | 
|   708   // Retained size of all instances of class B. |   638   // Retained size of all instances of class B. | 
|   709   const Class& class_b = Class::Handle(GetClass(vmlib, "B")); |   639   const Class& class_b = Class::Handle(GetClass(vmlib, "B")); | 
|   710   EXPECT(!class_b.IsNull()); |   640   EXPECT(!class_b.IsNull()); | 
|   711   const Instance& b0 = Instance::Handle(Instance::New(class_b)); |   641   const Instance& b0 = Instance::Handle(Instance::New(class_b)); | 
|   712   const Instance& b1 = Instance::Handle(Instance::New(class_b)); |   642   const Instance& b1 = Instance::Handle(Instance::New(class_b)); | 
|   713   service_msg = EvalF(lib, "[0, port, 'getRetainedSize', " |   643   service_msg = EvalF(lib, "[0, port, 'getRetainedSize', " | 
|   714                       "['targetId'], ['classes/%" Pd "']]", class_b.id()); |   644                       "['targetId'], ['classes/%" Pd "']]", class_b.id()); | 
|   715   Service::HandleIsolateMessage(isolate, service_msg); |   645   Service::HandleIsolateMessage(isolate, service_msg); | 
|   716   handler.HandleNextMessage(); |   646   handler.HandleNextMessage(); | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
|   741   service_msg = EvalF(lib, "[0, port, 'getInstances', " |   671   service_msg = EvalF(lib, "[0, port, 'getInstances', " | 
|   742                       "['classId', 'limit'], ['classes/%" Pd "', '1']]", |   672                       "['classId', 'limit'], ['classes/%" Pd "', '1']]", | 
|   743                       class_b.id()); |   673                       class_b.id()); | 
|   744   Service::HandleIsolateMessage(isolate, service_msg); |   674   Service::HandleIsolateMessage(isolate, service_msg); | 
|   745   handler.HandleNextMessage(); |   675   handler.HandleNextMessage(); | 
|   746   ExpectSubstringF(handler.msg(), "\"totalCount\":2"); |   676   ExpectSubstringF(handler.msg(), "\"totalCount\":2"); | 
|   747   ExpectSubstringF(handler.msg(), "\"sampleCount\":1"); |   677   ExpectSubstringF(handler.msg(), "\"sampleCount\":1"); | 
|   748 } |   678 } | 
|   749  |   679  | 
|   750  |   680  | 
|   751 TEST_CASE(Service_SetSource) { |  | 
|   752   const char* kScript = |  | 
|   753       "var port;\n"  // Set to our mock port by C++. |  | 
|   754       "\n" |  | 
|   755       "class A {\n" |  | 
|   756       "  a() { return 1; }\n" |  | 
|   757       "  b() { return 0; }\n" |  | 
|   758       "  c(String f) { return f.length; }\n" |  | 
|   759       "}\n" |  | 
|   760       "main() {\n" |  | 
|   761       "  var z = new A();\n" |  | 
|   762       "  return z.a();\n" |  | 
|   763       "}\n" |  | 
|   764       "runB() {\n" |  | 
|   765       "  var z = new A();\n" |  | 
|   766       "  return z.b();\n" |  | 
|   767       "}\n" |  | 
|   768       "runC() {\n" |  | 
|   769       "  var z = new A();\n" |  | 
|   770       "  return z.c();\n" |  | 
|   771       "}\n"; |  | 
|   772  |  | 
|   773   Isolate* isolate = Isolate::Current(); |  | 
|   774   Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |  | 
|   775   EXPECT_VALID(lib); |  | 
|   776   Library& vmlib = Library::Handle(); |  | 
|   777   vmlib ^= Api::UnwrapHandle(lib); |  | 
|   778   EXPECT(!vmlib.IsNull()); |  | 
|   779   Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |  | 
|   780   EXPECT_VALID(result); |  | 
|   781   const Class& class_a = Class::Handle(GetClass(vmlib, "A")); |  | 
|   782   EXPECT(!class_a.IsNull()); |  | 
|   783   intptr_t cid = class_a.id(); |  | 
|   784  |  | 
|   785   // Build a mock message handler and wrap it in a dart port. |  | 
|   786   ServiceTestMessageHandler handler; |  | 
|   787   Dart_Port port_id = PortMap::CreatePort(&handler); |  | 
|   788   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  | 
|   789   EXPECT_VALID(port); |  | 
|   790   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  | 
|   791  |  | 
|   792   Array& service_msg = Array::Handle(); |  | 
|   793  |  | 
|   794   // Request the class A over the service. |  | 
|   795   service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid); |  | 
|   796   Service::HandleIsolateMessage(isolate, service_msg); |  | 
|   797   handler.HandleNextMessage(); |  | 
|   798   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg()); |  | 
|   799   ExpectSubstringF(handler.msg(), |  | 
|   800                    "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid); |  | 
|   801   ExpectSubstringF(handler.msg(), "\"allocationStats\":"); |  | 
|   802   ExpectSubstringF(handler.msg(), "\"tokenPos\":"); |  | 
|   803   ExpectSubstringF(handler.msg(), "\"endTokenPos\":"); |  | 
|   804  |  | 
|   805   // Request function 'b' from class A. |  | 
|   806   service_msg = EvalF(lib, |  | 
|   807                       "[0, port, ['classes', '%" Pd "', 'functions', 'b']," |  | 
|   808                       "[], []]", cid); |  | 
|   809   Service::HandleIsolateMessage(isolate, service_msg); |  | 
|   810   handler.HandleNextMessage(); |  | 
|   811   EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg()); |  | 
|   812   ExpectSubstringF(handler.msg(), |  | 
|   813                    "\"id\":\"classes\\/%" Pd "\\/functions\\/b\"," |  | 
|   814                    "\"name\":\"b\",", cid); |  | 
|   815  |  | 
|   816   // Invalid set source of function 'b' from class A. |  | 
|   817   service_msg = EvalF( |  | 
|   818     lib, |  | 
|   819     "[0, port, ['classes', '%" Pd "', 'functions', 'b', 'set_source']," |  | 
|   820     "[], []]", cid); |  | 
|   821   Service::HandleIsolateMessage(isolate, service_msg); |  | 
|   822   handler.HandleNextMessage(); |  | 
|   823   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); |  | 
|   824   EXPECT_SUBSTRING("set_source expects a 'source' option", handler.msg()); |  | 
|   825  |  | 
|   826   // Set source (with syntax error) of function 'b' from class A. |  | 
|   827   service_msg = EvalF( |  | 
|   828     lib, |  | 
|   829     "[0, port, ['classes', '%" Pd "', 'functions', 'b', 'set_source']," |  | 
|   830     "['source'], ['b() { return 4 }']]", cid); |  | 
|   831   Service::HandleIsolateMessage(isolate, service_msg); |  | 
|   832   handler.HandleNextMessage(); |  | 
|   833   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); |  | 
|   834  |  | 
|   835   // Set source of function 'b' from class A. |  | 
|   836   service_msg = EvalF( |  | 
|   837     lib, |  | 
|   838     "[0, port, ['classes', '%" Pd "', 'functions', 'b', 'set_source']," |  | 
|   839     "['source'], ['b() { return 4; }']]", cid); |  | 
|   840   Service::HandleIsolateMessage(isolate, service_msg); |  | 
|   841   handler.HandleNextMessage(); |  | 
|   842   EXPECT_SUBSTRING("Success", handler.msg()); |  | 
|   843  |  | 
|   844   // Run function 'b' see that it is executing replaced code. |  | 
|   845   result = Dart_Invoke(lib, NewString("runB"), 0, NULL); |  | 
|   846   EXPECT_VALID(result); |  | 
|   847   ASSERT(Dart_IsInteger(result)); |  | 
|   848   int64_t r; |  | 
|   849   result = Dart_IntegerToInt64(result, &r); |  | 
|   850   EXPECT_VALID(result); |  | 
|   851   EXPECT_EQ(4, r); |  | 
|   852  |  | 
|   853   // Set source of function 'c' from class A, changing its signature. |  | 
|   854   service_msg = EvalF( |  | 
|   855     lib, |  | 
|   856     "[0, port, ['classes', '%" Pd "', 'functions', 'c', 'set_source']," |  | 
|   857     "['source'], ['c() { return 99; }']]", cid); |  | 
|   858   Service::HandleIsolateMessage(isolate, service_msg); |  | 
|   859   handler.HandleNextMessage(); |  | 
|   860   EXPECT_SUBSTRING("Success", handler.msg()); |  | 
|   861  |  | 
|   862   // Run function 'c' see that it is executing replaced code. |  | 
|   863   result = Dart_Invoke(lib, NewString("runC"), 0, NULL); |  | 
|   864   EXPECT_VALID(result); |  | 
|   865   ASSERT(Dart_IsInteger(result)); |  | 
|   866   result = Dart_IntegerToInt64(result, &r); |  | 
|   867   EXPECT_VALID(result); |  | 
|   868   EXPECT_EQ(99, r); |  | 
|   869 } |  | 
|   870  |  | 
|   871  |  | 
|   872 TEST_CASE(Service_Types) { |   681 TEST_CASE(Service_Types) { | 
|   873   const char* kScript = |   682   const char* kScript = | 
|   874       "var port;\n"  // Set to our mock port by C++. |   683       "var port;\n"  // Set to our mock port by C++. | 
|   875       "\n" |   684       "\n" | 
|   876       "class A<T> { }\n" |   685       "class A<T> { }\n" | 
|   877       "\n" |   686       "\n" | 
|   878       "main() {\n" |   687       "main() {\n" | 
|   879       "  new A<A<bool>>();\n" |   688       "  new A<A<bool>>();\n" | 
|   880       "}"; |   689       "}"; | 
|   881  |   690  | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|   894   // Build a mock message handler and wrap it in a dart port. |   703   // Build a mock message handler and wrap it in a dart port. | 
|   895   ServiceTestMessageHandler handler; |   704   ServiceTestMessageHandler handler; | 
|   896   Dart_Port port_id = PortMap::CreatePort(&handler); |   705   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|   897   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |   706   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|   898   EXPECT_VALID(port); |   707   EXPECT_VALID(port); | 
|   899   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |   708   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|   900  |   709  | 
|   901   Array& service_msg = Array::Handle(); |   710   Array& service_msg = Array::Handle(); | 
|   902  |   711  | 
|   903   // Request the class A over the service. |   712   // Request the class A over the service. | 
|   904   service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid); |   713   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
 |   714                       "['objectId'], ['classes/%" Pd "']]]", cid); | 
|   905   Service::HandleIsolateMessage(isolate, service_msg); |   715   Service::HandleIsolateMessage(isolate, service_msg); | 
|   906   handler.HandleNextMessage(); |   716   handler.HandleNextMessage(); | 
|   907   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg()); |   717   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg()); | 
|   908   EXPECT_SUBSTRING("\"name\":\"A\"", handler.msg()); |   718   EXPECT_SUBSTRING("\"name\":\"A\"", handler.msg()); | 
|   909   ExpectSubstringF(handler.msg(), |   719   ExpectSubstringF(handler.msg(), | 
|   910                    "\"id\":\"classes\\/%" Pd "\"", cid); |   720                    "\"id\":\"classes\\/%" Pd "\"", cid); | 
|   911  |   721  | 
|   912   // Request canonical type 0 from class A. |   722   // Request canonical type 0 from class A. | 
|   913   service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'types', '0']," |   723   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
|   914                               "[], []]", cid); |   724                       "['objectId'], ['classes/%" Pd "/types/0']]", cid); | 
|   915   Service::HandleIsolateMessage(isolate, service_msg); |   725   Service::HandleIsolateMessage(isolate, service_msg); | 
|   916   handler.HandleNextMessage(); |   726   handler.HandleNextMessage(); | 
|   917   EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg()); |   727   EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg()); | 
|   918   EXPECT_SUBSTRING("\"name\":\"A<bool>\"", handler.msg()); |   728   EXPECT_SUBSTRING("\"name\":\"A<bool>\"", handler.msg()); | 
|   919   ExpectSubstringF(handler.msg(), |   729   ExpectSubstringF(handler.msg(), | 
|   920                    "\"id\":\"classes\\/%" Pd "\\/types\\/0\"", cid); |   730                    "\"id\":\"classes\\/%" Pd "\\/types\\/0\"", cid); | 
|   921  |   731  | 
|   922   // Request canonical type 1 from class A. |   732   // Request canonical type 1 from class A. | 
|   923   service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'types', '1']," |   733   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
|   924                               "[], []]", cid); |   734                       "['objectId'], ['classes/%" Pd "/types/1']]", cid); | 
|   925   Service::HandleIsolateMessage(isolate, service_msg); |   735   Service::HandleIsolateMessage(isolate, service_msg); | 
|   926   handler.HandleNextMessage(); |   736   handler.HandleNextMessage(); | 
|   927   EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg()); |   737   EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg()); | 
|   928   EXPECT_SUBSTRING("\"name\":\"A<A<bool>>\"", handler.msg()); |   738   EXPECT_SUBSTRING("\"name\":\"A<A<bool>>\"", handler.msg()); | 
|   929   ExpectSubstringF(handler.msg(), |   739   ExpectSubstringF(handler.msg(), | 
|   930                    "\"id\":\"classes\\/%" Pd "\\/types\\/1\"", cid); |   740                    "\"id\":\"classes\\/%" Pd "\\/types\\/1\"", cid); | 
|   931  |   741  | 
|   932   // Request for non-existent canonical type from class A. |   742   // Request for non-existent canonical type from class A. | 
|   933   service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'types', '42']," |   743   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
|   934                       "[], []]", cid); |   744                       "['objectId'], ['classes/%" Pd "/types/42']]", cid); | 
|   935   Service::HandleIsolateMessage(isolate, service_msg); |   745   Service::HandleIsolateMessage(isolate, service_msg); | 
|   936   handler.HandleNextMessage(); |   746   handler.HandleNextMessage(); | 
|   937   ExpectSubstringF(handler.msg(), |   747   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|   938     "{\"type\":\"Error\"," |  | 
|   939     "\"message\":\"Canonical type 42 not found\"" |  | 
|   940     ",\"request\":" |  | 
|   941     "{\"arguments\":[\"classes\",\"%" Pd "\",\"types\",\"42\"]," |  | 
|   942     "\"option_keys\":[],\"option_values\":[]}}", cid); |  | 
|   943 } |   748 } | 
|   944  |   749  | 
|   945  |   750  | 
|   946 TEST_CASE(Service_Code) { |   751 TEST_CASE(Service_Code) { | 
|   947   const char* kScript = |   752   const char* kScript = | 
|   948       "var port;\n"  // Set to our mock port by C++. |   753       "var port;\n"  // Set to our mock port by C++. | 
|   949       "\n" |   754       "\n" | 
|   950       "class A {\n" |   755       "class A {\n" | 
|   951       "  var a;\n" |   756       "  var a;\n" | 
|   952       "  dynamic b() {}\n" |   757       "  dynamic b() {}\n" | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   984   // Build a mock message handler and wrap it in a dart port. |   789   // Build a mock message handler and wrap it in a dart port. | 
|   985   ServiceTestMessageHandler handler; |   790   ServiceTestMessageHandler handler; | 
|   986   Dart_Port port_id = PortMap::CreatePort(&handler); |   791   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|   987   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |   792   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|   988   EXPECT_VALID(port); |   793   EXPECT_VALID(port); | 
|   989   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |   794   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|   990  |   795  | 
|   991   Array& service_msg = Array::Handle(); |   796   Array& service_msg = Array::Handle(); | 
|   992  |   797  | 
|   993   // Request an invalid code object. |   798   // Request an invalid code object. | 
|   994   service_msg = Eval(lib, "[0, port, ['code', '0'], [], []]"); |   799   service_msg = Eval(lib, "[0, port, 'getObject', ['objectId'], ['code/0']]"); | 
|   995   Service::HandleIsolateMessage(isolate, service_msg); |   800   Service::HandleIsolateMessage(isolate, service_msg); | 
|   996   handler.HandleNextMessage(); |   801   handler.HandleNextMessage(); | 
|   997   EXPECT_STREQ( |   802   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|   998     "{\"type\":\"Error\",\"message\":\"Malformed code id: 0\"," |  | 
|   999     "\"request\":{\"arguments\":[\"code\",\"0\"]," |  | 
|  1000     "\"option_keys\":[],\"option_values\":[]}}", handler.msg()); |  | 
|  1001  |   803  | 
|  1002   // The following test checks that a code object can be found only |   804   // The following test checks that a code object can be found only | 
|  1003   // at compile_timestamp()-code.EntryPoint(). |   805   // at compile_timestamp()-code.EntryPoint(). | 
|  1004   service_msg = EvalF(lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]", |   806   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
 |   807                       "['objectId'], ['code/%" Px64"-%" Px "']]", | 
|  1005                       compile_timestamp, |   808                       compile_timestamp, | 
|  1006                       entry); |   809                       entry); | 
|  1007   Service::HandleIsolateMessage(isolate, service_msg); |   810   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1008   handler.HandleNextMessage(); |   811   handler.HandleNextMessage(); | 
|  1009   { |   812   { | 
|  1010     // Only perform a partial match. |   813     // Only perform a partial match. | 
|  1011     const intptr_t kBufferSize = 512; |   814     const intptr_t kBufferSize = 512; | 
|  1012     char buffer[kBufferSize]; |   815     char buffer[kBufferSize]; | 
|  1013     OS::SNPrint(buffer, kBufferSize-1, |   816     OS::SNPrint(buffer, kBufferSize-1, | 
|  1014                 "{\"type\":\"Code\",\"id\":\"code\\/%" Px64 "-%" Px "\",", |   817                 "{\"type\":\"Code\",\"id\":\"code\\/%" Px64 "-%" Px "\",", | 
|  1015                 compile_timestamp, |   818                 compile_timestamp, | 
|  1016                 entry); |   819                 entry); | 
|  1017     EXPECT_SUBSTRING(buffer, handler.msg()); |   820     EXPECT_SUBSTRING(buffer, handler.msg()); | 
|  1018   } |   821   } | 
|  1019  |   822  | 
|  1020   // Request code object at compile_timestamp-code.EntryPoint() + 16 |   823   // Request code object at compile_timestamp-code.EntryPoint() + 16 | 
|  1021   // Expect this to fail because the address is not the entry point. |   824   // Expect this to fail because the address is not the entry point. | 
|  1022   uintptr_t address = entry + 16; |   825   uintptr_t address = entry + 16; | 
|  1023   service_msg = EvalF(lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]", |   826   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
 |   827                       "['objectId'], ['code/%" Px64"-%" Px "']]", | 
|  1024                       compile_timestamp, |   828                       compile_timestamp, | 
|  1025                       address); |   829                       address); | 
|  1026   Service::HandleIsolateMessage(isolate, service_msg); |   830   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1027   handler.HandleNextMessage(); |   831   handler.HandleNextMessage(); | 
|  1028   { |   832   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|  1029     // Only perform a partial match. |  | 
|  1030     const intptr_t kBufferSize = 512; |  | 
|  1031     char buffer[kBufferSize]; |  | 
|  1032     OS::SNPrint(buffer, kBufferSize-1, |  | 
|  1033                 "Could not find code with id: %" Px64 "-%" Px "", |  | 
|  1034                 compile_timestamp, |  | 
|  1035                 address); |  | 
|  1036     EXPECT_SUBSTRING(buffer, handler.msg()); |  | 
|  1037   } |  | 
|  1038  |   833  | 
|  1039   // Request code object at (compile_timestamp - 1)-code.EntryPoint() |   834   // Request code object at (compile_timestamp - 1)-code.EntryPoint() | 
|  1040   // Expect this to fail because the timestamp is wrong. |   835   // Expect this to fail because the timestamp is wrong. | 
|  1041   address = entry; |   836   address = entry; | 
|  1042   service_msg = EvalF(lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]", |   837   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
 |   838                       "['objectId'], ['code/%" Px64"-%" Px "']]", | 
|  1043                       compile_timestamp - 1, |   839                       compile_timestamp - 1, | 
|  1044                       address); |   840                       address); | 
|  1045   Service::HandleIsolateMessage(isolate, service_msg); |   841   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1046   handler.HandleNextMessage(); |   842   handler.HandleNextMessage(); | 
|  1047   { |   843   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|  1048     // Only perform a partial match. |  | 
|  1049     const intptr_t kBufferSize = 512; |  | 
|  1050     char buffer[kBufferSize]; |  | 
|  1051     OS::SNPrint(buffer, kBufferSize-1, |  | 
|  1052                 "Could not find code with id: %" Px64 "-%" Px "", |  | 
|  1053                 compile_timestamp - 1, |  | 
|  1054                 address); |  | 
|  1055     EXPECT_SUBSTRING(buffer, handler.msg()); |  | 
|  1056   } |  | 
|  1057  |   844  | 
|  1058   // Request native code at address. Expect the null code object back. |   845   // Request native code at address. Expect the null code object back. | 
|  1059   address = last; |   846   address = last; | 
|  1060   service_msg = EvalF(lib, "[0, port, ['code', 'native-%" Px "'], [], []]", |   847   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
 |   848                       "['objectId'], ['code/native-%" Px "']]", | 
|  1061                       address); |   849                       address); | 
|  1062   Service::HandleIsolateMessage(isolate, service_msg); |   850   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1063   handler.HandleNextMessage(); |   851   handler.HandleNextMessage(); | 
|  1064   EXPECT_SUBSTRING("{\"type\":\"null\",\"id\":\"objects\\/null\"," |   852   EXPECT_SUBSTRING("{\"type\":\"null\",\"id\":\"objects\\/null\"," | 
|  1065                    "\"valueAsString\":\"null\"", |   853                    "\"valueAsString\":\"null\"", | 
|  1066                    handler.msg()); |   854                    handler.msg()); | 
|  1067  |   855  | 
|  1068   // Request malformed native code. |   856   // Request malformed native code. | 
|  1069   service_msg = EvalF(lib, "[0, port, ['code', 'native%" Px "'], [], []]", |   857   service_msg = EvalF(lib, "[0, port, 'getObject', ['objectId'], " | 
 |   858                       "['code/native%" Px "']]", | 
|  1070                       address); |   859                       address); | 
|  1071   Service::HandleIsolateMessage(isolate, service_msg); |   860   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1072   handler.HandleNextMessage(); |   861   handler.HandleNextMessage(); | 
|  1073   EXPECT_SUBSTRING("\"message\":\"Malformed code id:", handler.msg()); |   862   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|  1074 } |   863 } | 
|  1075  |   864  | 
|  1076  |   865  | 
|  1077 TEST_CASE(Service_TokenStream) { |   866 TEST_CASE(Service_TokenStream) { | 
|  1078   const char* kScript = |   867   const char* kScript = | 
|  1079       "var port;\n"  // Set to our mock port by C++. |   868       "var port;\n"  // Set to our mock port by C++. | 
|  1080       "\n" |   869       "\n" | 
|  1081       "main() {\n" |   870       "main() {\n" | 
|  1082       "}"; |   871       "}"; | 
|  1083  |   872  | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|  1102   // Build a mock message handler and wrap it in a dart port. |   891   // Build a mock message handler and wrap it in a dart port. | 
|  1103   ServiceTestMessageHandler handler; |   892   ServiceTestMessageHandler handler; | 
|  1104   Dart_Port port_id = PortMap::CreatePort(&handler); |   893   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|  1105   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |   894   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  1106   EXPECT_VALID(port); |   895   EXPECT_VALID(port); | 
|  1107   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |   896   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  1108  |   897  | 
|  1109   Array& service_msg = Array::Handle(); |   898   Array& service_msg = Array::Handle(); | 
|  1110  |   899  | 
|  1111   // Fetch object. |   900   // Fetch object. | 
|  1112   service_msg = EvalF(lib, "[0, port, ['objects', '%" Pd "'], [], []]", id); |   901   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
 |   902                       "['objectId'], ['objects/%" Pd "']]", id); | 
|  1113   Service::HandleIsolateMessage(isolate, service_msg); |   903   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1114   handler.HandleNextMessage(); |   904   handler.HandleNextMessage(); | 
|  1115  |   905  | 
|  1116   // Check type. |   906   // Check type. | 
|  1117   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); |   907   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); | 
|  1118   EXPECT_SUBSTRING("\"_vmType\":\"TokenStream\"", handler.msg()); |   908   EXPECT_SUBSTRING("\"_vmType\":\"TokenStream\"", handler.msg()); | 
|  1119   // Check for members array. |   909   // Check for members array. | 
|  1120   EXPECT_SUBSTRING("\"members\":[", handler.msg()); |   910   EXPECT_SUBSTRING("\"members\":[", handler.msg()); | 
|  1121 } |   911 } | 
|  1122  |   912  | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1163   // Build a mock message handler and wrap it in a dart port. |   953   // Build a mock message handler and wrap it in a dart port. | 
|  1164   ServiceTestMessageHandler handler; |   954   ServiceTestMessageHandler handler; | 
|  1165   Dart_Port port_id = PortMap::CreatePort(&handler); |   955   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|  1166   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |   956   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  1167   EXPECT_VALID(port); |   957   EXPECT_VALID(port); | 
|  1168   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |   958   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  1169  |   959  | 
|  1170   Array& service_msg = Array::Handle(); |   960   Array& service_msg = Array::Handle(); | 
|  1171  |   961  | 
|  1172   // Fetch object. |   962   // Fetch object. | 
|  1173   service_msg = EvalF(lib, "[0, port, ['objects', '%" Pd "'], [], []]", id); |   963   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
 |   964                       "['objectId'], ['objects/%" Pd "']]", id); | 
|  1174   Service::HandleIsolateMessage(isolate, service_msg); |   965   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1175   handler.HandleNextMessage(); |   966   handler.HandleNextMessage(); | 
|  1176   // Check type. |   967   // Check type. | 
|  1177   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); |   968   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); | 
|  1178   EXPECT_SUBSTRING("\"_vmType\":\"PcDescriptors\"", handler.msg()); |   969   EXPECT_SUBSTRING("\"_vmType\":\"PcDescriptors\"", handler.msg()); | 
|  1179   // Check for members array. |   970   // Check for members array. | 
|  1180   EXPECT_SUBSTRING("\"members\":[", handler.msg()); |   971   EXPECT_SUBSTRING("\"members\":[", handler.msg()); | 
|  1181 } |   972 } | 
|  1182  |   973  | 
|  1183  |   974  | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1223   // Build a mock message handler and wrap it in a dart port. |  1014   // Build a mock message handler and wrap it in a dart port. | 
|  1224   ServiceTestMessageHandler handler; |  1015   ServiceTestMessageHandler handler; | 
|  1225   Dart_Port port_id = PortMap::CreatePort(&handler); |  1016   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|  1226   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  1017   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  1227   EXPECT_VALID(port); |  1018   EXPECT_VALID(port); | 
|  1228   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  1019   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  1229  |  1020  | 
|  1230   Array& service_msg = Array::Handle(); |  1021   Array& service_msg = Array::Handle(); | 
|  1231  |  1022  | 
|  1232   // Fetch object. |  1023   // Fetch object. | 
|  1233   service_msg = EvalF(lib, "[0, port, ['objects', '%" Pd "'], [], []]", id); |  1024   service_msg = EvalF(lib, "[0, port, 'getObject', " | 
 |  1025                       "['objectId'], ['objects/%" Pd "']]", id); | 
|  1234   Service::HandleIsolateMessage(isolate, service_msg); |  1026   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1235   handler.HandleNextMessage(); |  1027   handler.HandleNextMessage(); | 
|  1236   // Check type. |  1028   // Check type. | 
|  1237   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); |  1029   EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); | 
|  1238   EXPECT_SUBSTRING("\"_vmType\":\"LocalVarDescriptors\"", handler.msg()); |  1030   EXPECT_SUBSTRING("\"_vmType\":\"LocalVarDescriptors\"", handler.msg()); | 
|  1239   // Check for members array. |  1031   // Check for members array. | 
|  1240   EXPECT_SUBSTRING("\"members\":[", handler.msg()); |  1032   EXPECT_SUBSTRING("\"members\":[", handler.msg()); | 
|  1241 } |  1033 } | 
|  1242  |  1034  | 
|  1243  |  1035  | 
|  1244 TEST_CASE(Service_VM) { |  1036 TEST_CASE(Service_VM) { | 
|  1245   const char* kScript = |  1037   const char* kScript = | 
|  1246       "var port;\n"  // Set to our mock port by C++. |  1038       "var port;\n"  // Set to our mock port by C++. | 
|  1247       "\n" |  1039       "\n" | 
|  1248       "main() {\n" |  1040       "main() {\n" | 
|  1249       "}"; |  1041       "}"; | 
|  1250  |  1042  | 
|  1251   Isolate* isolate = Isolate::Current(); |  1043   Isolate* isolate = Isolate::Current(); | 
|  1252   Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |  1044   Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 
|  1253   EXPECT_VALID(lib); |  1045   EXPECT_VALID(lib); | 
|  1254  |  1046  | 
|  1255   // Build a mock message handler and wrap it in a dart port. |  1047   // Build a mock message handler and wrap it in a dart port. | 
|  1256   ServiceTestMessageHandler handler; |  1048   ServiceTestMessageHandler handler; | 
|  1257   Dart_Port port_id = PortMap::CreatePort(&handler); |  1049   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|  1258   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  1050   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  1259   EXPECT_VALID(port); |  1051   EXPECT_VALID(port); | 
|  1260   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  1052   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  1261  |  1053  | 
|  1262   Array& service_msg = Array::Handle(); |  1054   Array& service_msg = Array::Handle(); | 
|  1263   service_msg = Eval(lib, "[0, port, ['vm'], [], []]"); |  1055   service_msg = Eval(lib, "[0, port, 'getVM', [], []]"); | 
|  1264  |  1056  | 
|  1265   Service::HandleRootMessage(service_msg); |  1057   Service::HandleRootMessage(service_msg); | 
|  1266   handler.HandleNextMessage(); |  1058   handler.HandleNextMessage(); | 
|  1267   EXPECT_SUBSTRING("\"type\":\"VM\",\"id\":\"vm\"", handler.msg()); |  1059   EXPECT_SUBSTRING("\"type\":\"VM\",\"id\":\"vm\"", handler.msg()); | 
|  1268   EXPECT_SUBSTRING("\"targetCPU\"", handler.msg()); |  1060   EXPECT_SUBSTRING("\"targetCPU\"", handler.msg()); | 
|  1269   EXPECT_SUBSTRING("\"hostCPU\"", handler.msg()); |  1061   EXPECT_SUBSTRING("\"hostCPU\"", handler.msg()); | 
|  1270   EXPECT_SUBSTRING("\"version\"", handler.msg()); |  1062   EXPECT_SUBSTRING("\"version\"", handler.msg()); | 
|  1271   EXPECT_SUBSTRING("\"uptime\"", handler.msg()); |  1063   EXPECT_SUBSTRING("\"uptime\"", handler.msg()); | 
|  1272   EXPECT_SUBSTRING("\"isolates\"", handler.msg()); |  1064   EXPECT_SUBSTRING("\"isolates\"", handler.msg()); | 
|  1273 } |  1065 } | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|  1285   EXPECT_VALID(lib); |  1077   EXPECT_VALID(lib); | 
|  1286  |  1078  | 
|  1287   // Build a mock message handler and wrap it in a dart port. |  1079   // Build a mock message handler and wrap it in a dart port. | 
|  1288   ServiceTestMessageHandler handler; |  1080   ServiceTestMessageHandler handler; | 
|  1289   Dart_Port port_id = PortMap::CreatePort(&handler); |  1081   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|  1290   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  1082   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  1291   EXPECT_VALID(port); |  1083   EXPECT_VALID(port); | 
|  1292   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  1084   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  1293  |  1085  | 
|  1294   Array& service_msg = Array::Handle(); |  1086   Array& service_msg = Array::Handle(); | 
|  1295   service_msg = Eval(lib, "[0, port, ['flags'], [], []]"); |  1087   service_msg = Eval(lib, "[0, port, 'getFlagList', [], []]"); | 
|  1296  |  1088  | 
|  1297   // Make sure we can get the FlagList. |  1089   // Make sure we can get the FlagList. | 
|  1298   Service::HandleRootMessage(service_msg); |  1090   Service::HandleRootMessage(service_msg); | 
|  1299   handler.HandleNextMessage(); |  1091   handler.HandleNextMessage(); | 
|  1300   EXPECT_SUBSTRING("\"type\":\"FlagList\",\"id\":\"flags\"", handler.msg()); |  1092   EXPECT_SUBSTRING("\"type\":\"FlagList\",\"id\":\"flags\"", handler.msg()); | 
|  1301   EXPECT_SUBSTRING( |  1093   EXPECT_SUBSTRING( | 
|  1302       "\"name\":\"service_testing_flag\",\"comment\":\"Comment\"," |  1094       "\"name\":\"service_testing_flag\",\"comment\":\"Comment\"," | 
|  1303       "\"flagType\":\"bool\",\"valueAsString\":\"false\"", |  1095       "\"flagType\":\"bool\",\"valueAsString\":\"false\"", | 
|  1304       handler.msg()); |  1096       handler.msg()); | 
|  1305  |  1097  | 
|  1306   // Modify a flag through the vm service. |  1098   // Modify a flag through the vm service. | 
|  1307   service_msg = Eval(lib, |  1099   service_msg = Eval(lib, | 
|  1308                      "[0, port, ['flags', 'set'], " |  1100                      "[0, port, 'setFlag', " | 
|  1309                      "['name', 'value'], ['service_testing_flag', 'true']]"); |  1101                      "['name', 'value'], ['service_testing_flag', 'true']]"); | 
|  1310   Service::HandleRootMessage(service_msg); |  1102   Service::HandleRootMessage(service_msg); | 
|  1311   handler.HandleNextMessage(); |  1103   handler.HandleNextMessage(); | 
|  1312   EXPECT_SUBSTRING("Success", handler.msg()); |  1104   EXPECT_SUBSTRING("Success", handler.msg()); | 
|  1313  |  1105  | 
|  1314   // Make sure that the flag changed. |  1106   // Make sure that the flag changed. | 
|  1315   service_msg = Eval(lib, "[0, port, ['flags'], [], []]"); |  1107   service_msg = Eval(lib, "[0, port, 'getFlagList', [], []]"); | 
|  1316   Service::HandleRootMessage(service_msg); |  1108   Service::HandleRootMessage(service_msg); | 
|  1317   handler.HandleNextMessage(); |  1109   handler.HandleNextMessage(); | 
|  1318   EXPECT_SUBSTRING( |  1110   EXPECT_SUBSTRING( | 
|  1319       "\"name\":\"service_testing_flag\",\"comment\":\"Comment\"," |  1111       "\"name\":\"service_testing_flag\",\"comment\":\"Comment\"," | 
|  1320       "\"flagType\":\"bool\",\"valueAsString\":\"true\"", |  1112       "\"flagType\":\"bool\",\"valueAsString\":\"true\"", | 
|  1321       handler.msg()); |  1113       handler.msg()); | 
|  1322 } |  1114 } | 
|  1323  |  1115  | 
|  1324  |  1116  | 
|  1325 TEST_CASE(Service_Scripts) { |  1117 TEST_CASE(Service_Scripts) { | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
|  1339   // Build a mock message handler and wrap it in a dart port. |  1131   // Build a mock message handler and wrap it in a dart port. | 
|  1340   ServiceTestMessageHandler handler; |  1132   ServiceTestMessageHandler handler; | 
|  1341   Dart_Port port_id = PortMap::CreatePort(&handler); |  1133   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|  1342   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  1134   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  1343   EXPECT_VALID(port); |  1135   EXPECT_VALID(port); | 
|  1344   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  1136   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  1345  |  1137  | 
|  1346   Array& service_msg = Array::Handle(); |  1138   Array& service_msg = Array::Handle(); | 
|  1347   char buf[1024]; |  1139   char buf[1024]; | 
|  1348   OS::SNPrint(buf, sizeof(buf), |  1140   OS::SNPrint(buf, sizeof(buf), | 
|  1349       "[0, port, ['libraries', '%" Pd "', 'scripts', 'test-lib'], [], []]", |  1141               "[0, port, 'getObject', " | 
|  1350       vmlib.index()); |  1142               "['objectId'], ['libraries/%" Pd "/scripts/test-lib']]", | 
 |  1143               vmlib.index()); | 
|  1351  |  1144  | 
|  1352   service_msg = Eval(lib, buf); |  1145   service_msg = Eval(lib, buf); | 
|  1353   Service::HandleIsolateMessage(isolate, service_msg); |  1146   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1354   handler.HandleNextMessage(); |  1147   handler.HandleNextMessage(); | 
|  1355   OS::SNPrint(buf, sizeof(buf), |  1148   OS::SNPrint(buf, sizeof(buf), | 
|  1356       "{\"type\":\"Script\"," |  1149       "{\"type\":\"Script\"," | 
|  1357       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," |  1150       "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," | 
|  1358       "\"name\":\"test-lib\"," |  1151       "\"name\":\"test-lib\"," | 
|  1359       "\"kind\":\"script\"," |  1152       "\"kind\":\"script\"," | 
|  1360       "\"owningLibrary\":{\"type\":\"@Library\"," |  1153       "\"owningLibrary\":{\"type\":\"@Library\"," | 
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1483   const String& str = String::Handle(String::New("foobar", Heap::kOld)); |  1276   const String& str = String::Handle(String::New("foobar", Heap::kOld)); | 
|  1484   Array& service_msg = Array::Handle(); |  1277   Array& service_msg = Array::Handle(); | 
|  1485   // Note: If we ever introduce old space compaction, this test might fail. |  1278   // Note: If we ever introduce old space compaction, this test might fail. | 
|  1486   uword start_addr = RawObject::ToAddr(str.raw()); |  1279   uword start_addr = RawObject::ToAddr(str.raw()); | 
|  1487   // Expect to find 'str', also from internal addresses. |  1280   // Expect to find 'str', also from internal addresses. | 
|  1488   for (int offset = 0; offset < kObjectAlignment; ++offset) { |  1281   for (int offset = 0; offset < kObjectAlignment; ++offset) { | 
|  1489     uword addr = start_addr + offset; |  1282     uword addr = start_addr + offset; | 
|  1490     char buf[1024]; |  1283     char buf[1024]; | 
|  1491     bool ref = offset % 2 == 0; |  1284     bool ref = offset % 2 == 0; | 
|  1492     OS::SNPrint(buf, sizeof(buf), |  1285     OS::SNPrint(buf, sizeof(buf), | 
|  1493                 ref ? "[0, port, ['address', '%" Px "'], ['ref'], ['true']]" : |  1286                 (ref | 
|  1494                       "[0, port, ['address', '%" Px "', ], [], []]", |  1287                  ? "[0, port, 'getObjectByAddress', " | 
 |  1288                    "['address', 'ref'], ['%" Px "', 'true']]" | 
 |  1289                  : "[0, port, 'getObjectByAddress', " | 
 |  1290                    "['address'], ['%" Px "']]"), | 
|  1495                 addr); |  1291                 addr); | 
|  1496     service_msg = Eval(lib, buf); |  1292     service_msg = Eval(lib, buf); | 
|  1497     Service::HandleIsolateMessage(isolate, service_msg); |  1293     Service::HandleIsolateMessage(isolate, service_msg); | 
|  1498     handler.HandleNextMessage(); |  1294     handler.HandleNextMessage(); | 
|  1499     EXPECT_SUBSTRING(ref ? "\"type\":\"@String\"" : |  1295     EXPECT_SUBSTRING(ref ? "\"type\":\"@String\"" : | 
|  1500                            "\"type\":\"String\"", |  1296                            "\"type\":\"String\"", | 
|  1501                      handler.msg()); |  1297                      handler.msg()); | 
|  1502     EXPECT_SUBSTRING("foobar", handler.msg()); |  1298     EXPECT_SUBSTRING("foobar", handler.msg()); | 
|  1503   } |  1299   } | 
|  1504   // Expect null when no object is found. |  1300   // Expect null when no object is found. | 
|  1505   service_msg = Eval(lib, "[0, port, ['address', '7'], [], []]"); |  1301   service_msg = Eval(lib, "[0, port, 'getObjectByAddress', " | 
 |  1302                      "['address'], ['7']]"); | 
|  1506   Service::HandleIsolateMessage(isolate, service_msg); |  1303   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1507   handler.HandleNextMessage(); |  1304   handler.HandleNextMessage(); | 
|  1508   // TODO(turnidge): Should this be a ServiceException instead? |  1305   // TODO(turnidge): Should this be a ServiceException instead? | 
|  1509   EXPECT_SUBSTRING("{\"type\":\"null\",\"id\":\"objects\\/null\"," |  1306   EXPECT_SUBSTRING("{\"type\":\"null\",\"id\":\"objects\\/null\"," | 
|  1510                    "\"valueAsString\":\"null\"", |  1307                    "\"valueAsString\":\"null\"", | 
|  1511                handler.msg()); |  1308                handler.msg()); | 
|  1512 } |  1309 } | 
|  1513  |  1310  | 
|  1514  |  1311  | 
|  1515 static const char* alpha_callback( |  1312 static const char* alpha_callback( | 
|  1516     const char* name, |  1313     const char* name, | 
|  1517     const char** arguments, |  | 
|  1518     intptr_t num_arguments, |  | 
|  1519     const char** option_keys, |  1314     const char** option_keys, | 
|  1520     const char** option_values, |  1315     const char** option_values, | 
|  1521     intptr_t num_options, |  1316     intptr_t num_options, | 
|  1522     void* user_data) { |  1317     void* user_data) { | 
|  1523   return strdup("alpha"); |  1318   return strdup("alpha"); | 
|  1524 } |  1319 } | 
|  1525  |  1320  | 
|  1526  |  1321  | 
|  1527 static const char* beta_callback( |  1322 static const char* beta_callback( | 
|  1528     const char* name, |  1323     const char* name, | 
|  1529     const char** arguments, |  | 
|  1530     intptr_t num_arguments, |  | 
|  1531     const char** option_keys, |  1324     const char** option_keys, | 
|  1532     const char** option_values, |  1325     const char** option_values, | 
|  1533     intptr_t num_options, |  1326     intptr_t num_options, | 
|  1534     void* user_data) { |  1327     void* user_data) { | 
|  1535   return strdup("beta"); |  1328   return strdup("beta"); | 
|  1536 } |  1329 } | 
|  1537  |  1330  | 
|  1538  |  1331  | 
|  1539 TEST_CASE(Service_EmbedderRootHandler) { |  1332 TEST_CASE(Service_EmbedderRootHandler) { | 
|  1540   const char* kScript = |  1333   const char* kScript = | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
|  1557  |  1350  | 
|  1558   // Build a mock message handler and wrap it in a dart port. |  1351   // Build a mock message handler and wrap it in a dart port. | 
|  1559   ServiceTestMessageHandler handler; |  1352   ServiceTestMessageHandler handler; | 
|  1560   Dart_Port port_id = PortMap::CreatePort(&handler); |  1353   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|  1561   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  1354   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  1562   EXPECT_VALID(port); |  1355   EXPECT_VALID(port); | 
|  1563   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  1356   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  1564  |  1357  | 
|  1565  |  1358  | 
|  1566   Array& service_msg = Array::Handle(); |  1359   Array& service_msg = Array::Handle(); | 
|  1567   service_msg = Eval(lib, "[0, port, ['alpha'], [], []]"); |  1360   service_msg = Eval(lib, "[0, port, 'alpha', [], []]"); | 
|  1568   Service::HandleRootMessage(service_msg); |  1361   Service::HandleRootMessage(service_msg); | 
|  1569   handler.HandleNextMessage(); |  1362   handler.HandleNextMessage(); | 
|  1570   EXPECT_STREQ("alpha", handler.msg()); |  1363   EXPECT_STREQ("alpha", handler.msg()); | 
|  1571   service_msg = Eval(lib, "[0, port, ['beta'], [], []]"); |  1364   service_msg = Eval(lib, "[0, port, 'beta', [], []]"); | 
|  1572   Service::HandleRootMessage(service_msg); |  1365   Service::HandleRootMessage(service_msg); | 
|  1573   handler.HandleNextMessage(); |  1366   handler.HandleNextMessage(); | 
|  1574   EXPECT_STREQ("beta", handler.msg()); |  1367   EXPECT_STREQ("beta", handler.msg()); | 
|  1575 } |  1368 } | 
|  1576  |  1369  | 
|  1577 TEST_CASE(Service_EmbedderIsolateHandler) { |  1370 TEST_CASE(Service_EmbedderIsolateHandler) { | 
|  1578   const char* kScript = |  1371   const char* kScript = | 
|  1579     "var port;\n"  // Set to our mock port by C++. |  1372     "var port;\n"  // Set to our mock port by C++. | 
|  1580     "\n" |  1373     "\n" | 
|  1581     "var x = 7;\n" |  1374     "var x = 7;\n" | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  1594   EXPECT_VALID(result); |  1387   EXPECT_VALID(result); | 
|  1595  |  1388  | 
|  1596   // Build a mock message handler and wrap it in a dart port. |  1389   // Build a mock message handler and wrap it in a dart port. | 
|  1597   ServiceTestMessageHandler handler; |  1390   ServiceTestMessageHandler handler; | 
|  1598   Dart_Port port_id = PortMap::CreatePort(&handler); |  1391   Dart_Port port_id = PortMap::CreatePort(&handler); | 
|  1599   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |  1392   Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 
|  1600   EXPECT_VALID(port); |  1393   EXPECT_VALID(port); | 
|  1601   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |  1394   EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 
|  1602  |  1395  | 
|  1603   Array& service_msg = Array::Handle(); |  1396   Array& service_msg = Array::Handle(); | 
|  1604   service_msg = Eval(lib, "[0, port, ['alpha'], [], []]"); |  1397   service_msg = Eval(lib, "[0, port, 'alpha', [], []]"); | 
|  1605   Service::HandleIsolateMessage(isolate, service_msg); |  1398   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1606   handler.HandleNextMessage(); |  1399   handler.HandleNextMessage(); | 
|  1607   EXPECT_STREQ("alpha", handler.msg()); |  1400   EXPECT_STREQ("alpha", handler.msg()); | 
|  1608   service_msg = Eval(lib, "[0, port, ['beta'], [], []]"); |  1401   service_msg = Eval(lib, "[0, port, 'beta', [], []]"); | 
|  1609   Service::HandleIsolateMessage(isolate, service_msg); |  1402   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1610   handler.HandleNextMessage(); |  1403   handler.HandleNextMessage(); | 
|  1611   EXPECT_STREQ("beta", handler.msg()); |  1404   EXPECT_STREQ("beta", handler.msg()); | 
|  1612 } |  1405 } | 
|  1613  |  1406  | 
|  1614  |  1407  | 
|  1615 // TODO(zra): Remove when tests are ready to enable. |  1408 // TODO(zra): Remove when tests are ready to enable. | 
|  1616 #if !defined(TARGET_ARCH_ARM64) |  1409 #if !defined(TARGET_ARCH_ARM64) | 
|  1617  |  1410  | 
|  1618 TEST_CASE(Service_Profile) { |  1411 TEST_CASE(Service_Profile) { | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1656       Eval(lib, "[0, port, 'getCpuProfile', ['tags'], ['Bogus']]"); |  1449       Eval(lib, "[0, port, 'getCpuProfile', ['tags'], ['Bogus']]"); | 
|  1657   Service::HandleIsolateMessage(isolate, service_msg); |  1450   Service::HandleIsolateMessage(isolate, service_msg); | 
|  1658   handler.HandleNextMessage(); |  1451   handler.HandleNextMessage(); | 
|  1659   // Expect error. |  1452   // Expect error. | 
|  1660   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); |  1453   EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 
|  1661 } |  1454 } | 
|  1662  |  1455  | 
|  1663 #endif  // !defined(TARGET_ARCH_ARM64) |  1456 #endif  // !defined(TARGET_ARCH_ARM64) | 
|  1664  |  1457  | 
|  1665 }  // namespace dart |  1458 }  // namespace dart | 
| OLD | NEW |