Skip to content

Commit 97ae2ba

Browse files
authored
Merge pull request #148 from tonyhallett/dotnet-tools-list-parser-exception-handler
handle parsing error and log when cannot use chosen option
2 parents 1940e86 + 2b7519e commit 97ae2ba

File tree

5 files changed

+66
-4
lines changed

5 files changed

+66
-4
lines changed

FineCodeCoverage/Core/Coverlet/Console/CoverletConsoleDotnetToolsGlobalExecutor.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@ internal interface ICoverletConsoleDotnetToolsGlobalExecutor : ICoverletConsoleE
1313
internal class CoverletConsoleDotnetToolsGlobalExecutor : ICoverletConsoleDotnetToolsGlobalExecutor
1414
{
1515
private readonly IDotNetToolListCoverlet dotNetToolListCoverlet;
16+
private readonly ILogger logger;
1617

1718
[ImportingConstructor]
18-
public CoverletConsoleDotnetToolsGlobalExecutor(IDotNetToolListCoverlet dotNetToolListCoverlet)
19+
public CoverletConsoleDotnetToolsGlobalExecutor(IDotNetToolListCoverlet dotNetToolListCoverlet, ILogger logger)
1920
{
2021
this.dotNetToolListCoverlet = dotNetToolListCoverlet;
22+
this.logger = logger;
2123
}
2224
public ExecuteRequest GetRequest(ICoverageProject coverageProject, string coverletSettings)
2325
{
@@ -26,6 +28,7 @@ public ExecuteRequest GetRequest(ICoverageProject coverageProject, string coverl
2628
var details = dotNetToolListCoverlet.Global();
2729
if(details == null)
2830
{
31+
logger.Log("Unable to use Coverlet console global tool");
2932
return null;
3033
}
3134
return new ExecuteRequest

FineCodeCoverage/Core/Coverlet/Console/CoverletConsoleDotnetToolsLocalExecutor.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ internal class CoverletConsoleDotnetToolsLocalExecutor : ICoverletConsoleDotnetT
1111
{
1212
private readonly IDotNetToolListCoverlet dotnetToolListCoverlet;
1313
private readonly IDotNetConfigFinder dotNetConfigFinder;
14+
private readonly ILogger logger;
1415

1516
[ImportingConstructor]
16-
public CoverletConsoleDotnetToolsLocalExecutor(IDotNetToolListCoverlet dotnetToolListCoverlet, IDotNetConfigFinder dotNetConfigFinder)
17+
public CoverletConsoleDotnetToolsLocalExecutor(IDotNetToolListCoverlet dotnetToolListCoverlet, IDotNetConfigFinder dotNetConfigFinder, ILogger logger)
1718
{
1819
this.dotnetToolListCoverlet = dotnetToolListCoverlet;
1920
this.dotNetConfigFinder = dotNetConfigFinder;
21+
this.logger = logger;
2022
}
2123
public ExecuteRequest GetRequest(ICoverageProject coverageProject, string coverletSettings)
2224
{
@@ -35,6 +37,8 @@ public ExecuteRequest GetRequest(ICoverageProject coverageProject, string coverl
3537
};
3638
}
3739
}
40+
41+
this.logger.Log("Unable to use Coverlet console local tool");
3842

3943
return null;
4044
}

FineCodeCoverage/Core/Coverlet/Console/DotNetToolListCoverlet.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.ComponentModel.Composition;
34
using System.Linq;
45
using FineCodeCoverage.Core.Utilities;
@@ -30,8 +31,18 @@ private CoverletToolDetails ExecuteAndParse(Func<IDotNetToolListExecutor,DotNetT
3031
logger.Log($"{title} Error", result.Output);
3132
return null;
3233
}
33-
34-
var tools = parser.Parse(result.Output);
34+
List<DotNetTool> tools = null;
35+
try
36+
{
37+
tools = parser.Parse(result.Output);
38+
}
39+
catch (Exception)
40+
{
41+
var title = $"Dotnet tool list Coverlet";
42+
logger.Log($"{title} Error parsing", result.Output);
43+
return null;
44+
}
45+
3546
var coverletConsoleTool = tools.FirstOrDefault(tool => tool.PackageId == CoverletPackageId);
3647
if(coverletConsoleTool == null)
3748
{

FineCodeCoverageTests/CoverletConsole_Tests.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,19 @@ public void Should_Return_Null_If_Enabled_But_Not_Installed()
127127
dotNetToolListCoverlet.VerifyAll();
128128
}
129129

130+
[Test]
131+
public void Should_Log_When_Enabled_And_Unsuccessful()
132+
{
133+
var mockCoverageProject = new Mock<ICoverageProject>();
134+
mockCoverageProject.Setup(cp => cp.Settings.CoverletConsoleGlobal).Returns(true);
135+
var dotNetToolListCoverlet = mocker.GetMock<IDotNetToolListCoverlet>();
136+
dotNetToolListCoverlet.Setup(dotnet => dotnet.Global()).Returns((CoverletToolDetails)null);
137+
138+
globalExeProvider.GetRequest(mockCoverageProject.Object, null);
139+
mocker.Verify<ILogger>(l => l.Log("Unable to use Coverlet console global tool"));
140+
141+
}
142+
130143
private ExecuteRequest GetRequest_For_Globally_Installed_Coverlet_Console()
131144
{
132145
var mockCoverageProject = new Mock<ICoverageProject>();
@@ -300,6 +313,24 @@ public void Should_Return_Null_If_None_Of_The_DotNetConfig_Containing_Directorie
300313

301314
}
302315

316+
[Test]
317+
public void Shoul_Log_If_None_Of_The_DotNetConfig_Containing_Directories_Are_Local_Tool()
318+
{
319+
var projectOutputFolder = "projectoutputfolder";
320+
var mockCoverageProject = new Mock<ICoverageProject>();
321+
mockCoverageProject.Setup(cp => cp.Settings.CoverletConsoleLocal).Returns(true);
322+
mockCoverageProject.Setup(cp => cp.ProjectOutputFolder).Returns(projectOutputFolder);
323+
324+
var mockDotNetConfigFinder = mocker.GetMock<IDotNetConfigFinder>();
325+
mockDotNetConfigFinder.Setup(f => f.GetConfigDirectories(projectOutputFolder)).Returns(new List<string> { "ConfigDirectory1", "ConfigDirectory2" });
326+
327+
var mockDotNetToolListCoverlet = mocker.GetMock<IDotNetToolListCoverlet>();
328+
mockDotNetToolListCoverlet.Setup(dotnet => dotnet.Local("ConfigDirectory1")).Returns((CoverletToolDetails)null);
329+
mockDotNetToolListCoverlet.Setup(dotnet => dotnet.Local("ConfigDirectory2")).Returns((CoverletToolDetails)null);
330+
localExecutor.GetRequest(mockCoverageProject.Object, null);
331+
mocker.Verify<ILogger>(l => l.Log("Unable to use Coverlet console local tool"));
332+
}
333+
303334
private ExecuteRequest Get_Request_For_Local_Install(bool firstConfigDirectoryLocalInstall, bool secondConfigDirectoryLocalInstall)
304335
{
305336
var projectOutputFolder = "projectoutputfolder";

FineCodeCoverageTests/DotNetToolList_Tests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,19 @@ public void Should_Execute_And_Parse_Global_Not_Installed()
8585
Assert.IsNull(coverletToolDetails);
8686
}
8787

88+
[Test]
89+
public void Should_Log_Output_And_Return_Null_When_Parsing_Error()
90+
{
91+
var parsing = "this will be parsed";
92+
var mockExecutor = mocker.GetMock<IDotNetToolListExecutor>();
93+
mockExecutor.Setup(executor => executor.Global()).Returns(new DotNetToolListExecutionResult { ExitCode = 0, Output = parsing });
94+
var mockParser = mocker.GetMock<IDotNetToolListParser>();
95+
mockParser.Setup(parser => parser.Parse(parsing)).Throws(new System.Exception());
96+
var coverletToolDetails = dotNetToolListCoverlet.Global();
97+
Assert.IsNull(coverletToolDetails);
98+
mocker.Verify<ILogger>(l => l.Log("Dotnet tool list Coverlet Error parsing", parsing));
99+
}
100+
88101
[Test]
89102
public void Should_Log_Output_When_Executor_Error()
90103
{

0 commit comments

Comments
 (0)