| Index: runtime/vm/service_test.cc
|
| diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
|
| index b3a70f4a0633c6e4eb4d3b5c810e92ff7a3eef30..d910af566f7ed86b5e764615cae113bf6853d006 100644
|
| --- a/runtime/vm/service_test.cc
|
| +++ b/runtime/vm/service_test.cc
|
| @@ -44,44 +44,6 @@ class ServiceTestMessageHandler : public MessageHandler {
|
| return true;
|
| }
|
|
|
| - // Removes a given json key:value from _msg.
|
| - void filterMsg(const char* key) {
|
| - int key_len = strlen(key);
|
| - int old_len = strlen(_msg);
|
| - char* new_msg = reinterpret_cast<char*>(malloc(old_len + 1));
|
| - int old_pos = 0;
|
| - int new_pos = 0;
|
| - while (_msg[old_pos] != '\0') {
|
| - if (_msg[old_pos] == '\"') {
|
| - old_pos++;
|
| - if ((old_len - old_pos) > key_len &&
|
| - strncmp(&_msg[old_pos], key, key_len) == 0 &&
|
| - _msg[old_pos + key_len] == '\"') {
|
| - old_pos += (key_len + 2);
|
| - // Skip until next , or }.
|
| - while (_msg[old_pos] != '\0' &&
|
| - _msg[old_pos] != ',' &&
|
| - _msg[old_pos] != '}') {
|
| - old_pos++;
|
| - }
|
| - if (_msg[old_pos] == ',') {
|
| - old_pos++;
|
| - }
|
| - } else {
|
| - new_msg[new_pos] = '\"';;
|
| - new_pos++;
|
| - }
|
| - } else {
|
| - new_msg[new_pos] = _msg[old_pos];
|
| - new_pos++;
|
| - old_pos++;
|
| - }
|
| - }
|
| - new_msg[new_pos] = '\0';
|
| - free(_msg);
|
| - _msg = new_msg;
|
| - }
|
| -
|
| const char* msg() const { return _msg; }
|
|
|
| private:
|
| @@ -89,24 +51,6 @@ class ServiceTestMessageHandler : public MessageHandler {
|
| };
|
|
|
|
|
| -static RawArray* EvalVM(Dart_Handle lib, const char* expr) {
|
| - Dart_Handle expr_val = Dart_EvaluateExpr(lib, NewString(expr));
|
| - EXPECT_VALID(expr_val);
|
| - Isolate* isolate = Isolate::Current();
|
| - const GrowableObjectArray& value =
|
| - Api::UnwrapGrowableObjectArrayHandle(isolate, expr_val);
|
| - const Array& result = Array::Handle(Array::MakeArray(value));
|
| - GrowableObjectArray& growable = GrowableObjectArray::Handle();
|
| - growable ^= result.At(3);
|
| - Array& array = Array::Handle(Array::MakeArray(growable));
|
| - result.SetAt(3, array);
|
| - growable ^= result.At(4);
|
| - array = Array::MakeArray(growable);
|
| - result.SetAt(4, array);
|
| - return result.raw();
|
| -}
|
| -
|
| -
|
| static RawArray* Eval(Dart_Handle lib, const char* expr) {
|
| const String& dummy_isolate_id = String::Handle(String::New("isolateId"));
|
| Dart_Handle expr_val = Dart_EvaluateExpr(lib, NewString(expr));
|
| @@ -148,28 +92,6 @@ static RawArray* EvalF(Dart_Handle lib, const char* fmt, ...) {
|
| }
|
|
|
|
|
| -// Search for the formatted string in buffer.
|
| -//
|
| -// TODO(turnidge): This function obscures the line number of failing
|
| -// EXPECTs. Rework this.
|
| -static void ExpectSubstringF(const char* buff, const char* fmt, ...) {
|
| - Isolate* isolate = Isolate::Current();
|
| -
|
| - va_list args;
|
| - va_start(args, fmt);
|
| - intptr_t len = OS::VSNPrint(NULL, 0, fmt, args);
|
| - va_end(args);
|
| -
|
| - char* buffer = isolate->current_zone()->Alloc<char>(len + 1);
|
| - va_list args2;
|
| - va_start(args2, fmt);
|
| - OS::VSNPrint(buffer, (len + 1), fmt, args2);
|
| - va_end(args2);
|
| -
|
| - EXPECT_SUBSTRING(buffer, buff);
|
| -}
|
| -
|
| -
|
| static RawFunction* GetFunction(const Class& cls, const char* name) {
|
| const Function& result = Function::Handle(cls.LookupDynamicFunction(
|
| String::Handle(String::New(name))));
|
| @@ -186,591 +108,6 @@ static RawClass* GetClass(const Library& lib, const char* name) {
|
| }
|
|
|
|
|
| -TEST_CASE(Service_Isolate) {
|
| - const char* kScript =
|
| - "var port;\n" // Set to our mock port by C++.
|
| - "\n"
|
| - "main() {\n"
|
| - "}";
|
| -
|
| - 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, SendPort::New(port_id));
|
| - EXPECT_VALID(port);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
|
| -
|
| - Array& service_msg = Array::Handle();
|
| -
|
| - // Get the isolate summary.
|
| - service_msg = Eval(lib, "[0, port, 'getIsolate', [], []]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| -
|
| - JSONReader reader(handler.msg());
|
| -
|
| - const int kBufferSize = 128;
|
| - char buffer[kBufferSize];
|
| -
|
| - // Check that the response string is somewhat sane.
|
| -
|
| - // type
|
| - EXPECT(reader.Seek("type"));
|
| - EXPECT_EQ(reader.Type(), JSONReader::kString);
|
| - reader.GetDecodedValueChars(buffer, kBufferSize);
|
| - EXPECT_STREQ("Isolate", buffer);
|
| -
|
| - // id
|
| - EXPECT(reader.Seek("id"));
|
| - EXPECT_EQ(reader.Type(), JSONReader::kString);
|
| - reader.GetDecodedValueChars(buffer, kBufferSize);
|
| - EXPECT_SUBSTRING("isolates/", buffer);
|
| -
|
| - // heap
|
| - EXPECT(reader.Seek("heaps"));
|
| - EXPECT_EQ(reader.Type(), JSONReader::kObject);
|
| -}
|
| -
|
| -
|
| -TEST_CASE(Service_Objects) {
|
| - // TODO(turnidge): Extend this test to cover a non-trivial stack trace.
|
| - const char* kScript =
|
| - "var port;\n" // Set to our mock port by C++.
|
| - "var validId;\n" // Set to a valid object id by C++.
|
| - "\n"
|
| - "main() {\n"
|
| - "}";
|
| -
|
| - 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, SendPort::New(port_id));
|
| - EXPECT_VALID(port);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
|
| -
|
| - ObjectIdRing* ring = isolate->object_id_ring();
|
| - const Array& arr = Array::Handle(Array::New(1, Heap::kOld));
|
| - {
|
| - HANDLESCOPE(isolate);
|
| - const String& str = String::Handle(String::New("value", Heap::kOld));
|
| - arr.SetAt(0, str);
|
| - }
|
| - intptr_t arr_id = ring->GetIdForObject(arr.raw());
|
| - Dart_Handle valid_id = Dart_NewInteger(arr_id);
|
| - EXPECT_VALID(valid_id);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("validId"), valid_id));
|
| -
|
| - Array& service_msg = Array::Handle();
|
| -
|
| - // null
|
| - service_msg = Eval(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['objects/null']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - handler.filterMsg("_vmName");
|
| - EXPECT_SUBSTRING(
|
| - "{\"type\":\"null\",\"id\":\"objects\\/null\","
|
| - "\"valueAsString\":\"null\",\"class\":",
|
| - handler.msg());
|
| -
|
| - // bool
|
| - service_msg = Eval(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['objects/bool-true']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - handler.filterMsg("_vmName");
|
| - handler.filterMsg("size");
|
| - EXPECT_STREQ(
|
| - "{\"type\":\"bool\","
|
| - "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/45\","
|
| - "\"name\":\"bool\"},"
|
| - "\"fields\":[],\"id\":\"objects\\/bool-true\","
|
| - "\"valueAsString\":\"true\"}",
|
| - handler.msg());
|
| -
|
| - // int
|
| - service_msg = Eval(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['objects/int-123']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - handler.filterMsg("_vmName");
|
| - EXPECT_STREQ(
|
| - "{\"type\":\"int\",\"_vmType\":\"Smi\","
|
| - "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/41\","
|
| - "\"name\":\"_Smi\",},"
|
| - "\"fields\":[],"
|
| - "\"id\":\"objects\\/int-123\","
|
| - "\"valueAsString\":\"123\"}",
|
| - handler.msg());
|
| -
|
| - // object id ring / valid
|
| - service_msg = Eval(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['objects/$validId']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - handler.filterMsg("_vmName");
|
| - handler.filterMsg("size");
|
| - handler.filterMsg("id");
|
| - EXPECT_STREQ(
|
| - "{\"type\":\"List\",\"_vmType\":\"Array\","
|
| - "\"class\":{\"type\":\"@Class\",\"name\":\"_List\",},"
|
| - "\"fields\":[],"
|
| - "\"length\":1,"
|
| - "\"elements\":[{"
|
| - "\"index\":0,"
|
| - "\"value\":{\"type\":\"@String\","
|
| - "\"class\":{\"type\":\"@Class\",\"name\":\"_OneByteString\",},"
|
| - "\"valueAsString\":\"value\"}}]}",
|
| - handler.msg());
|
| -
|
| - // object id ring / invalid => expired
|
| - service_msg = Eval(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['objects/99999999']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - handler.filterMsg("_vmName");
|
| - EXPECT_STREQ(
|
| - "{\"type\":\"Sentinel\",\"id\":\"objects\\/expired\","
|
| - "\"valueAsString\":\"<expired>\"}",
|
| - handler.msg());
|
| -
|
| - // Retained by single instance.
|
| - service_msg = Eval(
|
| - lib,
|
| - "[0, port, 'getRetainedSize', "
|
| - "['targetId'], ['objects/$validId']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - handler.filterMsg("_vmName");
|
| - ExpectSubstringF(handler.msg(),
|
| - "\"id\":\"objects\\/int-%" Pd "\"",
|
| - arr.raw()->Size() + arr.At(0)->Size());
|
| -
|
| - // Retaining path to 'arr', limit 1.
|
| - service_msg = Eval(
|
| - lib,
|
| - "[0, port, 'getRetainingPath', "
|
| - "['targetId', 'limit'], ['objects/$validId', '1']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - ExpectSubstringF(
|
| - handler.msg(),
|
| - "{\"type\":\"RetainingPath\",\"length\":1,"
|
| - "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@List\"");
|
| -
|
| - // Retaining path missing limit.
|
| - service_msg = Eval(
|
| - lib,
|
| - "[0, port, 'getRetainingPath', "
|
| - "['targetId'], ['objects/$validId']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - ExpectSubstringF(handler.msg(), "{\"type\":\"Error\"");
|
| -}
|
| -
|
| -
|
| -TEST_CASE(Service_RetainingPath) {
|
| - const char* kScript =
|
| - "var port;\n" // Set to our mock port by C++.
|
| - "var id0;\n" // Set to an object id by C++.
|
| - "var id1;\n" // Ditto.
|
| - "var idElem;\n" // Ditto.
|
| - "class Foo {\n"
|
| - " String f0;\n"
|
| - " String f1;\n"
|
| - "}\n"
|
| - "Foo foo;\n"
|
| - "List<String> lst;\n"
|
| - "main() {\n"
|
| - " foo = new Foo();\n"
|
| - " lst = new List<String>(100);\n"
|
| - "}\n";
|
| - Isolate* isolate = Isolate::Current();
|
| - Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
|
| - EXPECT_VALID(lib);
|
| - Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| - EXPECT_VALID(result);
|
| - Library& vmlib = Library::Handle();
|
| - vmlib ^= Api::UnwrapHandle(lib);
|
| - EXPECT(!vmlib.IsNull());
|
| - const Class& class_foo = Class::Handle(GetClass(vmlib, "Foo"));
|
| - EXPECT(!class_foo.IsNull());
|
| - Dart_Handle foo = Dart_GetField(lib, NewString("foo"));
|
| - Dart_Handle lst = Dart_GetField(lib, NewString("lst"));
|
| - const intptr_t kElemIndex = 42;
|
| - {
|
| - Dart_EnterScope();
|
| - ObjectIdRing* ring = isolate->object_id_ring();
|
| - {
|
| - const String& foo0 = String::Handle(String::New("foo0", Heap::kOld));
|
| - Dart_Handle h_foo0 = Api::NewHandle(isolate, foo0.raw());
|
| - EXPECT_VALID(Dart_SetField(foo, NewString("f0"), h_foo0));
|
| - Dart_Handle id0 = Dart_NewInteger(ring->GetIdForObject(foo0.raw()));
|
| - EXPECT_VALID(id0);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("id0"), id0));
|
| - }
|
| - {
|
| - const String& foo1 = String::Handle(String::New("foo1", Heap::kOld));
|
| - Dart_Handle h_foo1 = Api::NewHandle(isolate, foo1.raw());
|
| - EXPECT_VALID(Dart_SetField(foo, NewString("f1"), h_foo1));
|
| - Dart_Handle id1 = Dart_NewInteger(ring->GetIdForObject(foo1.raw()));
|
| - EXPECT_VALID(id1);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("id1"), id1));
|
| - }
|
| - {
|
| - const String& elem = String::Handle(String::New("elem", Heap::kOld));
|
| - Dart_Handle h_elem = Api::NewHandle(isolate, elem.raw());
|
| - EXPECT_VALID(Dart_ListSetAt(lst, kElemIndex, h_elem));
|
| - Dart_Handle idElem = Dart_NewInteger(ring->GetIdForObject(elem.raw()));
|
| - EXPECT_VALID(idElem);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("idElem"), idElem));
|
| - }
|
| - Dart_ExitScope();
|
| - }
|
| -
|
| - // 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, SendPort::New(port_id));
|
| - EXPECT_VALID(port);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
|
| - Array& service_msg = Array::Handle();
|
| -
|
| - // Retaining path to 'foo0', limit 2.
|
| - service_msg = Eval(
|
| - lib,
|
| - "[0, port, 'getRetainingPath', "
|
| - "['targetId', 'limit'], ['objects/$id0', '2']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - ExpectSubstringF(
|
| - handler.msg(),
|
| - "{\"type\":\"RetainingPath\",\"length\":2,"
|
| - "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\"");
|
| - ExpectSubstringF(handler.msg(), "\"parentField\":{\"type\":\"@Field\"");
|
| - ExpectSubstringF(handler.msg(), "\"name\":\"f0\"");
|
| - ExpectSubstringF(handler.msg(),
|
| - "{\"index\":1,\"value\":{\"type\":\"@Instance\"");
|
| -
|
| - // Retaining path to 'foo1', limit 2.
|
| - service_msg = Eval(
|
| - lib,
|
| - "[0, port, 'getRetainingPath', "
|
| - "['targetId', 'limit'], ['objects/$id1', '2']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - ExpectSubstringF(
|
| - handler.msg(),
|
| - "{\"type\":\"RetainingPath\",\"length\":2,"
|
| - "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\"");
|
| - ExpectSubstringF(handler.msg(), "\"parentField\":{\"type\":\"@Field\"");
|
| - ExpectSubstringF(handler.msg(), "\"name\":\"f1\"");
|
| - ExpectSubstringF(handler.msg(),
|
| - "{\"index\":1,\"value\":{\"type\":\"@Instance\"");
|
| -
|
| - // Retaining path to 'elem', limit 2.
|
| - service_msg = Eval(
|
| - lib,
|
| - "[0, port, 'getRetainingPath', "
|
| - "['targetId', 'limit'], ['objects/$idElem', '2']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - ExpectSubstringF(
|
| - handler.msg(),
|
| - "{\"type\":\"RetainingPath\",\"length\":2,"
|
| - "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@String\"");
|
| - ExpectSubstringF(handler.msg(), "\"parentListIndex\":%" Pd, kElemIndex);
|
| - ExpectSubstringF(handler.msg(),
|
| - "{\"index\":1,\"value\":{\"type\":\"@List\"");
|
| -}
|
| -
|
| -
|
| -TEST_CASE(Service_Libraries) {
|
| - const char* kScript =
|
| - "var port;\n" // Set to our mock port by C++.
|
| - "var libVar = 54321;\n"
|
| - "\n"
|
| - "main() {\n"
|
| - "}";
|
| -
|
| - Isolate* isolate = Isolate::Current();
|
| - Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
|
| - EXPECT_VALID(lib);
|
| - Library& vmlib = Library::Handle();
|
| - vmlib ^= Api::UnwrapHandle(lib);
|
| - EXPECT(!vmlib.IsNull());
|
| -
|
| - // 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, SendPort::New(port_id));
|
| - EXPECT_VALID(port);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
|
| -
|
| - Array& service_msg = Array::Handle();
|
| -
|
| - // Request library.
|
| - service_msg =
|
| - EvalF(lib,
|
| - "[0, port, 'getObject', ['objectId'], ['libraries/%" Pd "']]",
|
| - vmlib.index());
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Library\"", handler.msg());
|
| - EXPECT_SUBSTRING("\"url\":\"test-lib\"", handler.msg());
|
| -}
|
| -
|
| -
|
| -TEST_CASE(Service_Classes) {
|
| - const char* kScript =
|
| - "var port;\n" // Set to our mock port by C++.
|
| - "\n"
|
| - "class A {\n"
|
| - " var a;\n"
|
| - " static var cobra = 11235;\n"
|
| - " dynamic b() {}\n"
|
| - " dynamic c() {\n"
|
| - " var d = () { b(); };\n"
|
| - " return d;\n"
|
| - " }\n"
|
| - "}\n"
|
| - "class B { static int i = 42; }\n"
|
| - "main() {\n"
|
| - " var z = new A();\n"
|
| - " var x = z.c();\n"
|
| - " x();\n"
|
| - " ++B.i;\n"
|
| - "}";
|
| -
|
| - Isolate* isolate = Isolate::Current();
|
| - Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
|
| - EXPECT_VALID(lib);
|
| - Library& vmlib = Library::Handle();
|
| - vmlib ^= Api::UnwrapHandle(lib);
|
| - EXPECT(!vmlib.IsNull());
|
| - Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| - EXPECT_VALID(result);
|
| - const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
|
| - EXPECT(!class_a.IsNull());
|
| - intptr_t cid = class_a.id();
|
| -
|
| - // 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, SendPort::New(port_id));
|
| - EXPECT_VALID(port);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
|
| -
|
| - Array& service_msg = Array::Handle();
|
| -
|
| - // Request an invalid class id.
|
| - service_msg = Eval(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/999999']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
|
| -
|
| - // Request the class A over the service.
|
| - service_msg = EvalF(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "']]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg());
|
| - ExpectSubstringF(handler.msg(),
|
| - "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid);
|
| - ExpectSubstringF(handler.msg(), "\"allocationStats\":");
|
| - ExpectSubstringF(handler.msg(), "\"tokenPos\":");
|
| - ExpectSubstringF(handler.msg(), "\"endTokenPos\":");
|
| -
|
| - // Request function 'b' from class A.
|
| - service_msg = EvalF(lib,
|
| - "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "/functions/b']]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Function\"", handler.msg());
|
| - ExpectSubstringF(handler.msg(),
|
| - "\"id\":\"classes\\/%" Pd "\\/functions\\/b\","
|
| - "\"name\":\"b\",", cid);
|
| -
|
| - // Request field 0 from class A.
|
| - service_msg = EvalF(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "/fields/0']]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Field\"", handler.msg());
|
| - ExpectSubstringF(handler.msg(),
|
| - "\"id\":\"classes\\/%" Pd "\\/fields\\/0\","
|
| - "\"name\":\"a\",", cid);
|
| -
|
| - // Invalid sub command.
|
| - service_msg = EvalF(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "/huh']]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
|
| -
|
| - // Invalid field request.
|
| - service_msg = EvalF(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "/fields/9']]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
|
| -
|
| - // Invalid function request.
|
| - service_msg = EvalF(lib,
|
| - "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "/functions/9']]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
|
| -
|
| - // Invalid field subcommand.
|
| - service_msg = EvalF(lib,
|
| - "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "/fields/9']]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
|
| -
|
| - // Invalid function command.
|
| - service_msg = EvalF(lib,
|
| - "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "/functions/0/x/y']]",
|
| - cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
|
| -
|
| - // Invalid function subcommand with valid function id.
|
| - service_msg = EvalF(lib,
|
| - "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "/functions/b/x']]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
|
| -
|
| - // Retained size of all instances of class B.
|
| - const Class& class_b = Class::Handle(GetClass(vmlib, "B"));
|
| - EXPECT(!class_b.IsNull());
|
| - const Instance& b0 = Instance::Handle(Instance::New(class_b));
|
| - const Instance& b1 = Instance::Handle(Instance::New(class_b));
|
| - service_msg = EvalF(lib, "[0, port, 'getRetainedSize', "
|
| - "['targetId'], ['classes/%" Pd "']]", class_b.id());
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - ExpectSubstringF(handler.msg(),
|
| - "\"id\":\"objects\\/int-%" Pd "\"",
|
| - b0.raw()->Size() + b1.raw()->Size());
|
| - // ... and list the instances of class B.
|
| - service_msg = EvalF(lib, "[0, port, 'getInstances', "
|
| - "['classId', 'limit'], ['classes/%" Pd "', '3']]",
|
| - class_b.id());
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - ExpectSubstringF(handler.msg(), "\"type\":\"InstanceSet\"");
|
| - ExpectSubstringF(handler.msg(), "\"totalCount\":2");
|
| - ExpectSubstringF(handler.msg(), "\"sampleCount\":2");
|
| - // TODO(koda): Actually parse the response.
|
| - static const intptr_t kInstanceListId = 0;
|
| - ExpectSubstringF(handler.msg(), "\"id\":\"objects\\/%" Pd "\",\"length\":2",
|
| - kInstanceListId);
|
| - Array& list = Array::Handle();
|
| - ObjectIdRing::LookupResult kind;
|
| - list ^= isolate->object_id_ring()->GetObjectForId(kInstanceListId, &kind);
|
| - EXPECT_EQ(2, list.Length());
|
| - // The list should contain {b0, b1}.
|
| - EXPECT((list.At(0) == b0.raw() && list.At(1) == b1.raw()) ||
|
| - (list.At(0) == b1.raw() && list.At(1) == b0.raw()));
|
| - // ... and if limit is 1, we one get one of them.
|
| - service_msg = EvalF(lib, "[0, port, 'getInstances', "
|
| - "['classId', 'limit'], ['classes/%" Pd "', '1']]",
|
| - class_b.id());
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - ExpectSubstringF(handler.msg(), "\"totalCount\":2");
|
| - ExpectSubstringF(handler.msg(), "\"sampleCount\":1");
|
| -}
|
| -
|
| -
|
| -TEST_CASE(Service_Types) {
|
| - const char* kScript =
|
| - "var port;\n" // Set to our mock port by C++.
|
| - "\n"
|
| - "class A<T> { }\n"
|
| - "\n"
|
| - "main() {\n"
|
| - " new A<A<bool>>();\n"
|
| - "}";
|
| -
|
| - Isolate* isolate = Isolate::Current();
|
| - Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
|
| - EXPECT_VALID(lib);
|
| - Library& vmlib = Library::Handle();
|
| - vmlib ^= Api::UnwrapHandle(lib);
|
| - EXPECT(!vmlib.IsNull());
|
| - Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| - EXPECT_VALID(result);
|
| - const Class& class_a = Class::Handle(GetClass(vmlib, "A"));
|
| - EXPECT(!class_a.IsNull());
|
| - intptr_t cid = class_a.id();
|
| -
|
| - // 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, SendPort::New(port_id));
|
| - EXPECT_VALID(port);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
|
| -
|
| - Array& service_msg = Array::Handle();
|
| -
|
| - // Request the class A over the service.
|
| - service_msg = EvalF(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "']]]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg());
|
| - EXPECT_SUBSTRING("\"name\":\"A\"", handler.msg());
|
| - ExpectSubstringF(handler.msg(),
|
| - "\"id\":\"classes\\/%" Pd "\"", cid);
|
| -
|
| - // Request canonical type 0 from class A.
|
| - service_msg = EvalF(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "/types/0']]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg());
|
| - EXPECT_SUBSTRING("\"name\":\"A<bool>\"", handler.msg());
|
| - ExpectSubstringF(handler.msg(),
|
| - "\"id\":\"classes\\/%" Pd "\\/types\\/0\"", cid);
|
| -
|
| - // Request canonical type 1 from class A.
|
| - service_msg = EvalF(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "/types/1']]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Type\"", handler.msg());
|
| - EXPECT_SUBSTRING("\"name\":\"A<A<bool>>\"", handler.msg());
|
| - ExpectSubstringF(handler.msg(),
|
| - "\"id\":\"classes\\/%" Pd "\\/types\\/1\"", cid);
|
| -
|
| - // Request for non-existent canonical type from class A.
|
| - service_msg = EvalF(lib, "[0, port, 'getObject', "
|
| - "['objectId'], ['classes/%" Pd "/types/42']]", cid);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
|
| -}
|
| -
|
| -
|
| TEST_CASE(Service_Code) {
|
| const char* kScript =
|
| "var port;\n" // Set to our mock port by C++.
|
| @@ -1056,228 +393,6 @@ TEST_CASE(Service_LocalVarDescriptors) {
|
| }
|
|
|
|
|
| -TEST_CASE(Service_VM) {
|
| - const char* kScript =
|
| - "var port;\n" // Set to our mock port by C++.
|
| - "\n"
|
| - "main() {\n"
|
| - "}";
|
| -
|
| - 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, SendPort::New(port_id));
|
| - EXPECT_VALID(port);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
|
| -
|
| - Array& service_msg = Array::Handle();
|
| - service_msg = EvalVM(lib, "[0, port, 'getVM', [], []]");
|
| -
|
| - Service::HandleRootMessage(service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"VM\"", handler.msg());
|
| - EXPECT_SUBSTRING("\"targetCPU\"", handler.msg());
|
| - EXPECT_SUBSTRING("\"hostCPU\"", handler.msg());
|
| - EXPECT_SUBSTRING("\"version\"", handler.msg());
|
| - EXPECT_SUBSTRING("\"startTime\"", handler.msg());
|
| - EXPECT_SUBSTRING("\"isolates\"", handler.msg());
|
| -}
|
| -
|
| -
|
| -TEST_CASE(Service_Flags) {
|
| - const char* kScript =
|
| - "var port;\n" // Set to our mock port by C++.
|
| - "\n"
|
| - "main() {\n"
|
| - "}";
|
| -
|
| - 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, SendPort::New(port_id));
|
| - EXPECT_VALID(port);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
|
| -
|
| - Array& service_msg = Array::Handle();
|
| - service_msg = EvalVM(lib, "[0, port, 'getFlagList', [], []]");
|
| -
|
| - // Make sure we can get the FlagList.
|
| - Service::HandleRootMessage(service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"FlagList\"", handler.msg());
|
| - EXPECT_SUBSTRING(
|
| - "\"name\":\"service_testing_flag\",\"comment\":\"Comment\","
|
| - "\"flagType\":\"bool\",\"valueAsString\":\"false\"",
|
| - handler.msg());
|
| -
|
| - // Modify a flag through the vm service.
|
| - service_msg = EvalVM(lib,
|
| - "[0, port, 'setFlag', "
|
| - "['name', 'value'], ['service_testing_flag', 'true']]");
|
| - Service::HandleRootMessage(service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("Success", handler.msg());
|
| -
|
| - // Make sure that the flag changed.
|
| - service_msg = EvalVM(lib, "[0, port, 'getFlagList', [], []]");
|
| - Service::HandleRootMessage(service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING(
|
| - "\"name\":\"service_testing_flag\",\"comment\":\"Comment\","
|
| - "\"flagType\":\"bool\",\"valueAsString\":\"true\"",
|
| - handler.msg());
|
| -}
|
| -
|
| -
|
| -TEST_CASE(Service_Scripts) {
|
| - const char* kScript =
|
| - "var port;\n" // Set to our mock port by C++.
|
| - "\n"
|
| - "main() {\n"
|
| - "}";
|
| -
|
| - Isolate* isolate = Isolate::Current();
|
| - Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
|
| - EXPECT_VALID(lib);
|
| - Library& vmlib = Library::Handle();
|
| - vmlib ^= Api::UnwrapHandle(lib);
|
| - EXPECT(!vmlib.IsNull());
|
| -
|
| - // 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, SendPort::New(port_id));
|
| - EXPECT_VALID(port);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
|
| -
|
| - Array& service_msg = Array::Handle();
|
| - char buf[1024];
|
| - OS::SNPrint(buf, sizeof(buf),
|
| - "[0, port, 'getObject', "
|
| - "['objectId'], ['libraries/%" Pd "/scripts/test-lib']]",
|
| - vmlib.index());
|
| -
|
| - service_msg = Eval(lib, buf);
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - OS::SNPrint(buf, sizeof(buf),
|
| - "{\"type\":\"Script\","
|
| - "\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
|
| - "\"name\":\"test-lib\","
|
| - "\"kind\":\"script\","
|
| - "\"library\":{\"type\":\"@Library\","
|
| - "\"id\":\"libraries\\/%" Pd "\",\"name\":\"\","
|
| - "\"url\":\"test-lib\"},"
|
| - "\"source\":\"var port;\\n\\nmain() {\\n}\","
|
| - "\"tokenPosTable\":[[1,0,1,1,5,2,9],[3,5,1,6,5,7,6,8,8],[4,10,1]]}",
|
| - vmlib.index(), vmlib.index());
|
| - EXPECT_STREQ(buf, handler.msg());
|
| -}
|
| -
|
| -
|
| -TEST_CASE(Service_AllocationProfile) {
|
| - const char* kScript =
|
| - "var port;\n" // Set to our mock port by C++.
|
| - "\n"
|
| - "var x = 7;\n"
|
| - "main() {\n"
|
| - " x = x * x;\n"
|
| - " x = x / 13;\n"
|
| - "}";
|
| -
|
| - Isolate* isolate = Isolate::Current();
|
| - Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
|
| - EXPECT_VALID(lib);
|
| - Dart_Handle result = Dart_Invoke(lib, NewString("main"), 0, NULL);
|
| - EXPECT_VALID(result);
|
| -
|
| - // 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, SendPort::New(port_id));
|
| - EXPECT_VALID(port);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
|
| -
|
| - Array& service_msg = Array::Handle();
|
| - service_msg = Eval(lib, "[0, port, 'getAllocationProfile', [], []]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
|
| -
|
| - // Bad gc option.
|
| - service_msg = Eval(lib,
|
| - "[0, port, 'getAllocationProfile', "
|
| - "['gc'], ['cat']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
|
| -
|
| - // Bad reset option.
|
| - service_msg = Eval(lib, "[0, port, 'getAllocationProfile', "
|
| - "['reset'], ['ff']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
|
| -
|
| - // Good reset.
|
| - service_msg =
|
| - Eval(lib,
|
| - "[0, port, 'getAllocationProfile', ['reset'], ['true']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
|
| -
|
| - // Good GC.
|
| - service_msg =
|
| - Eval(lib, "[0, port, 'getAllocationProfile', ['gc'], ['full']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
|
| -
|
| - // Good GC and reset.
|
| - service_msg = Eval(lib, "[0, port, 'getAllocationProfile', "
|
| - "['gc', 'reset'], ['full', 'true']]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"AllocationProfile\"", handler.msg());
|
| -}
|
| -
|
| -
|
| -TEST_CASE(Service_HeapMap) {
|
| - const char* kScript =
|
| - "var port;\n" // Set to our mock port by C++.
|
| - "\n"
|
| - "main() {\n"
|
| - "}";
|
| -
|
| - 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, SendPort::New(port_id));
|
| - EXPECT_VALID(port);
|
| - EXPECT_VALID(Dart_SetField(lib, NewString("port"), port));
|
| -
|
| - Array& service_msg = Array::Handle();
|
| - service_msg = Eval(lib, "[0, port, 'getHeapMap', [], []]");
|
| - Service::HandleIsolateMessage(isolate, service_msg);
|
| - handler.HandleNextMessage();
|
| - EXPECT_SUBSTRING("\"type\":\"HeapMap\"", handler.msg());
|
| - EXPECT_SUBSTRING("\"pages\":[", handler.msg());
|
| -}
|
| -
|
| -
|
| TEST_CASE(Service_Address) {
|
| const char* kScript =
|
| "var port;\n" // Set to our mock port by C++.
|
| @@ -1326,8 +441,8 @@ TEST_CASE(Service_Address) {
|
| Service::HandleIsolateMessage(isolate, service_msg);
|
| handler.HandleNextMessage();
|
| // TODO(turnidge): Should this be a ServiceException instead?
|
| - EXPECT_SUBSTRING("{\"type\":\"null\",\"id\":\"objects\\/null\","
|
| - "\"valueAsString\":\"null\"",
|
| + EXPECT_SUBSTRING("{\"type\":\"Sentinel\",\"id\":\"objects\\/free\","
|
| + "\"valueAsString\":\"<free>\"",
|
| handler.msg());
|
| }
|
|
|
|
|