Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

llvm cov #53

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,17 @@
run: cmake --build build -j${{env.nproc}}

- name: test
if: matrix.build_type != 'Coverage'
working-directory: ./build
run: |
ctest --build-config ${{ matrix.build_type }} --output-on-failure

- name: Coverage
if: matrix.build_type == 'Coverage'
working-directory: ./build
run: |
ninja lcov

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
if: matrix.build_type == 'Coverage'
Expand Down
9 changes: 8 additions & 1 deletion .github/workflows/macos.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
runs-on: macos-latest
strategy:
matrix:
build_type: [Release, Debug, Coverage]
build_type: [Release, Coverage]
protoc: ["find"]

steps:
Expand Down Expand Up @@ -55,10 +55,17 @@ jobs:
run: cmake --build build

- name: test
if: matrix.build_type != 'Coverage'
working-directory: ./build
run: |
ctest --build-config ${{ matrix.build_type }} --output-on-failure

- name: Coverage
if: matrix.build_type == 'Coverage'
working-directory: ./build
run: |
ninja lcov

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
if: matrix.build_type == 'Coverage'
Expand Down
33 changes: 29 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,33 @@ include(third-parties.cmake)

if(HPP_PROTO_ENABLE_SANITIZERS)
if(MSVC)
# add_compile_options("/fsanitize=address")
# add_link_options("/fsanitize=address")
# add_compile_options("/fsanitize=address")
# add_link_options("/fsanitize=address")
else()
add_compile_options("-fsanitize=${HPP_PROTO_ENABLE_SANITIZERS}" "-fno-omit-frame-pointer")
add_link_options("-fsanitize=${HPP_PROTO_ENABLE_SANITIZERS}")
endif()
endif()

