| # Code Coverage Support for PDFium |
| |
| [TOC] |
| |
| This guide explains how to generate code coverage information for the PDFium |
| library on a local computer. |
| |
| ## Prerequisites |
| |
| You will need the PDFium source code on your computer. You can see |
| the [README](/README.md) for instructions on checking out PDFium's source. |
| |
| The tools used for code coverage are known to work on Ubuntu and Debian. They |
| should work correctly on newer versions of Ubuntu, Debian and related Linux |
| distros. They have not been tested on Windows and Mac. |
| |
| Previously, the code coverage scripts required specific versions of `lcov` and |
| `llvm-cov` to be present. This is no longer true, so if you have no other need |
| for them they can be removed. All of the required tools will be pulled into the |
| Clang build tools directory by the script. |
| |
| ## Generating Code Coverage |
| |
| ### Setup |
| |
| This step assumes that you have already checked out the PDFium source code. If |
| you have not, please consult the Prerequisites section above. |
| |
| Before generating code coverage information, you will need to have a build |
| directory with coverage enabled. This can be done by running the `gn args` |
| command and adding `use_clang_coverage = true` in the editor that is opened. |
| |
| If not using the default directory, `out/Coverage`, then replace it with the |
| correct location in the following command. |
| |
| ```shell |
| gn args out/Coverage |
| ``` |
| |
| If you already have a build directory, you can append the coverage flag to the |
| existing `args.gn` as follows. If not using the default directory, |
| `out/Coverage`, then replace it with the correct location in the following |
| command. |
| |
| ```shell |
| echo "use_clang_coverage = true" >> out/Coverage/args.gn |
| ``` |
| |
| Previous versions of code coverage used **use_coverage = true** in args.gn; this |
| needs to be changed to **use_clang_coverage = true** |
| |
| ### Usage |
| |
| Generating code coverage information is done via the |
| `testing/tools/coverage/coverage_report.py` script. This script will download |
| the Clang coverage tools if needed, build any binaries that it needs, perform |
| test runs, collect coverage data, and generate a HTML coverage report. It is |
| based on the Chromium coverage scripts, so will generate the same style of |
| report. |
| |
| Running the script with no arguments, as below, it will assume that you are |
| currently at the root of your PDFium checkout, the build directory to use is |
| `./out/Coverage/` and that HTML should be outputted to `./coverage_report/`. |
| |
| ```shell |
| testing/tools/coverage/coverage_report.py |
| ``` |
| |
| If the current working directory is not the root of your PDFium checkout, then |
| you will need to pass in `--source-directory` with the appropriate directory. If |
| you are using a different build directory, then `--build-directory` will need to |
| be passed in. Finally, if you want the HTML report in a different location then |
| you will need to pass in `--output-directory`. |
| |
| An example of all these flags being used: |
| |
| ```shell |
| testing/tools/coverage/coverage_report.py \ |
| --source-directory ~/pdfium/pdfium \ |
| --build-directory ~/pdfium/pdfium/out/Debug_with_Coverage \ |
| --output-directory ~/Documents/PDFium_coverage |
| ``` |
| |
| To run different tests than the default set, including running just a single |
| test, you can specify the test names on the command line. The list of supported |
| tests can be found by running the script with `--help`. |
| |
| For example, running all of the tests that don't use pdfium_test: |
| |
| ```shell |
| testing/tools/coverage/coverage_report.py pdfium_unittests pdfium_embeddertests |
| ``` |
| |
| NOTE: At the present time, there is no mechanism for combining data from |
| different invocations of `coverage_report.py`. Instead, you must specify all of |
| the tests to be included in the report in a single invocation. Alternatively, |
| you can collect the profiling data that is generated from each run and manually |
| invoke `tools/code_coverage/coverage.py` to generate a combined report. |
| |
| There are additional developer debugging flags available, `--dry-run` and |
| `--verbose`. `--dry-run` will output a trace of commands that would have been |
| run, but doesn't actually execute them. `--verbose` turns on outputting |
| additional logging information. |
| |
| ### Viewing |
| |
| Once the script has run, the output directory should contain a set of HTML files |
| containing the coverage report. |
| |
| These files are static HTML, so you can point your browser at them directly on |
| your local file system and they should render fine. You can also serve them via a |
| web server if you want, but how to achieve that is beyond the scope of this |
| documentation. |
| |
| ## Issues |
| |
| For help with using the code coverage tools please contact the PDFium |
| maintainers via the PDFium |
| mailing [list](https://groups.google.com/forum/#!forum/pdfium). |
| |
| Please file bugs against the code coverage |
| support [here](https://bugs.chromium.org/p/pdfium/issues/list). |