Index: runtime/vm/service_test.cc |
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc |
index 8a19298d5529e5278cb1d70698966da71fa71a7a..ee534ef3eb38734682a881ea694f083936266214 100644 |
--- a/runtime/vm/service_test.cc |
+++ b/runtime/vm/service_test.cc |
@@ -13,6 +13,7 @@ |
#include "vm/object_id_ring.h" |
#include "vm/os.h" |
#include "vm/port.h" |
+#include "vm/safepoint.h" |
#include "vm/service.h" |
#include "vm/unit_test.h" |
@@ -37,7 +38,6 @@ class ServiceTestMessageHandler : public MessageHandler { |
} |
// Parse the message. |
- String& response = String::Handle(); |
Object& response_obj = Object::Handle(); |
if (message->IsRaw()) { |
response_obj = message->raw_obj(); |
@@ -46,8 +46,20 @@ class ServiceTestMessageHandler : public MessageHandler { |
MessageSnapshotReader reader(message->data(), message->len(), thread); |
response_obj = reader.ReadObject(); |
} |
- response ^= response_obj.raw(); |
- _msg = strdup(response.ToCString()); |
+ if (response_obj.IsString()) { |
+ String& response = String::Handle(); |
+ response ^= response_obj.raw(); |
+ _msg = strdup(response.ToCString()); |
+ } else { |
+ ASSERT(response_obj.IsArray()); |
+ Array& response_array = Array::Handle(); |
+ response_array ^= response_obj.raw(); |
+ ASSERT(response_array.Length() == 1); |
+ ExternalTypedData& response = ExternalTypedData::Handle(); |
+ response ^= response_array.At(0); |
+ _msg = strdup(reinterpret_cast<char*>(response.DataAddr(0))); |
+ } |
+ |
return kOK; |
} |
@@ -115,6 +127,18 @@ static RawClass* GetClass(const Library& lib, const char* name) { |
} |
+static void HandleIsolateMessage(Isolate* isolate, const Array& msg) { |
+ TransitionNativeToVM transition(Thread::Current()); |
+ Service::HandleIsolateMessage(isolate, msg); |
+} |
+ |
+ |
+static void HandleRootMessage(const Array& message) { |
+ TransitionNativeToVM transition(Thread::Current()); |
+ Service::HandleRootMessage(message); |
+} |
+ |
+ |
TEST_CASE(Service_IsolateStickyError) { |
const char* kScript = |
"main() => throw 'HI THERE STICKY';\n"; |
@@ -245,7 +269,7 @@ TEST_CASE(Service_Code) { |
// Request an invalid code object. |
service_msg = |
Eval(lib, "[0, port, '0', 'getObject', ['objectId'], ['code/0']]"); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
EXPECT_SUBSTRING("\"error\"", handler.msg()); |
@@ -255,7 +279,7 @@ TEST_CASE(Service_Code) { |
"['objectId'], ['code/%" Px64"-%" Px "']]", |
compile_timestamp, |
entry); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
EXPECT_SUBSTRING("\"type\":\"Code\"", handler.msg()); |
{ |
@@ -276,7 +300,7 @@ TEST_CASE(Service_Code) { |
"['objectId'], ['code/%" Px64"-%" Px "']]", |
compile_timestamp, |
address); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
EXPECT_SUBSTRING("\"error\"", handler.msg()); |
@@ -287,7 +311,7 @@ TEST_CASE(Service_Code) { |
"['objectId'], ['code/%" Px64"-%" Px "']]", |
compile_timestamp - 1, |
address); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
EXPECT_SUBSTRING("\"error\"", handler.msg()); |
@@ -296,7 +320,7 @@ TEST_CASE(Service_Code) { |
service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |
"['objectId'], ['code/native-%" Px "']]", |
address); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
// TODO(turnidge): It is pretty broken to return an Instance here. Fix. |
EXPECT_SUBSTRING("\"kind\":\"Null\"", |
@@ -306,7 +330,7 @@ TEST_CASE(Service_Code) { |
service_msg = EvalF(lib, "[0, port, '0', 'getObject', ['objectId'], " |
"['code/native%" Px "']]", |
address); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
EXPECT_SUBSTRING("\"error\"", handler.msg()); |
} |
@@ -349,7 +373,7 @@ TEST_CASE(Service_TokenStream) { |
// Fetch object. |
service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |
"['objectId'], ['objects/%" Pd "']]", id); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
// Check type. |
@@ -412,7 +436,7 @@ TEST_CASE(Service_PcDescriptors) { |
// Fetch object. |
service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |
"['objectId'], ['objects/%" Pd "']]", id); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
// Check type. |
EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); |
@@ -474,7 +498,7 @@ TEST_CASE(Service_LocalVarDescriptors) { |
// Fetch object. |
service_msg = EvalF(lib, "[0, port, '0', 'getObject', " |
"['objectId'], ['objects/%" Pd "']]", id); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
// Check type. |
EXPECT_SUBSTRING("\"type\":\"Object\"", handler.msg()); |
@@ -534,7 +558,7 @@ TEST_CASE(Service_PersistentHandles) { |
// Get persistent handles. |
service_msg = Eval(lib, "[0, port, '0', '_getPersistentHandles', [], []]"); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
// Look for a heart beat. |
EXPECT_SUBSTRING("\"type\":\"_PersistentHandles\"", handler.msg()); |
@@ -549,7 +573,7 @@ TEST_CASE(Service_PersistentHandles) { |
// Get persistent handles (again). |
service_msg = Eval(lib, "[0, port, '0', '_getPersistentHandles', [], []]"); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
EXPECT_SUBSTRING("\"type\":\"_PersistentHandles\"", handler.msg()); |
// Verify that old persistent handles are not present. |
@@ -595,7 +619,7 @@ TEST_CASE(Service_Address) { |
"['address'], ['%" Px "']]"), |
addr); |
service_msg = Eval(lib, buf); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
EXPECT_SUBSTRING(ref ? "\"type\":\"@Instance\"" : |
"\"type\":\"Instance\"", |
@@ -606,7 +630,7 @@ TEST_CASE(Service_Address) { |
// Expect null when no object is found. |
service_msg = Eval(lib, "[0, port, '0', '_getObjectByAddress', " |
"['address'], ['7']]"); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
// TODO(turnidge): Should this be a ServiceException instead? |
EXPECT_SUBSTRING("{\"type\":\"Sentinel\",\"kind\":\"Free\"," |
@@ -667,12 +691,12 @@ TEST_CASE(Service_EmbedderRootHandler) { |
Array& service_msg = Array::Handle(); |
service_msg = Eval(lib, "[0, port, '\"', 'alpha', [], []]"); |
- Service::HandleRootMessage(service_msg); |
+ HandleRootMessage(service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":alpha,\"id\":\"\\\"\"}", |
handler.msg()); |
service_msg = Eval(lib, "[0, port, 1, 'beta', [], []]"); |
- Service::HandleRootMessage(service_msg); |
+ HandleRootMessage(service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"error\":beta,\"id\":1}", |
handler.msg()); |
@@ -707,12 +731,12 @@ TEST_CASE(Service_EmbedderIsolateHandler) { |
Array& service_msg = Array::Handle(); |
service_msg = Eval(lib, "[0, port, '0', 'alpha', [], []]"); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"result\":alpha,\"id\":\"0\"}", |
handler.msg()); |
service_msg = Eval(lib, "[0, port, '0', 'beta', [], []]"); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
EXPECT_STREQ("{\"jsonrpc\":\"2.0\", \"error\":beta,\"id\":\"0\"}", |
handler.msg()); |
@@ -747,21 +771,21 @@ TEST_CASE(Service_Profile) { |
Array& service_msg = Array::Handle(); |
service_msg = Eval(lib, "[0, port, '0', '_getCpuProfile', [], []]"); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
// Expect error (tags required). |
EXPECT_SUBSTRING("\"error\"", handler.msg()); |
service_msg = |
Eval(lib, "[0, port, '0', '_getCpuProfile', ['tags'], ['None']]"); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
// Expect profile |
EXPECT_SUBSTRING("\"type\":\"_CpuProfile\"", handler.msg()); |
service_msg = |
Eval(lib, "[0, port, '0', '_getCpuProfile', ['tags'], ['Bogus']]"); |
- Service::HandleIsolateMessage(isolate, service_msg); |
+ HandleIsolateMessage(isolate, service_msg); |
EXPECT_EQ(MessageHandler::kOK, handler.HandleNextMessage()); |
// Expect error. |
EXPECT_SUBSTRING("\"error\"", handler.msg()); |