Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(471)

Side by Side Diff: runtime/vm/service_test.cc

Issue 897193002: Finish moving service protocol to json rpc. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: code review Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/service/vmservice.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/service/vmservice.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698