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