Skip to content

Commit a3c5d39

Browse files
merge master
2 parents 52416c7 + 0956d1e commit a3c5d39

File tree

10 files changed

+91
-19
lines changed

10 files changed

+91
-19
lines changed

src/coverlet.console/Program.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ static int Main(string[] args)
3838
CommandOption excludedSourceFiles = app.Option("--exclude-by-file", "Glob patterns specifying source files to exclude.", CommandOptionType.MultipleValue);
3939
CommandOption includeDirectories = app.Option("--include-directory", "Include directories containing additional assemblies to be instrumented.", CommandOptionType.MultipleValue);
4040
CommandOption excludeAttributes = app.Option("--exclude-by-attribute", "Attributes to exclude from code coverage.", CommandOptionType.MultipleValue);
41+
CommandOption includeTestAssembly = app.Option("--include-test-assembly", "Specifies whether to report code coverage of the test assembly", CommandOptionType.NoValue);
4142
CommandOption singleHit = app.Option("--single-hit", "Specifies whether to limit code coverage hit reporting to a single hit for each location", CommandOptionType.NoValue);
4243
CommandOption mergeWith = app.Option("--merge-with", "Path to existing coverage result to merge.", CommandOptionType.SingleValue);
4344
CommandOption useSourceLink = app.Option("--use-source-link", "Specifies whether to use SourceLink URIs in place of file system paths.", CommandOptionType.NoValue);
@@ -50,7 +51,17 @@ static int Main(string[] args)
5051
if (!target.HasValue())
5152
throw new CommandParsingException(app, "Target must be specified.");
5253

53-
Coverage coverage = new Coverage(module.Value, includeFilters.Values.ToArray(), includeDirectories.Values.ToArray(), excludeFilters.Values.ToArray(), excludedSourceFiles.Values.ToArray(), excludeAttributes.Values.ToArray(), singleHit.HasValue(), mergeWith.Value(), useSourceLink.HasValue(), logger);
54+
Coverage coverage = new Coverage(module.Value,
55+
includeFilters.Values.ToArray(),
56+
includeDirectories.Values.ToArray(),
57+
excludeFilters.Values.ToArray(),
58+
excludedSourceFiles.Values.ToArray(),
59+
excludeAttributes.Values.ToArray(),
60+
includeTestAssembly.HasValue(),
61+
singleHit.HasValue(),
62+
mergeWith.Value(),
63+
useSourceLink.HasValue(),
64+
logger);
5465
coverage.PrepareModules();
5566

5667
Process process = new Process();

