diff --git a/.gitignore b/.gitignore index 2b915ce..7eb8ffc 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,8 @@ *.o *.a chunk_server_data_* +# Coverage reports +coverage_report/ +*.gcov +*.gcda +*.gcno diff --git a/generate_coverage_html.sh b/generate_coverage_html.sh new file mode 100755 index 0000000..1eec3ae --- /dev/null +++ b/generate_coverage_html.sh @@ -0,0 +1,353 @@ +#!/bin/bash +# Generate HTML coverage report from gcov files + +set -e + +OUTPUT_DIR="coverage_report" +mkdir -p "$OUTPUT_DIR" + +# Create main index.html +cat > "$OUTPUT_DIR/index.html" <<'HTMLHEADER' + + + + + Branch Coverage Report + + + +
+

🎯 Branch Coverage Report

+

Generated from random simulation coverage analysis

+ +
+

Overall Coverage Summary

+HTMLHEADER + +# Calculate totals +TOTAL_BRANCHES=0 +TAKEN_BRANCHES=0 + +for gcov_file in *.c.gcov; do + if [ -f "$gcov_file" ]; then + branches=$(grep -c "^branch" "$gcov_file" 2>/dev/null || echo "0") + if [ "$branches" -gt 0 ]; then + taken=$(grep "^branch" "$gcov_file" 2>/dev/null | grep -c "taken [1-9]" 2>/dev/null || echo "0") + taken=$(echo "$taken" | tr -d '[:space:]') + if [ -z "$taken" ]; then taken=0; fi + + TOTAL_BRANCHES=$((TOTAL_BRANCHES + branches)) + TAKEN_BRANCHES=$((TAKEN_BRANCHES + taken)) + fi + fi +done + +if [ "$TOTAL_BRANCHES" -gt 0 ]; then + COVERAGE_PERCENT=$((TAKEN_BRANCHES * 100 / TOTAL_BRANCHES)) + + # Determine coverage class + if [ "$COVERAGE_PERCENT" -lt 30 ]; then + COVERAGE_CLASS="coverage-low" + elif [ "$COVERAGE_PERCENT" -lt 70 ]; then + COVERAGE_CLASS="coverage-medium" + else + COVERAGE_CLASS="coverage-high" + fi + + cat >> "$OUTPUT_DIR/index.html" < + Total Branches: $TOTAL_BRANCHES
+ Branches Taken: $TAKEN_BRANCHES
+ Coverage: ${COVERAGE_PERCENT}% +
+
+
+
${COVERAGE_PERCENT}%
+
+
+ +

Coverage by File

+ + + + + + + + +HTMLSUMMARY + + # Generate table rows for each file + for gcov_file in *.c.gcov; do + if [ -f "$gcov_file" ]; then + filename=$(echo "$gcov_file" | sed 's/.gcov$//') + branches=$(grep -c "^branch" "$gcov_file" 2>/dev/null || echo "0") + + if [ "$branches" -gt 0 ]; then + taken=$(grep "^branch" "$gcov_file" 2>/dev/null | grep -c "taken [1-9]" 2>/dev/null || echo "0") + taken=$(echo "$taken" | tr -d '[:space:]') + if [ -z "$taken" ]; then taken=0; fi + + percentage=$((taken * 100 / branches)) + + if [ "$percentage" -lt 30 ]; then + bar_class="coverage-low" + elif [ "$percentage" -lt 70 ]; then + bar_class="coverage-medium" + else + bar_class="coverage-high" + fi + + # Generate individual file report + file_html="${filename}.html" + echo "Generating report for $filename..." + + cat > "$OUTPUT_DIR/$file_html" < + + + + Coverage: $filename + + + +
+ ← Back to Summary +

Coverage Report: $filename

+
+ Branches Taken: $taken / $branches ($percentage%)
+
+
+FILEHEADER
+
+                # Process the gcov file and add source code with branch info
+                awk '
+                    /^branch/ {
+                        branch_info = branch_info " " $0
+                        next
+                    }
+                    /^        / {
+                        # Line with execution count
+                        line_num = $2
+                        gsub(/:/, "", line_num)
+                        exec_count = $1
+                        gsub(/^[ \t]+/, "", exec_count)
+
+                        # Get the actual source line
+                        line_content = substr($0, index($0, $3))
+
+                        # Determine background color based on branch coverage
+                        bg_class = ""
+                        if (branch_info != "") {
+                            if (branch_info ~ /taken 0/) {
+                                bg_class = "branch-not-taken"
+                            } else if (branch_info ~ /never executed/) {
+                                bg_class = "branch-not-taken"
+                            } else {
+                                bg_class = "branch-taken"
+                            }
+                        }
+
+                        # Format execution count
+                        if (exec_count == "-") {
+                            exec_str = "-"
+                        } else if (exec_count == "#####") {
+                            exec_str = "0"
+                            if (bg_class == "") bg_class = "branch-not-taken"
+                        } else {
+                            exec_str = exec_count
+                        }
+
+                        printf "%s%s%s", bg_class, line_num, exec_str, line_content
+
+                        if (branch_info != "") {
+                            printf "%s", branch_info
+                        }
+                        printf "\n"
+
+                        branch_info = ""
+                    }
+                ' "$gcov_file" >> "$OUTPUT_DIR/$file_html"
+
+                cat >> "$OUTPUT_DIR/$file_html" <<'FILEFOOTER'
+
+
+ + +FILEFOOTER + + # Add row to main index + cat >> "$OUTPUT_DIR/index.html" < +
+ + + + + +TABLEROW + fi + fi + done + + # Close HTML + cat >> "$OUTPUT_DIR/index.html" <<'HTMLFOOTER' +
FileBranches TakenTotal BranchesCoverageVisual
$filename$taken$branches${percentage}% +
+
+
${percentage}%
+
+
+ + + +HTMLFOOTER + +else + cat >> "$OUTPUT_DIR/index.html" <<'HTMLFOOTER' +

No branch coverage data found.

+ + + + +HTMLFOOTER +fi + +echo "HTML report generated in $OUTPUT_DIR/" diff --git a/measure_coverage.sh b/measure_coverage.sh index d513ec8..a10e1de 100755 --- a/measure_coverage.sh +++ b/measure_coverage.sh @@ -92,15 +92,20 @@ fi echo -e "${BLUE}========================================${NC}" echo -# Optionally show detailed coverage for specific files -if [ "$2" == "--detailed" ]; then - echo -e "${YELLOW}Detailed coverage reports available in *.gcov files${NC}" - echo "Use 'less .gcov' to view detailed line and branch coverage" +# Generate HTML report if requested +if [ "$2" == "--html" ]; then + echo -e "${YELLOW}Generating HTML coverage report...${NC}" + ./generate_coverage_html.sh + echo -e "${GREEN}HTML report generated in coverage_report/index.html${NC}" + echo "Open with: firefox coverage_report/index.html (or your preferred browser)" + echo fi -# Clean up gcov files -echo -e "${YELLOW}Cleaning up coverage files...${NC}" -rm -f *.gcov +# Clean up gcov files unless HTML was requested +if [ "$2" != "--html" ] && [ "$2" != "--detailed" ]; then + echo -e "${YELLOW}Cleaning up coverage files...${NC}" + rm -f *.gcov +fi echo echo -e "${GREEN}Coverage measurement complete!${NC}"