15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc. All Rights Reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: xpeng@google.com (Peter Peng) 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/common.h> 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <gtest/gtest.h> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google { 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf { 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(StructurallyValidTest, ValidUTF8String) { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On GCC, this string can be written as: 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "abcd 1234 - \u2014\u2013\u2212" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MSVC seems to interpret \u differently. 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string valid_str("abcd 1234 - \342\200\224\342\200\223\342\210\222 - xyz789"); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsStructurallyValidUTF8(valid_str.data(), 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid_str.size())); 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Additional check for pointer alignment 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i < 8; ++i) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(IsStructurallyValidUTF8(valid_str.data() + i, 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) valid_str.size() - i)); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(StructurallyValidTest, InvalidUTF8String) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const string invalid_str("abcd\xA0\xB0\xA0\xB0\xA0\xB0 - xyz789"); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsStructurallyValidUTF8(invalid_str.data(), 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalid_str.size())); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Additional check for pointer alignment 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i < 8; ++i) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(IsStructurallyValidUTF8(invalid_str.data() + i, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) invalid_str.size() - i)); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protobuf 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace google 41