src/coverlet.core/Coverage.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public class Coverage
2121
private string[] _excludeFilters;
2222
private string[] _excludedSourceFiles;
2323
private string[] _excludeAttributes;
24+
private bool _includeTestAssembly;
2425
private bool _singleHit;
2526
private string _mergeWith;
2627
private bool _useSourceLink;
@@ -38,6 +39,7 @@ public Coverage(string module,
3839
string[] excludeFilters,
3940
string[] excludedSourceFiles,
4041
string[] excludeAttributes,
42+
bool includeTestAssembly,
4143
bool singleHit,
4244
string mergeWith,
4345
bool useSourceLink,
@@ -49,6 +51,7 @@ public Coverage(string module,
4951
_excludeFilters = excludeFilters;
5052
_excludedSourceFiles = excludedSourceFiles;
5153
_excludeAttributes = excludeAttributes;
54+
_includeTestAssembly = includeTestAssembly;
5255
_singleHit = singleHit;
5356
_mergeWith = mergeWith;
5457
_useSourceLink = useSourceLink;
@@ -60,7 +63,7 @@ public Coverage(string module,
6063

6164
public void PrepareModules()
6265
{
63-
string[] modules = InstrumentationHelper.GetCoverableModules(_module, _includeDirectories);
66+
string[] modules = InstrumentationHelper.GetCoverableModules(_module, _includeDirectories, _includeTestAssembly);
6467
string[] excludes = InstrumentationHelper.GetExcludedFiles(_excludedSourceFiles);
6568

6669
Array.ForEach(_excludeFilters ?? Array.Empty<string>(), filter => _logger.LogInformation($"Excluded module filter '{filter}'"));

src/coverlet.core/Helpers/InstrumentationHelper.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace Coverlet.Core.Helpers
1414
{
1515
internal static class InstrumentationHelper
1616
{
17-
public static string[] GetCoverableModules(string module, string[] directories)
17+
public static string[] GetCoverableModules(string module, string[] directories, bool includeTestAssembly)
1818
{
1919
Debug.Assert(directories != null);
2020

@@ -50,6 +50,9 @@ public static string[] GetCoverableModules(string module, string[] directories)
5050
// The module's name must be unique.
5151
var uniqueModules = new HashSet<string>();
5252

53+
if (!includeTestAssembly)
54+
uniqueModules.Add(Path.GetFileName(module));
55+
5356
return dirs.SelectMany(d => Directory.EnumerateFiles(d))
5457
.Where(m => IsAssembly(m) && uniqueModules.Add(Path.GetFileName(m)))
5558
.ToArray();
@@ -109,8 +112,11 @@ public static void RestoreOriginalModule(string module, string identifier)
109112

110113
RetryHelper.Retry(() =>
111114
{
112-
File.Copy(backupSymbolPath, Path.ChangeExtension(module, ".pdb"), true);
113-
File.Delete(backupSymbolPath);
115+
if (File.Exists(backupSymbolPath))
116+
{
117+
File.Copy(backupSymbolPath, Path.ChangeExtension(module, ".pdb"), true);
118+
File.Delete(backupSymbolPath);
119+
}
114120
}, retryStrategy, 10);
115121
}
116122

src/coverlet.core/Instrumentation/Instrumenter.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,18 @@ public Instrumenter(string module, string identifier, string[] excludeFilters, s
5050
_logger = logger;
5151
}
5252

53-
public bool CanInstrument() => InstrumentationHelper.HasPdb(_module);
53+
public bool CanInstrument()
54+
{
55+
try
56+
{
57+
return InstrumentationHelper.HasPdb(_module);
58+
}
59+
catch (Exception ex)
60+
{
61+
_logger.LogWarning($"Unable to instrument module: '{_module}' because : {ex.Message}");
62+
return false;
63+
}
64+
}
5465

5566
public InstrumenterResult Instrument()
5667
{
@@ -692,4 +703,4 @@ public override AssemblyDefinition Resolve(AssemblyNameReference name)
692703
}
693704
}
694705
}
695-
}
706+
}

src/coverlet.msbuild.tasks/InstrumentationTask.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class InstrumentationTask : Task
1414
private string _exclude;
1515
private string _excludeByFile;
1616
private string _excludeByAttribute;
17+
private bool _includeTestAssembly;
1718
private bool _singleHit;
1819
private string _mergeWith;
1920
private bool _useSourceLink;
@@ -61,6 +62,12 @@ public string ExcludeByAttribute
6162
set { _excludeByAttribute = value; }
6263
}
6364

65+
public bool IncludeTestAssembly
66+
{
67+
get { return _includeTestAssembly; }
68+
set { _includeTestAssembly = value; }
69+
}
70+
6471
public bool SingleHit
6572
{
6673
get { return _singleHit; }
@@ -94,7 +101,7 @@ public override bool Execute()
94101
var excludedSourceFiles = _excludeByFile?.Split(',');
95102
var excludeAttributes = _excludeByAttribute?.Split(',');
96103

97-
_coverage = new Coverage(_path, includeFilters, includeDirectories, excludeFilters, excludedSourceFiles, excludeAttributes, _singleHit, _mergeWith, _useSourceLink, _logger);
104+
_coverage = new Coverage(_path, includeFilters, includeDirectories, excludeFilters, excludedSourceFiles, excludeAttributes, _includeTestAssembly, _singleHit, _mergeWith, _useSourceLink, _logger);
98105
_coverage.PrepareModules();
99106
}
100107
catch (Exception ex)

src/coverlet.msbuild.tasks/coverlet.msbuild.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<Exclude Condition="$(Exclude) == ''"></Exclude>
77
<ExcludeByFile Condition="$(ExcludeByFile) == ''"></ExcludeByFile>
88
<ExcludeByAttribute Condition="$(ExcludeByAttribute) == ''"></ExcludeByAttribute>
9+
<IncludeTestAssembly Condition="'$(IncludeTestAssembly)' == ''">false</IncludeTestAssembly>
910
<SingleHit Condition="'$(SingleHit)' == ''">false</SingleHit>
1011
<MergeWith Condition="$(MergeWith) == ''"></MergeWith>
1112
<UseSourceLink Condition="$(UseSourceLink) == ''">false</UseSourceLink>

src/coverlet.msbuild.tasks/coverlet.msbuild.targets

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
Exclude="$(Exclude)"
1313
ExcludeByFile="$(ExcludeByFile)"
1414
ExcludeByAttribute="$(ExcludeByAttribute)"
15+
IncludeTestAssembly="$(IncludeTestAssembly)"
1516
SingleHit="$(SingleHit)"
1617
MergeWith="$(MergeWith)"
1718
UseSourceLink="$(UseSourceLink)" />
@@ -26,6 +27,7 @@
2627
Exclude="$(Exclude)"
2728
ExcludeByFile="$(ExcludeByFile)"
2829
ExcludeByAttribute="$(ExcludeByAttribute)"
30+
IncludeTestAssembly="$(IncludeTestAssembly)"
2931
SingleHit="$(SingleHit)"
3032
MergeWith="$(MergeWith)"
3133
UseSourceLink="$(UseSourceLink)" />

src/coverlet.msbuild.tasks/coverlet.msbuild.tasks.csproj

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<RepositoryUrl>https://github.com/tonerdo/coverlet</RepositoryUrl>
2222
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
2323
<TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);PackBuildOutputs</TargetsForTfmSpecificContentInPackage>
24-
<ContentTargetFolders>build\$(TargetFramework)\</ContentTargetFolders>
24+
<ContentTargetFolders>build</ContentTargetFolders>
2525
<IncludeBuildOutput>false</IncludeBuildOutput>
2626
</PropertyGroup>
2727

