| Index: runtime/vm/snapshot_test.cc
|
| diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
|
| index a67845b79f8b4ad4b1e4278961da9010a6676f06..62d7d85d88d4f571dbf1fc2c195b15e6a5f95100 100644
|
| --- a/runtime/vm/snapshot_test.cc
|
| +++ b/runtime/vm/snapshot_test.cc
|
| @@ -63,6 +63,7 @@ TEST_CASE(SerializeNull) {
|
| writer.BytesWritten(),
|
| &allocator);
|
| Dart_CObject* cobject = mreader.ReadObject();
|
| + EXPECT_NOTNULL(cobject);
|
| EXPECT_EQ(Dart_CObject::kNull, cobject->type);
|
| free(cobject);
|
| }
|
| @@ -89,6 +90,7 @@ TEST_CASE(SerializeSmi1) {
|
| writer.BytesWritten(),
|
| &allocator);
|
| Dart_CObject* cobject = mreader.ReadObject();
|
| + EXPECT_NOTNULL(cobject);
|
| EXPECT_EQ(Dart_CObject::kInt32, cobject->type);
|
| EXPECT_EQ(smi.Value(), cobject->value.as_int32);
|
| free(cobject);
|
| @@ -116,6 +118,7 @@ TEST_CASE(SerializeSmi2) {
|
| writer.BytesWritten(),
|
| &allocator);
|
| Dart_CObject* cobject = mreader.ReadObject();
|
| + EXPECT_NOTNULL(cobject);
|
| EXPECT_EQ(Dart_CObject::kInt32, cobject->type);
|
| EXPECT_EQ(smi.Value(), cobject->value.as_int32);
|
| free(cobject);
|
| @@ -143,6 +146,7 @@ TEST_CASE(SerializeDouble) {
|
| writer.BytesWritten(),
|
| &allocator);
|
| Dart_CObject* cobject = mreader.ReadObject();
|
| + EXPECT_NOTNULL(cobject);
|
| EXPECT_EQ(Dart_CObject::kDouble, cobject->type);
|
| EXPECT_EQ(dbl.value(), cobject->value.as_double);
|
| free(cobject);
|
| @@ -172,9 +176,11 @@ TEST_CASE(SerializeBool) {
|
| writer.BytesWritten(),
|
| &allocator);
|
| Dart_CObject* cobject1 = mreader.ReadObject();
|
| + EXPECT_NOTNULL(cobject1);
|
| EXPECT_EQ(Dart_CObject::kBool, cobject1->type);
|
| EXPECT_EQ(true, cobject1->value.as_bool);
|
| Dart_CObject* cobject2 = mreader.ReadObject();
|
| + EXPECT_NOTNULL(cobject2);
|
| EXPECT_EQ(Dart_CObject::kBool, cobject2->type);
|
| EXPECT_EQ(false, cobject2->value.as_bool);
|
| free(cobject1);
|
| @@ -664,18 +670,46 @@ TEST_CASE(IntArrayMessage) {
|
| }
|
|
|
|
|
| +// Helper function to call a top level Dart function, serialize the
|
| +// result and deserialize the result into a Dart_CObject structure.
|
| +static Dart_CObject* GetDeserializedDartObject(Dart_Handle lib,
|
| + const char* dart_function) {
|
| + Dart_Handle result;
|
| + result = Dart_InvokeStatic(lib,
|
| + Dart_NewString(""),
|
| + Dart_NewString(dart_function),
|
| + 0,
|
| + NULL);
|
| + EXPECT_VALID(result);
|
| +
|
| + // Serialize the list into a message.
|
| + uint8_t* buffer;
|
| + SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| + const Object& list = Object::Handle(Api::UnwrapHandle(result));
|
| + writer.WriteObject(list.raw());
|
| + writer.FinalizeBuffer();
|
| +
|
| + // Read object back from the snapshot into a C structure.
|
| + CMessageReader reader(buffer + Snapshot::kHeaderSize,
|
| + writer.BytesWritten(),
|
| + &allocator);
|
| + Dart_CObject* value = reader.ReadObject();
|
| + free(buffer);
|
| + return value;
|
| +}
|
| +
|
| +
|
| UNIT_TEST_CASE(DartGeneratedMessages) {
|
| - const int kArrayLength = 10;
|
| static const char* kCustomIsolateScriptChars =
|
| - "getSmi() {\n"
|
| - " return 42;\n"
|
| - "}\n"
|
| - "getString() {\n"
|
| + "getSmi() {\n"
|
| + " return 42;\n"
|
| + "}\n"
|
| + "getString() {\n"
|
| " return \"Hello, world!\";\n"
|
| - "}\n"
|
| - "getList() {\n"
|
| - " return [1,2,3,4,5,6,7,8,9,10];\n"
|
| - "}\n";
|
| + "}\n"
|
| + "getList() {\n"
|
| + " return new List(kArrayLength);\n"
|
| + "}\n";
|
|
|
| TestCase::CreateTestIsolate();
|
| Isolate* isolate = Isolate::Current();
|
| @@ -700,17 +734,7 @@ UNIT_TEST_CASE(DartGeneratedMessages) {
|
| NULL);
|
| EXPECT_VALID(string_result);
|
| EXPECT(Dart_IsString(string_result));
|
| - Dart_Handle list_result;
|
| - list_result = Dart_InvokeStatic(lib,
|
| - Dart_NewString(""),
|
| - Dart_NewString("getList"),
|
| - 0,
|
| - NULL);
|
| - EXPECT_VALID(list_result);
|
| - EXPECT(Dart_IsList(list_result));
|
| - intptr_t result_len = 0;
|
| - EXPECT_VALID(Dart_ListLength(list_result, &result_len));
|
| - EXPECT_EQ(kArrayLength, result_len);
|
| +
|
| {
|
| DARTSCOPE_NOCHECKS(isolate);
|
|
|
| @@ -727,6 +751,7 @@ UNIT_TEST_CASE(DartGeneratedMessages) {
|
| writer.BytesWritten(),
|
| &allocator);
|
| Dart_CObject* value = mreader.ReadObject();
|
| + EXPECT_NOTNULL(value);
|
| EXPECT_EQ(Dart_CObject::kInt32, value->type);
|
| EXPECT_EQ(42, value->value.as_int32);
|
| free(value);
|
| @@ -745,19 +770,118 @@ UNIT_TEST_CASE(DartGeneratedMessages) {
|
| writer.BytesWritten(),
|
| &allocator);
|
| Dart_CObject* value = mreader.ReadObject();
|
| + EXPECT_NOTNULL(value);
|
| EXPECT_EQ(Dart_CObject::kString, value->type);
|
| EXPECT_STREQ("Hello, world!", value->value.as_string);
|
| free(value);
|
| free(buffer);
|
| }
|
| + }
|
| + Dart_ExitScope();
|
| + Dart_ShutdownIsolate();
|
| +}
|
| +
|
| +
|
| +UNIT_TEST_CASE(DartGeneratedListMessages) {
|
| + const int kArrayLength = 10;
|
| + static const char* kScriptChars =
|
| + "final int kArrayLength = 10;\n"
|
| + "getList() {\n"
|
| + " return new List(kArrayLength);\n"
|
| + "}\n"
|
| + "getIntList() {\n"
|
| + " var list = new List<int>(kArrayLength);\n"
|
| + " for (var i = 0; i < kArrayLength; i++) list[i] = i;\n"
|
| + " return list;\n"
|
| + "}\n"
|
| + "getStringList() {\n"
|
| + " var list = new List<String>(kArrayLength);\n"
|
| + " for (var i = 0; i < kArrayLength; i++) list[i] = i.toString();\n"
|
| + " return list;\n"
|
| + "}\n"
|
| + "getMixedList() {\n"
|
| + " var list = new List(kArrayLength);\n"
|
| + " list[0] = 0;\n"
|
| + " list[1] = '1';\n"
|
| + " list[2] = 2.2;\n"
|
| + " list[3] = true;\n"
|
| + " return list;\n"
|
| + "}\n";
|
| +
|
| + TestCase::CreateTestIsolate();
|
| + Isolate* isolate = Isolate::Current();
|
| + EXPECT(isolate != NULL);
|
| + Dart_EnterScope();
|
| +
|
| + Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
|
| + EXPECT_VALID(lib);
|
| +
|
| + {
|
| + DARTSCOPE_NOCHECKS(isolate);
|
| +
|
| {
|
| - uint8_t* buffer;
|
| - SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator);
|
| - const Object& list = Object::Handle(Api::UnwrapHandle(list_result));
|
| - writer.WriteObject(list.raw());
|
| - writer.FinalizeBuffer();
|
| - // TODO(sgjesse): Make this work!
|
| - free(buffer);
|
| + // Generate a list of nulls from Dart code.
|
| + Dart_CObject* value = GetDeserializedDartObject(lib, "getList");
|
| + EXPECT_NOTNULL(value);
|
| + EXPECT_EQ(Dart_CObject::kArray, value->type);
|
| + EXPECT_EQ(kArrayLength, value->value.as_array.length);
|
| + for (int i = 0; i < kArrayLength; i++) {
|
| + EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type);
|
| + free(value->value.as_array.values[i]);
|
| + }
|
| + free(value);
|
| + }
|
| + {
|
| + // Generate a list of ints from Dart code.
|
| + Dart_CObject* value = GetDeserializedDartObject(lib, "getIntList");
|
| + EXPECT_NOTNULL(value);
|
| + EXPECT_EQ(Dart_CObject::kArray, value->type);
|
| + EXPECT_EQ(kArrayLength, value->value.as_array.length);
|
| + for (int i = 0; i < kArrayLength; i++) {
|
| + EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type);
|
| + EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32);
|
| + free(value->value.as_array.values[i]);
|
| + }
|
| + free(value);
|
| + }
|
| + {
|
| + // Generate a list of strings from Dart code.
|
| + Dart_CObject* value = GetDeserializedDartObject(lib, "getStringList");
|
| + EXPECT_NOTNULL(value);
|
| + EXPECT_EQ(Dart_CObject::kArray, value->type);
|
| + EXPECT_EQ(kArrayLength, value->value.as_array.length);
|
| + for (int i = 0; i < kArrayLength; i++) {
|
| + EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[i]->type);
|
| + char buffer[3];
|
| + snprintf(buffer, sizeof(buffer), "%d", i);
|
| + EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string);
|
| + free(value->value.as_array.values[i]);
|
| + }
|
| + free(value);
|
| + }
|
| + {
|
| + // Generate a list of objects of different types from Dart code.
|
| + Dart_CObject* value = GetDeserializedDartObject(lib, "getMixedList");
|
| + EXPECT_NOTNULL(value);
|
| + EXPECT_EQ(Dart_CObject::kArray, value->type);
|
| + EXPECT_EQ(kArrayLength, value->value.as_array.length);
|
| +
|
| + EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[0]->type);
|
| + EXPECT_EQ(0, value->value.as_array.values[0]->value.as_int32);
|
| + EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[1]->type);
|
| + EXPECT_STREQ("1", value->value.as_array.values[1]->value.as_string);
|
| + EXPECT_EQ(Dart_CObject::kDouble, value->value.as_array.values[2]->type);
|
| + EXPECT_EQ(2.2, value->value.as_array.values[2]->value.as_double);
|
| + EXPECT_EQ(Dart_CObject::kBool, value->value.as_array.values[3]->type);
|
| + EXPECT_EQ(true, value->value.as_array.values[3]->value.as_bool);
|
| +
|
| + for (int i = 0; i < kArrayLength; i++) {
|
| + if (i > 3) {
|
| + EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type);
|
| + }
|
| + free(value->value.as_array.values[i]);
|
| + }
|
| + free(value);
|
| }
|
| }
|
| Dart_ExitScope();
|
|
|