Index: runtime/vm/snapshot_test.cc |
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc |
index 68df7d535fa566d73d630c954049aae81927830d..e35aae34280131370a6fdfbd0fb7d96d619fba86 100644 |
--- a/runtime/vm/snapshot_test.cc |
+++ b/runtime/vm/snapshot_test.cc |
@@ -51,6 +51,52 @@ static void FreeDeserializedDartMessage(Dart_CMessage* cmessage) { |
} |
+static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) { |
+ EXPECT_NE(first, second); |
+ EXPECT_EQ(first->type, second->type); |
+ switch (first->type) { |
+ case Dart_CObject::kNull: |
+ // Nothing more to compare. |
+ break; |
+ case Dart_CObject::kBool: |
+ EXPECT_EQ(first->value.as_bool, second->value.as_bool); |
+ break; |
+ case Dart_CObject::kInt32: |
+ EXPECT_EQ(first->value.as_int32, second->value.as_int32); |
+ break; |
+ case Dart_CObject::kDouble: |
+ EXPECT_EQ(first->value.as_double, second->value.as_double); |
+ break; |
+ case Dart_CObject::kString: |
+ EXPECT_STREQ(first->value.as_string, second->value.as_string); |
+ break; |
+ case Dart_CObject::kArray: |
+ EXPECT_EQ(first->value.as_array.length, second->value.as_array.length); |
+ for (int i = 0; i < first->value.as_array.length; i++) { |
+ CompareDartCObjects(first->value.as_array.values[i], |
+ second->value.as_array.values[i]); |
+ } |
+ break; |
+ default: |
+ EXPECT(false); |
+ } |
+} |
+ |
+ |
+static void CheckEncodeMessage(Dart_CMessage* cmessage) { |
+ // Encode and decode the message. |
+ uint8_t* again = Dart_EncodeMessage(cmessage, allocator); |
+ // TODO(sgjesse): Get the length of the encoded message instead of |
+ // 1000. The length is not currently used for decoding, so a large |
+ // value works for testing. |
+ Dart_CMessage* new_cmessage = |
+ Dart_DecodeMessage(again + Snapshot::kHeaderSize, 1000, &allocator); |
+ |
+ // Check that the two messages are the same. |
+ CompareDartCObjects(cmessage->object, new_cmessage->object); |
+ FreeDeserializedDartMessage(new_cmessage); |
+} |
+ |
TEST_CASE(SerializeNull) { |
// Write snapshot with object content. |
uint8_t* buffer; |
@@ -74,6 +120,7 @@ TEST_CASE(SerializeNull) { |
Dart_CObject* cobject = cmessage->object; |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kNull, cobject->type); |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
@@ -102,6 +149,7 @@ TEST_CASE(SerializeSmi1) { |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
@@ -130,6 +178,7 @@ TEST_CASE(SerializeSmi2) { |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
@@ -158,6 +207,7 @@ TEST_CASE(SerializeDouble) { |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kDouble, cobject->type); |
EXPECT_EQ(dbl.value(), cobject->value.as_double); |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
@@ -202,6 +252,7 @@ TEST_CASE(SerializeTrue) { |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kBool, cobject->type); |
EXPECT_EQ(true, cobject->value.as_bool); |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
@@ -226,6 +277,7 @@ TEST_CASE(SerializeFalse) { |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kBool, cobject->type); |
EXPECT_EQ(false, cobject->value.as_bool); |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
@@ -336,6 +388,7 @@ TEST_CASE(SerializeString) { |
Dart_CObject* cobject = cmessage->object; |
EXPECT_EQ(Dart_CObject::kString, cobject->type); |
EXPECT_STREQ(cstr, cobject->value.as_string); |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
@@ -375,6 +428,7 @@ TEST_CASE(SerializeArray) { |
EXPECT_EQ(Dart_CObject::kInt32, element->type); |
EXPECT_EQ(i, element->value.as_int32); |
} |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
@@ -405,6 +459,7 @@ TEST_CASE(SerializeEmptyArray) { |
EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
EXPECT(cobject->value.as_array.values == NULL); |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
@@ -707,6 +762,7 @@ TEST_CASE(IntArrayMessage) { |
EXPECT_EQ(Dart_CObject::kInt32, element->type); |
EXPECT_EQ(i + 1, element->value.as_int32); |
} |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
@@ -794,6 +850,7 @@ UNIT_TEST_CASE(DartGeneratedMessages) { |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
EXPECT_EQ(42, cobject->value.as_int32); |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
{ |
@@ -813,6 +870,7 @@ UNIT_TEST_CASE(DartGeneratedMessages) { |
EXPECT_NOTNULL(cobject); |
EXPECT_EQ(Dart_CObject::kString, cobject->type); |
EXPECT_STREQ("Hello, world!", cobject->value.as_string); |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
} |
@@ -857,7 +915,6 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
{ |
DARTSCOPE_NOCHECKS(isolate); |
- |
{ |
// Generate a list of nulls from Dart code. |
Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getList"); |
@@ -868,6 +925,7 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
for (int i = 0; i < kArrayLength; i++) { |
EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
} |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
{ |
@@ -881,6 +939,7 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); |
EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); |
} |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
{ |
@@ -897,6 +956,7 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
snprintf(buffer, sizeof(buffer), "%d", i); |
EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string); |
} |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
{ |
@@ -921,6 +981,7 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
} |
} |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
} |
@@ -985,6 +1046,7 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
EXPECT_EQ(Dart_CObject::kString, element->type); |
EXPECT_STREQ("Hello, world!", element->value.as_string); |
} |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
{ |
@@ -1001,6 +1063,7 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
EXPECT_EQ(Dart_CObject::kDouble, element->type); |
EXPECT_EQ(3.14, element->value.as_double); |
} |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
{ |
@@ -1022,6 +1085,7 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
EXPECT_STREQ(2.72, element->value.as_double); |
} |
} |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
{ |
@@ -1037,6 +1101,7 @@ UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
EXPECT_EQ(Dart_CObject::kArray, element->type); |
EXPECT_EQ(object, element); |
} |
+ CheckEncodeMessage(cmessage); |
FreeDeserializedDartMessage(cmessage); |
} |
} |