@@ -44,11 +44,11 @@
4444

4545
<Target Name="PackBuildOutputs" DependsOnTargets="ResolveProjectReferences;SatelliteDllsProjectOutputGroup;DebugSymbolsProjectOutputGroup;SatelliteDllsProjectOutputGroupDependencies;ResolveAssemblyReferences">
4646
<ItemGroup>
47-
<TfmSpecificPackageFile Include="$(TargetPath)" PackagePath="build\$(TargetFramework)\" />
48-
<TfmSpecificPackageFile Include="$(DepsFilePath)" PackagePath="build\$(TargetFramework)\" />
49-
<TfmSpecificPackageFile Include="@(DebugSymbolsProjectOutputGroupOutput)" PackagePath="build\$(TargetFramework)\" />
50-
<TfmSpecificPackageFile Include="%(_ResolvedProjectReferencePaths.Identity)" PackagePath="build\$(TargetFramework)\" />
51-
<TfmSpecificPackageFile Include="@(ReferenceCopyLocalPaths)" Exclude="@(_ResolvedProjectReferencePaths)" PackagePath="build\$(TargetFramework)\%(ReferenceCopyLocalPaths.DestinationSubPath)" />
47+
<TfmSpecificPackageFile Include="$(TargetPath)" PackagePath="build\" />
48+
<TfmSpecificPackageFile Include="$(DepsFilePath)" PackagePath="build\" />
49+
<TfmSpecificPackageFile Include="@(DebugSymbolsProjectOutputGroupOutput)" PackagePath="build\" />
50+
<TfmSpecificPackageFile Include="%(_ResolvedProjectReferencePaths.Identity)" PackagePath="build\" />
51+
<TfmSpecificPackageFile Include="@(ReferenceCopyLocalPaths)" Exclude="@(_ResolvedProjectReferencePaths)" PackagePath="build\%(ReferenceCopyLocalPaths.DestinationSubPath)" />
5252
</ItemGroup>
5353
</Target>
5454

