Branch coverage issue with several awaits (#1201)
Branch coverage issue with several awaits
This commit is contained in:
@@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## Unreleased
|
||||
|
||||
### Fixed
|
||||
-Fix branch coverage issue for il switch [#1177](https://github.com/coverlet-coverage/coverlet/issues/1177)
|
||||
-Fix branch coverage with using statement and several awaits[#1176](https://github.com/coverlet-coverage/coverlet/issues/1176)
|
||||
|
||||
## Release date 2021-07-19
|
||||
### Packages
|
||||
coverlet.msbuild 3.1.0
|
||||
|
||||
@@ -124,8 +124,8 @@ namespace Coverlet.Core.Symbols
|
||||
If method is a generated MoveNext we'll skip first branches (could be a switch or a series of branches)
|
||||
that check state machine value to jump to correct state (for instance after a true async call)
|
||||
Check if it's a Cond_Branch on state machine current value int num = <>1__state;
|
||||
We are on branch OpCode so we need to go back by max 2 operation to reach ldloc.0 the load of "num"
|
||||
Max 2 because we handle following patterns
|
||||
We are on branch OpCode so we need to go back by max 3 operation to reach ldloc.0 the load of "num"
|
||||
Max 3 because we handle following patterns
|
||||
|
||||
Swich
|
||||
|
||||
@@ -168,7 +168,7 @@ namespace Coverlet.Core.Symbols
|
||||
*/
|
||||
|
||||
Instruction current = instruction.Previous;
|
||||
for (int instructionBefore = 2; instructionBefore > 0 && current.Previous != null; current = current.Previous, instructionBefore--)
|
||||
for (int instructionBefore = 3; instructionBefore > 0 && current.Previous != null; current = current.Previous, instructionBefore--)
|
||||
{
|
||||
if (
|
||||
(current.OpCode == OpCodes.Ldloc && current.Operand is VariableDefinition vo && vo.Index == 0) ||
|
||||
@@ -1446,4 +1446,4 @@ namespace Coverlet.Core.Symbols
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Coverlet.Core.Samples.Tests;
|
||||
@@ -125,5 +126,33 @@ namespace Coverlet.Core.Tests
|
||||
File.Delete(path);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AsyncAwait_Issue_1177()
|
||||
{
|
||||
string path = Path.GetTempFileName();
|
||||
try
|
||||
{
|
||||
FunctionExecutor.Run(async (string[] pathSerialize) =>
|
||||
{
|
||||
CoveragePrepareResult coveragePrepareResult = await TestInstrumentationHelper.Run<Issue_1177>(instance =>
|
||||
{
|
||||
((Task)instance.Test()).ConfigureAwait(false).GetAwaiter().GetResult();
|
||||
return Task.CompletedTask;
|
||||
},
|
||||
persistPrepareResultToFile: pathSerialize[0]);
|
||||
|
||||
return 0;
|
||||
}, new string[] { path });
|
||||
|
||||
var document = TestInstrumentationHelper.GetCoverageResult(path).Document("Instrumentation.AsyncAwait.cs");
|
||||
document.AssertLinesCovered(BuildConfiguration.Debug, (133, 1), (134, 1), (135, 1), (136, 1), (137, 1));
|
||||
Assert.DoesNotContain(document.Branches, x => x.Key.Line == 134);
|
||||
}
|
||||
finally
|
||||
{
|
||||
File.Delete(path);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -125,4 +125,16 @@ namespace Coverlet.Core.Samples.Tests
|
||||
Task Process(string cat);
|
||||
}
|
||||
}
|
||||
|
||||
public class Issue_1177
|
||||
{
|
||||
async public Task Test()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
using var _ = new System.IO.MemoryStream();
|
||||
await Task.CompletedTask;
|
||||
await Task.CompletedTask;
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user