42 lines
2.1 KiB
Markdown
42 lines
2.1 KiB
Markdown
# Code Coverage
|
|
|
|
Code coverage can be checked using clang's source-based coverage tools. You
|
|
must use the GN argument `use_coverage=true`. It's recommended to do this in a
|
|
separate output directory since the added instrumentation will affect
|
|
performance and generate an output file every time a binary is run. You can
|
|
read more about this in [clang's documentation](
|
|
http://clang.llvm.org/docs/SourceBasedCodeCoverage.html) but the
|
|
bare minimum steps are also outlined below. You will also need to download the
|
|
pre-built clang coverage tools, which are not downloaded by default. The
|
|
easiest way to do this is to set a custom variable in your `.gclient` file.
|
|
Under the "openscreen" solution, add:
|
|
```python
|
|
"custom_vars": {
|
|
"checkout_clang_coverage_tools": True,
|
|
},
|
|
```
|
|
then run `gclient runhooks`. You can also run the python command from the
|
|
`clang_coverage_tools` hook in `//DEPS` yourself or even download the tools
|
|
manually
|
|
([link](https://storage.googleapis.com/chromium-browser-clang-staging/)).
|
|
|
|
Once you have your GN directory (we'll call it `out/coverage`) and have
|
|
downloaded the tools, do the following to generate an HTML coverage report:
|
|
```bash
|
|
out/coverage/openscreen_unittests
|
|
third_party/llvm-build/Release+Asserts/bin/llvm-profdata merge -sparse default.profraw -o foo.profdata
|
|
third_party/llvm-build/Release+Asserts/bin/llvm-cov show out/coverage/openscreen_unittests -instr-profile=foo.profdata -format=html -output-dir=<out dir> [filter paths]
|
|
```
|
|
There are a few things to note here:
|
|
- `default.profraw` is generated by running the instrumented code, but
|
|
`foo.profdata` can be any path you want.
|
|
- `<out dir>` should be an empty directory for placing the generated HTML
|
|
files. You can view the report at `<out dir>/index.html`.
|
|
- `[filter paths]` is a list of paths to which you want to limit the coverage
|
|
report. For example, you may want to limit it to cast/ or even
|
|
cast/streaming/. If this list is empty, all data will be in the report.
|
|
|
|
The same process can be used to check the coverage of a fuzzer's corpus. Just
|
|
add `-runs=0` to the fuzzer arguments to make sure it only runs the existing
|
|
corpus then exits.
|