Skip to content

instrument-coverage doesn't quite work #3452

Closed
@jtracey

Description

@jtracey

One of the things left to future work in #3396 was code coverage for Android. As described in #3396 (comment), there were some issues preventing that at the time. One of the main points is that Rust on Android is installed via a package manager rather than rustup, so does not have access to nightly. However, as mentioned in that comment, stable rust does now support -C instrument-coverage, which is apparently supposed to be more accurate anyway.

I was able to get this working on Android with approximately the following:

echo "building objects"
objects=$(RUSTFLAGS="-C instrument-coverage" \
            cargo test --no-run --features "$features" --message-format=json \
                | jq -r "select(.profile.test == true) | .filenames[]" \
                | grep -v dSYM -)

echo "running tests"
RUSTFLAGS="-C instrument-coverage" \
         LLVM_PROFILE_FILE="$this_repo/profiles/profile-%m.profraw" \
         cargo test --features "$features" >tests.log

echo "merging profiles"
llvm-profdata merge \
              -sparse \
              "$this_repo/profiles/"*.profraw \
              -o "$this_repo/profiles/combined.profdata"

echo "exporting lcov"
llvm-cov export \
         --ignore-filename-regex='/.cargo/registry' \
         --format=lcov \
         --instr-profile="$this_repo/profiles/combined.profdata" \
         $(for file in $objects; do echo "-object $file"; done) \
         >"$this_repo/profiles/lcov.info"

However, once uploading to codecov, this had the problem of not ignoring #[cfg()]] statements or blank lines. I couldn't see any way of fixing this in the docs for any of the respective llvm tools, so I tried combining it with grcov. I ran basically the commands used currently, just with an extra -b target/debug/ arg, which according to the grcov docs should work. Instead, it just generates an essentially empty lcov.info file (it contains a single line, TN:). I've since confirmed that this isn't unique to Android, I see the same effect on Linux (to reproduce, run the first two or three blocks of the above shell code, with $features and $this_repo replaced or set as needed, then run grcov). I'm not sure whether this is a bug in how I'm trying to generate the coverage file, or a bug in grcov, but any ideas would be appreciated.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions