| 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 "include/dart_debugger_api.h" | 5 #include "include/dart_debugger_api.h" |
| 6 #include "vm/dart_api_impl.h" | 6 #include "vm/dart_api_impl.h" |
| 7 #include "vm/dart_entry.h" | 7 #include "vm/dart_entry.h" |
| 8 #include "vm/debugger.h" | 8 #include "vm/debugger.h" |
| 9 #include "vm/globals.h" | 9 #include "vm/globals.h" |
| 10 #include "vm/message_handler.h" | 10 #include "vm/message_handler.h" |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 | 370 |
| 371 Instance& service_msg = Instance::Handle(); | 371 Instance& service_msg = Instance::Handle(); |
| 372 | 372 |
| 373 // null | 373 // null |
| 374 service_msg = Eval(lib, "[port, ['objects', 'null'], [], []]"); | 374 service_msg = Eval(lib, "[port, ['objects', 'null'], [], []]"); |
| 375 Service::HandleIsolateMessage(isolate, service_msg); | 375 Service::HandleIsolateMessage(isolate, service_msg); |
| 376 handler.HandleNextMessage(); | 376 handler.HandleNextMessage(); |
| 377 handler.filterMsg("name"); | 377 handler.filterMsg("name"); |
| 378 EXPECT_STREQ( | 378 EXPECT_STREQ( |
| 379 "{\"type\":\"Null\",\"id\":\"objects\\/null\"," | 379 "{\"type\":\"Null\",\"id\":\"objects\\/null\"," |
| 380 "\"preview\":\"null\"}", | 380 "\"valueAsString\":\"null\"}", |
| 381 handler.msg()); | 381 handler.msg()); |
| 382 | 382 |
| 383 // not initialized | 383 // not initialized |
| 384 service_msg = Eval(lib, "[port, ['objects', 'not-initialized'], [], []]"); | 384 service_msg = Eval(lib, "[port, ['objects', 'not-initialized'], [], []]"); |
| 385 Service::HandleIsolateMessage(isolate, service_msg); | 385 Service::HandleIsolateMessage(isolate, service_msg); |
| 386 handler.HandleNextMessage(); | 386 handler.HandleNextMessage(); |
| 387 handler.filterMsg("name"); | 387 handler.filterMsg("name"); |
| 388 EXPECT_STREQ( | 388 EXPECT_STREQ( |
| 389 "{\"type\":\"Null\",\"id\":\"objects\\/not-initialized\"," | 389 "{\"type\":\"Null\",\"id\":\"objects\\/not-initialized\"," |
| 390 "\"preview\":\"<not initialized>\"}", | 390 "\"valueAsString\":\"<not initialized>\"}", |
| 391 handler.msg()); | 391 handler.msg()); |
| 392 | 392 |
| 393 // being initialized | 393 // being initialized |
| 394 service_msg = Eval(lib, "[port, ['objects', 'being-initialized'], [], []]"); | 394 service_msg = Eval(lib, "[port, ['objects', 'being-initialized'], [], []]"); |
| 395 Service::HandleIsolateMessage(isolate, service_msg); | 395 Service::HandleIsolateMessage(isolate, service_msg); |
| 396 handler.HandleNextMessage(); | 396 handler.HandleNextMessage(); |
| 397 handler.filterMsg("name"); | 397 handler.filterMsg("name"); |
| 398 EXPECT_STREQ( | 398 EXPECT_STREQ( |
| 399 "{\"type\":\"Null\",\"id\":\"objects\\/being-initialized\"," | 399 "{\"type\":\"Null\",\"id\":\"objects\\/being-initialized\"," |
| 400 "\"preview\":\"<being initialized>\"}", | 400 "\"valueAsString\":\"<being initialized>\"}", |
| 401 handler.msg()); | 401 handler.msg()); |
| 402 | 402 |
| 403 // optimized out | 403 // optimized out |
| 404 service_msg = Eval(lib, "[port, ['objects', 'optimized-out'], [], []]"); | 404 service_msg = Eval(lib, "[port, ['objects', 'optimized-out'], [], []]"); |
| 405 Service::HandleIsolateMessage(isolate, service_msg); | 405 Service::HandleIsolateMessage(isolate, service_msg); |
| 406 handler.HandleNextMessage(); | 406 handler.HandleNextMessage(); |
| 407 handler.filterMsg("name"); | 407 handler.filterMsg("name"); |
| 408 EXPECT_STREQ( | 408 EXPECT_STREQ( |
| 409 "{\"type\":\"Null\",\"id\":\"objects\\/optimized-out\"," | 409 "{\"type\":\"Null\",\"id\":\"objects\\/optimized-out\"," |
| 410 "\"preview\":\"<optimized out>\"}", | 410 "\"valueAsString\":\"<optimized out>\"}", |
| 411 handler.msg()); | 411 handler.msg()); |
| 412 | 412 |
| 413 // collected | 413 // collected |
| 414 service_msg = Eval(lib, "[port, ['objects', 'collected'], [], []]"); | 414 service_msg = Eval(lib, "[port, ['objects', 'collected'], [], []]"); |
| 415 Service::HandleIsolateMessage(isolate, service_msg); | 415 Service::HandleIsolateMessage(isolate, service_msg); |
| 416 handler.HandleNextMessage(); | 416 handler.HandleNextMessage(); |
| 417 handler.filterMsg("name"); | 417 handler.filterMsg("name"); |
| 418 EXPECT_STREQ( | 418 EXPECT_STREQ( |
| 419 "{\"type\":\"Null\",\"id\":\"objects\\/collected\"," | 419 "{\"type\":\"Null\",\"id\":\"objects\\/collected\"," |
| 420 "\"preview\":\"<collected>\"}", | 420 "\"valueAsString\":\"<collected>\"}", |
| 421 handler.msg()); | 421 handler.msg()); |
| 422 | 422 |
| 423 // expired | 423 // expired |
| 424 service_msg = Eval(lib, "[port, ['objects', 'expired'], [], []]"); | 424 service_msg = Eval(lib, "[port, ['objects', 'expired'], [], []]"); |
| 425 Service::HandleIsolateMessage(isolate, service_msg); | 425 Service::HandleIsolateMessage(isolate, service_msg); |
| 426 handler.HandleNextMessage(); | 426 handler.HandleNextMessage(); |
| 427 handler.filterMsg("name"); | 427 handler.filterMsg("name"); |
| 428 EXPECT_STREQ( | 428 EXPECT_STREQ( |
| 429 "{\"type\":\"Null\",\"id\":\"objects\\/expired\"," | 429 "{\"type\":\"Null\",\"id\":\"objects\\/expired\"," |
| 430 "\"preview\":\"<expired>\"}", | 430 "\"valueAsString\":\"<expired>\"}", |
| 431 handler.msg()); | 431 handler.msg()); |
| 432 | 432 |
| 433 // bool | 433 // bool |
| 434 service_msg = Eval(lib, "[port, ['objects', 'bool-true'], [], []]"); | 434 service_msg = Eval(lib, "[port, ['objects', 'bool-true'], [], []]"); |
| 435 Service::HandleIsolateMessage(isolate, service_msg); | 435 Service::HandleIsolateMessage(isolate, service_msg); |
| 436 handler.HandleNextMessage(); | 436 handler.HandleNextMessage(); |
| 437 handler.filterMsg("name"); | 437 handler.filterMsg("name"); |
| 438 EXPECT_STREQ( | 438 EXPECT_STREQ( |
| 439 "{\"type\":\"Bool\",\"id\":\"objects\\/bool-true\"," | 439 "{\"type\":\"Bool\",\"id\":\"objects\\/bool-true\"," |
| 440 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/46\"," | 440 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/46\"," |
| 441 "\"user_name\":\"bool\"},\"preview\":\"true\"}", | 441 "\"user_name\":\"bool\"},\"valueAsString\":\"true\"}", |
| 442 handler.msg()); | 442 handler.msg()); |
| 443 | 443 |
| 444 // int | 444 // int |
| 445 service_msg = Eval(lib, "[port, ['objects', 'int-123'], [], []]"); | 445 service_msg = Eval(lib, "[port, ['objects', 'int-123'], [], []]"); |
| 446 Service::HandleIsolateMessage(isolate, service_msg); | 446 Service::HandleIsolateMessage(isolate, service_msg); |
| 447 handler.HandleNextMessage(); | 447 handler.HandleNextMessage(); |
| 448 handler.filterMsg("name"); | 448 handler.filterMsg("name"); |
| 449 EXPECT_STREQ( | 449 EXPECT_STREQ( |
| 450 "{\"type\":\"Smi\",\"id\":\"objects\\/int-123\"," | 450 "{\"type\":\"Smi\"," |
| 451 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," | 451 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," |
| 452 "\"user_name\":\"int\"},\"preview\":\"123\"}", | 452 "\"user_name\":\"int\"}," |
| 453 "\"fields\":[]," |
| 454 "\"id\":\"objects\\/int-123\"," |
| 455 "\"valueAsString\":\"123\"}", |
| 453 handler.msg()); | 456 handler.msg()); |
| 454 | 457 |
| 455 // object id ring / valid | 458 // object id ring / valid |
| 456 service_msg = Eval(lib, "[port, ['objects', '$validId'], [], []]"); | 459 service_msg = Eval(lib, "[port, ['objects', '$validId'], [], []]"); |
| 457 Service::HandleIsolateMessage(isolate, service_msg); | 460 Service::HandleIsolateMessage(isolate, service_msg); |
| 458 handler.HandleNextMessage(); | 461 handler.HandleNextMessage(); |
| 459 handler.filterMsg("name"); | 462 handler.filterMsg("name"); |
| 460 handler.filterMsg("size"); | 463 handler.filterMsg("size"); |
| 464 handler.filterMsg("id"); |
| 461 EXPECT_STREQ( | 465 EXPECT_STREQ( |
| 462 "{\"type\":\"String\"," | 466 "{\"type\":\"String\"," |
| 463 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/60\"," | 467 "\"class\":{\"type\":\"@Class\"," |
| 464 "\"user_name\":\"String\"},\"fields\":[]," | 468 "\"user_name\":\"String\"},\"fields\":[]," |
| 465 "\"id\":\"objects\\/1\",\"preview\":\"\\\"value\\\"\"}", | 469 "\"valueAsString\":\"\\\"value\\\"\"}", |
| 466 handler.msg()); | 470 handler.msg()); |
| 467 | 471 |
| 468 // object id ring / invalid => expired | 472 // object id ring / invalid => expired |
| 469 service_msg = Eval(lib, "[port, ['objects', '99999999'], [], []]"); | 473 service_msg = Eval(lib, "[port, ['objects', '99999999'], [], []]"); |
| 470 Service::HandleIsolateMessage(isolate, service_msg); | 474 Service::HandleIsolateMessage(isolate, service_msg); |
| 471 handler.HandleNextMessage(); | 475 handler.HandleNextMessage(); |
| 472 handler.filterMsg("name"); | 476 handler.filterMsg("name"); |
| 473 EXPECT_STREQ( | 477 EXPECT_STREQ( |
| 474 "{\"type\":\"Null\",\"id\":\"objects\\/expired\"," | 478 "{\"type\":\"Null\",\"id\":\"objects\\/expired\"," |
| 475 "\"preview\":\"<expired>\"}", | 479 "\"valueAsString\":\"<expired>\"}", |
| 476 handler.msg()); | 480 handler.msg()); |
| 477 | 481 |
| 478 // expired/eval => error | 482 // expired/eval => error |
| 479 service_msg = Eval(lib, "[port, ['objects', 'expired', 'eval'], [], []]"); | 483 service_msg = Eval(lib, "[port, ['objects', 'expired', 'eval'], [], []]"); |
| 480 Service::HandleIsolateMessage(isolate, service_msg); | 484 Service::HandleIsolateMessage(isolate, service_msg); |
| 481 handler.HandleNextMessage(); | 485 handler.HandleNextMessage(); |
| 482 handler.filterMsg("name"); | 486 handler.filterMsg("name"); |
| 483 EXPECT_STREQ( | 487 EXPECT_STREQ( |
| 484 "{\"type\":\"Error\",\"id\":\"\"," | 488 "{\"type\":\"Error\",\"id\":\"\"," |
| 485 "\"message\":\"expected at most 2 arguments but found 3\\n\"," | 489 "\"message\":\"expected at most 2 arguments but found 3\\n\"," |
| 486 "\"request\":{\"arguments\":[\"objects\",\"expired\",\"eval\"]," | 490 "\"request\":{\"arguments\":[\"objects\",\"expired\",\"eval\"]," |
| 487 "\"option_keys\":[],\"option_values\":[]}}", | 491 "\"option_keys\":[],\"option_values\":[]}}", |
| 488 handler.msg()); | 492 handler.msg()); |
| 489 | 493 |
| 490 // int/eval => good | 494 // int/eval => good |
| 491 service_msg = Eval(lib, | 495 service_msg = Eval(lib, |
| 492 "[port, ['objects', 'int-123', 'eval'], " | 496 "[port, ['objects', 'int-123', 'eval'], " |
| 493 "['expr'], ['this+99']]"); | 497 "['expr'], ['this+99']]"); |
| 494 Service::HandleIsolateMessage(isolate, service_msg); | 498 Service::HandleIsolateMessage(isolate, service_msg); |
| 495 handler.HandleNextMessage(); | 499 handler.HandleNextMessage(); |
| 496 handler.filterMsg("name"); | 500 handler.filterMsg("name"); |
| 497 EXPECT_STREQ( | 501 EXPECT_STREQ( |
| 498 "{\"type\":\"@Smi\",\"id\":\"objects\\/int-222\"," | 502 "{\"type\":\"@Smi\"," |
| 499 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," | 503 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," |
| 500 "\"user_name\":\"int\"},\"preview\":\"222\"}", | 504 "\"user_name\":\"int\"}," |
| 505 "\"id\":\"objects\\/int-222\"," |
| 506 "\"valueAsString\":\"222\"}", |
| 501 handler.msg()); | 507 handler.msg()); |
| 502 | 508 |
| 503 // eval returning null works | 509 // eval returning null works |
| 504 service_msg = Eval(lib, | 510 service_msg = Eval(lib, |
| 505 "[port, ['objects', 'int-123', 'eval'], " | 511 "[port, ['objects', 'int-123', 'eval'], " |
| 506 "['expr'], ['null']]"); | 512 "['expr'], ['null']]"); |
| 507 Service::HandleIsolateMessage(isolate, service_msg); | 513 Service::HandleIsolateMessage(isolate, service_msg); |
| 508 handler.HandleNextMessage(); | 514 handler.HandleNextMessage(); |
| 509 handler.filterMsg("name"); | 515 handler.filterMsg("name"); |
| 510 EXPECT_STREQ( | 516 EXPECT_STREQ( |
| 511 "{\"type\":\"@Null\",\"id\":\"objects\\/null\",\"preview\":\"null\"}", | 517 "{\"type\":\"@Null\",\"id\":\"objects\\/null\"," |
| 518 "\"valueAsString\":\"null\"}", |
| 512 handler.msg()); | 519 handler.msg()); |
| 513 | 520 |
| 514 // object id ring / invalid => expired | 521 // object id ring / invalid => expired |
| 515 service_msg = Eval(lib, "[port, ['objects', '99999999', 'eval'], " | 522 service_msg = Eval(lib, "[port, ['objects', '99999999', 'eval'], " |
| 516 "['expr'], ['this']]"); | 523 "['expr'], ['this']]"); |
| 517 Service::HandleIsolateMessage(isolate, service_msg); | 524 Service::HandleIsolateMessage(isolate, service_msg); |
| 518 handler.HandleNextMessage(); | 525 handler.HandleNextMessage(); |
| 519 handler.filterMsg("name"); | 526 handler.filterMsg("name"); |
| 520 EXPECT_STREQ( | 527 EXPECT_STREQ( |
| 521 "{\"type\":\"Error\",\"id\":\"\",\"kind\":\"EvalExpired\"," | 528 "{\"type\":\"Error\",\"id\":\"\",\"kind\":\"EvalExpired\"," |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 EXPECT_SUBSTRING("\"url\":\"dart:test-lib\"", handler.msg()); | 592 EXPECT_SUBSTRING("\"url\":\"dart:test-lib\"", handler.msg()); |
| 586 | 593 |
| 587 // Evaluate an expression from a library. | 594 // Evaluate an expression from a library. |
| 588 service_msg = EvalF(h_lib, | 595 service_msg = EvalF(h_lib, |
| 589 "[port, ['libraries', '%" Pd "', 'eval'], " | 596 "[port, ['libraries', '%" Pd "', 'eval'], " |
| 590 "['expr'], ['libVar - 1']]", lib_id); | 597 "['expr'], ['libVar - 1']]", lib_id); |
| 591 Service::HandleIsolateMessage(isolate, service_msg); | 598 Service::HandleIsolateMessage(isolate, service_msg); |
| 592 handler.HandleNextMessage(); | 599 handler.HandleNextMessage(); |
| 593 handler.filterMsg("name"); | 600 handler.filterMsg("name"); |
| 594 EXPECT_STREQ( | 601 EXPECT_STREQ( |
| 595 "{\"type\":\"@Smi\",\"id\":\"objects\\/int-54320\"," | 602 "{\"type\":\"@Smi\"," |
| 596 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," | 603 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," |
| 597 "\"user_name\":\"int\"},\"preview\":\"54320\"}", | 604 "\"user_name\":\"int\"},\"id\":\"objects\\/int-54320\"," |
| 605 "\"valueAsString\":\"54320\"}", |
| 598 handler.msg()); | 606 handler.msg()); |
| 599 } | 607 } |
| 600 | 608 |
| 601 | 609 |
| 602 TEST_CASE(Service_Classes) { | 610 TEST_CASE(Service_Classes) { |
| 603 const char* kScript = | 611 const char* kScript = |
| 604 "var port;\n" // Set to our mock port by C++. | 612 "var port;\n" // Set to our mock port by C++. |
| 605 "\n" | 613 "\n" |
| 606 "class A {\n" | 614 "class A {\n" |
| 607 " var a;\n" | 615 " var a;\n" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid); | 667 "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid); |
| 660 | 668 |
| 661 // Evaluate an expression from class A. | 669 // Evaluate an expression from class A. |
| 662 service_msg = EvalF(h_lib, | 670 service_msg = EvalF(h_lib, |
| 663 "[port, ['classes', '%" Pd "', 'eval'], " | 671 "[port, ['classes', '%" Pd "', 'eval'], " |
| 664 "['expr'], ['cobra + 100000']]", cid); | 672 "['expr'], ['cobra + 100000']]", cid); |
| 665 Service::HandleIsolateMessage(isolate, service_msg); | 673 Service::HandleIsolateMessage(isolate, service_msg); |
| 666 handler.HandleNextMessage(); | 674 handler.HandleNextMessage(); |
| 667 handler.filterMsg("name"); | 675 handler.filterMsg("name"); |
| 668 EXPECT_STREQ( | 676 EXPECT_STREQ( |
| 669 "{\"type\":\"@Smi\",\"id\":\"objects\\/int-111235\"," | 677 "{\"type\":\"@Smi\"," |
| 670 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," | 678 "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\"," |
| 671 "\"user_name\":\"int\"},\"preview\":\"111235\"}", | 679 "\"user_name\":\"int\"}," |
| 680 "\"id\":\"objects\\/int-111235\"," |
| 681 "\"valueAsString\":\"111235\"}", |
| 672 handler.msg()); | 682 handler.msg()); |
| 673 | 683 |
| 674 // Request function 0 from class A. | 684 // Request function 0 from class A. |
| 675 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '0']," | 685 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '0']," |
| 676 "[], []]", cid); | 686 "[], []]", cid); |
| 677 Service::HandleIsolateMessage(isolate, service_msg); | 687 Service::HandleIsolateMessage(isolate, service_msg); |
| 678 handler.HandleNextMessage(); | 688 handler.HandleNextMessage(); |
| 679 EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg()); | 689 EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg()); |
| 680 ExpectSubstringF(handler.msg(), | 690 ExpectSubstringF(handler.msg(), |
| 681 "\"id\":\"classes\\/%" Pd "\\/functions\\/0\"," | 691 "\"id\":\"classes\\/%" Pd "\\/functions\\/0\"," |
| (...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1320 EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg()); | 1330 EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg()); |
| 1321 | 1331 |
| 1322 service_msg = Eval(h_lib, "[port, ['profile'], ['tags'], ['hidden']]"); | 1332 service_msg = Eval(h_lib, "[port, ['profile'], ['tags'], ['hidden']]"); |
| 1323 Service::HandleIsolateMessage(isolate, service_msg); | 1333 Service::HandleIsolateMessage(isolate, service_msg); |
| 1324 handler.HandleNextMessage(); | 1334 handler.HandleNextMessage(); |
| 1325 // Expect error. | 1335 // Expect error. |
| 1326 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); | 1336 EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg()); |
| 1327 } | 1337 } |
| 1328 | 1338 |
| 1329 } // namespace dart | 1339 } // namespace dart |
| OLD | NEW |