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 */ 167e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 177e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom#include "dex_cache.h" 18a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 19a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include <stdio.h> 20a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom 21a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include "class_linker.h" 22a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstrom#include "common_runtime_test.h" 23d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier#include "linear_alloc.h" 24d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier#include "mirror/class_loader-inl.h" 25eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier#include "handle_scope-inl.h" 26e63db27db913f1a88e2095a1ee8239b2bb9124e8Ian Rogers#include "scoped_thread_state_change.h" 277e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 287e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstromnamespace art { 292dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogersnamespace mirror { 307e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 31a1ce1fef2d49d1d537776a5308ace7102a815fe5Brian Carlstromclass DexCacheTest : public CommonRuntimeTest {}; 327e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 337e49dca262933bc30cbc8b9f07cfc8cce2343389Brian CarlstromTEST_F(DexCacheTest, Open) { 3400f7d0eaa6bd93d33bf0c1429bf4ba0b3f28abacIan Rogers ScopedObjectAccess soa(Thread::Current()); 35eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier StackHandleScope<1> hs(soa.Self()); 362cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier ASSERT_TRUE(java_lang_dex_file_ != nullptr); 37eb8167a4f4d27fce0530f6724ab8032610cd146bMathieu Chartier Handle<DexCache> dex_cache( 38d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier hs.NewHandle(class_linker_->AllocDexCache(soa.Self(), 39d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier *java_lang_dex_file_, 40d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier Runtime::Current()->GetLinearAlloc()))); 412cebb24bfc3247d3e9be138a3350106737455918Mathieu Chartier ASSERT_TRUE(dex_cache.Get() != nullptr); 42c4fa2c0c6302d3d9979e8d8a4030499c10d6b68bBrian Carlstrom 43a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom EXPECT_EQ(java_lang_dex_file_->NumStringIds(), dex_cache->NumStrings()); 441caa2c205e51dda670207828f25451fb7623cea6Brian Carlstrom EXPECT_EQ(java_lang_dex_file_->NumTypeIds(), dex_cache->NumResolvedTypes()); 451caa2c205e51dda670207828f25451fb7623cea6Brian Carlstrom EXPECT_EQ(java_lang_dex_file_->NumMethodIds(), dex_cache->NumResolvedMethods()); 461caa2c205e51dda670207828f25451fb7623cea6Brian Carlstrom EXPECT_EQ(java_lang_dex_file_->NumFieldIds(), dex_cache->NumResolvedFields()); 477e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom} 487e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom 49d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu ChartierTEST_F(DexCacheTest, LinearAlloc) { 50d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier ScopedObjectAccess soa(Thread::Current()); 51d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier jobject jclass_loader(LoadDex("Main")); 52d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier ASSERT_TRUE(jclass_loader != nullptr); 53d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier Runtime* const runtime = Runtime::Current(); 54d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier ClassLinker* const class_linker = runtime->GetClassLinker(); 55d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier StackHandleScope<1> hs(soa.Self()); 56d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier Handle<mirror::ClassLoader> class_loader(hs.NewHandle( 57d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier soa.Decode<mirror::ClassLoader*>(jclass_loader))); 58d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier mirror::Class* klass = class_linker->FindClass(soa.Self(), "LMain;", class_loader); 59d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier ASSERT_TRUE(klass != nullptr); 60d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier LinearAlloc* const linear_alloc = klass->GetClassLoader()->GetAllocator(); 61d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier EXPECT_NE(linear_alloc, runtime->GetLinearAlloc()); 62d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier EXPECT_TRUE(linear_alloc->Contains(klass->GetDexCache()->GetResolvedMethods())); 63d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier} 64d57d454a11ac6f49eaa397ec14d6231e3a2727b7Mathieu Chartier 65c90450a201707111e33d6b6f37d431b201849a8bMathieu ChartierTEST_F(DexCacheTest, TestResolvedFieldAccess) { 66c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier ScopedObjectAccess soa(Thread::Current()); 67c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier jobject jclass_loader(LoadDex("Packages")); 68c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier ASSERT_TRUE(jclass_loader != nullptr); 69c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier Runtime* const runtime = Runtime::Current(); 70c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier ClassLinker* const class_linker = runtime->GetClassLinker(); 71c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier StackHandleScope<3> hs(soa.Self()); 72c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier Handle<mirror::ClassLoader> class_loader(hs.NewHandle( 73c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier soa.Decode<mirror::ClassLoader*>(jclass_loader))); 74c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier Handle<mirror::Class> klass1 = 75c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier hs.NewHandle(class_linker->FindClass(soa.Self(), "Lpackage1/Package1;", class_loader)); 76c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier ASSERT_TRUE(klass1.Get() != nullptr); 77c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier Handle<mirror::Class> klass2 = 78c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier hs.NewHandle(class_linker->FindClass(soa.Self(), "Lpackage2/Package2;", class_loader)); 79c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier ASSERT_TRUE(klass2.Get() != nullptr); 80c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier EXPECT_EQ(klass1->GetDexCache(), klass2->GetDexCache()); 81c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier 82c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier EXPECT_NE(klass1->NumStaticFields(), 0u); 83c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier for (ArtField& field : klass2->GetSFields()) { 84c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier EXPECT_FALSE(( 85c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier klass1->ResolvedFieldAccessTest</*throw_on_failure*/ false, 86c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier /*use_referrers_cache*/ false>(klass2.Get(), 87c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier &field, 88c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier field.GetDexFieldIndex(), 89c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier klass1->GetDexCache()))); 90c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier } 91c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier} 92c90450a201707111e33d6b6f37d431b201849a8bMathieu Chartier 932dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers} // namespace mirror 947e49dca262933bc30cbc8b9f07cfc8cce2343389Brian Carlstrom} // namespace art 95