Skip to content

Commit 03d7cf2

Browse files
authored
Generate stubs for function pointers of inner structs (#607)
* Generate stubs for function pointers of inner structs
1 parent 593344f commit 03d7cf2

File tree

5 files changed

+65
-3
lines changed

5 files changed

+65
-3
lines changed

server/src/visitors/FunctionPointerForStubsVisitor.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ namespace visitor {
5656
const tests::AbstractValueView *view,
5757
const std::string &access,
5858
int depth) {
59-
if (depth == 0) {
60-
AbstractValueViewVisitor::visitPointer(type, name, view, access, depth);
61-
}
59+
AbstractValueViewVisitor::visitPointer(type, name, view, access, depth);
6260
}
6361

6462
void FunctionPointerForStubsVisitor::visitArray(const types::Type &type,

server/test/framework/Server_Tests.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2141,4 +2141,42 @@ namespace {
21412141
StatusCountMap expectedStatusCountMap{ { testsgen::TEST_PASSED, 3 } };
21422142
testUtils::checkStatuses(resultsMap, tests);
21432143
}
2144+
2145+
TEST_F(Server_Test, Run_Tests_For_Structs_With_Pointers) {
2146+
fs::path structs_with_pointers_c = getTestFilePath("structs_with_pointers.c");
2147+
auto request = testUtils::createFileRequest(projectName, suitePath, buildDirRelativePath,
2148+
srcPaths, structs_with_pointers_c,
2149+
GrpcUtils::UTBOT_AUTO_TARGET_PATH, true, false);
2150+
auto testGen = FileTestGen(*request, writer.get(), TESTMODE);
2151+
Status status = Server::TestsGenServiceImpl::ProcessBaseTestRequest(testGen, writer.get());
2152+
ASSERT_TRUE(status.ok()) << status.error_message();
2153+
EXPECT_GE(testUtils::getNumberOfTests(testGen.tests), 3);
2154+
2155+
fs::path testsDirPath = getTestFilePath("tests");
2156+
2157+
fs::path structs_with_pointers_test_cpp = Paths::sourcePathToTestPath(
2158+
utbot::ProjectContext(projectName, suitePath, testsDirPath, buildDirRelativePath, clientProjectPath),
2159+
structs_with_pointers_c);
2160+
auto testFilter = GrpcUtils::createTestFilterForFile(structs_with_pointers_test_cpp);
2161+
auto runRequest = testUtils::createCoverageAndResultsRequest(
2162+
projectName, suitePath, testsDirPath, buildDirRelativePath, std::move(testFilter));
2163+
2164+
static auto coverageAndResultsWriter =
2165+
std::make_unique<ServerCoverageAndResultsWriter>(nullptr);
2166+
CoverageAndResultsGenerator coverageGenerator{ runRequest.get(),
2167+
coverageAndResultsWriter.get() };
2168+
utbot::SettingsContext settingsContext{
2169+
true, false, 45, 0, false, false, ErrorMode::FAILING, false
2170+
};
2171+
coverageGenerator.generate(false, settingsContext);
2172+
2173+
EXPECT_FALSE(coverageGenerator.hasExceptions());
2174+
ASSERT_TRUE(coverageGenerator.getCoverageMap().empty());
2175+
2176+
auto resultsMap = coverageGenerator.getTestResultMap();
2177+
auto tests = coverageGenerator.getTestsToLaunch();
2178+
2179+
StatusCountMap expectedStatusCountMap{ { testsgen::TEST_PASSED, 3 } };
2180+
testUtils::checkStatuses(resultsMap, tests);
2181+
}
21442182
}

server/test/suites/server/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ add_executable(server
2525
simple_structs.c
2626
simple_unions.c
2727
struct_with_union.c
28+
structs_with_pointers.c
2829
complex_structs.c
2930
typedefs.c
3031
types.c
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#include "structs_with_pointers.h"
2+
3+
int process_struct_with_func_pointer(struct MainStruct* str) {
4+
if (str && str->inner && str->inner->func_id != 0) {
5+
return 1;
6+
}
7+
return 0;
8+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#ifndef UNITTESTBOT_STRUCTS_WITH_POINTERS_H
2+
#define UNITTESTBOT_STRUCTS_WITH_POINTERS_H
3+
4+
typedef int (*some_func)();
5+
6+
struct InnerStruct {
7+
some_func func;
8+
int func_id;
9+
};
10+
11+
struct MainStruct {
12+
struct InnerStruct* inner;
13+
};
14+
15+
int process_struct_with_func_pointer(struct MainStruct* str);
16+
17+
#endif // UNITTESTBOT_STRUCTS_WITH_POINTERS_H

0 commit comments

Comments
 (0)