-
Notifications
You must be signed in to change notification settings - Fork 389
Coverlet Intergration with VSTest #410
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
tonerdo
merged 8 commits into
coverlet-coverage:master
from
vagisha-nidhi:coverletDatacollectors
May 20, 2019
Merged
Changes from 3 commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
59c5af6
Coverlet DataCollectors Implementation
vagisha-nidhi f5ffe46
Modifying build.proj for including collectors build and test
vagisha-nidhi c2d30e0
Review comments addressed
vagisha-nidhi 87a6f3a
Fixed failing UT
vagisha-nidhi 73de95d
Variable change suggestion
vagisha-nidhi faa5b92
Nit change
vagisha-nidhi 28aa07f
Adding diagnostic logs
vagisha-nidhi 56855bc
Unload module raise exception
vagisha-nidhi File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
168 changes: 168 additions & 0 deletions
168
src/coverlet.collector/DataCollection/AttachmentManager.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
using System; | ||
using System.ComponentModel; | ||
using System.IO; | ||
using coverlet.collector.Resources; | ||
using Coverlet.Collector.Utilities; | ||
using Coverlet.Collector.Utilities.Interfaces; | ||
using Microsoft.VisualStudio.TestPlatform.ObjectModel.DataCollection; | ||
|
||
namespace Coverlet.Collector.DataCollection | ||
{ | ||
/// <summary> | ||
/// Manages coverage report attachments | ||
/// </summary> | ||
internal class AttachmentManager : IDisposable | ||
{ | ||
private readonly DataCollectionSink _dataSink; | ||
private readonly TestPlatformEqtTrace _eqtTrace; | ||
private readonly TestPlatformLogger _logger; | ||
private readonly DataCollectionContext _dataCollectionContext; | ||
private readonly IFileHelper _fileHelper; | ||
private readonly IDirectoryHelper _directoryHelper; | ||
private readonly string _reportFileName; | ||
private readonly string _reportDirectory; | ||
|
||
public AttachmentManager(DataCollectionSink dataSink, DataCollectionContext dataCollectionContext, TestPlatformLogger logger, TestPlatformEqtTrace eqtTrace, string reportFileName) | ||
: this(dataSink, | ||
dataCollectionContext, | ||
logger, | ||
eqtTrace, | ||
reportFileName, | ||
Guid.NewGuid().ToString(), | ||
new FileHelper(), | ||
new DirectoryHelper()) | ||
{ | ||
} | ||
|
||
public AttachmentManager(DataCollectionSink dataSink, DataCollectionContext dataCollectionContext, TestPlatformLogger logger, TestPlatformEqtTrace eqtTrace, string reportFileName, string reportDirectoryName, IFileHelper fileHelper, IDirectoryHelper directoryHelper) | ||
{ | ||
// Store input variabless | ||
_dataSink = dataSink; | ||
_dataCollectionContext = dataCollectionContext; | ||
_logger = logger; | ||
_eqtTrace = eqtTrace; | ||
_reportFileName = reportFileName; | ||
_fileHelper = fileHelper; | ||
_directoryHelper = directoryHelper; | ||
|
||
// Report directory to store the coverage reports. | ||
_reportDirectory = Path.Combine(Path.GetTempPath(), reportDirectoryName); | ||
|
||
// Register events | ||
_dataSink.SendFileCompleted += this.OnSendFileCompleted; | ||
} | ||
|
||
/// <summary> | ||
/// Sends coverage report to test platform | ||
/// </summary> | ||
/// <param name="coverageReport">Coverage report</param> | ||
public void SendCoverageReport(string coverageReport) | ||
{ | ||
// Save coverage report to file | ||
string coverageReportPath = this.SaveCoverageReport(coverageReport); | ||
|
||
// Send coverage attachment to test platform. | ||
this.SendAttachment(coverageReportPath); | ||
} | ||
|
||
/// <summary> | ||
/// Disposes attachment manager | ||
/// </summary> | ||
public void Dispose() | ||
{ | ||
// Unregister events | ||
try | ||
{ | ||
if (_dataSink != null) | ||
{ | ||
_dataSink.SendFileCompleted -= this.OnSendFileCompleted; | ||
} | ||
this.CleanupReportDirectory(); | ||
} | ||
catch (Exception ex) | ||
{ | ||
_logger.LogWarning(ex.ToString()); | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// Saves coverage report to file system | ||
/// </summary> | ||
/// <param name="report">Coverage report</param> | ||
/// <returns>Coverage report file path</returns> | ||
private string SaveCoverageReport(string report) | ||
{ | ||
try | ||
{ | ||
_directoryHelper.CreateDirectory(_reportDirectory); | ||
string filePath = Path.Combine(_reportDirectory, _reportFileName); | ||
_fileHelper.WriteAllText(filePath, report); | ||
_eqtTrace.Info("{0}: Saved coverage report to path: '{1}'", CoverletConstants.DataCollectorName, filePath); | ||
|
||
return filePath; | ||
} | ||
catch (Exception ex) | ||
{ | ||
string errorMessage = string.Format(Resources.FailedToSaveCoverageReport, CoverletConstants.DataCollectorName, _reportFileName, _reportDirectory); | ||
throw new CoverletDataCollectorException(errorMessage, ex); | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// SendFileCompleted event handler | ||
/// </summary> | ||
/// <param name="sender">Sender</param> | ||
/// <param name="e">Event args</param> | ||
public void OnSendFileCompleted(object sender, AsyncCompletedEventArgs e) | ||
{ | ||
try | ||
{ | ||
_eqtTrace.Verbose("{0}: SendFileCompleted received", CoverletConstants.DataCollectorName); | ||
this.CleanupReportDirectory(); | ||
} | ||
catch (Exception ex) | ||
{ | ||
_logger.LogWarning(ex.ToString()); | ||
this.Dispose(); | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// Sends attachment file to test platform | ||
/// </summary> | ||
/// <param name="attachmentPath">Attachment file path</param> | ||
private void SendAttachment(string attachmentPath) | ||
{ | ||
if (_fileHelper.Exists(attachmentPath)) | ||
{ | ||
// Send coverage attachment to test platform. | ||
_eqtTrace.Verbose("{0}: Sending attachment to test platform", CoverletConstants.DataCollectorName); | ||
_dataSink.SendFileAsync(_dataCollectionContext, attachmentPath, false); | ||
} | ||
else | ||
{ | ||
_eqtTrace.Warning("{0}: Attachment file does not exist", CoverletConstants.DataCollectorName); | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// Cleans up coverage report directory | ||
/// </summary> | ||
private void CleanupReportDirectory() | ||
{ | ||
try | ||
{ | ||
if (_directoryHelper.Exists(_reportDirectory)) | ||
{ | ||
_directoryHelper.Delete(_reportDirectory, true); | ||
_eqtTrace.Verbose("{0}: Deleted report directory: '{1}'", CoverletConstants.DataCollectorName, _reportDirectory); | ||
} | ||
} | ||
catch (Exception ex) | ||
{ | ||
string errorMessage = string.Format(Resources.FailedToCleanupReportDirectory, CoverletConstants.DataCollectorName, _reportDirectory); | ||
throw new CoverletDataCollectorException(errorMessage, ex); | ||
} | ||
} | ||
} | ||
} |
106 changes: 106 additions & 0 deletions
106
src/coverlet.collector/DataCollection/CoverageManager.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
using System; | ||
using coverlet.collector.Resources; | ||
using Coverlet.Collector.Utilities; | ||
using Coverlet.Collector.Utilities.Interfaces; | ||
using Coverlet.Core; | ||
using Coverlet.Core.Logging; | ||
using Coverlet.Core.Reporters; | ||
|
||
namespace Coverlet.Collector.DataCollection | ||
{ | ||
/// <summary> | ||
/// Manages coverlet coverage | ||
/// </summary> | ||
internal class CoverageManager | ||
{ | ||
private readonly Coverage _coverage; | ||
|
||
private ICoverageWrapper _coverageWrapper; | ||
|
||
public IReporter _reporter { get; } | ||
|
||
public CoverageManager(CoverletSettings settings, TestPlatformEqtTrace eqtTrace, TestPlatformLogger logger, ICoverageWrapper coverageWrapper) | ||
: this(settings, | ||
new ReporterFactory(settings.ReportFormat).CreateReporter(), | ||
new CoverletLogger(eqtTrace, logger), | ||
coverageWrapper) | ||
{ | ||
} | ||
|
||
public CoverageManager(CoverletSettings settings, IReporter reporter, ILogger logger, ICoverageWrapper coverageWrapper) | ||
{ | ||
// Store input vars | ||
_reporter = reporter; | ||
_coverageWrapper = coverageWrapper; | ||
|
||
// Coverage object | ||
_coverage = _coverageWrapper.CreateCoverage(settings, logger); | ||
} | ||
|
||
/// <summary> | ||
/// Instrument modules | ||
/// </summary> | ||
public void InstrumentModules() | ||
{ | ||
try | ||
{ | ||
// Instrument modules | ||
_coverageWrapper.PrepareModules(_coverage); | ||
} | ||
catch (Exception ex) | ||
{ | ||
string errorMessage = string.Format(Resources.InstrumentationException, CoverletConstants.DataCollectorName); | ||
throw new CoverletDataCollectorException(errorMessage, ex); | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// Gets coverlet coverage report | ||
/// </summary> | ||
/// <returns>Coverage report</returns> | ||
public string GetCoverageReport() | ||
{ | ||
// Get coverage result | ||
CoverageResult coverageResult = this.GetCoverageResult(); | ||
|
||
// Get coverage report in default format | ||
string coverageReport = this.GetCoverageReport(coverageResult); | ||
return coverageReport; | ||
} | ||
|
||
/// <summary> | ||
/// Gets coverlet coverage result | ||
/// </summary> | ||
/// <returns>Coverage result</returns> | ||
private CoverageResult GetCoverageResult() | ||
{ | ||
try | ||
{ | ||
return _coverageWrapper.GetCoverageResult(_coverage); | ||
} | ||
catch (Exception ex) | ||
{ | ||
string errorMessage = string.Format(Resources.CoverageResultException, CoverletConstants.DataCollectorName); | ||
throw new CoverletDataCollectorException(errorMessage, ex); | ||
} | ||
} | ||
|
||
/// <summary> | ||
/// Gets coverage report from coverage result | ||
/// </summary> | ||
/// <param name="coverageResult">Coverage result</param> | ||
/// <returns>Coverage report</returns> | ||
private string GetCoverageReport(CoverageResult coverageResult) | ||
{ | ||
try | ||
{ | ||
return _reporter.Report(coverageResult); | ||
} | ||
catch (Exception ex) | ||
{ | ||
string errorMessage = string.Format(Resources.CoverageReportException, CoverletConstants.DataCollectorName); | ||
throw new CoverletDataCollectorException(errorMessage, ex); | ||
} | ||
} | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
using Coverlet.Collector.Utilities.Interfaces; | ||
using Coverlet.Core; | ||
using Coverlet.Core.Logging; | ||
|
||
namespace Coverlet.Collector.DataCollection | ||
{ | ||
/// <summary> | ||
/// Implementation for wrapping over Coverage class in coverlet.core | ||
/// </summary> | ||
internal class CoverageWrapper : ICoverageWrapper | ||
{ | ||
/// <summary> | ||
/// Creates a coverage object from given coverlet settings | ||
/// </summary> | ||
/// <param name="settings">Coverlet settings</param> | ||
/// <param name="coverletLogger">Coverlet logger</param> | ||
/// <returns>Coverage object</returns> | ||
public Coverage CreateCoverage(CoverletSettings settings, ILogger coverletLogger) | ||
{ | ||
return new Coverage( | ||
settings.TestModule, | ||
settings.IncludeFilters, | ||
settings.IncludeDirectories, | ||
settings.ExcludeFilters, | ||
settings.ExcludeSourceFiles, | ||
settings.ExcludeAttributes, | ||
settings.IncludeTestAssembly, | ||
settings.SingleHit, | ||
settings.MergeWith, | ||
settings.UseSourceLink, | ||
coverletLogger); | ||
} | ||
|
||
/// <summary> | ||
/// Gets the coverage result from provided coverage object | ||
/// </summary> | ||
/// <param name="coverage">Coverage</param> | ||
/// <returns>The coverage result</returns> | ||
public CoverageResult GetCoverageResult(Coverage coverage) | ||
{ | ||
return coverage.GetCoverageResult(); | ||
} | ||
|
||
/// <summary> | ||
/// Prepares modules for getting coverage. | ||
/// Wrapper over coverage.PrepareModules | ||
/// </summary> | ||
/// <param name="coverage"></param> | ||
public void PrepareModules(Coverage coverage) | ||
{ | ||
coverage.PrepareModules(); | ||
} | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.