pw_unit_test: Add code coverage awareness

This changes `test_runner.py` to be aware of the intention to run a code
coverage test (any test that is executed with the automatic runner when
`pw_toolchain_SANITIZERS` contains `"coverage"`). This is accomplished
by adding an extra `argparse` arg called `--run-for-coverage`.

When that flag is set, the test runner will set the `LLVM_PROFILE_FILE`
environment variable to generate a `profraw` file next to the test
binary.

The `pw_test` template is also updated to check for `"coverage"` in
`pw_toolchain_SANITIZERS`, and sets `--run-for-coverage` and includes
the `profraw` file in outputs when in coverage mode.

The `profraw` file path for the test is then propagated through
`metadata.profraws` similar to `tests`. This allows a `generated_file`
to be used downstream to collect all `profraw` paths.

Further work is required to use these `profraw` files to actually
generate coverage reports with `llvm-cov` or some other tool, but this
is a first step.

Tested: `pw presubmit`.
Tested: Downstream project continues to build in coverage mode and succesfully outputs `profraw` files.
Change-Id: I098ecceae5cba27e8f7e5a129d71f358f301340a
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/116317
Reviewed-by: Alexei Frolov <frolv@google.com>
Commit-Queue: Greg Pataky <gregpataky@google.com>
Reviewed-by: Ted Pudlik <tpudlik@google.com>
2 files changed
tree: 8cdbaea2826d0b114036141b5c72eac89e1d1663
  1. .allstar/
  2. .vscode/
  3. build_overrides/
  4. docker/
  5. docs/
  6. pw_allocator/
  7. pw_analog/
  8. pw_android_toolchain/
  9. pw_arduino_build/
  10. pw_assert/
  11. pw_assert_basic/
  12. pw_assert_log/
  13. pw_assert_tokenized/
  14. pw_assert_zephyr/
  15. pw_base64/
  16. pw_bloat/
  17. pw_blob_store/
  18. pw_bluetooth/
  19. pw_bluetooth_hci/
  20. pw_boot/
  21. pw_boot_cortex_m/
  22. pw_build/
  23. pw_build_info/
  24. pw_build_mcuxpresso/
  25. pw_bytes/
  26. pw_checksum/
  27. pw_chrono/
  28. pw_chrono_embos/
  29. pw_chrono_freertos/
  30. pw_chrono_stl/
  31. pw_chrono_threadx/
  32. pw_chrono_zephyr/
  33. pw_cli/
  34. pw_compilation_testing/
  35. pw_console/
  36. pw_containers/
  37. pw_cpu_exception/
  38. pw_cpu_exception_cortex_m/
  39. pw_crypto/
  40. pw_digital_io/
  41. pw_docgen/
  42. pw_doctor/
  43. pw_env_setup/
  44. pw_file/
  45. pw_function/
  46. pw_fuzzer/
  47. pw_hdlc/
  48. pw_hex_dump/
  49. pw_i2c/
  50. pw_i2c_mcuxpresso/
  51. pw_ide/
  52. pw_interrupt/
  53. pw_interrupt_cortex_m/
  54. pw_interrupt_zephyr/
  55. pw_intrusive_ptr/
  56. pw_kvs/
  57. pw_libc/
  58. pw_log/
  59. pw_log_android/
  60. pw_log_basic/
  61. pw_log_null/
  62. pw_log_rpc/
  63. pw_log_string/
  64. pw_log_tokenized/
  65. pw_log_zephyr/
  66. pw_malloc/
  67. pw_malloc_freelist/
  68. pw_metric/
  69. pw_minimal_cpp_stdlib/
  70. pw_module/
  71. pw_multisink/
  72. pw_package/
  73. pw_perf_test/
  74. pw_persistent_ram/
  75. pw_polyfill/
  76. pw_preprocessor/
  77. pw_presubmit/
  78. pw_protobuf/
  79. pw_protobuf_compiler/
  80. pw_random/
  81. pw_result/
  82. pw_ring_buffer/
  83. pw_router/
  84. pw_rpc/
  85. pw_rust/
  86. pw_snapshot/
  87. pw_software_update/
  88. pw_span/
  89. pw_spi/
  90. pw_status/
  91. pw_stm32cube_build/
  92. pw_stream/
  93. pw_string/
  94. pw_symbolizer/
  95. pw_sync/
  96. pw_sync_baremetal/
  97. pw_sync_embos/
  98. pw_sync_freertos/
  99. pw_sync_stl/
  100. pw_sync_threadx/
  101. pw_sync_zephyr/
  102. pw_sys_io/
  103. pw_sys_io_arduino/
  104. pw_sys_io_baremetal_lm3s6965evb/
  105. pw_sys_io_baremetal_stm32f429/
  106. pw_sys_io_emcraft_sf2/
  107. pw_sys_io_mcuxpresso/
  108. pw_sys_io_stdio/
  109. pw_sys_io_stm32cube/
  110. pw_sys_io_zephyr/
  111. pw_system/
  112. pw_target_runner/
  113. pw_thread/
  114. pw_thread_embos/
  115. pw_thread_freertos/
  116. pw_thread_stl/
  117. pw_thread_threadx/
  118. pw_tls_client/
  119. pw_tls_client_boringssl/
  120. pw_tls_client_mbedtls/
  121. pw_tokenizer/
  122. pw_tool/
  123. pw_toolchain/
  124. pw_trace/
  125. pw_trace_tokenized/
  126. pw_transfer/
  127. pw_unit_test/
  128. pw_varint/
  129. pw_watch/
  130. pw_web/
  131. pw_work_queue/
  132. targets/
  133. third_party/
  134. ts/
  135. zephyr/
  136. .bazelignore
  137. .bazelrc
  138. .clang-format
  139. .clang-tidy
  140. .eslintrc.json
  141. .gitattributes
  142. .gitignore
  143. .gn
  144. .mypy.ini
  145. .prettierrc.js
  146. .pw_ide.yaml
  147. .pylintrc
  148. activate.bat
  149. Android.bp
  150. AUTHORS
  151. bootstrap.bat
  152. bootstrap.sh
  153. BUILD.bazel
  154. BUILD.gn
  155. BUILDCONFIG.gn
  156. CMakeLists.txt
  157. jest.config.ts
  158. Kconfig.zephyr
  159. LICENSE
  160. modules.gni
  161. OWNERS
  162. package-lock.json
  163. package.json
  164. PIGWEED_MODULES
  165. PW_PLUGINS
  166. README.md
  167. rollup.config.js
  168. tsconfig.json
  169. WORKSPACE
README.md

Pigweed

Pigweed is an open source collection of embedded-targeted libraries–or as we like to call them, modules. These modules are building blocks and infrastructure that enable faster and more reliable development on small-footprint MMU-less 32-bit microcontrollers like the STMicroelectronics STM32L452 or the Nordic nRF52832.

For more information please see our website: https://pigweed.dev/.

Links