Skip to content

Commit 3d78ff7

Browse files
committed
add test Execute_StateUnderTest_WithInstrumentationState_Fake
1 parent a0ad0b1 commit 3d78ff7

File tree

7 files changed

+105438
-25
lines changed

7 files changed

+105438
-25
lines changed

Directory.Packages.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
<PackageVersion Include="xunit.assemblyfixture" Version="2.2.0" />
5858
<PackageVersion Include="xunit.assert" Version="2.5.0" />
5959
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.0"/>
60-
60+
<!--<PackageVersion Include="envdte" Version="17.7.37355" />-->
6161

6262
</ItemGroup>
6363
</Project>

src/coverlet.msbuild.tasks/BaseTask.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ namespace Coverlet.MSbuild.Tasks
88
{
99
public abstract class BaseTask : Task
1010
{
11-
public static IServiceProvider ServiceProvider { get; set; }
11+
public static IServiceProvider ServiceProvider { get; protected internal set; }
1212
}
1313
}

src/coverlet.msbuild.tasks/MSBuildLogger.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,26 @@
44
using System;
55
using Microsoft.Build.Framework;
66
using Microsoft.Build.Utilities;
7-
using ILogger = Coverlet.Core.Abstractions.ILogger;
87

98
namespace Coverlet.MSbuild.Tasks
109
{
11-
class MSBuildLogger : ILogger
12-
{
13-
private const string LogPrefix = "[coverlet] ";
10+
class MSBuildLogger : Coverlet.Core.Abstractions.ILogger
11+
{
12+
private const string LogPrefix = "[coverlet] ";
1413

15-
private readonly TaskLoggingHelper _log;
14+
private readonly TaskLoggingHelper _log;
1615

17-
public MSBuildLogger(TaskLoggingHelper log) => _log = log;
16+
public MSBuildLogger(TaskLoggingHelper log) => _log = log;
1817

19-
public void LogVerbose(string message) => _log.LogMessage(MessageImportance.Low, $"{LogPrefix}{message}");
18+
public void LogVerbose(string message) => _log.LogMessage(MessageImportance.Low, $"{LogPrefix}{message}");
2019

21-
// We use `MessageImportance.High` because with `MessageImportance.Normal` doesn't show anything
22-
public void LogInformation(string message, bool important = false) => _log.LogMessage(MessageImportance.High, $"{LogPrefix}{message}");
20+
// We use `MessageImportance.High` because with `MessageImportance.Normal` doesn't show anything
21+
public void LogInformation(string message, bool important = false) => _log.LogMessage(MessageImportance.High, $"{LogPrefix}{message}");
2322

24-
public void LogWarning(string message) => _log.LogWarning($"{LogPrefix}{message}");
23+
public void LogWarning(string message) => _log.LogWarning($"{LogPrefix}{message}");
2524

26-
public void LogError(string message) => _log.LogError($"{LogPrefix}{message}");
25+
public void LogError(string message) => _log.LogError($"{LogPrefix}{message}");
2726

28-
public void LogError(Exception exception) => _log.LogErrorFromException(exception, true);
29-
}
27+
public void LogError(Exception exception) => _log.LogErrorFromException(exception, true);
28+
}
3029
}

test/coverlet.core.tests/coverlet.core.tests.csproj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
<PropertyGroup>
55
<TargetFramework>net6.0</TargetFramework>
66
<IsPackable>false</IsPackable>
7-
<NoWarn>$(NoWarn);CS8002;NU1008</NoWarn>
8-
<MSBuildWarningsAsMessages>NU1702</MSBuildWarningsAsMessages>
7+
<NoWarn>$(NoWarn);CS8002</NoWarn>
8+
<MSBuildWarningsAsMessages>NU1702;NU1504;NU1008</MSBuildWarningsAsMessages>
99
<!--For test TestInstrument_NetstandardAwareAssemblyResolver_PreserveCompilationContext-->
1010
<PreserveCompilationContext>true</PreserveCompilationContext>
1111
</PropertyGroup>
1212

1313
<ItemGroup>
14+
<!--<PackageReference Include="envdte" />-->
1415
<PackageReference Include="LinqKit.Microsoft.EntityFrameworkCore" />
1516
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" />
1617
<PackageReference Include="Microsoft.NET.Test.Sdk" />

test/coverlet.msbuild.tasks.tests/CoverageResultTaskTests.cs

Lines changed: 81 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Microsoft.Extensions.DependencyInjection;
88
using Microsoft.Build.Framework;
99
using Microsoft.Build.Locator;
10+
using Microsoft.Build.Utilities;
1011
using Moq;
1112
using Xunit;
1213

@@ -24,11 +25,14 @@ public class CoverageResultTaskTests : IAssemblyFixture<MSBuildFixture>
2425
{
2526
private readonly Mock<IBuildEngine> _buildEngine;
2627
private readonly List<BuildErrorEventArgs> _errors;
28+
private readonly Mock<IAssemblyAdapter> _mockAssemblyAdapter;
2729

2830
public CoverageResultTaskTests()
2931
{
3032
_buildEngine = new Mock<IBuildEngine>();
3133
_errors = new List<BuildErrorEventArgs>();
34+
_mockAssemblyAdapter = new Mock<IAssemblyAdapter>();
35+
_mockAssemblyAdapter.Setup(x => x.GetAssemblyName(It.IsAny<string>())).Returns("abc");
3236
}
3337

3438
[Fact]
@@ -43,13 +47,14 @@ public void Execute_StateUnderTest_MissingInstrumentationState()
4347

4448
_buildEngine.Setup(x => x.LogErrorEvent(It.IsAny<BuildErrorEventArgs>())).Callback<BuildErrorEventArgs>(e => _errors.Add(e));
4549

46-
var coverageResultTask = new CoverageResultTask {
47-
OutputFormat = "opencover",
48-
Output = "coverageDir",
49-
Threshold = "50",
50-
ThresholdType = "total",
51-
ThresholdStat = "total",
52-
InstrumenterState = null
50+
var coverageResultTask = new CoverageResultTask
51+
{
52+
OutputFormat = "opencover",
53+
Output = "coverageDir",
54+
Threshold = "50",
55+
ThresholdType = "total",
56+
ThresholdStat = "total",
57+
InstrumenterState = null
5358
};
5459
coverageResultTask.BuildEngine = _buildEngine.Object;
5560

@@ -59,8 +64,76 @@ public void Execute_StateUnderTest_MissingInstrumentationState()
5964
// Assert
6065
Assert.False(success);
6166
Assert.True(coverageResultTask.Log.HasLoggedErrors);
62-
// check error message "Result of instrumentation task not found"
67+
// check error message "Result of instrumentation task not found"
6368
}
6469

70+
[Fact]
71+
public void Execute_StateUnderTest_WithInstrumentationState_Fake()
72+
{
73+
// Arrange
74+
var mockFileSystem = new Mock<IFileSystem>();
75+
mockFileSystem.Setup(x => x.Exists(It.IsAny<string>())).Returns(true);
76+
mockFileSystem.Setup(x => x.Copy(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<bool>()));
77+
var log = new TaskLoggingHelper(_buildEngine.Object, "CoverageResultTask");
78+
79+
IServiceCollection serviceCollection = new ServiceCollection();
80+
serviceCollection.AddTransient<IFileSystem, FileSystem>();
81+
serviceCollection.AddTransient<IProcessExitHandler, ProcessExitHandler>();
82+
serviceCollection.AddTransient<Coverlet.Core.Abstractions.ILogger, MSBuildLogger>(_ => new MSBuildLogger(log));
83+
serviceCollection.AddTransient<IRetryHelper, RetryHelper>();
84+
serviceCollection.AddTransient<IConsole, SystemConsole>();
85+
serviceCollection.AddSingleton<IInstrumentationHelper, InstrumentationHelperForDebugging>();
86+
serviceCollection.AddSingleton<ISourceRootTranslator, SourceRootTranslator>(serviceProvider => new SourceRootTranslator("empty", serviceProvider.GetRequiredService<Coverlet.Core.Abstractions.ILogger>(), mockFileSystem.Object, _mockAssemblyAdapter.Object));
87+
ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();
88+
BaseTask.ServiceProvider = serviceProvider;
89+
_buildEngine.Setup(x => x.LogErrorEvent(It.IsAny<BuildErrorEventArgs>())).Callback<BuildErrorEventArgs>(e => _errors.Add(e));
90+
91+
#pragma warning disable CS8604 // Possible null reference argument for parameter..
92+
#pragma warning disable CS8602 // Dereference of a possibly null reference.
93+
var InstrumenterState = new TaskItem(Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "TestAssets\\InstrumenterState.ItemSpec.data1.xml")) ;
94+
#pragma warning restore CS8602 // Dereference of a possibly null reference.
95+
#pragma warning restore C8S604 // Possible null reference argument for parameter.
96+
97+
var coverageResultTask = new CoverageResultTask
98+
{
99+
OutputFormat = "opencover",
100+
Output = "coverageDir",
101+
Threshold = "50",
102+
ThresholdType = "total",
103+
ThresholdStat = "total",
104+
InstrumenterState = InstrumenterState
105+
};
106+
coverageResultTask.BuildEngine = _buildEngine.Object;
107+
108+
// Act
109+
bool success = coverageResultTask.Execute();
110+
111+
// Assert
112+
Assert.True(success);
113+
Assert.False(coverageResultTask.Log.HasLoggedErrors);
114+
115+
Assert.Contains("coverageDir.opencover.xml", coverageResultTask.ReportItems[0].ItemSpec);
116+
Assert.Equal(16, coverageResultTask.ReportItems[0].MetadataCount);
117+
118+
}
119+
120+
}
121+
class InstrumentationHelperForDebugging : InstrumentationHelper
122+
{
123+
public InstrumentationHelperForDebugging(IProcessExitHandler processExitHandler, IRetryHelper retryHelper, IFileSystem fileSystem, Coverlet.Core.Abstractions.ILogger logger, ISourceRootTranslator sourceTranslator)
124+
: base(processExitHandler, retryHelper, fileSystem, logger, sourceTranslator)
125+
{
126+
127+
}
128+
129+
public override void RestoreOriginalModule(string module, string identifier)
130+
{
131+
// DO NOT RESTORE
132+
}
133+
134+
public override void RestoreOriginalModules()
135+
{
136+
// DO NOT RESTORE
137+
}
65138
}
66139
}

0 commit comments

Comments
 (0)