eng/Coverage.targets (76 lines of code) (raw):
<Project>
<PropertyGroup>
<CoverageFormat Condition="'$(CoverageFormat)' == ''">cobertura</CoverageFormat>
<CoverageOutputPath Condition="'$(CoverageOutputPath)' == ''">coverage.cobertura.xml</CoverageOutputPath>
</PropertyGroup>
<PropertyGroup>
<CoverletId />
</PropertyGroup>
<Target Name="BeforeCollectCodeCoverage" BeforeTargets="RunTests">
<BeforeCollectCodeCoverageTask TestAssembly="%(TestToRun.Identity)" PipeName="%(TestToRun.Filename)">
<Output TaskParameter="CoverletId" PropertyName="CoverletId" />
</BeforeCollectCodeCoverageTask>
</Target>
<Target Name="AfterCollectCodeCoverage" AfterTargets="RunTests">
<AfterCollectCodeCoverageTask PipeName="%(TestToRun.Filename)" CoverletId="$(CoverletId)" />
<!-- <Exec Command="$(DotNetTool) tool run codecov -f '$(CoverageOutputPath)'" /> -->
</Target>
<UsingTask
TaskName="BeforeCollectCodeCoverageTask"
TaskFactory="RoslynCodeTaskFactory"
AssemblyName="Microsoft.Build.Tasks.Core">
<ParameterGroup>
<TestAssembly ParameterType="System.String" Required="true" />
<PipeName ParameterType="System.String" Required="true" />
<CoverletId ParameterType="System.Int32" Output="true" />
</ParameterGroup>
<Task>
<Using Namespace="System.Diagnostics" />
<Using Namespace="System.IO.Pipes" />
<Code>
Log.LogMessage(MessageImportance.High, $"Collecting code coverage for {PipeName} .");
using var coverlet = Process.Start(
@"$(DotNetTool)",
$@"tool run coverlet ""{TestAssembly}"" " +
@"--format $(CoverageFormat) " +
@"--output ""$(CoverageOutputPath)"" " +
@"--target ""$(DotNetTool)"" " +
@"--targetargs ""tool run pwsh " +
$"$server = [System.IO.Pipes.NamedPipeServerStream]::new('{PipeName}');" +
"$server.WaitForConnection();" +
"$server.ReadByte();" +
"$server.Disconnect();" +
"$server.WaitForConnection();" +
"$server.Disconnect();" +
@"""");
CoverletId = coverlet.Id;
Log.LogMessage(MessageImportance.High, $"Collecting code coverage for {PipeName} ..");
using var client = new NamedPipeClientStream(PipeName);
client.Connect();
client.WriteByte(0);
Log.LogMessage(MessageImportance.High, $"Collecting code coverage for {PipeName} ...");
</Code>
</Task>
</UsingTask>
<UsingTask
TaskName="AfterCollectCodeCoverageTask"
TaskFactory="RoslynCodeTaskFactory"
AssemblyName="Microsoft.Build.Tasks.Core">
<ParameterGroup>
<PipeName ParameterType="System.String" Required="true" />
<CoverletId ParameterType="System.Int32" Required="true" />
</ParameterGroup>
<Task>
<Using Namespace="System.Diagnostics" />
<Using Namespace="System.IO.Pipes" />
<Code>
Log.LogMessage(MessageImportance.High, $"Collecting code coverage for {PipeName} ....");
using var client = new NamedPipeClientStream(PipeName);
client.Connect();
Log.LogMessage(MessageImportance.High, $"Collecting code coverage for {PipeName} .....");
using var coverlet = Process.GetProcessById(CoverletId);
coverlet.WaitForExit();
Log.LogMessage(MessageImportance.High, $"Collecting code coverage for {PipeName} ......");
</Code>
</Task>
</UsingTask>
</Project>