From f41888b7a5a54c019384932b3156a02b01bf9899 Mon Sep 17 00:00:00 2001 From: "jabber.developer2" Date: Sat, 17 Jan 2026 17:45:34 +0300 Subject: [PATCH] feat: add code coverage support - Add --enable-coverage option to configure.ac - Add coverage and coverage-html targets to Makefile.am - Add coverage CI job with Codecov upload - Add lcov to all Dockerfiles (arch, debian, fedora, tumbleweed, ubuntu) Usage: ./configure --enable-coverage make check make coverage-html --- .github/workflows/ci-code.yml | 24 ++++++++++++++++++++++++ Dockerfile.arch | 1 + Dockerfile.debian | 1 + Dockerfile.fedora | 1 + Dockerfile.tumbleweed | 1 + Dockerfile.ubuntu | 1 + Makefile.am | 14 ++++++++++++++ configure.ac | 7 +++++++ 8 files changed, 50 insertions(+) diff --git a/.github/workflows/ci-code.yml b/.github/workflows/ci-code.yml index 1e2cf0cb..d7138293 100644 --- a/.github/workflows/ci-code.yml +++ b/.github/workflows/ci-code.yml @@ -98,3 +98,27 @@ jobs: - name: Check spelling run: | codespell + + coverage: + runs-on: ubuntu-latest + name: Code Coverage + if: github.event_name == 'push' && github.ref == 'refs/heads/master' + steps: + - uses: actions/checkout@v4 + - name: Build and run coverage + run: | + docker build -f Dockerfile.debian -t profanity-cov . + docker run -v ${{ github.workspace }}/coverage:/coverage profanity-cov bash -c ' + ./bootstrap.sh + ./configure --enable-coverage --enable-otr --enable-pgp --enable-omemo --enable-plugins + make -j$(nproc) + make check || true + lcov --capture --directory . --output-file /coverage/coverage.info --ignore-errors inconsistent + lcov --remove /coverage/coverage.info "/usr/*" "*/tests/*" --output-file /coverage/coverage.info --ignore-errors inconsistent + ' + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + with: + files: ./coverage/coverage.info + fail_ci_if_error: false + verbose: true \ No newline at end of file diff --git a/Dockerfile.arch b/Dockerfile.arch index fb68a128..4c7c29bf 100644 --- a/Dockerfile.arch +++ b/Dockerfile.arch @@ -17,6 +17,7 @@ RUN pacman -S --needed --noconfirm \ check \ cmake \ cmocka \ + lcov \ curl \ debuginfod \ doxygen \ diff --git a/Dockerfile.debian b/Dockerfile.debian index d0f454f1..7b515ac5 100644 --- a/Dockerfile.debian +++ b/Dockerfile.debian @@ -12,6 +12,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ ccache \ gcc \ git \ + lcov \ libcmocka-dev \ libcurl3-dev \ libgcrypt-dev \ diff --git a/Dockerfile.fedora b/Dockerfile.fedora index 19983dce..6b218d2c 100644 --- a/Dockerfile.fedora +++ b/Dockerfile.fedora @@ -14,6 +14,7 @@ RUN dnf install -y \ ccache \ gcc \ git \ + lcov \ glib2-devel \ glibc-all-langpacks \ gtk2-devel \ diff --git a/Dockerfile.tumbleweed b/Dockerfile.tumbleweed index 292214c2..76561a10 100644 --- a/Dockerfile.tumbleweed +++ b/Dockerfile.tumbleweed @@ -13,6 +13,7 @@ RUN zypper --non-interactive in --no-recommends \ ccache \ gcc \ git \ + lcov \ glib2-devel \ glibc-locale \ gtk2-devel \ diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu index 8af14224..dd95b90e 100644 --- a/Dockerfile.ubuntu +++ b/Dockerfile.ubuntu @@ -11,6 +11,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ ccache \ gcc \ git \ + lcov \ libcmocka-dev \ libcurl3-dev \ libgcrypt-dev \ diff --git a/Makefile.am b/Makefile.am index 66d95578..9d66ddf6 100644 --- a/Makefile.am +++ b/Makefile.am @@ -384,6 +384,20 @@ check-unit: tests/unittests/unittests @VALGRIND_CHECK_RULES@ VALGRIND_SUPPRESSIONS_FILES=prof.supp +# Code coverage targets (requires --enable-coverage) +coverage-clean: + find . -name '*.gcda' -delete + find . -name '*.gcno' -delete + rm -rf coverage-html coverage.info + +coverage-report: check + lcov --capture --directory . --output-file coverage.info --ignore-errors inconsistent + lcov --remove coverage.info '/usr/*' '*/tests/*' --output-file coverage.info --ignore-errors inconsistent + genhtml coverage.info --output-directory coverage-html + @echo "Coverage report generated in coverage-html/index.html" + +.PHONY: coverage-clean coverage-report + format: $(all_c_sources) clang-format -i $(all_c_sources) diff --git a/configure.ac b/configure.ac index da73f253..c79774e0 100644 --- a/configure.ac +++ b/configure.ac @@ -69,6 +69,8 @@ AC_ARG_ENABLE([gdk-pixbuf], [AS_HELP_STRING([--enable-gdk-pixbuf], [enable GDK Pixbuf support to scale avatars before uploading])]) AC_ARG_ENABLE([omemo-qrcode], [AS_HELP_STRING([--enable-omemo-qrcode], [enable ability to display omemo qr code])]) +AC_ARG_ENABLE([coverage], + [AS_HELP_STRING([--enable-coverage], [enable code coverage analysis])]) m4_include([m4/ax_valgrind_check.m4]) AX_VALGRIND_DFLT([drd], [off]) @@ -386,6 +388,11 @@ AC_SUBST([FORKPTY_LIB]) AM_CFLAGS="$AM_CFLAGS -Wall -Wno-deprecated-declarations -std=gnu99 -ggdb3" AM_LDFLAGS="$AM_LDFLAGS -export-dynamic" +AS_IF([test "x$enable_coverage" = xyes], + [AM_CFLAGS="$AM_CFLAGS --coverage -O0" + AM_LDFLAGS="$AM_LDFLAGS --coverage" + AC_MSG_NOTICE([Code coverage analysis enabled])]) + AS_IF([test "x$PACKAGE_STATUS" = xdevelopment], [AM_CFLAGS="$AM_CFLAGS -Wunused -Werror"]) AS_IF([test "x$PLATFORM" = xosx],