Skip to content

[#258] MCDC Test

[#258] MCDC Test #72

name: CryptoLib Coverage and MC/DC Analysis
on:
push:
branches:
- 258-cyclomatic-complexity-and-mcdc-in-ci
paths-ignore:
- 'doc/coverage/line-coverage-badge.svg'
- 'doc/coverage/branch-coverage-badge.svg'
pull_request:
branches:
- 258-cyclomatic-complexity-and-mcdc-in-ci
jobs:
coverage:
runs-on: ubuntu-latest
container:
image: ivvitc/cryptolib:20240814
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Fetch full history for branch operations
- name: Configure Safe Directory
run: git config --global --add safe.directory $GITHUB_WORKSPACE
- name: Install Dependencies (Including Clang 19)
env:
DEBIAN_FRONTEND: noninteractive
run: |
echo "Installing dependencies..."
apt-get update
apt-get install -y \
lcov libcurl4-openssl-dev libmariadb-dev libmariadb-dev-compat \
python3 python3-pip python3-venv gcovr bc pipx wget \
software-properties-common
# Add the official LLVM repository and install Clang 19
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
./llvm.sh 19
apt-get install -y clang-19 libclang-19-dev python3-clang
# Ensure Clang 19 is the default
update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-19/bin/clang 100
update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-19/bin/clang++ 100
pipx install --system-site-packages mcdc-checker
- name: Verify Clang Installation
run: |
echo "Checking clang binary..."
which clang || { echo "clang not found in PATH"; exit 1; }
echo "clang version:"
clang --version
- name: Verify Clang Python Bindings
run: |
echo "Testing Clang Python bindings..."
python3 -c "import clang.cindex; print('Clang bindings are working')"
- name: Build with Coverage Flags
run: |
export CFLAGS="-fprofile-arcs -ftest-coverage -g"
bash ${GITHUB_WORKSPACE}/support/scripts/build_internal.sh
- name: Generate Coverage Report and Badges
run: |
mkdir -p doc/coverage
gcovr --branches --xml-pretty --exclude-unreachable-branches -o doc/coverage/coverage_report.xml
gcovr --branches --html --html-details -o doc/coverage/coverage_report.html
LINE_COVERAGE=$(grep -oP '(?<=<coverage line-rate=")[0-9.]+(?=")' doc/coverage/coverage_report.xml | head -n 1)
BRANCH_COVERAGE=$(grep -oP '(?<=branch-rate=")[0-9.]+(?=")' doc/coverage/coverage_report.xml | head -n 1)
LINE_COVERAGE_PERCENT=$(printf "%.0f" $(echo "$LINE_COVERAGE * 100" | bc))
BRANCH_COVERAGE_PERCENT=$(printf "%.0f" $(echo "$BRANCH_COVERAGE * 100" | bc))
if [ "$LINE_COVERAGE_PERCENT" -ge 80 ]; then LINE_COLOR="brightgreen"; elif [ "$LINE_COVERAGE_PERCENT" -ge 50 ]; then LINE_COLOR="yellow"; else LINE_COLOR="red"; fi
if [ "$BRANCH_COVERAGE_PERCENT" -ge 80 ]; then BRANCH_COLOR="brightgreen"; elif [ "$BRANCH_COVERAGE_PERCENT" -ge 50 ]; then BRANCH_COLOR="yellow"; else BRANCH_COLOR="red"; fi
curl -o doc/coverage/line-coverage-badge.svg "https://img.shields.io/badge/line%20coverage-${LINE_COVERAGE_PERCENT}%25-${LINE_COLOR}"
curl -o doc/coverage/branch-coverage-badge.svg "https://img.shields.io/badge/branch%20coverage-${BRANCH_COVERAGE_PERCENT}%25-${BRANCH_COLOR}"
- name: Commit Coverage Badges
run: |
git config user.name "github-actions"
git config user.email "[email protected]"
git add doc/coverage/line-coverage-badge.svg
git add doc/coverage/branch-coverage-badge.svg
git commit -m "Update coverage badges" || echo "No changes to commit"
git push origin HEAD
- name: Run MC/DC Analysis
run: |
echo "Setting up environment for MC/DC Checker..."
export PATH=/usr/lib/llvm-19/bin:$PATH
export LD_LIBRARY_PATH=/usr/lib/llvm-19/lib:$LD_LIBRARY_PATH
echo "Testing Clang bindings in mcdc-checker environment..."
python3 -c "import clang.cindex; print('Clang version:', clang.cindex.Config.library_path)"
echo "Running mcdc-checker..."
mcdc-checker -a -j $GITHUB_WORKSPACE/doc/coverage/mcdc_report.json \
-I $GITHUB_WORKSPACE/include $(find $GITHUB_WORKSPACE/src -type f -name '*.c' | tr '\n' ' ') \
> $GITHUB_WORKSPACE/doc/coverage/mcdc_checker_output.log 2>&1 || true
- name: Display MC/DC Checker Output
run: |
echo "Displaying MC/DC Checker Output:"
cat $GITHUB_WORKSPACE/doc/coverage/mcdc_checker_output.log