From afc43d5f82588d2ed71ea104e8262f5e5da13980 Mon Sep 17 00:00:00 2001 From: Alon Date: Sun, 3 Sep 2023 11:48:49 +0300 Subject: [PATCH] cov : add Code Coverage and codecov.io integration (#2928) * update .gitignore * makefile: add coverage support (lcov, gcovr) * add code-coverage workflow * update code coverage workflow * wun on ubuntu 20.04 * use gcc-8 * check why the job hang * add env vars * add LLAMA_CODE_COVERAGE=1 again * - add CODECOV_TOKEN - add missing make lcov-report * install lcov * update make file -pb flag * remove unused GGML_NITER from workflows * wrap coverage output files in COV_TARGETS --- .github/workflows/build.yml | 1 - .github/workflows/code-coverage.yml | 36 +++++++++++++++++++++++++++++ .gitignore | 7 ++++++ Makefile | 22 +++++++++++++++++- 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/code-coverage.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 20fd8c2b5..9d0a6c222 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,7 +18,6 @@ on: env: BRANCH_NAME: ${{ github.head_ref || github.ref_name }} GGML_NLOOP: 3 - GGML_NITER: 1 GGML_N_THREADS: 1 jobs: diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml new file mode 100644 index 000000000..392db8a08 --- /dev/null +++ b/.github/workflows/code-coverage.yml @@ -0,0 +1,36 @@ +name: Code Coverage +on: [push, pull_request] + +env: + GGML_NLOOP: 3 + GGML_N_THREADS: 1 + +jobs: + run: + runs-on: ubuntu-20.04 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Dependencies + run: | + sudo apt-get update + sudo apt-get install build-essential gcc-8 lcov + + - name: Build + run: CC=gcc-8 make -j LLAMA_CODE_COVERAGE=1 tests + + - name: Run tests + run: CC=gcc-8 make test + + - name: Generate coverage report + run: | + make coverage + make lcov-report + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + with: + files: lcov-report/coverage.info diff --git a/.gitignore b/.gitignore index 8b5f45a2d..f9244fadc 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,10 @@ *.exe *.dll *.log +*.gcov +*.gcno +*.gcda +*.dot .DS_Store .build/ .cache/ @@ -17,6 +21,9 @@ .vs/ .vscode/ +lcov-report/ +gcovr-report/ + build*/ out/ tmp/ diff --git a/Makefile b/Makefile index e214970f8..c042bf0e5 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,9 @@ BUILD_TARGETS = main quantize quantize-stats perplexity embedding vdot train-tex # Binaries only useful for tests TEST_TARGETS = tests/test-llama-grammar tests/test-grammar-parser tests/test-double-float tests/test-grad0 tests/test-opt tests/test-quantize-fns tests/test-quantize-perf tests/test-sampling tests/test-tokenizer-0-llama tests/test-tokenizer-0-falcon tests/test-tokenizer-1 +# Code coverage output files +COV_TARGETS = *.gcno tests/*.gcno *.gcda tests/*.gcda *.gcov tests/*.gcov lcov-report gcovr-report + default: $(BUILD_TARGETS) test: @@ -23,6 +26,18 @@ test: all: $(BUILD_TARGETS) $(TEST_TARGETS) +coverage: ## Run code coverage + gcov -pb tests/*.cpp + +lcov-report: coverage ## Generate lcov report + mkdir -p lcov-report + lcov --capture --directory . --output-file lcov-report/coverage.info + genhtml lcov-report/coverage.info --output-directory lcov-report + +gcovr-report: coverage ## Generate gcovr report + mkdir -p gcovr-report + gcovr --root . --html --html-details --output gcovr-report/coverage.html + ifndef UNAME_S UNAME_S := $(shell uname -s) endif @@ -84,6 +99,11 @@ ifdef LLAMA_SERVER_VERBOSE MK_CPPFLAGS += -DSERVER_VERBOSE=$(LLAMA_SERVER_VERBOSE) endif + +ifdef LLAMA_CODE_COVERAGE + CXXFLAGS += -fprofile-arcs -ftest-coverage -dumpbase '' +endif + ifdef LLAMA_DISABLE_LOGS CFLAGS += -DLOG_DISABLE_LOGS CXXFLAGS += -DLOG_DISABLE_LOGS @@ -399,7 +419,7 @@ libllama.so: llama.o ggml.o $(OBJS) $(CXX) $(CXXFLAGS) -shared -fPIC -o $@ $^ $(LDFLAGS) clean: - rm -vf *.o tests/*.o *.so *.dll benchmark-matmult build-info.h $(BUILD_TARGETS) $(TEST_TARGETS) + rm -vrf *.o tests/*.o *.so *.dll benchmark-matmult build-info.h *.dot $(COV_TARGETS) $(BUILD_TARGETS) $(TEST_TARGETS) # # Examples