diff --git a/.github/workflows/ci-code.yml b/.github/workflows/ci-code.yml index d2e714ff..9089befc 100644 --- a/.github/workflows/ci-code.yml +++ b/.github/workflows/ci-code.yml @@ -98,3 +98,33 @@ jobs: - name: Check spelling run: | codespell + + coverage: + runs-on: ubuntu-latest + name: Code Coverage + 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 + make check-functional-parallel || true + lcov --capture --directory . --output-file /coverage/coverage.info \ + --rc branch_coverage=1 \ + --ignore-errors inconsistent + lcov --remove /coverage/coverage.info \ + "/usr/include/*" "*/tests/*" \ + --output-file /coverage/coverage.info \ + --rc branch_coverage=1 \ + --ignore-errors inconsistent,empty,unused + ' + - 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/.gitignore b/.gitignore index 6e24b69c..59b5eab2 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,4 @@ breaks *.tar.* *.zip *.log* +coverage/ 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 6bce6578..b8c8c706 100644 --- a/Makefile.am +++ b/Makefile.am @@ -386,6 +386,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],