| 8 | class TestTargetAPIFinder : public TestBase {}; |
| 9 | |
| 10 | TEST_F(TestTargetAPIFinder, BasicP) { |
| 11 | |
| 12 | const std::string CODE = "void API_1();\n" |
| 13 | "void API_2();\n" |
| 14 | "void API_3();\n" |
| 15 | "void test() {\n" |
| 16 | " API_1();\n" |
| 17 | " API_2();\n" |
| 18 | "}\n"; |
| 19 | |
| 20 | ASSERT_TRUE(loadC(CODE)); |
| 21 | |
| 22 | auto *API1 = IRAH->getFunction("API_1"); |
| 23 | auto *API2 = IRAH->getFunction("API_2"); |
| 24 | ASSERT_TRUE(API1); |
| 25 | ASSERT_TRUE(API2); |
| 26 | |
| 27 | auto *Test = IRAH->getFunction("test"); |
| 28 | ASSERT_TRUE(Test); |
| 29 | |
| 30 | std::set<llvm::Function *> APIFuncs = {API1, API2}; |
| 31 | std::vector<llvm::Function *> Funcs = {Test}; |
| 32 | auto Finder = TargetAPIFinder(APIFuncs); |
| 33 | auto TargetAPIs = Finder.findAPIs(Funcs); |
| 34 | ASSERT_EQ(TargetAPIs.size(), 2); |
| 35 | ASSERT_NE(TargetAPIs.find(API1), TargetAPIs.end()); |
| 36 | ASSERT_NE(TargetAPIs.find(API2), TargetAPIs.end()); |
| 37 | |
| 38 | auto APICallers = Finder.findAPICallers(Funcs); |
| 39 | ASSERT_EQ(APICallers.size(), 2); |
| 40 | auto *Caller = IRAH->getInstruction("test", 0, 0); |
| 41 | ASSERT_TRUE(Caller); |
| 42 | ASSERT_TRUE(isa<CallBase>(Caller)); |
| 43 | ASSERT_NE(APICallers.find(dyn_cast<CallBase>(Caller)), APICallers.end()); |
| 44 | |
| 45 | Caller = IRAH->getInstruction("test", 0, 1); |
| 46 | ASSERT_TRUE(Caller); |
| 47 | ASSERT_TRUE(isa<CallBase>(Caller)); |
| 48 | ASSERT_NE(APICallers.find(dyn_cast<CallBase>(Caller)), APICallers.end()); |
| 49 | } |
| 50 | |
| 51 | TEST_F(TestTargetAPIFinder, NullAPIN) { |
| 52 |
nothing calls this directly
no test coverage detected