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 |