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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/service.cc ('k') | runtime/vm/vm_sources.gypi » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/service_test.cc
===================================================================
--- runtime/vm/service_test.cc (revision 0)
+++ runtime/vm/service_test.cc (working copy)
@@ -0,0 +1,149 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "include/dart_debugger_api.h"
+#include "vm/dart_api_impl.h"
+#include "vm/dart_entry.h"
+#include "vm/debugger.h"
+#include "vm/globals.h"
+#include "vm/message_handler.h"
+#include "vm/os.h"
+#include "vm/port.h"
+#include "vm/service.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+class ServiceTestMessageHandler : public MessageHandler {
+ public:
+ ServiceTestMessageHandler() : _msg(NULL) {}
+
+ ~ServiceTestMessageHandler() {
+ free(_msg);
+ }
+
+ bool HandleMessage(Message* message) {
+ if (_msg != NULL) {
+ free(_msg);
+ }
+
+ // Parse the message.
+ SnapshotReader reader(message->data(), message->len(),
+ Snapshot::kMessage, Isolate::Current());
+ const Object& response_obj = Object::Handle(reader.ReadObject());
+ String& response = String::Handle();
+ response ^= response_obj.raw();
+ _msg = strdup(response.ToCString());
+ return true;
+ }
+
+ const char* msg() const { return _msg; }
+
+ private:
+ char* _msg;
+};
+
+
+static RawInstance* Eval(Dart_Handle lib, const char* expr) {
+ Dart_Handle result = Dart_EvaluateExpr(lib, NewString(expr));
+ EXPECT_VALID(result);
+ Isolate* isolate = Isolate::Current();
+ const Instance& instance = Api::UnwrapInstanceHandle(isolate, result);
+ return instance.raw();
+}
+
+
+TEST_CASE(Service_DebugBreakpoints) {
+ const char* kScript =
+ "var port;\n" // Set to our mock port by C++.
+ "\n"
+ "main() {\n" // We set breakpoint here.
+ "}";
+
+ Isolate* isolate = Isolate::Current();
+ Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+ EXPECT_VALID(lib);
+
+ // Build a mock message handler and wrap it in a dart port.
+ ServiceTestMessageHandler handler;
+ Dart_Port port_id = PortMap::CreatePort(&handler);
+ Dart_Handle port =
+ Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id));
+ EXPECT_VALID(port);
+ EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
+
+ Instance& service_msg = Instance::Handle();
+
+ // Add a breakpoint.
+ const String& url = String::Handle(String::New(TestCase::url()));
+ isolate->debugger()->SetBreakpointAtLine(url, 3);
+
+ // Get the breakpoint list.
+ service_msg = Eval(lib, "[port, ['debug', 'breakpoints'], [], []]");
+ Service::HandleServiceMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ EXPECT_STREQ(
+ "{\"type\":\"BreakpointList\",\"breakpoints\":[{"
+ "\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true,"
+ "\"resolved\":false,"
+ "\"location\":{\"type\":\"Location\",\"libId\":12,"
+ "\"script\":\"dart:test-lib\",\"tokenPos\":5}}]}",
+ handler.msg());
+
+ // Individual breakpoint.
+ service_msg = Eval(lib, "[port, ['debug', 'breakpoints', '1'], [], []]");
+ Service::HandleServiceMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ EXPECT_STREQ(
+ "{\"type\":\"Breakpoint\",\"id\":1,\"enabled\":true,"
+ "\"resolved\":false,"
+ "\"location\":{\"type\":\"Location\",\"libId\":12,"
+ "\"script\":\"dart:test-lib\",\"tokenPos\":5}}",
+ handler.msg());
+
+ // Missing sub-command.
+ service_msg = Eval(lib, "[port, ['debug'], [], []]");
+ Service::HandleServiceMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ EXPECT_STREQ(
+ "{\"type\":\"Error\","
+ "\"text\":\"Must specify a subcommand\","
+ "\"message\":{\"arguments\":[\"debug\"],\"option_keys\":[],"
+ "\"option_values\":[]}}",
+ handler.msg());
+
+ // Unrecognized breakpoint.
+ service_msg = Eval(lib, "[port, ['debug', 'breakpoints', '1111'], [], []]");
+ Service::HandleServiceMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ EXPECT_STREQ("{\"type\":\"Error\","
+ "\"text\":\"Unrecognized breakpoint id 1111\","
+ "\"message\":{"
+ "\"arguments\":[\"debug\",\"breakpoints\",\"1111\"],"
+ "\"option_keys\":[],\"option_values\":[]}}",
+ handler.msg());
+
+ // Command too long.
+ service_msg =
+ Eval(lib, "[port, ['debug', 'breakpoints', '1111', 'green'], [], []]");
+ Service::HandleServiceMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ EXPECT_STREQ("{\"type\":\"Error\",\"text\":\"Command too long\","
+ "\"message\":{\"arguments\":[\"debug\",\"breakpoints\","
+ "\"1111\",\"green\"],"
+ "\"option_keys\":[],\"option_values\":[]}}",
+ handler.msg());
+
+ // Unrecognized subcommand.
+ service_msg = Eval(lib, "[port, ['debug', 'nosferatu'], [], []]");
+ Service::HandleServiceMessage(isolate, service_msg);
+ handler.HandleNextMessage();
+ EXPECT_STREQ("{\"type\":\"Error\","
+ "\"text\":\"Unrecognized subcommand 'nosferatu'\","
+ "\"message\":{\"arguments\":[\"debug\",\"nosferatu\"],"
+ "\"option_keys\":[],\"option_values\":[]}}",
+ handler.msg());
+}
+
+} // namespace dart
« 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