Chromium Code Reviews| Index: ppapi/tests/test_char_set.cc |
| diff --git a/ppapi/tests/test_char_set.cc b/ppapi/tests/test_char_set.cc |
| index b1bbe545c55f5cf839b53e2f69f4cc153f2e2b6d..74912ecf6120cb13f418c9775bb0fd977273a6bd 100644 |
| --- a/ppapi/tests/test_char_set.cc |
| +++ b/ppapi/tests/test_char_set.cc |
| @@ -5,6 +5,7 @@ |
| #include "ppapi/tests/test_char_set.h" |
| #include "ppapi/c/dev/ppb_char_set_dev.h" |
| +#include "ppapi/c/trusted/ppb_char_set_trusted.h" |
| #include "ppapi/cpp/dev/memory_dev.h" |
| #include "ppapi/cpp/module.h" |
| #include "ppapi/tests/testing_instance.h" |
| @@ -19,16 +20,21 @@ TestCharSet::TestCharSet(TestingInstance* instance) |
| bool TestCharSet::Init() { |
| char_set_interface_ = static_cast<const PPB_CharSet_Dev*>( |
| pp::Module::Get()->GetBrowserInterface(PPB_CHAR_SET_DEV_INTERFACE)); |
| - return !!char_set_interface_; |
| + char_set_trusted_interface_ = static_cast<const PPB_CharSet_Trusted*>( |
| + pp::Module::Get()->GetBrowserInterface(PPB_CHARSET_TRUSTED_INTERFACE)); |
| + return char_set_interface_ && char_set_trusted_interface_; |
| } |
| void TestCharSet::RunTests(const std::string& filter) { |
| + RUN_TEST(UTF16ToCharSetDeprecated, filter); |
| RUN_TEST(UTF16ToCharSet, filter); |
| + RUN_TEST(CharSetToUTF16Deprecated, filter); |
| RUN_TEST(CharSetToUTF16, filter); |
| RUN_TEST(GetDefaultCharSet, filter); |
| } |
| -std::string TestCharSet::TestUTF16ToCharSet() { |
| +// TODO(brettw) remove this when the old interface is removed. |
| +std::string TestCharSet::TestUTF16ToCharSetDeprecated() { |
| // Empty string. |
| std::vector<uint16_t> utf16; |
| utf16.push_back(0); |
| @@ -102,7 +108,117 @@ std::string TestCharSet::TestUTF16ToCharSet() { |
| PASS(); |
| } |
| -std::string TestCharSet::TestCharSetToUTF16() { |
| +std::string TestCharSet::TestUTF16ToCharSet() { |
| + // Empty string. |
| + std::vector<uint16_t> utf16; |
| + utf16.push_back(0); |
| + std::string output_buffer; |
| + uint32_t utf8result_len = static_cast<uint32_t>(output_buffer.size()); |
| + PP_Bool result = char_set_trusted_interface_->UTF16ToCharSet( |
| + &utf16[0], 0, "latin1", PP_CHARSET_TRUSTED_CONVERSIONERROR_SUBSTITUTE, |
| + &output_buffer[0], &utf8result_len); |
| + ASSERT_TRUE(result == PP_TRUE); |
| + ASSERT_TRUE(utf8result_len == 0); |
| + |
| + // No output buffer size returns length of string. |
|
bbudge
2012/02/08 21:56:58
Null output buffer returns length of...
|
| + utf16 = UTF8ToUTF16("hello"); |
| + utf8result_len = 0; |
| + result = char_set_trusted_interface_->UTF16ToCharSet( |
| + &utf16[0], static_cast<uint32_t>(utf16.size()), "latin1", |
| + PP_CHARSET_TRUSTED_CONVERSIONERROR_SUBSTITUTE, NULL, &utf8result_len); |
| + ASSERT_TRUE(result == PP_TRUE); |
| + ASSERT_TRUE(utf8result_len == 5); |
| + |
| + // Giving too small of a buffer just fills in that many items and gives us |
| + // the desired size. |
| + output_buffer.resize(100); |
| + utf8result_len = 2; |
| + output_buffer[utf8result_len] = '$'; // Barrier character. |
| + result = char_set_trusted_interface_->UTF16ToCharSet( |
| + &utf16[0], static_cast<uint32_t>(utf16.size()), "latin1", |
| + PP_CHARSET_TRUSTED_CONVERSIONERROR_SUBSTITUTE, |
| + &output_buffer[0], &utf8result_len); |
| + ASSERT_TRUE(result == PP_TRUE); |
| + ASSERT_TRUE(utf8result_len == 5); |
| + ASSERT_TRUE(output_buffer[0] == 'h' && output_buffer[1] == 'e' && |
| + output_buffer[2] == '$'); |
| + |
| + // Try round-tripping some English & Chinese from UTF-8 through UTF-16 |
| + std::string utf8source("Hello, world. \xe4\xbd\xa0\xe5\xa5\xbd"); |
| + utf16 = UTF8ToUTF16(utf8source); |
| + output_buffer.resize(100); |
| + utf8result_len = static_cast<uint32_t>(output_buffer.size()); |
| + result = char_set_trusted_interface_->UTF16ToCharSet( |
| + &utf16[0], static_cast<uint32_t>(utf16.size()), |
| + "Utf-8", PP_CHARSET_TRUSTED_CONVERSIONERROR_FAIL, |
| + &output_buffer[0], &utf8result_len); |
| + ASSERT_TRUE(result == PP_TRUE); |
| + output_buffer.resize(utf8result_len); |
| + ASSERT_TRUE(utf8source == output_buffer); |
| + |
| + // Test an un-encodable character with various modes. |
| + utf16 = UTF8ToUTF16("h\xe4\xbd\xa0i"); |
| + |
| + // Fail mode, size should get 0'ed on failure. |
| + output_buffer.resize(100); |
| + utf8result_len = static_cast<uint32_t>(output_buffer.size()); |
| + result = char_set_trusted_interface_->UTF16ToCharSet( |
| + &utf16[0], static_cast<uint32_t>(utf16.size()), |
| + "latin1", PP_CHARSET_TRUSTED_CONVERSIONERROR_FAIL, |
| + &output_buffer[0], &utf8result_len); |
| + ASSERT_TRUE(result == PP_FALSE); |
| + ASSERT_TRUE(utf8result_len == 0); |
| + |
| + // Skip mode. |
| + output_buffer.resize(100); |
| + utf8result_len = static_cast<uint32_t>(output_buffer.size()); |
| + result = char_set_trusted_interface_->UTF16ToCharSet( |
| + &utf16[0], static_cast<uint32_t>(utf16.size()), |
| + "latin1", PP_CHARSET_TRUSTED_CONVERSIONERROR_SKIP, |
| + &output_buffer[0], &utf8result_len); |
| + ASSERT_TRUE(result == PP_TRUE); |
| + ASSERT_TRUE(utf8result_len == 2); |
| + ASSERT_TRUE(output_buffer[0] == 'h' && output_buffer[1] == 'i'); |
| + |
| + // Substitute mode. |
| + output_buffer.resize(100); |
| + utf8result_len = static_cast<uint32_t>(output_buffer.size()); |
| + result = char_set_trusted_interface_->UTF16ToCharSet( |
| + &utf16[0], static_cast<uint32_t>(utf16.size()), |
| + "latin1", PP_CHARSET_TRUSTED_CONVERSIONERROR_SUBSTITUTE, |
| + &output_buffer[0], &utf8result_len); |
| + ASSERT_TRUE(utf8result_len == 3); |
| + output_buffer.resize(utf8result_len); |
| + ASSERT_TRUE(output_buffer == "h?i"); |
| + |
| + // Try some invalid input encoding. |
| + output_buffer.resize(100); |
| + utf8result_len = static_cast<uint32_t>(output_buffer.size()); |
| + utf16.clear(); |
| + utf16.push_back(0xD800); // High surrogate. |
| + utf16.push_back('A'); // Not a low surrogate. |
| + result = char_set_trusted_interface_->UTF16ToCharSet( |
| + &utf16[0], static_cast<uint32_t>(utf16.size()), |
| + "latin1", PP_CHARSET_TRUSTED_CONVERSIONERROR_SUBSTITUTE, |
| + &output_buffer[0], &utf8result_len); |
| + ASSERT_TRUE(utf8result_len == 2); |
| + ASSERT_TRUE(output_buffer[0] == '?' && output_buffer[1] == 'A'); |
| + |
| + // Invalid encoding name. |
| + output_buffer.resize(100); |
| + utf8result_len = static_cast<uint32_t>(output_buffer.size()); |
| + result = char_set_trusted_interface_->UTF16ToCharSet( |
| + &utf16[0], static_cast<uint32_t>(utf16.size()), |
| + "poopiepants", PP_CHARSET_TRUSTED_CONVERSIONERROR_SUBSTITUTE, |
| + &output_buffer[0], &utf8result_len); |
| + ASSERT_TRUE(result == PP_FALSE); |
| + ASSERT_TRUE(utf8result_len == 0); |
| + |
| + PASS(); |
| +} |
| + |
| +// TODO(brettw) remove this when the old interface is removed. |
| +std::string TestCharSet::TestCharSetToUTF16Deprecated() { |
| pp::Memory_Dev memory; |
| // Empty string. |
| @@ -166,6 +282,74 @@ std::string TestCharSet::TestCharSetToUTF16() { |
| PASS(); |
| } |
| +std::string TestCharSet::TestCharSetToUTF16() { |
| + std::vector<uint16_t> output_buffer; |
| + output_buffer.resize(100); |
| + |
| + // Empty string. |
| + output_buffer.resize(100); |
| + uint32_t utf16result_len = static_cast<uint32_t>(output_buffer.size()); |
| + PP_Bool result = char_set_trusted_interface_->CharSetToUTF16( |
| + "", 0, "latin1", PP_CHARSET_TRUSTED_CONVERSIONERROR_FAIL, |
| + &output_buffer[0], &utf16result_len); |
| + ASSERT_TRUE(result); |
| + ASSERT_TRUE(utf16result_len == 0); |
| + ASSERT_TRUE(output_buffer[0] == 0); |
| + |
| + // Basic Latin1. |
| + output_buffer.resize(100); |
| + utf16result_len = static_cast<uint32_t>(output_buffer.size()); |
| + char latin1[] = "H\xef"; |
| + result = char_set_trusted_interface_->CharSetToUTF16( |
| + latin1, 2, "latin1", PP_CHARSET_TRUSTED_CONVERSIONERROR_FAIL, |
| + &output_buffer[0], &utf16result_len); |
| + ASSERT_TRUE(result); |
| + ASSERT_TRUE(utf16result_len == 2); |
| + ASSERT_TRUE(output_buffer[0] == 'H' && output_buffer[1] == 0xef); |
| + |
| + // Invalid input encoding with FAIL. |
| + output_buffer.resize(100); |
| + utf16result_len = static_cast<uint32_t>(output_buffer.size()); |
| + char badutf8[] = "A\xe4Z"; |
| + result = char_set_trusted_interface_->CharSetToUTF16( |
| + badutf8, 3, "utf8", PP_CHARSET_TRUSTED_CONVERSIONERROR_FAIL, |
| + &output_buffer[0], &utf16result_len); |
| + ASSERT_TRUE(!result); |
| + ASSERT_TRUE(utf16result_len == 0); |
| + |
| + // Invalid input with SKIP. |
| + output_buffer.resize(100); |
| + utf16result_len = static_cast<uint32_t>(output_buffer.size()); |
| + result = char_set_trusted_interface_->CharSetToUTF16( |
| + badutf8, 3, "utf8", PP_CHARSET_TRUSTED_CONVERSIONERROR_SKIP, |
| + &output_buffer[0], &utf16result_len); |
| + ASSERT_TRUE(result); |
| + ASSERT_TRUE(utf16result_len == 2); |
| + ASSERT_TRUE(output_buffer[0] == 'A' && output_buffer[1] == 'Z'); |
| + |
| + // Invalid input with SUBSTITUTE. |
| + output_buffer.resize(100); |
| + utf16result_len = static_cast<uint32_t>(output_buffer.size()); |
| + result = char_set_trusted_interface_->CharSetToUTF16( |
| + badutf8, 3, "utf8", PP_CHARSET_TRUSTED_CONVERSIONERROR_SUBSTITUTE, |
| + &output_buffer[0], &utf16result_len); |
| + ASSERT_TRUE(result); |
| + ASSERT_TRUE(utf16result_len == 3); |
| + ASSERT_TRUE(output_buffer[0] == 'A' && output_buffer[1] == 0xFFFD && |
| + output_buffer[2] == 'Z'); |
| + |
| + // Invalid encoding name. |
| + output_buffer.resize(100); |
| + utf16result_len = static_cast<uint32_t>(output_buffer.size()); |
| + result = char_set_trusted_interface_->CharSetToUTF16( |
| + badutf8, 3, "poopiepants", PP_CHARSET_TRUSTED_CONVERSIONERROR_SUBSTITUTE, |
| + &output_buffer[0], &utf16result_len); |
| + ASSERT_TRUE(!result); |
| + ASSERT_TRUE(utf16result_len == 0); |
| + |
| + PASS(); |
| +} |
| + |
| std::string TestCharSet::TestGetDefaultCharSet() { |
| // Test invalid instance. |
| pp::Var result(pp::Var::PassRef(), char_set_interface_->GetDefaultCharSet(0)); |