-
-
Notifications
You must be signed in to change notification settings - Fork 437
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
[internal] Generator-expression exit arcs aren't always filtered out of executed_branch_arcs #1852
Comments
Are you sure you are running the code from the tip of master when measuring coverage? There should no longer be a (4, -4) arc in the data, as of commit 2afe04d:
|
Yes, I'm sure. I added three tests to the testsuite specifically for this; all of the test failures on the most recent push for #1851 are because in two out of three cases the equivalent of the (4, -4) arc is visible to the lcov reporter. |
Fine-tuned the tests a little more in commit 402bee8. Given this function def foo(a):
if any(x > 0 for x in a):
print(f"{a!r} has positives") the genexpr exit arc is pruned by the analysis engine if and only if the arc exiting the whole function is never taken. For example, if |
* refactor: don't need this aux variable anymore * feature: add arc_description method for #1850 * [lcov] Refactor LcovReporter.lcov_file 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. * [lcov] Improve reporting of branch destinations. 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. * Implement function coverage reporting in lcov reports. Quite straightforward: a function has been executed if any of its region’s lines have been executed. * [lcov] Ignore vacuous function regions. Should fix the test failures with pypy pretending to be python 3.8. * Adjust test expectations for lcov reports generated under PyPy 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. * Split up test_multiple_exit_branches into 3 tests exercising #1852. * add a fourth case to the tests for #1852 * Revise lcovreport.lcov_arcs using the new arc_description API. Doesn’t quite work yet, see discussion in #1850. * fix: forgot to add arc_descriptions to Python filereporter * refactor: make arc possibilities and arcs executed available * fix: executed_branch_arcs should limit itself to parsed possible arcs * Use tests.helpers.xfail_pypy38 for lcov tests that fail with pypy 3.8. This replaces the custom fn_coverage_missing_in_pypy_38 logic that was used in earlier commits. * tests: split xfail_pypy38 decorator into _older_ and _all_ variants 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). --------- Co-authored-by: Ned Batchelder <ned@nedbatchelder.com>
Is this issue done now also? |
Thanks for your patience; have only just now had a chance to test the new code against the full application that prompted this report. It generally looks good. There are no longer any cases where the LCOV report includes three or more branch destinations for a single line. There are also no longer any cases where negative arc destination numbers appear in the LCOV output. I do see a few places where the generic "jump to the function exit" text appears in the LCOV output. I will file follow-up bugs for these later today. I think you can go ahead and mark this issue as resolved in 7.6.2. |
This is now fixed as part of coverage 7.6.2. |
Consider this code snippet:
(Any use of a generator expression in the controlling condition of an
if
should provoke the problem, albeit I have not tried it with a multi-line controlling condition.)If I run this snippet as
coverage run --branch test.py
orcoverage run --branch test.py nonoption
it produces this arc table:If I run it as
coverage run -branch test.py -flag
I get this arc table instead:The problem is with the arc
(4, -4)
, which is (as far as I can tell) the exit arc for the generator expression. The analysis code is supposed to be filtering this arc out as uninteresting, but either it only does this formissing_branch_arcs()
and not forexecuted_branch_arcs()
, or there's a bug in its handling of this construct. When the input is the first of the above two arc tables,executed_branch_arcs()[4]
is{-4, -3, 4}
.The HTML report generator doesn't care about this because it only looks at missing arcs, but the LCOV report generator looks at both missing and executed arcs and trips over the
(4, -4)
edge. With the code in #1851, the difference incoverage lcov
output for the above two arc tables isThe BRDA: lines we should be generating are
but I do not see any way to make that happen from inside lcovreport.py.
The text was updated successfully, but these errors were encountered: