| 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 27 matching lines...) Expand all Loading... |
| 38 return true; | 38 return true; |
| 39 } | 39 } |
| 40 | 40 |
| 41 const char* msg() const { return _msg; } | 41 const char* msg() const { return _msg; } |
| 42 | 42 |
| 43 private: | 43 private: |
| 44 char* _msg; | 44 char* _msg; |
| 45 }; | 45 }; |
| 46 | 46 |
| 47 | 47 |
| 48 static void ServiceIsolateMessage(Isolate* isolate, const Instance& msg) { |
| 49 NativeToVmTimerScope timer(isolate); |
| 50 Service::HandleIsolateMessage(isolate, msg); |
| 51 } |
| 52 |
| 53 |
| 48 static RawInstance* Eval(Dart_Handle lib, const char* expr) { | 54 static RawInstance* Eval(Dart_Handle lib, const char* expr) { |
| 49 Dart_Handle result = Dart_EvaluateExpr(lib, NewString(expr)); | 55 Dart_Handle result = Dart_EvaluateExpr(lib, NewString(expr)); |
| 50 EXPECT_VALID(result); | 56 EXPECT_VALID(result); |
| 51 Isolate* isolate = Isolate::Current(); | 57 Isolate* isolate = Isolate::Current(); |
| 52 const Instance& instance = Api::UnwrapInstanceHandle(isolate, result); | 58 const Instance& instance = Api::UnwrapInstanceHandle(isolate, result); |
| 53 return instance.raw(); | 59 return instance.raw(); |
| 54 } | 60 } |
| 55 | 61 |
| 56 | 62 |
| 57 static RawInstance* EvalF(Dart_Handle lib, const char* fmt, ...) { | 63 static RawInstance* EvalF(Dart_Handle lib, const char* fmt, ...) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 Dart_Port port_id = PortMap::CreatePort(&handler); | 129 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 124 Dart_Handle port = | 130 Dart_Handle port = |
| 125 Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); | 131 Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); |
| 126 EXPECT_VALID(port); | 132 EXPECT_VALID(port); |
| 127 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 133 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 128 | 134 |
| 129 Instance& service_msg = Instance::Handle(); | 135 Instance& service_msg = Instance::Handle(); |
| 130 | 136 |
| 131 // Get the isolate summary. | 137 // Get the isolate summary. |
| 132 service_msg = Eval(lib, "[port, [], [], []]"); | 138 service_msg = Eval(lib, "[port, [], [], []]"); |
| 133 Service::HandleIsolateMessage(isolate, service_msg); | 139 ServiceIsolateMessage(isolate, service_msg); |
| 134 handler.HandleNextMessage(); | 140 handler.HandleNextMessage(); |
| 135 | 141 |
| 136 JSONReader reader(handler.msg()); | 142 JSONReader reader(handler.msg()); |
| 137 | 143 |
| 138 const int kBufferSize = 128; | 144 const int kBufferSize = 128; |
| 139 char buffer[kBufferSize]; | 145 char buffer[kBufferSize]; |
| 140 | 146 |
| 141 // Check that the response string is somewhat sane. | 147 // Check that the response string is somewhat sane. |
| 142 | 148 |
| 143 // type | 149 // type |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 Dart_Port port_id = PortMap::CreatePort(&handler); | 185 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 180 Dart_Handle port = | 186 Dart_Handle port = |
| 181 Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); | 187 Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); |
| 182 EXPECT_VALID(port); | 188 EXPECT_VALID(port); |
| 183 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 189 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 184 | 190 |
| 185 Instance& service_msg = Instance::Handle(); | 191 Instance& service_msg = Instance::Handle(); |
| 186 | 192 |
| 187 // Get the stacktrace. | 193 // Get the stacktrace. |
| 188 service_msg = Eval(lib, "[port, ['stacktrace'], [], []]"); | 194 service_msg = Eval(lib, "[port, ['stacktrace'], [], []]"); |
| 189 Service::HandleIsolateMessage(isolate, service_msg); | 195 ServiceIsolateMessage(isolate, service_msg); |
| 190 handler.HandleNextMessage(); | 196 handler.HandleNextMessage(); |
| 191 EXPECT_STREQ( | 197 EXPECT_STREQ( |
| 192 "{\"type\":\"StackTrace\",\"members\":[]}", | 198 "{\"type\":\"StackTrace\",\"members\":[]}", |
| 193 handler.msg()); | 199 handler.msg()); |
| 194 | 200 |
| 195 // Malformed request. | 201 // Malformed request. |
| 196 service_msg = Eval(lib, "[port, ['stacktrace', 'jamboree'], [], []]"); | 202 service_msg = Eval(lib, "[port, ['stacktrace', 'jamboree'], [], []]"); |
| 197 Service::HandleIsolateMessage(isolate, service_msg); | 203 ServiceIsolateMessage(isolate, service_msg); |
| 198 handler.HandleNextMessage(); | 204 handler.HandleNextMessage(); |
| 199 EXPECT_STREQ( | 205 EXPECT_STREQ( |
| 200 "{\"type\":\"Error\",\"text\":\"Command too long\"," | 206 "{\"type\":\"Error\",\"text\":\"Command too long\"," |
| 201 "\"message\":{\"arguments\":[\"stacktrace\",\"jamboree\"]," | 207 "\"message\":{\"arguments\":[\"stacktrace\",\"jamboree\"]," |
| 202 "\"option_keys\":[],\"option_values\":[]}}", | 208 "\"option_keys\":[],\"option_values\":[]}}", |
| 203 handler.msg()); | 209 handler.msg()); |
| 204 } | 210 } |
| 205 | 211 |
| 206 | 212 |
| 207 TEST_CASE(Service_DebugBreakpoints) { | 213 TEST_CASE(Service_DebugBreakpoints) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 224 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); | 230 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port)); |
| 225 | 231 |
| 226 Instance& service_msg = Instance::Handle(); | 232 Instance& service_msg = Instance::Handle(); |
| 227 | 233 |
| 228 // Add a breakpoint. | 234 // Add a breakpoint. |
| 229 const String& url = String::Handle(String::New(TestCase::url())); | 235 const String& url = String::Handle(String::New(TestCase::url())); |
| 230 isolate->debugger()->SetBreakpointAtLine(url, 3); | 236 isolate->debugger()->SetBreakpointAtLine(url, 3); |
| 231 | 237 |
| 232 // Get the breakpoint list. | 238 // Get the breakpoint list. |
| 233 service_msg = Eval(lib, "[port, ['debug', 'breakpoints'], [], []]"); | 239 service_msg = Eval(lib, "[port, ['debug', 'breakpoints'], [], []]"); |
| 234 Service::HandleIsolateMessage(isolate, service_msg); | 240 ServiceIsolateMessage(isolate, service_msg); |
| 235 handler.HandleNextMessage(); | 241 handler.HandleNextMessage(); |
| 236 EXPECT_STREQ( | 242 EXPECT_STREQ( |
| 237 "{\"type\":\"BreakpointList\",\"breakpoints\":[{" | 243 "{\"type\":\"BreakpointList\",\"breakpoints\":[{" |
| 238 "\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true," | 244 "\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true," |
| 239 "\"resolved\":false," | 245 "\"resolved\":false," |
| 240 "\"location\":{\"type\":\"Location\"," | 246 "\"location\":{\"type\":\"Location\"," |
| 241 "\"script\":\"dart:test-lib\",\"tokenPos\":5}}]}", | 247 "\"script\":\"dart:test-lib\",\"tokenPos\":5}}]}", |
| 242 handler.msg()); | 248 handler.msg()); |
| 243 | 249 |
| 244 // Individual breakpoint. | 250 // Individual breakpoint. |
| 245 service_msg = Eval(lib, "[port, ['debug', 'breakpoints', '1'], [], []]"); | 251 service_msg = Eval(lib, "[port, ['debug', 'breakpoints', '1'], [], []]"); |
| 246 Service::HandleIsolateMessage(isolate, service_msg); | 252 ServiceIsolateMessage(isolate, service_msg); |
| 247 handler.HandleNextMessage(); | 253 handler.HandleNextMessage(); |
| 248 EXPECT_STREQ( | 254 EXPECT_STREQ( |
| 249 "{\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true," | 255 "{\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true," |
| 250 "\"resolved\":false," | 256 "\"resolved\":false," |
| 251 "\"location\":{\"type\":\"Location\"," | 257 "\"location\":{\"type\":\"Location\"," |
| 252 "\"script\":\"dart:test-lib\",\"tokenPos\":5}}", | 258 "\"script\":\"dart:test-lib\",\"tokenPos\":5}}", |
| 253 handler.msg()); | 259 handler.msg()); |
| 254 | 260 |
| 255 // Missing sub-command. | 261 // Missing sub-command. |
| 256 service_msg = Eval(lib, "[port, ['debug'], [], []]"); | 262 service_msg = Eval(lib, "[port, ['debug'], [], []]"); |
| 257 Service::HandleIsolateMessage(isolate, service_msg); | 263 ServiceIsolateMessage(isolate, service_msg); |
| 258 handler.HandleNextMessage(); | 264 handler.HandleNextMessage(); |
| 259 EXPECT_STREQ( | 265 EXPECT_STREQ( |
| 260 "{\"type\":\"Error\"," | 266 "{\"type\":\"Error\"," |
| 261 "\"text\":\"Must specify a subcommand\"," | 267 "\"text\":\"Must specify a subcommand\"," |
| 262 "\"message\":{\"arguments\":[\"debug\"],\"option_keys\":[]," | 268 "\"message\":{\"arguments\":[\"debug\"],\"option_keys\":[]," |
| 263 "\"option_values\":[]}}", | 269 "\"option_values\":[]}}", |
| 264 handler.msg()); | 270 handler.msg()); |
| 265 | 271 |
| 266 // Unrecognized breakpoint. | 272 // Unrecognized breakpoint. |
| 267 service_msg = Eval(lib, "[port, ['debug', 'breakpoints', '1111'], [], []]"); | 273 service_msg = Eval(lib, "[port, ['debug', 'breakpoints', '1111'], [], []]"); |
| 268 Service::HandleIsolateMessage(isolate, service_msg); | 274 ServiceIsolateMessage(isolate, service_msg); |
| 269 handler.HandleNextMessage(); | 275 handler.HandleNextMessage(); |
| 270 EXPECT_STREQ("{\"type\":\"Error\"," | 276 EXPECT_STREQ("{\"type\":\"Error\"," |
| 271 "\"text\":\"Unrecognized breakpoint id 1111\"," | 277 "\"text\":\"Unrecognized breakpoint id 1111\"," |
| 272 "\"message\":{" | 278 "\"message\":{" |
| 273 "\"arguments\":[\"debug\",\"breakpoints\",\"1111\"]," | 279 "\"arguments\":[\"debug\",\"breakpoints\",\"1111\"]," |
| 274 "\"option_keys\":[],\"option_values\":[]}}", | 280 "\"option_keys\":[],\"option_values\":[]}}", |
| 275 handler.msg()); | 281 handler.msg()); |
| 276 | 282 |
| 277 // Command too long. | 283 // Command too long. |
| 278 service_msg = | 284 service_msg = |
| 279 Eval(lib, "[port, ['debug', 'breakpoints', '1111', 'green'], [], []]"); | 285 Eval(lib, "[port, ['debug', 'breakpoints', '1111', 'green'], [], []]"); |
| 280 Service::HandleIsolateMessage(isolate, service_msg); | 286 ServiceIsolateMessage(isolate, service_msg); |
| 281 handler.HandleNextMessage(); | 287 handler.HandleNextMessage(); |
| 282 EXPECT_STREQ("{\"type\":\"Error\",\"text\":\"Command too long\"," | 288 EXPECT_STREQ("{\"type\":\"Error\",\"text\":\"Command too long\"," |
| 283 "\"message\":{\"arguments\":[\"debug\",\"breakpoints\"," | 289 "\"message\":{\"arguments\":[\"debug\",\"breakpoints\"," |
| 284 "\"1111\",\"green\"]," | 290 "\"1111\",\"green\"]," |
| 285 "\"option_keys\":[],\"option_values\":[]}}", | 291 "\"option_keys\":[],\"option_values\":[]}}", |
| 286 handler.msg()); | 292 handler.msg()); |
| 287 | 293 |
| 288 // Unrecognized subcommand. | 294 // Unrecognized subcommand. |
| 289 service_msg = Eval(lib, "[port, ['debug', 'nosferatu'], [], []]"); | 295 service_msg = Eval(lib, "[port, ['debug', 'nosferatu'], [], []]"); |
| 290 Service::HandleIsolateMessage(isolate, service_msg); | 296 ServiceIsolateMessage(isolate, service_msg); |
| 291 handler.HandleNextMessage(); | 297 handler.HandleNextMessage(); |
| 292 EXPECT_STREQ("{\"type\":\"Error\"," | 298 EXPECT_STREQ("{\"type\":\"Error\"," |
| 293 "\"text\":\"Unrecognized subcommand 'nosferatu'\"," | 299 "\"text\":\"Unrecognized subcommand 'nosferatu'\"," |
| 294 "\"message\":{\"arguments\":[\"debug\",\"nosferatu\"]," | 300 "\"message\":{\"arguments\":[\"debug\",\"nosferatu\"]," |
| 295 "\"option_keys\":[],\"option_values\":[]}}", | 301 "\"option_keys\":[],\"option_values\":[]}}", |
| 296 handler.msg()); | 302 handler.msg()); |
| 297 } | 303 } |
| 298 | 304 |
| 299 | 305 |
| 300 TEST_CASE(Service_Classes) { | 306 TEST_CASE(Service_Classes) { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 Dart_Port port_id = PortMap::CreatePort(&handler); | 338 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 333 Dart_Handle port = | 339 Dart_Handle port = |
| 334 Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); | 340 Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); |
| 335 EXPECT_VALID(port); | 341 EXPECT_VALID(port); |
| 336 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 342 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); |
| 337 | 343 |
| 338 Instance& service_msg = Instance::Handle(); | 344 Instance& service_msg = Instance::Handle(); |
| 339 | 345 |
| 340 // Request an invalid class id. | 346 // Request an invalid class id. |
| 341 service_msg = Eval(h_lib, "[port, ['classes', '999999'], [], []]"); | 347 service_msg = Eval(h_lib, "[port, ['classes', '999999'], [], []]"); |
| 342 Service::HandleIsolateMessage(isolate, service_msg); | 348 ServiceIsolateMessage(isolate, service_msg); |
| 343 handler.HandleNextMessage(); | 349 handler.HandleNextMessage(); |
| 344 EXPECT_STREQ( | 350 EXPECT_STREQ( |
| 345 "{\"type\":\"Error\",\"text\":\"999999 is not a valid class id.\"," | 351 "{\"type\":\"Error\",\"text\":\"999999 is not a valid class id.\"," |
| 346 "\"message\":{\"arguments\":[\"classes\",\"999999\"]," | 352 "\"message\":{\"arguments\":[\"classes\",\"999999\"]," |
| 347 "\"option_keys\":[],\"option_values\":[]}}", handler.msg()); | 353 "\"option_keys\":[],\"option_values\":[]}}", handler.msg()); |
| 348 | 354 |
| 349 // Request the class A over the service. | 355 // Request the class A over the service. |
| 350 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "'], [], []]", cid); | 356 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "'], [], []]", cid); |
| 351 Service::HandleIsolateMessage(isolate, service_msg); | 357 ServiceIsolateMessage(isolate, service_msg); |
| 352 handler.HandleNextMessage(); | 358 handler.HandleNextMessage(); |
| 353 | 359 |
| 354 EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg()); | 360 EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg()); |
| 355 ExpectSubstringF(handler.msg(), | 361 ExpectSubstringF(handler.msg(), |
| 356 "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid); | 362 "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid); |
| 357 | 363 |
| 358 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '0']," | 364 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '0']," |
| 359 "[], []]", cid); | 365 "[], []]", cid); |
| 360 Service::HandleIsolateMessage(isolate, service_msg); | 366 ServiceIsolateMessage(isolate, service_msg); |
| 361 handler.HandleNextMessage(); | 367 handler.HandleNextMessage(); |
| 362 EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg()); | 368 EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg()); |
| 363 ExpectSubstringF(handler.msg(), | 369 ExpectSubstringF(handler.msg(), |
| 364 "\"id\":\"classes\\/%" Pd "\\/functions\\/0\"," | 370 "\"id\":\"classes\\/%" Pd "\\/functions\\/0\"," |
| 365 "\"name\":\"get:a\",", cid); | 371 "\"name\":\"get:a\",", cid); |
| 366 | 372 |
| 367 // Request field 0 from class A. | 373 // Request field 0 from class A. |
| 368 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'fields', '0']," | 374 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'fields', '0']," |
| 369 "[], []]", cid); | 375 "[], []]", cid); |
| 370 Service::HandleIsolateMessage(isolate, service_msg); | 376 ServiceIsolateMessage(isolate, service_msg); |
| 371 handler.HandleNextMessage(); | 377 handler.HandleNextMessage(); |
| 372 EXPECT_SUBSTRING("\"type\":\"Field\"", handler.msg()); | 378 EXPECT_SUBSTRING("\"type\":\"Field\"", handler.msg()); |
| 373 ExpectSubstringF(handler.msg(), | 379 ExpectSubstringF(handler.msg(), |
| 374 "\"id\":\"classes\\/%" Pd "\\/fields\\/0\"," | 380 "\"id\":\"classes\\/%" Pd "\\/fields\\/0\"," |
| 375 "\"name\":\"a\",", cid); | 381 "\"name\":\"a\",", cid); |
| 376 | 382 |
| 377 // Invalid sub command. | 383 // Invalid sub command. |
| 378 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'huh', '0']," | 384 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'huh', '0']," |
| 379 "[], []]", cid); | 385 "[], []]", cid); |
| 380 Service::HandleIsolateMessage(isolate, service_msg); | 386 ServiceIsolateMessage(isolate, service_msg); |
| 381 handler.HandleNextMessage(); | 387 handler.HandleNextMessage(); |
| 382 ExpectSubstringF(handler.msg(), | 388 ExpectSubstringF(handler.msg(), |
| 383 "{\"type\":\"Error\",\"text\":\"Invalid sub collection huh\",\"message\":" | 389 "{\"type\":\"Error\",\"text\":\"Invalid sub collection huh\",\"message\":" |
| 384 "{\"arguments\":[\"classes\",\"%" Pd "\",\"huh\",\"0\"],\"option_keys\":[]," | 390 "{\"arguments\":[\"classes\",\"%" Pd "\",\"huh\",\"0\"],\"option_keys\":[]," |
| 385 "\"option_values\":[]}}", cid); | 391 "\"option_values\":[]}}", cid); |
| 386 | 392 |
| 387 // Invalid field request. | 393 // Invalid field request. |
| 388 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'fields', '9']," | 394 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'fields', '9']," |
| 389 "[], []]", cid); | 395 "[], []]", cid); |
| 390 Service::HandleIsolateMessage(isolate, service_msg); | 396 ServiceIsolateMessage(isolate, service_msg); |
| 391 handler.HandleNextMessage(); | 397 handler.HandleNextMessage(); |
| 392 ExpectSubstringF(handler.msg(), | 398 ExpectSubstringF(handler.msg(), |
| 393 "{\"type\":\"Error\",\"text\":\"Field 9 not found\"," | 399 "{\"type\":\"Error\",\"text\":\"Field 9 not found\"," |
| 394 "\"message\":{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\"]," | 400 "\"message\":{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\"]," |
| 395 "\"option_keys\":[],\"option_values\":[]}}", cid); | 401 "\"option_keys\":[],\"option_values\":[]}}", cid); |
| 396 | 402 |
| 397 // Invalid function request. | 403 // Invalid function request. |
| 398 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '9']," | 404 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '9']," |
| 399 "[], []]", cid); | 405 "[], []]", cid); |
| 400 Service::HandleIsolateMessage(isolate, service_msg); | 406 ServiceIsolateMessage(isolate, service_msg); |
| 401 handler.HandleNextMessage(); | 407 handler.HandleNextMessage(); |
| 402 ExpectSubstringF(handler.msg(), | 408 ExpectSubstringF(handler.msg(), |
| 403 "{\"type\":\"Error\",\"text\":\"Function 9 not found\"," | 409 "{\"type\":\"Error\",\"text\":\"Function 9 not found\"," |
| 404 "\"message\":{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\"]," | 410 "\"message\":{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\"]," |
| 405 "\"option_keys\":[],\"option_values\":[]}}", cid); | 411 "\"option_keys\":[],\"option_values\":[]}}", cid); |
| 406 | 412 |
| 407 | 413 |
| 408 // Invalid field subcommand. | 414 // Invalid field subcommand. |
| 409 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'fields', '9', 'x']" | 415 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'fields', '9', 'x']" |
| 410 ",[], []]", cid); | 416 ",[], []]", cid); |
| 411 Service::HandleIsolateMessage(isolate, service_msg); | 417 ServiceIsolateMessage(isolate, service_msg); |
| 412 handler.HandleNextMessage(); | 418 handler.HandleNextMessage(); |
| 413 ExpectSubstringF(handler.msg(), | 419 ExpectSubstringF(handler.msg(), |
| 414 "{\"type\":\"Error\",\"text\":\"Command too long\",\"message\":" | 420 "{\"type\":\"Error\",\"text\":\"Command too long\",\"message\":" |
| 415 "{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\",\"x\"]," | 421 "{\"arguments\":[\"classes\",\"%" Pd "\",\"fields\",\"9\",\"x\"]," |
| 416 "\"option_keys\":[],\"option_values\":[]}}", cid); | 422 "\"option_keys\":[],\"option_values\":[]}}", cid); |
| 417 | 423 |
| 418 // Invalid function request. | 424 // Invalid function request. |
| 419 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '9'," | 425 service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '9'," |
| 420 "'x'], [], []]", cid); | 426 "'x'], [], []]", cid); |
| 421 Service::HandleIsolateMessage(isolate, service_msg); | 427 ServiceIsolateMessage(isolate, service_msg); |
| 422 handler.HandleNextMessage(); | 428 handler.HandleNextMessage(); |
| 423 ExpectSubstringF(handler.msg(), | 429 ExpectSubstringF(handler.msg(), |
| 424 "{\"type\":\"Error\",\"text\":\"Command too long\",\"message\":" | 430 "{\"type\":\"Error\",\"text\":\"Command too long\",\"message\":" |
| 425 "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\",\"x\"]," | 431 "{\"arguments\":[\"classes\",\"%" Pd "\",\"functions\",\"9\",\"x\"]," |
| 426 "\"option_keys\":[],\"option_values\":[]}}", cid); | 432 "\"option_keys\":[],\"option_values\":[]}}", cid); |
| 427 } | 433 } |
| 428 | 434 |
| 429 | 435 |
| 430 TEST_CASE(Service_Code) { | 436 TEST_CASE(Service_Code) { |
| 431 const char* kScript = | 437 const char* kScript = |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 Dart_Port port_id = PortMap::CreatePort(&handler); | 475 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 470 Dart_Handle port = | 476 Dart_Handle port = |
| 471 Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); | 477 Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); |
| 472 EXPECT_VALID(port); | 478 EXPECT_VALID(port); |
| 473 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 479 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); |
| 474 | 480 |
| 475 Instance& service_msg = Instance::Handle(); | 481 Instance& service_msg = Instance::Handle(); |
| 476 | 482 |
| 477 // Request an invalid code object. | 483 // Request an invalid code object. |
| 478 service_msg = Eval(h_lib, "[port, ['code', '0'], [], []]"); | 484 service_msg = Eval(h_lib, "[port, ['code', '0'], [], []]"); |
| 479 Service::HandleIsolateMessage(isolate, service_msg); | 485 ServiceIsolateMessage(isolate, service_msg); |
| 480 handler.HandleNextMessage(); | 486 handler.HandleNextMessage(); |
| 481 EXPECT_STREQ( | 487 EXPECT_STREQ( |
| 482 "{\"type\":\"Error\",\"text\":\"Could not find code at 0\",\"message\":" | 488 "{\"type\":\"Error\",\"text\":\"Could not find code at 0\",\"message\":" |
| 483 "{\"arguments\":[\"code\",\"0\"]," | 489 "{\"arguments\":[\"code\",\"0\"]," |
| 484 "\"option_keys\":[],\"option_values\":[]}}", handler.msg()); | 490 "\"option_keys\":[],\"option_values\":[]}}", handler.msg()); |
| 485 | 491 |
| 486 // The following four tests check that a code object can be found | 492 // The following four tests check that a code object can be found |
| 487 // inside the range: [code.EntryPoint(), code.EntryPoint() + code.Size()). | 493 // inside the range: [code.EntryPoint(), code.EntryPoint() + code.Size()). |
| 488 // Request code object at code.EntryPoint() | 494 // Request code object at code.EntryPoint() |
| 489 // Expect this to succeed as it is inside [entry, entry + size). | 495 // Expect this to succeed as it is inside [entry, entry + size). |
| 490 service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", entry); | 496 service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", entry); |
| 491 Service::HandleIsolateMessage(isolate, service_msg); | 497 ServiceIsolateMessage(isolate, service_msg); |
| 492 handler.HandleNextMessage(); | 498 handler.HandleNextMessage(); |
| 493 { | 499 { |
| 494 // Only perform a partial match. | 500 // Only perform a partial match. |
| 495 const intptr_t kBufferSize = 512; | 501 const intptr_t kBufferSize = 512; |
| 496 char buffer[kBufferSize]; | 502 char buffer[kBufferSize]; |
| 497 OS::SNPrint(buffer, kBufferSize-1, | 503 OS::SNPrint(buffer, kBufferSize-1, |
| 498 "{\"type\":\"Code\",\"id\":\"code\\/%" Px "\",", entry); | 504 "{\"type\":\"Code\",\"id\":\"code\\/%" Px "\",", entry); |
| 499 EXPECT_SUBSTRING(buffer, handler.msg()); | 505 EXPECT_SUBSTRING(buffer, handler.msg()); |
| 500 } | 506 } |
| 501 | 507 |
| 502 // Request code object at code.EntryPoint() + 16. | 508 // Request code object at code.EntryPoint() + 16. |
| 503 // Expect this to succeed as it is inside [entry, entry + size). | 509 // Expect this to succeed as it is inside [entry, entry + size). |
| 504 uintptr_t address = entry + 16; | 510 uintptr_t address = entry + 16; |
| 505 service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", address); | 511 service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", address); |
| 506 Service::HandleIsolateMessage(isolate, service_msg); | 512 ServiceIsolateMessage(isolate, service_msg); |
| 507 handler.HandleNextMessage(); | 513 handler.HandleNextMessage(); |
| 508 { | 514 { |
| 509 // Only perform a partial match. | 515 // Only perform a partial match. |
| 510 const intptr_t kBufferSize = 512; | 516 const intptr_t kBufferSize = 512; |
| 511 char buffer[kBufferSize]; | 517 char buffer[kBufferSize]; |
| 512 OS::SNPrint(buffer, kBufferSize-1, | 518 OS::SNPrint(buffer, kBufferSize-1, |
| 513 "{\"type\":\"Code\",\"id\":\"code\\/%" Px "\",", entry); | 519 "{\"type\":\"Code\",\"id\":\"code\\/%" Px "\",", entry); |
| 514 EXPECT_SUBSTRING(buffer, handler.msg()); | 520 EXPECT_SUBSTRING(buffer, handler.msg()); |
| 515 } | 521 } |
| 516 | 522 |
| 517 // Request code object at code.EntryPoint() + code.Size() - 1. | 523 // Request code object at code.EntryPoint() + code.Size() - 1. |
| 518 // Expect this to succeed as it is inside [entry, entry + size). | 524 // Expect this to succeed as it is inside [entry, entry + size). |
| 519 address = last - 1; | 525 address = last - 1; |
| 520 service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", address); | 526 service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", address); |
| 521 Service::HandleIsolateMessage(isolate, service_msg); | 527 ServiceIsolateMessage(isolate, service_msg); |
| 522 handler.HandleNextMessage(); | 528 handler.HandleNextMessage(); |
| 523 { | 529 { |
| 524 // Only perform a partial match. | 530 // Only perform a partial match. |
| 525 const intptr_t kBufferSize = 512; | 531 const intptr_t kBufferSize = 512; |
| 526 char buffer[kBufferSize]; | 532 char buffer[kBufferSize]; |
| 527 OS::SNPrint(buffer, kBufferSize-1, | 533 OS::SNPrint(buffer, kBufferSize-1, |
| 528 "{\"type\":\"Code\",\"id\":\"code\\/%" Px "\",", entry); | 534 "{\"type\":\"Code\",\"id\":\"code\\/%" Px "\",", entry); |
| 529 EXPECT_SUBSTRING(buffer, handler.msg()); | 535 EXPECT_SUBSTRING(buffer, handler.msg()); |
| 530 } | 536 } |
| 531 | 537 |
| 532 // Request code object at code.EntryPoint() + code.Size(). Expect this | 538 // Request code object at code.EntryPoint() + code.Size(). Expect this |
| 533 // to fail as it's outside of [entry, entry + size). | 539 // to fail as it's outside of [entry, entry + size). |
| 534 address = last; | 540 address = last; |
| 535 service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", address); | 541 service_msg = EvalF(h_lib, "[port, ['code', '%" Px "'], [], []]", address); |
| 536 Service::HandleIsolateMessage(isolate, service_msg); | 542 ServiceIsolateMessage(isolate, service_msg); |
| 537 handler.HandleNextMessage(); | 543 handler.HandleNextMessage(); |
| 538 { | 544 { |
| 539 const intptr_t kBufferSize = 1024; | 545 const intptr_t kBufferSize = 1024; |
| 540 char buffer[kBufferSize]; | 546 char buffer[kBufferSize]; |
| 541 OS::SNPrint(buffer, kBufferSize-1, | 547 OS::SNPrint(buffer, kBufferSize-1, |
| 542 "{\"type\":\"Error\",\"text\":\"Could not find code at %" Px "\"," | 548 "{\"type\":\"Error\",\"text\":\"Could not find code at %" Px "\"," |
| 543 "\"message\":{\"arguments\":[\"code\",\"%" Px "\"]," | 549 "\"message\":{\"arguments\":[\"code\",\"%" Px "\"]," |
| 544 "\"option_keys\":[],\"option_values\":[]}}", address, address); | 550 "\"option_keys\":[],\"option_values\":[]}}", address, address); |
| 545 EXPECT_STREQ(buffer, handler.msg()); | 551 EXPECT_STREQ(buffer, handler.msg()); |
| 546 } | 552 } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 // Build a mock message handler and wrap it in a dart port. | 603 // Build a mock message handler and wrap it in a dart port. |
| 598 ServiceTestMessageHandler handler; | 604 ServiceTestMessageHandler handler; |
| 599 Dart_Port port_id = PortMap::CreatePort(&handler); | 605 Dart_Port port_id = PortMap::CreatePort(&handler); |
| 600 Dart_Handle port = | 606 Dart_Handle port = |
| 601 Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); | 607 Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id)); |
| 602 EXPECT_VALID(port); | 608 EXPECT_VALID(port); |
| 603 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); | 609 EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port)); |
| 604 | 610 |
| 605 Instance& service_msg = Instance::Handle(); | 611 Instance& service_msg = Instance::Handle(); |
| 606 service_msg = Eval(h_lib, "[port, ['coverage'], [], []]"); | 612 service_msg = Eval(h_lib, "[port, ['coverage'], [], []]"); |
| 607 Service::HandleIsolateMessage(isolate, service_msg); | 613 ServiceIsolateMessage(isolate, service_msg); |
| 608 handler.HandleNextMessage(); | 614 handler.HandleNextMessage(); |
| 609 EXPECT_SUBSTRING( | 615 EXPECT_SUBSTRING( |
| 610 "{\"source\":\"dart:test-lib\",\"script\":{" | 616 "{\"source\":\"dart:test-lib\",\"script\":{" |
| 611 "\"type\":\"@Script\",\"id\":\"scripts\\/dart%3Atest-lib\"," | 617 "\"type\":\"@Script\",\"id\":\"scripts\\/dart%3Atest-lib\"," |
| 612 "\"name\":\"dart:test-lib\",\"user_name\":\"dart:test-lib\"," | 618 "\"name\":\"dart:test-lib\",\"user_name\":\"dart:test-lib\"," |
| 613 "\"kind\":\"script\"},\"hits\":" | 619 "\"kind\":\"script\"},\"hits\":" |
| 614 "[3,0,3,1,5,1,5,1,5,1,6,1,6,1]}", handler.msg()); | 620 "[3,0,3,1,5,1,5,1,5,1,6,1,6,1]}", handler.msg()); |
| 615 } | 621 } |
| 616 | 622 |
| 617 | 623 |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 710 Service::HandleIsolateMessage(isolate, service_msg); | 716 Service::HandleIsolateMessage(isolate, service_msg); |
| 711 handler.HandleNextMessage(); | 717 handler.HandleNextMessage(); |
| 712 EXPECT_STREQ("alpha", handler.msg()); | 718 EXPECT_STREQ("alpha", handler.msg()); |
| 713 service_msg = Eval(lib, "[port, ['beta'], [], []]"); | 719 service_msg = Eval(lib, "[port, ['beta'], [], []]"); |
| 714 Service::HandleIsolateMessage(isolate, service_msg); | 720 Service::HandleIsolateMessage(isolate, service_msg); |
| 715 handler.HandleNextMessage(); | 721 handler.HandleNextMessage(); |
| 716 EXPECT_STREQ("beta", handler.msg()); | 722 EXPECT_STREQ("beta", handler.msg()); |
| 717 } | 723 } |
| 718 | 724 |
| 719 } // namespace dart | 725 } // namespace dart |
| OLD | NEW |