1 /* 2 * Copyright (c) 2024 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 #ifndef ABCKIT_CPP_HELPERS_MOCK 17 #define ABCKIT_CPP_HELPERS_MOCK 18 19 #include <string> 20 #include "../../include/cpp/abckit_cpp.h" 21 #include "check_mock.h" 22 #include "include/cpp/headers/value.h" 23 #include "include/cpp/headers/arkts/annotation.h" 24 #include "include/cpp/headers/arkts/annotation_interface.h" 25 #include "include/cpp/headers/arkts/annotation_interface_field.h" 26 #include "include/cpp/headers/arkts/class.h" 27 #include "include/cpp/headers/arkts/function.h" 28 #include "include/cpp/headers/core/annotation_element.h" 29 #include "include/cpp/headers/core/annotation_interface_field.h" 30 #include "mock/mock_values.h" 31 32 #include <gtest/gtest.h> 33 34 namespace abckit::mock::helpers { 35 36 // NOLINTBEGIN(performance-unnecessary-value-param) 37 GetMockCoreModule(const abckit::File & file)38inline abckit::core::Module GetMockCoreModule(const abckit::File &file) 39 { 40 std::vector<abckit::core::Module> modules; 41 42 file.EnumerateModules([&modules](abckit::core::Module md) -> bool { 43 modules.push_back(md); 44 return true; 45 }); 46 47 EXPECT_TRUE(CheckMockedApi("FileEnumerateModules")); 48 49 return modules.front(); 50 } 51 GetMockArktsModule(const abckit::File & file)52inline abckit::arkts::Module GetMockArktsModule(const abckit::File &file) 53 { 54 auto m = abckit::arkts::Module(GetMockCoreModule(file)); 55 EXPECT_TRUE(CheckMockedApi("CoreModuleToArktsModule")); 56 return m; 57 } 58 GetMockCoreNamespace(const abckit::File & file)59inline abckit::core::Namespace GetMockCoreNamespace(const abckit::File &file) 60 { 61 std::vector<abckit::core::Namespace> namespaces; 62 abckit::core::Module mod = GetMockCoreModule(file); 63 64 mod.EnumerateNamespaces([&namespaces](abckit::core::Namespace n) -> bool { 65 namespaces.push_back(n); 66 return true; 67 }); 68 69 EXPECT_TRUE(CheckMockedApi("ModuleEnumerateNamespaces")); 70 return namespaces.front(); 71 } 72 GetMockArktsNamespace(const abckit::File & file)73inline abckit::arkts::Namespace GetMockArktsNamespace(const abckit::File &file) 74 { 75 auto n = abckit::arkts::Namespace(GetMockCoreNamespace(file)); 76 EXPECT_TRUE(CheckMockedApi("CoreNamespaceToArktsNamespace")); 77 return n; 78 } 79 GetMockCoreClass(const abckit::File & file)80inline abckit::core::Class GetMockCoreClass(const abckit::File &file) 81 { 82 abckit::core::Module cmd = GetMockCoreModule(file); 83 84 std::vector<abckit::core::Class> classes; 85 86 cmd.EnumerateClasses([&classes](abckit::core::Class cls) -> bool { 87 classes.push_back(cls); 88 return true; 89 }); 90 91 EXPECT_TRUE(CheckMockedApi("ModuleEnumerateClasses")); 92 93 return classes.front(); 94 } 95 GetMockArktsClass(const abckit::File & file)96inline abckit::arkts::Class GetMockArktsClass(const abckit::File &file) 97 { 98 auto c = abckit::arkts::Class(GetMockCoreClass(file)); 99 EXPECT_TRUE(CheckMockedApi("CoreClassToArktsClass")); 100 return c; 101 } 102 GetMockCoreFunction(const abckit::File & file)103inline abckit::core::Function GetMockCoreFunction(const abckit::File &file) 104 { 105 abckit::core::Class cls = GetMockCoreClass(file); 106 std::vector<abckit::core::Function> funcs; 107 108 cls.EnumerateMethods([&](abckit::core::Function md) -> bool { 109 funcs.push_back(md); 110 return true; 111 }); 112 113 EXPECT_TRUE(CheckMockedApi("ClassEnumerateMethods")); 114 115 return funcs.front(); 116 } 117 GetMockArktsFunction(const abckit::File & file)118inline abckit::arkts::Function GetMockArktsFunction(const abckit::File &file) 119 { 120 auto f = abckit::arkts::Function(GetMockCoreFunction(file)); 121 EXPECT_TRUE(CheckMockedApi("CoreFunctionToArktsFunction")); 122 return f; 123 } 124 GetMockCoreAnnotation(const abckit::File & file)125inline abckit::core::Annotation GetMockCoreAnnotation(const abckit::File &file) 126 { 127 abckit::core::Function func = GetMockCoreFunction(file); 128 std::vector<abckit::core::Annotation> anns; 129 130 func.EnumerateAnnotations([&](abckit::core::Annotation an) -> bool { 131 anns.push_back(an); 132 return true; 133 }); 134 135 EXPECT_TRUE(CheckMockedApi("FunctionEnumerateAnnotations")); 136 137 return anns.front(); 138 } 139 GetMockArktsAnnotation(const abckit::File & file)140inline abckit::arkts::Annotation GetMockArktsAnnotation(const abckit::File &file) 141 { 142 auto a = abckit::arkts::Annotation(GetMockCoreAnnotation(file)); 143 EXPECT_TRUE(CheckMockedApi("CoreAnnotationToArktsAnnotation")); 144 return a; 145 } 146 GetMockGraph(const abckit::File & file)147inline abckit::Graph GetMockGraph(const abckit::File &file) 148 { 149 abckit::core::Function func = GetMockCoreFunction(file); 150 abckit::Graph graph = func.CreateGraph(); 151 EXPECT_TRUE(CheckMockedApi("CreateGraphFromFunction")); 152 // Utilization of NRVO, no dtor 153 return graph; 154 } 155 GetMockBasicBlock(const abckit::File & file)156inline abckit::BasicBlock GetMockBasicBlock(const abckit::File &file) 157 { 158 abckit::BasicBlock bb = GetMockGraph(file).GetStartBb(); 159 EXPECT_TRUE(CheckMockedApi("DestroyGraph")); 160 EXPECT_TRUE(CheckMockedApi("GgetStartBasicBlock")); 161 // NOLINTNEXTLINE(clang-analyzer-core.StackAddressEscape) 162 return bb; 163 } 164 GetMockInstruction(const abckit::File & file)165inline abckit::Instruction GetMockInstruction(const abckit::File &file) 166 { 167 abckit::BasicBlock bb = GetMockBasicBlock(file); 168 abckit::Instruction instr = bb.GetFirstInst(); 169 EXPECT_TRUE(CheckMockedApi("BBGetFirstInst")); 170 return instr; 171 } 172 GetMockCoreImportDescriptor(const abckit::File & file)173inline abckit::core::ImportDescriptor GetMockCoreImportDescriptor(const abckit::File &file) 174 { 175 abckit::core::ImportDescriptor id = GetMockGraph(file).DynIsa().GetImportDescriptor(GetMockInstruction(file)); 176 EXPECT_TRUE(CheckMockedApi("DestroyGraph")); 177 EXPECT_TRUE(CheckMockedApi("IgetImportDescriptor")); 178 return id; 179 } 180 GetMockArktsImportDescriptor(const abckit::File & file)181inline abckit::arkts::ImportDescriptor GetMockArktsImportDescriptor(const abckit::File &file) 182 { 183 auto id = abckit::arkts::ImportDescriptor(GetMockCoreImportDescriptor(file)); 184 EXPECT_TRUE(CheckMockedApi("CoreImportDescriptorToArktsImportDescriptor")); 185 return id; 186 } 187 GetMockCoreExportDescriptor(const abckit::File & file)188inline abckit::core::ExportDescriptor GetMockCoreExportDescriptor(const abckit::File &file) 189 { 190 abckit::core::ExportDescriptor ed = GetMockGraph(file).DynIsa().GetExportDescriptor(GetMockInstruction(file)); 191 EXPECT_TRUE(CheckMockedApi("DestroyGraph")); 192 EXPECT_TRUE(CheckMockedApi("IgetExportDescriptor")); 193 return ed; 194 } 195 GetMockArktsExportDescriptor(const abckit::File & file)196inline abckit::arkts::ExportDescriptor GetMockArktsExportDescriptor(const abckit::File &file) 197 { 198 auto ed = abckit::arkts::ExportDescriptor(GetMockCoreExportDescriptor(file)); 199 EXPECT_TRUE(CheckMockedApi("CoreExportDescriptorToArktsExportDescriptor")); 200 return ed; 201 } 202 GetMockLiteralArray(const abckit::File & file)203inline abckit::LiteralArray GetMockLiteralArray(const abckit::File &file) 204 { 205 abckit::LiteralArray litarr = GetMockInstruction(file).GetLiteralArray(); 206 EXPECT_TRUE(CheckMockedApi("IgetLiteralArray")); 207 return litarr; 208 } 209 GetMockType(const abckit::File & file)210inline abckit::Type GetMockType(const abckit::File &file) 211 { 212 abckit::Type t = file.CreateType(DEFAULT_TYPE_ID); 213 EXPECT_TRUE(CheckMockedApi("CreateType")); 214 return t; 215 } 216 GetMockValueString(const abckit::File & file)217inline abckit::Value GetMockValueString(const abckit::File &file) 218 { 219 abckit::Value val = file.CreateValueString(DEFAULT_CONST_CHAR); 220 EXPECT_TRUE(CheckMockedApi("CreateValueString")); 221 return val; 222 } 223 GetMockValueDouble(const abckit::File & file)224inline abckit::Value GetMockValueDouble(const abckit::File &file) 225 { 226 abckit::Value val = file.CreateValueDouble(DEFAULT_DOUBLE); 227 EXPECT_TRUE(CheckMockedApi("CreateValueDouble")); 228 return val; 229 } 230 GetMockValueU1(const abckit::File & file)231inline abckit::Value GetMockValueU1(const abckit::File &file) 232 { 233 abckit::Value val = file.CreateValueU1(DEFAULT_BOOL); 234 EXPECT_TRUE(CheckMockedApi("CreateValueU1")); 235 return val; 236 } 237 GetMockValueLiteralArray(const abckit::File & file)238inline abckit::Value GetMockValueLiteralArray(const abckit::File &file) 239 { 240 abckit::Value v = file.CreateValueU1(DEFAULT_BOOL); 241 std::vector<abckit::Value> arr = {v}; 242 abckit::Value litArr = file.CreateLiteralArrayValue({arr}, 1); 243 EXPECT_TRUE(CheckMockedApi("CreateLiteralArrayValue")); 244 return litArr; 245 } 246 GetMockLiteral(const abckit::File & file)247inline abckit::Literal GetMockLiteral(const abckit::File &file) 248 { 249 abckit::Literal lit = file.CreateLiteralBool(DEFAULT_BOOL); 250 EXPECT_TRUE(CheckMockedApi("CreateLiteralBool")); 251 return lit; 252 } 253 GetMockLiteralLiteralArray(const abckit::File & file)254inline abckit::Literal GetMockLiteralLiteralArray(const abckit::File &file) 255 { 256 abckit::LiteralArray litArr = GetMockLiteralArray(file); 257 abckit::Literal arr = file.CreateLiteralLiteralArray(litArr); 258 EXPECT_TRUE(CheckMockedApi("CreateLiteralLiteralArray")); 259 return arr; 260 } 261 GetMockLiteralBool(const abckit::File & file)262inline abckit::Literal GetMockLiteralBool(const abckit::File &file) 263 { 264 abckit::Literal lit = file.CreateLiteralBool(DEFAULT_BOOL); 265 EXPECT_TRUE(CheckMockedApi("CreateLiteralBool")); 266 return lit; 267 } 268 GetMockLiteralU8(const abckit::File & file)269inline abckit::Literal GetMockLiteralU8(const abckit::File &file) 270 { 271 abckit::Literal lit = file.CreateLiteralU8(DEFAULT_U8); 272 EXPECT_TRUE(CheckMockedApi("CreateLiteralU8")); 273 return lit; 274 } 275 GetMockLiteralU16(const abckit::File & file)276inline abckit::Literal GetMockLiteralU16(const abckit::File &file) 277 { 278 abckit::Literal lit = file.CreateLiteralU16(DEFAULT_U16); 279 EXPECT_TRUE(CheckMockedApi("CreateLiteralU16")); 280 return lit; 281 } 282 GetMockLiteralU32(const abckit::File & file)283inline abckit::Literal GetMockLiteralU32(const abckit::File &file) 284 { 285 abckit::Literal lit = file.CreateLiteralU32(DEFAULT_U32); 286 EXPECT_TRUE(CheckMockedApi("CreateLiteralU32")); 287 return lit; 288 } 289 GetMockLiteralU64(const abckit::File & file)290inline abckit::Literal GetMockLiteralU64(const abckit::File &file) 291 { 292 abckit::Literal lit = file.CreateLiteralU64(DEFAULT_U64); 293 EXPECT_TRUE(CheckMockedApi("CreateLiteralU64")); 294 return lit; 295 } 296 GetMockLiteralFloat(const abckit::File & file)297inline abckit::Literal GetMockLiteralFloat(const abckit::File &file) 298 { 299 abckit::Literal lit = file.CreateLiteralFloat(DEFAULT_FLOAT); 300 EXPECT_TRUE(CheckMockedApi("CreateLiteralFloat")); 301 return lit; 302 } 303 GetMockLiteralDouble(const abckit::File & file)304inline abckit::Literal GetMockLiteralDouble(const abckit::File &file) 305 { 306 abckit::Literal lit = file.CreateLiteralDouble(DEFAULT_DOUBLE); 307 EXPECT_TRUE(CheckMockedApi("CreateLiteralDouble")); 308 return lit; 309 } 310 GetMockLiteralString(const abckit::File & file)311inline abckit::Literal GetMockLiteralString(const abckit::File &file) 312 { 313 abckit::Literal lit = file.CreateLiteralString(DEFAULT_CONST_CHAR); 314 EXPECT_TRUE(CheckMockedApi("CreateLiteralString")); 315 return lit; 316 } 317 GetMockLiteralMethodAffiliate(const abckit::File & file)318inline abckit::Literal GetMockLiteralMethodAffiliate(const abckit::File &file) 319 { 320 abckit::Literal lit = file.CreateLiteralMethodAffiliate(DEFAULT_U16); 321 EXPECT_TRUE(CheckMockedApi("CreateLiteralMethodAffiliate")); 322 return lit; 323 } 324 GetMockCoreAnnotationElement(const abckit::File & file)325inline abckit::core::AnnotationElement GetMockCoreAnnotationElement(const abckit::File &file) 326 { 327 abckit::core::Annotation ann = GetMockCoreAnnotation(file); 328 std::vector<abckit::core::AnnotationElement> annElems; 329 330 ann.EnumerateElements([&](abckit::core::AnnotationElement elem) -> bool { 331 annElems.push_back(elem); 332 return true; 333 }); 334 335 EXPECT_TRUE(CheckMockedApi("AnnotationEnumerateElements")); 336 337 return annElems.front(); 338 } 339 GetMockArktsAnnotationElement(const abckit::File & file)340inline abckit::arkts::AnnotationElement GetMockArktsAnnotationElement(const abckit::File &file) 341 { 342 auto ae = abckit::arkts::AnnotationElement(GetMockCoreAnnotationElement(file)); 343 EXPECT_TRUE(CheckMockedApi("CoreAnnotationElementToArktsAnnotationElement")); 344 return ae; 345 } 346 GetMockCoreAnnotationInterface(const abckit::File & file)347inline abckit::core::AnnotationInterface GetMockCoreAnnotationInterface(const abckit::File &file) 348 { 349 abckit::core::Annotation ann = GetMockCoreAnnotation(file); 350 abckit::core::AnnotationInterface ai = ann.GetInterface(); 351 EXPECT_TRUE(CheckMockedApi("AnnotationGetInterface")); 352 353 return ai; 354 } 355 GetMockArktsAnnotationInterface(const abckit::File & file)356inline abckit::arkts::AnnotationInterface GetMockArktsAnnotationInterface(const abckit::File &file) 357 { 358 auto ai = abckit::arkts::AnnotationInterface(GetMockCoreAnnotationInterface(file)); 359 EXPECT_TRUE(CheckMockedApi("CoreAnnotationInterfaceToArktsAnnotationInterface")); 360 return ai; 361 } 362 GetMockCoreAnnotationInterfaceField(const abckit::File & file)363inline abckit::core::AnnotationInterfaceField GetMockCoreAnnotationInterfaceField(const abckit::File &file) 364 { 365 abckit::core::AnnotationInterface ai = GetMockCoreAnnotationInterface(file); 366 std::vector<abckit::core::AnnotationInterfaceField> fields; 367 ai.EnumerateFields([&](abckit::core::AnnotationInterfaceField field) -> bool { 368 fields.push_back(field); 369 return true; 370 }); 371 EXPECT_TRUE(CheckMockedApi("AnnotationInterfaceEnumerateFields")); 372 373 return fields.front(); 374 } 375 GetMockArktsAnnotationInterfaceField(const abckit::File & file)376inline abckit::arkts::AnnotationInterfaceField GetMockArktsAnnotationInterfaceField(const abckit::File &file) 377 { 378 auto aif = abckit::arkts::AnnotationInterfaceField(GetMockCoreAnnotationInterfaceField(file)); 379 EXPECT_TRUE(CheckMockedApi("CoreAnnotationInterfaceFieldToArktsAnnotationInterfaceField")); 380 return aif; 381 } 382 383 // NOLINTEND(performance-unnecessary-value-param) 384 385 } // namespace abckit::mock::helpers 386 387 #endif // ABCKIT_CPP_HELPERS_MOCK 388