aboutsummaryrefslogtreecommitdiff
path: root/docs/code_coverage.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/code_coverage.md')
-rw-r--r--docs/code_coverage.md41
1 files changed, 41 insertions, 0 deletions
diff --git a/docs/code_coverage.md b/docs/code_coverage.md
new file mode 100644
index 00000000..1c181ee8
--- /dev/null
+++ b/docs/code_coverage.md
@@ -0,0 +1,41 @@
+# 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.