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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 char* buffer = isolate->current_zone()->Alloc<char>(len + 1); | 118 char* buffer = isolate->current_zone()->Alloc<char>(len + 1); |
119 va_list args2; | 119 va_list args2; |
120 va_start(args2, fmt); | 120 va_start(args2, fmt); |
121 OS::VSNPrint(buffer, (len + 1), fmt, args2); | 121 OS::VSNPrint(buffer, (len + 1), fmt, args2); |
122 va_end(args2); | 122 va_end(args2); |
123 | 123 |
124 return Eval(lib, buffer); | 124 return Eval(lib, buffer); |
125 } | 125 } |
126 | 126 |
127 | 127 |
128 // Search for the formatted string in buff. | 128 // Search for the formatted string in buffer. |
129 // | 129 // |
130 // TODO(turnidge): This function obscures the line number of failing | 130 // TODO(turnidge): This function obscures the line number of failing |
131 // EXPECTs. Rework this. | 131 // EXPECTs. Rework this. |
132 static void ExpectSubstringF(const char* buff, const char* fmt, ...) { | 132 static void ExpectSubstringF(const char* buff, const char* fmt, ...) { |
133 Isolate* isolate = Isolate::Current(); | 133 Isolate* isolate = Isolate::Current(); |
134 | 134 |
135 va_list args; | 135 va_list args; |
136 va_start(args, fmt); | 136 va_start(args, fmt); |
137 intptr_t len = OS::VSNPrint(NULL, 0, fmt, args); | 137 intptr_t len = OS::VSNPrint(NULL, 0, fmt, args); |
138 va_end(args); | 138 va_end(args); |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 TEST_CASE(Service_DebugBreakpoints) { | 257 TEST_CASE(Service_DebugBreakpoints) { |
258 const char* kScript = | 258 const char* kScript = |
259 "var port;\n" // Set to our mock port by C++. | 259 "var port;\n" // Set to our mock port by C++. |
260 "\n" | 260 "\n" |
261 "main() {\n" // We set breakpoint here. | 261 "main() {\n" // We set breakpoint here. |
262 "}"; | 262 "}"; |
263 | 263 |
264 Isolate* isolate = Isolate::Current(); | 264 Isolate* isolate = Isolate::Current(); |
265 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); | 265 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
266 EXPECT_VALID(lib); | 266 EXPECT_VALID(lib); |
| 267 Library& vmlib = Library::Handle(); |
| 268 vmlib ^= Api::UnwrapHandle(lib); |
| 269 EXPECT(!vmlib.IsNull()); |
267 | 270 |
268 // Build a mock message handler and wrap it in a dart port. | 271 // Build a mock message handler and wrap it in a dart port. |
269 ServiceTestMessageHandler handler; | 272 ServiceTestMessageHandler handler; |
270 Dart_Port port_id = PortMap::CreatePort(&handler); | 273 Dart_Port port_id = PortMap::CreatePort(&handler); |
271 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 274 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
272 EXPECT_VALID(port); | 275 EXPECT_VALID(port); |
273 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 276 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
274 | 277 |
275 Array& service_msg = Array::Handle(); | 278 Array& service_msg = Array::Handle(); |
276 | 279 |
277 // Add a breakpoint. | 280 // Add a breakpoint. |
278 const String& url = String::Handle(String::New(TestCase::url())); | 281 service_msg = EvalF(lib, |
279 isolate->debugger()->SetBreakpointAtLine(url, 3); | 282 "[0, port, ['libraries', '%" Pd "', " |
| 283 "'scripts', 'test-lib', 'setBreakpoint'], " |
| 284 "['line'], ['3']]", |
| 285 vmlib.index()); |
| 286 Service::HandleIsolateMessage(isolate, service_msg); |
| 287 handler.HandleNextMessage(); |
| 288 ExpectSubstringF( |
| 289 handler.msg(), |
| 290 "{\"type\":\"Breakpoint\",\"id\":\"debug\\/breakpoints\\/1\"," |
| 291 "\"breakpointNumber\":1,\"enabled\":true,\"resolved\":false," |
| 292 "\"location\":{\"type\":\"Location\"," |
| 293 "\"script\":{\"type\":\"@Script\"," |
| 294 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," |
| 295 "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"}," |
| 296 "\"tokenPos\":5}}", |
| 297 vmlib.index()); |
| 298 |
| 299 // Get the breakpoint list. |
| 300 service_msg = Eval(lib, "[0, port, ['debug', 'breakpoints'], [], []]"); |
| 301 Service::HandleIsolateMessage(isolate, service_msg); |
| 302 handler.HandleNextMessage(); |
| 303 ExpectSubstringF( |
| 304 handler.msg(), |
| 305 "{\"type\":\"BreakpointList\",\"id\":\"debug\\/breakpoints\"," |
| 306 "\"breakpoints\":[" |
| 307 "{\"type\":\"Breakpoint\",\"id\":\"debug\\/breakpoints\\/1\"," |
| 308 "\"breakpointNumber\":1,\"enabled\":true,\"resolved\":false," |
| 309 "\"location\":{\"type\":\"Location\"," |
| 310 "\"script\":{\"type\":\"@Script\"," |
| 311 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," |
| 312 "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"}," |
| 313 "\"tokenPos\":5}}]}", |
| 314 vmlib.index()); |
| 315 |
| 316 // Lookup individual breakpoint. |
| 317 service_msg = Eval(lib, "[0, port, ['debug', 'breakpoints', '1'], [], []]"); |
| 318 Service::HandleIsolateMessage(isolate, service_msg); |
| 319 handler.HandleNextMessage(); |
| 320 ExpectSubstringF( |
| 321 handler.msg(), |
| 322 "{\"type\":\"Breakpoint\",\"id\":\"debug\\/breakpoints\\/1\"," |
| 323 "\"breakpointNumber\":1,\"enabled\":true,\"resolved\":false," |
| 324 "\"location\":{\"type\":\"Location\"," |
| 325 "\"script\":{\"type\":\"@Script\"," |
| 326 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," |
| 327 "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"}," |
| 328 "\"tokenPos\":5}}", |
| 329 vmlib.index()); |
| 330 |
| 331 // Unrecognized breakpoint subcommand. |
| 332 service_msg = |
| 333 Eval(lib, "[0, port, ['debug', 'breakpoints', '1', 'green'], [], []]"); |
| 334 Service::HandleIsolateMessage(isolate, service_msg); |
| 335 handler.HandleNextMessage(); |
| 336 EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\"," |
| 337 "\"message\":\"Unrecognized subcommand: green\"," |
| 338 "\"request\":{\"arguments\":[\"debug\",\"breakpoints\"," |
| 339 "\"1\",\"green\"]," |
| 340 "\"option_keys\":[],\"option_values\":[]}}", |
| 341 handler.msg()); |
| 342 |
| 343 // Clear breakpoint. |
| 344 service_msg = |
| 345 Eval(lib, "[0, port, ['debug', 'breakpoints', '1', 'clear'], [], []]"); |
| 346 Service::HandleIsolateMessage(isolate, service_msg); |
| 347 handler.HandleNextMessage(); |
| 348 EXPECT_STREQ("{\"type\":\"Success\",\"id\":\"\"}", |
| 349 handler.msg()); |
280 | 350 |
281 // Get the breakpoint list. | 351 // Get the breakpoint list. |
282 service_msg = Eval(lib, "[0, port, ['debug', 'breakpoints'], [], []]"); | 352 service_msg = Eval(lib, "[0, port, ['debug', 'breakpoints'], [], []]"); |
283 Service::HandleIsolateMessage(isolate, service_msg); | 353 Service::HandleIsolateMessage(isolate, service_msg); |
284 handler.HandleNextMessage(); | 354 handler.HandleNextMessage(); |
285 EXPECT_STREQ( | 355 EXPECT_STREQ( |
286 "{\"type\":\"BreakpointList\",\"breakpoints\":[{" | 356 "{\"type\":\"BreakpointList\",\"id\":\"debug\\/breakpoints\"," |
287 "\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true," | 357 "\"breakpoints\":[]}", |
288 "\"resolved\":false," | |
289 "\"location\":{\"type\":\"Location\"," | |
290 "\"script\":\"test-lib\",\"tokenPos\":5}}]}", | |
291 handler.msg()); | |
292 | |
293 // Individual breakpoint. | |
294 service_msg = Eval(lib, "[0, port, ['debug', 'breakpoints', '1'], [], []]"); | |
295 Service::HandleIsolateMessage(isolate, service_msg); | |
296 handler.HandleNextMessage(); | |
297 EXPECT_STREQ( | |
298 "{\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true," | |
299 "\"resolved\":false," | |
300 "\"location\":{\"type\":\"Location\"," | |
301 "\"script\":\"test-lib\",\"tokenPos\":5}}", | |
302 handler.msg()); | 358 handler.msg()); |
303 | 359 |
304 // Missing sub-command. | 360 // Missing sub-command. |
305 service_msg = Eval(lib, "[0, port, ['debug'], [], []]"); | 361 service_msg = Eval(lib, "[0, port, ['debug'], [], []]"); |
306 Service::HandleIsolateMessage(isolate, service_msg); | 362 Service::HandleIsolateMessage(isolate, service_msg); |
307 handler.HandleNextMessage(); | 363 handler.HandleNextMessage(); |
308 EXPECT_STREQ( | 364 EXPECT_STREQ( |
309 "{\"type\":\"Error\",\"id\":\"\"," | 365 "{\"type\":\"Error\",\"id\":\"\"," |
310 "\"message\":\"Must specify a subcommand\"," | 366 "\"message\":\"Must specify a subcommand\"," |
311 "\"request\":{\"arguments\":[\"debug\"],\"option_keys\":[]," | 367 "\"request\":{\"arguments\":[\"debug\"],\"option_keys\":[]," |
312 "\"option_values\":[]}}", | 368 "\"option_values\":[]}}", |
313 handler.msg()); | 369 handler.msg()); |
314 | 370 |
315 // Unrecognized breakpoint. | 371 // Unrecognized breakpoint. |
316 service_msg = Eval(lib, | 372 service_msg = Eval(lib, |
317 "[0, port, ['debug', 'breakpoints', '1111'], [], []]"); | 373 "[0, port, ['debug', 'breakpoints', '1111'], [], []]"); |
318 Service::HandleIsolateMessage(isolate, service_msg); | 374 Service::HandleIsolateMessage(isolate, service_msg); |
319 handler.HandleNextMessage(); | 375 handler.HandleNextMessage(); |
320 EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\"," | 376 EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\"," |
321 "\"message\":\"Unrecognized breakpoint id 1111\"," | 377 "\"message\":\"Unrecognized breakpoint id: 1111\"," |
322 "\"request\":{" | 378 "\"request\":{" |
323 "\"arguments\":[\"debug\",\"breakpoints\",\"1111\"]," | 379 "\"arguments\":[\"debug\",\"breakpoints\",\"1111\"]," |
324 "\"option_keys\":[],\"option_values\":[]}}", | 380 "\"option_keys\":[],\"option_values\":[]}}", |
325 handler.msg()); | 381 handler.msg()); |
326 | 382 |
327 // Command too long. | |
328 service_msg = | |
329 Eval(lib, "[0, port, ['debug', 'breakpoints', '1111', 'green'], [], []]"); | |
330 Service::HandleIsolateMessage(isolate, service_msg); | |
331 handler.HandleNextMessage(); | |
332 EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\"," | |
333 "\"message\":\"Command too long\"," | |
334 "\"request\":{\"arguments\":[\"debug\",\"breakpoints\"," | |
335 "\"1111\",\"green\"]," | |
336 "\"option_keys\":[],\"option_values\":[]}}", | |
337 handler.msg()); | |
338 | |
339 // Unrecognized subcommand. | 383 // Unrecognized subcommand. |
340 service_msg = Eval(lib, "[0, port, ['debug', 'nosferatu'], [], []]"); | 384 service_msg = Eval(lib, "[0, port, ['debug', 'nosferatu'], [], []]"); |
341 Service::HandleIsolateMessage(isolate, service_msg); | 385 Service::HandleIsolateMessage(isolate, service_msg); |
342 handler.HandleNextMessage(); | 386 handler.HandleNextMessage(); |
343 EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\"," | 387 EXPECT_STREQ("{\"type\":\"Error\",\"id\":\"\"," |
344 "\"message\":\"Unrecognized subcommand 'nosferatu'\"," | 388 "\"message\":\"Unrecognized subcommand 'nosferatu'\"," |
345 "\"request\":{\"arguments\":[\"debug\",\"nosferatu\"]," | 389 "\"request\":{\"arguments\":[\"debug\",\"nosferatu\"]," |
346 "\"option_keys\":[],\"option_values\":[]}}", | 390 "\"option_keys\":[],\"option_values\":[]}}", |
347 handler.msg()); | 391 handler.msg()); |
348 } | 392 } |
349 | 393 |
350 | 394 |
| 395 // Globals used to communicate with HandlerPausedEvent. |
| 396 static intptr_t pause_line_number = 0; |
| 397 static Dart_Handle saved_lib; |
| 398 static ServiceTestMessageHandler* saved_handler = NULL; |
| 399 |
| 400 static void HandlePausedEvent(Dart_IsolateId isolate_id, |
| 401 intptr_t bp_id, |
| 402 const Dart_CodeLocation& loc) { |
| 403 Isolate* isolate = Isolate::Current(); |
| 404 Debugger* debugger = isolate->debugger(); |
| 405 |
| 406 // The debugger knows that it is paused, and why. |
| 407 EXPECT(debugger->IsPaused()); |
| 408 const DebuggerEvent* event = debugger->PauseEvent(); |
| 409 EXPECT(event != NULL); |
| 410 EXPECT(event->type() == DebuggerEvent::kBreakpointReached); |
| 411 |
| 412 // Save the last line number seen by this handler. |
| 413 pause_line_number = event->top_frame()->LineNumber(); |
| 414 |
| 415 // Single step |
| 416 Array& service_msg = Array::Handle(); |
| 417 service_msg = Eval(saved_lib, |
| 418 "[0, port, ['debug', 'resume'], " |
| 419 "['step'], ['into']]"); |
| 420 Service::HandleIsolateMessage(isolate, service_msg); |
| 421 saved_handler->HandleNextMessage(); |
| 422 EXPECT_STREQ("{\"type\":\"Success\",\"id\":\"\"}", |
| 423 saved_handler->msg()); |
| 424 } |
| 425 |
| 426 |
| 427 TEST_CASE(Service_Stepping) { |
| 428 const char* kScript = |
| 429 "var port;\n" // Set to our mock port by C++. |
| 430 "var value = 0;\n" |
| 431 "\n" |
| 432 "main() {\n" // We set breakpoint here. |
| 433 " value++;\n" |
| 434 " value++;\n" |
| 435 " value++;\n" |
| 436 "}"; // We step up to here. |
| 437 |
| 438 Isolate* isolate = Isolate::Current(); |
| 439 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
| 440 EXPECT_VALID(lib); |
| 441 Library& vmlib = Library::Handle(); |
| 442 vmlib ^= Api::UnwrapHandle(lib); |
| 443 EXPECT(!vmlib.IsNull()); |
| 444 saved_lib = lib; |
| 445 |
| 446 // Build a mock message handler and wrap it in a dart port. |
| 447 ServiceTestMessageHandler handler; |
| 448 saved_handler = &handler; |
| 449 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 450 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
| 451 EXPECT_VALID(port); |
| 452 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 453 |
| 454 Array& service_msg = Array::Handle(); |
| 455 |
| 456 // Add a breakpoint. |
| 457 service_msg = EvalF(lib, |
| 458 "[0, port, ['libraries', '%" Pd "', " |
| 459 "'scripts', 'test-lib', 'setBreakpoint'], " |
| 460 "['line'], ['4']]", |
| 461 vmlib.index()); |
| 462 Service::HandleIsolateMessage(isolate, service_msg); |
| 463 handler.HandleNextMessage(); |
| 464 ExpectSubstringF( |
| 465 handler.msg(), |
| 466 "{\"type\":\"Breakpoint\",\"id\":\"debug\\/breakpoints\\/1\"," |
| 467 "\"breakpointNumber\":1,\"enabled\":true,\"resolved\":false," |
| 468 "\"location\":{\"type\":\"Location\"," |
| 469 "\"script\":{\"type\":\"@Script\"," |
| 470 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," |
| 471 "\"name\":\"test-lib\",\"user_name\":\"test-lib\",\"kind\":\"script\"}," |
| 472 "\"tokenPos\":11}}", |
| 473 vmlib.index()); |
| 474 |
| 475 pause_line_number = -1; |
| 476 Dart_SetPausedEventHandler(HandlePausedEvent); |
| 477 |
| 478 // Run the program. |
| 479 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
| 480 EXPECT_VALID(result); |
| 481 |
| 482 // We were able to step to the last line in main. |
| 483 EXPECT_EQ(8, pause_line_number); |
| 484 } |
| 485 |
| 486 |
351 TEST_CASE(Service_Objects) { | 487 TEST_CASE(Service_Objects) { |
352 // TODO(turnidge): Extend this test to cover a non-trivial stack trace. | 488 // TODO(turnidge): Extend this test to cover a non-trivial stack trace. |
353 const char* kScript = | 489 const char* kScript = |
354 "var port;\n" // Set to our mock port by C++. | 490 "var port;\n" // Set to our mock port by C++. |
355 "var validId;\n" // Set to a valid object id by C++. | 491 "var validId;\n" // Set to a valid object id by C++. |
356 "\n" | 492 "\n" |
357 "main() {\n" | 493 "main() {\n" |
358 "}"; | 494 "}"; |
359 | 495 |
360 Isolate* isolate = Isolate::Current(); | 496 Isolate* isolate = Isolate::Current(); |
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 " String f0;\n" | 754 " String f0;\n" |
619 " String f1;\n" | 755 " String f1;\n" |
620 "}\n" | 756 "}\n" |
621 "Foo foo;\n" | 757 "Foo foo;\n" |
622 "List<String> lst;\n" | 758 "List<String> lst;\n" |
623 "main() {\n" | 759 "main() {\n" |
624 " foo = new Foo();\n" | 760 " foo = new Foo();\n" |
625 " lst = new List<String>(100);\n" | 761 " lst = new List<String>(100);\n" |
626 "}\n"; | 762 "}\n"; |
627 Isolate* isolate = Isolate::Current(); | 763 Isolate* isolate = Isolate::Current(); |
628 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 764 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
629 EXPECT_VALID(h_lib); | 765 EXPECT_VALID(lib); |
630 Library& lib = Library::Handle(); | 766 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
631 lib ^= Api::UnwrapHandle(h_lib); | |
632 EXPECT(!lib.IsNull()); | |
633 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); | |
634 EXPECT_VALID(result); | 767 EXPECT_VALID(result); |
635 const Class& class_foo = Class::Handle(GetClass(lib, "Foo")); | 768 Library& vmlib = Library::Handle(); |
| 769 vmlib ^= Api::UnwrapHandle(lib); |
| 770 EXPECT(!vmlib.IsNull()); |
| 771 const Class& class_foo = Class::Handle(GetClass(vmlib, "Foo")); |
636 EXPECT(!class_foo.IsNull()); | 772 EXPECT(!class_foo.IsNull()); |
637 Dart_Handle foo = Dart_GetField(h_lib, NewString("foo")); | 773 Dart_Handle foo = Dart_GetField(lib, NewString("foo")); |
638 Dart_Handle lst = Dart_GetField(h_lib, NewString("lst")); | 774 Dart_Handle lst = Dart_GetField(lib, NewString("lst")); |
639 const intptr_t kElemIndex = 42; | 775 const intptr_t kElemIndex = 42; |
640 { | 776 { |
641 Dart_EnterScope(); | 777 Dart_EnterScope(); |
642 ObjectIdRing* ring = isolate->object_id_ring(); | 778 ObjectIdRing* ring = isolate->object_id_ring(); |
643 { | 779 { |
644 const String& foo0 = String::Handle(String::New("foo0", Heap::kOld)); | 780 const String& foo0 = String::Handle(String::New("foo0", Heap::kOld)); |
645 Dart_Handle h_foo0 = Api::NewHandle(isolate, foo0.raw()); | 781 Dart_Handle h_foo0 = Api::NewHandle(isolate, foo0.raw()); |
646 EXPECT_VALID(Dart_SetField(foo, NewString("f0"), h_foo0)); | 782 EXPECT_VALID(Dart_SetField(foo, NewString("f0"), h_foo0)); |
647 Dart_Handle id0 = Dart_NewInteger(ring->GetIdForObject(foo0.raw())); | 783 Dart_Handle id0 = Dart_NewInteger(ring->GetIdForObject(foo0.raw())); |
648 EXPECT_VALID(id0); | 784 EXPECT_VALID(id0); |
649 EXPECT_VALID(Dart_SetField(h_lib, NewString("id0"), id0)); | 785 EXPECT_VALID(Dart_SetField(lib, NewString("id0"), id0)); |
650 } | 786 } |
651 { | 787 { |
652 const String& foo1 = String::Handle(String::New("foo1", Heap::kOld)); | 788 const String& foo1 = String::Handle(String::New("foo1", Heap::kOld)); |
653 Dart_Handle h_foo1 = Api::NewHandle(isolate, foo1.raw()); | 789 Dart_Handle h_foo1 = Api::NewHandle(isolate, foo1.raw()); |
654 EXPECT_VALID(Dart_SetField(foo, NewString("f1"), h_foo1)); | 790 EXPECT_VALID(Dart_SetField(foo, NewString("f1"), h_foo1)); |
655 Dart_Handle id1 = Dart_NewInteger(ring->GetIdForObject(foo1.raw())); | 791 Dart_Handle id1 = Dart_NewInteger(ring->GetIdForObject(foo1.raw())); |
656 EXPECT_VALID(id1); | 792 EXPECT_VALID(id1); |
657 EXPECT_VALID(Dart_SetField(h_lib, NewString("id1"), id1)); | 793 EXPECT_VALID(Dart_SetField(lib, NewString("id1"), id1)); |
658 } | 794 } |
659 { | 795 { |
660 const String& elem = String::Handle(String::New("elem", Heap::kOld)); | 796 const String& elem = String::Handle(String::New("elem", Heap::kOld)); |
661 Dart_Handle h_elem = Api::NewHandle(isolate, elem.raw()); | 797 Dart_Handle h_elem = Api::NewHandle(isolate, elem.raw()); |
662 EXPECT_VALID(Dart_ListSetAt(lst, kElemIndex, h_elem)); | 798 EXPECT_VALID(Dart_ListSetAt(lst, kElemIndex, h_elem)); |
663 Dart_Handle idElem = Dart_NewInteger(ring->GetIdForObject(elem.raw())); | 799 Dart_Handle idElem = Dart_NewInteger(ring->GetIdForObject(elem.raw())); |
664 EXPECT_VALID(idElem); | 800 EXPECT_VALID(idElem); |
665 EXPECT_VALID(Dart_SetField(h_lib, NewString("idElem"), idElem)); | 801 EXPECT_VALID(Dart_SetField(lib, NewString("idElem"), idElem)); |
666 } | 802 } |
667 Dart_ExitScope(); | 803 Dart_ExitScope(); |
668 } | 804 } |
669 | 805 |
670 // Build a mock message handler and wrap it in a dart port. | 806 // Build a mock message handler and wrap it in a dart port. |
671 ServiceTestMessageHandler handler; | 807 ServiceTestMessageHandler handler; |
672 Dart_Port port_id = PortMap::CreatePort(&handler); | 808 Dart_Port port_id = PortMap::CreatePort(&handler); |
673 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 809 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
674 EXPECT_VALID(port); | 810 EXPECT_VALID(port); |
675 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 811 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
676 Array& service_msg = Array::Handle(); | 812 Array& service_msg = Array::Handle(); |
677 | 813 |
678 // Retaining path to 'foo0', limit 2. | 814 // Retaining path to 'foo0', limit 2. |
679 service_msg = Eval( | 815 service_msg = Eval( |
680 h_lib, | 816 lib, |
681 "[0, port, ['objects', '$id0', 'retaining_path'], ['limit'], ['2']]"); | 817 "[0, port, ['objects', '$id0', 'retaining_path'], ['limit'], ['2']]"); |
682 Service::HandleIsolateMessage(isolate, service_msg); | 818 Service::HandleIsolateMessage(isolate, service_msg); |
683 handler.HandleNextMessage(); | 819 handler.HandleNextMessage(); |
684 ExpectSubstringF( | 820 ExpectSubstringF( |
685 handler.msg(), | 821 handler.msg(), |
686 "{\"type\":\"RetainingPath\",\"id\":\"retaining_path\",\"length\":2," | 822 "{\"type\":\"RetainingPath\",\"id\":\"retaining_path\",\"length\":2," |
687 "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\""); | 823 "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\""); |
688 ExpectSubstringF(handler.msg(), "\"parentField\":{\"type\":\"@Field\""); | 824 ExpectSubstringF(handler.msg(), "\"parentField\":{\"type\":\"@Field\""); |
689 ExpectSubstringF(handler.msg(), "\"name\":\"f0\""); | 825 ExpectSubstringF(handler.msg(), "\"name\":\"f0\""); |
690 ExpectSubstringF(handler.msg(), | 826 ExpectSubstringF(handler.msg(), |
691 "{\"index\":1,\"value\":{\"type\":\"@Instance\""); | 827 "{\"index\":1,\"value\":{\"type\":\"@Instance\""); |
692 | 828 |
693 // Retaining path to 'foo1', limit 2. | 829 // Retaining path to 'foo1', limit 2. |
694 service_msg = Eval( | 830 service_msg = Eval( |
695 h_lib, | 831 lib, |
696 "[0, port, ['objects', '$id1', 'retaining_path'], ['limit'], ['2']]"); | 832 "[0, port, ['objects', '$id1', 'retaining_path'], ['limit'], ['2']]"); |
697 Service::HandleIsolateMessage(isolate, service_msg); | 833 Service::HandleIsolateMessage(isolate, service_msg); |
698 handler.HandleNextMessage(); | 834 handler.HandleNextMessage(); |
699 ExpectSubstringF( | 835 ExpectSubstringF( |
700 handler.msg(), | 836 handler.msg(), |
701 "{\"type\":\"RetainingPath\",\"id\":\"retaining_path\",\"length\":2," | 837 "{\"type\":\"RetainingPath\",\"id\":\"retaining_path\",\"length\":2," |
702 "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\""); | 838 "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\""); |
703 ExpectSubstringF(handler.msg(), "\"parentField\":{\"type\":\"@Field\""); | 839 ExpectSubstringF(handler.msg(), "\"parentField\":{\"type\":\"@Field\""); |
704 ExpectSubstringF(handler.msg(), "\"name\":\"f1\""); | 840 ExpectSubstringF(handler.msg(), "\"name\":\"f1\""); |
705 ExpectSubstringF(handler.msg(), | 841 ExpectSubstringF(handler.msg(), |
706 "{\"index\":1,\"value\":{\"type\":\"@Instance\""); | 842 "{\"index\":1,\"value\":{\"type\":\"@Instance\""); |
707 | 843 |
708 // Retaining path to 'elem', limit 2. | 844 // Retaining path to 'elem', limit 2. |
709 service_msg = Eval( | 845 service_msg = Eval( |
710 h_lib, | 846 lib, |
711 "[0, port, ['objects', '$idElem', 'retaining_path'], ['limit'], ['2']]"); | 847 "[0, port, ['objects', '$idElem', 'retaining_path'], ['limit'], ['2']]"); |
712 Service::HandleIsolateMessage(isolate, service_msg); | 848 Service::HandleIsolateMessage(isolate, service_msg); |
713 handler.HandleNextMessage(); | 849 handler.HandleNextMessage(); |
714 ExpectSubstringF( | 850 ExpectSubstringF( |
715 handler.msg(), | 851 handler.msg(), |
716 "{\"type\":\"RetainingPath\",\"id\":\"retaining_path\",\"length\":2," | 852 "{\"type\":\"RetainingPath\",\"id\":\"retaining_path\",\"length\":2," |
717 "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\""); | 853 "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\""); |
718 ExpectSubstringF(handler.msg(), "\"parentListIndex\":%" Pd, kElemIndex); | 854 ExpectSubstringF(handler.msg(), "\"parentListIndex\":%" Pd, kElemIndex); |
719 ExpectSubstringF(handler.msg(), | 855 ExpectSubstringF(handler.msg(), |
720 "{\"index\":1,\"value\":{\"type\":\"@Array\""); | 856 "{\"index\":1,\"value\":{\"type\":\"@Array\""); |
721 } | 857 } |
722 | 858 |
723 | 859 |
724 TEST_CASE(Service_Libraries) { | 860 TEST_CASE(Service_Libraries) { |
725 const char* kScript = | 861 const char* kScript = |
726 "var port;\n" // Set to our mock port by C++. | 862 "var port;\n" // Set to our mock port by C++. |
727 "var libVar = 54321;\n" | 863 "var libVar = 54321;\n" |
728 "\n" | 864 "\n" |
729 "main() {\n" | 865 "main() {\n" |
730 "}"; | 866 "}"; |
731 | 867 |
732 Isolate* isolate = Isolate::Current(); | 868 Isolate* isolate = Isolate::Current(); |
733 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 869 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
734 EXPECT_VALID(h_lib); | 870 EXPECT_VALID(lib); |
735 Library& lib = Library::Handle(); | 871 Library& vmlib = Library::Handle(); |
736 lib ^= Api::UnwrapHandle(h_lib); | 872 vmlib ^= Api::UnwrapHandle(lib); |
737 EXPECT(!lib.IsNull()); | 873 EXPECT(!vmlib.IsNull()); |
738 | |
739 // Find the current library. | |
740 intptr_t lib_id = -1; | |
741 const GrowableObjectArray& libs = | |
742 GrowableObjectArray::Handle(isolate->object_store()->libraries()); | |
743 for (intptr_t i = 0; i < libs.Length(); i++) { | |
744 if (libs.At(i) == lib.raw()) { | |
745 lib_id = i; | |
746 } | |
747 } | |
748 ASSERT(lib_id > 0); | |
749 | 874 |
750 // Build a mock message handler and wrap it in a dart port. | 875 // Build a mock message handler and wrap it in a dart port. |
751 ServiceTestMessageHandler handler; | 876 ServiceTestMessageHandler handler; |
752 Dart_Port port_id = PortMap::CreatePort(&handler); | 877 Dart_Port port_id = PortMap::CreatePort(&handler); |
753 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 878 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
754 EXPECT_VALID(port); | 879 EXPECT_VALID(port); |
755 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 880 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
756 | 881 |
757 Array& service_msg = Array::Handle(); | 882 Array& service_msg = Array::Handle(); |
758 | 883 |
759 // Request library. | 884 // Request library. |
760 service_msg = EvalF(h_lib, | 885 service_msg = EvalF(lib, |
761 "[0, port, ['libraries', '%" Pd "'], [], []]", lib_id); | 886 "[0, port, ['libraries', '%" Pd "'], [], []]", |
| 887 vmlib.index()); |
762 Service::HandleIsolateMessage(isolate, service_msg); | 888 Service::HandleIsolateMessage(isolate, service_msg); |
763 handler.HandleNextMessage(); | 889 handler.HandleNextMessage(); |
764 EXPECT_SUBSTRING("\"type\":\"Library\"", handler.msg()); | 890 EXPECT_SUBSTRING("\"type\":\"Library\"", handler.msg()); |
765 EXPECT_SUBSTRING("\"url\":\"test-lib\"", handler.msg()); | 891 EXPECT_SUBSTRING("\"url\":\"test-lib\"", handler.msg()); |
766 | 892 |
767 // Evaluate an expression from a library. | 893 // Evaluate an expression from a library. |
768 service_msg = EvalF(h_lib, | 894 service_msg = EvalF(lib, |
769 "[0, port, ['libraries', '%" Pd "', 'eval'], " | 895 "[0, port, ['libraries', '%" Pd "', 'eval'], " |
770 "['expr'], ['libVar - 1']]", lib_id); | 896 "['expr'], ['libVar - 1']]", |
| 897 vmlib.index()); |
771 Service::HandleIsolateMessage(isolate, service_msg); | 898 Service::HandleIsolateMessage(isolate, service_msg); |
772 handler.HandleNextMessage(); | 899 handler.HandleNextMessage(); |
773 handler.filterMsg("name"); | 900 handler.filterMsg("name"); |
774 EXPECT_STREQ( | 901 EXPECT_STREQ( |
775 "{\"type\":\"@Smi\"," | 902 "{\"type\":\"@Smi\"," |
776 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," | 903 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," |
777 "\"user_name\":\"_Smi\"},\"id\":\"objects\\/int-54320\"," | 904 "\"user_name\":\"_Smi\"},\"id\":\"objects\\/int-54320\"," |
778 "\"valueAsString\":\"54320\"}", | 905 "\"valueAsString\":\"54320\"}", |
779 handler.msg()); | 906 handler.msg()); |
780 } | 907 } |
(...skipping 14 matching lines...) Expand all Loading... |
795 "}\n" | 922 "}\n" |
796 "class B { static int i = 42; }\n" | 923 "class B { static int i = 42; }\n" |
797 "main() {\n" | 924 "main() {\n" |
798 " var z = new A();\n" | 925 " var z = new A();\n" |
799 " var x = z.c();\n" | 926 " var x = z.c();\n" |
800 " x();\n" | 927 " x();\n" |
801 " ++B.i;\n" | 928 " ++B.i;\n" |
802 "}"; | 929 "}"; |
803 | 930 |
804 Isolate* isolate = Isolate::Current(); | 931 Isolate* isolate = Isolate::Current(); |
805 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 932 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
806 EXPECT_VALID(h_lib); | 933 EXPECT_VALID(lib); |
807 Library& lib = Library::Handle(); | 934 Library& vmlib = Library::Handle(); |
808 lib ^= Api::UnwrapHandle(h_lib); | 935 vmlib ^= Api::UnwrapHandle(lib); |
809 EXPECT(!lib.IsNull()); | 936 EXPECT(!vmlib.IsNull()); |
810 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); | 937 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
811 EXPECT_VALID(result); | 938 EXPECT_VALID(result); |
812 const Class& class_a = Class::Handle(GetClass(lib, "A")); | 939 const Class& class_a = Class::Handle(GetClass(vmlib, "A")); |
813 EXPECT(!class_a.IsNull()); | 940 EXPECT(!class_a.IsNull()); |
814 intptr_t cid = class_a.id(); | 941 intptr_t cid = class_a.id(); |
815 | 942 |
816 // Build a mock message handler and wrap it in a dart port. | 943 // Build a mock message handler and wrap it in a dart port. |
817 ServiceTestMessageHandler handler; | 944 ServiceTestMessageHandler handler; |
818 Dart_Port port_id = PortMap::CreatePort(&handler); | 945 Dart_Port port_id = PortMap::CreatePort(&handler); |
819 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 946 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
820 EXPECT_VALID(port); | 947 EXPECT_VALID(port); |
821 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 948 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
822 | 949 |
823 Array& service_msg = Array::Handle(); | 950 Array& service_msg = Array::Handle(); |
824 | 951 |
825 // Request an invalid class id. | 952 // Request an invalid class id. |
826 service_msg = Eval(h_lib, "[0, port, ['classes', '999999'], [], []]"); | 953 service_msg = Eval(lib, "[0, port, ['classes', '999999'], [], []]"); |
827 Service::HandleIsolateMessage(isolate, service_msg); | 954 Service::HandleIsolateMessage(isolate, service_msg); |
828 handler.HandleNextMessage(); | 955 handler.HandleNextMessage(); |
829 EXPECT_STREQ( | 956 EXPECT_STREQ( |
830 "{\"type\":\"Error\",\"id\":\"\"," | 957 "{\"type\":\"Error\",\"id\":\"\"," |
831 "\"message\":\"999999 is not a valid class id.\"," | 958 "\"message\":\"999999 is not a valid class id.\"," |
832 "\"request\":{\"arguments\":[\"classes\",\"999999\"]," | 959 "\"request\":{\"arguments\":[\"classes\",\"999999\"]," |
833 "\"option_keys\":[],\"option_values\":[]}}", handler.msg()); | 960 "\"option_keys\":[],\"option_values\":[]}}", handler.msg()); |
834 | 961 |
835 // Request the class A over the service. | 962 // Request the class A over the service. |
836 service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid); | 963 service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid); |
837 Service::HandleIsolateMessage(isolate, service_msg); | 964 Service::HandleIsolateMessage(isolate, service_msg); |
838 handler.HandleNextMessage(); | 965 handler.HandleNextMessage(); |
839 EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg()); | 966 EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg()); |
840 ExpectSubstringF(handler.msg(), | 967 ExpectSubstringF(handler.msg(), |
841 "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid); | 968 "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid); |
842 ExpectSubstringF(handler.msg(), "\"allocationStats\":"); | 969 ExpectSubstringF(handler.msg(), "\"allocationStats\":"); |
843 ExpectSubstringF(handler.msg(), "\"tokenPos\":"); | 970 ExpectSubstringF(handler.msg(), "\"tokenPos\":"); |
844 ExpectSubstringF(handler.msg(), "\"endTokenPos\":"); | 971 ExpectSubstringF(handler.msg(), "\"endTokenPos\":"); |
845 | 972 |
846 // Evaluate an expression from class A. | 973 // Evaluate an expression from class A. |
847 service_msg = EvalF(h_lib, | 974 service_msg = EvalF(lib, |
848 "[0, port, ['classes', '%" Pd "', 'eval'], " | 975 "[0, port, ['classes', '%" Pd "', 'eval'], " |
849 "['expr'], ['cobra + 100000']]", cid); | 976 "['expr'], ['cobra + 100000']]", cid); |
850 Service::HandleIsolateMessage(isolate, service_msg); | 977 Service::HandleIsolateMessage(isolate, service_msg); |
851 handler.HandleNextMessage(); | 978 handler.HandleNextMessage(); |
852 handler.filterMsg("name"); | 979 handler.filterMsg("name"); |
853 EXPECT_STREQ( | 980 EXPECT_STREQ( |
854 "{\"type\":\"@Smi\"," | 981 "{\"type\":\"@Smi\"," |
855 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," | 982 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," |
856 "\"user_name\":\"_Smi\"}," | 983 "\"user_name\":\"_Smi\"}," |
857 "\"id\":\"objects\\/int-111235\"," | 984 "\"id\":\"objects\\/int-111235\"," |
858 "\"valueAsString\":\"111235\"}", | 985 "\"valueAsString\":\"111235\"}", |
859 handler.msg()); | 986 handler.msg()); |
860 | 987 |
861 // Request function 0 from class A. | 988 // Request function 0 from class A. |
862 service_msg = EvalF(h_lib, | 989 service_msg = EvalF(lib, |
863 "[0, port, ['classes', '%" Pd "', 'functions', '0']," | 990 "[0, port, ['classes', '%" Pd "', 'functions', '0']," |
864 "[], []]", cid); | 991 "[], []]", cid); |
865 Service::HandleIsolateMessage(isolate, service_msg); | 992 Service::HandleIsolateMessage(isolate, service_msg); |
866 handler.HandleNextMessage(); | 993 handler.HandleNextMessage(); |
867 EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg()); | 994 EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg()); |
868 ExpectSubstringF(handler.msg(), | 995 ExpectSubstringF(handler.msg(), |
869 "\"id\":\"classes\\/%" Pd "\\/functions\\/0\"," | 996 "\"id\":\"classes\\/%" Pd "\\/functions\\/0\"," |
870 "\"name\":\"get:a\",", cid); | 997 "\"name\":\"get:a\",", cid); |
871 | 998 |
872 // Request field 0 from class A. | 999 // Request field 0 from class A. |
873 service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'fields', '0']," | 1000 service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'fields', '0']," |
874 "[], []]", cid); | 1001 "[], []]", cid); |
875 Service::HandleIsolateMessage(isolate, service_msg); | 1002 Service::HandleIsolateMessage(isolate, service_msg); |
876 handler.HandleNextMessage(); | 1003 handler.HandleNextMessage(); |
877 EXPECT_SUBSTRING("\"type\":\"Field\"", handler.msg()); | 1004 EXPECT_SUBSTRING("\"type\":\"Field\"", handler.msg()); |
878 ExpectSubstringF(handler.msg(), | 1005 ExpectSubstringF(handler.msg(), |
879 "\"id\":\"classes\\/%" Pd "\\/fields\\/0\"," | 1006 "\"id\":\"classes\\/%" Pd "\\/fields\\/0\"," |
880 "\"name\":\"a\",", cid); | 1007 "\"name\":\"a\",", cid); |
881 | 1008 |
882 // Invalid sub command. | 1009 // Invalid sub command. |
883 service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'huh', '0']," | 1010 service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'huh', '0']," |
884 "[], []]", cid); | 1011 "[], []]", cid); |
885 Service::HandleIsolateMessage(isolate, service_msg); | 1012 Service::HandleIsolateMessage(isolate, service_msg); |
886 handler.HandleNextMessage(); | 1013 handler.HandleNextMessage(); |
887 ExpectSubstringF(handler.msg(), | 1014 ExpectSubstringF(handler.msg(), |
888 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Invalid sub collection huh\"" | 1015 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Invalid sub collection huh\"" |
889 ",\"request\":" | 1016 ",\"request\":" |
890 "{\"arguments\":[\"classes\",\"%" Pd "\",\"huh\",\"0\"],\"option_keys\":[]," | 1017 "{\"arguments\":[\"classes\",\"%" Pd "\",\"huh\",\"0\"],\"option_keys\":[]," |
891 "\"option_values\":[]}}", cid); | 1018 "\"option_values\":[]}}", cid); |
892 | 1019 |
893 // Invalid field request. | 1020 // Invalid field request. |
894 service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'fields', '9']," | 1021 service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'fields', '9']," |
895 "[], []]", cid); | 1022 "[], []]", cid); |
896 Service::HandleIsolateMessage(isolate, service_msg); | 1023 Service::HandleIsolateMessage(isolate, service_msg); |
897 handler.HandleNextMessage(); | 1024 handler.HandleNextMessage(); |
898 ExpectSubstringF(handler.msg(), | 1025 ExpectSubstringF(handler.msg(), |
899 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Field 9 not found\"," | 1026 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Field 9 not found\"," |
900 "\"request\":{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\"]," | 1027 "\"request\":{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\"]," |
901 "\"option_keys\":[],\"option_values\":[]}}", cid); | 1028 "\"option_keys\":[],\"option_values\":[]}}", cid); |
902 | 1029 |
903 // Invalid function request. | 1030 // Invalid function request. |
904 service_msg = EvalF(h_lib, | 1031 service_msg = EvalF(lib, |
905 "[0, port, ['classes', '%" Pd "', 'functions', '9']," | 1032 "[0, port, ['classes', '%" Pd "', 'functions', '9']," |
906 "[], []]", cid); | 1033 "[], []]", cid); |
907 Service::HandleIsolateMessage(isolate, service_msg); | 1034 Service::HandleIsolateMessage(isolate, service_msg); |
908 handler.HandleNextMessage(); | 1035 handler.HandleNextMessage(); |
909 ExpectSubstringF(handler.msg(), | 1036 ExpectSubstringF(handler.msg(), |
910 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Function 9 not found\"," | 1037 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Function 9 not found\"," |
911 "\"request\":{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\"]," | 1038 "\"request\":{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\"]," |
912 "\"option_keys\":[],\"option_values\":[]}}", cid); | 1039 "\"option_keys\":[],\"option_values\":[]}}", cid); |
913 | 1040 |
914 | 1041 |
915 // Invalid field subcommand. | 1042 // Invalid field subcommand. |
916 service_msg = EvalF(h_lib, | 1043 service_msg = EvalF(lib, |
917 "[0, port, ['classes', '%" Pd "', 'fields', '9', 'x']" | 1044 "[0, port, ['classes', '%" Pd "', 'fields', '9', 'x']" |
918 ",[], []]", cid); | 1045 ",[], []]", cid); |
919 Service::HandleIsolateMessage(isolate, service_msg); | 1046 Service::HandleIsolateMessage(isolate, service_msg); |
920 handler.HandleNextMessage(); | 1047 handler.HandleNextMessage(); |
921 ExpectSubstringF(handler.msg(), | 1048 ExpectSubstringF(handler.msg(), |
922 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Command too long\"," | 1049 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Command too long\"," |
923 "\"request\":" | 1050 "\"request\":" |
924 "{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\",\"x\"]," | 1051 "{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\",\"x\"]," |
925 "\"option_keys\":[],\"option_values\":[]}}", cid); | 1052 "\"option_keys\":[],\"option_values\":[]}}", cid); |
926 | 1053 |
927 // Invalid function command. | 1054 // Invalid function command. |
928 service_msg = EvalF(h_lib, | 1055 service_msg = EvalF(lib, |
929 "[0, port, ['classes', '%" Pd "', 'functions', '0'," | 1056 "[0, port, ['classes', '%" Pd "', 'functions', '0'," |
930 "'x', 'y'], [], []]", cid); | 1057 "'x', 'y'], [], []]", cid); |
931 Service::HandleIsolateMessage(isolate, service_msg); | 1058 Service::HandleIsolateMessage(isolate, service_msg); |
932 handler.HandleNextMessage(); | 1059 handler.HandleNextMessage(); |
933 ExpectSubstringF(handler.msg(), | 1060 ExpectSubstringF(handler.msg(), |
934 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Command too long\"," | 1061 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Command too long\"," |
935 "\"request\":" | 1062 "\"request\":" |
936 "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"0\",\"x\",\"y\"]," | 1063 "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"0\",\"x\",\"y\"]," |
937 "\"option_keys\":[],\"option_values\":[]}}", cid); | 1064 "\"option_keys\":[],\"option_values\":[]}}", cid); |
938 | 1065 |
939 // Invalid function subcommand with valid function id. | 1066 // Invalid function subcommand with valid function id. |
940 service_msg = EvalF(h_lib, | 1067 service_msg = EvalF(lib, |
941 "[0, port, ['classes', '%" Pd "', 'functions', '0'," | 1068 "[0, port, ['classes', '%" Pd "', 'functions', '0'," |
942 "'x'], [], []]", cid); | 1069 "'x'], [], []]", cid); |
943 Service::HandleIsolateMessage(isolate, service_msg); | 1070 Service::HandleIsolateMessage(isolate, service_msg); |
944 handler.HandleNextMessage(); | 1071 handler.HandleNextMessage(); |
945 ExpectSubstringF(handler.msg(), | 1072 ExpectSubstringF(handler.msg(), |
946 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Invalid sub collection x\"," | 1073 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Invalid sub collection x\"," |
947 "\"request\":" | 1074 "\"request\":" |
948 "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"0\",\"x\"]," | 1075 "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"0\",\"x\"]," |
949 "\"option_keys\":[],\"option_values\":[]}}", cid); | 1076 "\"option_keys\":[],\"option_values\":[]}}", cid); |
950 | 1077 |
951 // Retained size of all instances of class B. | 1078 // Retained size of all instances of class B. |
952 const Class& class_b = Class::Handle(GetClass(lib, "B")); | 1079 const Class& class_b = Class::Handle(GetClass(vmlib, "B")); |
953 EXPECT(!class_b.IsNull()); | 1080 EXPECT(!class_b.IsNull()); |
954 const Instance& b0 = Instance::Handle(Instance::New(class_b)); | 1081 const Instance& b0 = Instance::Handle(Instance::New(class_b)); |
955 const Instance& b1 = Instance::Handle(Instance::New(class_b)); | 1082 const Instance& b1 = Instance::Handle(Instance::New(class_b)); |
956 service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'retained']," | 1083 service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'retained']," |
957 "[], []]", class_b.id()); | 1084 "[], []]", class_b.id()); |
958 Service::HandleIsolateMessage(isolate, service_msg); | 1085 Service::HandleIsolateMessage(isolate, service_msg); |
959 handler.HandleNextMessage(); | 1086 handler.HandleNextMessage(); |
960 ExpectSubstringF(handler.msg(), | 1087 ExpectSubstringF(handler.msg(), |
961 "\"id\":\"objects\\/int-%" Pd "\"", | 1088 "\"id\":\"objects\\/int-%" Pd "\"", |
962 b0.raw()->Size() + b1.raw()->Size()); | 1089 b0.raw()->Size() + b1.raw()->Size()); |
963 // ... and list the instances of class B. | 1090 // ... and list the instances of class B. |
964 service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'instances']," | 1091 service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'instances']," |
965 "['limit'], ['3']]", class_b.id()); | 1092 "['limit'], ['3']]", class_b.id()); |
966 Service::HandleIsolateMessage(isolate, service_msg); | 1093 Service::HandleIsolateMessage(isolate, service_msg); |
967 handler.HandleNextMessage(); | 1094 handler.HandleNextMessage(); |
968 ExpectSubstringF(handler.msg(), "\"type\":\"InstanceSet\""); | 1095 ExpectSubstringF(handler.msg(), "\"type\":\"InstanceSet\""); |
969 ExpectSubstringF(handler.msg(), "\"totalCount\":2"); | 1096 ExpectSubstringF(handler.msg(), "\"totalCount\":2"); |
970 ExpectSubstringF(handler.msg(), "\"sampleCount\":2"); | 1097 ExpectSubstringF(handler.msg(), "\"sampleCount\":2"); |
971 // TODO(koda): Actually parse the response. | 1098 // TODO(koda): Actually parse the response. |
972 static const intptr_t kInstanceListId = 0; | 1099 static const intptr_t kInstanceListId = 0; |
973 ExpectSubstringF(handler.msg(), "\"id\":\"objects\\/%" Pd "\",\"length\":2", | 1100 ExpectSubstringF(handler.msg(), "\"id\":\"objects\\/%" Pd "\",\"length\":2", |
974 kInstanceListId); | 1101 kInstanceListId); |
975 Array& list = Array::Handle(); | 1102 Array& list = Array::Handle(); |
976 list ^= isolate->object_id_ring()->GetObjectForId(kInstanceListId); | 1103 list ^= isolate->object_id_ring()->GetObjectForId(kInstanceListId); |
977 EXPECT_EQ(2, list.Length()); | 1104 EXPECT_EQ(2, list.Length()); |
978 // The list should contain {b0, b1}. | 1105 // The list should contain {b0, b1}. |
979 EXPECT((list.At(0) == b0.raw() && list.At(1) == b1.raw()) || | 1106 EXPECT((list.At(0) == b0.raw() && list.At(1) == b1.raw()) || |
980 (list.At(0) == b1.raw() && list.At(1) == b0.raw())); | 1107 (list.At(0) == b1.raw() && list.At(1) == b0.raw())); |
981 // ... and if limit is 1, we one get one of them. | 1108 // ... and if limit is 1, we one get one of them. |
982 service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'instances']," | 1109 service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'instances']," |
983 "['limit'], ['1']]", class_b.id()); | 1110 "['limit'], ['1']]", class_b.id()); |
984 Service::HandleIsolateMessage(isolate, service_msg); | 1111 Service::HandleIsolateMessage(isolate, service_msg); |
985 handler.HandleNextMessage(); | 1112 handler.HandleNextMessage(); |
986 ExpectSubstringF(handler.msg(), "\"totalCount\":2"); | 1113 ExpectSubstringF(handler.msg(), "\"totalCount\":2"); |
987 ExpectSubstringF(handler.msg(), "\"sampleCount\":1"); | 1114 ExpectSubstringF(handler.msg(), "\"sampleCount\":1"); |
988 } | 1115 } |
989 | 1116 |
990 | 1117 |
991 TEST_CASE(Service_Types) { | 1118 TEST_CASE(Service_Types) { |
992 const char* kScript = | 1119 const char* kScript = |
993 "var port;\n" // Set to our mock port by C++. | 1120 "var port;\n" // Set to our mock port by C++. |
994 "\n" | 1121 "\n" |
995 "class A<T> { }\n" | 1122 "class A<T> { }\n" |
996 "\n" | 1123 "\n" |
997 "main() {\n" | 1124 "main() {\n" |
998 " new A<A<bool>>();\n" | 1125 " new A<A<bool>>();\n" |
999 "}"; | 1126 "}"; |
1000 | 1127 |
1001 Isolate* isolate = Isolate::Current(); | 1128 Isolate* isolate = Isolate::Current(); |
1002 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 1129 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1003 EXPECT_VALID(h_lib); | 1130 EXPECT_VALID(lib); |
1004 Library& lib = Library::Handle(); | 1131 Library& vmlib = Library::Handle(); |
1005 lib ^= Api::UnwrapHandle(h_lib); | 1132 vmlib ^= Api::UnwrapHandle(lib); |
1006 EXPECT(!lib.IsNull()); | 1133 EXPECT(!vmlib.IsNull()); |
1007 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); | 1134 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
1008 EXPECT_VALID(result); | 1135 EXPECT_VALID(result); |
1009 const Class& class_a = Class::Handle(GetClass(lib, "A")); | 1136 const Class& class_a = Class::Handle(GetClass(vmlib, "A")); |
1010 EXPECT(!class_a.IsNull()); | 1137 EXPECT(!class_a.IsNull()); |
1011 intptr_t cid = class_a.id(); | 1138 intptr_t cid = class_a.id(); |
1012 | 1139 |
1013 // Build a mock message handler and wrap it in a dart port. | 1140 // Build a mock message handler and wrap it in a dart port. |
1014 ServiceTestMessageHandler handler; | 1141 ServiceTestMessageHandler handler; |
1015 Dart_Port port_id = PortMap::CreatePort(&handler); | 1142 Dart_Port port_id = PortMap::CreatePort(&handler); |
1016 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 1143 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
1017 EXPECT_VALID(port); | 1144 EXPECT_VALID(port); |
1018 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 1145 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
1019 | 1146 |
1020 Array& service_msg = Array::Handle(); | 1147 Array& service_msg = Array::Handle(); |
1021 | 1148 |
1022 // Request the class A over the service. | 1149 // Request the class A over the service. |
1023 service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid); | 1150 service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "'], [], []]", cid); |
1024 Service::HandleIsolateMessage(isolate, service_msg); | 1151 Service::HandleIsolateMessage(isolate, service_msg); |
1025 handler.HandleNextMessage(); | 1152 handler.HandleNextMessage(); |
1026 EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg()); | 1153 EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg()); |
1027 EXPECT_SUBSTRING("\"name\":\"A\"", handler.msg()); | 1154 EXPECT_SUBSTRING("\"name\":\"A\"", handler.msg()); |
1028 ExpectSubstringF(handler.msg(), | 1155 ExpectSubstringF(handler.msg(), |
1029 "\"id\":\"classes\\/%" Pd "\"", cid); | 1156 "\"id\":\"classes\\/%" Pd "\"", cid); |
1030 | 1157 |
1031 // Request canonical type 0 from class A. | 1158 // Request canonical type 0 from class A. |
1032 service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'types', '0']," | 1159 service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'types', '0']," |
1033 "[], []]", cid); | 1160 "[], []]", cid); |
1034 Service::HandleIsolateMessage(isolate, service_msg); | 1161 Service::HandleIsolateMessage(isolate, service_msg); |
1035 handler.HandleNextMessage(); | 1162 handler.HandleNextMessage(); |
1036 EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg()); | 1163 EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg()); |
1037 EXPECT_SUBSTRING("\"name\":\"A<bool>\"", handler.msg()); | 1164 EXPECT_SUBSTRING("\"name\":\"A<bool>\"", handler.msg()); |
1038 ExpectSubstringF(handler.msg(), | 1165 ExpectSubstringF(handler.msg(), |
1039 "\"id\":\"classes\\/%" Pd "\\/types\\/0\"", cid); | 1166 "\"id\":\"classes\\/%" Pd "\\/types\\/0\"", cid); |
1040 | 1167 |
1041 // Request canonical type 1 from class A. | 1168 // Request canonical type 1 from class A. |
1042 service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'types', '1']," | 1169 service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'types', '1']," |
1043 "[], []]", cid); | 1170 "[], []]", cid); |
1044 Service::HandleIsolateMessage(isolate, service_msg); | 1171 Service::HandleIsolateMessage(isolate, service_msg); |
1045 handler.HandleNextMessage(); | 1172 handler.HandleNextMessage(); |
1046 EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg()); | 1173 EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg()); |
1047 EXPECT_SUBSTRING("\"name\":\"A<A<bool>>\"", handler.msg()); | 1174 EXPECT_SUBSTRING("\"name\":\"A<A<bool>>\"", handler.msg()); |
1048 ExpectSubstringF(handler.msg(), | 1175 ExpectSubstringF(handler.msg(), |
1049 "\"id\":\"classes\\/%" Pd "\\/types\\/1\"", cid); | 1176 "\"id\":\"classes\\/%" Pd "\\/types\\/1\"", cid); |
1050 | 1177 |
1051 // Request for non-existent canonical type from class A. | 1178 // Request for non-existent canonical type from class A. |
1052 service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'types', '42']," | 1179 service_msg = EvalF(lib, "[0, port, ['classes', '%" Pd "', 'types', '42']," |
1053 "[], []]", cid); | 1180 "[], []]", cid); |
1054 Service::HandleIsolateMessage(isolate, service_msg); | 1181 Service::HandleIsolateMessage(isolate, service_msg); |
1055 handler.HandleNextMessage(); | 1182 handler.HandleNextMessage(); |
1056 ExpectSubstringF(handler.msg(), | 1183 ExpectSubstringF(handler.msg(), |
1057 "{\"type\":\"Error\",\"id\":\"\"," | 1184 "{\"type\":\"Error\",\"id\":\"\"," |
1058 "\"message\":\"Canonical type 42 not found\"" | 1185 "\"message\":\"Canonical type 42 not found\"" |
1059 ",\"request\":" | 1186 ",\"request\":" |
1060 "{\"arguments\":[\"classes\",\"%" Pd "\",\"types\",\"42\"]," | 1187 "{\"arguments\":[\"classes\",\"%" Pd "\",\"types\",\"42\"]," |
1061 "\"option_keys\":[],\"option_values\":[]}}", cid); | 1188 "\"option_keys\":[],\"option_values\":[]}}", cid); |
1062 | 1189 |
1063 // Request canonical type arguments. Expect <A<bool>> to be listed. | 1190 // Request canonical type arguments. Expect <A<bool>> to be listed. |
1064 service_msg = EvalF(h_lib, "[0, port, ['typearguments']," | 1191 service_msg = EvalF(lib, "[0, port, ['typearguments']," |
1065 "[], []]"); | 1192 "[], []]"); |
1066 Service::HandleIsolateMessage(isolate, service_msg); | 1193 Service::HandleIsolateMessage(isolate, service_msg); |
1067 handler.HandleNextMessage(); | 1194 handler.HandleNextMessage(); |
1068 EXPECT_SUBSTRING("\"type\":\"TypeArgumentsList\"", handler.msg()); | 1195 EXPECT_SUBSTRING("\"type\":\"TypeArgumentsList\"", handler.msg()); |
1069 ExpectSubstringF(handler.msg(), "\"name\":\"<A<bool>>\","); | 1196 ExpectSubstringF(handler.msg(), "\"name\":\"<A<bool>>\","); |
1070 | 1197 |
1071 // Request canonical type arguments with instantiations. | 1198 // Request canonical type arguments with instantiations. |
1072 service_msg = EvalF(h_lib, | 1199 service_msg = EvalF(lib, |
1073 "[0, port, ['typearguments', 'withinstantiations']," | 1200 "[0, port, ['typearguments', 'withinstantiations']," |
1074 "[], []]"); | 1201 "[], []]"); |
1075 Service::HandleIsolateMessage(isolate, service_msg); | 1202 Service::HandleIsolateMessage(isolate, service_msg); |
1076 handler.HandleNextMessage(); | 1203 handler.HandleNextMessage(); |
1077 EXPECT_SUBSTRING("\"type\":\"TypeArgumentsList\"", handler.msg()); | 1204 EXPECT_SUBSTRING("\"type\":\"TypeArgumentsList\"", handler.msg()); |
1078 } | 1205 } |
1079 | 1206 |
1080 | 1207 |
1081 TEST_CASE(Service_Code) { | 1208 TEST_CASE(Service_Code) { |
1082 const char* kScript = | 1209 const char* kScript = |
1083 "var port;\n" // Set to our mock port by C++. | 1210 "var port;\n" // Set to our mock port by C++. |
1084 "\n" | 1211 "\n" |
1085 "class A {\n" | 1212 "class A {\n" |
1086 " var a;\n" | 1213 " var a;\n" |
1087 " dynamic b() {}\n" | 1214 " dynamic b() {}\n" |
1088 " dynamic c() {\n" | 1215 " dynamic c() {\n" |
1089 " var d = () { b(); };\n" | 1216 " var d = () { b(); };\n" |
1090 " return d;\n" | 1217 " return d;\n" |
1091 " }\n" | 1218 " }\n" |
1092 "}\n" | 1219 "}\n" |
1093 "main() {\n" | 1220 "main() {\n" |
1094 " var z = new A();\n" | 1221 " var z = new A();\n" |
1095 " var x = z.c();\n" | 1222 " var x = z.c();\n" |
1096 " x();\n" | 1223 " x();\n" |
1097 "}"; | 1224 "}"; |
1098 | 1225 |
1099 Isolate* isolate = Isolate::Current(); | 1226 Isolate* isolate = Isolate::Current(); |
1100 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 1227 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1101 EXPECT_VALID(h_lib); | 1228 EXPECT_VALID(lib); |
1102 Library& lib = Library::Handle(); | 1229 Library& vmlib = Library::Handle(); |
1103 lib ^= Api::UnwrapHandle(h_lib); | 1230 vmlib ^= Api::UnwrapHandle(lib); |
1104 EXPECT(!lib.IsNull()); | 1231 EXPECT(!vmlib.IsNull()); |
1105 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); | 1232 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
1106 EXPECT_VALID(result); | 1233 EXPECT_VALID(result); |
1107 const Class& class_a = Class::Handle(GetClass(lib, "A")); | 1234 const Class& class_a = Class::Handle(GetClass(vmlib, "A")); |
1108 EXPECT(!class_a.IsNull()); | 1235 EXPECT(!class_a.IsNull()); |
1109 const Function& function_c = Function::Handle(GetFunction(class_a, "c")); | 1236 const Function& function_c = Function::Handle(GetFunction(class_a, "c")); |
1110 EXPECT(!function_c.IsNull()); | 1237 EXPECT(!function_c.IsNull()); |
1111 const Code& code_c = Code::Handle(function_c.CurrentCode()); | 1238 const Code& code_c = Code::Handle(function_c.CurrentCode()); |
1112 EXPECT(!code_c.IsNull()); | 1239 EXPECT(!code_c.IsNull()); |
1113 // Use the entry of the code object as it's reference. | 1240 // Use the entry of the code object as it's reference. |
1114 uword entry = code_c.EntryPoint(); | 1241 uword entry = code_c.EntryPoint(); |
1115 int64_t compile_timestamp = code_c.compile_timestamp(); | 1242 int64_t compile_timestamp = code_c.compile_timestamp(); |
1116 EXPECT_GT(code_c.Size(), 16); | 1243 EXPECT_GT(code_c.Size(), 16); |
1117 uword last = entry + code_c.Size(); | 1244 uword last = entry + code_c.Size(); |
1118 | 1245 |
1119 // Build a mock message handler and wrap it in a dart port. | 1246 // Build a mock message handler and wrap it in a dart port. |
1120 ServiceTestMessageHandler handler; | 1247 ServiceTestMessageHandler handler; |
1121 Dart_Port port_id = PortMap::CreatePort(&handler); | 1248 Dart_Port port_id = PortMap::CreatePort(&handler); |
1122 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 1249 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
1123 EXPECT_VALID(port); | 1250 EXPECT_VALID(port); |
1124 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 1251 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
1125 | 1252 |
1126 Array& service_msg = Array::Handle(); | 1253 Array& service_msg = Array::Handle(); |
1127 | 1254 |
1128 // Request an invalid code object. | 1255 // Request an invalid code object. |
1129 service_msg = Eval(h_lib, "[0, port, ['code', '0'], [], []]"); | 1256 service_msg = Eval(lib, "[0, port, ['code', '0'], [], []]"); |
1130 Service::HandleIsolateMessage(isolate, service_msg); | 1257 Service::HandleIsolateMessage(isolate, service_msg); |
1131 handler.HandleNextMessage(); | 1258 handler.HandleNextMessage(); |
1132 EXPECT_STREQ( | 1259 EXPECT_STREQ( |
1133 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Malformed code id: 0\"," | 1260 "{\"type\":\"Error\",\"id\":\"\",\"message\":\"Malformed code id: 0\"," |
1134 "\"request\":{\"arguments\":[\"code\",\"0\"]," | 1261 "\"request\":{\"arguments\":[\"code\",\"0\"]," |
1135 "\"option_keys\":[],\"option_values\":[]}}", handler.msg()); | 1262 "\"option_keys\":[],\"option_values\":[]}}", handler.msg()); |
1136 | 1263 |
1137 // The following test checks that a code object can be found only | 1264 // The following test checks that a code object can be found only |
1138 // at compile_timestamp()-code.EntryPoint(). | 1265 // at compile_timestamp()-code.EntryPoint(). |
1139 service_msg = EvalF(h_lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]", | 1266 service_msg = EvalF(lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]", |
1140 compile_timestamp, | 1267 compile_timestamp, |
1141 entry); | 1268 entry); |
1142 Service::HandleIsolateMessage(isolate, service_msg); | 1269 Service::HandleIsolateMessage(isolate, service_msg); |
1143 handler.HandleNextMessage(); | 1270 handler.HandleNextMessage(); |
1144 { | 1271 { |
1145 // Only perform a partial match. | 1272 // Only perform a partial match. |
1146 const intptr_t kBufferSize = 512; | 1273 const intptr_t kBufferSize = 512; |
1147 char buffer[kBufferSize]; | 1274 char buffer[kBufferSize]; |
1148 OS::SNPrint(buffer, kBufferSize-1, | 1275 OS::SNPrint(buffer, kBufferSize-1, |
1149 "{\"type\":\"Code\",\"id\":\"code\\/%" Px64 "-%" Px "\",", | 1276 "{\"type\":\"Code\",\"id\":\"code\\/%" Px64 "-%" Px "\",", |
1150 compile_timestamp, | 1277 compile_timestamp, |
1151 entry); | 1278 entry); |
1152 EXPECT_SUBSTRING(buffer, handler.msg()); | 1279 EXPECT_SUBSTRING(buffer, handler.msg()); |
1153 } | 1280 } |
1154 | 1281 |
1155 // Request code object at compile_timestamp-code.EntryPoint() + 16 | 1282 // Request code object at compile_timestamp-code.EntryPoint() + 16 |
1156 // Expect this to fail because the address is not the entry point. | 1283 // Expect this to fail because the address is not the entry point. |
1157 uintptr_t address = entry + 16; | 1284 uintptr_t address = entry + 16; |
1158 service_msg = EvalF(h_lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]", | 1285 service_msg = EvalF(lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]", |
1159 compile_timestamp, | 1286 compile_timestamp, |
1160 address); | 1287 address); |
1161 Service::HandleIsolateMessage(isolate, service_msg); | 1288 Service::HandleIsolateMessage(isolate, service_msg); |
1162 handler.HandleNextMessage(); | 1289 handler.HandleNextMessage(); |
1163 { | 1290 { |
1164 // Only perform a partial match. | 1291 // Only perform a partial match. |
1165 const intptr_t kBufferSize = 512; | 1292 const intptr_t kBufferSize = 512; |
1166 char buffer[kBufferSize]; | 1293 char buffer[kBufferSize]; |
1167 OS::SNPrint(buffer, kBufferSize-1, | 1294 OS::SNPrint(buffer, kBufferSize-1, |
1168 "Could not find code with id: %" Px64 "-%" Px "", | 1295 "Could not find code with id: %" Px64 "-%" Px "", |
1169 compile_timestamp, | 1296 compile_timestamp, |
1170 address); | 1297 address); |
1171 EXPECT_SUBSTRING(buffer, handler.msg()); | 1298 EXPECT_SUBSTRING(buffer, handler.msg()); |
1172 } | 1299 } |
1173 | 1300 |
1174 // Request code object at (compile_timestamp - 1)-code.EntryPoint() | 1301 // Request code object at (compile_timestamp - 1)-code.EntryPoint() |
1175 // Expect this to fail because the timestamp is wrong. | 1302 // Expect this to fail because the timestamp is wrong. |
1176 address = entry; | 1303 address = entry; |
1177 service_msg = EvalF(h_lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]", | 1304 service_msg = EvalF(lib, "[0, port, ['code', '%" Px64"-%" Px "'], [], []]", |
1178 compile_timestamp - 1, | 1305 compile_timestamp - 1, |
1179 address); | 1306 address); |
1180 Service::HandleIsolateMessage(isolate, service_msg); | 1307 Service::HandleIsolateMessage(isolate, service_msg); |
1181 handler.HandleNextMessage(); | 1308 handler.HandleNextMessage(); |
1182 { | 1309 { |
1183 // Only perform a partial match. | 1310 // Only perform a partial match. |
1184 const intptr_t kBufferSize = 512; | 1311 const intptr_t kBufferSize = 512; |
1185 char buffer[kBufferSize]; | 1312 char buffer[kBufferSize]; |
1186 OS::SNPrint(buffer, kBufferSize-1, | 1313 OS::SNPrint(buffer, kBufferSize-1, |
1187 "Could not find code with id: %" Px64 "-%" Px "", | 1314 "Could not find code with id: %" Px64 "-%" Px "", |
1188 compile_timestamp - 1, | 1315 compile_timestamp - 1, |
1189 address); | 1316 address); |
1190 EXPECT_SUBSTRING(buffer, handler.msg()); | 1317 EXPECT_SUBSTRING(buffer, handler.msg()); |
1191 } | 1318 } |
1192 | 1319 |
1193 // Request native code at address. Expect the null code object back. | 1320 // Request native code at address. Expect the null code object back. |
1194 address = last; | 1321 address = last; |
1195 service_msg = EvalF(h_lib, "[0, port, ['code', 'native-%" Px "'], [], []]", | 1322 service_msg = EvalF(lib, "[0, port, ['code', 'native-%" Px "'], [], []]", |
1196 address); | 1323 address); |
1197 Service::HandleIsolateMessage(isolate, service_msg); | 1324 Service::HandleIsolateMessage(isolate, service_msg); |
1198 handler.HandleNextMessage(); | 1325 handler.HandleNextMessage(); |
1199 EXPECT_STREQ("{\"type\":\"Null\",\"id\":\"objects\\/null\"," | 1326 EXPECT_STREQ("{\"type\":\"Null\",\"id\":\"objects\\/null\"," |
1200 "\"valueAsString\":\"null\"}", | 1327 "\"valueAsString\":\"null\"}", |
1201 handler.msg()); | 1328 handler.msg()); |
1202 | 1329 |
1203 // Request malformed native code. | 1330 // Request malformed native code. |
1204 service_msg = EvalF(h_lib, "[0, port, ['code', 'native%" Px "'], [], []]", | 1331 service_msg = EvalF(lib, "[0, port, ['code', 'native%" Px "'], [], []]", |
1205 address); | 1332 address); |
1206 Service::HandleIsolateMessage(isolate, service_msg); | 1333 Service::HandleIsolateMessage(isolate, service_msg); |
1207 handler.HandleNextMessage(); | 1334 handler.HandleNextMessage(); |
1208 EXPECT_SUBSTRING("\"message\":\"Malformed code id:", handler.msg()); | 1335 EXPECT_SUBSTRING("\"message\":\"Malformed code id:", handler.msg()); |
1209 } | 1336 } |
1210 | 1337 |
1211 | 1338 |
1212 TEST_CASE(Service_VM) { | 1339 TEST_CASE(Service_VM) { |
1213 const char* kScript = | 1340 const char* kScript = |
1214 "var port;\n" // Set to our mock port by C++. | 1341 "var port;\n" // Set to our mock port by C++. |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 | 1418 |
1292 | 1419 |
1293 TEST_CASE(Service_Scripts) { | 1420 TEST_CASE(Service_Scripts) { |
1294 const char* kScript = | 1421 const char* kScript = |
1295 "var port;\n" // Set to our mock port by C++. | 1422 "var port;\n" // Set to our mock port by C++. |
1296 "\n" | 1423 "\n" |
1297 "main() {\n" | 1424 "main() {\n" |
1298 "}"; | 1425 "}"; |
1299 | 1426 |
1300 Isolate* isolate = Isolate::Current(); | 1427 Isolate* isolate = Isolate::Current(); |
1301 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 1428 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1302 EXPECT_VALID(h_lib); | 1429 EXPECT_VALID(lib); |
1303 Library& lib = Library::Handle(); | 1430 Library& vmlib = Library::Handle(); |
1304 lib ^= Api::UnwrapHandle(h_lib); | 1431 vmlib ^= Api::UnwrapHandle(lib); |
1305 EXPECT(!lib.IsNull()); | 1432 EXPECT(!vmlib.IsNull()); |
1306 | 1433 |
1307 // Build a mock message handler and wrap it in a dart port. | 1434 // Build a mock message handler and wrap it in a dart port. |
1308 ServiceTestMessageHandler handler; | 1435 ServiceTestMessageHandler handler; |
1309 Dart_Port port_id = PortMap::CreatePort(&handler); | 1436 Dart_Port port_id = PortMap::CreatePort(&handler); |
1310 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 1437 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
1311 EXPECT_VALID(port); | 1438 EXPECT_VALID(port); |
1312 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 1439 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
1313 | 1440 |
1314 Array& service_msg = Array::Handle(); | 1441 Array& service_msg = Array::Handle(); |
1315 char buf[1024]; | 1442 char buf[1024]; |
1316 OS::SNPrint(buf, sizeof(buf), | 1443 OS::SNPrint(buf, sizeof(buf), |
1317 "[0, port, ['libraries', '%" Pd "', 'scripts', 'test-lib'], [], []]", | 1444 "[0, port, ['libraries', '%" Pd "', 'scripts', 'test-lib'], [], []]", |
1318 lib.index()); | 1445 vmlib.index()); |
1319 | 1446 |
1320 service_msg = Eval(h_lib, buf); | 1447 service_msg = Eval(lib, buf); |
1321 Service::HandleIsolateMessage(isolate, service_msg); | 1448 Service::HandleIsolateMessage(isolate, service_msg); |
1322 handler.HandleNextMessage(); | 1449 handler.HandleNextMessage(); |
1323 OS::SNPrint(buf, sizeof(buf), | 1450 OS::SNPrint(buf, sizeof(buf), |
1324 "{\"type\":\"Script\"," | 1451 "{\"type\":\"Script\"," |
1325 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," | 1452 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," |
1326 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," | 1453 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," |
1327 "\"kind\":\"script\"," | 1454 "\"kind\":\"script\"," |
1328 "\"owning_library\":{\"type\":\"@Library\"," | 1455 "\"owning_library\":{\"type\":\"@Library\"," |
1329 "\"id\":\"libraries\\/%" Pd "\",\"user_name\":\"\",\"name\":\"\"," | 1456 "\"id\":\"libraries\\/%" Pd "\",\"user_name\":\"\",\"name\":\"\"," |
1330 "\"url\":\"test-lib\"}," | 1457 "\"url\":\"test-lib\"}," |
1331 "\"source\":\"var port;\\n\\nmain() {\\n}\"," | 1458 "\"source\":\"var port;\\n\\nmain() {\\n}\"," |
1332 "\"tokenPosTable\":[[1,0,1,1,5,2,9],[3,5,1,6,5,7,6,8,8],[4,10,1]]}", | 1459 "\"tokenPosTable\":[[1,0,1,1,5,2,9],[3,5,1,6,5,7,6,8,8],[4,10,1]]}", |
1333 lib.index(), lib.index()); | 1460 vmlib.index(), vmlib.index()); |
1334 EXPECT_STREQ(buf, handler.msg()); | 1461 EXPECT_STREQ(buf, handler.msg()); |
1335 } | 1462 } |
1336 | 1463 |
1337 | 1464 |
1338 // TODO(zra): Remove when tests are ready to enable. | 1465 // TODO(zra): Remove when tests are ready to enable. |
1339 #if !defined(TARGET_ARCH_ARM64) | 1466 #if !defined(TARGET_ARCH_ARM64) |
1340 | 1467 |
1341 TEST_CASE(Service_Coverage) { | 1468 TEST_CASE(Service_Coverage) { |
1342 const char* kScript = | 1469 const char* kScript = |
1343 "var port;\n" // Set to our mock port by C++. | 1470 "var port;\n" // Set to our mock port by C++. |
1344 "\n" | 1471 "\n" |
1345 "var x = 7;\n" | 1472 "var x = 7;\n" |
1346 "main() {\n" | 1473 "main() {\n" |
1347 " x = x * x;\n" | 1474 " x = x * x;\n" |
1348 " x = x / 13;\n" | 1475 " x = x / 13;\n" |
1349 "}"; | 1476 "}"; |
1350 | 1477 |
1351 Isolate* isolate = Isolate::Current(); | 1478 Isolate* isolate = Isolate::Current(); |
1352 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 1479 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1353 EXPECT_VALID(h_lib); | 1480 EXPECT_VALID(lib); |
1354 Library& lib = Library::Handle(); | 1481 Library& vmlib = Library::Handle(); |
1355 lib ^= Api::UnwrapHandle(h_lib); | 1482 vmlib ^= Api::UnwrapHandle(lib); |
1356 EXPECT(!lib.IsNull()); | 1483 EXPECT(!vmlib.IsNull()); |
1357 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); | 1484 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
1358 EXPECT_VALID(result); | 1485 EXPECT_VALID(result); |
1359 | 1486 |
1360 // Build a mock message handler and wrap it in a dart port. | 1487 // Build a mock message handler and wrap it in a dart port. |
1361 ServiceTestMessageHandler handler; | 1488 ServiceTestMessageHandler handler; |
1362 Dart_Port port_id = PortMap::CreatePort(&handler); | 1489 Dart_Port port_id = PortMap::CreatePort(&handler); |
1363 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 1490 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
1364 EXPECT_VALID(port); | 1491 EXPECT_VALID(port); |
1365 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 1492 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
1366 | 1493 |
1367 Array& service_msg = Array::Handle(); | 1494 Array& service_msg = Array::Handle(); |
1368 service_msg = Eval(h_lib, "[0, port, ['coverage'], [], []]"); | 1495 service_msg = Eval(lib, "[0, port, ['coverage'], [], []]"); |
1369 Service::HandleIsolateMessage(isolate, service_msg); | 1496 Service::HandleIsolateMessage(isolate, service_msg); |
1370 handler.HandleNextMessage(); | 1497 handler.HandleNextMessage(); |
1371 | 1498 |
1372 // Look up the service id for the library containg the test-lib script. | |
1373 const GrowableObjectArray& libs = | |
1374 GrowableObjectArray::Handle(isolate->object_store()->libraries()); | |
1375 intptr_t i; | |
1376 for (i = 0; i < libs.Length(); i++) { | |
1377 if (libs.At(i) == lib.raw()) { | |
1378 break; | |
1379 } | |
1380 } | |
1381 ASSERT(i != libs.Length()); | |
1382 | |
1383 char buf[1024]; | 1499 char buf[1024]; |
1384 OS::SNPrint(buf, sizeof(buf), | 1500 OS::SNPrint(buf, sizeof(buf), |
1385 "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\"," | 1501 "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\"," |
1386 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," | 1502 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," |
1387 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," | 1503 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," |
1388 "\"kind\":\"script\"},\"hits\":" | 1504 "\"kind\":\"script\"},\"hits\":" |
1389 "[5,1,6,1]}", i); | 1505 "[5,1,6,1]}", |
| 1506 vmlib.index()); |
1390 EXPECT_SUBSTRING(buf, handler.msg()); | 1507 EXPECT_SUBSTRING(buf, handler.msg()); |
1391 } | 1508 } |
1392 | 1509 |
1393 | 1510 |
1394 TEST_CASE(Service_LibrariesScriptsCoverage) { | 1511 TEST_CASE(Service_LibrariesScriptsCoverage) { |
1395 const char* kScript = | 1512 const char* kScript = |
1396 "var port;\n" // Set to our mock port by C++. | 1513 "var port;\n" // Set to our mock port by C++. |
1397 "\n" | 1514 "\n" |
1398 "var x = 7;\n" | 1515 "var x = 7;\n" |
1399 "main() {\n" | 1516 "main() {\n" |
1400 " x = x * x;\n" | 1517 " x = x * x;\n" |
1401 " x = x / 13;\n" | 1518 " x = x / 13;\n" |
1402 "}"; | 1519 "}"; |
1403 | 1520 |
1404 Isolate* isolate = Isolate::Current(); | 1521 Isolate* isolate = Isolate::Current(); |
1405 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 1522 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1406 EXPECT_VALID(h_lib); | 1523 EXPECT_VALID(lib); |
1407 Library& lib = Library::Handle(); | 1524 Library& vmlib = Library::Handle(); |
1408 lib ^= Api::UnwrapHandle(h_lib); | 1525 vmlib ^= Api::UnwrapHandle(lib); |
1409 EXPECT(!lib.IsNull()); | 1526 EXPECT(!vmlib.IsNull()); |
1410 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); | 1527 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
1411 EXPECT_VALID(result); | 1528 EXPECT_VALID(result); |
1412 | 1529 |
1413 // Build a mock message handler and wrap it in a dart port. | 1530 // Build a mock message handler and wrap it in a dart port. |
1414 ServiceTestMessageHandler handler; | 1531 ServiceTestMessageHandler handler; |
1415 Dart_Port port_id = PortMap::CreatePort(&handler); | 1532 Dart_Port port_id = PortMap::CreatePort(&handler); |
1416 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 1533 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
1417 EXPECT_VALID(port); | 1534 EXPECT_VALID(port); |
1418 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 1535 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
1419 | 1536 |
1420 Array& service_msg = Array::Handle(); | 1537 Array& service_msg = Array::Handle(); |
1421 char buf[1024]; | 1538 char buf[1024]; |
1422 OS::SNPrint(buf, sizeof(buf), | 1539 OS::SNPrint(buf, sizeof(buf), |
1423 "[0, port, ['libraries', '%" Pd "', 'scripts', 'test-lib', 'coverage'], " | 1540 "[0, port, ['libraries', '%" Pd "', 'scripts', 'test-lib', 'coverage'], " |
1424 "[], []]", | 1541 "[], []]", |
1425 lib.index()); | 1542 vmlib.index()); |
1426 | 1543 |
1427 service_msg = Eval(h_lib, buf); | 1544 service_msg = Eval(lib, buf); |
1428 Service::HandleIsolateMessage(isolate, service_msg); | 1545 Service::HandleIsolateMessage(isolate, service_msg); |
1429 handler.HandleNextMessage(); | 1546 handler.HandleNextMessage(); |
1430 OS::SNPrint(buf, sizeof(buf), | 1547 OS::SNPrint(buf, sizeof(buf), |
1431 "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":[" | 1548 "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":[" |
1432 "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\"," | 1549 "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\"," |
1433 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," | 1550 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," |
1434 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," | 1551 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," |
1435 "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", lib.index()); | 1552 "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", vmlib.index()); |
1436 EXPECT_STREQ(buf, handler.msg()); | 1553 EXPECT_STREQ(buf, handler.msg()); |
1437 } | 1554 } |
1438 | 1555 |
1439 | 1556 |
1440 TEST_CASE(Service_LibrariesCoverage) { | 1557 TEST_CASE(Service_LibrariesCoverage) { |
1441 const char* kScript = | 1558 const char* kScript = |
1442 "var port;\n" // Set to our mock port by C++. | 1559 "var port;\n" // Set to our mock port by C++. |
1443 "\n" | 1560 "\n" |
1444 "var x = 7;\n" | 1561 "var x = 7;\n" |
1445 "main() {\n" | 1562 "main() {\n" |
1446 " x = x * x;\n" | 1563 " x = x * x;\n" |
1447 " x = x / 13;\n" | 1564 " x = x / 13;\n" |
1448 "}"; | 1565 "}"; |
1449 | 1566 |
1450 Isolate* isolate = Isolate::Current(); | 1567 Isolate* isolate = Isolate::Current(); |
1451 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 1568 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1452 EXPECT_VALID(h_lib); | 1569 EXPECT_VALID(lib); |
1453 Library& lib = Library::Handle(); | 1570 Library& vmlib = Library::Handle(); |
1454 lib ^= Api::UnwrapHandle(h_lib); | 1571 vmlib ^= Api::UnwrapHandle(lib); |
1455 EXPECT(!lib.IsNull()); | 1572 EXPECT(!vmlib.IsNull()); |
1456 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); | 1573 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
1457 EXPECT_VALID(result); | 1574 EXPECT_VALID(result); |
1458 | 1575 |
1459 // Build a mock message handler and wrap it in a dart port. | 1576 // Build a mock message handler and wrap it in a dart port. |
1460 ServiceTestMessageHandler handler; | 1577 ServiceTestMessageHandler handler; |
1461 Dart_Port port_id = PortMap::CreatePort(&handler); | 1578 Dart_Port port_id = PortMap::CreatePort(&handler); |
1462 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 1579 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
1463 EXPECT_VALID(port); | 1580 EXPECT_VALID(port); |
1464 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 1581 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
1465 | 1582 |
1466 // Look up the service id for the library containg the test-lib script. | |
1467 const GrowableObjectArray& libs = | |
1468 GrowableObjectArray::Handle(isolate->object_store()->libraries()); | |
1469 intptr_t i; | |
1470 for (i = 0; i < libs.Length(); i++) { | |
1471 if (libs.At(i) == lib.raw()) { | |
1472 break; | |
1473 } | |
1474 } | |
1475 ASSERT(i != libs.Length()); | |
1476 char buf[1024]; | 1583 char buf[1024]; |
1477 OS::SNPrint(buf, sizeof(buf), | 1584 OS::SNPrint(buf, sizeof(buf), |
1478 "[0, port, ['libraries', '%" Pd "', 'coverage'], [], []]", i); | 1585 "[0, port, ['libraries', '%" Pd "', 'coverage'], [], []]", |
| 1586 vmlib.index()); |
1479 | 1587 |
1480 Array& service_msg = Array::Handle(); | 1588 Array& service_msg = Array::Handle(); |
1481 service_msg = Eval(h_lib, buf); | 1589 service_msg = Eval(lib, buf); |
1482 Service::HandleIsolateMessage(isolate, service_msg); | 1590 Service::HandleIsolateMessage(isolate, service_msg); |
1483 handler.HandleNextMessage(); | 1591 handler.HandleNextMessage(); |
1484 OS::SNPrint(buf, sizeof(buf), | 1592 OS::SNPrint(buf, sizeof(buf), |
1485 "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":[" | 1593 "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":[" |
1486 "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\"," | 1594 "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\"," |
1487 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," | 1595 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," |
1488 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," | 1596 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," |
1489 "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", lib.index()); | 1597 "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", |
| 1598 vmlib.index()); |
1490 EXPECT_STREQ(buf, handler.msg()); | 1599 EXPECT_STREQ(buf, handler.msg()); |
1491 } | 1600 } |
1492 | 1601 |
1493 | 1602 |
1494 TEST_CASE(Service_ClassesCoverage) { | 1603 TEST_CASE(Service_ClassesCoverage) { |
1495 const char* kScript = | 1604 const char* kScript = |
1496 "var port;\n" // Set to our mock port by C++. | 1605 "var port;\n" // Set to our mock port by C++. |
1497 "\n" | 1606 "\n" |
1498 "class Foo {\n" | 1607 "class Foo {\n" |
1499 " var x;\n" | 1608 " var x;\n" |
1500 " Foo(this.x);\n" | 1609 " Foo(this.x);\n" |
1501 " bar() {\n" | 1610 " bar() {\n" |
1502 " x = x * x;\n" | 1611 " x = x * x;\n" |
1503 " x = x / 13;\n" | 1612 " x = x / 13;\n" |
1504 " }\n" | 1613 " }\n" |
1505 "}\n" | 1614 "}\n" |
1506 "main() {\n" | 1615 "main() {\n" |
1507 " var foo = new Foo(7);\n" | 1616 " var foo = new Foo(7);\n" |
1508 " foo.bar();\n" | 1617 " foo.bar();\n" |
1509 "}"; | 1618 "}"; |
1510 | 1619 |
1511 Isolate* isolate = Isolate::Current(); | 1620 Isolate* isolate = Isolate::Current(); |
1512 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 1621 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1513 EXPECT_VALID(h_lib); | 1622 EXPECT_VALID(lib); |
1514 Library& lib = Library::Handle(); | 1623 Library& vmlib = Library::Handle(); |
1515 lib ^= Api::UnwrapHandle(h_lib); | 1624 vmlib ^= Api::UnwrapHandle(lib); |
1516 EXPECT(!lib.IsNull()); | 1625 EXPECT(!vmlib.IsNull()); |
1517 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); | 1626 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
1518 EXPECT_VALID(result); | 1627 EXPECT_VALID(result); |
1519 | 1628 |
1520 // Build a mock message handler and wrap it in a dart port. | 1629 // Build a mock message handler and wrap it in a dart port. |
1521 ServiceTestMessageHandler handler; | 1630 ServiceTestMessageHandler handler; |
1522 Dart_Port port_id = PortMap::CreatePort(&handler); | 1631 Dart_Port port_id = PortMap::CreatePort(&handler); |
1523 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 1632 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
1524 EXPECT_VALID(port); | 1633 EXPECT_VALID(port); |
1525 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 1634 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
1526 | 1635 |
1527 // Look up the service id of Foo. | 1636 // Look up the service id of Foo. |
1528 const Class& cls = Class::Handle( | 1637 const Class& cls = Class::Handle( |
1529 lib.LookupClass(String::Handle(String::New("Foo")))); | 1638 vmlib.LookupClass(String::Handle(String::New("Foo")))); |
1530 ASSERT(!cls.IsNull()); | 1639 ASSERT(!cls.IsNull()); |
1531 ClassTable* table = isolate->class_table(); | 1640 ClassTable* table = isolate->class_table(); |
1532 intptr_t i; | 1641 intptr_t i; |
1533 for (i = 1; i < table->NumCids(); i++) { | 1642 for (i = 1; i < table->NumCids(); i++) { |
1534 if (table->HasValidClassAt(i) && table->At(i) == cls.raw()) { | 1643 if (table->HasValidClassAt(i) && table->At(i) == cls.raw()) { |
1535 break; | 1644 break; |
1536 } | 1645 } |
1537 } | 1646 } |
1538 ASSERT(i != table->NumCids()); | 1647 ASSERT(i != table->NumCids()); |
1539 char buf[1024]; | 1648 char buf[1024]; |
1540 OS::SNPrint(buf, sizeof(buf), | 1649 OS::SNPrint(buf, sizeof(buf), |
1541 "[0, port, ['classes', '%" Pd "', 'coverage'], [], []]", i); | 1650 "[0, port, ['classes', '%" Pd "', 'coverage'], [], []]", i); |
1542 | 1651 |
1543 Array& service_msg = Array::Handle(); | 1652 Array& service_msg = Array::Handle(); |
1544 service_msg = Eval(h_lib, buf); | 1653 service_msg = Eval(lib, buf); |
1545 Service::HandleIsolateMessage(isolate, service_msg); | 1654 Service::HandleIsolateMessage(isolate, service_msg); |
1546 handler.HandleNextMessage(); | 1655 handler.HandleNextMessage(); |
1547 OS::SNPrint(buf, sizeof(buf), | 1656 OS::SNPrint(buf, sizeof(buf), |
1548 "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":[" | 1657 "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":[" |
1549 "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\"," | 1658 "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\"," |
1550 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," | 1659 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," |
1551 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," | 1660 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," |
1552 "\"kind\":\"script\"},\"hits\":[5,1,7,4,8,3]}]}", lib.index()); | 1661 "\"kind\":\"script\"},\"hits\":[5,1,7,4,8,3]}]}", |
| 1662 vmlib.index()); |
1553 EXPECT_STREQ(buf, handler.msg()); | 1663 EXPECT_STREQ(buf, handler.msg()); |
1554 } | 1664 } |
1555 | 1665 |
1556 | 1666 |
1557 TEST_CASE(Service_ClassesFunctionsCoverage) { | 1667 TEST_CASE(Service_ClassesFunctionsCoverage) { |
1558 const char* kScript = | 1668 const char* kScript = |
1559 "var port;\n" // Set to our mock port by C++. | 1669 "var port;\n" // Set to our mock port by C++. |
1560 "\n" | 1670 "\n" |
1561 "class Foo {\n" | 1671 "class Foo {\n" |
1562 " var x;\n" | 1672 " var x;\n" |
1563 " Foo(this.x);\n" | 1673 " Foo(this.x);\n" |
1564 " bar() {\n" | 1674 " bar() {\n" |
1565 " x = x * x;\n" | 1675 " x = x * x;\n" |
1566 " x = x / 13;\n" | 1676 " x = x / 13;\n" |
1567 " }\n" | 1677 " }\n" |
1568 " badum(var a) => 4 + a;\n" | 1678 " badum(var a) => 4 + a;\n" |
1569 "}\n" | 1679 "}\n" |
1570 "main() {\n" | 1680 "main() {\n" |
1571 " var foo = new Foo(7);\n" | 1681 " var foo = new Foo(7);\n" |
1572 " foo.bar();\n" | 1682 " foo.bar();\n" |
1573 "}"; | 1683 "}"; |
1574 | 1684 |
1575 Isolate* isolate = Isolate::Current(); | 1685 Isolate* isolate = Isolate::Current(); |
1576 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 1686 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1577 EXPECT_VALID(h_lib); | 1687 EXPECT_VALID(lib); |
1578 Library& lib = Library::Handle(); | 1688 Library& vmlib = Library::Handle(); |
1579 lib ^= Api::UnwrapHandle(h_lib); | 1689 vmlib ^= Api::UnwrapHandle(lib); |
1580 EXPECT(!lib.IsNull()); | 1690 EXPECT(!vmlib.IsNull()); |
1581 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); | 1691 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
1582 EXPECT_VALID(result); | 1692 EXPECT_VALID(result); |
1583 | 1693 |
1584 // Build a mock message handler and wrap it in a dart port. | 1694 // Build a mock message handler and wrap it in a dart port. |
1585 ServiceTestMessageHandler handler; | 1695 ServiceTestMessageHandler handler; |
1586 Dart_Port port_id = PortMap::CreatePort(&handler); | 1696 Dart_Port port_id = PortMap::CreatePort(&handler); |
1587 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 1697 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
1588 EXPECT_VALID(port); | 1698 EXPECT_VALID(port); |
1589 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 1699 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
1590 | 1700 |
1591 // Look up the service id of Foo. | 1701 // Look up the service id of Foo. |
1592 const Class& cls = Class::Handle( | 1702 const Class& cls = Class::Handle( |
1593 lib.LookupClass(String::Handle(String::New("Foo")))); | 1703 vmlib.LookupClass(String::Handle(String::New("Foo")))); |
1594 ASSERT(!cls.IsNull()); | 1704 ASSERT(!cls.IsNull()); |
1595 ClassTable* table = isolate->class_table(); | 1705 ClassTable* table = isolate->class_table(); |
1596 intptr_t i; | 1706 intptr_t i; |
1597 for (i = 1; i < table->NumCids(); i++) { | 1707 for (i = 1; i < table->NumCids(); i++) { |
1598 if (table->HasValidClassAt(i) && table->At(i) == cls.raw()) { | 1708 if (table->HasValidClassAt(i) && table->At(i) == cls.raw()) { |
1599 break; | 1709 break; |
1600 } | 1710 } |
1601 } | 1711 } |
1602 ASSERT(i != table->NumCids()); | 1712 ASSERT(i != table->NumCids()); |
1603 | 1713 |
1604 // Look up the service if of the function Foo.bar. | 1714 // Look up the service if of the function Foo.bar. |
1605 const Function& func = Function::Handle( | 1715 const Function& func = Function::Handle( |
1606 cls.LookupFunction(String::Handle(String::New("bar")))); | 1716 cls.LookupFunction(String::Handle(String::New("bar")))); |
1607 ASSERT(!func.IsNull()); | 1717 ASSERT(!func.IsNull()); |
1608 intptr_t function_id = -1; | 1718 intptr_t function_id = -1; |
1609 function_id = cls.FindFunctionIndex(func); | 1719 function_id = cls.FindFunctionIndex(func); |
1610 ASSERT(function_id != -1); | 1720 ASSERT(function_id != -1); |
1611 | 1721 |
1612 char buf[1024]; | 1722 char buf[1024]; |
1613 OS::SNPrint(buf, sizeof(buf), | 1723 OS::SNPrint(buf, sizeof(buf), |
1614 "[0, port, ['classes', '%" Pd "', 'functions'," | 1724 "[0, port, ['classes', '%" Pd "', 'functions'," |
1615 "'% " Pd "', 'coverage'], [], []]", i, function_id); | 1725 "'% " Pd "', 'coverage'], [], []]", i, function_id); |
1616 | 1726 |
1617 Array& service_msg = Array::Handle(); | 1727 Array& service_msg = Array::Handle(); |
1618 service_msg = Eval(h_lib, buf); | 1728 service_msg = Eval(lib, buf); |
1619 Service::HandleIsolateMessage(isolate, service_msg); | 1729 Service::HandleIsolateMessage(isolate, service_msg); |
1620 handler.HandleNextMessage(); | 1730 handler.HandleNextMessage(); |
1621 OS::SNPrint(buf, sizeof(buf), | 1731 OS::SNPrint(buf, sizeof(buf), |
1622 "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":[" | 1732 "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":[" |
1623 "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\"," | 1733 "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\"," |
1624 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," | 1734 "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\"," |
1625 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," | 1735 "\"name\":\"test-lib\",\"user_name\":\"test-lib\"," |
1626 "\"kind\":\"script\"},\"hits\":[7,4,8,3]}]}", lib.index()); | 1736 "\"kind\":\"script\"},\"hits\":[7,4,8,3]}]}", vmlib.index()); |
1627 EXPECT_STREQ(buf, handler.msg()); | 1737 EXPECT_STREQ(buf, handler.msg()); |
1628 } | 1738 } |
1629 | 1739 |
1630 #endif | 1740 #endif |
1631 | 1741 |
1632 | 1742 |
1633 TEST_CASE(Service_AllocationProfile) { | 1743 TEST_CASE(Service_AllocationProfile) { |
1634 const char* kScript = | 1744 const char* kScript = |
1635 "var port;\n" // Set to our mock port by C++. | 1745 "var port;\n" // Set to our mock port by C++. |
1636 "\n" | 1746 "\n" |
1637 "var x = 7;\n" | 1747 "var x = 7;\n" |
1638 "main() {\n" | 1748 "main() {\n" |
1639 " x = x * x;\n" | 1749 " x = x * x;\n" |
1640 " x = x / 13;\n" | 1750 " x = x / 13;\n" |
1641 "}"; | 1751 "}"; |
1642 | 1752 |
1643 Isolate* isolate = Isolate::Current(); | 1753 Isolate* isolate = Isolate::Current(); |
1644 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 1754 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1645 EXPECT_VALID(h_lib); | 1755 EXPECT_VALID(lib); |
1646 Library& lib = Library::Handle(); | 1756 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
1647 lib ^= Api::UnwrapHandle(h_lib); | |
1648 EXPECT(!lib.IsNull()); | |
1649 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); | |
1650 EXPECT_VALID(result); | 1757 EXPECT_VALID(result); |
1651 | 1758 |
1652 // Build a mock message handler and wrap it in a dart port. | 1759 // Build a mock message handler and wrap it in a dart port. |
1653 ServiceTestMessageHandler handler; | 1760 ServiceTestMessageHandler handler; |
1654 Dart_Port port_id = PortMap::CreatePort(&handler); | 1761 Dart_Port port_id = PortMap::CreatePort(&handler); |
1655 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 1762 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
1656 EXPECT_VALID(port); | 1763 EXPECT_VALID(port); |
1657 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 1764 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
1658 | 1765 |
1659 Array& service_msg = Array::Handle(); | 1766 Array& service_msg = Array::Handle(); |
1660 service_msg = Eval(h_lib, "[0, port, ['allocationprofile'], [], []]"); | 1767 service_msg = Eval(lib, "[0, port, ['allocationprofile'], [], []]"); |
1661 Service::HandleIsolateMessage(isolate, service_msg); | 1768 Service::HandleIsolateMessage(isolate, service_msg); |
1662 handler.HandleNextMessage(); | 1769 handler.HandleNextMessage(); |
1663 EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg()); | 1770 EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg()); |
1664 | 1771 |
1665 // Too long. | 1772 // Too long. |
1666 service_msg = Eval(h_lib, "[0, port, ['allocationprofile', 'foo'], [], []]"); | 1773 service_msg = Eval(lib, "[0, port, ['allocationprofile', 'foo'], [], []]"); |
1667 Service::HandleIsolateMessage(isolate, service_msg); | 1774 Service::HandleIsolateMessage(isolate, service_msg); |
1668 handler.HandleNextMessage(); | 1775 handler.HandleNextMessage(); |
1669 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 1776 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); |
1670 | 1777 |
1671 // Bad gc option. | 1778 // Bad gc option. |
1672 service_msg = Eval(h_lib, | 1779 service_msg = Eval(lib, |
1673 "[0, port, ['allocationprofile'], ['gc'], ['cat']]"); | 1780 "[0, port, ['allocationprofile'], ['gc'], ['cat']]"); |
1674 Service::HandleIsolateMessage(isolate, service_msg); | 1781 Service::HandleIsolateMessage(isolate, service_msg); |
1675 handler.HandleNextMessage(); | 1782 handler.HandleNextMessage(); |
1676 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 1783 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); |
1677 | 1784 |
1678 // Bad reset option. | 1785 // Bad reset option. |
1679 service_msg = Eval(h_lib, | 1786 service_msg = Eval(lib, |
1680 "[0, port, ['allocationprofile'], ['reset'], ['ff']]"); | 1787 "[0, port, ['allocationprofile'], ['reset'], ['ff']]"); |
1681 Service::HandleIsolateMessage(isolate, service_msg); | 1788 Service::HandleIsolateMessage(isolate, service_msg); |
1682 handler.HandleNextMessage(); | 1789 handler.HandleNextMessage(); |
1683 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 1790 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); |
1684 | 1791 |
1685 // Good reset. | 1792 // Good reset. |
1686 service_msg = | 1793 service_msg = |
1687 Eval(h_lib, "[0, port, ['allocationprofile'], ['reset'], ['true']]"); | 1794 Eval(lib, "[0, port, ['allocationprofile'], ['reset'], ['true']]"); |
1688 Service::HandleIsolateMessage(isolate, service_msg); | 1795 Service::HandleIsolateMessage(isolate, service_msg); |
1689 handler.HandleNextMessage(); | 1796 handler.HandleNextMessage(); |
1690 EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg()); | 1797 EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg()); |
1691 | 1798 |
1692 // Good GC. | 1799 // Good GC. |
1693 service_msg = | 1800 service_msg = |
1694 Eval(h_lib, "[0, port, ['allocationprofile'], ['gc'], ['full']]"); | 1801 Eval(lib, "[0, port, ['allocationprofile'], ['gc'], ['full']]"); |
1695 Service::HandleIsolateMessage(isolate, service_msg); | 1802 Service::HandleIsolateMessage(isolate, service_msg); |
1696 handler.HandleNextMessage(); | 1803 handler.HandleNextMessage(); |
1697 EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg()); | 1804 EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg()); |
1698 | 1805 |
1699 // Good GC and reset. | 1806 // Good GC and reset. |
1700 service_msg = Eval(h_lib, | 1807 service_msg = Eval(lib, |
1701 "[0, port, ['allocationprofile'], ['gc', 'reset'], ['full', 'true']]"); | 1808 "[0, port, ['allocationprofile'], ['gc', 'reset'], ['full', 'true']]"); |
1702 Service::HandleIsolateMessage(isolate, service_msg); | 1809 Service::HandleIsolateMessage(isolate, service_msg); |
1703 handler.HandleNextMessage(); | 1810 handler.HandleNextMessage(); |
1704 EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg()); | 1811 EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg()); |
1705 } | 1812 } |
1706 | 1813 |
1707 | 1814 |
1708 TEST_CASE(Service_HeapMap) { | 1815 TEST_CASE(Service_HeapMap) { |
1709 const char* kScript = | 1816 const char* kScript = |
1710 "var port;\n" // Set to our mock port by C++. | 1817 "var port;\n" // Set to our mock port by C++. |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1884 const char* kScript = | 1991 const char* kScript = |
1885 "var port;\n" // Set to our mock port by C++. | 1992 "var port;\n" // Set to our mock port by C++. |
1886 "\n" | 1993 "\n" |
1887 "var x = 7;\n" | 1994 "var x = 7;\n" |
1888 "main() {\n" | 1995 "main() {\n" |
1889 " x = x * x;\n" | 1996 " x = x * x;\n" |
1890 " x = x / 13;\n" | 1997 " x = x / 13;\n" |
1891 "}"; | 1998 "}"; |
1892 | 1999 |
1893 Isolate* isolate = Isolate::Current(); | 2000 Isolate* isolate = Isolate::Current(); |
1894 Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL); | 2001 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL); |
1895 EXPECT_VALID(h_lib); | 2002 EXPECT_VALID(lib); |
1896 Library& lib = Library::Handle(); | 2003 Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL); |
1897 lib ^= Api::UnwrapHandle(h_lib); | |
1898 EXPECT(!lib.IsNull()); | |
1899 Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL); | |
1900 EXPECT_VALID(result); | 2004 EXPECT_VALID(result); |
1901 | 2005 |
1902 // Build a mock message handler and wrap it in a dart port. | 2006 // Build a mock message handler and wrap it in a dart port. |
1903 ServiceTestMessageHandler handler; | 2007 ServiceTestMessageHandler handler; |
1904 Dart_Port port_id = PortMap::CreatePort(&handler); | 2008 Dart_Port port_id = PortMap::CreatePort(&handler); |
1905 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 2009 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
1906 EXPECT_VALID(port); | 2010 EXPECT_VALID(port); |
1907 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 2011 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
1908 | 2012 |
1909 Array& service_msg = Array::Handle(); | 2013 Array& service_msg = Array::Handle(); |
1910 service_msg = Eval(h_lib, "[0, port, ['profile'], [], []]"); | 2014 service_msg = Eval(lib, "[0, port, ['profile'], [], []]"); |
1911 Service::HandleIsolateMessage(isolate, service_msg); | 2015 Service::HandleIsolateMessage(isolate, service_msg); |
1912 handler.HandleNextMessage(); | 2016 handler.HandleNextMessage(); |
1913 // Expect profile | 2017 // Expect profile |
1914 EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg()); | 2018 EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg()); |
1915 | 2019 |
1916 service_msg = Eval(h_lib, "[0, port, ['profile'], ['tags'], ['hide']]"); | 2020 service_msg = Eval(lib, "[0, port, ['profile'], ['tags'], ['hide']]"); |
1917 Service::HandleIsolateMessage(isolate, service_msg); | 2021 Service::HandleIsolateMessage(isolate, service_msg); |
1918 handler.HandleNextMessage(); | 2022 handler.HandleNextMessage(); |
1919 // Expect profile | 2023 // Expect profile |
1920 EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg()); | 2024 EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg()); |
1921 | 2025 |
1922 service_msg = Eval(h_lib, "[0, port, ['profile'], ['tags'], ['hidden']]"); | 2026 service_msg = Eval(lib, "[0, port, ['profile'], ['tags'], ['hidden']]"); |
1923 Service::HandleIsolateMessage(isolate, service_msg); | 2027 Service::HandleIsolateMessage(isolate, service_msg); |
1924 handler.HandleNextMessage(); | 2028 handler.HandleNextMessage(); |
1925 // Expect error. | 2029 // Expect error. |
1926 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 2030 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); |
1927 } | 2031 } |
1928 | 2032 |
1929 #endif // !defined(TARGET_ARCH_ARM64) | 2033 #endif // !defined(TARGET_ARCH_ARM64) |
1930 | 2034 |
1931 } // namespace dart | 2035 } // namespace dart |
OLD | NEW |