diff --git a/.github/workflows/bvt-codecoverage.yml b/.github/workflows/bvt-codecoverage.yml new file mode 100644 index 0000000..0cab354 --- /dev/null +++ b/.github/workflows/bvt-codecoverage.yml @@ -0,0 +1,64 @@ +on: + workflow_call: + workflow_dispatch: + +jobs: + bvt-codecoverage: + runs-on: ubuntu-24.04 + container: gcc:16 + steps: + - uses: actions/checkout@v7 + + - name: Install CMake, Ninja, and gcovr + run: | + apt-get update + apt-get install -y cmake ninja-build gcovr + + - name: Check toolchain versions + run: | + g++ --version + gcov --version + cmake --version + ninja --version + gcovr --version + + - name: Build and run tests with code coverage instrumentation + run: | + cmake --preset coverage -DCMAKE_CXX_STANDARD=23 -DPROXY_BUILD_MODULES=TRUE + cmake --build --preset coverage -j + ctest --preset coverage -j + + - name: Build and run freestanding tests with code coverage instrumentation + run: | + cmake --preset coverage-freestanding -DCMAKE_CXX_STANDARD=23 -DPROXY_BUILD_MODULES=TRUE + cmake --build --preset coverage-freestanding -j + ctest --preset coverage-freestanding -j + + - name: Generate code coverage report + run: | + mkdir -p build/coverage/report + gcovr --root . \ + --filter 'include/proxy/' \ + --gcov-executable gcov \ + --exclude-unreachable-branches \ + --print-summary \ + --txt build/coverage/report/coverage.txt \ + --xml-pretty --output build/coverage/report/coverage.xml \ + --html-details build/coverage/report/coverage.html \ + build/coverage build/coverage-freestanding \ + | tee build/coverage/report/summary.txt + + - name: Publish coverage summary + run: | + { + echo "## Code coverage" + echo '```' + cat build/coverage/report/summary.txt + echo '```' + } >> "$GITHUB_STEP_SUMMARY" + + - name: Upload code coverage report + uses: actions/upload-artifact@v7 + with: + name: coverage-report + path: build/coverage/report/ diff --git a/.github/workflows/pipeline-ci.yml b/.github/workflows/pipeline-ci.yml index 164203c..46e3702 100644 --- a/.github/workflows/pipeline-ci.yml +++ b/.github/workflows/pipeline-ci.yml @@ -48,6 +48,11 @@ jobs: name: Run BVT for compatibility if: github.event_name != 'push' || github.repository == 'ngcpp/proxy' + run-bvt-codecoverage: + uses: ./.github/workflows/bvt-codecoverage.yml + name: Run BVT for code coverage + if: github.event_name != 'push' || github.repository == 'ngcpp/proxy' + report: uses: ./.github/workflows/bvt-report.yml name: Generate report diff --git a/CMakePresets.json b/CMakePresets.json index e5c7ddc..d393028 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -24,6 +24,26 @@ "cacheVariables": { "PROXY_FREESTANDING": "ON" } + }, + { + "name": "coverage", + "displayName": "Code coverage build", + "inherits": "default", + "binaryDir": "${sourceDir}/build/coverage", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_CXX_FLAGS": "--coverage -O0 -g", + "CMAKE_EXE_LINKER_FLAGS": "--coverage" + } + }, + { + "name": "coverage-freestanding", + "displayName": "Code coverage freestanding build", + "inherits": "coverage", + "binaryDir": "${sourceDir}/build/coverage-freestanding", + "cacheVariables": { + "PROXY_FREESTANDING": "ON" + } } ], "buildPresets": [ @@ -34,6 +54,14 @@ { "name": "freestanding", "configurePreset": "freestanding" + }, + { + "name": "coverage", + "configurePreset": "coverage" + }, + { + "name": "coverage-freestanding", + "configurePreset": "coverage-freestanding" } ], "testPresets": [ @@ -50,6 +78,20 @@ "output": { "outputOnFailure": true } + }, + { + "name": "coverage", + "configurePreset": "coverage", + "output": { + "outputOnFailure": true + } + }, + { + "name": "coverage-freestanding", + "configurePreset": "coverage-freestanding", + "output": { + "outputOnFailure": true + } } ] }