From f7c3fd4e3a52de4eda4d3aa26918487e23f2aaa1 Mon Sep 17 00:00:00 2001 From: Marco Rossignoli Date: Sat, 13 Jun 2020 22:15:17 +0200 Subject: [PATCH] Refactor coverage parameters (#876) Refactor coverage parameters --- .../DataCollection/CoverageWrapper.cs | 23 ++++++---- src/coverlet.console/Program.cs | 38 ++++++++++------- src/coverlet.core/Coverage.cs | 42 +++++++++++-------- .../InstrumentationTask.cs | 38 ++++++++--------- .../CoverletCoverageDataCollectorTests.cs | 14 ++++++- ...erageTests.ExcludeFromCoverageAttribute.cs | 16 ++++++- .../Coverage/CoverageTests.cs | 32 ++++++++++++-- .../Coverage/InstrumenterHelper.cs | 35 ++++++++++------ 8 files changed, 157 insertions(+), 81 deletions(-) diff --git a/src/coverlet.collector/DataCollection/CoverageWrapper.cs b/src/coverlet.collector/DataCollection/CoverageWrapper.cs index 2beef27..e65a918 100644 --- a/src/coverlet.collector/DataCollection/CoverageWrapper.cs +++ b/src/coverlet.collector/DataCollection/CoverageWrapper.cs @@ -17,17 +17,22 @@ namespace Coverlet.Collector.DataCollection /// Coverage object public Coverage CreateCoverage(CoverletSettings settings, ILogger coverletLogger, IInstrumentationHelper instrumentationHelper, IFileSystem fileSystem, ISourceRootTranslator sourceRootTranslator, ICecilSymbolHelper cecilSymbolHelper) { + CoverageParameters parameters = new CoverageParameters + { + IncludeFilters = settings.IncludeFilters, + IncludeDirectories = settings.IncludeDirectories, + ExcludeFilters = settings.ExcludeFilters, + ExcludedSourceFiles = settings.ExcludeSourceFiles, + ExcludeAttributes = settings.ExcludeAttributes, + IncludeTestAssembly = settings.IncludeTestAssembly, + SingleHit = settings.SingleHit, + MergeWith = settings.MergeWith, + UseSourceLink = settings.UseSourceLink + }; + return new Coverage( settings.TestModule, - settings.IncludeFilters, - settings.IncludeDirectories, - settings.ExcludeFilters, - settings.ExcludeSourceFiles, - settings.ExcludeAttributes, - settings.IncludeTestAssembly, - settings.SingleHit, - settings.MergeWith, - settings.UseSourceLink, + parameters, coverletLogger, instrumentationHelper, fileSystem, diff --git a/src/coverlet.console/Program.cs b/src/coverlet.console/Program.cs index 2493857..16cc7fa 100644 --- a/src/coverlet.console/Program.cs +++ b/src/coverlet.console/Program.cs @@ -34,7 +34,7 @@ namespace Coverlet.Console ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider(); - var logger = (ConsoleLogger) serviceProvider.GetService(); + var logger = (ConsoleLogger)serviceProvider.GetService(); var fileSystem = serviceProvider.GetService(); var app = new CommandLineApplication(); @@ -76,22 +76,28 @@ namespace Coverlet.Console // Adjust log level based on user input. logger.Level = verbosity.ParsedValue; } + + CoverageParameters parameters = new CoverageParameters + { + IncludeFilters = includeFilters.Values.ToArray(), + IncludeDirectories = includeDirectories.Values.ToArray(), + ExcludeFilters = excludeFilters.Values.ToArray(), + ExcludedSourceFiles = excludedSourceFiles.Values.ToArray(), + ExcludeAttributes = excludeAttributes.Values.ToArray(), + IncludeTestAssembly = includeTestAssembly.HasValue(), + SingleHit = singleHit.HasValue(), + MergeWith = mergeWith.Value(), + UseSourceLink = useSourceLink.HasValue() + }; + Coverage coverage = new Coverage(module.Value, - includeFilters.Values.ToArray(), - includeDirectories.Values.ToArray(), - excludeFilters.Values.ToArray(), - excludedSourceFiles.Values.ToArray(), - excludeAttributes.Values.ToArray(), - includeTestAssembly.HasValue(), - singleHit.HasValue(), - mergeWith.Value(), - useSourceLink.HasValue(), - logger, - serviceProvider.GetRequiredService(), - fileSystem, - serviceProvider.GetRequiredService(), - serviceProvider.GetRequiredService()); - coverage.PrepareModules(); + parameters, + logger, + serviceProvider.GetRequiredService(), + fileSystem, + serviceProvider.GetRequiredService(), + serviceProvider.GetRequiredService()); + coverage.PrepareModules(); Process process = new Process(); process.StartInfo.FileName = target.Value(); diff --git a/src/coverlet.core/Coverage.cs b/src/coverlet.core/Coverage.cs index f3d83aa..d0de3fa 100644 --- a/src/coverlet.core/Coverage.cs +++ b/src/coverlet.core/Coverage.cs @@ -10,6 +10,20 @@ using Newtonsoft.Json.Linq; namespace Coverlet.Core { + internal class CoverageParameters + { + public string Module { get; set; } + public string[] IncludeFilters { get; set; } + public string[] IncludeDirectories { get; set; } + public string[] ExcludeFilters { get; set; } + public string[] ExcludedSourceFiles { get; set; } + public string[] ExcludeAttributes { get; set; } + public bool IncludeTestAssembly { get; set; } + public bool SingleHit { get; set; } + public string MergeWith { get; set; } + public bool UseSourceLink { get; set; } + } + internal class Coverage { private string _module; @@ -36,15 +50,7 @@ namespace Coverlet.Core } public Coverage(string module, - string[] includeFilters, - string[] includeDirectories, - string[] excludeFilters, - string[] excludedSourceFiles, - string[] excludeAttributes, - bool includeTestAssembly, - bool singleHit, - string mergeWith, - bool useSourceLink, + CoverageParameters parameters, ILogger logger, IInstrumentationHelper instrumentationHelper, IFileSystem fileSystem, @@ -52,15 +58,15 @@ namespace Coverlet.Core ICecilSymbolHelper cecilSymbolHelper) { _module = module; - _includeFilters = includeFilters; - _includeDirectories = includeDirectories ?? Array.Empty(); - _excludeFilters = excludeFilters; - _excludedSourceFiles = excludedSourceFiles; - _excludeAttributes = excludeAttributes; - _includeTestAssembly = includeTestAssembly; - _singleHit = singleHit; - _mergeWith = mergeWith; - _useSourceLink = useSourceLink; + _includeFilters = parameters.IncludeFilters; + _includeDirectories = parameters.IncludeDirectories ?? Array.Empty(); + _excludeFilters = parameters.ExcludeFilters; + _excludedSourceFiles = parameters.ExcludedSourceFiles; + _excludeAttributes = parameters.ExcludeAttributes; + _includeTestAssembly = parameters.IncludeTestAssembly; + _singleHit = parameters.SingleHit; + _mergeWith = parameters.MergeWith; + _useSourceLink = parameters.UseSourceLink; _logger = logger; _instrumentationHelper = instrumentationHelper; _fileSystem = fileSystem; diff --git a/src/coverlet.msbuild.tasks/InstrumentationTask.cs b/src/coverlet.msbuild.tasks/InstrumentationTask.cs index 1331bbb..98b35bc 100644 --- a/src/coverlet.msbuild.tasks/InstrumentationTask.cs +++ b/src/coverlet.msbuild.tasks/InstrumentationTask.cs @@ -138,28 +138,28 @@ namespace Coverlet.MSbuild.Tasks try { - var includeFilters = _include?.Split(','); - var includeDirectories = _includeDirectory?.Split(','); - var excludeFilters = _exclude?.Split(','); - var excludedSourceFiles = _excludeByFile?.Split(','); - var excludeAttributes = _excludeByAttribute?.Split(','); var fileSystem = ServiceProvider.GetService(); + CoverageParameters parameters = new CoverageParameters + { + IncludeFilters = _include?.Split(','), + IncludeDirectories = _includeDirectory?.Split(','), + ExcludeFilters = _exclude?.Split(','), + ExcludedSourceFiles = _excludeByFile?.Split(','), + ExcludeAttributes = _excludeByAttribute?.Split(','), + IncludeTestAssembly = _includeTestAssembly, + SingleHit = _singleHit, + MergeWith = _mergeWith, + UseSourceLink = _useSourceLink + }; + Coverage coverage = new Coverage(_path, - includeFilters, - includeDirectories, - excludeFilters, - excludedSourceFiles, - excludeAttributes, - _includeTestAssembly, - _singleHit, - _mergeWith, - _useSourceLink, - _logger, - ServiceProvider.GetService(), - fileSystem, - ServiceProvider.GetService(), - ServiceProvider.GetService()); + parameters, + _logger, + ServiceProvider.GetService(), + ServiceProvider.GetService(), + ServiceProvider.GetService(), + ServiceProvider.GetService()); CoveragePrepareResult prepareResult = coverage.PrepareModules(); InstrumenterState = new TaskItem(System.IO.Path.GetTempFileName()); diff --git a/test/coverlet.collector.tests/CoverletCoverageDataCollectorTests.cs b/test/coverlet.collector.tests/CoverletCoverageDataCollectorTests.cs index 3c174d4..3c0346d 100644 --- a/test/coverlet.collector.tests/CoverletCoverageDataCollectorTests.cs +++ b/test/coverlet.collector.tests/CoverletCoverageDataCollectorTests.cs @@ -114,7 +114,19 @@ namespace Coverlet.Collector.Tests new Mock().Object, new Mock().Object); - Coverage coverage = new Coverage("abc.dll", null, null, null, null, null, true, true, "abc.json", true, It.IsAny(), instrumentationHelper, new Mock().Object, new Mock().Object, new Mock().Object); + CoverageParameters parameters = new CoverageParameters + { + IncludeFilters = null, + IncludeDirectories = null, + ExcludedSourceFiles = null, + ExcludeAttributes = null, + IncludeTestAssembly = true, + SingleHit = true, + MergeWith = "abc.json", + UseSourceLink = true + }; + + Coverage coverage = new Coverage("abc.dll", parameters, It.IsAny(), instrumentationHelper, new Mock().Object, new Mock().Object, new Mock().Object); sessionStartProperties.Add("TestSources", new List { "abc.dll" }); _mockCoverageWrapper.Setup(x => x.CreateCoverage(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).Returns(coverage); diff --git a/test/coverlet.core.tests/Coverage/CoverageTests.ExcludeFromCoverageAttribute.cs b/test/coverlet.core.tests/Coverage/CoverageTests.ExcludeFromCoverageAttribute.cs index bd398df..b143e42 100644 --- a/test/coverlet.core.tests/Coverage/CoverageTests.ExcludeFromCoverageAttribute.cs +++ b/test/coverlet.core.tests/Coverage/CoverageTests.ExcludeFromCoverageAttribute.cs @@ -33,9 +33,21 @@ namespace Coverlet.Core.Tests new InstrumentationHelper(new ProcessExitHandler(), new RetryHelper(), new FileSystem(), new Mock().Object, new SourceRootTranslator(excludedbyattributeDll, new Mock().Object, new FileSystem())); + CoverageParameters parameters = new CoverageParameters + { + IncludeFilters = new string[] { "[coverlet.tests.projectsample.excludedbyattribute*]*" }, + IncludeDirectories = Array.Empty(), + ExcludeFilters = Array.Empty(), + ExcludedSourceFiles = Array.Empty(), + ExcludeAttributes = Array.Empty(), + IncludeTestAssembly = true, + SingleHit = false, + MergeWith = string.Empty, + UseSourceLink = false + }; + // test skip module include test assembly feature - var coverage = new Coverage(excludedbyattributeDll, new string[] { "[coverlet.tests.projectsample.excludedbyattribute*]*" }, Array.Empty(), Array.Empty(), - Array.Empty(), Array.Empty(), true, false, string.Empty, false, loggerMock.Object, instrumentationHelper, partialMockFileSystem.Object, + var coverage = new Coverage(excludedbyattributeDll, parameters, loggerMock.Object, instrumentationHelper, partialMockFileSystem.Object, new SourceRootTranslator(loggerMock.Object, new FileSystem()), new CecilSymbolHelper()); CoveragePrepareResult result = coverage.PrepareModules(); Assert.Empty(result.Results); diff --git a/test/coverlet.core.tests/Coverage/CoverageTests.cs b/test/coverlet.core.tests/Coverage/CoverageTests.cs index 92f2b92..10074ba 100644 --- a/test/coverlet.core.tests/Coverage/CoverageTests.cs +++ b/test/coverlet.core.tests/Coverage/CoverageTests.cs @@ -29,8 +29,20 @@ namespace Coverlet.Core.Tests new InstrumentationHelper(new ProcessExitHandler(), new RetryHelper(), new FileSystem(), new Mock().Object, new SourceRootTranslator(module, new Mock().Object, new FileSystem())); - var coverage = new Coverage(Path.Combine(directory.FullName, Path.GetFileName(module)), Array.Empty(), Array.Empty(), Array.Empty(), Array.Empty(), - Array.Empty(), false, false, string.Empty, false, _mockLogger.Object, instrumentationHelper, new FileSystem(), new SourceRootTranslator(_mockLogger.Object, new FileSystem()), new CecilSymbolHelper()); + CoverageParameters parameters = new CoverageParameters + { + IncludeFilters = new string[] { "[coverlet.tests.projectsample.excludedbyattribute*]*" }, + IncludeDirectories = Array.Empty(), + ExcludeFilters = Array.Empty(), + ExcludedSourceFiles = Array.Empty(), + ExcludeAttributes = Array.Empty(), + IncludeTestAssembly = false, + SingleHit = false, + MergeWith = string.Empty, + UseSourceLink = false + }; + + var coverage = new Coverage(Path.Combine(directory.FullName, Path.GetFileName(module)), parameters, _mockLogger.Object, instrumentationHelper, new FileSystem(), new SourceRootTranslator(_mockLogger.Object, new FileSystem()), new CecilSymbolHelper()); coverage.PrepareModules(); var result = coverage.GetCoverageResult(); @@ -55,8 +67,20 @@ namespace Coverlet.Core.Tests new InstrumentationHelper(new ProcessExitHandler(), new RetryHelper(), new FileSystem(), new Mock().Object, new SourceRootTranslator(module, new Mock().Object, new FileSystem())); - var coverage = new Coverage(Path.Combine(directory.FullName, Path.GetFileName(module)), Array.Empty(), Array.Empty(), Array.Empty(), Array.Empty(), - Array.Empty(), true, false, string.Empty, false, _mockLogger.Object, instrumentationHelper, new FileSystem(), + CoverageParameters parameters = new CoverageParameters + { + IncludeFilters = Array.Empty(), + IncludeDirectories = Array.Empty(), + ExcludeFilters = Array.Empty(), + ExcludedSourceFiles = Array.Empty(), + ExcludeAttributes = Array.Empty(), + IncludeTestAssembly = true, + SingleHit = false, + MergeWith = string.Empty, + UseSourceLink = false + }; + + var coverage = new Coverage(Path.Combine(directory.FullName, Path.GetFileName(module)), parameters, _mockLogger.Object, instrumentationHelper, new FileSystem(), new SourceRootTranslator(module, _mockLogger.Object, new FileSystem()), new CecilSymbolHelper()); coverage.PrepareModules(); diff --git a/test/coverlet.core.tests/Coverage/InstrumenterHelper.cs b/test/coverlet.core.tests/Coverage/InstrumenterHelper.cs index 41505ff..951915c 100644 --- a/test/coverlet.core.tests/Coverage/InstrumenterHelper.cs +++ b/test/coverlet.core.tests/Coverage/InstrumenterHelper.cs @@ -86,19 +86,30 @@ namespace Coverlet.Core.Tests SetTestContainer(newPath, disableRestoreModules); static string[] defaultFilters(string _) => Array.Empty(); + + CoverageParameters parameters = new CoverageParameters + { + IncludeFilters = (includeFilter is null ? defaultFilters(fileName) : includeFilter(fileName)).Concat( + new string[] + { + $"[{Path.GetFileNameWithoutExtension(fileName)}*]{typeof(T).FullName}*" + }).ToArray(), + IncludeDirectories = Array.Empty(), + ExcludeFilters = (excludeFilter is null ? defaultFilters(fileName) : excludeFilter(fileName)).Concat(new string[] + { + "[xunit.*]*", + "[coverlet.*]*" + }).ToArray(), + ExcludedSourceFiles = Array.Empty(), + ExcludeAttributes = Array.Empty(), + IncludeTestAssembly = true, + SingleHit = false, + MergeWith = string.Empty, + UseSourceLink = false + }; + // Instrument module - Coverage coverage = new Coverage(newPath, - includeFilters: (includeFilter is null ? defaultFilters(fileName) : includeFilter(fileName)).Concat( - new string[] - { - $"[{Path.GetFileNameWithoutExtension(fileName)}*]{typeof(T).FullName}*" - }).ToArray(), - Array.Empty(), - excludeFilters: (excludeFilter is null ? defaultFilters(fileName) : excludeFilter(fileName)).Concat(new string[] - { - "[xunit.*]*", - "[coverlet.*]*" - }).ToArray(), Array.Empty(), Array.Empty(), true, false, "", false, new Logger(logFile), + Coverage coverage = new Coverage(newPath, parameters, new Logger(logFile), _processWideContainer.GetService(), _processWideContainer.GetService(), _processWideContainer.GetService(), _processWideContainer.GetService()); CoveragePrepareResult prepareResult = coverage.PrepareModules();