This is an automated email from the ASF dual-hosted git repository. slbotbm pushed a commit to branch cpp-coverage in repository https://gitbox.apache.org/repos/asf/iggy.git
commit dfccce86c5d5ea6d28df99e8dc4d0bbd0bfb0a02 Author: Rimuksh Kansal <[email protected]> AuthorDate: Sat Sep 12 16:22:56 2026 +0900 cleanup --- foreign/cpp/.bazelrc | 16 +-- foreign/cpp/BUILD.bazel | 6 +- scripts/ci/coverage-baseline-affected.sh | 2 +- scripts/ci/cpp-coverage.sh | 185 ++++++------------------------- 4 files changed, 37 insertions(+), 172 deletions(-) diff --git a/foreign/cpp/.bazelrc b/foreign/cpp/.bazelrc index eaa105597..880712c20 100644 --- a/foreign/cpp/.bazelrc +++ b/foreign/cpp/.bazelrc @@ -48,18 +48,4 @@ build:ci --config=release build:ci --lockfile_mode=error test:ci --lockfile_mode=error -test:ci --test_summary=terse -test:ci --test_arg=--gtest_brief=1 - -# Self-contained coverage configuration. -common:cpp-coverage --color=no -common:cpp-coverage --curses=no -common:cpp-coverage --announce_rc - -build:cpp-coverage --compilation_mode=dbg -build:cpp-coverage --copt=-O0 -build:cpp-coverage --strip=never -build:cpp-coverage --lockfile_mode=error - -test:cpp-coverage --test_summary=terse -test:cpp-coverage --test_arg=--gtest_brief=1 +test:ci --test_summary=detailed diff --git a/foreign/cpp/BUILD.bazel b/foreign/cpp/BUILD.bazel index 9e93fdad7..ea6dffedd 100644 --- a/foreign/cpp/BUILD.bazel +++ b/foreign/cpp/BUILD.bazel @@ -60,7 +60,7 @@ genrule( env -u PWD \ CARGO_TARGET_DIR="$$CARGO_TARGET_DIR" \ RUSTC="$$RUSTC" \ - "$$CARGO" build --quiet $$FLAGS + "$$CARGO" build $$FLAGS cp "$$CARGO_TARGET_DIR/$$PROFILE/libiggy_cpp.a" "$$OUT_LIB" @@ -129,9 +129,9 @@ cc_import( static_library = ":libiggy_cpp.a", ) -cc_library( +cc_import( name = "profiler_rt", - srcs = ["libprofiler_builtins.a"], + static_library = ":libprofiler_builtins.a", alwayslink = True, ) diff --git a/scripts/ci/coverage-baseline-affected.sh b/scripts/ci/coverage-baseline-affected.sh index e33ecec9c..b3c7b8492 100755 --- a/scripts/ci/coverage-baseline-affected.sh +++ b/scripts/ci/coverage-baseline-affected.sh @@ -82,7 +82,7 @@ for gate in "${GATES[@]}"; do node) paths=(foreign/node) ;; # The go job also runs the bdd/go suite with foreign/go in -coverpkg. go) paths=(foreign/go bdd/go) ;; - cpp) paths=(foreign/cpp bdd/cpp) ;; + cpp) paths=(foreign/cpp) ;; *) echo "coverage-gate: no pathspecs defined for gate '$gate'" >&2 exit 1 diff --git a/scripts/ci/cpp-coverage.sh b/scripts/ci/cpp-coverage.sh index 42cd867d5..780116ca6 100755 --- a/scripts/ci/cpp-coverage.sh +++ b/scripts/ci/cpp-coverage.sh @@ -18,176 +18,55 @@ set -euo pipefail -if [[ ! -f MODULE.bazel || ! -f BUILD.bazel ]]; then - echo "cpp-coverage: must run with CWD set to foreign/cpp" >&2 - exit 2 -fi - -for tool in bazel cargo; do - if ! command -v "$tool" >/dev/null 2>&1; then - echo "cpp-coverage: required tool '$tool' not on PATH" >&2 - exit 2 - fi -done - OUTPUT="${1:-../../reports/cpp-coverage.lcov}" -OUTPUT_TMP="${OUTPUT}.tmp" -REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" -TMP_DIR="$(pwd)/target/cpp-coverage-tmp" -PROFRAW_DIR="$TMP_DIR/profraw" -BUILD_PROFRAW_DIR="$TMP_DIR/build-profraw" -PROFDATA="$TMP_DIR/cpp-shim.profdata" +COVERAGE_DIR="$(pwd)/target/cpp-coverage" +BUILD_PROFRAW_DIR="$COVERAGE_DIR/build" +PROFDATA="$COVERAGE_DIR/shim.profdata" CPP_RAW="$(pwd)/bazel-out/_coverage/_coverage_report.dat" -SHIM_RAW="$TMP_DIR/rust-shim-raw.lcov" -CPP_FILTERED="$TMP_DIR/cpp-coverage.lcov" -SHIM_FILTERED="$TMP_DIR/rust-shim.lcov" -mkdir -p "$PROFRAW_DIR" "$BUILD_PROFRAW_DIR" "$(dirname "$OUTPUT")" -rm -f "$PROFRAW_DIR"/*.profraw "$BUILD_PROFRAW_DIR"/*.profraw \ - "$PROFDATA" "$CPP_FILTERED" "$SHIM_RAW" "$SHIM_FILTERED" "$OUTPUT_TMP" +mkdir -p "$COVERAGE_DIR" "$BUILD_PROFRAW_DIR" "$(dirname "$OUTPUT")" +rm -f "$COVERAGE_DIR"/*.profraw "$BUILD_PROFRAW_DIR"/*.profraw "$PROFDATA" "$OUTPUT" -show_env_file="$TMP_DIR/show-env.sh" -if ! cargo llvm-cov show-env --no-rustc-wrapper --sh >"$show_env_file"; then - echo "cpp-coverage: 'cargo llvm-cov show-env' failed (see output above)" >&2 - exit 1 -fi # shellcheck disable=SC1090 -source "$show_env_file" -if [[ -z "${RUSTFLAGS:-}" ]]; then - echo "cpp-coverage: cargo llvm-cov show-env did not export RUSTFLAGS" >&2 - exit 1 -fi -export LLVM_PROFILE_FILE="$PROFRAW_DIR/cpp-%p-%m.profraw" - -llvm_bin_dir="$(rustc --print sysroot)/lib/rustlib/$(rustc -vV | sed -n 's/^host: //p')/bin" -LLVM_COV="$llvm_bin_dir/llvm-cov" -LLVM_PROFDATA="$llvm_bin_dir/llvm-profdata" -if [[ ! -x "$LLVM_COV" || ! -x "$LLVM_PROFDATA" ]]; then - echo "cpp-coverage: $LLVM_COV or $LLVM_PROFDATA missing;" >&2 - echo "cpp-coverage: install with 'rustup component add llvm-tools'" >&2 - exit 1 -fi +source <(cargo llvm-cov show-env --no-rustc-wrapper --sh) +export LLVM_PROFILE_FILE="$COVERAGE_DIR/%p-%m.profraw" -BAZEL_FLAGS=(--config=cpp-coverage) -COVERAGE_DEFINE="--define=iggy_cpp_coverage=1" -TEST_QUERY='kind("cc_test rule", //...)' -if ! TEST_TARGET_ROWS="$( - bazel cquery "$TEST_QUERY" \ - "${BAZEL_FLAGS[@]}" \ - "$COVERAGE_DEFINE" \ - --output=starlark \ - '--starlark:expr="//" + target.label.package + ":" + target.label.name + "\t" + providers(target)["DefaultInfo"].files_to_run.executable.path' -)"; then - echo "cpp-coverage: failed to discover C++ test targets" >&2 - exit 1 -fi -if [[ -z "$TEST_TARGET_ROWS" ]]; then - echo "cpp-coverage: no C++ test targets found" >&2 - exit 1 -fi +LLVM_BIN="$(rustc --print target-libdir)/../bin" +LLVM_COV="$LLVM_BIN/llvm-cov" +LLVM_PROFDATA="$LLVM_BIN/llvm-profdata" -TEST_TARGETS=() -TEST_OBJECTS=() -while IFS=$'\t' read -r test_target test_object; do - if [[ -z "$test_target" || -z "$test_object" ]]; then - echo "cpp-coverage: invalid C++ test target entry: $test_target $test_object" >&2 - exit 1 - fi - TEST_TARGETS+=("$test_target") - TEST_OBJECTS+=("$(pwd)/$test_object") -done <<<"$TEST_TARGET_ROWS" - -bazel coverage "${BAZEL_FLAGS[@]}" \ +bazel coverage \ + --config=debug \ + --lockfile_mode=error \ --combined_report=lcov \ '--instrumentation_filter=//:iggy-cpp' \ - --nocache_test_results \ - --strategy=CoverageReport=local \ --strategy=TestRunner=standalone \ - "$COVERAGE_DEFINE" \ - "--action_env=RUSTFLAGS=$RUSTFLAGS" \ - "--action_env=LLVM_PROFILE_FILE=$BUILD_PROFRAW_DIR/build-%p-%m.profraw" \ + --define=iggy_cpp_coverage=1 \ + --action_env=RUSTFLAGS \ + "--action_env=LLVM_PROFILE_FILE=$BUILD_PROFRAW_DIR/%p-%m.profraw" \ "--run_under=/usr/bin/env LLVM_PROFILE_FILE=$LLVM_PROFILE_FILE" \ - "${TEST_TARGETS[@]}" - -if [[ ! -s "$CPP_RAW" ]]; then - echo "cpp-coverage: bazel coverage produced no combined report" >&2 - exit 1 -fi + //:unit //:e2e -shopt -s nullglob -profraws=("$PROFRAW_DIR"/*.profraw) -shopt -u nullglob -if [[ ${#profraws[@]} -eq 0 ]]; then - echo "cpp-coverage: no profraw files in $PROFRAW_DIR; RUSTFLAGS or LLVM_PROFILE_FILE did not reach the test binaries" >&2 - exit 1 -fi +"$LLVM_PROFDATA" merge -sparse \ + "$COVERAGE_DIR"/*.profraw \ + -o "$PROFDATA" -"$LLVM_PROFDATA" merge -sparse "${profraws[@]}" -o "$PROFDATA" +sed 's|^SF:|SF:foreign/cpp/|' "$CPP_RAW" >"$OUTPUT" -LLVM_COV_OBJECT_ARGS=() -for test_object in "${TEST_OBJECTS[@]}"; do - if [[ ! -f "$test_object" ]]; then - echo "cpp-coverage: test executable not found: $test_object" >&2 - exit 1 - fi - LLVM_COV_OBJECT_ARGS+=(--object "$test_object") -done - -"$LLVM_COV" export "${LLVM_COV_OBJECT_ARGS[@]}" \ +"$LLVM_COV" export \ + --object bazel-bin/unit \ + --object bazel-bin/e2e \ -instr-profile="$PROFDATA" \ -format=lcov \ - -ignore-filename-regex='(\.cargo/|/rustc/|/core/|cxxbridge|/registry/)' >"$SHIM_RAW" - -filter_lcov() { - local input="$1" output="$2" mode="$3" - awk -v mode="$mode" ' - function map_sf(raw, mapped) { - if (mode == "rs") { - if (match(raw, /foreign\/cpp\/src\/[^\/]+\.rs/)) { - return substr(raw, RSTART, RLENGTH) - } - return "" - } - if (match(raw, /foreign\/cpp\/(src\/[^\/]+\.cpp|include\/[^\/]+\.hpp?)/)) { - return substr(raw, RSTART, RLENGTH) - } - if (match(raw, /\/proc\/self\/cwd\/(src\/[^\/]+\.cpp|include\/[^\/]+\.hpp?)/)) { - return "foreign/cpp/" substr(raw, RSTART + 15, RLENGTH - 15) - } - if (raw ~ /^(src\/[^\/]+\.cpp|include\/[^\/]+\.hpp?)$/) { - return "foreign/cpp/" raw - } - return "" - } + -ignore-filename-regex='(\.cargo/|/rustc/|/core/|cxxbridge|/registry/)' | + awk ' /^SF:/ { - mapped = map_sf(substr($0, 4)) - if (mapped != "") { - print "SF:" mapped - in_block = 1 - } else { - in_block = 0 - } - next - } - /^end_of_record/ { - if (in_block) { - print + include = /foreign\/cpp\/src\/[^/]+\.rs$/ + if (include) { + sub(/^SF:.*foreign\/cpp\//, "SF:foreign/cpp/") } - in_block = 0 - next } - { - if (in_block) { - print - } - } - ' "$input" >"$output" -} - -filter_lcov "$CPP_RAW" "$CPP_FILTERED" "cpp" -filter_lcov "$SHIM_RAW" "$SHIM_FILTERED" "rs" - -cat "$CPP_FILTERED" "$SHIM_FILTERED" >"$OUTPUT_TMP" + include + ' >>"$OUTPUT" -"$REPO_ROOT/scripts/ci/validate-lcov.sh" "$OUTPUT_TMP" -mv "$OUTPUT_TMP" "$OUTPUT" +../../scripts/ci/validate-lcov.sh "$OUTPUT"
