12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 1611e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 17a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include "utils.h" 18a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 193481ba2c4e4f3aa80d8c6d50a9f85dacb56b508bVladimir Marko#include "class_linker-inl.h" 20a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include "common_runtime_test.h" 212dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/array.h" 222dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/array-inl.h" 232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object-inl.h" 242dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object_array-inl.h" 252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/string.h" 2600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers#include "scoped_thread_state_change.h" 27eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier#include "handle_scope-inl.h" 2811e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 291e13374baf7dfaf442ffbf9809c37c131d681eafEvgenii Stepanov#include "base/memory_tool.h" 30661974a5561e5ccdfbac8cb5d8df8b7e6f3483b8Mathieu Chartier 3111e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughesnamespace art { 3211e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 339058f2bf308871bd43c194c6a771587ecf79740dElliott Hughesstd::string PrettyArguments(const char* signature); 349058f2bf308871bd43c194c6a771587ecf79740dElliott Hughesstd::string PrettyReturnType(const char* signature); 359058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes 36a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass UtilsTest : public CommonRuntimeTest {}; 3711e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 385174fe6e4e931c423e910366ff22ce0838567940Elliott HughesTEST_F(UtilsTest, PrettyDescriptor_ArrayReferences) { 399058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("java.lang.Class[]", PrettyDescriptor("[Ljava/lang/Class;")); 409058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("java.lang.Class[][]", PrettyDescriptor("[[Ljava/lang/Class;")); 4111e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes} 4211e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 435174fe6e4e931c423e910366ff22ce0838567940Elliott HughesTEST_F(UtilsTest, PrettyDescriptor_ScalarReferences) { 449058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("java.lang.String", PrettyDescriptor("Ljava.lang.String;")); 459058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("java.lang.String", PrettyDescriptor("Ljava/lang/String;")); 4611e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes} 4711e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 4876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu ChartierTEST_F(UtilsTest, PrettyDescriptor_Primitive) { 4976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier EXPECT_EQ("boolean", PrettyDescriptor(Primitive::kPrimBoolean)); 5076433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier EXPECT_EQ("byte", PrettyDescriptor(Primitive::kPrimByte)); 5176433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier EXPECT_EQ("char", PrettyDescriptor(Primitive::kPrimChar)); 5276433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier EXPECT_EQ("short", PrettyDescriptor(Primitive::kPrimShort)); 5376433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier EXPECT_EQ("int", PrettyDescriptor(Primitive::kPrimInt)); 5476433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier EXPECT_EQ("float", PrettyDescriptor(Primitive::kPrimFloat)); 5576433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier EXPECT_EQ("long", PrettyDescriptor(Primitive::kPrimLong)); 5676433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier EXPECT_EQ("double", PrettyDescriptor(Primitive::kPrimDouble)); 5776433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier EXPECT_EQ("void", PrettyDescriptor(Primitive::kPrimVoid)); 5876433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier} 5976433275dbe39e5ced1c223b006d1b900b1937f6Mathieu Chartier 605174fe6e4e931c423e910366ff22ce0838567940Elliott HughesTEST_F(UtilsTest, PrettyDescriptor_PrimitiveArrays) { 619058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("boolean[]", PrettyDescriptor("[Z")); 629058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("boolean[][]", PrettyDescriptor("[[Z")); 639058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("byte[]", PrettyDescriptor("[B")); 649058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("byte[][]", PrettyDescriptor("[[B")); 659058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("char[]", PrettyDescriptor("[C")); 669058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("char[][]", PrettyDescriptor("[[C")); 679058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("double[]", PrettyDescriptor("[D")); 689058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("double[][]", PrettyDescriptor("[[D")); 699058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("float[]", PrettyDescriptor("[F")); 709058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("float[][]", PrettyDescriptor("[[F")); 719058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("int[]", PrettyDescriptor("[I")); 729058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("int[][]", PrettyDescriptor("[[I")); 739058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("long[]", PrettyDescriptor("[J")); 749058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("long[][]", PrettyDescriptor("[[J")); 759058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("short[]", PrettyDescriptor("[S")); 769058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("short[][]", PrettyDescriptor("[[S")); 7711e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes} 7811e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 795174fe6e4e931c423e910366ff22ce0838567940Elliott HughesTEST_F(UtilsTest, PrettyDescriptor_PrimitiveScalars) { 809058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("boolean", PrettyDescriptor("Z")); 819058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("byte", PrettyDescriptor("B")); 829058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("char", PrettyDescriptor("C")); 839058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("double", PrettyDescriptor("D")); 849058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("float", PrettyDescriptor("F")); 859058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("int", PrettyDescriptor("I")); 869058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("long", PrettyDescriptor("J")); 879058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("short", PrettyDescriptor("S")); 889058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes} 899058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes 909058f2bf308871bd43c194c6a771587ecf79740dElliott HughesTEST_F(UtilsTest, PrettyArguments) { 919058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("()", PrettyArguments("()V")); 929058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("(int)", PrettyArguments("(I)V")); 939058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("(int, int)", PrettyArguments("(II)V")); 949058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("(int, int, int[][])", PrettyArguments("(II[[I)V")); 959058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("(int, int, int[][], java.lang.Poop)", PrettyArguments("(II[[ILjava/lang/Poop;)V")); 969058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("(int, int, int[][], java.lang.Poop, java.lang.Poop[][])", PrettyArguments("(II[[ILjava/lang/Poop;[[Ljava/lang/Poop;)V")); 979058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes} 989058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes 999058f2bf308871bd43c194c6a771587ecf79740dElliott HughesTEST_F(UtilsTest, PrettyReturnType) { 1009058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("void", PrettyReturnType("()V")); 1019058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("int", PrettyReturnType("()I")); 1029058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("int[][]", PrettyReturnType("()[[I")); 1039058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("java.lang.Poop", PrettyReturnType("()Ljava/lang/Poop;")); 1049058f2bf308871bd43c194c6a771587ecf79740dElliott Hughes EXPECT_EQ("java.lang.Poop[][]", PrettyReturnType("()[[Ljava/lang/Poop;")); 10511e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes} 10611e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 10754e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott HughesTEST_F(UtilsTest, PrettyTypeOf) { 10800f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 1092cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier EXPECT_EQ("null", PrettyTypeOf(nullptr)); 11011e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 111eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier StackHandleScope<2> hs(soa.Self()); 112eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier Handle<mirror::String> s(hs.NewHandle(mirror::String::AllocFromModifiedUtf8(soa.Self(), ""))); 113eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier EXPECT_EQ("java.lang.String", PrettyTypeOf(s.Get())); 11411e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 115eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier Handle<mirror::ShortArray> a(hs.NewHandle(mirror::ShortArray::Alloc(soa.Self(), 2))); 116eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier EXPECT_EQ("short[]", PrettyTypeOf(a.Get())); 11711e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 1189837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* c = class_linker_->FindSystemClass(soa.Self(), "[Ljava/lang/String;"); 1192cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier ASSERT_TRUE(c != nullptr); 1202dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Object* o = mirror::ObjectArray<mirror::String>::Alloc(soa.Self(), c, 0); 12154e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes EXPECT_EQ("java.lang.String[]", PrettyTypeOf(o)); 12254e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes EXPECT_EQ("java.lang.Class<java.lang.String[]>", PrettyTypeOf(o->GetClass())); 12354e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes} 12454e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes 12554e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott HughesTEST_F(UtilsTest, PrettyClass) { 12600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 1272cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier EXPECT_EQ("null", PrettyClass(nullptr)); 1289837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* c = class_linker_->FindSystemClass(soa.Self(), "[Ljava/lang/String;"); 1292cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier ASSERT_TRUE(c != nullptr); 1302dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Object* o = mirror::ObjectArray<mirror::String>::Alloc(soa.Self(), c, 0); 13154e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes EXPECT_EQ("java.lang.Class<java.lang.String[]>", PrettyClass(o->GetClass())); 13254e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes} 13354e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes 134d81871cbbaa34c649e488f94f61a981db33123e5Ian RogersTEST_F(UtilsTest, PrettyClassAndClassLoader) { 13500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 1362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier EXPECT_EQ("null", PrettyClassAndClassLoader(nullptr)); 1379837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* c = class_linker_->FindSystemClass(soa.Self(), "[Ljava/lang/String;"); 1382cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier ASSERT_TRUE(c != nullptr); 1392dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers mirror::Object* o = mirror::ObjectArray<mirror::String>::Alloc(soa.Self(), c, 0); 140d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers EXPECT_EQ("java.lang.Class<java.lang.String[],null>", PrettyClassAndClassLoader(o->GetClass())); 141d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers} 142d81871cbbaa34c649e488f94f61a981db33123e5Ian Rogers 14354e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott HughesTEST_F(UtilsTest, PrettyField) { 14400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 1452cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier EXPECT_EQ("null", PrettyField(nullptr)); 14654e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes 1479837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* java_lang_String = class_linker_->FindSystemClass(soa.Self(), 1489837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers "Ljava/lang/String;"); 14954e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes 150c785344b87221f5e4e6473e5b762e4e61fe65dcfMathieu Chartier ArtField* f; 1516b4ef025af12b158d117fc80fc79acf620f411a0Brian Carlstrom f = java_lang_String->FindDeclaredInstanceField("count", "I"); 15254e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes EXPECT_EQ("int java.lang.String.count", PrettyField(f)); 15354e7df1896a4066cbb9fe6f72249829f0b8c49c6Elliott Hughes EXPECT_EQ("java.lang.String.count", PrettyField(f, false)); 15411e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes} 15511e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes 1563bb17a644e2945c3913cfbde245d2f520d62a3ffIan RogersTEST_F(UtilsTest, PrettySize) { 1573bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers EXPECT_EQ("1GB", PrettySize(1 * GB)); 1583bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers EXPECT_EQ("2GB", PrettySize(2 * GB)); 1593bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers if (sizeof(size_t) > sizeof(uint32_t)) { 1603bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers EXPECT_EQ("100GB", PrettySize(100 * GB)); 1613bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers } 162c967f78cd29b6019f7cfca40a02e9b677112da70Elliott Hughes EXPECT_EQ("1024KB", PrettySize(1 * MB)); 1633bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers EXPECT_EQ("10MB", PrettySize(10 * MB)); 1643bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers EXPECT_EQ("100MB", PrettySize(100 * MB)); 165c967f78cd29b6019f7cfca40a02e9b677112da70Elliott Hughes EXPECT_EQ("1024B", PrettySize(1 * KB)); 166409d273a3a57158faaa520ff5f33508367f759f1Elliott Hughes EXPECT_EQ("10KB", PrettySize(10 * KB)); 167409d273a3a57158faaa520ff5f33508367f759f1Elliott Hughes EXPECT_EQ("100KB", PrettySize(100 * KB)); 168c967f78cd29b6019f7cfca40a02e9b677112da70Elliott Hughes EXPECT_EQ("0B", PrettySize(0)); 1693bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers EXPECT_EQ("1B", PrettySize(1)); 1703bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers EXPECT_EQ("10B", PrettySize(10)); 1713bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers EXPECT_EQ("100B", PrettySize(100)); 172c967f78cd29b6019f7cfca40a02e9b677112da70Elliott Hughes EXPECT_EQ("512B", PrettySize(512)); 1733bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers} 1743bb17a644e2945c3913cfbde245d2f520d62a3ffIan Rogers 17579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott HughesTEST_F(UtilsTest, MangleForJni) { 17600f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 17779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes EXPECT_EQ("hello_00024world", MangleForJni("hello$world")); 17879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes EXPECT_EQ("hello_000a9world", MangleForJni("hello\xc2\xa9world")); 17979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes EXPECT_EQ("hello_1world", MangleForJni("hello_world")); 18079082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes EXPECT_EQ("Ljava_lang_String_2", MangleForJni("Ljava/lang/String;")); 18179082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes EXPECT_EQ("_3C", MangleForJni("[C")); 18279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes} 18379082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 18479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott HughesTEST_F(UtilsTest, JniShortName_JniLongName) { 18500f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 1869837939678bb5dcba178e5fb00ed59b5d14c8d9bIan Rogers mirror::Class* c = class_linker_->FindSystemClass(soa.Self(), "Ljava/lang/String;"); 1872cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier ASSERT_TRUE(c != nullptr); 188e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier ArtMethod* m; 18979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 190e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier m = c->FindVirtualMethod("charAt", "(I)C", sizeof(void*)); 1912cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier ASSERT_TRUE(m != nullptr); 19279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes EXPECT_EQ("Java_java_lang_String_charAt", JniShortName(m)); 19379082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes EXPECT_EQ("Java_java_lang_String_charAt__I", JniLongName(m)); 19479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 195e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier m = c->FindVirtualMethod("indexOf", "(Ljava/lang/String;I)I", sizeof(void*)); 1962cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier ASSERT_TRUE(m != nullptr); 19779082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes EXPECT_EQ("Java_java_lang_String_indexOf", JniShortName(m)); 19879082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes EXPECT_EQ("Java_java_lang_String_indexOf__Ljava_lang_String_2I", JniLongName(m)); 19979082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 200e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier m = c->FindDirectMethod("copyValueOf", "([CII)Ljava/lang/String;", sizeof(void*)); 2012cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier ASSERT_TRUE(m != nullptr); 20279082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes EXPECT_EQ("Java_java_lang_String_copyValueOf", JniShortName(m)); 20379082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes EXPECT_EQ("Java_java_lang_String_copyValueOf___3CII", JniLongName(m)); 20479082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes} 20579082e367845bbd68ec44ef2ddd1be8ef0e1550fElliott Hughes 20634023801bd544e613d6e85c9a5b2e743f3710e8fElliott HughesTEST_F(UtilsTest, Split) { 20734023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes std::vector<std::string> actual; 20834023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes std::vector<std::string> expected; 20934023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 21034023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes expected.clear(); 21134023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 21234023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2136f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split("", ':', &actual); 21434023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 21534023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 21634023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2176f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split(":", ':', &actual); 21834023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 21934023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 22034023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes expected.clear(); 22134023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes expected.push_back("foo"); 22234023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 22334023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2246f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split(":foo", ':', &actual); 22534023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 22634023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 22734023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2286f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split("foo:", ':', &actual); 22934023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 23034023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 23134023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2326f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split(":foo:", ':', &actual); 23334023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 23434023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 23534023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes expected.push_back("bar"); 23634023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 23734023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2386f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split("foo:bar", ':', &actual); 23934023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 24034023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 24134023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2426f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split(":foo:bar", ':', &actual); 24334023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 24434023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 24534023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2466f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split("foo:bar:", ':', &actual); 24734023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 24834023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 24934023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2506f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split(":foo:bar:", ':', &actual); 25134023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 25234023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 25334023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes expected.push_back("baz"); 25434023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 25534023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2566f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split("foo:bar:baz", ':', &actual); 25734023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 25834023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 25934023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2606f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split(":foo:bar:baz", ':', &actual); 26134023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 26234023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 26334023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2646f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split("foo:bar:baz:", ':', &actual); 26534023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 26634023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 26734023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes actual.clear(); 2686f3dbbadf4ce66982eb3d400e0a74cb73eb034f3Ian Rogers Split(":foo:bar:baz:", ':', &actual); 26934023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes EXPECT_EQ(expected, actual); 27034023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes} 27134023801bd544e613d6e85c9a5b2e743f3710e8fElliott Hughes 27248436bbff87aae61bba20029b4382fa41ce787feElliott HughesTEST_F(UtilsTest, Join) { 27348436bbff87aae61bba20029b4382fa41ce787feElliott Hughes std::vector<std::string> strings; 27448436bbff87aae61bba20029b4382fa41ce787feElliott Hughes 27548436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.clear(); 27648436bbff87aae61bba20029b4382fa41ce787feElliott Hughes EXPECT_EQ("", Join(strings, ':')); 27748436bbff87aae61bba20029b4382fa41ce787feElliott Hughes 27848436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.clear(); 27948436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back("foo"); 28048436bbff87aae61bba20029b4382fa41ce787feElliott Hughes EXPECT_EQ("foo", Join(strings, ':')); 28148436bbff87aae61bba20029b4382fa41ce787feElliott Hughes 28248436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.clear(); 28348436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back(""); 28448436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back("foo"); 28548436bbff87aae61bba20029b4382fa41ce787feElliott Hughes EXPECT_EQ(":foo", Join(strings, ':')); 28648436bbff87aae61bba20029b4382fa41ce787feElliott Hughes 28748436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.clear(); 28848436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back("foo"); 28948436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back(""); 29048436bbff87aae61bba20029b4382fa41ce787feElliott Hughes EXPECT_EQ("foo:", Join(strings, ':')); 29148436bbff87aae61bba20029b4382fa41ce787feElliott Hughes 29248436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.clear(); 29348436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back(""); 29448436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back("foo"); 29548436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back(""); 29648436bbff87aae61bba20029b4382fa41ce787feElliott Hughes EXPECT_EQ(":foo:", Join(strings, ':')); 29748436bbff87aae61bba20029b4382fa41ce787feElliott Hughes 29848436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.clear(); 29948436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back("foo"); 30048436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back("bar"); 30148436bbff87aae61bba20029b4382fa41ce787feElliott Hughes EXPECT_EQ("foo:bar", Join(strings, ':')); 30248436bbff87aae61bba20029b4382fa41ce787feElliott Hughes 30348436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.clear(); 30448436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back("foo"); 30548436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back("bar"); 30648436bbff87aae61bba20029b4382fa41ce787feElliott Hughes strings.push_back("baz"); 30748436bbff87aae61bba20029b4382fa41ce787feElliott Hughes EXPECT_EQ("foo:bar:baz", Join(strings, ':')); 30848436bbff87aae61bba20029b4382fa41ce787feElliott Hughes} 30948436bbff87aae61bba20029b4382fa41ce787feElliott Hughes 3107a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian CarlstromTEST_F(UtilsTest, StartsWith) { 3117a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom EXPECT_FALSE(StartsWith("foo", "bar")); 3127a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom EXPECT_TRUE(StartsWith("foo", "foo")); 3137a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom EXPECT_TRUE(StartsWith("food", "foo")); 3147a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom EXPECT_FALSE(StartsWith("fo", "foo")); 3157a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom} 3167a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom 3177a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian CarlstromTEST_F(UtilsTest, EndsWith) { 3187a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom EXPECT_FALSE(EndsWith("foo", "bar")); 3197a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom EXPECT_TRUE(EndsWith("foo", "foo")); 3207a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom EXPECT_TRUE(EndsWith("foofoo", "foo")); 3217a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom EXPECT_FALSE(EndsWith("oo", "foo")); 3227a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom} 3237a967b3d4468ab56bf1b75ebd4d7bf9e6798761bBrian Carlstrom 32419a083603128c2cded84f0e5ad59db2044b1d6b6Brian CarlstromTEST_F(UtilsTest, GetDalvikCacheFilenameOrDie) { 32511d9f06a96a6909905c248ed684366190140095cNarayan Kamath EXPECT_STREQ("/foo/system@app@Foo.apk@classes.dex", 32611d9f06a96a6909905c248ed684366190140095cNarayan Kamath GetDalvikCacheFilenameOrDie("/system/app/Foo.apk", "/foo").c_str()); 32711d9f06a96a6909905c248ed684366190140095cNarayan Kamath 32811d9f06a96a6909905c248ed684366190140095cNarayan Kamath EXPECT_STREQ("/foo/data@app@foo-1.apk@classes.dex", 32911d9f06a96a6909905c248ed684366190140095cNarayan Kamath GetDalvikCacheFilenameOrDie("/data/app/foo-1.apk", "/foo").c_str()); 33011d9f06a96a6909905c248ed684366190140095cNarayan Kamath EXPECT_STREQ("/foo/system@framework@core.jar@classes.dex", 33111d9f06a96a6909905c248ed684366190140095cNarayan Kamath GetDalvikCacheFilenameOrDie("/system/framework/core.jar", "/foo").c_str()); 33211d9f06a96a6909905c248ed684366190140095cNarayan Kamath EXPECT_STREQ("/foo/system@framework@boot.art", 33311d9f06a96a6909905c248ed684366190140095cNarayan Kamath GetDalvikCacheFilenameOrDie("/system/framework/boot.art", "/foo").c_str()); 3346e183f2e973a20f2eaca135c240908e1bf98c5d0Alex Light EXPECT_STREQ("/foo/system@framework@boot.oat", 3356e183f2e973a20f2eaca135c240908e1bf98c5d0Alex Light GetDalvikCacheFilenameOrDie("/system/framework/boot.oat", "/foo").c_str()); 33619a083603128c2cded84f0e5ad59db2044b1d6b6Brian Carlstrom} 33719a083603128c2cded84f0e5ad59db2044b1d6b6Brian Carlstrom 33840da286d3207d88ed8ff3f5caac4873874603428Andreas GampeTEST_F(UtilsTest, GetDalvikCache) { 33940da286d3207d88ed8ff3f5caac4873874603428Andreas Gampe EXPECT_STREQ("", GetDalvikCache("should-not-exist123", false).c_str()); 34040da286d3207d88ed8ff3f5caac4873874603428Andreas Gampe 34140da286d3207d88ed8ff3f5caac4873874603428Andreas Gampe EXPECT_STREQ((android_data_ + "/dalvik-cache/.").c_str(), GetDalvikCache(".", false).c_str()); 34240da286d3207d88ed8ff3f5caac4873874603428Andreas Gampe EXPECT_STREQ((android_data_ + "/dalvik-cache/should-not-be-there").c_str(), 34340da286d3207d88ed8ff3f5caac4873874603428Andreas Gampe GetDalvikCache("should-not-be-there", true).c_str()); 34440da286d3207d88ed8ff3f5caac4873874603428Andreas Gampe} 34540da286d3207d88ed8ff3f5caac4873874603428Andreas Gampe 34640da286d3207d88ed8ff3f5caac4873874603428Andreas Gampe 3470e12bdc49744eb6d5c29b9611a8dbe10bac4cd53Brian CarlstromTEST_F(UtilsTest, GetSystemImageFilename) { 3480e12bdc49744eb6d5c29b9611a8dbe10bac4cd53Brian Carlstrom EXPECT_STREQ("/system/framework/arm/boot.art", 3490e12bdc49744eb6d5c29b9611a8dbe10bac4cd53Brian Carlstrom GetSystemImageFilename("/system/framework/boot.art", kArm).c_str()); 3500e12bdc49744eb6d5c29b9611a8dbe10bac4cd53Brian Carlstrom} 3510e12bdc49744eb6d5c29b9611a8dbe10bac4cd53Brian Carlstrom 3526449c62e40ef3a9bb75f664f922555affb532ee4Brian CarlstromTEST_F(UtilsTest, ExecSuccess) { 3536449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom std::vector<std::string> command; 3546449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom if (kIsTargetBuild) { 3554f7fdd297881ee7b794fd3dda11ab29d9ec2c2feNicolas Geoffray std::string android_root(GetAndroidRoot()); 3564f7fdd297881ee7b794fd3dda11ab29d9ec2c2feNicolas Geoffray command.push_back(android_root + "/bin/id"); 3576449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom } else { 3586449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom command.push_back("/usr/bin/id"); 3596449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom } 3606449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom std::string error_msg; 3611e13374baf7dfaf442ffbf9809c37c131d681eafEvgenii Stepanov if (!(RUNNING_ON_MEMORY_TOOL && kMemoryToolDetectsLeaks)) { 362661974a5561e5ccdfbac8cb5d8df8b7e6f3483b8Mathieu Chartier // Running on valgrind fails due to some memory that leaks in thread alternate signal stacks. 363661974a5561e5ccdfbac8cb5d8df8b7e6f3483b8Mathieu Chartier EXPECT_TRUE(Exec(command, &error_msg)); 364661974a5561e5ccdfbac8cb5d8df8b7e6f3483b8Mathieu Chartier } 3656449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom EXPECT_EQ(0U, error_msg.size()) << error_msg; 3666449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom} 3676449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom 368a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian CarlstromTEST_F(UtilsTest, ExecError) { 369369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe // This will lead to error messages in the log. 370369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe ScopedLogSeverity sls(LogSeverity::FATAL); 371369810a98e6394b6dd162f5349e38a1f597b3bc7Andreas Gampe 3726449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom std::vector<std::string> command; 3736449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom command.push_back("bogus"); 3746449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom std::string error_msg; 3751e13374baf7dfaf442ffbf9809c37c131d681eafEvgenii Stepanov if (!(RUNNING_ON_MEMORY_TOOL && kMemoryToolDetectsLeaks)) { 376661974a5561e5ccdfbac8cb5d8df8b7e6f3483b8Mathieu Chartier // Running on valgrind fails due to some memory that leaks in thread alternate signal stacks. 377661974a5561e5ccdfbac8cb5d8df8b7e6f3483b8Mathieu Chartier EXPECT_FALSE(Exec(command, &error_msg)); 378661974a5561e5ccdfbac8cb5d8df8b7e6f3483b8Mathieu Chartier EXPECT_NE(0U, error_msg.size()); 379661974a5561e5ccdfbac8cb5d8df8b7e6f3483b8Mathieu Chartier } 3806449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom} 3816449c62e40ef3a9bb75f664f922555affb532ee4Brian Carlstrom 3828508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan KamathTEST_F(UtilsTest, IsValidDescriptor) { 3838508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath std::vector<uint8_t> descriptor( 3848508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath { 'L', 'a', '/', 'b', '$', 0xed, 0xa0, 0x80, 0xed, 0xb0, 0x80, ';', 0x00 }); 3858508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath EXPECT_TRUE(IsValidDescriptor(reinterpret_cast<char*>(&descriptor[0]))); 3868508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath 3878508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath std::vector<uint8_t> unpaired_surrogate( 3888508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath { 'L', 'a', '/', 'b', '$', 0xed, 0xa0, 0x80, ';', 0x00 }); 3898508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath EXPECT_FALSE(IsValidDescriptor(reinterpret_cast<char*>(&unpaired_surrogate[0]))); 3908508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath 3918508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath std::vector<uint8_t> unpaired_surrogate_at_end( 3928508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath { 'L', 'a', '/', 'b', '$', 0xed, 0xa0, 0x80, 0x00 }); 3938508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath EXPECT_FALSE(IsValidDescriptor(reinterpret_cast<char*>(&unpaired_surrogate_at_end[0]))); 3948508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath 3958508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath std::vector<uint8_t> invalid_surrogate( 3968508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath { 'L', 'a', '/', 'b', '$', 0xed, 0xb0, 0x80, ';', 0x00 }); 3978508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath EXPECT_FALSE(IsValidDescriptor(reinterpret_cast<char*>(&invalid_surrogate[0]))); 3988508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath 3998508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath std::vector<uint8_t> unpaired_surrogate_with_multibyte_sequence( 4008508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath { 'L', 'a', '/', 'b', '$', 0xed, 0xb0, 0x80, 0xf0, 0x9f, 0x8f, 0xa0, ';', 0x00 }); 4018508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath EXPECT_FALSE( 4028508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath IsValidDescriptor(reinterpret_cast<char*>(&unpaired_surrogate_with_multibyte_sequence[0]))); 4038508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath} 4048508e37deeb291f92d28a9bff2df77cabdc29ddfNarayan Kamath 40511e45077acba2e757799a00b3be9d63fec36a7ccElliott Hughes} // namespace art 406