test/coverlet.core.tests/CoverageTests.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,30 @@ public void TestCoverage()
2222

2323
// TODO: Find a way to mimick hits
2424

25-
var coverage = new Coverage(Path.Combine(directory.FullName, Path.GetFileName(module)), Array.Empty<string>(), Array.Empty<string>(), Array.Empty<string>(), Array.Empty<string>(), Array.Empty<string>(), false, string.Empty, false, new Mock<ILogger>().Object);
25+
var coverage = new Coverage(Path.Combine(directory.FullName, Path.GetFileName(module)), Array.Empty<string>(), Array.Empty<string>(), Array.Empty<string>(), Array.Empty<string>(), Array.Empty<string>(), false, false, string.Empty, false, new Mock<ILogger>().Object);
26+
coverage.PrepareModules();
27+
28+
var result = coverage.GetCoverageResult();
29+
30+
Assert.Empty(result.Modules);
31+
32+
directory.Delete(true);
33+
}
34+
35+
[Fact]
36+
public void TestCoverageWithTestAssembly()
37+
{
38+
string module = GetType().Assembly.Location;
39+
string pdb = Path.Combine(Path.GetDirectoryName(module), Path.GetFileNameWithoutExtension(module) + ".pdb");
40+
41+
var directory = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()));
42+
43+
File.Copy(module, Path.Combine(directory.FullName, Path.GetFileName(module)), true);
44+
File.Copy(pdb, Path.Combine(directory.FullName, Path.GetFileName(pdb)), true);
45+
46+
// TODO: Find a way to mimick hits
47+
48+
var coverage = new Coverage(Path.Combine(directory.FullName, Path.GetFileName(module)), Array.Empty<string>(), Array.Empty<string>(), Array.Empty<string>(), Array.Empty<string>(), Array.Empty<string>(), true, false, string.Empty, false, new Mock<ILogger>().Object);
2649
coverage.PrepareModules();
2750

2851
var result = coverage.GetCoverageResult();

test/coverlet.core.tests/Helpers/InstrumentationHelperTests.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,15 @@ public class InstrumentationHelperTests
1212
public void TestGetDependencies()
1313
{
1414
string module = typeof(InstrumentationHelperTests).Assembly.Location;
15-
var modules = InstrumentationHelper.GetCoverableModules(module, Array.Empty<string>());
15+
var modules = InstrumentationHelper.GetCoverableModules(module, Array.Empty<string>(), false);
16+
Assert.False(Array.Exists(modules, m => m == module));
17+
}
18+
19+
[Fact]
20+
public void TestGetDependenciesWithTestAssembly()
21+
{
22+
string module = typeof(InstrumentationHelperTests).Assembly.Location;
23+
var modules = InstrumentationHelper.GetCoverableModules(module, Array.Empty<string>(), true);
1624
Assert.True(Array.Exists(modules, m => m == module));
1725
}
1826

@@ -235,16 +243,16 @@ public void TestIncludeDirectories()
235243
string module = typeof(InstrumentationHelperTests).Assembly.Location;
236244

237245
var currentDirModules = InstrumentationHelper.GetCoverableModules(module,
238-
new[] { Environment.CurrentDirectory });
246+
new[] { Environment.CurrentDirectory }, false);
239247

240248
var parentDirWildcardModules = InstrumentationHelper.GetCoverableModules(module,
241-
new[] { Path.Combine(Directory.GetParent(Environment.CurrentDirectory).FullName, "*") });
249+
new[] { Path.Combine(Directory.GetParent(Environment.CurrentDirectory).FullName, "*") }, false);
242250

243251
// There are at least as many modules found when searching the parent directory's subdirectories
244252
Assert.True(parentDirWildcardModules.Length >= currentDirModules.Length);
245253

246254
var relativePathModules = InstrumentationHelper.GetCoverableModules(module,
247-
new[] { "." });
255+
new[] { "." }, false);
248256

249257
// Same number of modules found when using a relative path
250258
Assert.Equal(currentDirModules.Length, relativePathModules.Length);

0 commit comments

Comments
 (0)