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