Carl Shapiro | 0e5d75d | 2011-07-06 18:28:37 -0700 | [diff] [blame] | 1 | // Copyright 2011 Google Inc. All Rights Reserved. |
| 2 | |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 3 | #include "src/common_test.h" |
Carl Shapiro | 0e5d75d | 2011-07-06 18:28:37 -0700 | [diff] [blame] | 4 | #include "src/class_linker.h" |
| 5 | #include "src/dex_file.h" |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 6 | #include "src/heap.h" |
Carl Shapiro | 0e5d75d | 2011-07-06 18:28:37 -0700 | [diff] [blame] | 7 | #include "gtest/gtest.h" |
| 8 | |
| 9 | namespace art { |
| 10 | |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 11 | TEST(ClassLinker, LoadNonexistent) { |
| 12 | scoped_ptr<DexFile> dex(DexFile::OpenBase64(kMyClassDex)); |
| 13 | ASSERT_TRUE(dex != NULL); |
| 14 | |
Carl Shapiro | 61e019d | 2011-07-14 16:53:09 -0700 | [diff] [blame] | 15 | scoped_ptr<ClassLinker> linker(ClassLinker::Create()); |
| 16 | linker->AppendToClassPath(dex.get()); |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 17 | |
Brian Carlstrom | a080803 | 2011-07-18 00:39:23 -0700 | [diff] [blame^] | 18 | scoped_ptr<Class> klass(linker.get()->AllocClass(dex.get())); |
Carl Shapiro | 61e019d | 2011-07-14 16:53:09 -0700 | [diff] [blame] | 19 | bool result1 = linker->LoadClass("NoSuchClass", klass.get()); |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 20 | EXPECT_FALSE(result1); |
Carl Shapiro | 61e019d | 2011-07-14 16:53:09 -0700 | [diff] [blame] | 21 | bool result2 = linker->LoadClass("LNoSuchClass;", klass.get()); |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 22 | EXPECT_FALSE(result2); |
| 23 | } |
| 24 | |
| 25 | TEST(ClassLinker, Load) { |
| 26 | scoped_ptr<DexFile> dex(DexFile::OpenBase64(kNestedDex)); |
| 27 | ASSERT_TRUE(dex != NULL); |
| 28 | |
Carl Shapiro | 61e019d | 2011-07-14 16:53:09 -0700 | [diff] [blame] | 29 | scoped_ptr<ClassLinker> linker(ClassLinker::Create()); |
| 30 | linker->AppendToClassPath(dex.get()); |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 31 | |
Brian Carlstrom | a080803 | 2011-07-18 00:39:23 -0700 | [diff] [blame^] | 32 | scoped_ptr<Class> klass(linker.get()->AllocClass(dex.get())); |
Carl Shapiro | 61e019d | 2011-07-14 16:53:09 -0700 | [diff] [blame] | 33 | bool result = linker->LoadClass("LNested;", klass.get()); |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 34 | ASSERT_TRUE(result); |
| 35 | |
| 36 | uint32_t vmeth = klass->NumVirtualMethods(); |
| 37 | EXPECT_EQ(vmeth, 0U); |
| 38 | |
| 39 | uint32_t dmeth = klass->NumDirectMethods(); |
| 40 | EXPECT_EQ(dmeth, 1U); |
| 41 | } |
Carl Shapiro | 0e5d75d | 2011-07-06 18:28:37 -0700 | [diff] [blame] | 42 | |
| 43 | TEST(ClassLinker, FindClass) { |
Elliott Hughes | a5780da | 2011-07-17 11:39:39 -0700 | [diff] [blame] | 44 | ASSERT_TRUE(Thread::Init()); |
| 45 | ASSERT_TRUE(Thread::Attach() != NULL); |
| 46 | |
Carl Shapiro | 0e5d75d | 2011-07-06 18:28:37 -0700 | [diff] [blame] | 47 | scoped_ptr<DexFile> dex(DexFile::OpenBase64(kMyClassDex)); |
| 48 | ASSERT_TRUE(dex != NULL); |
| 49 | |
Carl Shapiro | 61e019d | 2011-07-14 16:53:09 -0700 | [diff] [blame] | 50 | scoped_ptr<ClassLinker> linker(ClassLinker::Create()); |
| 51 | linker->AppendToClassPath(dex.get()); |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 52 | |
Carl Shapiro | 61e019d | 2011-07-14 16:53:09 -0700 | [diff] [blame] | 53 | Class* JavaLangObject = linker->FindClass("Ljava/lang/Object;", NULL, dex.get()); |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 54 | ASSERT_TRUE(JavaLangObject != NULL); |
Brian Carlstrom | a080803 | 2011-07-18 00:39:23 -0700 | [diff] [blame^] | 55 | ASSERT_TRUE(JavaLangObject->GetClass() != NULL); |
| 56 | ASSERT_EQ(JavaLangObject->GetClass(), JavaLangObject->GetClass()->GetClass()); |
| 57 | EXPECT_EQ(JavaLangObject->GetClass()->GetSuperClass(), JavaLangObject); |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 58 | ASSERT_TRUE(JavaLangObject->GetDescriptor() == "Ljava/lang/Object;"); |
| 59 | EXPECT_TRUE(JavaLangObject->GetSuperClass() == NULL); |
| 60 | EXPECT_FALSE(JavaLangObject->HasSuperClass()); |
| 61 | EXPECT_TRUE(JavaLangObject->GetComponentType() == NULL); |
| 62 | EXPECT_FALSE(JavaLangObject->IsErroneous()); |
| 63 | EXPECT_FALSE(JavaLangObject->IsVerified()); |
| 64 | EXPECT_TRUE(JavaLangObject->IsLinked()); |
| 65 | EXPECT_FALSE(JavaLangObject->IsArray()); |
| 66 | EXPECT_FALSE(JavaLangObject->IsInterface()); |
| 67 | EXPECT_TRUE(JavaLangObject->IsPublic()); |
| 68 | EXPECT_FALSE(JavaLangObject->IsFinal()); |
| 69 | EXPECT_FALSE(JavaLangObject->IsPrimitive()); |
Carl Shapiro | f10edca | 2011-07-14 23:16:21 -0700 | [diff] [blame] | 70 | EXPECT_EQ(1U, JavaLangObject->NumDirectMethods()); |
| 71 | EXPECT_EQ(0U, JavaLangObject->NumVirtualMethods()); |
| 72 | EXPECT_EQ(0U, JavaLangObject->NumInstanceFields()); |
| 73 | EXPECT_EQ(0U, JavaLangObject->NumStaticFields()); |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 74 | |
Carl Shapiro | 61e019d | 2011-07-14 16:53:09 -0700 | [diff] [blame] | 75 | Class* MyClass = linker->FindClass("LMyClass;", NULL, dex.get()); |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 76 | ASSERT_TRUE(MyClass != NULL); |
Brian Carlstrom | a080803 | 2011-07-18 00:39:23 -0700 | [diff] [blame^] | 77 | ASSERT_TRUE(MyClass->GetClass() != NULL); |
| 78 | ASSERT_EQ(MyClass->GetClass(), MyClass->GetClass()->GetClass()); |
| 79 | EXPECT_EQ(MyClass->GetClass()->GetSuperClass(), JavaLangObject); |
Brian Carlstrom | 934486c | 2011-07-12 23:42:50 -0700 | [diff] [blame] | 80 | ASSERT_TRUE(MyClass->GetDescriptor() == "LMyClass;"); |
| 81 | EXPECT_TRUE(MyClass->GetSuperClass() == JavaLangObject); |
| 82 | EXPECT_TRUE(MyClass->HasSuperClass()); |
| 83 | EXPECT_TRUE(MyClass->GetComponentType() == NULL); |
| 84 | EXPECT_TRUE(MyClass->GetStatus() == Class::kStatusResolved); |
| 85 | EXPECT_FALSE(MyClass->IsErroneous()); |
| 86 | EXPECT_FALSE(MyClass->IsVerified()); |
| 87 | EXPECT_TRUE(MyClass->IsLinked()); |
| 88 | EXPECT_FALSE(MyClass->IsArray()); |
| 89 | EXPECT_FALSE(MyClass->IsInterface()); |
| 90 | EXPECT_FALSE(MyClass->IsPublic()); |
| 91 | EXPECT_FALSE(MyClass->IsFinal()); |
| 92 | EXPECT_FALSE(MyClass->IsPrimitive()); |
Carl Shapiro | f10edca | 2011-07-14 23:16:21 -0700 | [diff] [blame] | 93 | EXPECT_EQ(1U, MyClass->NumDirectMethods()); |
| 94 | EXPECT_EQ(0U, MyClass->NumVirtualMethods()); |
| 95 | EXPECT_EQ(0U, MyClass->NumInstanceFields()); |
| 96 | EXPECT_EQ(0U, MyClass->NumStaticFields()); |
Brian Carlstrom | a080803 | 2011-07-18 00:39:23 -0700 | [diff] [blame^] | 97 | |
| 98 | EXPECT_EQ(JavaLangObject->GetClass()->GetClass(), MyClass->GetClass()->GetClass()); |
| 99 | |
Carl Shapiro | 0e5d75d | 2011-07-06 18:28:37 -0700 | [diff] [blame] | 100 | } |
| 101 | |
| 102 | } // namespace art |