1 /** 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include "file_items.h" 17 #include "file_item_container.h" 18 #include "file_writer.h" 19 20 #include <cstdint> 21 22 #include <utility> 23 #include <vector> 24 25 #include <gtest/gtest.h> 26 27 namespace panda::panda_file::test { 28 29 HWTEST(LineNumberProgramItem, EmitSpecialOpcode, testing::ext::TestSize.Level0) 30 { 31 LineNumberProgramItem item(nullptr); 32 33 constexpr int32_t LINE_MAX_INC = LineNumberProgramItem::LINE_RANGE + LineNumberProgramItem::LINE_BASE - 1; 34 constexpr int32_t LINE_MIN_INC = LineNumberProgramItem::LINE_BASE; 35 36 EXPECT_FALSE(item.EmitSpecialOpcode(0, LINE_MAX_INC + 1)); 37 EXPECT_FALSE(item.EmitSpecialOpcode(0, LINE_MIN_INC - 1)); 38 EXPECT_FALSE(item.EmitSpecialOpcode(100, LINE_MAX_INC)); 39 40 std::vector<std::pair<int32_t, uint32_t>> incs = {{1, LINE_MIN_INC}, {2, LINE_MAX_INC}}; 41 std::vector<uint8_t> data; 42 43 for (auto [pc_inc, line_inc] : incs) { 44 ASSERT_TRUE(item.EmitSpecialOpcode(pc_inc, line_inc)); 45 data.push_back((line_inc - LineNumberProgramItem::LINE_BASE) + (pc_inc * LineNumberProgramItem::LINE_RANGE) + 46 LineNumberProgramItem::OPCODE_BASE); 47 } 48 49 MemoryWriter writer; 50 ASSERT_TRUE(item.Write(&writer)); 51 52 EXPECT_EQ(writer.GetData(), data); 53 } 54 55 HWTEST(LineNumberProgramItem, LanguageFromAndToString, testing::ext::TestSize.Level0) 56 { 57 ASSERT_EQ(LanguageFromString("not ECMAScript"), static_cast<SourceLang>(1U)); 58 ASSERT_STREQ(LanguageToString(SourceLang::ECMASCRIPT), "ECMAScript"); 59 ASSERT_STREQ(LanguageToString(SourceLang::PANDA_ASSEMBLY), "PandaAssembly"); 60 } 61 62 HWTEST(LineNumberProgramItem, GetStringClassDescriptor, testing::ext::TestSize.Level0) 63 { 64 ASSERT_STREQ(GetStringClassDescriptor(SourceLang::ECMASCRIPT), "Lpanda/JSString;"); 65 ASSERT_STREQ(GetStringClassDescriptor(SourceLang::PANDA_ASSEMBLY), "Lpanda/String;"); 66 } 67 68 HWTEST(LineNumberProgramItem, IsDynamicLanguageTest, testing::ext::TestSize.Level0) 69 { 70 panda::panda_file::SourceLang lang = panda::panda_file::SourceLang::ECMASCRIPT; 71 ASSERT_TRUE(IsDynamicLanguage(lang)); 72 } 73 74 HWTEST(LineNumberProgramItem, ItemTypeToStringPart1, testing::ext::TestSize.Level0) 75 { 76 for (int i = 0; i <= static_cast<int>(ItemTypes::FIELD_ITEM) - 1; ++i) { 77 ItemTypes type = static_cast<ItemTypes>(i); 78 std::string expected; 79 switch (type) { 80 case ItemTypes::ANNOTATION_ITEM: 81 expected = "annotation_item"; 82 break; 83 case ItemTypes::CATCH_BLOCK_ITEM: 84 expected = "catch_block_item"; 85 break; 86 case ItemTypes::CLASS_INDEX_ITEM: 87 expected = "class_index_item"; 88 break; 89 case ItemTypes::CLASS_ITEM: 90 expected = "class_item"; 91 break; 92 case ItemTypes::CODE_ITEM: 93 expected = "code_item"; 94 break; 95 case ItemTypes::DEBUG_INFO_ITEM: 96 expected = "debug_info_item"; 97 break; 98 case ItemTypes::END_ITEM: 99 expected = "end_item"; 100 break; 101 case ItemTypes::FIELD_INDEX_ITEM: 102 expected = "field_index_item"; 103 break; 104 case ItemTypes::FIELD_ITEM: 105 expected = "field_item"; 106 break; 107 default: 108 expected = ""; 109 break; 110 } 111 EXPECT_EQ(ItemTypeToString(type), expected); 112 } 113 } 114 115 HWTEST(LineNumberProgramItem, ItemTypeToStringPart2, testing::ext::TestSize.Level0) 116 { 117 for (int i = static_cast<int>(ItemTypes::FOREIGN_CLASS_ITEM); 118 i <= static_cast<int>(ItemTypes::LITERAL_ITEM) - 1; ++i) { 119 ItemTypes type = static_cast<ItemTypes>(i); 120 std::string expected; 121 switch (type) { 122 case ItemTypes::FOREIGN_CLASS_ITEM: 123 expected = "foreign_class_item"; 124 break; 125 case ItemTypes::FOREIGN_FIELD_ITEM: 126 expected = "foreign_field_item"; 127 break; 128 case ItemTypes::FOREIGN_METHOD_ITEM: 129 expected = "foreign_method_item"; 130 break; 131 case ItemTypes::INDEX_HEADER: 132 expected = "index_header"; 133 break; 134 case ItemTypes::INDEX_SECTION: 135 expected = "index_section"; 136 break; 137 case ItemTypes::LINE_NUMBER_PROGRAM_INDEX_ITEM: 138 expected = "line_number_program_index_item"; 139 break; 140 case ItemTypes::LINE_NUMBER_PROGRAM_ITEM: 141 expected = "line_number_program_item"; 142 break; 143 case ItemTypes::LITERAL_ARRAY_ITEM: 144 expected = "literal_array_item"; 145 break; 146 case ItemTypes::LITERAL_ITEM: 147 expected = "literal_item"; 148 break; 149 default: 150 expected = ""; 151 break; 152 } 153 EXPECT_EQ(ItemTypeToString(type), expected); 154 } 155 } 156 157 HWTEST(LineNumberProgramItem, ItemTypeToStringPart3, testing::ext::TestSize.Level0) 158 { 159 for (int i = static_cast<int>(ItemTypes::METHOD_HANDLE_ITEM); 160 i <= static_cast<int>(ItemTypes::VALUE_ITEM); ++i) { 161 ItemTypes type = static_cast<ItemTypes>(i); 162 std::string expected; 163 switch (type) { 164 case ItemTypes::METHOD_HANDLE_ITEM: 165 expected = "method_handle_item"; 166 break; 167 case ItemTypes::METHOD_INDEX_ITEM: 168 expected = "method_index_item"; 169 break; 170 case ItemTypes::METHOD_ITEM: 171 expected = "method_item"; 172 break; 173 case ItemTypes::PARAM_ANNOTATIONS_ITEM: 174 expected = "param_annotations_item"; 175 break; 176 case ItemTypes::PRIMITIVE_TYPE_ITEM: 177 expected = "primitive_type_item"; 178 break; 179 case ItemTypes::PROTO_INDEX_ITEM: 180 expected = "proto_index_item"; 181 break; 182 case ItemTypes::PROTO_ITEM: 183 expected = "proto_item"; 184 break; 185 case ItemTypes::STRING_ITEM: 186 expected = "string_item"; 187 break; 188 case ItemTypes::TRY_BLOCK_ITEM: 189 expected = "try_block_item"; 190 break; 191 case ItemTypes::VALUE_ITEM: 192 expected = "value_item"; 193 break; 194 default: 195 expected = ""; 196 break; 197 } 198 EXPECT_EQ(ItemTypeToString(type), expected); 199 } 200 } 201 202 HWTEST(LineNumberProgramItem, GetULeb128EncodedSizeTest, testing::ext::TestSize.Level0) 203 { 204 ItemContainer container; 205 const uint32_t kTestIntegerValue = 1; 206 const uint64_t kTestLongValue = 1234567890; 207 208 ScalarValueItem *int_item = container.GetOrCreateIntegerValueItem(kTestIntegerValue); 209 EXPECT_EQ(int_item, container.GetOrCreateIntegerValueItem(kTestIntegerValue)); 210 EXPECT_EQ(int_item->GetULeb128EncodedSize(), leb128::UnsignedEncodingSize(kTestIntegerValue)); 211 212 ScalarValueItem *long_item = container.GetOrCreateLongValueItem(kTestLongValue); 213 EXPECT_EQ(long_item, container.GetOrCreateLongValueItem(kTestLongValue)); 214 EXPECT_EQ(long_item->GetULeb128EncodedSize(), leb128::UnsignedEncodingSize(kTestLongValue)); 215 } 216 } // namespace panda::panda_file::test 217