| 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
|
|
|