Skip to content

Migrate coverage tooling to score_coverage and add coverage report generation for QNX - #1240

Draft
LittleHuba wants to merge 10 commits into
mainfrom
combined_coverage
Draft

LittleHuba wants to merge 10 commits into
mainfrom
combined_coverage

Conversation

@LittleHuba

Copy link
Copy Markdown
Contributor

Pulls in the coverage tooling from score_coverage.

The coverage tooling was checked for similarity. There are no more features/fixes/... in our solution that were not copied over to score_coverage.
This migration is a 1:1 match on feature level.

Additionally introduces missing coverage report generation for QNX.

@LittleHuba
LittleHuba force-pushed the combined_coverage branch 2 times, most recently from 3cc732b to d3068bf Compare October 2, 2026 09:41
dcalavrezo-qorix and others added 10 commits October 5, 2026 10:23
The coverage pipeline that lived under quality/coverage (merger,
reporter, reporter_wrapper, coverage_scope aspect, justify.py,
effective_coverage.py, lcov_to_html.py, generate_coverage_html.sh) is
the origin of the qualified S-CORE coverage tool, score_coverage
(https://eclipse-score.github.io/coverage_tool/main/). This switches the
repository to that module and deletes the copy:

- quality/coverage/BUILD keeps only what is repository-specific: the
  coverage scope (unchanged dependable elements) and two report
  generators, LLVM for Linux and, new, gcov for QNX on target.
- coverage.bazelrc: the default coverage command is the LLVM backend as
  before; --config=qnx now keeps Bazel's per-test gcov collector and
  points the final step at score_coverage's gcov reporter instead of
  Bazel's stock LCOV report, so the QNX report has the same layout,
  scope, 0 % baselines, justifications and gate as the Linux one.
- workflows: the Linux coverage report is produced by
  @score_coverage//:generate_coverage_html (same archive name and
  layout, cpp_coverage_linux/); the QNX workflow gains a coverage step
  after the tests and uploads coverage_report_qnx.
- MODULE.bazel: score_coverage dev dependency; rules_rust 0.68.2-score
  as required by it; the death-test coverage feature now comes from the
  module. gcovr leaves requirements.in (pyyaml stays, used elsewhere).
- docs and the visibility-guard golden updated.

Validated locally on //score/message_passing/... (Linux, LLVM): the
scope allowlist is identical (613 files) and all 347 LCOV records are
identical in covered/uncovered status to the previous pipeline (the
only differences are execution counts of logging/timing code). The
QNX run is validated in CI.

VALIDATION ONLY: MODULE.bazel carries a git_override to the
coverage_tool branch of eclipse-score/coverage_tool#10 for the gcov
backend; replace it by the 0.3.0 registry release once published.

Signed-off-by: Dan Calavrezo <195309321+dcalavrezo-qorix@users.noreply.github.com>
The gcov backend for QNX on-target coverage is released. Pin the
release commit until the registry entry (bazel_registry PR #519) is
merged, then drop the override.

Signed-off-by: Dan Calavrezo <195309321+dcalavrezo-qorix@users.noreply.github.com>
The release is in the S-CORE Bazel registry; drop the temporary
git_override that pinned the release commit.

Signed-off-by: Dan Calavrezo <195309321+dcalavrezo-qorix@users.noreply.github.com>
Bazel derives the default --instrumentation_filter from the packages of
the test targets and strips only a trailing /tests to reach the code
under test. Libraries tested from a test/ subpackage fall outside the
guess and the gcov collector drops their counters (0 % for score/os in
baselibs' QNX report). Instrument everything under //score.

Signed-off-by: Dan Calavrezo <195309321+dcalavrezo-qorix@users.noreply.github.com>
0.3.1 requires the explicit --instrumentation_filter this branch already
sets, and warns when a report shows the pattern of a library tested from
a test/ subpackage without data.

Signed-off-by: Dan Calavrezo <195309321+dcalavrezo-qorix@users.noreply.github.com>
Layers the ulhu_coverage_fix workflow structure (determine-qnx gating
job, parallel coverage-linux/coverage-qnx jobs in _coverage_report.yml,
nightly QNX artifact publishing, doc links) on top of PR #1171's
migration to the score_coverage Bazel module, replacing the in-repo
coverage pipeline.

- _coverage_report.yml: coverage-qnx now runs as its own job (gated on
  determine-qnx.outputs.available), invoking
  @score_coverage//:generate_coverage_html --platform qnx instead of
  the deleted local quality/coverage:generate_coverage_html script.
- build_and_test_qnx.yml: reverted PR #1171's inline coverage steps
  now that QNX coverage lives in _coverage_report.yml.
- nightly_quality.yml, generate_quality_links.bzl,
  docs/sphinx/quality_reports.rst, extract_coverage_artifact.sh,
  cache-strategy.md: carried over unchanged from ulhu_coverage_fix,
  updated to reference @score_coverage//:generate_coverage_html.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Local verification of the combined QNX coverage pipeline surfaced two bugs,
both introduced by score_coverage's QNX support and inherited
into this branch's combined workflow:

1. quality/coverage/coverage.bazelrc: 'coverage:qnx_x86_64
   --test_lang_filters=cc' excluded every QNX unit test from
   'bazel coverage --config=qnx'. QNX tests are wrapped by
   cc_unit_test/score_qnx_unit_tests as a Starlark _forwarding_test rule
   (dispatching to an sh_test that runs the binary under QEMU), not a
   native cc_test, so --test_lang_filters (which matches on the rule
   class' language prefix) silently matched zero targets regardless of
   the requested scope. Removed the line; --instrumentation_filter above
   it already restricts what gets instrumented.

2. _coverage_report.yml (coverage-qnx job): the 'Generate coverage
   report (QNX)' step ran 'bazel run --config=ci --config=qnx
   @score_coverage//:generate_coverage_html'. --config=qnx sets the
   *target* platform to QNX for the whole invocation, but this step only
   reads already-produced coverage data with a host-side Python tool; no
   Python toolchain is registered for the QNX platform, so the build
   failed with 'No matching toolchains found for
   @@bazel_tools//tools/python:toolchain_type'. Dropped --config=qnx from
   this step (kept --config=ci) and removed the now-unused QNX secrets
   from its env.

Verified end-to-end locally with only the fixed coverage.bazelrc/workflow
commands (no CLI overrides): 'bazel coverage --config=ci --config=qnx
//score/message_passing/...' now runs all 7 runnable C++ QNX tests (5
skipped targets are non-cc dependability/requirements tests, expected),
and 'bazel run --config=ci @score_coverage//:generate_coverage_html
--platform qnx' produces a valid HTML report, justification report, and
archive matching extract_coverage_artifact.sh's expected layout (100%
line / 82.75% branch coverage for the message_passing scope).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move it to the dev dependency section.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

2 participants