1c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko/* 2c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * Copyright (C) 2015 The Android Open Source Project 3c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * 4c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * Licensed under the Apache License, Version 2.0 (the "License"); 5c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * you may not use this file except in compliance with the License. 6c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * You may obtain a copy of the License at 7c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * 8c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * http://www.apache.org/licenses/LICENSE-2.0 9c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * 10c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * Unless required by applicable law or agreed to in writing, software 11c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * distributed under the License is distributed on an "AS IS" BASIS, 12c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * See the License for the specific language governing permissions and 14c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko * limitations under the License. 15c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko */ 16c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko 17c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko#include "test_dex_file_builder.h" 18c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko 19c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko#include "dex_file-inl.h" 20c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko#include "gtest/gtest.h" 2180afd02024d20e60b197d3adfbb43cc303cf29e0Vladimir Marko#include "utils.h" 22c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko 23c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Markonamespace art { 24c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko 25c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir MarkoTEST(TestDexFileBuilderTest, SimpleTest) { 26c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko TestDexFileBuilder builder; 27c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko builder.AddString("Arbitrary string"); 28c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko builder.AddType("Ljava/lang/Class;"); 29c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko builder.AddField("LTestClass;", "[I", "intField"); 30c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko builder.AddMethod("LTestClass;", "()I", "foo"); 31c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko builder.AddMethod("LTestClass;", "(Ljava/lang/Object;[Ljava/lang/Object;)LTestClass;", "bar"); 32c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko const char* dex_location = "TestDexFileBuilder/SimpleTest"; 33c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko std::unique_ptr<const DexFile> dex_file(builder.Build(dex_location)); 34c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko ASSERT_TRUE(dex_file != nullptr); 35c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko EXPECT_STREQ(dex_location, dex_file->GetLocation().c_str()); 36c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko 37c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko static const char* const expected_strings[] = { 38c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "Arbitrary string", 39c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "I", 40c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "LLL", // shorty 41c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "LTestClass;", 42c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "Ljava/lang/Class;", 43c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "Ljava/lang/Object;", 44c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "[I", 45c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "[Ljava/lang/Object;", 46c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "bar", 47c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "foo", 48c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "intField", 49c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko }; 50c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko ASSERT_EQ(arraysize(expected_strings), dex_file->NumStringIds()); 51c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko for (size_t i = 0; i != arraysize(expected_strings); ++i) { 52c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko EXPECT_STREQ(expected_strings[i], dex_file->GetStringData(dex_file->GetStringId(i))) << i; 53c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko } 54c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko 55c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko static const char* const expected_types[] = { 56c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "I", 57c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "LTestClass;", 58c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "Ljava/lang/Class;", 59c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "Ljava/lang/Object;", 60c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "[I", 61c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko "[Ljava/lang/Object;", 62c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko }; 63c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko ASSERT_EQ(arraysize(expected_types), dex_file->NumTypeIds()); 64c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko for (size_t i = 0; i != arraysize(expected_types); ++i) { 65c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko EXPECT_STREQ(expected_types[i], dex_file->GetTypeDescriptor(dex_file->GetTypeId(i))) << i; 66c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko } 67c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko 68c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko ASSERT_EQ(1u, dex_file->NumFieldIds()); 69c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko EXPECT_STREQ("[I TestClass.intField", PrettyField(0u, *dex_file).c_str()); 70c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko 71c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko ASSERT_EQ(2u, dex_file->NumProtoIds()); 72c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko ASSERT_EQ(2u, dex_file->NumMethodIds()); 73c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko EXPECT_STREQ("TestClass TestClass.bar(java.lang.Object, java.lang.Object[])", 74c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko PrettyMethod(0u, *dex_file).c_str()); 75c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko EXPECT_STREQ("int TestClass.foo()", 76c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko PrettyMethod(1u, *dex_file).c_str()); 77c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko 78c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko EXPECT_EQ(0u, builder.GetStringIdx("Arbitrary string")); 79c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko EXPECT_EQ(2u, builder.GetTypeIdx("Ljava/lang/Class;")); 80c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko EXPECT_EQ(0u, builder.GetFieldIdx("LTestClass;", "[I", "intField")); 81c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko EXPECT_EQ(1u, builder.GetMethodIdx("LTestClass;", "()I", "foo")); 82c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko EXPECT_EQ(0u, builder.GetMethodIdx("LTestClass;", "(Ljava/lang/Object;[Ljava/lang/Object;)LTestClass;", "bar")); 83c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko} 84c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko 85c91df2d6339dd4adf2da582372451df19ce2ff44Vladimir Marko} // namespace art 86