-
-
Notifications
You must be signed in to change notification settings - Fork 435
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Lcov report improvements part 2 #1851
Lcov report improvements part 2 #1851
Conversation
Split the bulk of the code in LcovReporter.lcov_file out into two free helper functions, lcov_lines and lcov_arcs. This is easier to read and will make it easier to do future planned changes in a type-safe manner. No functional changes in this commit.
The branch field of a BRDA: record can be an arbitrary textual label. Therefore, instead of emitting meaningless numbers, emit the string “to line <N>” for ordinary branches (where <N> is the arc destination line, and “to exit” for branches that exit the function. When there is more than one exit arc from a single line, provide the negated arc destination as a disambiguator. Thanks to Henry Cox (@henry2cox), one of the LCOV maintainers, for clarifying the semantics of BRDA: records for us.
Quite straightforward: a function has been executed if any of its region’s lines have been executed.
Should fix the test failures with pypy pretending to be python 3.8.
There is a bug somewhere, in which if we collect data in --branch mode under PyPy 3.8, regions for top-level functions come out of the analysis engine with empty lines arrays. The previous commit prevented this from crashing the lcov reporter; this commit adjusts the tests of the lcov reporter so that we expect the function records affected by the bug to be missing. I don’t think it’s worth trying to pin down the cause of the bug, since Python 3.8 is approaching end-of-life for both CPython and PyPy.
Doesn’t quite work yet, see discussion in nedbat#1850.
402bee8
to
d767721
Compare
I think this is ready to be reviewed now. Let me know if you want me to clean up the commit history or anything. |
BTW, I'm about to drop Python 3.8, so you can simplify the tests by just skipping them on pypy3.8. |
Testing whether the existing |
This replaces the custom fn_coverage_missing_in_pypy_38 logic that was used in earlier commits.
The lcov output tests that are affected by bugs in PyPy 3.8, fail with the current version of PyPy 3.8 (7.3.11), unlike the other tests annotated with @xfail_pypy38. Split this decorator into two variants, xfail_older_pypy38 (used for all the tests that were labeled xfail_py38 prior to this patchset) and xfail_all_pypy38 (used for the lcov output tests).
568b54c
to
e6a79ae
Compare
Looks good, thanks so much! I'll merge it. |
This is now released as part of coverage 7.6.2. |
# this probably means 'line' was never executed at all. | ||
# Cross-check with the line stats. | ||
assert len(executed_arcs[line]) == 0 | ||
assert line in analysis.missing |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Our coverage workflow is now failing due to this line, when running with version 7.6.3
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you provide us with a way to reproduce it? Failing that, can you add this line before the assert, and show us the output?
print(f"{line=}, {analysis.missing=}")
(this should have been on the assert line, my bad)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm seeing this same error too, but only in CI so far. I haven't been able to reproduce it locally so I can't put the print()
line in either...
Because of the refactor in the first commit, functional changes will be easier to see if you go commit by commit.