set(CMAKE_CXX_FLAGS_COVERAGE "-g -O0 --coverage -fprofile-arcs -ftest-coverage")
if(CMAKE_BUILD_TYPE STREQUAL "Coverage" AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set(CMAKE_CXX_FLAGS_COVERAGE "-fprofile-instr-generate -fcoverage-mapping")
set(CMAKE_EXE_LINKER_FLAGS_COVERAGE "-fprofile-instr-generate")
set(HPP_PROTO_TEST_ENVIRONMENT "LLVM_PROFILE_FILE=${CMAKE_BINARY_DIR}/coverage/%m.profraw")
configure_file(gen_lcov_info.sh.in gen_lcov_info.sh @ONLY)
file(CHMOD ${CMAKE_CURRENT_BINARY_DIR}/gen_lcov_info.sh PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ)
set(HPP_PROTO_TEST ON)

add_custom_command(
COMMAND ${CMAKE_CTEST_COMMAND}
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/gen_lcov_info.sh
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lcov.info
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS gen_lcov_info.sh.in
)

add_custom_target(lcov
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/lcov.info)
endif()

if(HPP_PROTO_DISABLE_GLAZE)
add_compile_definitions(BOOST_UT_DISABLE_MODULE HPP_PROTO_DISABLE_GLAZE)
Expand All @@ -97,6 +115,12 @@ endif()

if(HPP_PROTO_TESTS)
enable_testing()

function(add_hpp_proto_test name)
add_test(NAME ${name} COMMAND ${name} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
set_property(TEST ${name} PROPERTY ENVIRONMENT "${HPP_PROTO_TEST_ENVIRONMENT}")
endfunction(add_hpp_proto_test)

add_subdirectory(unittests)
include(CTest)
endif()
Expand All @@ -114,7 +138,8 @@ if(HPP_PROTO_PROTOC_PLUGIN)

add_subdirectory(tests)
add_subdirectory(tutorial)
if (HPP_PROTO_BUILD_FUZZ AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")

if(HPP_PROTO_BUILD_FUZZ AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
add_subdirectory(fuzz)
endif()
endif()
Expand Down
21 changes: 15 additions & 6 deletions cmake/protobuf_generate.cmake
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@

if(NOT COMMAND protobuf_generate)
function(protobuf_generate)
function(__protobuf_generate)
include(CMakeParseArguments)

set(_options APPEND_PATH)
Expand Down Expand Up @@ -159,10 +158,14 @@ if(NOT COMMAND protobuf_generate)
add_executable(protobuf::protoc ALIAS hpp_proto::protoc)
endif()

if (HPP_PROTO_TEST_ENVIRONMENT)
set(_set_env ${CMAKE_COMMAND} -E env "${HPP_PROTO_TEST_ENVIRONMENT}")
endif()

add_custom_command(
OUTPUT ${_generated_srcs}
COMMAND protobuf::protoc
ARGS ${protobuf_generate_PROTOC_OPTIONS} --${protobuf_generate_LANGUAGE}_out ${_plugin_options}:${protobuf_generate_PROTOC_OUT_DIR} ${_plugin} ${_protobuf_include_path} ${_abs_file}
COMMAND ${_set_env} $<TARGET_FILE:protobuf::protoc>
${protobuf_generallve_PROTOC_OPTIONS} --${protobuf_generate_LANGUAGE}_out ${_plugin_options}:${protobuf_generate_PROTOC_OUT_DIR} ${_plugin} ${_protobuf_include_path} ${_abs_file}
DEPENDS ${_abs_file} protobuf::protoc ${protobuf_generate_DEPENDENCIES}
COMMENT ${_comment}
VERBATIM)
Expand All @@ -178,10 +181,16 @@ if(NOT COMMAND protobuf_generate)
target_sources(${protobuf_generate_TARGET} PRIVATE ${_generated_srcs_all})
endif()
endfunction()
endif()

if(NOT COMMAND protobuf_generate)
function(protobuf_generate)
__protobuf_generate(${ARGN})
endfunction()
endif()


function(protobuf_generate_hpp)
protobuf_generate(${ARGN}
__protobuf_generate(${ARGN}
LANGUAGE hpp
GENERATE_EXTENSIONS .msg.hpp .pb.hpp .glz.hpp .desc.hpp
PLUGIN protoc-gen-hpp=$<TARGET_FILE:hpp_proto::protoc-gen-hpp>
Expand Down
18 changes: 18 additions & 0 deletions gen_lcov_info.sh.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/bin/bash

if find --version >/dev/null 2>&1; then
PERM_FLAG="-executable"
else
PERM_FLAG="-perm +111"
fi

EXECUTABLES=$(find . -type f $PERM_FLAG -print | grep -v CMakeFiles | grep -v gen_lcov_info.sh)

for exec in $EXECUTABLES; do
OBJECTS="$OBJECTS -object $exec"
done


PATH=$(@CMAKE_CXX_COMPILER@ -print-search-dirs | grep programs | sed 's/[^=]*=//')
llvm-profdata merge -sparse -o hpp-proto.profdata coverage/*.profraw
llvm-cov export -format lcov -instr-profile=hpp-proto.profdata -ignore-filename-regex="(msg|glz|pb|desc)\.hpp" -ignore-filename-regex="(tests|tutorial|unittests)/\.*" $OBJECTS > lcov.info
3 changes: 2 additions & 1 deletion protoc-plugin/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
add_compile_options(${HPP_PROTO_COMPILE_OPTIONS})

add_executable(protoc-gen-hpp hpp_gen.cpp)
add_executable(hpp_proto::protoc-gen-hpp ALIAS protoc-gen-hpp)
target_link_libraries(protoc-gen-hpp PRIVATE hpp_proto::libhpp_proto fmt::fmt)

add_executable(hpp_proto::protoc-gen-hpp ALIAS protoc-gen-hpp)
install(TARGETS protoc-gen-hpp EXPORT hpp_proto-targets)

if(MSVC)
Expand Down
57 changes: 10 additions & 47 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,7 @@ else()
add_executable(proto3_test unittest_proto3_test.cpp)
target_link_libraries(proto3_test PRIVATE unittest_proto3_proto_lib Boost::ut glaze::glaze gpb_proto_json)

add_test(NAME proto3_test
COMMAND proto3_test
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

set_property(TEST proto3_test PROPERTY ENVIRONMENT "ASAN_OPTIONS=detect_container_overflow=0")
add_hpp_proto_test(proto3_test)

file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/non_owning")

Expand All @@ -89,11 +85,7 @@ else()
target_link_libraries(non_owning_proto3_test PRIVATE Boost::ut glaze::glaze non_owning_unittest_proto3_proto_lib gpb_proto_json)
target_include_directories(non_owning_proto3_test SYSTEM PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

add_test(NAME non_owning_proto3_test
COMMAND non_owning_proto3_test
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

set_property(TEST non_owning_proto3_test PROPERTY ENVIRONMENT "ASAN_OPTIONS=detect_container_overflow=0")
add_hpp_proto_test(non_owning_proto3_test)

add_library(non_owning_unittest_proto2_proto_lib INTERFACE
"${CMAKE_CURRENT_SOURCE_DIR}/google/protobuf/unittest.proto")
Expand All @@ -106,11 +98,7 @@ else()

add_executable(non_owning_proto2_test non_owning_proto2_test.cpp)
target_link_libraries(non_owning_proto2_test Boost::ut glaze::glaze non_owning_unittest_proto2_proto_lib gpb_proto_json)
add_test(NAME non_owning_proto2_test
COMMAND non_owning_proto2_test
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")

set_property(TEST non_owning_proto2_test PROPERTY ENVIRONMENT "ASAN_OPTIONS=detect_container_overflow=0")
add_hpp_proto_test(non_owning_proto2_test)

add_library(unittest_proto_lib INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/google/protobuf/unittest.proto")
target_include_directories(unittest_proto_lib SYSTEM INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
Expand All @@ -121,11 +109,7 @@ else()
add_executable(proto2_test unittest_proto2_test.cpp)
target_link_libraries(proto2_test PRIVATE unittest_proto_lib Boost::ut glaze::glaze gpb_proto_json)

add_test(NAME proto2_test
COMMAND proto2_test
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

set_property(TEST proto2_test PROPERTY ENVIRONMENT "ASAN_OPTIONS=detect_container_overflow=0")
add_hpp_proto_test(proto2_test)

add_library(map_unittest_proto_lib INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/google/protobuf/map_unittest.proto")
target_include_directories(map_unittest_proto_lib SYSTEM INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
Expand All @@ -137,11 +121,7 @@ else()
add_executable(map_test map_test.cpp)
target_link_libraries(map_test PRIVATE map_unittest_proto_lib Boost::ut glaze::glaze gpb_proto_json)

add_test(NAME map_test
COMMAND map_test
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

set_property(TEST map_test PROPERTY ENVIRONMENT "ASAN_OPTIONS=detect_container_overflow=0")
add_hpp_proto_test(map_test)

add_library(non_owning_map_unittest_proto_lib INTERFACE
"${CMAKE_CURRENT_SOURCE_DIR}/google/protobuf/map_unittest.proto")
Expand Down Expand Up @@ -185,10 +165,7 @@ else()

add_executable(any_test any_test.cpp)
target_link_libraries(any_test PRIVATE Boost::ut hpp_proto::libhpp_proto glaze::glaze any_test_lib non_owning_any_test_lib)

add_test(NAME any_test
COMMAND any_test
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
add_hpp_proto_test(any_test)

add_executable(dynamic_serializer_tests dynamic_serializer_tests.cpp)

Expand All @@ -197,12 +174,7 @@ else()
endif()

target_link_libraries(dynamic_serializer_tests PRIVATE unittest_proto3_proto_lib map_unittest_proto_lib Boost::ut glaze::glaze gpb_proto_json any_test_lib)

add_test(NAME dynamic_serializer_tests
COMMAND dynamic_serializer_tests
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

set_property(TEST dynamic_serializer_tests PROPERTY ENVIRONMENT "ASAN_OPTIONS=detect_container_overflow=0")
add_hpp_proto_test(dynamic_serializer_tests)

add_executable(dynamic_serializer_coverage_tests dynamic_serializer_coverage_tests.cpp)
target_link_libraries(dynamic_serializer_coverage_tests PRIVATE hpp_proto::libhpp_proto Boost::ut glaze::glaze unittest_proto3_proto_lib)
Expand All @@ -212,10 +184,7 @@ else()
target_include_directories(well_known_types_tests PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../include)
target_link_libraries(well_known_types_tests PRIVATE well_known_types hpp_proto::libhpp_proto Boost::ut glaze::glaze)
add_dependencies(well_known_types_tests well_known_types)
add_test(NAME well_known_types_tests
COMMAND well_known_types_tests
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
set_property(TEST well_known_types_tests PROPERTY ENVIRONMENT "ASAN_OPTIONS=detect_container_overflow=0")
add_hpp_proto_test(well_known_types_tests)
else()
message(WARNING "No proto file for well known types are found, all tests involves well known types are skipped.")
endif(Protobuf_INCLUDE_DIRS)
Expand All @@ -237,11 +206,7 @@ else()
add_executable(lite_test unittest_lite_test.cpp)
target_link_libraries(lite_test PRIVATE unittest_lite_proto_lib Boost::ut glaze::glaze gpb_proto_json)

add_test(NAME lite_test
COMMAND lite_test
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})

set_property(TEST lite_test PROPERTY ENVIRONMENT "ASAN_OPTIONS=detect_container_overflow=0")
add_hpp_proto_test(lite_test)

add_library(editions_test_lib INTERFACE "basic_test_editions.proto" "editions_test.proto")
target_include_directories(editions_test_lib SYSTEM INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
Expand All @@ -262,8 +227,6 @@ else()
add_executable(basic_test_proto2 basic_test_proto2.cpp)
target_link_libraries(basic_test_proto2 PRIVATE basic_test_proto2_lib)

add_test(NAME editions_test
COMMAND editions_test
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
add_hpp_proto_test(editions_test)
endif()
endif()
4 changes: 4 additions & 0 deletions tutorial/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ if(PROJECT_IS_TOP_LEVEL)
else()
find_package(hpp_proto CONFIG REQUIRED)
endif()

function(add_hpp_proto_test name)
add_test(NAME ${name} COMMAND ${name} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
endfunction(add_hpp_proto_test)
endif()

add_subdirectory(regular)
Expand Down
6 changes: 2 additions & 4 deletions tutorial/dynamic_serializer/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
add_custom_command(
COMMENT "Generating addressbook_proto3.desc.binpb"
OUTPUT addressbook_proto3.desc.binpb
COMMAND protobuf::protoc -I "${CMAKE_CURRENT_SOURCE_DIR}/.." --descriptor_set_out=addressbook_proto3.desc.binpb
COMMAND protobuf::protoc -I "${CMAKE_CURRENT_SOURCE_DIR}/.." --descriptor_set_out=addressbook_proto3.desc.binpb
${CMAKE_CURRENT_SOURCE_DIR}/../addressbook_proto3.proto
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
)
Expand All @@ -14,6 +14,4 @@ add_executable(protobuf_json_conversion protobuf_json_conversion.cpp)
target_link_libraries(protobuf_json_conversion PRIVATE hpp_proto::libhpp_proto)
add_dependencies(protobuf_json_conversion addressbook_proto3_descriptor)

add_test(NAME protobuf_json_conversion
COMMAND protobuf_json_conversion
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
add_hpp_proto_test(protobuf_json_conversion)
2 changes: 1 addition & 1 deletion tutorial/grpc/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,6 @@ if(gRPC_FOUND AND NOT HPP_PROTO_ENABLE_SANITIZERS)
add_test(NAME greeter_test
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/greeter_test.sh
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
set_tests_properties(greeter_test PROPERTIES TIMEOUT 30)
set_tests_properties(greeter_test PROPERTIES TIMEOUT 30 ENVIRONMENT "${HPP_PROTO_TEST_ENVIRONMENT}")
endif()
endif()
4 changes: 1 addition & 3 deletions tutorial/mixed_ownership/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,4 @@ protobuf_generate_hpp(
add_executable(mixed_ownership_tutorial mixed_ownership_tutorial.cpp)
target_link_libraries(mixed_ownership_tutorial PRIVATE regular_addressbook non_owning_addressbook)

add_test(NAME mixed_ownership_tutorial
COMMAND mixed_ownership_tutorial
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
add_hpp_proto_test(mixed_ownership_tutorial)
15 changes: 4 additions & 11 deletions tutorial/non_owning/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@ protobuf_generate_hpp(TARGET non_owning_addressbook_proto3
add_executable(non_owning_tutorial_proto3 non_owning_tutorial_proto3.cpp)
target_link_libraries(non_owning_tutorial_proto3 PRIVATE non_owning_addressbook_proto3)

add_test(
NAME non_owning_tutorial_proto3
COMMAND non_owning_tutorial_proto3
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
add_hpp_proto_test(non_owning_tutorial_proto3)

add_library(non_owning_addressbook_proto2 INTERFACE)
target_include_directories(non_owning_addressbook_proto2 INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
Expand All @@ -24,9 +21,7 @@ protobuf_generate_hpp(
add_executable(non_owning_tutorial_proto2 non_owning_tutorial_proto2.cpp)
target_link_libraries(non_owning_tutorial_proto2 PRIVATE non_owning_addressbook_proto2)

add_test(NAME non_owning_tutorial_proto2
COMMAND non_owning_tutorial_proto2
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
add_hpp_proto_test(non_owning_tutorial_proto2)

add_library(non_owning_any INTERFACE)
protobuf_generate_hpp(
Expand All @@ -43,9 +38,7 @@ protobuf_generate_hpp(
IMPORT_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/.. ${Protobuf_INCLUDE_DIRS}
PROTOS ../any_demo.proto
PLUGIN_OPTIONS non_owning)

add_executable(non_owning_tutorial_any non_owning_tutorial_any.cpp)
target_link_libraries(non_owning_tutorial_any PRIVATE non_owning_any_demo non_owning_addressbook_proto3)
add_test(NAME non_owning_tutorial_any
COMMAND non_owning_tutorial_any
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
add_hpp_proto_test(non_owning_tutorial_any)
Loading