| 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_tools_api.h" | 7 #include "include/dart_tools_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 11 matching lines...) Expand all Loading... |
| 22 DEFINE_FLAG(bool, service_testing_flag, false, "Comment"); | 22 DEFINE_FLAG(bool, service_testing_flag, false, "Comment"); |
| 23 | 23 |
| 24 class ServiceTestMessageHandler : public MessageHandler { | 24 class ServiceTestMessageHandler : public MessageHandler { |
| 25 public: | 25 public: |
| 26 ServiceTestMessageHandler() : _msg(NULL) {} | 26 ServiceTestMessageHandler() : _msg(NULL) {} |
| 27 | 27 |
| 28 ~ServiceTestMessageHandler() { | 28 ~ServiceTestMessageHandler() { |
| 29 free(_msg); | 29 free(_msg); |
| 30 } | 30 } |
| 31 | 31 |
| 32 bool HandleMessage(Message* message) { | 32 MessageStatus HandleMessage(Message* message) { |
| 33 if (_msg != NULL) { | 33 if (_msg != NULL) { |
| 34 free(_msg); | 34 free(_msg); |
| 35 } | 35 } |
| 36 | 36 |
| 37 // Parse the message. | 37 // Parse the message. |
| 38 Thread* thread = Thread::Current(); | 38 Thread* thread = Thread::Current(); |
| 39 MessageSnapshotReader reader(message->data(), message->len(), thread); | 39 MessageSnapshotReader reader(message->data(), message->len(), thread); |
| 40 const Object& response_obj = Object::Handle(reader.ReadObject()); | 40 const Object& response_obj = Object::Handle(reader.ReadObject()); |
| 41 String& response = String::Handle(); | 41 String& response = String::Handle(); |
| 42 response ^= response_obj.raw(); | 42 response ^= response_obj.raw(); |
| 43 _msg = strdup(response.ToCString()); | 43 _msg = strdup(response.ToCString()); |
| 44 return true; | 44 return kOK; |
| 45 } | 45 } |
| 46 | 46 |
| 47 const char* msg() const { return _msg; } | 47 const char* msg() const { return _msg; } |
| 48 | 48 |
| 49 private: | 49 private: |
| 50 char* _msg; | 50 char* _msg; |
| 51 }; | 51 }; |
| 52 | 52 |
| 53 | 53 |
| 54 static RawArray* Eval(Dart_Handle lib, const char* expr) { | 54 static RawArray* Eval(Dart_Handle lib, const char* expr) { |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 184 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
| 185 EXPECT_VALID(port); | 185 EXPECT_VALID(port); |
| 186 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 186 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 187 | 187 |
| 188 Array& service_msg = Array::Handle(); | 188 Array& service_msg = Array::Handle(); |
| 189 | 189 |
| 190 // Request an invalid code object. | 190 // Request an invalid code object. |
| 191 service_msg = | 191 service_msg = |
| 192 Eval(lib, "[0, port, '0', 'getObject', ['objectId'], ['code/0']]"); | 192 Eval(lib, "[0, port, '0', 'getObject', ['objectId'], ['code/0']]"); |
| 193 Service::HandleIsolateMessage(isolate, service_msg); | 193 Service::HandleIsolateMessage(isolate, service_msg); |
| 194 handler.HandleNextMessage(); | 194 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 195 EXPECT_SUBSTRING("\"error\"", handler.msg()); | 195 EXPECT_SUBSTRING("\"error\"", handler.msg()); |
| 196 | 196 |
| 197 // The following test checks that a code object can be found only | 197 // The following test checks that a code object can be found only |
| 198 // at compile_timestamp()-code.EntryPoint(). | 198 // at compile_timestamp()-code.EntryPoint(). |
| 199 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 199 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |
| 200 "['objectId'], ['code/%" Px64"-%" Px "']]", | 200 "['objectId'], ['code/%" Px64"-%" Px "']]", |
| 201 compile_timestamp, | 201 compile_timestamp, |
| 202 entry); | 202 entry); |
| 203 Service::HandleIsolateMessage(isolate, service_msg); | 203 Service::HandleIsolateMessage(isolate, service_msg); |
| 204 handler.HandleNextMessage(); | 204 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 205 EXPECT_SUBSTRING("\"type\":\"Code\"", handler.msg()); | 205 EXPECT_SUBSTRING("\"type\":\"Code\"", handler.msg()); |
| 206 { | 206 { |
| 207 // Only perform a partial match. | 207 // Only perform a partial match. |
| 208 const intptr_t kBufferSize = 512; | 208 const intptr_t kBufferSize = 512; |
| 209 char buffer[kBufferSize]; | 209 char buffer[kBufferSize]; |
| 210 OS::SNPrint(buffer, kBufferSize-1, | 210 OS::SNPrint(buffer, kBufferSize-1, |
| 211 "\"fixedId\":true,\"id\":\"code\\/%" Px64 "-%" Px "\",", | 211 "\"fixedId\":true,\"id\":\"code\\/%" Px64 "-%" Px "\",", |
| 212 compile_timestamp, | 212 compile_timestamp, |
| 213 entry); | 213 entry); |
| 214 EXPECT_SUBSTRING(buffer, handler.msg()); | 214 EXPECT_SUBSTRING(buffer, handler.msg()); |
| 215 } | 215 } |
| 216 | 216 |
| 217 // Request code object at compile_timestamp-code.EntryPoint() + 16 | 217 // Request code object at compile_timestamp-code.EntryPoint() + 16 |
| 218 // Expect this to fail because the address is not the entry point. | 218 // Expect this to fail because the address is not the entry point. |
| 219 uintptr_t address = entry + 16; | 219 uintptr_t address = entry + 16; |
| 220 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 220 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |
| 221 "['objectId'], ['code/%" Px64"-%" Px "']]", | 221 "['objectId'], ['code/%" Px64"-%" Px "']]", |
| 222 compile_timestamp, | 222 compile_timestamp, |
| 223 address); | 223 address); |
| 224 Service::HandleIsolateMessage(isolate, service_msg); | 224 Service::HandleIsolateMessage(isolate, service_msg); |
| 225 handler.HandleNextMessage(); | 225 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 226 EXPECT_SUBSTRING("\"error\"", handler.msg()); | 226 EXPECT_SUBSTRING("\"error\"", handler.msg()); |
| 227 | 227 |
| 228 // Request code object at (compile_timestamp - 1)-code.EntryPoint() | 228 // Request code object at (compile_timestamp - 1)-code.EntryPoint() |
| 229 // Expect this to fail because the timestamp is wrong. | 229 // Expect this to fail because the timestamp is wrong. |
| 230 address = entry; | 230 address = entry; |
| 231 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 231 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |
| 232 "['objectId'], ['code/%" Px64"-%" Px "']]", | 232 "['objectId'], ['code/%" Px64"-%" Px "']]", |
| 233 compile_timestamp - 1, | 233 compile_timestamp - 1, |
| 234 address); | 234 address); |
| 235 Service::HandleIsolateMessage(isolate, service_msg); | 235 Service::HandleIsolateMessage(isolate, service_msg); |
| 236 handler.HandleNextMessage(); | 236 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 237 EXPECT_SUBSTRING("\"error\"", handler.msg()); | 237 EXPECT_SUBSTRING("\"error\"", handler.msg()); |
| 238 | 238 |
| 239 // Request native code at address. Expect the null code object back. | 239 // Request native code at address. Expect the null code object back. |
| 240 address = last; | 240 address = last; |
| 241 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 241 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |
| 242 "['objectId'], ['code/native-%" Px "']]", | 242 "['objectId'], ['code/native-%" Px "']]", |
| 243 address); | 243 address); |
| 244 Service::HandleIsolateMessage(isolate, service_msg); | 244 Service::HandleIsolateMessage(isolate, service_msg); |
| 245 handler.HandleNextMessage(); | 245 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 246 // TODO(turnidge): It is pretty broken to return an Instance here. Fix. | 246 // TODO(turnidge): It is pretty broken to return an Instance here. Fix. |
| 247 EXPECT_SUBSTRING("\"kind\":\"Null\"", | 247 EXPECT_SUBSTRING("\"kind\":\"Null\"", |
| 248 handler.msg()); | 248 handler.msg()); |
| 249 | 249 |
| 250 // Request malformed native code. | 250 // Request malformed native code. |
| 251 service_msg = EvalF(lib, "[0, port, '0', 'getObject', ['objectId'], " | 251 service_msg = EvalF(lib, "[0, port, '0', 'getObject', ['objectId'], " |
| 252 "['code/native%" Px "']]", | 252 "['code/native%" Px "']]", |
| 253 address); | 253 address); |
| 254 Service::HandleIsolateMessage(isolate, service_msg); | 254 Service::HandleIsolateMessage(isolate, service_msg); |
| 255 handler.HandleNextMessage(); | 255 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 256 EXPECT_SUBSTRING("\"error\"", handler.msg()); | 256 EXPECT_SUBSTRING("\"error\"", handler.msg()); |
| 257 } | 257 } |
| 258 | 258 |
| 259 | 259 |
| 260 TEST_CASE(Service_TokenStream) { | 260 TEST_CASE(Service_TokenStream) { |
| 261 const char* kScript = | 261 const char* kScript = |
| 262 "var port;\n" // Set to our mock port by C++. | 262 "var port;\n" // Set to our mock port by C++. |
| 263 "\n" | 263 "\n" |
| 264 "main() {\n" | 264 "main() {\n" |
| 265 "}"; | 265 "}"; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 288 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 288 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
| 289 EXPECT_VALID(port); | 289 EXPECT_VALID(port); |
| 290 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 290 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 291 | 291 |
| 292 Array& service_msg = Array::Handle(); | 292 Array& service_msg = Array::Handle(); |
| 293 | 293 |
| 294 // Fetch object. | 294 // Fetch object. |
| 295 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 295 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |
| 296 "['objectId'], ['objects/%" Pd "']]", id); | 296 "['objectId'], ['objects/%" Pd "']]", id); |
| 297 Service::HandleIsolateMessage(isolate, service_msg); | 297 Service::HandleIsolateMessage(isolate, service_msg); |
| 298 handler.HandleNextMessage(); | 298 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 299 | 299 |
| 300 // Check type. | 300 // Check type. |
| 301 EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); | 301 EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); |
| 302 EXPECT_SUBSTRING("\"_vmType\":\"TokenStream\"", handler.msg()); | 302 EXPECT_SUBSTRING("\"_vmType\":\"TokenStream\"", handler.msg()); |
| 303 // Check for members array. | 303 // Check for members array. |
| 304 EXPECT_SUBSTRING("\"members\":[", handler.msg()); | 304 EXPECT_SUBSTRING("\"members\":[", handler.msg()); |
| 305 } | 305 } |
| 306 | 306 |
| 307 | 307 |
| 308 TEST_CASE(Service_PcDescriptors) { | 308 TEST_CASE(Service_PcDescriptors) { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 350 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 350 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
| 351 EXPECT_VALID(port); | 351 EXPECT_VALID(port); |
| 352 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 352 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 353 | 353 |
| 354 Array& service_msg = Array::Handle(); | 354 Array& service_msg = Array::Handle(); |
| 355 | 355 |
| 356 // Fetch object. | 356 // Fetch object. |
| 357 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 357 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |
| 358 "['objectId'], ['objects/%" Pd "']]", id); | 358 "['objectId'], ['objects/%" Pd "']]", id); |
| 359 Service::HandleIsolateMessage(isolate, service_msg); | 359 Service::HandleIsolateMessage(isolate, service_msg); |
| 360 handler.HandleNextMessage(); | 360 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 361 // Check type. | 361 // Check type. |
| 362 EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); | 362 EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); |
| 363 EXPECT_SUBSTRING("\"_vmType\":\"PcDescriptors\"", handler.msg()); | 363 EXPECT_SUBSTRING("\"_vmType\":\"PcDescriptors\"", handler.msg()); |
| 364 // Check for members array. | 364 // Check for members array. |
| 365 EXPECT_SUBSTRING("\"members\":[", handler.msg()); | 365 EXPECT_SUBSTRING("\"members\":[", handler.msg()); |
| 366 } | 366 } |
| 367 | 367 |
| 368 | 368 |
| 369 TEST_CASE(Service_LocalVarDescriptors) { | 369 TEST_CASE(Service_LocalVarDescriptors) { |
| 370 const char* kScript = | 370 const char* kScript = |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 411 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
| 412 EXPECT_VALID(port); | 412 EXPECT_VALID(port); |
| 413 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 413 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 414 | 414 |
| 415 Array& service_msg = Array::Handle(); | 415 Array& service_msg = Array::Handle(); |
| 416 | 416 |
| 417 // Fetch object. | 417 // Fetch object. |
| 418 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " | 418 service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |
| 419 "['objectId'], ['objects/%" Pd "']]", id); | 419 "['objectId'], ['objects/%" Pd "']]", id); |
| 420 Service::HandleIsolateMessage(isolate, service_msg); | 420 Service::HandleIsolateMessage(isolate, service_msg); |
| 421 handler.HandleNextMessage(); | 421 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 422 // Check type. | 422 // Check type. |
| 423 EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); | 423 EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); |
| 424 EXPECT_SUBSTRING("\"_vmType\":\"LocalVarDescriptors\"", handler.msg()); | 424 EXPECT_SUBSTRING("\"_vmType\":\"LocalVarDescriptors\"", handler.msg()); |
| 425 // Check for members array. | 425 // Check for members array. |
| 426 EXPECT_SUBSTRING("\"members\":[", handler.msg()); | 426 EXPECT_SUBSTRING("\"members\":[", handler.msg()); |
| 427 } | 427 } |
| 428 | 428 |
| 429 | 429 |
| 430 TEST_CASE(Service_Address) { | 430 TEST_CASE(Service_Address) { |
| 431 const char* kScript = | 431 const char* kScript = |
| (...skipping 24 matching lines...) Expand all Loading... |
| 456 bool ref = offset % 2 == 0; | 456 bool ref = offset % 2 == 0; |
| 457 OS::SNPrint(buf, sizeof(buf), | 457 OS::SNPrint(buf, sizeof(buf), |
| 458 (ref | 458 (ref |
| 459 ? "[0, port, '0', '_getObjectByAddress', " | 459 ? "[0, port, '0', '_getObjectByAddress', " |
| 460 "['address', 'ref'], ['%" Px "', 'true']]" | 460 "['address', 'ref'], ['%" Px "', 'true']]" |
| 461 : "[0, port, '0', '_getObjectByAddress', " | 461 : "[0, port, '0', '_getObjectByAddress', " |
| 462 "['address'], ['%" Px "']]"), | 462 "['address'], ['%" Px "']]"), |
| 463 addr); | 463 addr); |
| 464 service_msg = Eval(lib, buf); | 464 service_msg = Eval(lib, buf); |
| 465 Service::HandleIsolateMessage(isolate, service_msg); | 465 Service::HandleIsolateMessage(isolate, service_msg); |
| 466 handler.HandleNextMessage(); | 466 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 467 EXPECT_SUBSTRING(ref ? "\"type\":\"@Instance\"" : | 467 EXPECT_SUBSTRING(ref ? "\"type\":\"@Instance\"" : |
| 468 "\"type\":\"Instance\"", | 468 "\"type\":\"Instance\"", |
| 469 handler.msg()); | 469 handler.msg()); |
| 470 EXPECT_SUBSTRING("\"kind\":\"String\"", handler.msg()); | 470 EXPECT_SUBSTRING("\"kind\":\"String\"", handler.msg()); |
| 471 EXPECT_SUBSTRING("foobar", handler.msg()); | 471 EXPECT_SUBSTRING("foobar", handler.msg()); |
| 472 } | 472 } |
| 473 // Expect null when no object is found. | 473 // Expect null when no object is found. |
| 474 service_msg = Eval(lib, "[0, port, '0', '_getObjectByAddress', " | 474 service_msg = Eval(lib, "[0, port, '0', '_getObjectByAddress', " |
| 475 "['address'], ['7']]"); | 475 "['address'], ['7']]"); |
| 476 Service::HandleIsolateMessage(isolate, service_msg); | 476 Service::HandleIsolateMessage(isolate, service_msg); |
| 477 handler.HandleNextMessage(); | 477 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 478 // TODO(turnidge): Should this be a ServiceException instead? | 478 // TODO(turnidge): Should this be a ServiceException instead? |
| 479 EXPECT_SUBSTRING("{\"type\":\"Sentinel\",\"kind\":\"Free\"," | 479 EXPECT_SUBSTRING("{\"type\":\"Sentinel\",\"kind\":\"Free\"," |
| 480 "\"valueAsString\":\"<free>\"", | 480 "\"valueAsString\":\"<free>\"", |
| 481 handler.msg()); | 481 handler.msg()); |
| 482 } | 482 } |
| 483 | 483 |
| 484 | 484 |
| 485 static const char* alpha_callback( | 485 static const char* alpha_callback( |
| 486 const char* name, | 486 const char* name, |
| 487 const char** option_keys, | 487 const char** option_keys, |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 525 ServiceTestMessageHandler handler; | 525 ServiceTestMessageHandler handler; |
| 526 Dart_Port port_id = PortMap::CreatePort(&handler); | 526 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 527 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 527 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
| 528 EXPECT_VALID(port); | 528 EXPECT_VALID(port); |
| 529 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 529 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 530 | 530 |
| 531 | 531 |
| 532 Array& service_msg = Array::Handle(); | 532 Array& service_msg = Array::Handle(); |
| 533 service_msg = Eval(lib, "[0, port, '\"', 'alpha', [], []]"); | 533 service_msg = Eval(lib, "[0, port, '\"', 'alpha', [], []]"); |
| 534 Service::HandleRootMessage(service_msg); | 534 Service::HandleRootMessage(service_msg); |
| 535 handler.HandleNextMessage(); | 535 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 536 EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":alpha,\"id\":\"\\\"\"}", | 536 EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":alpha,\"id\":\"\\\"\"}", |
| 537 handler.msg()); | 537 handler.msg()); |
| 538 service_msg = Eval(lib, "[0, port, 1, 'beta', [], []]"); | 538 service_msg = Eval(lib, "[0, port, 1, 'beta', [], []]"); |
| 539 Service::HandleRootMessage(service_msg); | 539 Service::HandleRootMessage(service_msg); |
| 540 handler.HandleNextMessage(); | 540 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 541 EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":beta,\"id\":1}", | 541 EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":beta,\"id\":1}", |
| 542 handler.msg()); | 542 handler.msg()); |
| 543 } | 543 } |
| 544 | 544 |
| 545 | 545 |
| 546 TEST_CASE(Service_EmbedderIsolateHandler) { | 546 TEST_CASE(Service_EmbedderIsolateHandler) { |
| 547 const char* kScript = | 547 const char* kScript = |
| 548 "var port;\n" // Set to our mock port by C++. | 548 "var port;\n" // Set to our mock port by C++. |
| 549 "\n" | 549 "\n" |
| 550 "var x = 7;\n" | 550 "var x = 7;\n" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 565 // Build a mock message handler and wrap it in a dart port. | 565 // Build a mock message handler and wrap it in a dart port. |
| 566 ServiceTestMessageHandler handler; | 566 ServiceTestMessageHandler handler; |
| 567 Dart_Port port_id = PortMap::CreatePort(&handler); | 567 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 568 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 568 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
| 569 EXPECT_VALID(port); | 569 EXPECT_VALID(port); |
| 570 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 570 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 571 | 571 |
| 572 Array& service_msg = Array::Handle(); | 572 Array& service_msg = Array::Handle(); |
| 573 service_msg = Eval(lib, "[0, port, '0', 'alpha', [], []]"); | 573 service_msg = Eval(lib, "[0, port, '0', 'alpha', [], []]"); |
| 574 Service::HandleIsolateMessage(isolate, service_msg); | 574 Service::HandleIsolateMessage(isolate, service_msg); |
| 575 handler.HandleNextMessage(); | 575 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 576 EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":alpha,\"id\":\"0\"}", | 576 EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":alpha,\"id\":\"0\"}", |
| 577 handler.msg()); | 577 handler.msg()); |
| 578 service_msg = Eval(lib, "[0, port, '0', 'beta', [], []]"); | 578 service_msg = Eval(lib, "[0, port, '0', 'beta', [], []]"); |
| 579 Service::HandleIsolateMessage(isolate, service_msg); | 579 Service::HandleIsolateMessage(isolate, service_msg); |
| 580 handler.HandleNextMessage(); | 580 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 581 EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":beta,\"id\":\"0\"}", | 581 EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":beta,\"id\":\"0\"}", |
| 582 handler.msg()); | 582 handler.msg()); |
| 583 } | 583 } |
| 584 | 584 |
| 585 // TODO(zra): Remove when tests are ready to enable. | 585 // TODO(zra): Remove when tests are ready to enable. |
| 586 #if !defined(TARGET_ARCH_ARM64) | 586 #if !defined(TARGET_ARCH_ARM64) |
| 587 | 587 |
| 588 TEST_CASE(Service_Profile) { | 588 TEST_CASE(Service_Profile) { |
| 589 const char* kScript = | 589 const char* kScript = |
| 590 "var port;\n" // Set to our mock port by C++. | 590 "var port;\n" // Set to our mock port by C++. |
| (...skipping 13 matching lines...) Expand all Loading... |
| 604 // Build a mock message handler and wrap it in a dart port. | 604 // Build a mock message handler and wrap it in a dart port. |
| 605 ServiceTestMessageHandler handler; | 605 ServiceTestMessageHandler handler; |
| 606 Dart_Port port_id = PortMap::CreatePort(&handler); | 606 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 607 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); | 607 Dart_Handle port = Api::NewHandle(isolate, SendPort::New(port_id)); |
| 608 EXPECT_VALID(port); | 608 EXPECT_VALID(port); |
| 609 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 609 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 610 | 610 |
| 611 Array& service_msg = Array::Handle(); | 611 Array& service_msg = Array::Handle(); |
| 612 service_msg = Eval(lib, "[0, port, '0', '_getCpuProfile', [], []]"); | 612 service_msg = Eval(lib, "[0, port, '0', '_getCpuProfile', [], []]"); |
| 613 Service::HandleIsolateMessage(isolate, service_msg); | 613 Service::HandleIsolateMessage(isolate, service_msg); |
| 614 handler.HandleNextMessage(); | 614 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 615 // Expect error (tags required). | 615 // Expect error (tags required). |
| 616 EXPECT_SUBSTRING("\"error\"", handler.msg()); | 616 EXPECT_SUBSTRING("\"error\"", handler.msg()); |
| 617 | 617 |
| 618 service_msg = | 618 service_msg = |
| 619 Eval(lib, "[0, port, '0', '_getCpuProfile', ['tags'], ['None']]"); | 619 Eval(lib, "[0, port, '0', '_getCpuProfile', ['tags'], ['None']]"); |
| 620 Service::HandleIsolateMessage(isolate, service_msg); | 620 Service::HandleIsolateMessage(isolate, service_msg); |
| 621 handler.HandleNextMessage(); | 621 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 622 // Expect profile | 622 // Expect profile |
| 623 EXPECT_SUBSTRING("\"type\":\"_CpuProfile\"", handler.msg()); | 623 EXPECT_SUBSTRING("\"type\":\"_CpuProfile\"", handler.msg()); |
| 624 | 624 |
| 625 service_msg = | 625 service_msg = |
| 626 Eval(lib, "[0, port, '0', '_getCpuProfile', ['tags'], ['Bogus']]"); | 626 Eval(lib, "[0, port, '0', '_getCpuProfile', ['tags'], ['Bogus']]"); |
| 627 Service::HandleIsolateMessage(isolate, service_msg); | 627 Service::HandleIsolateMessage(isolate, service_msg); |
| 628 handler.HandleNextMessage(); | 628 EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
| 629 // Expect error. | 629 // Expect error. |
| 630 EXPECT_SUBSTRING("\"error\"", handler.msg()); | 630 EXPECT_SUBSTRING("\"error\"", handler.msg()); |
| 631 } | 631 } |
| 632 | 632 |
| 633 #endif // !defined(TARGET_ARCH_ARM64) | 633 #endif // !defined(TARGET_ARCH_ARM64) |
| 634 | 634 |
| 635 } // namespace dart | 635 } // namespace dart |
| OLD | NEW |