Skip to content

The coverage gate measures a Podman-less subset, so the 90% standard is checked nowhere #1326

Description

@Jaro-c

Measured 2026-08-03, and the gap is not where it looks.

what lines covered
cargo llvm-cov --lib --bins — what the CI job can see 79.39%
cargo llvm-cov --all-features — the full suite 91.52%

podup already clears the org standard's 90%. It just clears it in a place nothing checks.

Why the job sees less

The rust-ci coverage job runs on a plain runner with no Podman. Every integration test begins with if podman().await.is_none() { return; }, so they all skip, and with them the coverage of dispatch.rs, dispatch/rest.rs, autostart_cmd.rs and the command entry points — all of which read 0.00% under --lib --bins and are exercised heavily by the suite that cannot run there.

The gate was set to 75 against that 79. #1400-style slack: four points could be lost silently. That part is fixed in the accompanying commit by ratcheting to 79, which locks in what holds.

What is actually missing

Nowhere enforces 90. The lane that can run the integration tests — podman-lane.yml, the nested-virt Fedora matrix — runs them for pass/fail and measures no coverage at all. So the org standard's number is satisfied by the code and checked by nothing.

Options, roughly in order of cost:

  • Measure coverage in the podman-vm lane and gate at 90 there. Correct, and it is the only place the number means what the standard means. Cost: cargo llvm-cov inside the VM matrix, and a decision about which leg owns the gate when the two majors disagree.
  • Keep two gates, named for what they measure. The current job stays a subset floor; a second one carries the real number. Honest, and it doubles the surface to maintain.
  • Exclude the untestable-without-Podman files explicitly and gate the remainder at 90. The testing standard allows this — "if a file is genuinely untestable (thin glue), exclude it explicitly and justify the exclusion" — but dispatch.rs is not untestable, it is untestable here, which is a different claim and a worse reason to exclude something.

I would not do the third.

No VM needed to decide; the lane work needs one to verify.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions