Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 10 additions & 9 deletions src/coverlet.MTP/Collector/CollectorExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,11 @@ internal sealed class CollectorExtension : ITestHostProcessLifetimeHandler, ITes
private ICoverage? _coverage;
private readonly Microsoft.Testing.Platform.Logging.ILoggerFactory _loggerFactory;
private readonly Microsoft.Testing.Platform.CommandLine.ICommandLineOptions _commandLineOptions;
private bool _coverageEnabled;
private string? _testModulePath;
private string? _coverageIdentifier;
private bool? _isCoverageEnabled;

private bool IsCoverageEnabled => _isCoverageEnabled ??= _commandLineOptions.IsOptionSet(CoverletOptionNames.Coverage);

private readonly CoverletExtension _extension = new();
private readonly IReporterFactory _reporterFactory;
Expand Down Expand Up @@ -93,10 +95,9 @@ Task ITestHostProcessLifetimeHandler.BeforeTestHostProcessStartAsync(Cancellatio
try
{
// Check if --coverlet flag was provided
_coverageEnabled = _commandLineOptions.IsOptionSet(CoverletOptionNames.Coverage);
_logger.LogVerbose($"Coverage enabled (--{CoverletOptionNames.Coverage} flag): {_coverageEnabled}");
_logger.LogVerbose($"Coverage enabled (--{CoverletOptionNames.Coverage} flag): {IsCoverageEnabled}");

if (!_coverageEnabled)
if (!IsCoverageEnabled)
{
_logger.LogInformation("Coverage collection is disabled. Use --coverlet to enable.");
return Task.CompletedTask;
Expand All @@ -107,7 +108,7 @@ Task ITestHostProcessLifetimeHandler.BeforeTestHostProcessStartAsync(Cancellatio
if (string.IsNullOrEmpty(_testModulePath))
{
_logger.LogError("Could not determine test module path. Coverage disabled.");
_coverageEnabled = false;
_isCoverageEnabled = false;
return Task.CompletedTask;
}

Expand Down Expand Up @@ -156,7 +157,7 @@ Task ITestHostProcessLifetimeHandler.BeforeTestHostProcessStartAsync(Cancellatio
{
_logger.LogError("Failed to initialize coverage instrumentation");
_logger.LogError(ex);
_coverageEnabled = false;
_isCoverageEnabled = false;

// Display error to user via IOutputDevice (visible in console output)
DisplayErrorToUserAsync(ex).ConfigureAwait(false).GetAwaiter().GetResult();
Expand Down Expand Up @@ -234,7 +235,7 @@ private static string GetConciseErrorMessage(Exception ex)
/// </summary>
Task ITestHostEnvironmentVariableProvider.UpdateAsync(IEnvironmentVariables environmentVariables)
{
if (_coverageEnabled && !string.IsNullOrEmpty(_coverageIdentifier))
if (IsCoverageEnabled && !string.IsNullOrEmpty(_coverageIdentifier))
{
_logger.LogVerbose($"Setting environment variables for test host");

Expand Down Expand Up @@ -303,7 +304,7 @@ async Task ITestHostProcessLifetimeHandler.OnTestHostProcessExitedAsync(
_logger.LogVerbose($"=== OnTestHostProcessExitedAsync START ===");
_logger.LogVerbose($"Test host PID: {testHostProcessInformation.PID}, ExitCode: {testHostProcessInformation.ExitCode}");

if (!_coverageEnabled || _coverage == null || _serviceProvider == null)
if (!IsCoverageEnabled || _coverage == null || _serviceProvider == null)
{
_logger.LogVerbose("Coverage collection skipped (not enabled or not initialized)");
return;
Expand Down Expand Up @@ -332,7 +333,7 @@ async Task ITestHostProcessLifetimeHandler.OnTestHostProcessExitedAsync(
public Task<bool> IsEnabledAsync()
{
DebugHelper.HandleDebuggerAttachment(nameof(CoverletExtension));
return Task.FromResult(true);
return Task.FromResult(IsCoverageEnabled);
}

// Add internal setter for testing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ internal sealed class CoverletExtensionEnvironmentVariableProvider : ITestHostEn
{
private readonly ILogger _logger;
private readonly Microsoft.Testing.Platform.CommandLine.ICommandLineOptions _commandLineOptions;
private bool? _isCoverageEnabled;

private bool IsCoverageEnabled => _isCoverageEnabled ??= _commandLineOptions.IsOptionSet(CoverletOptionNames.Coverage);

public CoverletExtensionEnvironmentVariableProvider(
IConfiguration configuration,
Expand All @@ -34,14 +37,16 @@ public CoverletExtensionEnvironmentVariableProvider(
public string DisplayName => "Coverlet Environment Variable Provider";
public string Description => "Provides environment variables for Coverlet coverage collection";

public Task<bool> IsEnabledAsync() => Task.FromResult(true);
public Task<bool> IsEnabledAsync()
{
// Check if --coverlet flag was provided
return Task.FromResult(IsCoverageEnabled);
}

public Task UpdateAsync(IEnvironmentVariables environmentVariables)
{
// Check if --coverlet flag was provided
bool coverageEnabled = _commandLineOptions.IsOptionSet(CoverletOptionNames.Coverage);

if (coverageEnabled)
if (IsCoverageEnabled)
{
// Tell the test host that coverage is enabled
environmentVariables.SetVariable(
Expand Down
18 changes: 17 additions & 1 deletion test/coverlet.MTP.tests/Collector/CollectorExtensionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -200,8 +200,24 @@ public void ExtensionPropertyReturnsNonEmptyString(string propertyName)
#region IsEnabledAsync Tests

[Fact]
public async Task IsEnabledAsyncReturnsTrue()
public async Task IsEnabledAsyncReturnsFalseIfCoverletOptionNotSet()
{
_mockCommandLineOptions
.Setup(x => x.IsOptionSet(CoverletOptionNames.Coverage))
.Returns(false);
var collector = CreateCollector();

bool result = await collector.IsEnabledAsync();

Assert.False(result);
}

[Fact]
public async Task IsEnabledAsyncReturnsTrueIfCoverletOptionSet()
{
_mockCommandLineOptions
.Setup(x => x.IsOptionSet(CoverletOptionNames.Coverage))
.Returns(true);
var collector = CreateCollector();

bool result = await collector.IsEnabledAsync();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using coverlet.MTP.EnvironmentVariables;
using Coverlet.MTP.CommandLine;
using Coverlet.MTP.Diagnostics;
using Microsoft.Testing.Platform.CommandLine;
using Microsoft.Testing.Platform.Configurations;
Expand Down Expand Up @@ -68,11 +69,31 @@ public void DescriptionReturnsExpectedValue()
#region IsEnabledAsync Tests

[Fact]
public async Task IsEnabledAsyncReturnsTrue()
public async Task IsEnabledAsyncReturnsFalseIfCoverletOptionNotSet()
{
// Act
bool result = await _provider.IsEnabledAsync();

// Assert
Assert.False(result);
}

[Fact]
public async Task IsEnabledAsyncReturnsTrueIfCoverletOptionSet()
{
// Arrange
var mockCommandLineOptions = new Mock<ICommandLineOptions>();
mockCommandLineOptions.Setup(o => o.IsOptionSet(CoverletOptionNames.Coverage)).Returns(true);

// Re-create provider to pick up the environment variable
var provider = new CoverletExtensionEnvironmentVariableProvider(
_mockConfiguration.Object,
mockCommandLineOptions.Object,
_mockLoggerFactory.Object);

// Act
bool result = await provider.IsEnabledAsync();

// Assert
Assert.True(result);
}
Expand Down
Loading