| 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 |