Chromium Code Reviews| Index: runtime/vm/snapshot_test.cc |
| diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc |
| index 07326ae8c1507b46c99daca2f1b179eb896ca500..3607c1cc915adba62beb7c90f6c9a3d095f58e65 100644 |
| --- a/runtime/vm/snapshot_test.cc |
| +++ b/runtime/vm/snapshot_test.cc |
| @@ -1257,6 +1257,26 @@ static Dart_CObject* GetDeserializedDartMessage(Dart_Handle lib, |
| } |
| +static void CheckString(Dart_Handle string, const char* expected) { |
| + StackZone zone(Isolate::Current()); |
| + uint8_t* buffer; |
| + MessageWriter writer(&buffer, &zone_allocator); |
| + String& str = String::Handle(); |
| + str ^= Api::UnwrapHandle(string); |
| + writer.WriteMessage(str); |
| + intptr_t buffer_len = writer.BytesWritten(); |
| + |
| + // Read object back from the snapshot into a C structure. |
| + ApiNativeScope scope; |
| + ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
| + Dart_CObject* root = api_reader.ReadMessage(); |
| + EXPECT_NOTNULL(root); |
| + EXPECT_EQ(Dart_CObject::kString, root->type); |
| + EXPECT_STREQ(expected, root->value.as_string); |
| + CheckEncodeDecodeMessage(root); |
| +} |
| + |
| + |
| UNIT_TEST_CASE(DartGeneratedMessages) { |
| static const char* kCustomIsolateScriptChars = |
| "getSmi() {\n" |
| @@ -1271,6 +1291,21 @@ UNIT_TEST_CASE(DartGeneratedMessages) { |
| "getNonAsciiString() {\n" |
| " return \"Blåbærgrød\";\n" |
| "}\n" |
| + "getNonBMPString() {\n" |
| + " return \"\\u{10000}\\u{1F601}\\u{1F637}\\u{20000}\";\n" |
|
erikcorry
2012/11/23 14:25:47
😁
|
| + "}\n" |
| + "getLeadSurrogateString() {\n" |
| + " return new String.fromCharCodes([0xd800]);\n" |
| + "}\n" |
| + "getTrailSurrogateString() {\n" |
| + " return \"\\u{10000}\".substring(1);\n" |
| + "}\n" |
| + "getSurrogatesString() {\n" |
| + " return new String.fromCharCodes([0xdc00, 0xdc00, 0xd800, 0xd800]);\n" |
| + "}\n" |
| + "getCrappyString() {\n" |
| + " return new String.fromCharCodes([0xd800, 32, 0xdc00, 32]);\n" |
| + "}\n" |
| "getList() {\n" |
| " return new List(kArrayLength);\n" |
| "}\n"; |
| @@ -1289,16 +1324,48 @@ UNIT_TEST_CASE(DartGeneratedMessages) { |
| Dart_Handle bigint_result; |
| bigint_result = Dart_Invoke(lib, NewString("getBigint"), 0, NULL); |
| EXPECT_VALID(bigint_result); |
| + |
| Dart_Handle ascii_string_result; |
| ascii_string_result = Dart_Invoke(lib, NewString("getAsciiString"), 0, NULL); |
| EXPECT_VALID(ascii_string_result); |
| EXPECT(Dart_IsString(ascii_string_result)); |
| + |
| Dart_Handle non_ascii_string_result; |
| non_ascii_string_result = |
| Dart_Invoke(lib, NewString("getNonAsciiString"), 0, NULL); |
| EXPECT_VALID(non_ascii_string_result); |
| EXPECT(Dart_IsString(non_ascii_string_result)); |
| + Dart_Handle non_bmp_string_result; |
| + non_bmp_string_result = |
| + Dart_Invoke(lib, NewString("getNonBMPString"), 0, NULL); |
| + EXPECT_VALID(non_bmp_string_result); |
| + EXPECT(Dart_IsString(non_bmp_string_result)); |
| + |
| + Dart_Handle lead_surrogate_string_result; |
| + lead_surrogate_string_result = |
| + Dart_Invoke(lib, NewString("getLeadSurrogateString"), 0, NULL); |
| + EXPECT_VALID(lead_surrogate_string_result); |
| + EXPECT(Dart_IsString(lead_surrogate_string_result)); |
| + |
| + Dart_Handle trail_surrogate_string_result; |
| + trail_surrogate_string_result = |
| + Dart_Invoke(lib, NewString("getTrailSurrogateString"), 0, NULL); |
| + EXPECT_VALID(trail_surrogate_string_result); |
| + EXPECT(Dart_IsString(trail_surrogate_string_result)); |
| + |
| + Dart_Handle surrogates_string_result; |
| + surrogates_string_result = |
| + Dart_Invoke(lib, NewString("getSurrogatesString"), 0, NULL); |
| + EXPECT_VALID(surrogates_string_result); |
| + EXPECT(Dart_IsString(surrogates_string_result)); |
| + |
| + Dart_Handle crappy_string_result; |
| + crappy_string_result = |
| + Dart_Invoke(lib, NewString("getCrappyString"), 0, NULL); |
| + EXPECT_VALID(crappy_string_result); |
| + EXPECT(Dart_IsString(crappy_string_result)); |
| + |
| { |
| DARTSCOPE_NOCHECKS(isolate); |
| @@ -1339,42 +1406,19 @@ UNIT_TEST_CASE(DartGeneratedMessages) { |
| root->value.as_bigint); |
| CheckEncodeDecodeMessage(root); |
| } |
| - { |
| - StackZone zone(Isolate::Current()); |
| - uint8_t* buffer; |
| - MessageWriter writer(&buffer, &zone_allocator); |
| - String& str = String::Handle(); |
| - str ^= Api::UnwrapHandle(ascii_string_result); |
| - writer.WriteMessage(str); |
| - intptr_t buffer_len = writer.BytesWritten(); |
| - |
| - // Read object back from the snapshot into a C structure. |
| - ApiNativeScope scope; |
| - ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
| - Dart_CObject* root = api_reader.ReadMessage(); |
| - EXPECT_NOTNULL(root); |
| - EXPECT_EQ(Dart_CObject::kString, root->type); |
| - EXPECT_STREQ("Hello, world!", root->value.as_string); |
| - CheckEncodeDecodeMessage(root); |
| - } |
| - { |
| - StackZone zone(Isolate::Current()); |
| - uint8_t* buffer; |
| - MessageWriter writer(&buffer, &zone_allocator); |
| - String& str = String::Handle(); |
| - str ^= Api::UnwrapHandle(non_ascii_string_result); |
| - writer.WriteMessage(str); |
| - intptr_t buffer_len = writer.BytesWritten(); |
| - |
| - // Read object back from the snapshot into a C structure. |
| - ApiNativeScope scope; |
| - ApiMessageReader api_reader(buffer, buffer_len, &zone_allocator); |
| - Dart_CObject* root = api_reader.ReadMessage(); |
| - EXPECT_NOTNULL(root); |
| - EXPECT_EQ(Dart_CObject::kString, root->type); |
| - EXPECT_STREQ("Blåbærgrød", root->value.as_string); |
| - CheckEncodeDecodeMessage(root); |
| - } |
| + CheckString(ascii_string_result, "Hello, world!"); |
| + CheckString(non_ascii_string_result, "Blåbærgrød"); |
| + CheckString(non_bmp_string_result, |
| + "\xf0\x90\x80\x80" |
| + "\xf0\x9f\x98\x81" |
| + "\xf0\x9f\x98\xb7" |
| + "\xf0\xa0\x80\x80"); |
| + CheckString(lead_surrogate_string_result, "\xed\xa0\x80"); |
| + CheckString(trail_surrogate_string_result, "\xed\xb0\x80"); |
| + CheckString(crappy_string_result, |
| + "\xed\xa0\x80\x20\xed\xb0\x80\x20"); |
| + CheckString(surrogates_string_result, |
| + "\xed\xb0\x80\xed\xb0\x80\xed\xa0\x80\xed\xa0\x80"); |
| } |
| Dart_ExitScope(); |
| Dart_ShutdownIsolate(); |
| @@ -2070,7 +2114,6 @@ UNIT_TEST_CASE(PostCObject) { |
| Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| Dart_EnterScope(); |
| - // xxx |
| Dart_Handle send_port = Dart_Invoke(lib, NewString("main"), 0, NULL); |
| EXPECT_VALID(send_port); |
| Dart_Handle result = Dart_GetField(send_port, NewString("_id")); |
| @@ -2106,12 +2149,6 @@ UNIT_TEST_CASE(PostCObject) { |
| object.value.as_string = const_cast<char*>("æøå"); |
| EXPECT(Dart_PostCObject(send_port_id, &object)); |
| - // Try to post an invalid UTF-8 sequence (lead surrogate). |
| - const char* data = "\xED\xA0\x80"; // U+D800 |
| - object.type = Dart_CObject::kString; |
| - object.value.as_string = const_cast<char*>(data); |
| - EXPECT(!Dart_PostCObject(send_port_id, &object)); |
| - |
| object.type = Dart_CObject::kDouble; |
| object.value.as_double = 3.14; |
| EXPECT(Dart_PostCObject(send_port_id, &object)); |