1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
5 Code coverage package versions go here and in the test-runtime-packages.config
8 <OpenCoverVersion>4.6.519</OpenCoverVersion>
9 <ReportGeneratorVersion>3.0.1</ReportGeneratorVersion>
10 <CoverallsUploaderVersion>1.4</CoverallsUploaderVersion>
13 <!-- Coverage options -->
15 <CodeCoverageEnabled>false</CodeCoverageEnabled>
16 <CodeCoverageEnabled Condition="'$(SkipTests)' != 'true' and '$(RunningOnUnix)' != 'true' and '$(Coverage)' == 'true' and '$(Performance)' != 'true'">true</CodeCoverageEnabled>
17 <CoverageReportDir Condition="'$(CoverageReportDir)' == ''">$(TestWorkingDir)coverage\</CoverageReportDir>
19 <!-- This targets file has two modes one for individual projects and one for all -->
20 <GenerateCodeCoverageReportForAll Condition="'$(GenerateCodeCoverageReportForAll)'==''">false</GenerateCodeCoverageReportForAll>
21 <CoverageEnabledForProject Condition="'$(GenerateCodeCoverageReportForAll)'=='true'">false</CoverageEnabledForProject>
22 <CoverageEnabledForProject Condition="'$(CoverageEnabledForProject)'=='' and '$(IsTestProject)'=='true'">$(CodeCoverageEnabled)</CoverageEnabledForProject>
24 <GenerateIndividualCoverageReport Condition="'$(BuildAllProjects)'!='true' and '$(CoverageEnabledForProject)'=='true'">true</GenerateIndividualCoverageReport>
25 <GenerateFullCoverageReport Condition="'$(GenerateCodeCoverageReportForAll)'=='true' and '$(CodeCoverageEnabled)'=='true' and '$(SkipFullCoverageReport)' != 'true'">true</GenerateFullCoverageReport>
26 <GenerateVisitedMethodsReport Condition="'$(GenerateCodeCoverageReportForAll)'=='true' and '$(CodeCoverageEnabled)'=='true' and '$(GenerateVisitedReport)' == 'true'">true</GenerateVisitedMethodsReport>
28 <!-- We need to filter the data to only the assembly being tested. Otherwise we will gather tons of data about other assemblies. -->
29 <_ProjectDirectoryUnderSourceDir Condition="'$(IsTestProject)' == 'true'">$(MSBuildProjectDirectory.SubString($(SourceDir.Length)))</_ProjectDirectoryUnderSourceDir>
30 <AssemblyBeingTestedName Condition="'$(IsTestProject)' == 'true'">$(_ProjectDirectoryUnderSourceDir.SubString(0, $(_ProjectDirectoryUnderSourceDir.IndexOfAny("\\/"))))</AssemblyBeingTestedName>
33 When coverage is enabled, we disallow building projects in parallel.
34 There appear to be issues with the OpenCover tool in these scenarios.
36 <SerializeProjects Condition="'$(CodeCoverageEnabled)'=='true'">true</SerializeProjects>
39 <Target Name="CreateCoverageFilter" BeforeTargets="GenerateTestExecutionScripts">
40 <!-- By default, code coverage data is only gathered for the assembly being tested.
41 CodeCoverageAssemblies can be passed in to the build to gather coverage on additional assemblies. -->
43 <_CodeCoverageAssemblies Include="$(AssemblyBeingTestedName)" />
44 <_CodeCoverageAssemblies Include="@(AdditionalCodeCoverageAssemblies)" />
45 <_CodeCoverageAssemblies Include="$(CodeCoverageAssemblies)" Condition="'$(CodeCoverageAssemblies)' != ''" />
48 <CoverageFilter>@(_CodeCoverageAssemblies->'+[%(Identity)]*', ' ')</CoverageFilter>
49 <CoverageFilter Condition="'$(CodeCoverageAssemblies)' == 'all'">[*]*</CoverageFilter>
53 <!-- *********************************************************************************************** -->
54 <!-- As of 10/2017 OpenCover does not support portable PDBs, but we want the builds to generate
55 portable PDBs. Thus we generate windows PDBs from portable PDBs here. Can be removed
56 when OpenCover directly supports Portable PDBs (probably by early 2018) -->
58 <Target Name="GenerateWindowsPdbsForAssemblyBeingTested"
59 BeforeTargets="GenerateTestExecutionScripts"
60 Condition="'$(CodeCoverageEnabled)' == 'true' and '$(TargetOS)'=='Windows_NT'">
62 <!-- We look for the DLL being tested for coverage and its PDB create a WindowsPDB\*.pdb which has
65 <PortableDllsToConvert Include="$(NETCoreAppTestSharedFrameworkPath)$(AssemblyBeingTestedName).dll">
66 <PdbPath>$(NETCoreAppTestSharedFrameworkPath)$(AssemblyBeingTestedName).pdb</PdbPath>
67 <TargetPath>$(NETCoreAppTestSharedFrameworkPath)WindowsPDB/$(AssemblyBeingTestedName).pdb</TargetPath>
68 </PortableDllsToConvert>
70 <ExistingPortableDllsToConvert Include="@(PortableDllsToConvert)" Condition="Exists('%(PortableDllsToConvert.Identity)') AND Exists('%(PortableDllsToConvert.PdbPath)')"/>
73 <!-- There are two file in CoreFX, (System.Security.Permissions and Microsoft.Win32.Registry.AccessControl.pdb)
74 are generated by the GenFacades task and lack a Debug diretory (see https://github.com/dotnet/buildtools/issues/1739)
75 This causes ConvertPortablePdbsToWindowsPdbs to fail. Work around it right now by using WarnAndContinue
76 Soon we won't need this code, (since OpenCover will support portable PDBs) so it is OK to just give up for now. -->
77 <ConvertPortablePdbsToWindowsPdbs Files="@(ExistingPortableDllsToConvert)" ContinueOnError="WarnAndContinue"/>
79 <!-- This is a work around because it seems that OpenCover does not seem to accept the PDB unless
80 it is right next to the DLL it is for. (-searchDir:XXX does not seem to work).
81 This code puts next to the DLL as a work-around. However doing thi also clobbers
82 the original portable PDB in the runtime directory in the process. I don't like this but
83 it does unblock things and this is all intended to be temporary until OpenCover supports
84 portable PDBs directly -->
85 <Message Importance="high" Text="Replacing Portable PDB with Windows Pdb in place!" />
86 <Copy SourceFiles="%(ExistingPortableDllsToConvert.TargetPath)" DestinationFolder="$(NETCoreAppTestSharedFrameworkPath)" Condition="Exists('%(ExistingPortableDllsToConvert.TargetPath)')"/>
88 <!-- *********************************************************************************************** -->
90 <!-- xUnit command line with coverage enabled -->
91 <PropertyGroup Condition="'$(CoverageEnabledForProject)'=='true'">
92 <CoverageHost>$(PackagesDir)OpenCover\$(OpenCoverVersion)\tools\OpenCover.Console.exe</CoverageHost>
93 <CoverageOutputFilePath>$(CoverageReportDir)$(MSBuildProjectName).coverage.xml</CoverageOutputFilePath>
94 <CoverageOptions>-oldStyle -filter:"{CoverageFilter}" -excludebyfile:"*\Common\src\System\SR.*" -nodefaultfilters -excludebyattribute:*.ExcludeFromCodeCoverage* -skipautoprops -hideskipped:All -threshold:1</CoverageOptions>
95 <CoverageCommandLine>$(CoverageOptions) -returntargetcode -register:user -target:$(TestProgram) -output:$(CoverageOutputFilePath)</CoverageCommandLine>
96 <TestHost>$(CoverageHost)</TestHost>
97 <TestCommandLine>$(TestHost) $(CoverageCommandLine) -targetargs:"$(TestArguments) {XunitTraitOptions} -notrait Benchmark=true"</TestCommandLine>
100 <!-- Report Generator Properties -->
102 <CoverageReportAssemblyFilters Condition="'$(CodeCoverageAssemblies)' != 'all'">"-assemblyfilters:@(_CodeCoverageAssemblies->'+%(Identity)', ';')"</CoverageReportAssemblyFilters>
103 <CoverageReportGeneratorOptions>-targetdir:$(CoverageReportDir) -reporttypes:Html;Badges $(CoverageReportAssemblyFilters)</CoverageReportGeneratorOptions>
104 <CoverageReportGeneratorCommandLine>$(PackagesDir)ReportGenerator\$(ReportGeneratorVersion)\tools\ReportGenerator.exe $(CoverageReportGeneratorOptions)</CoverageReportGeneratorCommandLine>
107 <PropertyGroup Condition="'$(GenerateIndividualCoverageReport)'=='true'">
108 <GenerateIndividualCoverageReportAfterTargets Condition="'$(GenerateIndividualCoverageReportAfterTargets)'==''">RunTestsForProject</GenerateIndividualCoverageReportAfterTargets>
111 <!-- Generate coverage reports for individual projects. -->
112 <Target Name="GenerateIndividualCoverageReport"
113 AfterTargets="$(GenerateIndividualCoverageReportAfterTargets)"
114 Inputs="$(CoverageOutputFilePath)"
115 Outputs="$(CoverageReportDir)index.htm"
116 Condition="'$(GenerateIndividualCoverageReport)'=='true'">
118 <Exec Command="$(CoverageReportGeneratorCommandLine) -reports:$(CoverageOutputFilePath)"
119 ContinueOnError="ErrorAndContinue" />
121 <Exec Command="start $(CoverageReportDir)index.htm"
122 Condition="'$(PopCoverageReport)' == 'true'" />
126 <PropertyGroup Condition="'$(GenerateFullCoverageReport)'=='true'">
127 <GenerateFullCoverageReportAfterTargets Condition="'$(GenerateFullCoverageReportAfterTargets)'==''">TestAllProjects</GenerateFullCoverageReportAfterTargets>
130 <!-- Generate coverage report for all the projects. -->
131 <Target Name="GenerateFullCoverageReport"
132 AfterTargets="$(GenerateFullCoverageReportAfterTargets)"
133 Inputs="$(CoverageReportDir)\*.coverage.xml"
134 Outputs="$(CoverageReportDir)index.htm"
135 Condition="'$(GenerateFullCoverageReport)'=='true'">
137 <Exec Command="$(CoverageReportGeneratorCommandLine) -reports:$(CoverageReportDir)\*.coverage.xml"
138 ContinueOnError="ErrorAndContinue"
139 WorkingDirectory="$(ProjectDir)" />
141 <Exec Command="start $(CoverageReportDir)index.htm"
142 Condition="'$(PopCoverageReport)' == 'true'" />
145 <CoverallsUploaderCommandLine>$(PackagesDir)coveralls.io.$(CoverallsUploaderVersion)\tools\coveralls.net.exe</CoverallsUploaderCommandLine>
146 <CoverallsUploaderOptions>--opencover $(CoverageReportDir)\*.coverage.xml --repo-token $(CoverallsToken)</CoverallsUploaderOptions>
149 <Exec Command="$(CoverallsUploaderCommandLine) $(CoverallsUploaderOptions)"
150 ContinueOnError="ErrorAndContinue"
151 WorkingDirectory="$(ProjectDir)"
152 Condition="'$(UploadCoverallsData)'=='true'" />
156 <UsingTask TaskName="ParseTestCoverageInfo" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll"/>
158 <!-- Generates VisitedMethodsReport.xml -->
159 <Target Name="GenerateVisitedReport"
161 Condition="'$(GenerateVisitedMethodsReport)' == 'true'"
162 Inputs="$(CoverageReportDir)*.coverage.xml"
163 Outputs="$(CoverageReportDir)\VisitedMethodsReport.xml">
165 <Reports Include="$(CoverageReportDir)*.coverage.xml"/>
167 <ParseTestCoverageInfo CoverageReports="@(Reports)"
168 OutputReport="$(CoverageReportDir)\VisitedMethodsReport.xml"/>