Skip to content
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

Incorrect coverage for methods returning IAsyncEnumerable in generic classes #1383

Closed
arseni-mourzenko opened this issue Sep 17, 2022 · 4 comments · Fixed by #1430
Closed
Labels
bug Something isn't working tenet-coverage Issue related to possible incorrect coverage with repro Issue with repro

Comments

@arseni-mourzenko
Copy link

Hi.

Using coverlet.msbuild.3.1.2, I noticed an issue with code coverage for a method which returns IAsyncEnumerable, as soon as the method is inside a generic class.

Here's a short example which reproduces the issue:

public class A
{
    public static async IAsyncEnumerable<int> Demo()
    {
        yield return 5;
        yield return 2;
    }
}

public class A<T>
{
    public static async IAsyncEnumerable<int> Demo()
    {
        yield return 5;
        yield return 2;
    }
}

Given the following tests:

[Fact] public async Task Test1() => Assert.Equal(new [] { 5, 2 }, await A.Demo().ToListAsync());
[Fact] public async Task Test2() => Assert.Equal(new [] { 5, 2 }, await A<string>.Demo().ToListAsync());

the coverage report will show that the Demo method inside the class A has 100% branch coverage, whereas the method Demo inside A<T> has only partial coverage (one branch out of two) on the line {, as well as on the following two yield return lines.

The code of the two methods and the corresponding tests being identical, the coverage should instead be identical, that is, 100% in both cases.

@daveMueller
Copy link
Collaborator

Thanks for reporting this.

@daveMueller daveMueller added untriaged To be investigated with repro Issue with repro labels Sep 17, 2022
@RobARichardson
Copy link

Seeing similar behavior where a Generic Class has a method that returns an IAsyncEnumerable, the method is marked with ExcludeFromCodeCoverage however coverage is reported as zero instead of being ignored.

@daveMueller
Copy link
Collaborator

daveMueller commented Jan 8, 2023

@RobARichardson I created another issue for that (#1431). I think it is another bug and my PR will not fix this.

@daveMueller daveMueller added bug Something isn't working tenet-coverage Issue related to possible incorrect coverage and removed untriaged To be investigated labels Jan 8, 2023
@arseni-mourzenko
Copy link
Author

@MarcoRossignoli, do you know when the new version of Coverlet would be available through NuGet?

renovate bot added a commit to cythral/brighid-commands that referenced this issue May 21, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [coverlet.collector](https://togithub.com/coverlet-coverage/coverlet)
| nuget | major | `3.2.0` -> `6.0.0` |

---

### Release Notes

<details>
<summary>coverlet-coverage/coverlet</summary>

###
[`v6.0.0`](https://togithub.com/coverlet-coverage/coverlet/releases/tag/v6.0.0)

Fixed
\-Could not write lines to file CoverletSourceRootsMapping - in use by
another
process[coverlet-coverage/coverlet#1155
-Incorrect coverage for methods returning IAsyncEnumerable in generic
classes[coverlet-coverage/coverlet#1383
-Wrong branch coverage for async methods .NET Standard
1.x[coverlet-coverage/coverlet#1376
-Empty path exception in visual basic
projects[coverlet-coverage/coverlet#775
-Allign published nuget package version to github release
version[coverlet-coverage/coverlet#1413
\-Sync nuget and github release
version[coverlet-coverage/coverlet#1122

Improvements
\-Migration of the project to .NET
6.0[coverlet-coverage/coverlet#1473

Breaking changes
New parameter ExcludeAssembliesWithoutSources to control automatic
assembly exclusion
[coverlet-coverage/coverlet#1164.
The parameter InstrumentModulesWithoutLocalSources has been removed.
since it can be handled by setting ExcludeAssembliesWithoutSources to
None.
The default heuristics for determining whether to instrument an assembly
has been changed. In previous versions any missing source file was taken
as a signal that it was a third-party project that shouldn't be
instrumented, with exceptions for some common file name patterns for
source generators. Now only assemblies where no source files at all can
be found are excluded from instrumentation, and the code for detecting
source generator files have been removed. To get back to the behaviour
that at least one missing file is sufficient to exclude an assembly, set
ExcludeAssembliesWithoutSources to MissingAny, or use assembly exclusion
filters for more fine-grained control.

[Diff between 3.2.0 and
6.0.0](https://togithub.com/coverlet-coverage/coverlet/compare/v5.7.2...v6.0.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://app.renovatebot.com/dashboard#github/cythral/brighid-commands).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS45Ny4wIiwidXBkYXRlZEluVmVyIjoiMzUuOTcuMCIsInRhcmdldEJyYW5jaCI6Im1hc3RlciJ9-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
vbreuss pushed a commit to Testably/Testably.Abstractions that referenced this issue May 21, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [coverlet.collector](https://togithub.com/coverlet-coverage/coverlet)
| nuget | major | `3.2.0` -> `6.0.0` |

---

### Release Notes

<details>
<summary>coverlet-coverage/coverlet</summary>

###
[`v6.0.0`](https://togithub.com/coverlet-coverage/coverlet/releases/tag/v6.0.0)

Fixed
\-Could not write lines to file CoverletSourceRootsMapping - in use by
another
process[coverlet-coverage/coverlet#1155
\-Incorrect coverage for methods returning IAsyncEnumerable in generic
classes[coverlet-coverage/coverlet#1383
\-Wrong branch coverage for async methods .NET Standard
1.x[coverlet-coverage/coverlet#1376
\-Empty path exception in visual basic
projects[coverlet-coverage/coverlet#775
\-Align published nuget package version to github release
version[coverlet-coverage/coverlet#1413
\-Sync nuget and github release
versions[coverlet-coverage/coverlet#1122

Improvements
\-Migration of the project to .NET
6.0[coverlet-coverage/coverlet#1473

Breaking changes
New parameter ExcludeAssembliesWithoutSources to control automatic
assembly exclusion
[coverlet-coverage/coverlet#1164.
The parameter InstrumentModulesWithoutLocalSources has been removed.
since it can be handled by setting ExcludeAssembliesWithoutSources to
None.
The default heuristics for determining whether to instrument an assembly
has been changed. In previous versions any missing source file was taken
as a signal that it was a third-party project that shouldn't be
instrumented, with exceptions for some common file name patterns for
source generators. Now only assemblies where no source files at all can
be found are excluded from instrumentation, and the code for detecting
source generator files have been removed. To get back to the behaviour
that at least one missing file is sufficient to exclude an assembly, set
ExcludeAssembliesWithoutSources to MissingAny, or use assembly exclusion
filters for more fine-grained control.

[Diff between 3.2.0 and
6.0.0](https://togithub.com/coverlet-coverage/coverlet/compare/v5.7.2...v6.0.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://app.renovatebot.com/dashboard#github/Testably/Testably.Abstractions).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS45Ny4wIiwidXBkYXRlZEluVmVyIjoiMzUuOTcuMCIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
ThorstenSauter pushed a commit to ThorstenSauter/NoPlan that referenced this issue May 22, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [coverlet.collector](https://togithub.com/coverlet-coverage/coverlet)
| nuget | major | `3.2.0` -> `6.0.0` |

---

### Release Notes

<details>
<summary>coverlet-coverage/coverlet</summary>

###
[`v6.0.0`](https://togithub.com/coverlet-coverage/coverlet/releases/tag/v6.0.0)

Fixed
\-Could not write lines to file CoverletSourceRootsMapping - in use by
another
process[coverlet-coverage/coverlet#1155
\-Incorrect coverage for methods returning IAsyncEnumerable in generic
classes[coverlet-coverage/coverlet#1383
\-Wrong branch coverage for async methods .NET Standard
1.x[coverlet-coverage/coverlet#1376
\-Empty path exception in visual basic
projects[coverlet-coverage/coverlet#775
\-Align published nuget package version to github release
version[coverlet-coverage/coverlet#1413
\-Sync nuget and github release
versions[coverlet-coverage/coverlet#1122

Improvements
\-Migration of the project to .NET
6.0[coverlet-coverage/coverlet#1473

Breaking changes
New parameter ExcludeAssembliesWithoutSources to control automatic
assembly exclusion
[coverlet-coverage/coverlet#1164.
The parameter InstrumentModulesWithoutLocalSources has been removed.
since it can be handled by setting ExcludeAssembliesWithoutSources to
None.
The default heuristics for determining whether to instrument an assembly
has been changed. In previous versions any missing source file was taken
as a signal that it was a third-party project that shouldn't be
instrumented, with exceptions for some common file name patterns for
source generators. Now only assemblies where no source files at all can
be found are excluded from instrumentation, and the code for detecting
source generator files have been removed. To get back to the behaviour
that at least one missing file is sufficient to exclude an assembly, set
ExcludeAssembliesWithoutSources to MissingAny, or use assembly exclusion
filters for more fine-grained control.

[Diff between 3.2.0 and
6.0.0](https://togithub.com/coverlet-coverage/coverlet/compare/v5.7.2...v6.0.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "before 2am" (UTC), Automerge - At any
time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://app.renovatebot.com/dashboard#github/ThorstenSauter/NoPlan).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS45Ny4wIiwidXBkYXRlZEluVmVyIjoiMzUuOTcuMCIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
vbreuss added a commit to Testably/Testably.Architecture.Rules that referenced this issue May 22, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [coverlet.collector](https://togithub.com/coverlet-coverage/coverlet)
| nuget | major | `3.2.0` -> `6.0.0` |

---

### Release Notes

<details>
<summary>coverlet-coverage/coverlet</summary>

###
[`v6.0.0`](https://togithub.com/coverlet-coverage/coverlet/releases/tag/v6.0.0)

Fixed
\-Could not write lines to file CoverletSourceRootsMapping - in use by
another
process[coverlet-coverage/coverlet#1155
\-Incorrect coverage for methods returning IAsyncEnumerable in generic
classes[coverlet-coverage/coverlet#1383
\-Wrong branch coverage for async methods .NET Standard
1.x[coverlet-coverage/coverlet#1376
\-Empty path exception in visual basic
projects[coverlet-coverage/coverlet#775
\-Align published nuget package version to github release
version[coverlet-coverage/coverlet#1413
\-Sync nuget and github release
versions[coverlet-coverage/coverlet#1122

Improvements
\-Migration of the project to .NET
6.0[coverlet-coverage/coverlet#1473

Breaking changes
New parameter ExcludeAssembliesWithoutSources to control automatic
assembly exclusion
[coverlet-coverage/coverlet#1164.
The parameter InstrumentModulesWithoutLocalSources has been removed.
since it can be handled by setting ExcludeAssembliesWithoutSources to
None.
The default heuristics for determining whether to instrument an assembly
has been changed. In previous versions any missing source file was taken
as a signal that it was a third-party project that shouldn't be
instrumented, with exceptions for some common file name patterns for
source generators. Now only assemblies where no source files at all can
be found are excluded from instrumentation, and the code for detecting
source generator files have been removed. To get back to the behaviour
that at least one missing file is sufficient to exclude an assembly, set
ExcludeAssembliesWithoutSources to MissingAny, or use assembly exclusion
filters for more fine-grained control.

[Diff between 3.2.0 and
6.0.0](https://togithub.com/coverlet-coverage/coverlet/compare/v5.7.2...v6.0.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://app.renovatebot.com/dashboard#github/Testably/Testably.Architecture.Rules).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS45OC4wIiwidXBkYXRlZEluVmVyIjoiMzUuOTguMCIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Valentin Breuß <vbreuss@gmail.com>
bruxisma pushed a commit to bruxisma/atmosphere that referenced this issue May 22, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [coverlet.collector](https://togithub.com/coverlet-coverage/coverlet)
| nuget | major | `3.2.0` -> `6.0.0` |
| [coverlet.msbuild](https://togithub.com/coverlet-coverage/coverlet) |
nuget | major | `3.2.0` -> `6.0.0` |

---

### Release Notes

<details>
<summary>coverlet-coverage/coverlet</summary>

###
[`v6.0.0`](https://togithub.com/coverlet-coverage/coverlet/releases/tag/v6.0.0)

Fixed
\-Could not write lines to file CoverletSourceRootsMapping - in use by
another
process[coverlet-coverage/coverlet#1155
\-Incorrect coverage for methods returning IAsyncEnumerable in generic
classes[coverlet-coverage/coverlet#1383
\-Wrong branch coverage for async methods .NET Standard
1.x[coverlet-coverage/coverlet#1376
\-Empty path exception in visual basic
projects[coverlet-coverage/coverlet#775
\-Align published nuget package version to github release
version[coverlet-coverage/coverlet#1413
\-Sync nuget and github release
versions[coverlet-coverage/coverlet#1122

Improvements
\-Migration of the project to .NET
6.0[coverlet-coverage/coverlet#1473

Breaking changes
New parameter ExcludeAssembliesWithoutSources to control automatic
assembly exclusion
[coverlet-coverage/coverlet#1164.
The parameter InstrumentModulesWithoutLocalSources has been removed.
since it can be handled by setting ExcludeAssembliesWithoutSources to
None.
The default heuristics for determining whether to instrument an assembly
has been changed. In previous versions any missing source file was taken
as a signal that it was a third-party project that shouldn't be
instrumented, with exceptions for some common file name patterns for
source generators. Now only assemblies where no source files at all can
be found are excluded from instrumentation, and the code for detecting
source generator files have been removed. To get back to the behaviour
that at least one missing file is sufficient to exclude an assembly, set
ExcludeAssembliesWithoutSources to MissingAny, or use assembly exclusion
filters for more fine-grained control.

[Diff between 3.2.0 and
6.0.0](https://togithub.com/coverlet-coverage/coverlet/compare/v5.7.2...v6.0.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these
updates again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://app.renovatebot.com/dashboard#github/bruxisma/atmosphere).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNS45Ny4wIiwidXBkYXRlZEluVmVyIjoiMzUuOTcuMCIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Signed-off-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
dariuszkuc pushed a commit to apollographql/federation-hotchocolate that referenced this issue Oct 19, 2023
[![Mend
Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com)

This PR contains the following updates:

| Package | Change | Age | Adoption | Passing | Confidence |
|---|---|---|---|---|---|
| [coverlet.msbuild](https://togithub.com/coverlet-coverage/coverlet) |
`3.2.0` -> `6.0.0` |
[![age](https://developer.mend.io/api/mc/badges/age/nuget/coverlet.msbuild/6.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/coverlet.msbuild/6.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/coverlet.msbuild/3.2.0/6.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|
[![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/coverlet.msbuild/3.2.0/6.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/)
|

---

### Release Notes

<details>
<summary>coverlet-coverage/coverlet (coverlet.msbuild)</summary>

###
[`v6.0.0`](https://togithub.com/coverlet-coverage/coverlet/releases/tag/v6.0.0)

Fixed
\-Could not write lines to file CoverletSourceRootsMapping - in use by
another
process[coverlet-coverage/coverlet#1155
\-Incorrect coverage for methods returning IAsyncEnumerable in generic
classes[coverlet-coverage/coverlet#1383
\-Wrong branch coverage for async methods .NET Standard
1.x[coverlet-coverage/coverlet#1376
\-Empty path exception in visual basic
projects[coverlet-coverage/coverlet#775
\-Align published nuget package version to github release
version[coverlet-coverage/coverlet#1413
\-Sync nuget and github release
versions[coverlet-coverage/coverlet#1122

Improvements
\-Migration of the project to .NET
6.0[coverlet-coverage/coverlet#1473

Breaking changes
New parameter ExcludeAssembliesWithoutSources to control automatic
assembly exclusion
[coverlet-coverage/coverlet#1164.
The parameter InstrumentModulesWithoutLocalSources has been removed.
since it can be handled by setting ExcludeAssembliesWithoutSources to
None.
The default heuristics for determining whether to instrument an assembly
has been changed. In previous versions any missing source file was taken
as a signal that it was a third-party project that shouldn't be
instrumented, with exceptions for some common file name patterns for
source generators. Now only assemblies where no source files at all can
be found are excluded from instrumentation, and the code for detecting
source generator files have been removed. To get back to the behaviour
that at least one missing file is sufficient to exclude an assembly, set
ExcludeAssembliesWithoutSources to MissingAny, or use assembly exclusion
filters for more fine-grained control.

[Diff between 3.2.0 and
6.0.0](https://togithub.com/coverlet-coverage/coverlet/compare/v5.7.2...v6.0.0)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined),
Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you
are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the
rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update
again.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Mend
Renovate](https://www.mend.io/free-developer-tools/renovate/). View
repository job log
[here](https://developer.mend.io/github/apollographql/federation-hotchocolate).

<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4xOS4yIiwidXBkYXRlZEluVmVyIjoiMzcuMTkuMiIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==-->

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working tenet-coverage Issue related to possible incorrect coverage with repro Issue with repro
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants