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

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

Issue 113513004: Handle vmservice messages while at breakpoint. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/service.cc ('k') | runtime/vm/vm_sources.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 #include "include/dart_debugger_api.h"
6 #include "vm/dart_api_impl.h"
7 #include "vm/dart_entry.h"
8 #include "vm/debugger.h"
9 #include "vm/globals.h"
10 #include "vm/message_handler.h"
11 #include "vm/os.h"
12 #include "vm/port.h"
13 #include "vm/service.h"
14 #include "vm/unit_test.h"
15
16 namespace dart {
17
18 class ServiceTestMessageHandler : public MessageHandler {
19 public:
20 ServiceTestMessageHandler() : _msg(NULL) {}
21
22 ~ServiceTestMessageHandler() {
23 free(_msg);
24 }
25
26 bool HandleMessage(Message* message) {
27 if (_msg != NULL) {
28 free(_msg);
29 }
30
31 // Parse the message.
32 SnapshotReader reader(message->data(), message->len(),
33 Snapshot::kMessage, Isolate::Current());
34 const Object& response_obj = Object::Handle(reader.ReadObject());
35 String& response = String::Handle();
36 response ^= response_obj.raw();
37 _msg = strdup(response.ToCString());
38 return true;
39 }
40
41 const char* msg() const { return _msg; }
42
43 private:
44 char* _msg;
45 };
46
47
48 static RawInstance* Eval(Dart_Handle lib, const char* expr) {
49 Dart_Handle result = Dart_EvaluateExpr(lib, NewString(expr));
50 EXPECT_VALID(result);
51 Isolate* isolate = Isolate::Current();
52 const Instance& instance = Api::UnwrapInstanceHandle(isolate, result);
53 return instance.raw();
54 }
55
56
57 TEST_CASE(Service_DebugBreakpoints) {
58 const char* kScript =
59 "var port;\n" // Set to our mock port by C++.
60 "\n"
61 "main() {\n" // We set breakpoint here.
62 "}";
63
64 Isolate* isolate = Isolate::Current();
65 Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
66 EXPECT_VALID(lib);
67
68 // Build a mock message handler and wrap it in a dart port.
69 ServiceTestMessageHandler handler;
70 Dart_Port port_id = PortMap::CreatePort(&handler);
71 Dart_Handle port =
72 Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id));
73 EXPECT_VALID(port);
74 EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
75
76 Instance& service_msg = Instance::Handle();
77
78 // Add a breakpoint.
79 const String& url = String::Handle(String::New(TestCase::url()));
80 isolate->debugger()->SetBreakpointAtLine(url, 3);
81
82 // Get the breakpoint list.
83 service_msg = Eval(lib, "[port, ['debug', 'breakpoints'], [], []]");
84 Service::HandleServiceMessage(isolate, service_msg);
85 handler.HandleNextMessage();
86 EXPECT_STREQ(
87 "{\"type\":\"BreakpointList\",\"breakpoints\":[{"
88 "\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true,"
89 "\"resolved\":false,"
90 "\"location\":{\"type\":\"Location\",\"libId\":12,"
91 "\"script\":\"dart:test-lib\",\"tokenPos\":5}}]}",
92 handler.msg());
93
94 // Individual breakpoint.
95 service_msg = Eval(lib, "[port, ['debug', 'breakpoints', '1'], [], []]");
96 Service::HandleServiceMessage(isolate, service_msg);
97 handler.HandleNextMessage();
98 EXPECT_STREQ(
99 "{\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true,"
100 "\"resolved\":false,"
101 "\"location\":{\"type\":\"Location\",\"libId\":12,"
102 "\"script\":\"dart:test-lib\",\"tokenPos\":5}}",
103 handler.msg());
104
105 // Missing sub-command.
106 service_msg = Eval(lib, "[port, ['debug'], [], []]");
107 Service::HandleServiceMessage(isolate, service_msg);
108 handler.HandleNextMessage();
109 EXPECT_STREQ(
110 "{\"type\":\"Error\","
111 "\"text\":\"Must specify a subcommand\","
112 "\"message\":{\"arguments\":[\"debug\"],\"option_keys\":[],"
113 "\"option_values\":[]}}",
114 handler.msg());
115
116 // Unrecognized breakpoint.
117 service_msg = Eval(lib, "[port, ['debug', 'breakpoints', '1111'], [], []]");
118 Service::HandleServiceMessage(isolate, service_msg);
119 handler.HandleNextMessage();
120 EXPECT_STREQ("{\"type\":\"Error\","
121 "\"text\":\"Unrecognized breakpoint id 1111\","
122 "\"message\":{"
123 "\"arguments\":[\"debug\",\"breakpoints\",\"1111\"],"
124 "\"option_keys\":[],\"option_values\":[]}}",
125 handler.msg());
126
127 // Command too long.
128 service_msg =
129 Eval(lib, "[port, ['debug', 'breakpoints', '1111', 'green'], [], []]");
130 Service::HandleServiceMessage(isolate, service_msg);
131 handler.HandleNextMessage();
132 EXPECT_STREQ("{\"type\":\"Error\",\"text\":\"Command too long\","
133 "\"message\":{\"arguments\":[\"debug\",\"breakpoints\","
134 "\"1111\",\"green\"],"
135 "\"option_keys\":[],\"option_values\":[]}}",
136 handler.msg());
137
138 // Unrecognized subcommand.
139 service_msg = Eval(lib, "[port, ['debug', 'nosferatu'], [], []]");
140 Service::HandleServiceMessage(isolate, service_msg);
141 handler.HandleNextMessage();
142 EXPECT_STREQ("{\"type\":\"Error\","
143 "\"text\":\"Unrecognized subcommand 'nosferatu'\","
144 "\"message\":{\"arguments\":[\"debug\",\"nosferatu\"],"
145 "\"option_keys\":[],\"option_values\":[]}}",
146 handler.msg());
147 }
148
149 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/service.cc ('k') | runtime/vm/vm_sources.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698